From 3ad537052477fe31f45bd2e16045d58b35713bdc Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期六, 24 五月 2025 09:19:59 +0800 Subject: [PATCH] refactor(env): 更新环境配置并优化代码 --- zhitan-vue/src/views/login.vue | 467 ++++++++++++++++++++++++++++++++++------------------------ 1 files changed, 273 insertions(+), 194 deletions(-) diff --git a/zhitan-vue/src/views/login.vue b/zhitan-vue/src/views/login.vue index c89c954..194e751 100644 --- a/zhitan-vue/src/views/login.vue +++ b/zhitan-vue/src/views/login.vue @@ -1,207 +1,315 @@ <template> <div class="login"> - <!-- <div class="login-logo" v-if="systemInfo && systemInfo.homeLogo" - :style="{ backgroundImage: 'url(' + systemInfo.homeLogo + ')', backgroundSize: '100% 100%' }"></div> - <div class="login-font" v-else>鑳芥簮绯荤粺</div> --> - <h1 class="logo">灞变笢鎭掗偊鍐剁偧鑲′唤鏈夐檺鍏徃</h1> - <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"> - <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" /> + <!-- <img v-if="systemInfo && systemInfo.homeLogo" :src="systemInfo.homeLogo" alt="" class="login-logo-img" /> + <div class="login-font" v-else>{{ systemInfo.systemName || "鑳芥簮绠$悊绯荤粺" }}</div> --> + <!-- 宸︿笂瑙抣ogo --> + <div> + <img v-if="systemInfo && systemInfo.homeLogo" :src="systemInfo.homeLogo" alt="" class="login-logo-img" /> + </div> + + <!-- 涓棿閮ㄥ垎form --> + <div class="middle-view"> + <div class="left-wrapper"> + <div class="login-font">{{ systemInfo.systemName || "" }}</div> + <img src="@/assets/images/font01.png" alt="" style="width: 380px" /> + <img src="@/assets/images/img_logo.png" alt="" style="width: 180px; margin-top: 20px" /> + </div> + <div class="right-wrapper"> + <div class="header"> + <span>璐﹀彿鐧诲綍</span> </div> - </el-form-item> - <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">璁颁綇瀵嗙爜</el-checkbox> - <el-form-item style="width:100%;"> - <el-button :loading="loading" size="large" type="primary" style="width:100%;" color="#626aef" :dark="isDark" - @click.prevent="handleLogin"> - <span v-if="!loading">鐧� 褰�</span> - <span v-else>鐧� 褰� 涓�...</span> - </el-button> - </el-form-item> - </el-form> + <div class="bottom-block"></div> + <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form" :label-position="'top'"> + <el-form-item prop="username" label="璐﹀彿"> + <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" label="瀵嗙爜"> + <el-input + v-model="loginForm.password" + type="password" + size="large" + auto-complete="off" + placeholder="瀵嗙爜" + show-password + @keyup.enter="handleLogin" + > + <!-- <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" label="楠岃瘉鐮�"> + <el-input + v-model="loginForm.code" + size="large" + auto-complete="off" + placeholder="楠岃瘉鐮�" + style="width: 230px" + @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> + <el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 25px 0px">璁颁綇瀵嗙爜</el-checkbox> + <el-form-item style="width: 100%"> + <el-button + :loading="loading" + size="large" + type="primary" + style="width: 100%" + color="#626aef" + :dark="isDark" + @click.prevent="handleLogin" + class="submit-btn" + > + <span v-if="!loading">鐧� 褰�</span> + <span v-else>鐧� 褰� 涓�...</span> + </el-button> + </el-form-item> + </el-form> + </div> + </div> + <!-- 搴曢儴 --> <div class="el-login-footer"> - <span>Copyright 漏 2021-2024 ZhiTanCloud All Rights Reserved.</span> + <span>{{ + systemInfo.copyRight || "Copyright 漏 2017-" + new Date().getFullYear() + " ZhiTanCloud All Rights Reserved." + }}</span> </div> </div> </template> <script setup> -import { getCodeImg } from "@/api/login"; -import Cookies from "js-cookie"; -import { encrypt, decrypt } from "@/utils/jsencrypt"; -import useUserStore from "@/store/modules/user"; -const userStore = useUserStore(); -import { useRoute } from "vue-router"; -const route = useRoute(); -const router = useRouter(); -const { proxy } = getCurrentInstance(); -// if(Cookies.get('SystemInfo')){ -// const systemInfo = JSON.parse(Cookies.get('SystemInfo')) -// } +import { getCodeImg, authBinding } from "@/api/login" +import Cookies from "js-cookie" +import { encrypt, decrypt } from "@/utils/jsencrypt" +import useUserStore from "@/store/modules/user" +import {ElMessage} from "element-plus"; + +const userStore = useUserStore() +const route = useRoute() +const router = useRouter() +const { proxy } = getCurrentInstance() +const systemInfo1 = JSON.parse(Cookies.get("SystemInfo") || "{}") +const systemInfo = { + ...systemInfo1, + homeLogo: systemInfo1.homeLogo + ? systemInfo1.homeLogo.includes("http") + ? systemInfo1.homeLogo + : "https://demo-ems.zhitancloud.com" + systemInfo1.homeLogo + : "", +} +console.log(systemInfo) + const loginForm = ref({ - username: "admin", - password: "admin123", + username: "guestUser", + password: "guest@123456", rememberMe: false, code: "", - uuid: "" -}); + uuid: "", +}) const loginRules = { username: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }], password: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }], - code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }] -}; + code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }], +} -const codeUrl = ref(""); -const loading = ref(false); +const codeUrl = ref("") +const loading = ref(false) // 楠岃瘉鐮佸紑鍏� -const captchaEnabled = ref(true); +const captchaEnabled = ref(true) // 娉ㄥ唽寮�鍏� -const register = ref(false); -const redirect = ref(undefined); -watch(route, (newRoute) => { - redirect.value = newRoute.query && newRoute.query.redirect; -}, { immediate: true }); -if (!!useRoute().query.token) { - //骞冲彴鍗曠嫭鐨勭櫥褰� - getLoginByNameAndTokenJ(); -} else { - getCode(); - getCookie(); -} -/** - * 涓夋柟骞冲彴鍗曠偣鐧婚檰 - * 鍙紶閫抰oken - */ -function getLoginByNameAndTokenJ() { - //鑾峰彇鍦板潃鏍忎腑鐨則oken - var token = useRoute().query.token; - //璋冪敤鐧诲綍鐨勬帴鍙� - console.log('token2', token); - //杞湀鍦堬紝涓嶈鐪嬪埌鐧婚檰椤甸潰锛屾棤鎰熶綋楠� - loading.value = true; - // 璋冪敤action鐨勭櫥褰曟柟娉� - userStore - .LoginJHaveToken({ - "token": token - }) - .then(() => { - loading.value = true; - const query = route.query; - const otherQueryParams = Object.keys(query).reduce((acc, cur) => { - if (cur !== "redirect") { - acc[cur] = query[cur]; - } - return acc; - }, {}); - router.push({ path: redirect.value || "/", query: otherQueryParams }); - }) - .catch(() => { - loading.value = true; - }); -} +const register = ref(false) +const redirect = ref(undefined) + +// watch( +// route, +// (newRoute) => { +// redirect.value = newRoute.query && newRoute.query.redirect +// }, +// { immediate: true } +// ) + function handleLogin() { - proxy.$refs.loginRef.validate(valid => { + proxy.$refs.loginRef.validate((valid) => { if (valid) { - loading.value = true; + loading.value = true // 鍕鹃�変簡闇�瑕佽浣忓瘑鐮佽缃湪 cookie 涓缃浣忕敤鎴峰悕鍜屽瘑鐮� if (loginForm.value.rememberMe) { - Cookies.set("username", loginForm.value.username, { expires: 30 }); - Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 }); - Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 }); + Cookies.set("username", loginForm.value.username, { expires: 30 }) + Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 }) + Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 }) } else { // 鍚﹀垯绉婚櫎 - Cookies.remove("username"); - Cookies.remove("password"); - Cookies.remove("rememberMe"); + Cookies.remove("username") + Cookies.remove("password") + Cookies.remove("rememberMe") } // 璋冪敤action鐨勭櫥褰曟柟娉� - userStore.login(loginForm.value).then(() => { - const query = route.query; - const otherQueryParams = Object.keys(query).reduce((acc, cur) => { - if (cur !== "redirect") { - acc[cur] = query[cur]; + userStore + .login(loginForm.value) + .then(() => { + const query = route.query + const otherQueryParams = Object.keys(query).reduce((acc, cur) => { + if (cur !== "redirect") { + acc[cur] = query[cur] + } + return acc + }, {}) + router.push({ path: redirect.value || "/", query: otherQueryParams }) + }) + .catch(() => { + loading.value = false + // 閲嶆柊鑾峰彇楠岃瘉鐮� + if (captchaEnabled.value) { + getCode() } - return acc; - }, {}); - router.push({ path: redirect.value || "/", query: otherQueryParams }); - }).catch(() => { - loading.value = false; - // 閲嶆柊鑾峰彇楠岃瘉鐮� - if (captchaEnabled.value) { - getCode(); - } - }); + }) } - }); + }) } + function getCode() { - getCodeImg().then(res => { - captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled; + getCodeImg().then((res) => { + captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled if (captchaEnabled.value) { - codeUrl.value = "data:image/gif;base64," + res.img; - loginForm.value.uuid = res.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"); - const rememberMe = Cookies.get("rememberMe"); + const username = Cookies.get("username") + const password = Cookies.get("password") + const rememberMe = Cookies.get("rememberMe") loginForm.value = { username: username === undefined ? loginForm.value.username : username, password: password === undefined ? loginForm.value.password : decrypt(password), - rememberMe: rememberMe === undefined ? false : Boolean(rememberMe) - }; + rememberMe: rememberMe === undefined ? false : Boolean(rememberMe), + } } + +/** + * 绗笁鏂圭櫥褰� + * @param type + */ +const doSocialLogin = () => { + console.log("doSocialLogin") + authBinding().then((res) => { + console.log(res); + if (res.code === 200) { + // 鑾峰彇鎺堟潈鍦板潃璺宠浆 + window.location.href = res.data; + } else { + ElMessage.error(res.msg); + } + }); +}; +// 闈炲崟鐐圭櫥褰曟斁寮�涓嬭竟涓よ锛屽惁鍒欐敞閲婃帀 +// getCode() +// getCookie() +// 鍗曠偣鐧诲綍鏀惧紑涓嬭竟涓�琛岋紝鍚﹀垯娉ㄩ噴鎺� +doSocialLogin() </script> -<style lang='scss' scoped> +<style lang="scss" scoped> .login { display: flex; align-items: center; - height: 100%; - background-image: url("@/assets/images/login-bg.jpg"); - background-size: 100% 100%; + height: 100vh; + background-image: url("@/assets/images/login-background.png"); + background-repeat: no-repeat; + background-size: cover; flex-direction: column; position: relative; min-width: 700px; min-height: 700px; + background-color:#001146 } -.title { - margin: 0px auto 30px auto; - text-align: center; - color: #707070; +.middle-view { + display: flex; + align-items: center; + justify-content: space-around; + height: 100%; + width: 1200px; + .left-wrapper { + width: 420px; + display: flex; + flex-direction: column; + } + .login-font { + font-size: 32px; + font-weight: 700; + color: #d5f8ff; + margin-bottom: 10px; + } +} + +.right-wrapper { + border-radius: 23px; + background: #ffffff; + width: 410px; + position: relative; + .header { + height: 56px; + line-height: 56px; + border-bottom: 1px solid #f1f1f1; + color: #3b3b3b; + font-size: 18px; + margin-bottom: 22px; + span { + display: inline-block; + height: 56px; + line-height: 62px; + border-bottom: 4px solid #3a83fc; + margin-left: 32px; + } + } +} + +:deep(.el-input__wrapper) { + background-color: #f7f8fa !important; + border: none; +} +:deep(.el-input__inner) { + color: #3b3b3b; +} +:deep(.el-form-item__label) { + color: #3b3b3b !important; +} +:deep(.el-checkbox__label) { + color: #2e2e2e; +} + +.bottom-block { + height: 140px; + width: 90%; + background-color: rgba(255, 255, 255, 0.3); + position: absolute; + left: 5%; + bottom: -20px; + border-radius: 20px; } .login-form { - position: absolute; - left: 50%; - top: 60%; - transform: translate(-50%, -50%); - border-radius: 6px; - // background: #ffffff; - width: 400px; - padding: 25px 25px 5px 25px; + padding: 0 32px 20px; + + .submit-btn { + width: 360px; + height: 44px; + background: #3a83fc; + border-radius: 3px; + font-size: 18px; + box-shadow: 1px 2px 5px #3a83fc; + border: none; + border-radius: 6px; + } .el-input { height: 40px; @@ -225,7 +333,7 @@ } .login-code { - width: 33%; + // width: 120px; height: 40px; float: right; @@ -233,58 +341,29 @@ cursor: pointer; vertical-align: middle; } + .login-code-img { + height: 40px; + // padding-left: 12px; + } } +.login-logo-img { + max-height: 100px; + margin: 0 auto; + position: absolute; + top: 35px; + left: 65px; +} .el-login-footer { - height: 40px; - line-height: 40px; + height: 60px; + line-height: 60px; position: fixed; bottom: 0; width: 100%; text-align: center; color: #fff; font-family: Arial; - font-size: 12px; + font-size: 14px; letter-spacing: 1px; } - -.login-code-img { - height: 40px; - padding-left: 12px; -} - -.login-logo { - width: 514px; - height: 177px; - // background-image: url('@/assets/images/login-logo.png'); - // background-size: 100% 100%; - position: absolute; - left: 50%; - top: 22%; - transform: translate(-50%, -50%); -} - -.login-font { - font-size: 50px; - color: #fff; - top: 32%; - position: absolute; - left: 50%; - width: 514px; - text-align: center; - transform: translate(-50%, -50%); -} - - -.logo { - color: #fff; - width: 514px; - height: 177px; - line-height: 177px; - position: absolute; - left: 50%; - top: 22%; - transform: translate(-50%, -50%); - text-align: center; -} -</style> \ No newline at end of file +</style> -- Gitblit v1.9.3