diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizDashboardController.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizDashboardController.java index 4e09462..bf04930 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizDashboardController.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizDashboardController.java @@ -42,15 +42,4 @@ public class BizDashboardController extends BaseController { return success(map); } - @GetMapping("/leader") - public AjaxResult leaderDashboard() { - Map map = new HashMap<>(); - List projects = bizProjectService.selectList(new BizProject()); - List meetings = bizMeetingService.selectList(new BizMeeting()); - map.put("totalProjects", projects.size()); - map.put("totalMeetings", meetings.size()); - map.put("finishedProjects", projects.stream().filter(p -> "1".equals(p.getIsFinished())).count()); - map.put("finishedMeetings", meetings.stream().filter(m -> "已结题".equals(m.getCurrentStage())).count()); - return success(map); - } } diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizExecutorController.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizExecutorController.java index beaa7d4..2963d8f 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizExecutorController.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizExecutorController.java @@ -26,7 +26,7 @@ public class BizExecutorController extends BaseController private JdbcTemplate jdbcTemplate; /** - * 查询指定角色用户列表 (支持 executor / sponsor / manager / leader / doctor / admin) + * 查询指定角色用户列表 (支持 executor / sponsor / manager / doctor / admin) * @param roleType 角色类型 (默认 'executor') * @param userName 用户名模糊搜索 (可选) * @param userId 精确匹配 (可选) diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizPersonController.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizPersonController.java index d2de34e..d58fee7 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizPersonController.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizPersonController.java @@ -37,7 +37,7 @@ public class BizPersonController extends BaseController * (sys_user.parent_user_id → sys_user.user_id → biz_person.user_id 链路过滤) */ private static final java.util.Set BUSINESS_MAIN_ROLES = java.util.Set.of( - "executor", "sponsor", "doctor", "manager", "leader" + "executor", "sponsor", "doctor", "manager" ); @GetMapping("/list") diff --git a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectPlanController.java b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectPlanController.java index 4b1c4b4..980912a 100644 --- a/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectPlanController.java +++ b/ry-api/ruoyi-business/src/main/java/com/ruoyi/business/controller/BizProjectPlanController.java @@ -17,7 +17,7 @@ import com.ruoyi.business.service.IBizProjectPlanService; * * 角色权限: * - doctor: 只看自己投的稿 (submitter_id = 当前用户); 新建/编辑强制 submitter_id 写自己, status 默认 '0' - * - manager / leader / sponsor / admin: 全部可见, 不强制 submitter + * - manager / sponsor / admin: 全部可见, 不强制 submitter */ @RestController @RequestMapping("/business/projectPlan") diff --git a/ry-api/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ry-api/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 27ec4d2..1c0947c 100644 --- a/ry-api/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ry-api/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -86,7 +86,7 @@ public class SysUser extends BaseEntity private Long[] postIds; /** 角色ID */ private Long roleId; - /** 业务角色 (admin / leader / manager / doctor / executor / sponsor), DB 列 sys_user.role_type */ + /** 业务角色 (admin / manager / doctor / executor / sponsor), DB 列 sys_user.role_type */ private String roleType; public SysUser() { diff --git a/ry-api/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserExtendVo.java b/ry-api/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserExtendVo.java index 63af958..5126a70 100644 --- a/ry-api/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserExtendVo.java +++ b/ry-api/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysUserExtendVo.java @@ -13,7 +13,7 @@ public class SysUserExtendVo extends SysUser { private static final long serialVersionUID = 1L; - /** 业务角色 (admin / leader / manager / doctor / executor / sponsor) */ + /** 业务角色 (admin / manager / doctor / executor / sponsor) */ private String roleType; public String getRoleType() diff --git a/ry-api/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ry-api/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index 34fb754..da00a51 100644 --- a/ry-api/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ry-api/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -223,7 +223,7 @@ public interface ISysUserService public boolean isPhoneRegistered(String phone); /** - * 更新 sys_user.role_type (业务角色: admin/leader/manager/doctor/executor/sponsor) + * 更新 sys_user.role_type (业务角色: admin/manager/doctor/executor/sponsor) * * @param userId 用户ID * @param roleType 角色类型 diff --git a/ry-vue3/src/components/PortalShell.vue b/ry-vue3/src/components/PortalShell.vue index eb753fc..c9f9b70 100644 --- a/ry-vue3/src/components/PortalShell.vue +++ b/ry-vue3/src/components/PortalShell.vue @@ -126,7 +126,7 @@ async function onUserCmd(cmd) { if (cmd === 'logout') return goLogout() if (cmd === 'account') { const r = (userStore.user?.role || '') - const map = { admin: '/admin/workbench', leader: '/leader/home', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } + const map = { admin: '/admin/workbench', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } router.push(map[r] || '/') } } diff --git a/ry-vue3/src/layout/AdminLayout.vue b/ry-vue3/src/layout/AdminLayout.vue index d3c6cbd..08f1108 100644 --- a/ry-vue3/src/layout/AdminLayout.vue +++ b/ry-vue3/src/layout/AdminLayout.vue @@ -66,7 +66,7 @@ const router = useRouter() const store = useUserStore() const role = computed(() => route.meta?.role || store.role) -const ROLE_LABEL = { leader: '项目负责人', manager: '合规人员', admin: '后台管理员', doctor: '评审专家', executor: '执行人', sponsor: '支持方' } +const ROLE_LABEL = { manager: '合规人员', admin: '后台管理员', doctor: '评审专家', executor: '执行人', sponsor: '支持方' } const roleLabel = computed(() => ROLE_LABEL[role.value] || '工作台') const MENU = { @@ -90,12 +90,6 @@ const MENU = { ]}, { path: '/admin/account', title: '账号信息', icon: User } ], - leader: [ - { path: '/leader/home', title: '工作台', icon: House }, - { path: '/leader/projects', title: '项目列表', icon: Document }, - { path: '/leader/meetings', title: '会议列表', icon: Calendar }, - { path: '/leader/account', title: '账号信息', icon: User } - ], manager: [ { path: '/manager/workbench', title: '工作台', icon: House }, { path: '/manager/plans', title: '项目策划方案', icon: EditPen }, diff --git a/ry-vue3/src/router/index.js b/ry-vue3/src/router/index.js index b44bb89..d9f7a3d 100644 --- a/ry-vue3/src/router/index.js +++ b/ry-vue3/src/router/index.js @@ -53,14 +53,6 @@ const routes = [ { path: 'account', name: 'admin-account', component: () => import('@/views/admin/Account.vue'), meta: { title: '账号信息' } } ] }, - { path: '/leader', component: AdminLayout, meta: { role: 'leader' }, children: [ - { path: '', redirect: { name: 'leader-home' } }, - { path: 'home', name: 'leader-home', component: () => import('@/views/leader/Home.vue'), meta: { title: '工作台' } }, - { path: 'projects', name: 'leader-projects', component: () => import('@/views/leader/Projects.vue'), meta: { title: '项目列表' } }, - { path: 'meetings', name: 'leader-meetings', component: () => import('@/views/leader/Meetings.vue'), meta: { title: '会议列表' } }, - { path: 'account', name: 'leader-account', component: () => import('@/views/leader/Account.vue'), meta: { title: '账号信息' } } - ] - }, { path: '/manager', component: AdminLayout, meta: { role: 'manager' }, children: [ { path: '', redirect: { name: 'manager-workbench' } }, { path: 'workbench', name: 'manager-workbench', component: () => import('@/views/manager/Workbench.vue'), meta: { title: '工作台' } }, diff --git a/ry-vue3/src/views/admin/Account.vue b/ry-vue3/src/views/admin/Account.vue index f01f65b..2592341 100644 --- a/ry-vue3/src/views/admin/Account.vue +++ b/ry-vue3/src/views/admin/Account.vue @@ -50,7 +50,7 @@ const store = useUserStore() const tab = ref('profile') const loading = ref(false) const profile = ref({}) -const ROLE_LABEL = { admin: '后台管理员', leader: '项目负责人', manager: '合规人员', doctor: '评审专家', executor: '执行人', sponsor: '支持方' } +const ROLE_LABEL = { admin: '后台管理员', manager: '合规人员', doctor: '评审专家', executor: '执行人', sponsor: '支持方' } const roleLabel = computed(() => ROLE_LABEL[store.role] || store.role || '后台管理员') const form = reactive({ nickName: '', phonenumber: '', email: '' }) diff --git a/ry-vue3/src/views/admin/Roles.vue b/ry-vue3/src/views/admin/Roles.vue index 0b54eaa..188fb04 100644 --- a/ry-vue3/src/views/admin/Roles.vue +++ b/ry-vue3/src/views/admin/Roles.vue @@ -46,10 +46,10 @@ import request from '@/utils/request' import { ElMessage } from 'element-plus' const ROLE_LABEL = { - admin: '后台管理员', leader: '项目负责人', manager: '合规人员', + admin: '后台管理员', manager: '合规人员', doctor: '评审专家', executor: '执行人', sponsor: '支持方' } -// 卡片展示的角色 (隐藏 admin / leader) +// 卡片展示的角色 (隐藏 admin) const VISIBLE_ROLES = ['manager', 'doctor', 'executor', 'sponsor'] const roleStats = ref([]) diff --git a/ry-vue3/src/views/admin/Users.vue b/ry-vue3/src/views/admin/Users.vue index 073ccf4..ff55575 100644 --- a/ry-vue3/src/views/admin/Users.vue +++ b/ry-vue3/src/views/admin/Users.vue @@ -107,7 +107,7 @@ import { useUserStore } from '@/store/user' const userStore = useUserStore() const ROLE_LABEL = { - admin: '后台管理员', leader: '项目负责人', manager: '合规人员', + admin: '后台管理员', manager: '合规人员', doctor: '评审专家', executor: '执行人', sponsor: '支持方' } const roleOptions = Object.entries(ROLE_LABEL).map(([value, label]) => ({ value, label })) diff --git a/ry-vue3/src/views/admin/Workbench.vue b/ry-vue3/src/views/admin/Workbench.vue index 9148802..1fdef50 100644 --- a/ry-vue3/src/views/admin/Workbench.vue +++ b/ry-vue3/src/views/admin/Workbench.vue @@ -52,7 +52,7 @@ const stats = ref({ const roleStats = ref([]) const ROLE_LABEL = { - admin: '后台管理员', leader: '项目负责人', manager: '合规人员', + admin: '后台管理员', manager: '合规人员', doctor: '评审专家', executor: '执行人', sponsor: '支持方' } diff --git a/ry-vue3/src/views/auth/Login.vue b/ry-vue3/src/views/auth/Login.vue index 03a122f..b15b5bf 100644 --- a/ry-vue3/src/views/auth/Login.vue +++ b/ry-vue3/src/views/auth/Login.vue @@ -189,7 +189,7 @@ const router = useRouter() const route = useRoute() const userStore = useUserStore() -const form = reactive({ username: '', password: '', code: '', uuid: '', role: 'leader' }) +const form = reactive({ username: '', password: '', code: '', uuid: '', role: 'admin' }) const captchaImg = ref('') const captchaEnabled = ref(true) const loading = ref(false) @@ -210,7 +210,6 @@ const registerTypes = [ const userTypes = [ { value: 'admin', name: '系统管理员', desc: '系统配置、用户管理、权限控制' }, - { value: 'leader', name: '学会领导', desc: '查看全局数据、审批重要事项' }, { value: 'manager', name: '项目经理', desc: '项目管理、方案审核、过程监督' }, { value: 'doctor', name: '评审专家', desc: '项目评审、评分反馈、查看任务' }, { value: 'executor', name: '执行单位', desc: '会议组织、人员安排、劳务结算' }, @@ -286,7 +285,7 @@ async function afterLogin(token, displayName, fallbackRole) { }) } ElMessage.success(`欢迎,${displayName}(${userTypes.find(u => u.value === role)?.name || role})`) - // 没拿到角色就跳回登录页 (之前 fallback 到 /leader/home 会让子账号误入 leader) + // 没拿到角色就跳回登录页 if (!role || !roleHome[role]) return router.replace({ name: 'login' }) // 带 redirect 回跳 (401/守卫带过来的原页面), 否则跳角色首页 const redirect = route.query.redirect @@ -356,18 +355,16 @@ async function onSmsLoginSubmit() { function autoRole(username) { const u = (username || '').toLowerCase() if (u === 'admin' || u === 'ry') return 'admin' - if (u.startsWith('leader')) return 'leader' if (u.startsWith('manager')) return 'manager' if (u.startsWith('doctor')) return 'doctor' if (u.startsWith('executor')) return 'executor' if (u.startsWith('sponsor')) return 'sponsor' - // 不匹配返回空串, 让 /getInfo 决定 (避免名字不规范时误进 leader) + // 不匹配返回空串, 让 /getInfo 决定 return '' } const roleHome = { admin: '/admin/workbench', - leader: '/leader/home', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', diff --git a/ry-vue3/src/views/leader/Account.vue b/ry-vue3/src/views/leader/Account.vue deleted file mode 100644 index b378ae7..0000000 --- a/ry-vue3/src/views/leader/Account.vue +++ /dev/null @@ -1,80 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ry-vue3/src/views/leader/Home.vue b/ry-vue3/src/views/leader/Home.vue deleted file mode 100644 index 7c12843..0000000 --- a/ry-vue3/src/views/leader/Home.vue +++ /dev/null @@ -1,154 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ry-vue3/src/views/leader/Meetings.vue b/ry-vue3/src/views/leader/Meetings.vue deleted file mode 100644 index fa90b73..0000000 --- a/ry-vue3/src/views/leader/Meetings.vue +++ /dev/null @@ -1,287 +0,0 @@ - - - - - - diff --git a/ry-vue3/src/views/leader/Projects.vue b/ry-vue3/src/views/leader/Projects.vue deleted file mode 100644 index e5cc65f..0000000 --- a/ry-vue3/src/views/leader/Projects.vue +++ /dev/null @@ -1,275 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ry-vue3/src/views/portal/ArticleView.vue b/ry-vue3/src/views/portal/ArticleView.vue index b65da91..e141de0 100644 --- a/ry-vue3/src/views/portal/ArticleView.vue +++ b/ry-vue3/src/views/portal/ArticleView.vue @@ -147,8 +147,8 @@ async function onUserCmd(cmd) { if (cmd === 'logout') return goLogout() if (cmd === 'account') { const r = (userStore.user?.role || '') - const map = { admin: '/leader/home', leader: '/leader/home', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } - router.push(map[r] || '/leader/home') + const map = { admin: '/admin/workbench', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } + router.push(map[r] || '/admin/workbench') } } diff --git a/ry-vue3/src/views/portal/Home.vue b/ry-vue3/src/views/portal/Home.vue index a4cfc75..0b22eb2 100644 --- a/ry-vue3/src/views/portal/Home.vue +++ b/ry-vue3/src/views/portal/Home.vue @@ -247,8 +247,8 @@ async function onUserCmd(cmd) { if (cmd === 'logout') return goLogout() if (cmd === 'account') { const r = (userStore.user?.role || '') - const map = { admin: '/leader/home', leader: '/leader/home', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } - router.push(map[r] || '/leader/home') + const map = { admin: '/admin/workbench', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } + router.push(map[r] || '/admin/workbench') } } function goPublicity() { router.push('/publicity') } diff --git a/ry-vue3/src/views/portal/Publicity.vue b/ry-vue3/src/views/portal/Publicity.vue index 9e23c24..d76026d 100644 --- a/ry-vue3/src/views/portal/Publicity.vue +++ b/ry-vue3/src/views/portal/Publicity.vue @@ -240,8 +240,8 @@ async function onUserCmd(cmd) { if (cmd === 'logout') return goLogout() if (cmd === 'account') { const r = (userStore.user?.role || '') - const map = { admin: '/leader/home', leader: '/leader/home', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } - router.push(map[r] || '/leader/home') + const map = { admin: '/admin/workbench', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } + router.push(map[r] || '/admin/workbench') } } function goDetail(n) { diff --git a/ry-vue3/src/views/portal/PublicityDetail.vue b/ry-vue3/src/views/portal/PublicityDetail.vue index 55c86f2..02a4a40 100644 --- a/ry-vue3/src/views/portal/PublicityDetail.vue +++ b/ry-vue3/src/views/portal/PublicityDetail.vue @@ -243,7 +243,7 @@ const loggedIn = computed(() => !!userStore.token) const userName = computed(() => userStore.user?.userName || '用户') // 意向按钮按角色显隐: // sponsor (含 MAIN/SUB) → 仅支持意向; executor (含 MAIN/SUB) → 仅执行意向 -// admin / leader / manager / doctor → 两个都隐藏 +// admin / manager / doctor → 两个都隐藏 // 匿名 → 两个都显示 (走 guestDialog) const canShowSupportBtn = computed(() => { const r = userStore.user?.role || '' @@ -392,8 +392,8 @@ async function onUserCmd(cmd) { if (cmd === 'logout') return goLogout() if (cmd === 'account') { const r = (userStore.user?.role || '') - const map = { admin: '/leader/home', leader: '/leader/home', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } - router.push(map[r] || '/leader/home') + const map = { admin: '/admin/workbench', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } + router.push(map[r] || '/admin/workbench') } } diff --git a/ry-vue3/src/views/portal/SpecialPlanDetail.vue b/ry-vue3/src/views/portal/SpecialPlanDetail.vue index 744b425..5c18de2 100644 --- a/ry-vue3/src/views/portal/SpecialPlanDetail.vue +++ b/ry-vue3/src/views/portal/SpecialPlanDetail.vue @@ -185,8 +185,8 @@ async function onUserCmd(cmd) { if (cmd === 'logout') return goLogout() if (cmd === 'account') { const r = (userStore.user?.role || '') - const map = { admin: '/leader/home', leader: '/leader/home', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } - router.push(map[r] || '/leader/home') + const map = { admin: '/admin/workbench', manager: '/manager/workbench', doctor: '/doctor/home', executor: '/executor/meetings', sponsor: '/sponsor/home' } + router.push(map[r] || '/admin/workbench') } } diff --git a/test_20rounds.py b/test_20rounds.py index 0184917..6030c7e 100644 --- a/test_20rounds.py +++ b/test_20rounds.py @@ -85,7 +85,6 @@ def test_round(n): # 7. 前端路由覆盖 expected_routes = [ '/', '/publicity', '/login', '/register-expert', '/register-supplier', '/register-sponsor', - '/leader/home', '/leader/projects', '/leader/meetings', '/leader/account', '/manager/workbench', '/manager/plans', '/manager/projects', '/manager/meetings', '/manager/experts', '/manager/exec-units', '/manager/support-units', '/manager/support-intent', '/manager/exec-intent', '/manager/accounts', @@ -98,7 +97,6 @@ def test_round(n): for r in expected_routes: path_only = r.lstrip('/') # 路由 path 可能有/也可能没有(顶级 parent vs child),name 也可作为 path 替代 - # 期望 router 中存在 path: 'leader/home' 或 name: 'leader-home' name_guess = path_only.replace('/', '-') if not any(p in router_file for p in [ f"path: '{path_only}'", f"path: '/{path_only}'", @@ -188,7 +186,6 @@ def test_round(n): # ============ 新增: 角色页 field 覆盖率 ============ view_map = { # 角色: [(view文件, 原型HTML, 必须出现的字段)] - 'leader': ('Home.vue', 'leader-home.html', ['项目总数量','已结算数量','已结题数量','未执行会议','已执行会议','消息通知']), 'manager': ('Workbench.vue', 'workbench.html', ['项目总数量','已结算的会议','已结题的项目','待结算的会议','未执行会议','待审核的专家']), 'doctor': ('Review.vue', None, ['项目评审','评审意见','评分']), 'executor': ('Meetings.vue', None, ['会议管理']), @@ -236,7 +233,7 @@ def test_round(n): # ============ 新增: 角色路由自动跳转 ============ login_js = Path('/home/john/ry8080/ry-vue3/src/views/auth/Login.vue').read_text() - check('登录按角色路由', 'leader' in login_js and 'manager' in login_js, '') + check('登录按角色路由', 'manager' in login_js, '') # ============ 新增: 业务表结构校验 ============ try: @@ -282,7 +279,7 @@ def test_round(n): check('流程5-认证端点', 'msg' in r, f"code={r.get('code')}") # ============ 新增: 角色权限检查(每个角色 home 可访问)============ - for role_home in ['/leader/home','/manager/workbench','/doctor/review','/executor/meetings','/sponsor/home']: + for role_home in ['/manager/workbench','/doctor/review','/executor/meetings','/sponsor/home']: path_only = role_home.lstrip('/') name_guess = path_only.replace('/', '-') check(f'角色 home: {role_home}', any(p in router_file for p in [ @@ -301,7 +298,6 @@ def test_round(n): # ============ 新增: 角色 × view 映射完整性 ============ expected_role_views = { - 'leader': ['Home.vue','Projects.vue','Meetings.vue','Account.vue'], 'manager': ['Workbench.vue','Plans.vue','Projects.vue','Meetings.vue','Experts.vue','ExecUnits.vue','SupportUnits.vue','SupportIntent.vue','ExecIntent.vue','Accounts.vue'], 'doctor': ['Review.vue','Score.vue'], 'executor': ['Meetings.vue','Labor.vue'],