登录/登出优化

This commit is contained in:
tao
2026-01-12 11:46:28 +08:00
parent 4371ced698
commit faf9b7c9a4
5 changed files with 26 additions and 17 deletions

3
components.d.ts vendored
View File

@@ -19,11 +19,13 @@ declare module 'vue' {
ADropdown: typeof import('ant-design-vue/es')['Dropdown'] ADropdown: typeof import('ant-design-vue/es')['Dropdown']
AForm: typeof import('ant-design-vue/es')['Form'] AForm: typeof import('ant-design-vue/es')['Form']
AFormItem: typeof import('ant-design-vue/es')['FormItem'] AFormItem: typeof import('ant-design-vue/es')['FormItem']
AImage: typeof import('ant-design-vue/es')['Image']
AInput: typeof import('ant-design-vue/es')['Input'] AInput: typeof import('ant-design-vue/es')['Input']
AInputPassword: typeof import('ant-design-vue/es')['InputPassword'] AInputPassword: typeof import('ant-design-vue/es')['InputPassword']
AMenu: typeof import('ant-design-vue/es')['Menu'] AMenu: typeof import('ant-design-vue/es')['Menu']
AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] AMenuItem: typeof import('ant-design-vue/es')['MenuItem']
AModal: typeof import('ant-design-vue/es')['Modal'] AModal: typeof import('ant-design-vue/es')['Modal']
APopconfirm: typeof import('ant-design-vue/es')['Popconfirm']
AProgress: typeof import('ant-design-vue/es')['Progress'] AProgress: typeof import('ant-design-vue/es')['Progress']
ARow: typeof import('ant-design-vue/es')['Row'] ARow: typeof import('ant-design-vue/es')['Row']
ASelect: typeof import('ant-design-vue/es')['Select'] ASelect: typeof import('ant-design-vue/es')['Select']
@@ -47,6 +49,7 @@ declare module 'vue' {
ILucideRefreshCw: typeof import('~icons/lucide/refresh-cw')['default'] ILucideRefreshCw: typeof import('~icons/lucide/refresh-cw')['default']
ILucideRotateCcw: typeof import('~icons/lucide/rotate-ccw')['default'] ILucideRotateCcw: typeof import('~icons/lucide/rotate-ccw')['default']
ILucideRotateCw: typeof import('~icons/lucide/rotate-cw')['default'] ILucideRotateCw: typeof import('~icons/lucide/rotate-cw')['default']
ILucideSave: typeof import('~icons/lucide/save')['default']
ILucideShieldCheck: typeof import('~icons/lucide/shield-check')['default'] ILucideShieldCheck: typeof import('~icons/lucide/shield-check')['default']
ILucideUser: typeof import('~icons/lucide/user')['default'] ILucideUser: typeof import('~icons/lucide/user')['default']
RouterLink: typeof import('vue-router')['RouterLink'] RouterLink: typeof import('vue-router')['RouterLink']

View File

@@ -5,7 +5,7 @@ import { message, notification } from "ant-design-vue";
import { useUserStore } from "./user"; import { useUserStore } from "./user";
import { login, logout as logoutApi } from "@/api/system"; import { login, logout as logoutApi } from "@/api/system";
import { setToken, getToken, removeToken, setAccount, removeAccount } from "@/utils/auth"; import { setToken, getToken, removeToken, removeAccount, getRememberMe } from "@/utils/auth";
import type { LoginInfo } from "@/api/system/model"; import type { LoginInfo } from "@/api/system/model";
export const useAuthStore = defineStore("auth", () => { export const useAuthStore = defineStore("auth", () => {
@@ -29,19 +29,13 @@ export const useAuthStore = defineStore("auth", () => {
duration: 3, duration: 3,
}); });
let userInfo = {};
if (rememberMe) { if (rememberMe) {
userInfo = { userStore.setUserInfo({ ...params, rememberMe });
...params,
rememberMe
};
} else { } else {
userInfo = { userStore.clearUserInfo();
username: params.username userStore.setUsername(params.username);
};
} }
userStore.clearUserInfo();
userStore.setUserInfo(userInfo);
const redirect = route.query.redirect || "/"; const redirect = route.query.redirect || "/";
router.replace(redirect as string); router.replace(redirect as string);
return res; return res;
@@ -60,7 +54,7 @@ export const useAuthStore = defineStore("auth", () => {
// 在实际应用中,这里可以调用后端的退出登录接口 // 在实际应用中,这里可以调用后端的退出登录接口
await logoutApi(); await logoutApi();
removeToken(); removeToken();
userStore.clearUserInfo(); !getRememberMe() && removeAccount();
await router.push("/login"); await router.push("/login");
message.success("已成功退出"); message.success("已成功退出");
} }

View File

@@ -10,21 +10,29 @@ export const useUserStore = defineStore("user", () => {
// Simulate API call // Simulate API call
} }
function setUsername(name: string) {
username.value = name;
}
function setUserInfo(params: any) { function setUserInfo(params: any) {
setAccount({ username.value = params.username || '';
params.rememberMe && setAccount({
username: params.username, username: params.username,
password: params.password, password: params.password,
rememberMe: params.rememberMe ? "true" : "false", rememberMe: params.rememberMe,
}); });
} }
function clearUserInfo() { function clearUserInfo() {
username.value = '';
removeAccount(); removeAccount();
} }
return { return {
username, username,
fetchUserInfo, fetchUserInfo,
setUsername,
setUserInfo, setUserInfo,
clearUserInfo, clearUserInfo,
} }

View File

@@ -24,11 +24,14 @@ export interface AccountInfo {
rememberMe?: 'true' | 'false'; rememberMe?: 'true' | 'false';
} }
export function getRememberMe() {
return Cookies.get("rememberMe");
}
export function getAccount() { export function getAccount() {
return { return {
username: Cookies.get("username"), username: Cookies.get("username"),
password: Cookies.get("password"), password: Cookies.get("password"),
rememberMe: Cookies.get("rememberMe"),
}; };
} }

View File

@@ -6,7 +6,7 @@ import type { LoginInfo } from '@/api/system/model'
import type { Rule } from 'ant-design-vue/es/form'; import type { Rule } from 'ant-design-vue/es/form';
import { useAuthStore } from '@/store'; import { useAuthStore } from '@/store';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { getAccount } from '@/utils/auth'; import { getAccount, getRememberMe } from '@/utils/auth';
import { decrypt } from '@/utils/jsencrypt'; import { decrypt } from '@/utils/jsencrypt';
const authStore = useAuthStore(); const authStore = useAuthStore();
@@ -66,7 +66,8 @@ const refreshCaptcha = async () => {
// 初始化 // 初始化
const initLoginForm = () => { const initLoginForm = () => {
const { username, password, rememberMe: isRememberMe } = getAccount(); const { username, password } = getAccount();
const isRememberMe = getRememberMe();
if (isRememberMe && isRememberMe === 'true') { if (isRememberMe && isRememberMe === 'true') {
rememberMe.value = true; rememberMe.value = true;
formData.username = username || ''; formData.username = username || '';