This commit is contained in:
@@ -178,6 +178,16 @@ test('system administrator checks and queues a signed online update', async ({ p
|
|||||||
expect(installBodies).toEqual([{ version: '1.0.0-preview.2', reason: '管理员确认立即重启' }]);
|
expect(installBodies).toEqual([{ version: '1.0.0-preview.2', reason: '管理员确认立即重启' }]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('brand logo returns the active identity to its workbench', async ({ page }) => {
|
||||||
|
await installFixture(page, [], []);
|
||||||
|
await page.goto('/governance/update');
|
||||||
|
|
||||||
|
await page.locator('.brand-logo').click();
|
||||||
|
|
||||||
|
await expect(page).toHaveURL(/\/governance\/settings$/);
|
||||||
|
await expect(page.getByText('选择工作身份', { exact: true })).toHaveCount(0);
|
||||||
|
});
|
||||||
|
|
||||||
test('disabled online updates expose status without an executable check action', async ({ page }) => {
|
test('disabled online updates expose status without an executable check action', async ({ page }) => {
|
||||||
await installFixture(page, [], [], false);
|
await installFixture(page, [], [], false);
|
||||||
await page.goto('/governance/update');
|
await page.goto('/governance/update');
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div :class="layoutCls">
|
<div :class="layoutCls">
|
||||||
<t-head-menu :class="menuCls" :theme="menuTheme" expand-type="popup" :value="active">
|
<t-head-menu :class="menuCls" :theme="menuTheme" expand-type="popup" :value="active">
|
||||||
<template #logo>
|
<template #logo>
|
||||||
<span v-if="showLogo" class="header-logo-container" @click="handleNav('/role-select')">
|
<span v-if="showLogo" class="header-logo-container" @click="handleNav(user.workbenchRoute)">
|
||||||
<span class="header-brand">财务系统</span>
|
<span class="header-brand">财务系统</span>
|
||||||
</span>
|
</span>
|
||||||
<div v-else class="header-operate-left">
|
<div v-else class="header-operate-left">
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ import { useRouter } from 'vue-router';
|
|||||||
import { prefix } from '@/config/global';
|
import { prefix } from '@/config/global';
|
||||||
import { t } from '@/locales';
|
import { t } from '@/locales';
|
||||||
import { getActive } from '@/router';
|
import { getActive } from '@/router';
|
||||||
import { useSettingStore } from '@/store';
|
import { useSettingStore, useUserStore } from '@/store';
|
||||||
import type { MenuRoute, ModeType } from '@/types/interface';
|
import type { MenuRoute, ModeType } from '@/types/interface';
|
||||||
|
|
||||||
import pgk from '../../../package.json';
|
import pgk from '../../../package.json';
|
||||||
@@ -155,6 +155,7 @@ const menuCls = computed(() => {
|
|||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const settingStore = useSettingStore();
|
const settingStore = useSettingStore();
|
||||||
|
const userStore = useUserStore();
|
||||||
|
|
||||||
const autoCollapsed = () => {
|
const autoCollapsed = () => {
|
||||||
const isCompact = window.innerWidth <= MIN_POINT;
|
const isCompact = window.innerWidth <= MIN_POINT;
|
||||||
@@ -175,7 +176,7 @@ onUnmounted(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const goHome = () => {
|
const goHome = () => {
|
||||||
router.push('/role-select');
|
router.push(userStore.workbenchRoute);
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
|||||||
@@ -73,16 +73,7 @@ const choose = async (roleCode: string) => {
|
|||||||
try {
|
try {
|
||||||
await userStore.selectRole(roleCode);
|
await userStore.selectRole(roleCode);
|
||||||
permissionStore.initRoutes();
|
permissionStore.initRoutes();
|
||||||
const target = userStore.roles.find((role) => role.code === roleCode)?.workbenchRoute;
|
await router.replace(userStore.workbenchRoute);
|
||||||
const fallback =
|
|
||||||
roleCode === 'PROJECT_MANAGER'
|
|
||||||
? '/workbench/project'
|
|
||||||
: roleCode === 'ARCHIVE_MANAGER'
|
|
||||||
? '/workbench/archive'
|
|
||||||
: roleCode === 'SYSTEM_ADMIN'
|
|
||||||
? '/governance/settings'
|
|
||||||
: '/workbench/finance';
|
|
||||||
await router.replace(target || fallback);
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
MessagePlugin.error((error as Error).message || '身份选择失败,请重试');
|
MessagePlugin.error((error as Error).message || '身份选择失败,请重试');
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import * as authApi from '@/api/auth';
|
|||||||
import { usePermissionStore } from '@/store';
|
import { usePermissionStore } from '@/store';
|
||||||
|
|
||||||
import { hasPermissionAccess } from './menu-access';
|
import { hasPermissionAccess } from './menu-access';
|
||||||
|
import { resolveWorkbenchRoute } from './workbench-route';
|
||||||
|
|
||||||
const emptyUser: UserView = {
|
const emptyUser: UserView = {
|
||||||
publicId: '',
|
publicId: '',
|
||||||
@@ -28,6 +29,7 @@ export const useUserStore = defineStore('user', {
|
|||||||
getters: {
|
getters: {
|
||||||
displayName: (state) => state.user.displayName || state.user.username,
|
displayName: (state) => state.user.displayName || state.user.username,
|
||||||
roleName: (state) => state.roles.find((role) => role.code === state.currentRole)?.name || '',
|
roleName: (state) => state.roles.find((role) => role.code === state.currentRole)?.name || '',
|
||||||
|
workbenchRoute: (state) => resolveWorkbenchRoute(state.currentRole, state.roles),
|
||||||
hasRole: (state) => (roleCode: string) => state.roles.some((role) => role.code === roleCode),
|
hasRole: (state) => (roleCode: string) => state.roles.some((role) => role.code === roleCode),
|
||||||
hasPermission: (state) => (permission: string) =>
|
hasPermission: (state) => (permission: string) =>
|
||||||
hasPermissionAccess(state.currentRole, state.permissions, permission),
|
hasPermissionAccess(state.currentRole, state.permissions, permission),
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import type { RoleView } from '@/api/auth';
|
||||||
|
|
||||||
|
const fallbackWorkbenchRoutes: Record<string, string> = {
|
||||||
|
PROJECT_MANAGER: '/workbench/project',
|
||||||
|
FINANCE_MANAGER: '/workbench/finance',
|
||||||
|
ARCHIVE_MANAGER: '/workbench/archive',
|
||||||
|
SYSTEM_ADMIN: '/governance/settings',
|
||||||
|
};
|
||||||
|
|
||||||
|
export function resolveWorkbenchRoute(currentRole: string | null, roles: RoleView[]): string {
|
||||||
|
const configured = roles.find((role) => role.code === currentRole)?.workbenchRoute?.trim();
|
||||||
|
return configured || fallbackWorkbenchRoutes[currentRole || ''] || '/role-select';
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import { describe, expect, it } from 'vitest';
|
||||||
|
|
||||||
|
import type { RoleView } from '../src/api/auth';
|
||||||
|
import { resolveWorkbenchRoute } from '../src/store/modules/workbench-route';
|
||||||
|
|
||||||
|
const roles: RoleView[] = [
|
||||||
|
{ code: 'SYSTEM_ADMIN', name: '系统管理员', workbenchRoute: '/governance/settings' },
|
||||||
|
{ code: 'FINANCE_MANAGER', name: '财务管理人员', workbenchRoute: '/workbench/finance' },
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('active identity workbench route', () => {
|
||||||
|
it('uses the route supplied for the active role', () => {
|
||||||
|
expect(resolveWorkbenchRoute('SYSTEM_ADMIN', roles)).toBe('/governance/settings');
|
||||||
|
expect(resolveWorkbenchRoute('FINANCE_MANAGER', roles)).toBe('/workbench/finance');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('falls back to the built-in role workbench when the server route is absent', () => {
|
||||||
|
expect(resolveWorkbenchRoute('PROJECT_MANAGER', [])).toBe('/workbench/project');
|
||||||
|
expect(resolveWorkbenchRoute('ARCHIVE_MANAGER', [])).toBe('/workbench/archive');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('keeps role selection for sessions without an active identity', () => {
|
||||||
|
expect(resolveWorkbenchRoute(null, roles)).toBe('/role-select');
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user