From e0430e0b25d759f6505a4e4542562a69c93b1db5 Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期三, 07 五月 2025 17:38:29 +0800 Subject: [PATCH] 客户档案页面开发 --- src/views/login.vue | 181 ++++++++++++++++++++++++++------------------ 1 files changed, 106 insertions(+), 75 deletions(-) diff --git a/src/views/login.vue b/src/views/login.vue index d69b165..88fb248 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -1,47 +1,51 @@ <template> <div class="login"> <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"> - <h3 class="title">鑻ヤ緷鍚庡彴绠$悊绯荤粺</h3> + <h3 class="title">{{ title }}</h3> + <el-divider /> <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> + <template #prefix><el-icon><User /></el-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="瀵嗙爜" + 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="captchaOnOff"> - <el-input - v-model="loginForm.code" - 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> - <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">璁颁綇瀵嗙爜</el-checkbox> +<!-- <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>--> <el-form-item style="width:100%;"> <el-button :loading="loading" - size="medium" + size="large" type="primary" style="width:100%;" @click.prevent="handleLogin" @@ -53,129 +57,150 @@ <router-link class="link-type" :to="'/register'">绔嬪嵆娉ㄥ唽</router-link> </div> </el-form-item> + <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">璁颁綇瀵嗙爜</el-checkbox> </el-form> <!-- 搴曢儴 --> - <div class="el-login-footer"> - <span>Copyright 漏 2018-2021 ruoyi.vip All Rights Reserved.</span> - </div> +<!-- <div class="el-login-footer">--> +<!-- <span>Copyright 漏 2018-2025 ruoyi.vip 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 { getCodeImg } from "@/api/login" +import Cookies from "js-cookie" +import { encrypt, decrypt } from "@/utils/jsencrypt" +import useUserStore from '@/store/modules/user' -const store = useStore(); -const router = useRouter(); -const { proxy } = getCurrentInstance(); +const title = import.meta.env.VITE_APP_TITLE +const userStore = useUserStore() +const route = useRoute() +const router = useRouter() +const { proxy } = getCurrentInstance() const loginForm = ref({ username: "admin", password: "admin123", rememberMe: false, - code: "", + // code: "", 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 captchaOnOff = ref(true); +const captchaEnabled = ref(true) // 娉ㄥ唽寮�鍏� -const register = ref(false); -const redirect = ref(undefined); +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 => { if (valid) { - loading.value = true; - // 鍕鹃�変簡闇�瑕佽浣忓瘑鐮佽缃湪cookie涓缃浣忕敤鎴锋槑鍜屽悕鍛� + 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鐨勭櫥褰曟柟娉� - store.dispatch("Login", loginForm.value).then(() => { - router.push({ path: redirect.value || "/" }); + 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; + loading.value = false // 閲嶆柊鑾峰彇楠岃瘉鐮� - if (captchaOnOff.value) { - getCode(); + if (captchaEnabled.value) { + getCode() } - }); + }) } - }); + }) } function getCode() { getCodeImg().then(res => { - captchaOnOff.value = res.captchaOnOff === undefined ? true : res.captchaOnOff; - if (captchaOnOff.value) { - codeUrl.value = "data:image/gif;base64," + res.img; - loginForm.value.uuid = res.uuid; + captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled + if (captchaEnabled.value) { + 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) - }; + } } -getCode(); -getCookie(); +getCode() +getCookie() </script> <style lang='scss' scoped> .login { - display: flex; - justify-content: center; - align-items: center; height: 100%; background-image: url("../assets/images/login-background.jpg"); background-size: cover; + position: relative; } .title { - margin: 0px auto 30px auto; + margin: 20px auto 14px auto; text-align: center; - color: #707070; + color: #3472D7; + font-size: 28px; + font-weight: 700; } .login-form { + position: absolute; + top: 50%; + right: 19%; + transform: translate(0, -50%); border-radius: 6px; background: #ffffff; - width: 400px; - padding: 25px 25px 5px 25px; + width: 420px; + height: 500px; + padding: 40px; + z-index: 1; .el-input { - height: 38px; + height: 40px; input { - height: 38px; + height: 40px; } } .input-icon { height: 39px; width: 14px; - margin-left: 2px; + margin-left: 0px; } } .login-tip { @@ -185,7 +210,7 @@ } .login-code { width: 33%; - height: 38px; + height: 40px; float: right; img { cursor: pointer; @@ -205,6 +230,12 @@ letter-spacing: 1px; } .login-code-img { - height: 38px; + height: 40px; + padding-left: 12px; } -</style> \ No newline at end of file +:deep() { + .el-form-item--default { + margin-bottom: 36px; + } +} +</style> -- Gitblit v1.9.3