跨校身份更改

This commit is contained in:
chenxing
2026-08-27 20:13:16 +08:00
parent 73066b5ab3
commit 886cce1b9e
8 changed files with 118 additions and 158 deletions
+12 -12
View File
@@ -33,7 +33,7 @@ let onSuccessCallback: (() => void) | null = null;
// useForm 托管提交——currentId 是 ref,闭包内 .value 在 sendForm 时取当前值
const { form, loading: submitting, send: sendForm, onSuccess, onError } = useForm(
(dto) => Apis.SysUser.edit({ pathParams: { id: currentId.value }, data: dto }),
{ initialForm: { id: null, account: '', realName: '', password: '', confirmPassword: '', idcard: '', phone: '', gender: 0, userType: [] }, resetAfterSubmiting: true }
{ initialForm: { id: null, account: '', realName: '', password: '', confirmPassword: '', idcard: '', phone: '', gender: 0, userType: [], schoolId: null }, resetAfterSubmiting: true }
);
onSuccess(() => {
@@ -69,9 +69,9 @@ async function open(row: any, groups: any[], curGroupId?: number | null, onSucce
detailData.value = {};
visible.value = true;
// 1) 用户所属组(权威来源 getGroups);失败或为空则用当前组兜底,绝不留空
// 1) 用户所属组(权威来源 getUserGroups);失败或为空则用当前组兜底,绝不留空
try {
const groupIdsResp = await Apis.SysUser.getGroups({ pathParams: { userId: row.id } });
const groupIdsResp = await Apis.SysUser.getUserGroups({ pathParams: { userId: row.id }, cacheFor: null });
const ids: number[] = Array.isArray(groupIdsResp) ? groupIdsResp : [];
const groupMap = new Map<number, any>((groupList as any[]).map(g => [g.id, g]));
let groups_: { id: number; name: string }[] = ids.map(id => ({
@@ -84,13 +84,13 @@ async function open(row: any, groups: any[], curGroupId?: number | null, onSucce
userGroups.value = groups_;
userGroupIdsArr.value = groups_.map(g => g.id);
} catch (e: any) {
// getGroups 不可用(如后端未部署该接口)时,至少展示当前点击的组,避免空白
// getUserGroups 不可用(如后端未部署该接口)时,至少展示当前点击的组,避免空白
if (curGroupId != null) {
const groupMap = new Map<number, any>((groupList as any[]).map(g => [g.id, g]));
userGroups.value = [{ id: curGroupId, name: groupMap.get(curGroupId)?.name ?? ('组#' + curGroupId) }];
userGroupIdsArr.value = [curGroupId];
}
console.warn('[EditUserContainer] getGroups 失败,已用当前组兜底:', e?.message || e);
console.warn('[EditUserContainer] getUserGroups 失败,已用当前组兜底:', e?.message || e);
}
// 2) 角色属性下拉(相互独立,失败不影响所在组)
@@ -126,10 +126,6 @@ async function open(row: any, groups: any[], curGroupId?: number | null, onSucce
/* ---------- 把行数据映射成表单回填数据 ---------- */
function buildInitForm(row: any, userRoleIds: number[], defaultGroupId: number | null = null) {
const roles: number[] = Array.isArray(row.roles) ? row.roles : [];
// 用户身份(业务身份)= 1..7;角色属性已移除(超管手动入库、管理员走勾选)
const userType = roles.filter(r => r >= 1 && r <= 7);
return {
id: row.id,
account: row.account || '',
@@ -139,7 +135,9 @@ function buildInitForm(row: any, userRoleIds: number[], defaultGroupId: number |
password: '',
confirmPassword: '',
gender: row.gender ?? 0,
userType,
// 用户身份回显唯一来源是 GET UserIdentity(UserForm 内部按「所在组」加载):
// roles 列已停写,row.roles 为冻结历史值,误用回显会把废弃值固化进权威表
userType: [],
appRoles: userRoleIds || [],
userGroupId: defaultGroupId ?? null,
};
@@ -172,9 +170,10 @@ async function handleSubmit(formData: Record<string, any>) {
* - 只提交后端 SysUserRequest 里声明的字段
* - 编辑时不提交 groupId(后端 edit 会保留用户原分组,且 groupId 仅在 Create 分组校验)
* - 编辑时密码留空表示不修改,所以密码字段不传
* - 身份随 Select 当前选中组提交 {schoolId, roleIds}(未修改也提交原值),由后端按校全量覆盖并对齐
*/
function buildPayload(formData: Record<string, any>, id: number) {
const roles: number[] = (formData.userType || []).map((v: any) => Number(v));
const roleIds: number[] = (formData.userType || []).map((v: any) => Number(v));
const payload: any = {
id,
@@ -183,7 +182,8 @@ function buildPayload(formData: Record<string, any>, id: number) {
idcard: formData.idcard || undefined,
phone: formData.phone || undefined,
gender: formData.gender,
roles,
schoolId: formData.schoolId,
roleIds,
};
// 编辑时若填写了密码才提交(密码为空表示不修改)
if (formData.password) {