feat: 统一角色枚举 (meetingExecutor/supervisor) + 子账号数据隔离 + Login 读取后端 role_type

后端:
- SysUser 加 roleType 字段 (entity + mapper selectUserVo + service 接口/实现)
- SysUserMapper 新增 selectUserIdsByParent (按 parent_user_id 取子账号列表)
- BizPersonController.list 自动注入 MAIN 业务用户可见性: 仅查 user_id IN (子账号列表)
- BizPersonMapper 加 params.subUserIds foreach 过滤
- BizPerson/BizPersonServiceImpl 配合 getParams().put

前端:
- Login.vue 改用后端 sys_user.roleType 替代 username 前缀 autoRole, 修复 exe01 错入 leader 菜单
- utils/roleMap.js 新增: meetingExecutor->会议执行, supervisor->监察员
- executor/People.vue / sponsor/NewPerson.vue / sponsor/Projects.vue / sponsor/SponsorProjects.vue /
  manager/ManagerProjectDetail.vue / manager/{Executor,Sponsor}PersonNew.vue /
  admin/{Executor,Sponsor}PersonNew.vue 全部改为 enum key

SQL:
- migration_unify_role_type_2026_08_16.sql 清洗 biz_person.role 从中文到 enum key
This commit is contained in:
郭庆泰
2026-08-16 13:41:42 +08:00
parent cf5790229a
commit c612d4297a
22 changed files with 1211 additions and 112 deletions
+7 -4
View File
@@ -154,12 +154,15 @@ async function onSubmit() {
loading.value = true
try {
const res = await login({ username: form.username, password: form.password, code: form.code || '', uuid: form.uuid || '' })
const role = autoRole(form.username)
// username 推断仅作兜底, 真实 role 以 /getInfo 返回的 sys_user.role_type 为准
const fallbackRole = autoRole(form.username)
userStore.setToken(res.token)
// /login 接口只返回 token; 调 /getInfo 拿完整 user (含 accountType/parentUserId, 让 isMain/isSub 判断正确)
// /login 接口只返回 token; 调 /getInfo 拿完整 user (含 accountType/parentUserId/roleType, 让 isMain/isSub/role 都从后端真实值取)
let role = fallbackRole
try {
const info = await getInfo()
const u = info.user || {}
role = u.roleType || fallbackRole
userStore.setUser({
userId: u.userId,
userName: u.userName || form.username,
@@ -176,13 +179,13 @@ async function onSubmit() {
nickName: form.username,
accountType: 'MAIN',
parentUserId: null,
role
role: fallbackRole
})
}
ElMessage.success(`欢迎,${form.username}${userTypes.find(u => u.value === role)?.name || role}`)
router.replace(roleHome[role] || '/leader/home')
} catch (e) {
ElMessage.error(e?.msg || '登录失败')
// 错误提示已由 utils/request.js 拦截器统一弹 (ElMessage.error), 这里只刷新验证码
loadCaptcha()
} finally {
loading.value = false