From 186315d82c0ccb20e543470380c1cc1a38398b93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E5=BC=BA?= <357099073@qq.com> Date: Tue, 24 Feb 2026 12:56:39 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E7=95=8C=E9=9D=A2=E8=AE=B0?= =?UTF-8?q?=E4=BD=8F=E6=88=91=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/login.js | 3 +- src/router/index.js | 10 + .../apps/erp/ProgramManagement/index.vue | 0 src/views/apps/erp/dashboard/index.vue | 329 ++++++++++++++++++ src/views/login/index.vue | 160 ++++----- 5 files changed, 408 insertions(+), 94 deletions(-) create mode 100644 src/views/apps/erp/ProgramManagement/index.vue create mode 100644 src/views/apps/erp/dashboard/index.vue diff --git a/src/api/login.js b/src/api/login.js index 5fd8135..6ec051f 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -1,13 +1,14 @@ import request from "@/utils/request"; // 登录(使用租户名称) -export function login(account, password) { +export function login(account, password, tenant_name) { return request({ url: `/admin/login`, method: "post", data: { account: account, password: password, + tenant_name: tenant_name, }, }); } diff --git a/src/router/index.js b/src/router/index.js index b51e18f..c45236f 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -8,6 +8,11 @@ const staticMainChildren = [ name: "userProfile", component: () => import("@/views/user/userProfile.vue"), meta: { requiresAuth: true, title: "用户中心" } + }, + // 兼容拼写错误的路径重定向 + { + path: "/apps/erp/dashborad", + redirect: "/apps/erp/dashboard" } ]; @@ -25,6 +30,11 @@ const staticRoutes = [ component: () => import("@/views/home/index.vue"), meta: { requiresAuth: true, title: "系统导航", isStandalone: true } }, + // 兼容路径拼写错误:dashborad -> dashboard + { + path: "/apps/erp/dashborad", + redirect: "/apps/erp/dashboard" + }, { path: "/:pathMatch(.*)*", name: "NotFound", diff --git a/src/views/apps/erp/ProgramManagement/index.vue b/src/views/apps/erp/ProgramManagement/index.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/views/apps/erp/dashboard/index.vue b/src/views/apps/erp/dashboard/index.vue new file mode 100644 index 0000000..b29aa5c --- /dev/null +++ b/src/views/apps/erp/dashboard/index.vue @@ -0,0 +1,329 @@ + + + + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue index d9bbad1..854f7b7 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -38,23 +38,20 @@
- - - - + + + +
+
+ + + - - - - - + - - - - - - - - - - + +
@@ -148,6 +88,7 @@ type="checkbox" v-model="rememberMe" class="remember-me-checkbox" + @change="handleRememberMeChange" /> 记住我 @@ -175,10 +116,12 @@ import { ref, onMounted } from "vue"; import { useRouter } from "vue-router"; import { useAuthStore } from "@/stores/auth"; import { login } from "@/api/login"; +import { ElMessageBox } from "element-plus"; const router = useRouter(); const authStore = useAuthStore(); +const tenant_name = ref(""); const account = ref(""); const password = ref(""); const passwordVisible = ref(false); @@ -188,34 +131,72 @@ const errorMsg = ref(""); onMounted(() => { const savedUser = localStorage.getItem("loginAccount"); + const savedTenant = localStorage.getItem("loginTenantName"); + const savedPassword = localStorage.getItem("loginPassword"); const savedRemember = localStorage.getItem("loginRememberMe"); if (savedRemember === "true") { - account.value = savedUser; + tenant_name.value = savedTenant || ""; + account.value = savedUser || ""; + password.value = savedPassword || ""; rememberMe.value = true; } }); +// 记住我复选框变化时触发 +const handleRememberMeChange = async () => { + if (rememberMe.value) { + // 勾选时弹出确认提示 + try { + await ElMessageBox.confirm( + '请确认电脑环境是可信的,登录成功后会自动记住密码。', + '安全提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + } + ); + // 用户确认,等待登录成功后再保存 + } catch { + // 用户取消,取消勾选 + rememberMe.value = false; + } + } else { + // 取消勾选时清除缓存 + localStorage.removeItem("loginAccount"); + localStorage.removeItem("loginTenantName"); + localStorage.removeItem("loginPassword"); + } +}; + const handleLogin = async () => { errorMsg.value = ""; - if (!account.value || !password.value) { - errorMsg.value = "请输入用户名和密码"; + if (!tenant_name.value || !account.value || !password.value) { + errorMsg.value = "请输入租户名称、用户名和密码"; return; } - // 记住我本地存储 - if (rememberMe.value) { - localStorage.setItem("loginAccount", account.value); - localStorage.setItem("loginRememberMe", "true"); - } else { + // 记住我的处理已在复选框变化时完成 + if (!rememberMe.value) { localStorage.removeItem("loginAccount"); + localStorage.removeItem("loginTenantName"); + localStorage.removeItem("loginPassword"); localStorage.setItem("loginRememberMe", "false"); } loading.value = true; try { - const res = await login(account.value, password.value); + const res = await login(account.value, password.value, tenant_name.value); if (res && res.code === 200) { + // 登录成功时保存登录信息(如果勾选了记住我) + if (rememberMe.value) { + localStorage.setItem("loginAccount", account.value); + localStorage.setItem("loginTenantName", tenant_name.value); + localStorage.setItem("loginPassword", password.value); + localStorage.setItem("loginRememberMe", "true"); + } + authStore.setLoginInfo(res.data); // 登录成功后重置 tabs store 为初始状态 @@ -223,13 +204,6 @@ const handleLogin = async () => { const tabsStore = useTabsStore(); tabsStore.resetTabs(); - // 登录成功后缓存菜单 - try { - } catch (menuError) { - console.error("登录处理失败", menuError); - // 菜单加载失败不影响登录流程 - } - router.push({ path: "/home" }); } else { errorMsg.value = res.msg || "登录失败";