From 1b9fea7d4af68d8f933b2dc42bf6084b9646f64c Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期二, 04 三月 2025 08:39:55 +0800 Subject: [PATCH] 修改作业等级名称 --- src/views/loginPage/component/accountLogin.vue | 543 ++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 361 insertions(+), 182 deletions(-) diff --git a/src/views/loginPage/component/accountLogin.vue b/src/views/loginPage/component/accountLogin.vue index 2508742..39ec524 100644 --- a/src/views/loginPage/component/accountLogin.vue +++ b/src/views/loginPage/component/accountLogin.vue @@ -1,48 +1,75 @@ <template> - <el-form size="large" class="login-content-form"> - <el-form-item class="login-animation1"> - <el-input type="text" :placeholder="$t('message.account.accountPlaceholder1')" v-model="ruleForm.username" clearable autocomplete="off" size="large"> - <template #prefix> - <el-icon class="el-input__icon" style="margin-right: 20px"><img src="../../../assets/loginPage/login_icon_user.png" style="width: 24px;height: 24px"></el-icon> - </template> - </el-input> - </el-form-item> - <el-form-item class="login-animation2"> - <el-input - :type="isShowPassword ? 'text' : 'password'" - :placeholder="$t('message.account.accountPlaceholder2')" - v-model="ruleForm.password" - autocomplete="off" - size="large" - @keyup.enter.native="onSignIn" - > - <template #prefix> - <el-icon class="el-input__icon" style="margin-right: 20px"><img src="../../../assets/loginPage/login_icon_password.png" style="width: 24px;height: 24px"></el-icon> - </template> - <template #suffix> - <i - class="iconfont el-input__icon login-content-password" - :class="isShowPassword ? 'icon-yincangmima' : 'icon-xianshimima'" - @click="isShowPassword = !isShowPassword" - > - </i> - </template> - </el-input> - </el-form-item> - <el-form-item class="login-animation4 codeDeal"> - <el-checkbox v-model="saveCode" label="记住密码" size="large" /> - <span class="forgetCode">忘记密码?</span> - </el-form-item> - <el-form-item class="login-animation4"> - <el-button type="primary" class="login-content-submit" round @click="onSignIn" :loading="loading.signIn"> - <span>登录系统</span> - </el-button> - </el-form-item> - </el-form> + <el-form size="large" class="login-content-form"> + <el-form-item class="login-animation1"> + <el-input type="text" :placeholder="$t('message.account.accountPlaceholder1')" v-model="ruleForm.username" clearable autocomplete="off" size="large"> + <template #prefix> + <el-icon class="el-input__icon" style="margin-right: 20px"><img src="../../../assets/loginPage/login_icon_user.png" style="width: 24px; height: 24px" /></el-icon> + </template> + </el-input> + </el-form-item> + <el-form-item class="login-animation2"> + <el-input :type="isShowPassword ? 'text' : 'password'" :placeholder="$t('message.account.accountPlaceholder2')" v-model="ruleForm.password" autocomplete="off" size="large" @keyup.enter.native="onSignIn"> + <template #prefix> + <el-icon class="el-input__icon" style="margin-right: 20px"><img src="../../../assets/loginPage/login_icon_password.png" style="width: 24px; height: 24px" /></el-icon> + </template> + <template #suffix> + <i class="iconfont el-input__icon login-content-password" :class="isShowPassword ? 'icon-xianshimima' : 'icon-yincangmima'" @click="isShowPassword = !isShowPassword"> </i> + </template> + </el-input> + </el-form-item> + <el-form-item class="login-animation4 codeDeal"> + <el-checkbox v-model="saveCode" label="记住密码" size="large" /> + <span class="forgetCode" @click="identify">忘记密码?</span> + </el-form-item> + <el-form-item class="login-animation4"> + <el-button type="primary" class="login-content-submit" round @click="onSignIn" :loading="loading.signIn"> + <span>登录系统</span> + </el-button> + </el-form-item> + </el-form> + <el-dialog v-model="identifyDialog" title="重置密码" width="30%" center @close="clearIdentity"> + <el-form :model="identity" label-width="80px" ref="identifyRef" :rules="identityRules"> + <el-divider border-style="dashed">身份验证</el-divider> + <el-form-item label="姓名" prop="realName"> + <el-input v-model="identity.realName"/> + </el-form-item> + <el-form-item label="身份证号" prop="identify"> + <el-input v-model="identity.identify"/> + </el-form-item> + <el-form-item label="手机号" prop="phone"> + <el-input v-model="identity.phone"/> + </el-form-item> + <el-divider border-style="dashed">重设密码</el-divider> + <el-form-item label="密码" prop="password"> + <el-input v-model="identity.password" :type="showPass ? 'text': 'password'" autocomplete="off"> + <template #suffix> + <i class="iconfont el-input__icon login-content-password" :class="showPass ? 'icon-xianshimima' : 'icon-yincangmima'" @click="showPass = !showPass"> </i> + </template> + </el-input> + </el-form-item> + <el-form-item label="确认密码" prop="rePassword"> + <el-input + v-model="identity.rePassword" + :type="showRePass ? 'text': 'password'" + autocomplete="off" + > + <template #suffix> + <i class="iconfont el-input__icon login-content-password" :class="showRePass ? 'icon-xianshimima' : 'icon-yincangmima'" @click="showRePass = !showRePass"> </i> + </template> + </el-input> + </el-form-item> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button type="warning" @click="identifyDialog = false" size="default">取消</el-button> + <el-button type="primary" @click="confirmIdentity(identifyRef)" size="default">确认</el-button> + </span> + </template> + </el-dialog> </template> <script lang="ts"> -import { toRefs, reactive, defineComponent, computed } from 'vue'; +import {toRefs, reactive, defineComponent, computed, ref, onMounted} from 'vue'; import { useRoute, useRouter } from 'vue-router'; import { ElMessage } from 'element-plus'; import { useI18n } from 'vue-i18n'; @@ -55,154 +82,306 @@ import { formatAxis } from '/@/utils/formatTime'; import { NextLoading } from '/@/utils/loading'; import { useLoginApi } from '/@/api/login'; -import {useUserInfo} from "/@/stores/userInfo"; - +import { useUserInfo } from '/@/stores/userInfo'; +import type { FormInstance, FormRules } from 'element-plus' +import {workApplyApi} from "/@/api/specialWorkSystem/workApply"; +import {verifyPhone,verifyIdCard,verifyPwd} from "/@/utils/toolsValidate" +import { Base64 } from 'js-base64' export default defineComponent({ - name: 'accountLogin', - setup() { - const { t } = useI18n(); - const userInfo = useUserInfo() - const route = useRoute(); - const router = useRouter(); - const state = reactive({ - isShowPassword: false, - ruleForm: { - username: '', - password: '', - }, - loading: { - signIn: false, - }, - }); - // 时间获取 - const currentTime = computed(() => { - return formatAxis(new Date()); - }); - // 登录 - const onSignIn = async () => { - state.loading.signIn = true; - // 存储 token 到浏览器缓存 - let res = await useLoginApi().signIn(state.ruleForm) - if(res.data.code === '200'){ - userInfo.setUserInfos(res.data.data) - Session.set('token', res.data.data.accessToken); - Session.set('projectId',''); - Session.set('uid',res.data.data.uid); - signInSuccess(); - }else{ - state.loading.signIn = false - ElMessage({ - type:'warning', - message:res.data.msg - }) - } - // Session.set('token', Math.random().toString(36).substr(0)); - // // 模拟数据,对接接口时,记得删除多余代码及对应依赖的引入。用于 `/src/stores/userInfo.ts` 中不同用户登录判断(模拟数据) - // Cookies.set('userName', state.ruleForm.username); - // if (!themeConfig.value.isRequestRoutes) { - // // 前端控制路由,2、请注意执行顺序 - // await initFrontEndControlRoutes(); - // signInSuccess(); - // } else { - // // 模拟后端控制路由,isRequestRoutes 为 true,则开启后端控制路由 - // // 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/" - // await initBackEndControlRoutes(); - // // 执行完 initBackEndControlRoutes,再执行 signInSuccess - // signInSuccess(); - // } - }; - // 登录成功后的跳转 - const signInSuccess = async () => { - // 初始化登录成功时间问候语 - let currentTimeInfo = currentTime.value; - // 登录成功,跳到转首页 - // 如果是复制粘贴的路径,非首页/登录页,那么登录成功后重定向到对应的路径中 - if (route.query?.redirect) { - router.push('/homeMenu'); - // router.push({ - // path: <string>route.query?.redirect, - // query: Object.keys(<string>route.query?.params).length > 0 ? JSON.parse(<string>route.query?.params) : '', - // }); - } else { - router.push('/loginPage'); - } - state.loading.signIn = true; - const signInText = t('message.signInText'); - ElMessage.success(`${currentTimeInfo},${signInText}`); - // 登录成功提示 - // 关闭 loading - // 添加 loading,防止第一次进入界面时出现短暂空白 - // NextLoading.start(); - }; - return { - onSignIn, - ...toRefs(state), - }; - }, + name: 'accountLogin', + setup() { + const { t } = useI18n(); + const userInfo = useUserInfo(); + const route = useRoute(); + const router = useRouter(); + const state = reactive({ + isShowPassword: false, + showPass: false, + showRePass: false, + saveCode: false, + ruleForm: { + username: '', + password: '' + }, + loading: { + signIn: false + }, + identity:{ + realName: '', + identify: '', + phone: '', + password: '', + rePassword: '' + }, + identifyDialog: false + }); + const identifyRef = ref<FormInstance>() + + // 页面载入时执行方法 + onMounted(() => { + hasUserCodeOrPassword() + // getAllDepartment(); + }); + + const hasUserCodeOrPassword =()=> { + if (localStorage.getItem('userCode') && localStorage.getItem('userPassword')) { + state.ruleForm.username = localStorage.getItem('userCode') as string + state.ruleForm.password = Base64.decode(localStorage.getItem('userPassword'))//解密 + state.saveCode = true + } + } + const checkCode = (rule: any, value: any, callback: any) => { + if (value == '') { + return callback(new Error('该内容不能为空')) + } + setTimeout(() => { + if (!verifyIdCard(value)) { + callback(new Error('身份证格式不正确')) + }else callback(); + }, 400) + } + const checkPhone = (rule: any, value: any, callback: any) => { + if (value == '') { + return callback(new Error('该内容不能为空')) + } + setTimeout(() => { + if (!verifyPhone(value)) { + callback(new Error('手机号格式不正确')) + }else callback(); + }, 400) + } + + let validatePwd = (rule: any, value: any, callback: any)=>{ + if(value === ''){ + callback(new Error('请输入密码')) + }else{ + if(!verifyPwd(value)){ + callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间')) + }else{ + callback() + } + } + } + + // 修改密码 + // const validatePass = (rule: any, value: any, callback: any) => { + // if (value === '') { + // callback(new Error('该内容不能为空')) + // } else { + // if (state.identity.rePassword !== '') { + // if (!identifyRef.value) return + // identifyRef.value.validateField('rePassword', () => null) + // } + // callback() + // } + // } + const validatePass2 = (rule: any, value: any, callback: any) => { + if (value === '') { + callback(new Error('该内容不能为空')) + } else if (value !== state.identity.password) { + callback(new Error("两次输入的密码不一致!")) + } else { + callback() + } + } + const identityRules = reactive({ + realName: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + identify: [{ required: true, validator: checkCode, trigger: 'blur'}], + phone: [{ required: true, validator: checkPhone, trigger: 'blur' }], + password: [{ required: true, validator: validatePwd, trigger: 'blur' }], + rePassword: [{ required: true, validator: validatePass2, trigger: 'blur' }] + }); + + // 时间获取 + const currentTime = computed(() => { + return formatAxis(new Date()); + }); + // 登录 + const onSignIn = async () => { + state.loading.signIn = true; + // 存储 token 到浏览器缓存 + const data = JSON.parse(JSON.stringify(state.ruleForm)) + data.password = Base64.encode(data.password) + let res = await useLoginApi().signIn(data); + if (res.data.code === '200') { + await userInfo.setUserInfos(res.data.data); + Cookies.set('token', res.data.data.accessToken); + Cookies.set('projectId', ''); + Cookies.set('uid', res.data.data.uid); + Cookies.set('depId', res.data.data.depId); + // Session.set('token', res.data.data.accessToken); + // Session.set('projectId', ''); + // Session.set('uid', res.data.data.uid); + console.log(state.ruleForm,'form') + if (state.saveCode) { + localStorage.setItem('userCode', state.ruleForm.username) + localStorage.setItem('userPassword', Base64.encode(state.ruleForm.password),) + } else { + localStorage.removeItem('userCode') + localStorage.removeItem('userPassword') + } + await signInSuccess(); + } else { + state.loading.signIn = false; + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + state.loading.signIn = false; + // Session.set('token', Math.random().toString(36).substr(0)); + // // 模拟数据,对接接口时,记得删除多余代码及对应依赖的引入。用于 `/src/stores/userInfo.ts` 中不同用户登录判断(模拟数据) + // Cookies.set('userName', state.ruleForm.username); + // if (!themeConfig.value.isRequestRoutes) { + // // 前端控制路由,2、请注意执行顺序 + // await initFrontEndControlRoutes(); + // signInSuccess(); + // } else { + // // 模拟后端控制路由,isRequestRoutes 为 true,则开启后端控制路由 + // // 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/" + // await initBackEndControlRoutes(); + // // 执行完 initBackEndControlRoutes,再执行 signInSuccess + // signInSuccess(); + // } + }; + // 登录成功后的跳转 + const signInSuccess = async () => { + // 初始化登录成功时间问候语 + console.log('登录>>>') + let currentTimeInfo = currentTime.value; + // 登录成功,跳到转首页 + // 如果是复制粘贴的路径,非首页/登录页,那么登录成功后重定向到对应的路径中 + // if (route.query?.redirect) { + router.push('/newMenu'); + // router.push({ + // path: <string>route.query?.redirect, + // query: Object.keys(<string>route.query?.params).length > 0 ? JSON.parse(<string>route.query?.params) : '', + // }); + // } else { + // router.push('/loginPage'); + // } + state.loading.signIn = true; + const signInText = t('message.signInText'); + ElMessage.success(`${currentTimeInfo},${signInText}`); + // 登录成功提示 + // 关闭 loading + // 添加 loading,防止第一次进入界面时出现短暂空白 + // NextLoading.start(); + }; + + // 修改密码 + const identify =()=>{ + state.identifyDialog = true + } + + // 提交验证 + const confirmIdentity = (formEl: FormInstance | undefined) => { + if (!formEl) return + formEl.validate(async(valid) => { + if (valid) { + const res = await useLoginApi().changeCode(state.identity); + if(res.data.code == '200'){ + ElMessage({ + type: 'success', + message: '修改成功,请使用新密码登录' + }); + }else{ + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + state.identifyDialog = false + } else { + console.log('error submit!') + return false + } + }) + } + const clearIdentity = ()=>{ + state.identity = { + realName: '', + identify: '', + phone: '', + password: '', + rePassword: '' + } + } + + return { + identifyRef, + identityRules, + clearIdentity, + onSignIn, + identify, + confirmIdentity, + validatePass2, + ...toRefs(state) + }; + } }); </script> <style scoped lang="scss"> .login-content-form { - margin-top: 40px; - width: 420px; + margin-top: 40px; + width: 100%; - .el-input::v-deep .el-input__wrapper{ - height: 56px; - border-radius: 28px; - padding: 0 30px; - background: #F2F2F2; - &:focus-within{ - border: 1px solid #2053D7; - } - } - @for $i from 1 through 4 { - .login-animation#{$i} { - opacity: 0; - animation-name: error-num; - animation-duration: 0.5s; - animation-fill-mode: forwards; - animation-delay: calc($i/10) + s; - } - } - .codeDeal::v-deep .el-form-item__content{ - display: flex; - justify-content: space-between; + .el-input::v-deep .el-input__wrapper { + height: 56px; + border-radius: 28px; + padding: 0 30px; + background: #f2f2f2; + &:focus-within { + border: 1px solid #2053d7; + } + } + @for $i from 1 through 4 { + .login-animation#{$i} { + opacity: 0; + animation-name: error-num; + animation-duration: 0.5s; + animation-fill-mode: forwards; + animation-delay: calc($i/10) + s; + } + } + .codeDeal::v-deep .el-form-item__content { + display: flex; + justify-content: space-between; - .forgetCode{ - color: #2053D7; - cursor: pointer; - } - } - .login-content-password { - width: 100%; - display: inline-block; - width: 20px; - cursor: pointer; - &:hover { - color: #909399; - } - } - .login-content-code { - width: 100%; - padding: 0; - font-weight: bold; - letter-spacing: 5px; - } - .login-content-submit { - width: 100%; - height: 56px; - font-size: 16px; - border-radius: 28px; - letter-spacing: 4px; - font-weight: 300; - margin-top: 15px; - background: #2053D7; - transition: .3s; - &:hover{ - letter-spacing: 6px; - background: #4E7AEC; - } - } + .forgetCode { + color: #2053d7; + cursor: pointer; + } + } + .login-content-password { + width: 100%; + display: inline-block; + cursor: pointer; + &:hover { + color: #909399; + } + } + .login-content-code { + width: 100%; + padding: 0; + font-weight: bold; + letter-spacing: 5px; + } + .login-content-submit { + width: 100%; + height: 56px; + font-size: 16px; + border-radius: 28px; + letter-spacing: 4px; + font-weight: 300; + margin-top: 15px; + background: #2053d7; + transition: 0.3s; + &:hover { + letter-spacing: 6px; + background: #4e7aec; + } + } } </style> -- Gitblit v1.9.2