From d8b570430066fae42d6884671cef541fc820de1c Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期五, 15 十一月 2024 14:42:44 +0800 Subject: [PATCH] 动态路由 --- src/views/components/loginForm.vue | 346 +++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 215 insertions(+), 131 deletions(-) diff --git a/src/views/components/loginForm.vue b/src/views/components/loginForm.vue index ee9ede4..7d4fd1b 100644 --- a/src/views/components/loginForm.vue +++ b/src/views/components/loginForm.vue @@ -1,81 +1,86 @@ <template> - <div class="login-panel"> - <div class="login-img"> - <img :src="loginImgPng"> - </div> - <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"> - <h3 class="title">登录系统</h3> - <el-form-item prop="username"> - <el-input - v-model="loginForm.username" - type="text" - size="large" - auto-complete="off" - placeholder="账号" - > - <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template> - </el-input> - </el-form-item> - <el-form-item prop="password"> - <el-input - v-model="loginForm.password" - type="password" - size="large" - auto-complete="off" - placeholder="密码" - @keyup.enter="handleLogin" - show-password - > - <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> - </el-input> - </el-form-item> - <el-form-item prop="code" v-if="captchaEnabled"> - <el-input - v-model="loginForm.code" - size="large" - auto-complete="off" - placeholder="验证码" - style="width: 63%" - @keyup.enter="handleLogin" - > - <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> - </el-input> - <div class="login-code"> - <img :src="codeUrl" @click="getCode" class="login-code-img"/> - </div> - </el-form-item> - <div style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 25px"> -<!-- <el-checkbox v-model="loginForm.rememberMe">记住密码</el-checkbox>--> - <el-button - :loading="loading" - size="large" - type="primary" - style="width:63%;" - @click.prevent="handleLogin" - > - <span v-if="!loading">登 录</span> - <span v-else>登 录 中...</span> - </el-button> - <div v-if="isRegister"> - <el-button link type="primary" @click="openRegist">立即注册</el-button> + <el-row class="login-panel"> + <el-col :sm="24" :md="12" class="login-img"> + 新疆维吾尔自治区应急管理厅<br/>专家管理系统 + </el-col> + <el-col :sm="24" :md="12" class="login-box"> + <div class="login-card"> + <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"> + <h3 class="title">登录系统</h3> + <el-form-item prop="username"> + <el-input + v-model="loginForm.username" + type="text" + size="large" + auto-complete="off" + placeholder="账号" + > + <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template> + </el-input> + </el-form-item> + <el-form-item prop="password"> + <el-input + v-model="loginForm.password" + type="password" + size="large" + auto-complete="off" + placeholder="密码" + @keyup.enter="handleLogin" + show-password + > + <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> + </el-input> + </el-form-item> + <el-form-item prop="code" v-if="captchaEnabled"> + <el-input + v-model="loginForm.code" + size="large" + auto-complete="off" + placeholder="验证码" + style="width: 63%" + @keyup.enter="handleLogin" + > + <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> + </el-input> + <div class="login-code"> + <img :src="codeUrl" @click="getCode" class="login-code-img"/> + </div> + </el-form-item> + <div style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 25px"> + <div class="btn-cont"> + <button class="login-btn" @click.prevent="handleLogin"> + <span v-if="!loading">登 录</span> + <span v-else>登 录 中...</span> + </button> + </div> + <!-- <div v-if="isRegister">--> + <!-- <el-button link type="primary" @click="openRegist">立即注册</el-button>--> + <!-- </div>--> + </div> + </el-form> + <div class="other-btns"> + <el-button link type="primary" style="color: #fff" @click="openApply()">专家申请</el-button> + <el-button link type="primary" style="color: #fff" @click="openCheck">专家评定进度查询</el-button> </div> </div> - </el-form> - </div> - <register ref="regRef"/> + </el-col> + </el-row> + <expert-form ref="expertFormRef"></expert-form> +<!-- <register ref="regRef"/>--> </template> <script setup> -import {onMounted, ref, watch, defineAsyncComponent, nextTick} from "vue" +import {onMounted, ref, watch, defineAsyncComponent, nextTick, computed} from "vue" import { getCodeImg } from "@/api/login"; import Cookies from "js-cookie"; import { encrypt, decrypt } from "@/utils/jsencrypt"; import useUserStore from '@/store/modules/user' import { Register } from "@/layout/components"; import { Base64 } from 'js-base64' -import menu from "@/layout/components/Sidebar/menu"; -import loginImgPng from "@/assets/images/loginImg.png" - +import ExpertForm from "../safetyReview/expertManage/applyRecords/components/expertForm"; +import usePermissionStore from '@/store/modules/permission' +const permissionStore = usePermissionStore() +const sidebarRouters = computed(() => permissionStore.sidebarRouters); const userStore = useUserStore() const route = useRoute(); const router = useRouter(); @@ -108,7 +113,7 @@ }) const openRegist = ()=>{ - regRef.value.openDialog('add', {}); + regRef.value.openApply(); } watch(route, (newRoute) => { @@ -116,7 +121,24 @@ }, { immediate: true }); -const sidebarRouters = ref([]) +const expertFormRef = ref() +const openApply = () => { + // expertFormRef.value.openApply(type, value) + const routePath = '/fillForm'; + const resolvedRoute = router.resolve(routePath); + const fullPath = resolvedRoute.href + window.open(fullPath, '_blank'); +} + + +const openCheck = () => { + // expertFormRef.value.openApply(type, value) + const routePath = '/checkProgress'; + const resolvedRoute = router.resolve(routePath); + const fullPath = resolvedRoute.href + window.open(fullPath, '_blank'); +} + function handleLogin() { proxy.$refs.loginRef.validate(valid => { if (valid) { @@ -124,7 +146,8 @@ // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码 // if (loginForm.value.rememberMe) { Cookies.set("username", loginForm.value.username, { expires: 30 }); - Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 }); + Cookies.set("password", loginForm.value.password, { expires: 30 }); + // Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 }); // Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 }); // } else { // 否则移除 @@ -136,37 +159,19 @@ // loginForm.value.password = Base64.encode(loginForm.value.password) const param = { username: loginForm.value.username, - password: Base64.encode(loginForm.value.password), + password: loginForm.value.password, code: loginForm.value.code, - uuid: loginForm.value.uuid + uuid: loginForm.value.uuid, } userStore.login(param).then(() => { - // const query = route.query; - // const otherQueryParams = Object.keys(query).reduce((acc, cur) => { - // if (cur !== "redirect") { - // acc[cur] = query[cur]; - // } - // return acc; - // }, {}); - const userInfo = JSON.parse(Cookies.get('userInfo')) - if(userInfo.identity === 0 ) { - sidebarRouters.value = menu.adminMenu - Cookies.set('routers',JSON.stringify(sidebarRouters.value)) - }else if(userInfo.identity === 1) { - sidebarRouters.value = menu.agencyMenu - Cookies.set('routers',JSON.stringify(sidebarRouters.value)) + const query = route.query; + const otherQueryParams = Object.keys(query).reduce((acc, cur) => { + if (cur !== "redirect") { + acc[cur] = query[cur]; } - let path = "" - if(sidebarRouters.value[0].children && sidebarRouters.value[0].children.length > 0){ - path = sidebarRouters.value[0].path + '/'+ sidebarRouters.value[0].children[0].path - }else { - path = sidebarRouters.value[0].path - } - - router.push({ - path: path - }) - // router.push({ path: redirect.value || "/", query: otherQueryParams }); + return acc; + }, {}); + router.push({ path: redirect.value || "/", query: otherQueryParams }); }).catch(() => { loading.value = false; // 重新获取验证码 @@ -180,64 +185,105 @@ function getCode() { getCodeImg().then(res => { - captchaEnabled.value = res.data.captchaEnabled === undefined ? true : res.captchaEnabled + captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled if (captchaEnabled.value) { - codeUrl.value = "data:image/gif;base64," + res.data.image - loginForm.value.uuid = res.data.uuid + codeUrl.value = "data:image/gif;base64," + res.img + loginForm.value.uuid = res.uuid } }); } -// function getCookie() { -// const username = Cookies.get("username") -// const password = Cookies.get("password") -// loginForm.value = { -// username: username === undefined ? loginForm.value.username : username, -// password: password === undefined ? loginForm.value.password : decrypt(password), -// }; -// } +function getCookie() { + const username = Cookies.get("username") + const password = Cookies.get("password") + loginForm.value = { + username: username === undefined ? loginForm.value.username : username, + password: password === undefined ? loginForm.value.password : decrypt(password), + }; +} getCode(); // getCookie(); </script> <style lang='scss' scoped> +@font-face { + font-family: "AliMa"; + src: url("@/assets/styles/font/AlimamaShuHeiTi-Bold.ttf"); + font-style: normal; + font-weight: normal; +} .login-panel{ width: 100%; height: 100%; - display: flex; + background: url("@/assets/images/loginBg.jpg") no-repeat center; + background-size: cover; justify-content: center; align-items: center; + } .login-img{ - flex: 1; display: flex; justify-content: center; align-items: center; - img{ - width: 100%; - } + font-family: 'AliMa'; + color: #fff; + font-size: 3.2rem; + text-align: center; + line-height: 1.5; + transform: translateY(-80px); + text-shadow: -10px 10px 20px rgba(0,0,0,.4); } -.login-form { - flex: 2; - padding: 10px; - - .title{ - margin: 20px 0; +.login-box{ + display: flex; + justify-content: center; + align-items: center; + transform: translateY(-40px); + .login-card{ + width: 500px; + padding: 30px; + border-radius: 16px; + background-color: rgba(255,255,255,.2); + backdrop-filter: blur(5px); + -webkit-backdrop-filter: blur(5px); + border: 1px solid rgba(255,255,255,.4); + max-width: 100%; + box-sizing: border-box; + box-shadow: 0 10px 20px rgba(0,0,0,.05); } + .login-form { + width: 100%; + box-sizing: border-box; - .el-input { - height: 40px; - input { - height: 40px; + .title{ + margin: 0 0 30px; + text-align: center; + color: #fff + } + + .el-form-item{ + margin-bottom: 30px; + } + + .el-input { + height: 48px; + input { + height: 48px; + } + } + .input-icon { + height: 39px; + width: 14px; + margin-left: 0px; } } - .input-icon { - height: 39px; - width: 14px; - margin-left: 0px; + .other-btns{ + width: 100%; + display: flex; + justify-content: space-between; } } + .login-tip { font-size: 13px; text-align: center; @@ -245,11 +291,12 @@ } .login-code { width: 33%; - height: 40px; + height: 48px; float: right; - img { + .login-code-img { display: inline-block; width: 100%; + padding-left: 12px; cursor: pointer; vertical-align: middle; } @@ -263,8 +310,45 @@ display: flex; justify-content: space-between; } -.login-code-img { - height: 40px; - padding-left: 12px; + +.login-btn { + width: 100%; + font-size: 1.2em; + padding: 0.6em 0.8em; + border-radius: 0.5em; + border: none; + background-color: #2563EB; + color: #fff; + cursor: pointer; + box-shadow: 2px 2px 3px #000000b4; } + +.btn-cont { + width: 100%; + position: relative; + padding: 3px; + background: #03a9f4; + border-radius: 0.9em; + transition: all 0.3s ease; +} + +.btn-cont::before { + content: ""; + position: absolute; + inset: 0; + margin: auto; + border-radius: 0.9em; + z-index: -10; + filter: blur(0); + transition: filter 0.4s ease; +} + +.btn-cont:hover::before { + background: #2559c9; + filter: blur(0.6em); +} +.btn-cont:active::before { + filter: blur(0.1em); +} + </style> -- Gitblit v1.9.2