From 4f3474b4a0e25eaba0d2e28f7728bba8fb4297e9 Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Mon, 09 Jun 2025 15:51:11 +0800
Subject: [PATCH] feat: 更新密钥和任务管理数据
---
src/assets/images/uoload-success.png | 0
src/views/job/components/SearchBox.vue | 78 ++---
src/views/job/components/TaskTop/TaskTotal.vue | 5
src/views/system/userinfo.vue | 530 +++++++++++++++++++++++++++++++---------
src/assets/images/upload-error.png | 0
src/assets/images/task/cancel1.png | 0
src/api/system/dict.js | 8
src/views/system/userinfo-copy.vue | 124 +++++++++
src/axios.js | 15 +
9 files changed, 598 insertions(+), 162 deletions(-)
diff --git a/src/api/system/dict.js b/src/api/system/dict.js
index 51daacc..9753eae 100644
--- a/src/api/system/dict.js
+++ b/src/api/system/dict.js
@@ -86,3 +86,11 @@
params,
});
};
+
+export const findLicenseDate = params => {
+ return request({
+ url: '/blade-system/license/findLicenseDate',
+ method: 'get',
+ params,
+ })
+}
diff --git a/src/assets/images/task/cancel1.png b/src/assets/images/task/cancel1.png
new file mode 100644
index 0000000..6568e3b
--- /dev/null
+++ b/src/assets/images/task/cancel1.png
Binary files differ
diff --git a/src/assets/images/uoload-success.png b/src/assets/images/uoload-success.png
new file mode 100644
index 0000000..903fb38
--- /dev/null
+++ b/src/assets/images/uoload-success.png
Binary files differ
diff --git a/src/assets/images/upload-error.png b/src/assets/images/upload-error.png
new file mode 100644
index 0000000..7b4ee58
--- /dev/null
+++ b/src/assets/images/upload-error.png
Binary files differ
diff --git a/src/axios.js b/src/axios.js
index 97e9be0..979b7c0 100644
--- a/src/axios.js
+++ b/src/axios.js
@@ -119,6 +119,21 @@
const message = res.data.msg || res.data.error_description || res.data.message ||'系统错误';
const config = res.config;
const cryptoData = config.cryptoData === true;
+ if (status === 511) {
+ ElMessage({
+ message: '请联系运维人员上传密钥证书!',
+ type: 'error',
+ });
+ // 获取当前路由名称
+ const currentRouteName = router.currentRoute.value.name;
+ // 如果当前路由不是登录页,则跳转到登录页
+ if (currentRouteName !== '登录页') {
+ store.dispatch('FedLogOut').then(() => router.push({
+ path: '/login'
+ }));
+ }
+ return Promise.reject(new Error(message));
+ }
//如果在白名单里则自行catch逻辑处理
if (statusWhiteList.includes(status)) return Promise.reject(res);
// 如果是401并且没有重试过,尝试刷新token
diff --git a/src/views/job/components/SearchBox.vue b/src/views/job/components/SearchBox.vue
index 31cf25f..899b99d 100644
--- a/src/views/job/components/SearchBox.vue
+++ b/src/views/job/components/SearchBox.vue
@@ -50,6 +50,7 @@
class="card-item"
:class="item === checked ? 'active' : ''"
v-for="(item, index) in timeList"
+ :key="index"
@click="timeClick(item, index)"
>
{{ timeListStr[index] }}
@@ -298,35 +299,35 @@
};
// 监听从巡检任务概况提交的数据
-watch(
- () => store.state.task.jumpTask,
- newVal => {
+// watch(
+// () => store.state.task.jumpTask,
+// newVal => {
- if (newVal && Object.keys(newVal).length) {
- // 兼容当日任务 计划任务 历史任务传参
- if (newVal.clickValue) {
- checked.value = newVal.clickValue;
- searchForm.date_enum = newVal.date_enum;
- }
- if (newVal.date_value) {
- dateRange.value = newVal.date_value;
- }
- if (newVal.status) {
- searchForm.status = newVal.status;
- }
- if (newVal.device_sn) {
- searchForm.device_sn = newVal.device_sn;
- // 不直接赋值的原因: 回选会被清空值
- signDevice_sn.value = newVal.device_sn;
- }
- } else {
- checked.value = 'today';
- searchForm.date_enum = 'TODAY';
- }
- handleSearch();
- },
- { immediate: true, deep: true }
-);
+// if (newVal && Object.keys(newVal).length) {
+// // 兼容当日任务 计划任务 历史任务传参
+// if (newVal.clickValue) {
+// checked.value = newVal.clickValue;
+// searchForm.date_enum = newVal.date_enum;
+// }
+// if (newVal.date_value) {
+// dateRange.value = newVal.date_value;
+// }
+// if (newVal.status) {
+// searchForm.status = newVal.status;
+// }
+// if (newVal.device_sn) {
+// searchForm.device_sn = newVal.device_sn;
+// // 不直接赋值的原因: 回选会被清空值
+// signDevice_sn.value = newVal.device_sn;
+// }
+// } else {
+// checked.value = 'today';
+// searchForm.date_enum = 'TODAY';
+// }
+// handleSearch();
+// },
+// { immediate: true, deep: true }
+// );
onBeforeUnmount(() => {
checked.value = 'today';
@@ -336,20 +337,17 @@
onMounted(() => {
requestDockInfo();
// 日历传值
-const calendarday = ref(route.query.day);
+ const calendarday = ref(route.query.day);
-if (calendarday.value) {
- const date = dayjs(calendarday.value).format(timeFormat);
+ if (calendarday.value) {
+ const date = dayjs(calendarday.value).format(timeFormat);
- const dateArray = [date, date];
-
- dateRange.value = dateArray;
-
- handleSearch();
-
-}
- // 查询一次
- // handleSearch()
+ const dateArray = [date, date];
+
+ dateRange.value = dateArray;
+ }
+ // 查询一次
+ handleSearch()
});
</script>
<style lang="scss"></style>
diff --git a/src/views/job/components/TaskTop/TaskTotal.vue b/src/views/job/components/TaskTop/TaskTotal.vue
index b0905be..20ac749 100644
--- a/src/views/job/components/TaskTop/TaskTotal.vue
+++ b/src/views/job/components/TaskTop/TaskTotal.vue
@@ -61,8 +61,8 @@
list.value[0].value = res.data.data.planned_executions || 0
list.value[1].value = res.data.data.executed || 0
list.value[2].value = res.data.data.running_num || 0
- list.value[3].value = res.data.data.executed || 0
- list.value[4].value = res.data.data.failed_executions || 0
+ list.value[3].value = res.data.data.failed_executions || 0
+ list.value[4].value = res.data.data.pending_executions || 0
list.value[5].value = res.data.data.go_home_executions || 0
})
}
@@ -81,7 +81,6 @@
onMounted(() => {
getTotalJobNum()
- // getJobStatistics()
})
</script>
diff --git a/src/views/system/userinfo-copy.vue b/src/views/system/userinfo-copy.vue
new file mode 100644
index 0000000..a9c5d8a
--- /dev/null
+++ b/src/views/system/userinfo-copy.vue
@@ -0,0 +1,124 @@
+<template>
+ <div>
+ <basic-container>
+ <avue-form
+ ref="form"
+ :option="option"
+ v-model="form"
+ @tab-click="handleTabClick"
+ @submit="handleSubmit"
+
+ >
+ <template #email="{ disabled, size }">
+ <el-input
+ id="adfsdafdsf"
+ type="text"
+ :disabled="disabled"
+ :size="size"
+ v-model="form.email"
+ placeholder="请输入邮箱"
+ :readonly="readonly"
+ @focus="readonly = false"
+ >
+ </el-input>
+ </template>
+ </avue-form>
+ </basic-container>
+ </div>
+</template>
+
+<script>
+import option from '@/option/user/info';
+import { getUserInfo, updateInfo, updatePassword } from '@/api/system/user';
+import md5 from 'js-md5';
+import func from '@/utils/func';
+import { validatenull } from '@/utils/validate';
+import defaultAva from '@/assets/images/defaultava.png';
+export default {
+ data() {
+ return {
+ index: 0,
+ option: option,
+ form: { },
+ readonly: true
+ };
+ },
+ created() {
+ this.handleWitch();
+ },
+ methods: {
+ handleSubmit(form, done) {
+ if (this.index === 0) {
+ form.name = form.realName;
+ updateInfo(form).then(
+ res => {
+ if (res.data.success) {
+ this.$message({
+ type: 'success',
+ message: '修改信息成功!',
+ });
+ } else {
+ this.$message({
+ type: 'error',
+ message: res.data.msg,
+ });
+ }
+ done();
+ },
+ error => {
+ window.console.log(error);
+ done();
+ }
+ );
+ } else {
+ updatePassword(md5(form.oldPassword), md5(form.newPassword), md5(form.newPassword1)).then(
+ res => {
+ if (res.data.success) {
+ this.$message({
+ type: 'success',
+ message: '修改密码成功!',
+ });
+ } else {
+ this.$message({
+ type: 'error',
+ message: res.data.msg,
+ });
+ }
+ done();
+ },
+ error => {
+ window.console.log(error);
+ done();
+ }
+ );
+ }
+ },
+ handleWitch() {
+ if (this.index === 0) {
+ getUserInfo().then(res => {
+ const user = res.data.data;
+ this.form = {
+ id: user.id,
+ avatar: user.avatar ? user.avatar :defaultAva,
+ name: user.name,
+ realName: user.realName,
+ phone: user.phone,
+ email: user.email,
+ };
+
+ });
+ }
+ },
+
+ handleTabClick(tabs) {
+ if (validatenull(tabs.index)) {
+ return;
+ }
+ this.index = func.toInt(tabs.index, 0);
+ this.handleWitch();
+ },
+ },
+};
+</script>
+
+<style></style>
diff --git a/src/views/system/userinfo.vue b/src/views/system/userinfo.vue
index a9c5d8a..a73d22f 100644
--- a/src/views/system/userinfo.vue
+++ b/src/views/system/userinfo.vue
@@ -1,124 +1,416 @@
<template>
- <div>
- <basic-container>
- <avue-form
- ref="form"
- :option="option"
- v-model="form"
- @tab-click="handleTabClick"
- @submit="handleSubmit"
-
- >
- <template #email="{ disabled, size }">
- <el-input
- id="adfsdafdsf"
- type="text"
- :disabled="disabled"
- :size="size"
- v-model="form.email"
- placeholder="请输入邮箱"
- :readonly="readonly"
- @focus="readonly = false"
- >
- </el-input>
- </template>
- </avue-form>
- </basic-container>
- </div>
+
+ <div class="user-info-new">
+ <div class="titleBoxs">
+ <div
+ class="titleItem"
+ :class="index === checked ? 'activeItem' : ''"
+ v-for="(item, index) in titleList"
+ :key="index"
+ @click="titleClick(item, index)"
+ >
+ {{ item }}
+ </div>
+ </div>
+ <!-- 个人信息 -->
+ <div class="message" v-if="checked === 0">
+ <div class="info">
+ <div class="section">
+ <el-form label-width="120px">
+ <el-form-item label="头像:">
+ <el-upload
+ class="avatar-uploader"
+ :http-request="customUpload"
+ :show-file-list="false"
+ :before-upload="beforeAvatarUpload"
+ :disabled="uploadLoading"
+ action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
+ >
+ <img v-if="userInfo.avatar" :src="userInfo.avatar" class="avatar" />
+ <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
+
+ <template #tip>
+ <div class="upload-tip">只能上传jpg/png用户头像,且不超过500kb</div>
+ </template>
+ </el-upload>
+ <!-- <el-dialog v-model="dialogVisible">
+ <img w-full :src="dialogImageUrl" alt="Preview Image" />
+ </el-dialog> -->
+ </el-form-item>
+ </el-form>
+ </div>
+
+ <div class="section">
+ <el-form :model="userInfo" label-width="120px">
+ <el-form-item label="姓名:">
+ <el-input class="ztzf-input" :style="{ width: pxToRem(230) }" v-model="userInfo.realName" disabled />
+ </el-form-item>
+ <!-- <el-form-item label="昵称:">
+ <el-input class="ztzf-input" v-model="userInfo.name" />
+ </el-form-item>-->
+ <el-form-item label="所属单位:">
+ <el-input class="ztzf-input" v-model="userInfo.deptName" disabled />
+ </el-form-item>
+ <el-form-item label="手机号:">
+ <el-input class="ztzf-input" v-model="userInfo.phone" />
+ </el-form-item>
+ <el-form-item label="邮箱:">
+ <el-input class="ztzf-input" v-model="userInfo.email" />
+ </el-form-item>
+ </el-form>
+ </div>
+ </div>
+ <div class="butn">
+ <!-- <img @click="reset" :style="{ marginRight: pxToRem(23) }" :src="cancel1" alt="" />
+ <img @click="submit" :style="{ marginRight: pxToRem(23) }" :src="publish1" alt="" /> -->
+ <el-button type="primary" @click="submit" style="margin-right: 10px;">提交</el-button>
+ <el-button @click="reset">重置</el-button>
+ </div>
+ </div>
+ <!-- 修改密码 -->
+ <div class="passwordBox" v-else-if="checked === 1">
+ <div class="password">
+ <el-form :model="passwordForm" label-width="120px">
+ <el-form-item label="原始密码:" prop="oldPassword">
+ <el-input class="ztzf-input" v-model="passwordForm.oldPassword" type="password" show-password />
+ </el-form-item>
+ <el-form-item label="新密码:" prop="newPassword">
+ <el-input class="ztzf-input" v-model="passwordForm.newPassword" type="password" show-password />
+ </el-form-item>
+ <el-form-item label="确认密码:" prop="newPassword1">
+ <el-input class="ztzf-input" v-model="passwordForm.newPassword1" type="password" show-password />
+ </el-form-item>
+ </el-form>
+ </div>
+ <div class="butn">
+ <!-- <img @click="reset" :style="{ marginRight: pxToRem(23) }" :src="cancel1" alt="" />
+ <img @click="submit" :style="{ marginRight: pxToRem(23) }" :src="publish1" alt="" /> -->
+ <el-button type="primary" @click="submit" style="margin-right: 10px;">提交</el-button>
+ <el-button @click="reset">重置</el-button>
+ </div>
+ </div>
+ <!-- 密钥上传 -->
+ <div class="upload-file" v-else-if="checked === 2">
+ <img v-if="isSuccess === 'success'" :src="uploadSuccess" alt="" />
+ <img v-if="isSuccess === 'error'" :src="uploadError" alt="" />
+ <el-upload action="/upload" accept=".lic" :show-file-list="false" :before-upload="handleUpload">
+ <div class="upload-btn">密钥上传</div>
+ </el-upload>
+ <div class="password-time">密钥有效期:{{ passwordTime || '永久有效' }}</div>
+ </div>
+ </div>
</template>
-<script>
-import option from '@/option/user/info';
-import { getUserInfo, updateInfo, updatePassword } from '@/api/system/user';
-import md5 from 'js-md5';
-import func from '@/utils/func';
-import { validatenull } from '@/utils/validate';
-import defaultAva from '@/assets/images/defaultava.png';
-export default {
- data() {
- return {
- index: 0,
- option: option,
- form: { },
- readonly: true
- };
- },
- created() {
- this.handleWitch();
- },
- methods: {
- handleSubmit(form, done) {
- if (this.index === 0) {
- form.name = form.realName;
- updateInfo(form).then(
- res => {
- if (res.data.success) {
- this.$message({
- type: 'success',
- message: '修改信息成功!',
- });
- } else {
- this.$message({
- type: 'error',
- message: res.data.msg,
- });
- }
- done();
- },
- error => {
- window.console.log(error);
- done();
- }
- );
- } else {
- updatePassword(md5(form.oldPassword), md5(form.newPassword), md5(form.newPassword1)).then(
- res => {
- if (res.data.success) {
- this.$message({
- type: 'success',
- message: '修改密码成功!',
- });
- } else {
- this.$message({
- type: 'error',
- message: res.data.msg,
- });
- }
- done();
- },
- error => {
- window.console.log(error);
- done();
- }
- );
- }
- },
- handleWitch() {
- if (this.index === 0) {
- getUserInfo().then(res => {
- const user = res.data.data;
- this.form = {
- id: user.id,
- avatar: user.avatar ? user.avatar :defaultAva,
- name: user.name,
- realName: user.realName,
- phone: user.phone,
- email: user.email,
- };
-
- });
- }
- },
+<script setup>
+import { pxToRem } from '@/utils/rem'
+import { useStore } from 'vuex'
+import { ElMessage } from 'element-plus'
+import { getToken } from '@/utils/auth'
+import md5 from 'js-md5'
+import request from '@/axios'
+import { getUserInfo, updateInfo, updatePassword } from '@/api/system/user'
+import { findLicenseDate } from '@/api/system/dict'
+import { uploadLicense } from '@/api/license/uploadLicense';
- handleTabClick(tabs) {
- if (validatenull(tabs.index)) {
- return;
- }
- this.index = func.toInt(tabs.index, 0);
- this.handleWitch();
- },
- },
-};
+import uploadSuccess from '@/assets/images/uoload-success.png';
+import uploadError from '@/assets/images/upload-error.png';
+import cancel1 from '@/assets/images/task/cancel1.png';
+import publish1 from '@/assets/images/task/publish1.png';
+
+const store = useStore()
+const token = getToken()
+const userinforShow = defineModel('show')
+const userInfoAs = computed(() => store.state.user.userInfo)
+const titleList = ref(['个人信息', '修改密码', '密钥上传'])
+const checked = ref(0)
+const uploadUrl = computed(() => `${import.meta.env.VITE_APP_API_URL}/blade-resource/oss/endpoint/put-file`)
+// 表单数据
+const userInfo = ref({
+ id: '',
+ avatar: '',
+ realName: '',
+ name: '',
+ phone: '',
+ email: '',
+ deptName: '',
+})
+// 校验手机号
+const validatePhone = () => {
+ const phoneRegex = /^1[3-9]\d{9}$/
+ if (!phoneRegex.test(userInfo.value.phone)) {
+ ElMessage.error('请输入正确的手机号码')
+ return false
+ }
+ return true
+}
+const passwordForm = ref({
+ oldPassword: '',
+ newPassword: '',
+ newPassword1: '',
+})
+// 头像
+const beforeAvatarUpload = file => {
+ const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
+ const isLt500KB = file.size / 1024 < 500
+ if (!isJpgOrPng) {
+ ElMessage.error('头像图片只能是 JPG/PNG 格式!')
+ return false
+ }
+ if (!isLt500KB) {
+ ElMessage.error('头像图片大小不能超过 500KB!')
+ return false
+ }
+ return true
+}
+const uploadLoading = ref(false)
+
+const customUpload = async options => {
+ const { file } = options
+ uploadLoading.value = true
+
+ const formData = new FormData()
+ formData.append('file', file) // 根据后端API调整字段名
+ try {
+ const res = await request.post('/blade-resource/oss/endpoint/put-file', formData, {
+ headers: {
+ 'Content-Type': 'multipart/form-data',
+ },
+ })
+
+ if (res.data.code === 200) {
+ ElMessage.success('头像上传成功')
+ userInfo.value.avatar = res.data.data.link
+ return res.data
+ } else {
+ throw new Error(res.data.msg || '上传失败')
+ }
+ } catch (error) {
+ ElMessage.error(error.response?.data?.msg || error.message || '上传失败')
+ return Promise.reject(error)
+ } finally {
+ uploadLoading.value = false
+ }
+}
+
+const titleClick = (item, index) => {
+ checked.value = index
+ if (index === 2) {
+ getFindLicenseDate()
+ }
+}
+const getUserInfoData = () => {
+ getUserInfo().then(res => {
+ const user = res.data.data
+ userInfo.value = {
+ id: user.id,
+ avatar: user.avatar,
+ name: user.name,
+ realName: user.realName,
+ phone: user.phone,
+ email: user.email,
+ deptName: user.deptName,
+ }
+ })
+}
+const emit = defineEmits(['logout'])
+const submit = () => {
+ if (checked.value === 0) {
+ // if (!validatePhone()) return
+ userInfo.value.name = userInfo.value.realName
+ updateInfo(userInfo.value).then(res => {
+ if (res.data.code === 200) {
+ ElMessage.success('修改信息成功!')
+ userinforShow.value = false
+ } else {
+ ElMessage.error(res.msg)
+ }
+ })
+ } else if (checked.value === 1) {
+ updatePassword(
+ md5(passwordForm.value.oldPassword),
+ md5(passwordForm.value.newPassword),
+ md5(passwordForm.value.newPassword1)
+ ).then(res => {
+ if (res.data.code === 200) {
+ ElMessage.success('修改密码成功!')
+ // 调用父组件方法
+ userinforShow.value = false
+ emit('logout')
+ } else {
+ ElMessage.error(res.msg)
+ }
+ })
+ }
+}
+const reset = () => {
+ if (checked.value === 0) {
+ getUserInfoData()
+ userinforShow.value = false
+ } else if (checked.value === 1) {
+ passwordForm.value = {
+ id: userInfoAs.value.userId,
+ oldPassword: '',
+ newPassword: '',
+ newPassword1: '',
+ }
+ userinforShow.value = false
+ }
+}
+const isSuccess = ref('')
+const passwordTime = ref('')
+const handleUpload = file => {
+ const formData = new FormData()
+ formData.append('file', file)
+ uploadLicense(formData)
+ .then(res => {
+ if (res.data.code !== 200) return ElMessage.error('上传失败')
+ ElMessage.success('上传成功')
+ isSuccess.value = 'success'
+ getFindLicenseDate()
+ })
+ .catch(err => {
+ isSuccess.value = 'error'
+ ElMessage.error('上传失败')
+ })
+}
+const getFindLicenseDate = () => {
+ findLicenseDate()
+ .then(res => {
+ if (res.data.code !== 0) return ElMessage.error('获取失败')
+ passwordTime.value = res.data.data
+ })
+ .catch(err => {
+ ElMessage.error('获取失败')
+ })
+}
+// const dialogImageUrl = ref('')
+// const dialogVisible = ref(false)
+// const handlePictureCardPreview = () => {}
+// const handleRemove = () => {}
+onMounted(() => {
+ getUserInfoData()
+})
</script>
-
-<style></style>
+<style scoped lang="scss">
+.user-info-new {
+ margin: 16px;
+ padding: 10px;
+ background-color: #ffffff;
+}
+.titleBoxs {
+ margin: 0 24px;
+ margin-bottom: 10px;
+ // background: url('/src/assets/images/signMachineNest/machineRight/detailtitle.png') no-repeat center;
+ // background-size: 100% 100%;
+ p {
+ display: inline-block;
+ margin-left: 30px;
+ font-size: 16px;
+ color: #000;
+ line-height: 20px;
+ text-align: left;
+ margin-bottom: 8px;
+ }
+}
+:deep(.el-form-item__label) {
+ color: #000 !important;
+}
+:deep(.el-button) {
+ width: 150px !important;
+}
+.info {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 0 80px 0 50px;
+}
+.password {
+ padding: 0 120px 0 50px;
+}
+.butn {
+ // position: absolute;
+ // bottom: 20px;
+ // left: 50%;
+ // transform: translate(-50%);
+ display: flex;
+ justify-content: center;
+ cursor: pointer;
+ img {
+ width: 96px;
+ height: 32px;
+ }
+}
+.titleBoxs {
+ display: flex;
+ padding: 0 20px;
+}
+.titleItem {
+ color: #61809c;
+ font-size: 16px;
+ margin-right: 50px;
+ cursor: pointer;
+}
+.activeItem {
+ border-radius: 0px 0px 0px 0px;
+ color: #51abff;
+ border-bottom: 2px solid #198cff;
+}
+.avatar-uploader .el-upload {
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ cursor: pointer;
+ position: relative;
+ overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+ border-color: #409eff;
+}
+.avatar-uploader-icon {
+ font-size: 28px;
+ color: #8c939d;
+ width: 178px;
+ height: 178px;
+ line-height: 178px;
+ text-align: center;
+}
+.avatar {
+ width: 178px;
+ height: 178px;
+ display: block;
+}
+.upload-tip {
+ margin-top: 10px;
+ color: #999;
+ font-size: 12px;
+ text-align: center;
+}
+.message,
+.passwordBox {
+ margin-top: 40px;
+}
+.upload-file {
+ text-align: center;
+ margin-top: 60px;
+ .upload-btn {
+ width: 93px;
+ height: 38px;
+ line-height: 38px;
+ background: #1b3e6c;
+ border-radius: 8px 8px 8px 8px;
+ border: 1px solid #ffffff;
+ color: #fff;
+ text-align: center;
+ }
+ .password-time {
+ margin-top: 50px;
+ width: 100%;
+ height: 16px;
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 14px;
+ color: #2d9dff;
+ line-height: 16px;
+ // text-align: left;
+ }
+}
+</style>
--
Gitblit v1.9.3