From 6ac9d8aee5a2471dde5e368be677281b8d3de183 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 24 Jun 2024 17:09:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=85=A5=E6=95=99=E5=B8=88=E5=92=8C?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E5=8C=BA=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/install/sys_dict_data1_i18n_zh.sql | 18 +-- database/install/sys_dict_data2_i18n_en.sql | 18 +-- .../excel/student_import_template_en.xlsx | Bin 0 -> 11077 bytes .../excel/student_import_template_zh.xlsx | Bin 0 -> 11094 bytes .../excel/user_import_template_en.xlsx | Bin 9513 -> 11289 bytes .../excel/user_import_template_zh.xlsx | Bin 9581 -> 11324 bytes src/modules/system/controller/sys_user.go | 118 +++++++++--------- 7 files changed, 75 insertions(+), 79 deletions(-) create mode 100644 src/assets/template/excel/student_import_template_en.xlsx create mode 100644 src/assets/template/excel/student_import_template_zh.xlsx diff --git a/database/install/sys_dict_data1_i18n_zh.sql b/database/install/sys_dict_data1_i18n_zh.sql index 3ffb4324..9d426031 100644 --- a/database/install/sys_dict_data1_i18n_zh.sql +++ b/database/install/sys_dict_data1_i18n_zh.sql @@ -270,7 +270,7 @@ INSERT INTO `sys_dict_data` VALUES (1536, 1536, 'dictType.noData', '没有可访 INSERT INTO `sys_dict_data` VALUES (1537, 1537, 'dictType.errNameExists', '操作字典【{name}】失败,字典名称已存在', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1538, 1538, 'dictType.errTypeExists', '操作字典【{name}】失败,字典类型已存在', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1600, 1600, 'dept.root', 'XXXX大学', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1601, 1601, 'dept.root.item1', '网络工程学院', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1601, 1601, 'dept.root.item1', '未指定', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1602, 1602, 'dept.noData', '没有可访问班级数据!', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1603, 1603, 'dept.errParentDelFlag', '上级班级【{name}】已删除,不允许新增', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1604, 1604, 'dept.errParentStatus', '上级班级【{name}】停用,不允许新增', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -397,14 +397,14 @@ INSERT INTO `sys_dict_data` VALUES (1849, 1849, 'user.errPhoneFormat', '操作 INSERT INTO `sys_dict_data` VALUES (1850, 1850, 'user.errPhoneExists', '操作用户【{name}】失败,手机号码已存在', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1851, 1851, 'user.errNameExists', '操作用户【{name}】失败,登录账号已存在', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1852, 1852, 'user.import.mustItem', '表格中必填列表项,{text}', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1853, 1853, 'user.import.phoneExist', '用户编号:{id} 手机号码 {phone} 已存在', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1854, 1854, 'user.import.phoneFormat', '用户编号:{id} 手机号码 {phone} 格式错误', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1855, 1855, 'user.import.emailExist', '用户编号:{id} 用户邮箱:{email} 已存在', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1856, 1856, 'user.import.emailFormat', '用户编号:{id} 用户邮箱:{email} 格式错误', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1857, 1857, 'user.import.success', '用户编号:{id} 登录名称:{name} 导入成功', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1858, 1858, 'user.import.fail', '用户编号:{id} 登录名称:{name} 导入失败', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1859, 1859, 'user.import.successUpdate', '用户编号:{id} 登录名称:{name} 更新成功', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (1860, 1860, 'user.import.failUpdate', '用户编号:{id} 登录名称:{name} 更新失败', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1853, 1853, 'user.import.phoneExist', '序号:{id} 手机号码 {phone} 已存在', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1854, 1854, 'user.import.phoneFormat', '序号:{id} 手机号码 {phone} 格式错误', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1855, 1855, 'user.import.emailExist', '序号:{id} 用户邮箱:{email} 已存在', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1856, 1856, 'user.import.emailFormat', '序号:{id} 用户邮箱:{email} 格式错误', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1857, 1857, 'user.import.success', '序号:{id} 登录名称:{name} 导入成功', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1858, 1858, 'user.import.fail', '序号:{id} 登录名称:{name} 导入失败', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1859, 1859, 'user.import.successUpdate', '序号:{id} 登录名称:{name} 更新成功', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (1860, 1860, 'user.import.failUpdate', '序号:{id} 登录名称:{name} 更新失败', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1861, 1861, 'user.import.failTip', '很抱歉,导入失败!共 {num} 条数据格式不正确,错误如下:', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1862, 1862, 'user.import.successTip', '恭喜您,数据已全部导入成功!共 {num} 条,数据如下:', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (1900, 1900, 'app.common.err403', '无权访问 {method} {requestURI}', 'i18n_zh', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/database/install/sys_dict_data2_i18n_en.sql b/database/install/sys_dict_data2_i18n_en.sql index 49cf5c7f..89daa1fb 100644 --- a/database/install/sys_dict_data2_i18n_en.sql +++ b/database/install/sys_dict_data2_i18n_en.sql @@ -270,7 +270,7 @@ INSERT INTO `sys_dict_data` VALUES (3536, 3536, 'dictType.noData', 'There is no INSERT INTO `sys_dict_data` VALUES (3537, 3537, 'dictType.errNameExists', 'Failed to manipulate dictionary [{name}], dictionary name already exists!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3538, 3538, 'dictType.errTypeExists', 'Failed to manipulate dictionary [{name}], dictionary type already exists!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3600, 3600, 'dept.root', 'XXXX University', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3601, 3601, 'dept.root.item1', 'Network Engineering Institute', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3601, 3601, 'dept.root.item1', 'Unspecified', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3602, 3602, 'dept.noData', 'There is no accessible class data!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3603, 3603, 'dept.errParentDelFlag', 'The parent class [{name}] has been deleted and is not allowed to be added.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3604, 3604, 'dept.errParentStatus', 'Parent class [{name}] is deactivated, additions are not allowed!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); @@ -397,14 +397,14 @@ INSERT INTO `sys_dict_data` VALUES (3849, 3849, 'user.errPhoneFormat', 'Failed t INSERT INTO `sys_dict_data` VALUES (3850, 3850, 'user.errPhoneExists', 'Failed to operate user [{name}], cell phone number already exists.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3851, 3851, 'user.errNameExists', 'Failed to operate user [{name}], login account already exists.', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3852, 3852, 'user.import.mustItem', 'Required list item in form, {text}', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3853, 3853, 'user.import.phoneExist', 'User ID: {id} cell phone number {phone} Existing', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3854, 3854, 'user.import.phoneFormat', 'User ID: {id} cell phone number {phone} Wrong format', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3855, 3855, 'user.import.emailExist', 'User ID: {id} User Email: {email} Existing', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3856, 3856, 'user.import.emailFormat', 'User ID: {id} Email: {email} Wrong Format', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3857, 3857, 'user.import.success', 'User ID:{id} Login name:{name} Imported successfully!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3858, 3858, 'user.import.fail', 'User ID: {id} Login name: {name} Import failed', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3859, 3859, 'user.import.successUpdate', 'User ID: {id} Login name: {name} Update success', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); -INSERT INTO `sys_dict_data` VALUES (3860, 3860, 'user.import.failUpdate', 'User ID: {id} Login Name: {name} Update Failed', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3853, 3853, 'user.import.phoneExist', 'Serial No.{id} cell phone number {phone} Existing', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3854, 3854, 'user.import.phoneFormat', 'Serial No.{id} cell phone number {phone} Wrong format', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3855, 3855, 'user.import.emailExist', 'Serial No.{id} User Email: {email} Existing', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3856, 3856, 'user.import.emailFormat', 'Serial No.{id} Email: {email} Wrong Format', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3857, 3857, 'user.import.success', 'Serial No.{id} Login name:{name} Imported successfully!', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3858, 3858, 'user.import.fail', 'Serial No.{id} Login name: {name} Import failed', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3859, 3859, 'user.import.successUpdate', 'Serial No.{id} Login name: {name} Update success', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); +INSERT INTO `sys_dict_data` VALUES (3860, 3860, 'user.import.failUpdate', 'Serial No.{id} Login Name: {name} Update Failed', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3861, 3861, 'user.import.failTip', 'Sorry, the import failed! A total of {num} entries were not formatted correctly, the error is below:', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3862, 3862, 'user.import.successTip', 'Congratulations, the data has been imported successfully! There are {num} entries with the following data:', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); INSERT INTO `sys_dict_data` VALUES (3900, 3900, 'app.common.err403', 'Unauthorized access {method} {requestURI}', 'i18n_en', NULL, NULL, '1', 'supervisor', 1700000000000, NULL, 0, NULL); diff --git a/src/assets/template/excel/student_import_template_en.xlsx b/src/assets/template/excel/student_import_template_en.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..54f1010f9ebfa22d4b2f82609d72cac8c407b0d1 GIT binary patch literal 11077 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 bi-mB-2UF{6V&nY1Pxfcv{xL_y@;CQCP}@we diff --git a/src/assets/template/excel/user_import_template_zh.xlsx b/src/assets/template/excel/user_import_template_zh.xlsx index 0f034a35ceaf406b17c02068f21c7553bc475ad9..b51fd7ebb41f48b8c0b65651f8fa4aa4d36a8bf0 100644 GIT binary patch delta 7337 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%0AybU7MvnjsgXeE{=&+SQUT>gn<7L?*AJc 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 diff --git a/src/modules/system/controller/sys_user.go b/src/modules/system/controller/sys_user.go index e5515a10..77f3126b 100644 --- a/src/modules/system/controller/sys_user.go +++ b/src/modules/system/controller/sys_user.go @@ -573,11 +573,23 @@ func (s *SysUserController) Export(c *gin.Context) { // // GET /importTemplate func (s *SysUserController) Template(c *gin.Context) { - fileName := fmt.Sprintf("user_import_template_%d.xlsx", time.Now().UnixMilli()) - // 多语言处理 language := ctx.AcceptLanguage(c) - asserPath := fmt.Sprintf("assets/template/excel/user_import_template_%s.xlsx", language) + // 登录用户 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } + // 根据角色指定导入模板 + fileKey := "user" + roles := loginUser.User.Roles + if len(roles) == 1 && roles[0].RoleKey == "teacher" { + fileKey = "student" + } + + fileName := fmt.Sprintf("%s_import_template_%d.xlsx", fileKey, time.Now().UnixMilli()) + asserPath := fmt.Sprintf("assets/template/excel/%s_import_template_%s.xlsx", fileKey, language) // 从 embed.FS 中读取默认配置文件内容 assetsDir := config.GetAssetsDirFS() @@ -601,6 +613,12 @@ func (s *SysUserController) Template(c *gin.Context) { // POST /importData func (s *SysUserController) ImportData(c *gin.Context) { language := ctx.AcceptLanguage(c) + // 登录用户 + loginUser, err := ctx.LoginUser(c) + if err != nil { + c.JSON(200, result.ErrMsg(i18n.TKey(language, err.Error()))) + return + } // 允许进行更新 updateSupport := c.PostForm("updateSupport") // 上传的文件 @@ -624,6 +642,12 @@ func (s *SysUserController) ImportData(c *gin.Context) { return } + // 根据角色指定导入模板 + roleKey := "" + roles := loginUser.User.Roles + if len(roles) == 1 && roles[0].RoleKey == "teacher" { + roleKey = "student" + } // 获取操作人名称 operName := ctx.LoginUserToUserName(c) isUpdateSupport := parse.Boolean(updateSupport) @@ -661,77 +685,49 @@ func (s *SysUserController) ImportData(c *gin.Context) { sysUserSex := "0" for _, v := range dictSysUserSex { label := i18n.TKey(language, v.DictLabel) - if row["F"] == label { + if row["D"] == label { sysUserSex = v.DictValue break } } // 用户状态 sysUserStatus := common.STATUS_NO - if row["G"] == "正常" || row["G"] == "Normal" { + if row["E"] == "正常" || row["G"] == "Normal" { sysUserStatus = common.STATUS_YES } - // 用户角色 拿编号 - sysUserRole := "" - if v, ok := row["H"]; ok && v != "" { - sysUserRole = strings.SplitN(v, "-", 2)[0] - if sysUserRole == "1" { - sysUserRole = "" + + sysUserRole := "" // 用户角色 + sysUserPost := "" // 用户岗位 + sysUserDept := "101" // 用户部门 101未指定 + if roleKey == "student" { + sysUserRole = "4" + sysUserPost = "3" + sysUserDept = loginUser.DeptID + } + if v, ok := row["F"]; ok && v != "" { + if v == "学生" || v == "Student" { + sysUserRole = "4" + sysUserPost = "3" + } else if v == "教师" || v == "Teacher" { + sysUserRole = "3" + sysUserPost = "2" } } + if v, ok := row["G"]; ok && v != "" && v != "100" { + sysUserDept = v + } // 构建用户实体信息 newSysUser := model.SysUser{ - UserType: "sys", - Password: initPassword, - DeptID: row["I"], - UserName: row["B"], - NickName: row["C"], - PhoneNumber: row["E"], - Email: row["D"], - Status: sysUserStatus, - Sex: sysUserSex, - RoleIDs: []string{sysUserRole}, - } - - // 检查手机号码格式并判断是否唯一 - if newSysUser.PhoneNumber != "" { - if regular.ValidMobile(newSysUser.PhoneNumber) { - uniquePhone := s.sysUserService.CheckUniquePhone(newSysUser.PhoneNumber, "") - if !uniquePhone { - // 用户编号:%s 手机号码 %s 已存在 - msg := i18n.TTemplate(language, "user.import.phoneExist", map[string]any{"id": row["A"], "phone": newSysUser.PhoneNumber}) - failureNum++ - failureMsgArr = append(failureMsgArr, msg) - continue - } - } else { - // 用户编号:%s 手机号码 %s 格式错误 - msg := i18n.TTemplate(language, "user.import.phoneFormat", map[string]any{"id": row["A"], "phone": newSysUser.PhoneNumber}) - failureNum++ - failureMsgArr = append(failureMsgArr, msg) - continue - } - } - - // 检查邮箱格式并判断是否唯一 - if newSysUser.Email != "" { - if regular.ValidEmail(newSysUser.Email) { - uniqueEmail := s.sysUserService.CheckUniqueEmail(newSysUser.Email, "") - if !uniqueEmail { - // 用户编号:%s 用户邮箱 %s 已存在 - msg := i18n.TTemplate(language, "user.import.emailExist", map[string]any{"id": row["A"], "email": newSysUser.Email}) - failureNum++ - failureMsgArr = append(failureMsgArr, msg) - continue - } - } else { - // 用户编号:%s 用户邮箱 %s 格式错误 - msg := i18n.TTemplate(language, "user.import.emailFormat", map[string]any{"id": row["A"], "email": newSysUser.Email}) - failureNum++ - failureMsgArr = append(failureMsgArr, msg) - continue - } + UserType: "sys", + Password: initPassword, + DeptID: sysUserDept, + UserName: row["B"], + NickName: row["C"], + Status: sysUserStatus, + Sex: sysUserSex, + RoleIDs: []string{sysUserRole}, + PostIDs: []string{sysUserPost}, } // 验证是否存在这个用户