diff --git a/src/assets/images/login-box-bg.svg b/src/assets/images/login-box-bg.svg new file mode 100644 index 0000000..ab10040 --- /dev/null +++ b/src/assets/images/login-box-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/logo_left.png b/src/assets/images/logo_left.png new file mode 100644 index 0000000..732b387 Binary files /dev/null and b/src/assets/images/logo_left.png differ diff --git a/src/assets/images/logo_right.png b/src/assets/images/logo_right.png new file mode 100644 index 0000000..e014fa1 Binary files /dev/null and b/src/assets/images/logo_right.png differ diff --git a/src/views/login.vue b/src/views/login.vue index 9de4ea0..4bfa247 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -1,65 +1,111 @@ @@ -68,7 +114,8 @@ import { getCodeImg } from "@/api/login"; import Cookies from "js-cookie"; import { encrypt, decrypt } from "@/utils/jsencrypt"; -import useUserStore from '@/store/modules/user' +import useUserStore from "@/store/modules/user"; +import { View, Hide } from "@element-plus/icons-vue"; const title = import.meta.env.VITE_APP_TITLE; const userStore = useUserStore(); @@ -81,7 +128,7 @@ const loginForm = ref({ password: "admin123", rememberMe: false, code: "", - uuid: "" + uuid: "", }); const codeUrl = ref(""); @@ -91,31 +138,41 @@ const captchaEnabled = ref(true); // 注册开关 const register = ref(false); const redirect = ref(undefined); +// 密码显示/隐藏 +const showPassword = ref(false); // 动态验证规则 const loginRules = computed(() => { const rules = { username: [{ required: true, trigger: "blur", message: "请输入您的账号" }], - password: [{ required: true, trigger: "blur", message: "请输入您的密码" }] + password: [{ required: true, trigger: "blur", message: "请输入您的密码" }], }; if (captchaEnabled.value) { - rules.code = [{ required: true, trigger: "change", message: "请输入验证码" }]; + rules.code = [ + { required: true, trigger: "change", message: "请输入验证码" }, + ]; } return rules; }); -watch(route, (newRoute) => { +watch( + route, + (newRoute) => { redirect.value = newRoute.query && newRoute.query.redirect; -}, { immediate: true }); + }, + { immediate: true } +); function handleLogin() { - proxy.$refs.loginRef.validate(valid => { + 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("password", encrypt(loginForm.value.password), { + expires: 30, + }); Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 }); } else { // 否则移除 @@ -124,29 +181,33 @@ function handleLogin() { 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; @@ -160,11 +221,16 @@ function getCookie() { 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) + password: + password === undefined ? loginForm.value.password : decrypt(password), + rememberMe: rememberMe === undefined ? false : Boolean(rememberMe), }; } +function togglePasswordVisibility() { + showPassword.value = !showPassword.value; +} + getCode(); getCookie(); @@ -172,49 +238,232 @@ getCookie(); diff --git a/src/views/order/intention/search.vue b/src/views/order/intention/search.vue index d66b1e9..23db402 100644 --- a/src/views/order/intention/search.vue +++ b/src/views/order/intention/search.vue @@ -422,7 +422,6 @@ import { compare, } from "@/api/order"; import { ElMessage, ElEmpty, ElDialog } from "element-plus"; -import { Search, RefreshLeft, Microphone } from "@element-plus/icons-vue"; const { proxy } = getCurrentInstance(); const { display_field } = proxy.useDict("display_field"); @@ -613,7 +612,7 @@ const onHeaderDrop = (targetIndex) => { const compareTableData = ref([]); const diffFieldKeys = ref(new Set()); -const getItemKey = (item) => item?.id ?? item?.partNumber ?? item?.uuid ?? ""; +const getItemKey = (item) => item?.id ?? item?.uuid ?? item?.partNumber ?? ""; const getDictLabel = (dictRef, value) => { if (!dictRef) return null; @@ -1537,7 +1536,7 @@ const fetchDifferenceRecommendations = async () => { const fetchCompareTable = async () => { const idList = selectedCompareList.value - .map((item) => item.id || item.partNumber) + .map((item) => item.uuid || item.partNumber) .filter(Boolean); const ids = idList.join(","); if (!ids) {