fix(person): 子账号继承主账号 role_type + Login 不再硬编 leader

问题: sponsor 主账号新建的子账号 role_type 没写入,
      被 sys_user.role_type DEFAULT 'executor' 覆盖,
      导致子账号进入 executor 视角;另外 Login.vue
      autoRole/短信登录都硬编 'leader' 兜底, getInfo
      失败时静默跳 /leader/home。

修复:
- BizPersonServiceImpl.insert 读主账号 SysUser,
  把 mainUser.getRoleType() 写到新子账号
  (SysUserMapper.xml insertUser 已支持 role_type 列)
- Login.vue: 短信登录 fallbackRole 改 '',
  autoRole 不匹配返回 '', afterLogin 无 role 跳 /login
  (不再 fallback /leader/home)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
郭庆泰
2026-08-18 21:35:51 +08:00
co-authored by Claude
parent 40f296b59d
commit e59b512e4b
3 changed files with 391 additions and 4 deletions
+7 -4
View File
@@ -283,7 +283,9 @@ async function afterLogin(token, displayName, fallbackRole) {
})
}
ElMessage.success(`欢迎,${displayName}${userTypes.find(u => u.value === role)?.name || role}`)
router.replace(roleHome[role] || '/leader/home')
// 没拿到角色就跳回登录页 (之前 fallback 到 /leader/home 会让子账号误入 leader)
if (!role || !roleHome[role]) return router.replace({ name: 'login' })
router.replace(roleHome[role])
}
function switchMode(mode) {
@@ -335,8 +337,8 @@ async function onSmsLoginSubmit() {
await runSmsLoginOnce(async () => {
try {
const res = await smsLogin({ phone: smsForm.phone, smsCode: smsForm.smsCode, uuid: smsForm.uuid })
// 短信登录后无 username, 用 phone 作为显示名; role 兜底默认 leader
await afterLogin(res.token, smsForm.phone, 'leader')
// 短信登录后无 username, 用 phone 作为显示名; fallbackRole 留空, 让 /getInfo 决定
await afterLogin(res.token, smsForm.phone, '')
} catch (e) {
// request.js 已弹错误
}
@@ -351,7 +353,8 @@ function autoRole(username) {
if (u.startsWith('doctor')) return 'doctor'
if (u.startsWith('executor')) return 'executor'
if (u.startsWith('sponsor')) return 'sponsor'
return 'leader'
// 不匹配返回空串, 让 /getInfo 决定 (避免名字不规范时误进 leader)
return ''
}
const roleHome = {