Feature/0723/zr #8

Merged
chenzhen merged 26 commits from feature/0723/ZR into release/0.01 2026-08-06 13:51:34 +08:00
7 changed files with 70 additions and 9 deletions
Showing only changes of commit b3458fd4b8 - Show all commits
+8 -1
View File
@@ -1,5 +1,12 @@
import { post } from '@/utils/request';
import type { LoginResult } from './types';
export type { LoginResult } from './types';
export const login = (params: { phone: string; password: string }) => {
return post(`/op/login`, params);
return post(`/op/login`, params) as Promise<{
code: number;
msg: string;
data: LoginResult;
}>;
};
+8
View File
@@ -0,0 +1,8 @@
export interface LoginResult {
token: string;
phone?: string;
nickName?: string;
realName?: string;
userName?: string;
name?: string;
}
+18 -3
View File
@@ -3,6 +3,7 @@ import type { MenuNode, PermissionCode } from '@/types';
import { FALLBACK_MENU_NODES } from '@/config/fallbackRoutes';
import { getAuthDataPromise, setAuthDataPromise, clearAuthDataCache } from '@/api/authCache';
import { forceReLogin } from '@/hooks/useAuth';
import { useUserStore } from '@/stores/userStore';
export { clearAuthDataCache } from '@/api/authCache';
@@ -12,6 +13,8 @@ export { clearAuthDataCache } from '@/api/authCache';
export interface AuthData {
roleList: string[];
permsList: string[];
nickname: string;
phone: string;
}
const AUTH_FETCH_FAIL_MSG = '账户权限获取失败,请重新登录';
@@ -21,14 +24,26 @@ function normalizeAuthData(res: any): AuthData {
throw new Error(res.msg || AUTH_FETCH_FAIL_MSG);
}
const roleList = res?.data?.roleList || [];
const permsList = res?.data?.permsList || [];
const data = res?.data || {};
const roleList = data.roleList || [];
const permsList = data.permsList || [];
if (permsList.length === 0) {
throw new Error(AUTH_FETCH_FAIL_MSG);
}
return { roleList, permsList };
const nickname = data.nickName || '';
const phone = typeof data.phone === 'string' ? data.phone : '';
if (nickname || phone) {
const { setUser } = useUserStore();
setUser({
...(nickname ? { nickname } : {}),
...(phone ? { phone } : {}),
});
}
return { roleList, permsList, nickname, phone };
}
function handleAuthFetchFailure() {
+1 -1
View File
@@ -62,7 +62,7 @@
align-items: center;
}
.userPhone {
.displayName {
font-size: 14px;
color: rgba(0, 0, 0, 0.65);
}
+2 -1
View File
@@ -79,6 +79,7 @@ export default defineComponent({
const { menuItems } = useMenuStore();
const { phone, nickname } = useUserStore();
const displayName = computed(() => nickname.value || phone.value);
const {
tabs,
cachedViews,
@@ -232,7 +233,7 @@ export default defineComponent({
{/* 右侧: 账号信息 + 退出 */}
<div class={styles.headerRight}>
<span class={styles.userPhone}>{nickname.value}</span>
<span class={styles.displayName}>{displayName.value}</span>
<Dropdown trigger={['hover']} placement="bottomLeft">
{{
default: () => <img src={logoutSvg} class={styles.logoutIcon} />,
+5 -1
View File
@@ -60,7 +60,11 @@ export default defineComponent({
return;
}
setUser({ phone: form.phone, nickname: res.data.nickname, token: res.data.token });
setUser({
phone: res.data.phone || form.phone,
nickname: res.data.nickName || '',
token: res.data.token,
});
if (rememberMe.value) {
localStorage.setItem(
+28 -2
View File
@@ -9,9 +9,32 @@ interface UserState {
token: string;
}
const USER_PROFILE_KEY = 'cpms_user_profile';
function loadUserProfile(): Pick<UserState, 'phone' | 'nickname'> {
try {
const raw = window.localStorage.getItem(USER_PROFILE_KEY);
if (!raw) return { phone: '', nickname: '' };
const data = JSON.parse(raw);
return {
phone: typeof data.phone === 'string' ? data.phone : '',
nickname: typeof data.nickname === 'string' ? data.nickname : '',
};
} catch {
window.localStorage.removeItem(USER_PROFILE_KEY);
return { phone: '', nickname: '' };
}
}
function persistUserProfile(profile: Pick<UserState, 'phone' | 'nickname'>) {
window.localStorage.setItem(USER_PROFILE_KEY, JSON.stringify(profile));
}
const savedProfile = loadUserProfile();
const state = reactive<UserState>({
phone: '',
nickname: '',
phone: savedProfile.phone,
nickname: savedProfile.nickname,
token: '',
});
@@ -20,12 +43,15 @@ export function useUserStore() {
if (user.phone !== undefined) state.phone = user.phone;
if (user.nickname !== undefined) state.nickname = user.nickname;
if (user.token !== undefined) state.token = user.token;
persistUserProfile({ phone: state.phone, nickname: state.nickname });
};
const clearUser = () => {
state.phone = '';
state.nickname = '';
state.token = '';
window.localStorage.removeItem(USER_PROFILE_KEY);
};
return {