From 06d3d15a5a08637041cc601101c063b11b07a346 Mon Sep 17 00:00:00 2001 From: net <net@netdeMBP.lan> Date: 星期五, 14 二月 2025 17:25:21 +0800 Subject: [PATCH] 合并理去杀杀人 --- zhitan-vue/src/views/login.vue | 348 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 348 insertions(+), 0 deletions(-) diff --git a/zhitan-vue/src/views/login.vue b/zhitan-vue/src/views/login.vue new file mode 100644 index 0000000..2fe18dd --- /dev/null +++ b/zhitan-vue/src/views/login.vue @@ -0,0 +1,348 @@ +<template> + <div class="login"> + <!-- <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> + <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>{{ + 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() +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: "guestUser", + password: "guest@123456", + rememberMe: false, + code: "", + uuid: "", +}) + +const loginRules = { + username: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }], + password: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }], + code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }], +} + +const codeUrl = ref("") +const loading = ref(false) +// 楠岃瘉鐮佸紑鍏� +const captchaEnabled = ref(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) => { + if (valid) { + 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 }) + } else { + // 鍚﹀垯绉婚櫎 + 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] + } + 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 + 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") + 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() +</script> + +<style lang="scss" scoped> +.login { + display: flex; + align-items: center; + height: 100%; + background-image: url("@/assets/images/login-background.jpg"); + background-repeat: no-repeat; + background-size: cover; + flex-direction: column; + position: relative; + min-width: 700px; + min-height: 700px; +} + +.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 { + 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; + + input { + height: 40px; + } + } + + .input-icon { + height: 39px; + width: 14px; + margin-left: 0px; + } +} + +.login-tip { + font-size: 13px; + text-align: center; + color: #bfbfbf; +} + +.login-code { + // width: 120px; + height: 40px; + float: right; + + img { + 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: 60px; + line-height: 60px; + position: fixed; + bottom: 0; + width: 100%; + text-align: center; + color: #fff; + font-family: Arial; + font-size: 14px; + letter-spacing: 1px; +} +</style> -- Gitblit v1.9.3