feat: 多语言处理tkey
This commit is contained in:
@@ -8,6 +8,8 @@ import (
|
||||
|
||||
"ems.agt/src/framework/config"
|
||||
"ems.agt/src/framework/constants/admin"
|
||||
"ems.agt/src/framework/constants/common"
|
||||
"ems.agt/src/framework/i18n"
|
||||
"ems.agt/src/framework/utils/ctx"
|
||||
"ems.agt/src/framework/utils/date"
|
||||
"ems.agt/src/framework/utils/file"
|
||||
@@ -27,6 +29,7 @@ var NewSysUser = &SysUserController{
|
||||
sysRoleService: service.NewSysRoleImpl,
|
||||
sysPostService: service.NewSysPostImpl,
|
||||
sysDictDataService: service.NewSysDictDataImpl,
|
||||
sysConfigService: service.NewSysConfigImpl,
|
||||
}
|
||||
|
||||
// 用户信息
|
||||
@@ -41,6 +44,8 @@ type SysUserController struct {
|
||||
sysPostService service.ISysPost
|
||||
// 字典数据服务
|
||||
sysDictDataService service.ISysDictData
|
||||
// 参数配置服务
|
||||
sysConfigService service.ISysConfig
|
||||
}
|
||||
|
||||
// 用户信息列表
|
||||
@@ -50,6 +55,22 @@ func (s *SysUserController) List(c *gin.Context) {
|
||||
querys := ctx.QueryMap(c)
|
||||
dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "u")
|
||||
data := s.sysUserService.SelectUserPage(querys, dataScopeSQL)
|
||||
|
||||
rows := data["rows"].([]model.SysUser)
|
||||
// 闭包函数处理多语言
|
||||
language := ctx.AcceptLanguage(c)
|
||||
converI18n := func(language string, arr *[]model.SysUser) {
|
||||
for i := range *arr {
|
||||
(*arr)[i].NickName = i18n.TKey(language, (*arr)[i].NickName)
|
||||
(*arr)[i].Remark = i18n.TKey(language, (*arr)[i].Remark)
|
||||
(*arr)[i].Dept.DeptName = i18n.TKey(language, (*arr)[i].Dept.DeptName)
|
||||
for ri := range (*arr)[i].Roles {
|
||||
(*arr)[i].Roles[ri].RoleName = i18n.TKey(language, (*arr)[i].Roles[ri].RoleName)
|
||||
}
|
||||
}
|
||||
}
|
||||
converI18n(language, &rows)
|
||||
|
||||
c.JSON(200, result.Ok(data))
|
||||
}
|
||||
|
||||
@@ -57,11 +78,13 @@ func (s *SysUserController) List(c *gin.Context) {
|
||||
//
|
||||
// GET /:userId
|
||||
func (s *SysUserController) Info(c *gin.Context) {
|
||||
language := ctx.AcceptLanguage(c)
|
||||
userId := c.Param("userId")
|
||||
if userId == "" {
|
||||
c.JSON(400, result.CodeMsg(400, "parameter error"))
|
||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||
return
|
||||
}
|
||||
|
||||
// 查询系统角色列表
|
||||
dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "")
|
||||
roles := s.sysRoleService.SelectRoleList(model.SysRole{}, dataScopeSQL)
|
||||
@@ -77,9 +100,27 @@ func (s *SysUserController) Info(c *gin.Context) {
|
||||
roles = rolesFilter
|
||||
}
|
||||
|
||||
// 闭包函数处理多语言
|
||||
converI18nRoles := func(language string, arr *[]model.SysRole) {
|
||||
for i := range *arr {
|
||||
(*arr)[i].RoleName = i18n.TKey(language, (*arr)[i].RoleName)
|
||||
(*arr)[i].Remark = i18n.TKey(language, (*arr)[i].Remark)
|
||||
}
|
||||
}
|
||||
converI18nRoles(language, &roles)
|
||||
|
||||
// 查询系统岗位列表
|
||||
posts := s.sysPostService.SelectPostList(model.SysPost{})
|
||||
|
||||
// 闭包函数处理多语言
|
||||
converI18nPosts := func(language string, arr *[]model.SysPost) {
|
||||
for i := range *arr {
|
||||
(*arr)[i].PostName = i18n.TKey(language, (*arr)[i].PostName)
|
||||
(*arr)[i].Remark = i18n.TKey(language, (*arr)[i].Remark)
|
||||
}
|
||||
}
|
||||
converI18nPosts(language, &posts)
|
||||
|
||||
// 新增用户时,用户ID为0
|
||||
if userId == "0" {
|
||||
c.JSON(200, result.OkData(map[string]any{
|
||||
@@ -95,10 +136,18 @@ func (s *SysUserController) Info(c *gin.Context) {
|
||||
// 检查用户是否存在
|
||||
user := s.sysUserService.SelectUserById(userId)
|
||||
if user.UserID != userId {
|
||||
c.JSON(200, result.ErrMsg("There is no accessible user data!"))
|
||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.noData")))
|
||||
return
|
||||
}
|
||||
|
||||
// 处理多语言
|
||||
user.NickName = i18n.TKey(language, user.NickName)
|
||||
user.Remark = i18n.TKey(language, user.Remark)
|
||||
user.Dept.DeptName = i18n.TKey(language, user.Dept.DeptName)
|
||||
for ri := range user.Roles {
|
||||
user.Roles[ri].RoleName = i18n.TKey(language, user.Roles[ri].RoleName)
|
||||
}
|
||||
|
||||
// 角色ID组
|
||||
roleIds := make([]string, 0)
|
||||
for _, r := range user.Roles {
|
||||
@@ -125,10 +174,11 @@ func (s *SysUserController) Info(c *gin.Context) {
|
||||
//
|
||||
// POST /
|
||||
func (s *SysUserController) Add(c *gin.Context) {
|
||||
language := ctx.AcceptLanguage(c)
|
||||
var body model.SysUser
|
||||
err := c.ShouldBindBodyWith(&body, binding.JSON)
|
||||
if err != nil || body.UserID != "" {
|
||||
c.JSON(400, result.CodeMsg(400, "parameter error"))
|
||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -137,7 +187,7 @@ func (s *SysUserController) Add(c *gin.Context) {
|
||||
Password string `json:"password" binding:"required"`
|
||||
}
|
||||
if err := c.ShouldBindBodyWith(&bodyPassword, binding.JSON); err != nil {
|
||||
c.JSON(400, result.CodeMsg(400, "parameter error"))
|
||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||
return
|
||||
}
|
||||
body.Password = bodyPassword.Password
|
||||
@@ -146,7 +196,8 @@ func (s *SysUserController) Add(c *gin.Context) {
|
||||
uniqueUserName := s.sysUserService.CheckUniqueUserName(body.UserName, "")
|
||||
if !uniqueUserName {
|
||||
// 新增用户【%s】失败,登录账号已存在
|
||||
msg := fmt.Sprintf("Failed to add user [%s], login account already exists", body.UserName)
|
||||
// msg := fmt.Sprintf("Failed to add user [%s], login account already exists", body.UserName)
|
||||
msg := i18n.TTemplate(language, "user.errNameExists", map[string]any{"name": body.UserName})
|
||||
c.JSON(200, result.ErrMsg(msg))
|
||||
return
|
||||
}
|
||||
@@ -157,13 +208,15 @@ func (s *SysUserController) Add(c *gin.Context) {
|
||||
uniquePhone := s.sysUserService.CheckUniquePhone(body.PhoneNumber, "")
|
||||
if !uniquePhone {
|
||||
// 新增用户【%s】失败,手机号码已存在
|
||||
msg := fmt.Sprintf("Failed to add user [%s], cell phone number already exists", body.UserName)
|
||||
// msg := fmt.Sprintf("Failed to add user [%s], cell phone number already exists", body.UserName)
|
||||
msg := i18n.TTemplate(language, "user.errPhoneExists", map[string]any{"name": body.UserName})
|
||||
c.JSON(200, result.ErrMsg(msg))
|
||||
return
|
||||
}
|
||||
} else {
|
||||
// 新增用户【%s】失败,手机号码格式错误
|
||||
msg := fmt.Sprintf("Failed to add user [%s], wrong format of cell phone number", body.UserName)
|
||||
// msg := fmt.Sprintf("Failed to add user [%s], wrong format of cell phone number", body.UserName)
|
||||
msg := i18n.TTemplate(language, "user.errPhoneFormat", map[string]any{"name": body.UserName})
|
||||
c.JSON(200, result.ErrMsg(msg))
|
||||
return
|
||||
}
|
||||
@@ -175,13 +228,15 @@ func (s *SysUserController) Add(c *gin.Context) {
|
||||
uniqueEmail := s.sysUserService.CheckUniqueEmail(body.Email, "")
|
||||
if !uniqueEmail {
|
||||
// 新增用户【%s】失败,邮箱已存在
|
||||
msg := fmt.Sprintf("Failed to add user [%s], mailbox already exists", body.UserName)
|
||||
// msg := fmt.Sprintf("Failed to add user [%s], mailbox already exists", body.UserName)
|
||||
msg := i18n.TTemplate(language, "user.errEmailExists", map[string]any{"name": body.UserName})
|
||||
c.JSON(200, result.ErrMsg(msg))
|
||||
return
|
||||
}
|
||||
} else {
|
||||
// 新增用户【%s】失败,邮箱格式错误
|
||||
msg := fmt.Sprintf("Failed to add user [%s], mailbox format error", body.UserName)
|
||||
// msg := fmt.Sprintf("Failed to add user [%s], mailbox format error", body.UserName)
|
||||
msg := i18n.TTemplate(language, "user.errEmailFormat", map[string]any{"name": body.UserName})
|
||||
c.JSON(200, result.ErrMsg(msg))
|
||||
return
|
||||
}
|
||||
@@ -200,24 +255,25 @@ func (s *SysUserController) Add(c *gin.Context) {
|
||||
//
|
||||
// POST /
|
||||
func (s *SysUserController) Edit(c *gin.Context) {
|
||||
language := ctx.AcceptLanguage(c)
|
||||
var body model.SysUser
|
||||
err := c.ShouldBindBodyWith(&body, binding.JSON)
|
||||
if err != nil || body.UserID == "" {
|
||||
c.JSON(400, result.CodeMsg(400, "parameter error"))
|
||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||
return
|
||||
}
|
||||
|
||||
// 检查是否管理员用户
|
||||
if config.IsAdmin(body.UserID) {
|
||||
// 不允许操作管理员用户
|
||||
c.JSON(200, result.ErrMsg("Administrator users are not allowed to operate"))
|
||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errOperateAdmin")))
|
||||
return
|
||||
}
|
||||
|
||||
user := s.sysUserService.SelectUserById(body.UserID)
|
||||
if user.UserID != body.UserID {
|
||||
// 没有可访问用户数据!
|
||||
c.JSON(200, result.ErrMsg("There is no accessible user data!"))
|
||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.noData")))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -225,7 +281,8 @@ func (s *SysUserController) Edit(c *gin.Context) {
|
||||
uniqueUserName := s.sysUserService.CheckUniqueUserName(body.UserName, body.UserID)
|
||||
if !uniqueUserName {
|
||||
// 修改用户【%s】失败,登录账号已存在
|
||||
msg := fmt.Sprintf("Failed to modify user [%s], login account already exists", body.UserName)
|
||||
// msg := fmt.Sprintf("Failed to modify user [%s], login account already exists", body.UserName)
|
||||
msg := i18n.TTemplate(language, "user.errNameExists", map[string]any{"name": body.UserName})
|
||||
c.JSON(200, result.ErrMsg(msg))
|
||||
return
|
||||
}
|
||||
@@ -236,13 +293,15 @@ func (s *SysUserController) Edit(c *gin.Context) {
|
||||
uniquePhone := s.sysUserService.CheckUniquePhone(body.PhoneNumber, body.UserID)
|
||||
if !uniquePhone {
|
||||
// 修改用户【%s】失败,手机号码已存在
|
||||
msg := fmt.Sprintf("Failed to modify user [%s], cell phone number already exists", body.UserName)
|
||||
// msg := fmt.Sprintf("Failed to modify user [%s], cell phone number already exists", body.UserName)
|
||||
msg := i18n.TTemplate(language, "user.errPhoneExists", map[string]any{"name": body.UserName})
|
||||
c.JSON(200, result.ErrMsg(msg))
|
||||
return
|
||||
}
|
||||
} else {
|
||||
// 修改用户【%s】失败,手机号码格式错误
|
||||
msg := fmt.Sprintf("Failed to modify user [%s], wrong format of cell phone number", body.UserName)
|
||||
// msg := fmt.Sprintf("Failed to modify user [%s], wrong format of cell phone number", body.UserName)
|
||||
msg := i18n.TTemplate(language, "user.errPhoneFormat", map[string]any{"name": body.UserName})
|
||||
c.JSON(200, result.ErrMsg(msg))
|
||||
return
|
||||
}
|
||||
@@ -254,13 +313,15 @@ func (s *SysUserController) Edit(c *gin.Context) {
|
||||
uniqueEmail := s.sysUserService.CheckUniqueEmail(body.Email, body.UserID)
|
||||
if !uniqueEmail {
|
||||
// 修改用户【%s】失败,邮箱已存在
|
||||
msg := fmt.Sprintf("Failed to modify user [%s], mailbox already exists", body.UserName)
|
||||
// msg := fmt.Sprintf("Failed to modify user [%s], mailbox already exists", body.UserName)
|
||||
msg := i18n.TTemplate(language, "user.errEmailExists", map[string]any{"name": body.UserName})
|
||||
c.JSON(200, result.ErrMsg(msg))
|
||||
return
|
||||
}
|
||||
} else {
|
||||
// 修改用户【%s】失败,邮箱格式错误
|
||||
msg := fmt.Sprintf("Failed to modify user [%s], mailbox format error", body.UserName)
|
||||
// msg := fmt.Sprintf("Failed to modify user [%s], mailbox format error", body.UserName)
|
||||
msg := i18n.TTemplate(language, "user.errEmailFormat", map[string]any{"name": body.UserName})
|
||||
c.JSON(200, result.ErrMsg(msg))
|
||||
return
|
||||
}
|
||||
@@ -283,9 +344,10 @@ func (s *SysUserController) Edit(c *gin.Context) {
|
||||
//
|
||||
// DELETE /:userIds
|
||||
func (s *SysUserController) Remove(c *gin.Context) {
|
||||
language := ctx.AcceptLanguage(c)
|
||||
userIds := c.Param("userIds")
|
||||
if userIds == "" {
|
||||
c.JSON(400, result.CodeMsg(400, "parameter error"))
|
||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||
return
|
||||
}
|
||||
// 处理字符转id数组后去重
|
||||
@@ -295,13 +357,23 @@ func (s *SysUserController) Remove(c *gin.Context) {
|
||||
c.JSON(200, result.Err(nil))
|
||||
return
|
||||
}
|
||||
|
||||
// 检查是否管理员用户
|
||||
for _, id := range uniqueIDs {
|
||||
if config.IsAdmin(id) {
|
||||
// 不允许操作管理员用户
|
||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errOperateAdmin")))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
rows, err := s.sysUserService.DeleteUserByIds(uniqueIDs)
|
||||
if err != nil {
|
||||
c.JSON(200, result.ErrMsg(err.Error()))
|
||||
return
|
||||
}
|
||||
// 删除成功:%d
|
||||
msg := fmt.Sprintf("Deleted successfully: %d", rows)
|
||||
msg := i18n.TTemplate(language, "app.common.deleteSuccess", map[string]any{"num": rows})
|
||||
c.JSON(200, result.OkMsg(msg))
|
||||
}
|
||||
|
||||
@@ -309,31 +381,32 @@ func (s *SysUserController) Remove(c *gin.Context) {
|
||||
//
|
||||
// PUT /resetPwd
|
||||
func (s *SysUserController) ResetPwd(c *gin.Context) {
|
||||
language := ctx.AcceptLanguage(c)
|
||||
var body struct {
|
||||
UserID string `json:"userId" binding:"required"`
|
||||
Password string `json:"password" binding:"required"`
|
||||
}
|
||||
if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil {
|
||||
c.JSON(400, result.CodeMsg(400, "parameter error"))
|
||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||
return
|
||||
}
|
||||
|
||||
// 检查是否管理员用户
|
||||
if config.IsAdmin(body.UserID) {
|
||||
// 不允许操作管理员用户
|
||||
c.JSON(200, result.ErrMsg("Administrator users are not allowed to operate"))
|
||||
// 不允许操作内置用户
|
||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.errOperateAdmin")))
|
||||
return
|
||||
}
|
||||
|
||||
user := s.sysUserService.SelectUserById(body.UserID)
|
||||
if user.UserID != body.UserID {
|
||||
// 没有可访问用户数据!
|
||||
c.JSON(200, result.ErrMsg("There is no accessible user data!"))
|
||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.noData")))
|
||||
return
|
||||
}
|
||||
if !regular.ValidPassword(body.Password) {
|
||||
// 登录密码至少包含大小写字母、数字、特殊符号,且不少于6位
|
||||
c.JSON(200, result.ErrMsg("Login password contains at least upper and lower case letters, numbers, special symbols, and not less than 6 digits"))
|
||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.errPasswd")))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -355,12 +428,13 @@ func (s *SysUserController) ResetPwd(c *gin.Context) {
|
||||
//
|
||||
// PUT /changeStatus
|
||||
func (s *SysUserController) Status(c *gin.Context) {
|
||||
language := ctx.AcceptLanguage(c)
|
||||
var body struct {
|
||||
UserID string `json:"userId" binding:"required"`
|
||||
Status string `json:"status" binding:"required"`
|
||||
}
|
||||
if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil {
|
||||
c.JSON(400, result.CodeMsg(400, "parameter error"))
|
||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -368,14 +442,14 @@ func (s *SysUserController) Status(c *gin.Context) {
|
||||
user := s.sysUserService.SelectUserById(body.UserID)
|
||||
if user.UserID != body.UserID {
|
||||
// 没有可访问用户数据!
|
||||
c.JSON(200, result.ErrMsg("There is no accessible user data!"))
|
||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.noData")))
|
||||
return
|
||||
}
|
||||
|
||||
// 与旧值相等不变更
|
||||
if user.Status == body.Status {
|
||||
// 变更状态与旧值相等!
|
||||
c.JSON(200, result.ErrMsg("The change status is equal to the old value!"))
|
||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "user.statusEq")))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -397,33 +471,47 @@ func (s *SysUserController) Status(c *gin.Context) {
|
||||
//
|
||||
// POST /export
|
||||
func (s *SysUserController) Export(c *gin.Context) {
|
||||
language := ctx.AcceptLanguage(c)
|
||||
// 查询结果,根据查询条件结果,单页最大值限制
|
||||
querys := ctx.BodyJSONMap(c)
|
||||
dataScopeSQL := ctx.LoginUserToDataScopeSQL(c, "d", "u")
|
||||
data := s.sysUserService.SelectUserPage(querys, dataScopeSQL)
|
||||
if data["total"].(int64) == 0 {
|
||||
// 导出数据记录为空
|
||||
c.JSON(200, result.ErrMsg("Export data record is empty"))
|
||||
c.JSON(200, result.ErrMsg(i18n.TKey(language, "app.common.exportEmpty")))
|
||||
return
|
||||
}
|
||||
rows := data["rows"].([]model.SysUser)
|
||||
|
||||
// 闭包函数处理多语言
|
||||
converI18n := func(language string, arr *[]model.SysUser) {
|
||||
for i := range *arr {
|
||||
(*arr)[i].NickName = i18n.TKey(language, (*arr)[i].NickName)
|
||||
(*arr)[i].Remark = i18n.TKey(language, (*arr)[i].Remark)
|
||||
(*arr)[i].Dept.DeptName = i18n.TKey(language, (*arr)[i].Dept.DeptName)
|
||||
for ri := range (*arr)[i].Roles {
|
||||
(*arr)[i].Roles[ri].RoleName = i18n.TKey(language, (*arr)[i].Roles[ri].RoleName)
|
||||
}
|
||||
}
|
||||
}
|
||||
converI18n(language, &rows)
|
||||
|
||||
// 导出文件名称
|
||||
fileName := fmt.Sprintf("user_export_%d_%d.xlsx", len(rows), time.Now().UnixMilli())
|
||||
// 第一行表头标题
|
||||
headerCells := map[string]string{
|
||||
"A1": "UserID",
|
||||
"B1": "UserName",
|
||||
"C1": "NickName",
|
||||
"D1": "Email",
|
||||
"E1": "PhoneNumber",
|
||||
"F1": "UserSex",
|
||||
"G1": "Status",
|
||||
"H1": "DeptID",
|
||||
"I1": "DeptName",
|
||||
"J1": "DeptLeader",
|
||||
"K1": "LoginIP",
|
||||
"L1": "LoginDate",
|
||||
"A1": i18n.TKey(language, "user.export.id"),
|
||||
"B1": i18n.TKey(language, "user.export.name"),
|
||||
"C1": i18n.TKey(language, "user.export.nick"),
|
||||
"D1": i18n.TKey(language, "user.export.email"),
|
||||
"E1": i18n.TKey(language, "user.export.phone"),
|
||||
"F1": i18n.TKey(language, "user.export.sex"),
|
||||
"G1": i18n.TKey(language, "user.export.status"),
|
||||
"H1": i18n.TKey(language, "user.export.deptID"),
|
||||
"I1": i18n.TKey(language, "user.export.deptName"),
|
||||
"J1": i18n.TKey(language, "user.export.deptLeader"),
|
||||
"K1": i18n.TKey(language, "user.export.loginIP"),
|
||||
"L1": i18n.TKey(language, "user.export.loginDate"),
|
||||
}
|
||||
// 读取用户性别字典数据
|
||||
dictSysUserSex := s.sysDictDataService.SelectDictDataByType("sys_user_sex")
|
||||
@@ -432,17 +520,17 @@ func (s *SysUserController) Export(c *gin.Context) {
|
||||
for i, row := range rows {
|
||||
idx := strconv.Itoa(i + 2)
|
||||
// 用户性别
|
||||
sysUserSex := "unknown"
|
||||
sysUserSex := row.Sex
|
||||
for _, v := range dictSysUserSex {
|
||||
if row.Sex == v.DictValue {
|
||||
sysUserSex = v.DictLabel
|
||||
sysUserSex = i18n.TKey(language, v.DictLabel)
|
||||
break
|
||||
}
|
||||
}
|
||||
// 帐号状态
|
||||
statusValue := "deactivate"
|
||||
statusValue := i18n.TKey(language, "dictData.disable")
|
||||
if row.Status == "1" {
|
||||
statusValue = "normalcy"
|
||||
statusValue = i18n.TKey(language, "dictData.normal")
|
||||
}
|
||||
dataCells = append(dataCells, map[string]any{
|
||||
"A" + idx: row.UserID,
|
||||
@@ -475,11 +563,13 @@ 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())
|
||||
asserPath := "assets/template/excel/user_import_template.xlsx"
|
||||
|
||||
// 多语言处理
|
||||
language := ctx.AcceptLanguage(c)
|
||||
asserPath := fmt.Sprintf("assets/template/excel/user_import_template_%s.xlsx", language)
|
||||
|
||||
// 从 embed.FS 中读取默认配置文件内容
|
||||
assetsDir := config.GetAssetsDirFS()
|
||||
|
||||
// 读取内嵌文件
|
||||
fileData, err := assetsDir.ReadFile(asserPath)
|
||||
if err != nil {
|
||||
@@ -499,12 +589,13 @@ func (s *SysUserController) Template(c *gin.Context) {
|
||||
//
|
||||
// POST /importData
|
||||
func (s *SysUserController) ImportData(c *gin.Context) {
|
||||
language := ctx.AcceptLanguage(c)
|
||||
// 允许进行更新
|
||||
updateSupport := c.PostForm("updateSupport")
|
||||
// 上传的文件
|
||||
formFile, err := c.FormFile("file")
|
||||
if err != nil || updateSupport == "" {
|
||||
c.JSON(400, result.CodeMsg(400, "parameter error"))
|
||||
c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400")))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -525,6 +616,152 @@ func (s *SysUserController) ImportData(c *gin.Context) {
|
||||
// 获取操作人名称
|
||||
operName := ctx.LoginUserToUserName(c)
|
||||
isUpdateSupport := parse.Boolean(updateSupport)
|
||||
message := s.sysUserService.ImportUser(rows, isUpdateSupport, operName)
|
||||
|
||||
// 读取默认初始密码
|
||||
initPassword := s.sysConfigService.SelectConfigValueByKey("sys.user.initPassword")
|
||||
// 读取用户性别字典数据
|
||||
dictSysUserSex := s.sysDictDataService.SelectDictDataByType("sys_user_sex")
|
||||
|
||||
// 导入记录
|
||||
successNum := 0
|
||||
failureNum := 0
|
||||
successMsgArr := []string{}
|
||||
failureMsgArr := []string{}
|
||||
mustItemArr := []string{"B", "C"}
|
||||
for _, row := range rows {
|
||||
// 检查必填列
|
||||
ownItem := true
|
||||
for _, item := range mustItemArr {
|
||||
if v, ok := row[item]; !ok || v == "" {
|
||||
ownItem = false
|
||||
break
|
||||
}
|
||||
}
|
||||
if !ownItem {
|
||||
mustItemArrStr := strings.Join(mustItemArr, "、")
|
||||
failureNum++
|
||||
// 表格中必填列表项,
|
||||
msg := i18n.TTemplate(language, "user.import.mustItem", map[string]any{"text": mustItemArrStr})
|
||||
failureMsgArr = append(failureMsgArr, msg)
|
||||
continue
|
||||
}
|
||||
|
||||
// 用户性别转值
|
||||
sysUserSex := "0"
|
||||
for _, v := range dictSysUserSex {
|
||||
label := i18n.TKey(language, v.DictLabel)
|
||||
if row["F"] == label {
|
||||
sysUserSex = v.DictValue
|
||||
break
|
||||
}
|
||||
}
|
||||
sysUserStatus := common.STATUS_NO
|
||||
if row["G"] == "Normal" {
|
||||
sysUserStatus = common.STATUS_YES
|
||||
}
|
||||
|
||||
// 构建用户实体信息
|
||||
newSysUser := model.SysUser{
|
||||
UserType: "sys",
|
||||
Password: initPassword,
|
||||
DeptID: row["H"],
|
||||
UserName: row["B"],
|
||||
NickName: row["C"],
|
||||
PhoneNumber: row["E"],
|
||||
Email: row["D"],
|
||||
Status: sysUserStatus,
|
||||
Sex: sysUserSex,
|
||||
}
|
||||
|
||||
// 检查手机号码格式并判断是否唯一
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
// 验证是否存在这个用户
|
||||
userInfo := s.sysUserService.SelectUserByUserName(newSysUser.UserName)
|
||||
if userInfo.UserName != newSysUser.UserName {
|
||||
newSysUser.CreateBy = operName
|
||||
insertId := s.sysUserService.InsertUser(newSysUser)
|
||||
if insertId != "" {
|
||||
// 用户编号:%s 登录名称 %s 导入成功
|
||||
msg := i18n.TTemplate(language, "user.import.success", map[string]any{"id": row["A"], "name": newSysUser.UserName})
|
||||
successNum++
|
||||
successMsgArr = append(successMsgArr, msg)
|
||||
} else {
|
||||
// 用户编号:%s 登录名称 %s 导入失败
|
||||
msg := i18n.TTemplate(language, "user.import.fail", map[string]any{"id": row["A"], "email": newSysUser.UserName})
|
||||
failureNum++
|
||||
failureMsgArr = append(failureMsgArr, msg)
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// 如果用户已存在 同时 是否更新支持
|
||||
if userInfo.UserName == newSysUser.UserName && isUpdateSupport {
|
||||
newSysUser.UserID = userInfo.UserID
|
||||
newSysUser.UpdateBy = operName
|
||||
rows := s.sysUserService.UpdateUser(newSysUser)
|
||||
if rows > 0 {
|
||||
// 用户编号:%s 登录名称 %s 更新成功
|
||||
msg := i18n.TTemplate(language, "user.import.successUpdate", map[string]any{"id": row["A"], "email": newSysUser.UserName})
|
||||
successNum++
|
||||
successMsgArr = append(successMsgArr, msg)
|
||||
} else {
|
||||
// 用户编号:%s 登录名称 %s 更新失败
|
||||
msg := i18n.TTemplate(language, "user.import.failUpdate", map[string]any{"id": row["A"], "email": newSysUser.UserName})
|
||||
failureNum++
|
||||
failureMsgArr = append(failureMsgArr, msg)
|
||||
}
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
message := ""
|
||||
if failureNum > 0 {
|
||||
// 很抱歉,导入失败!共 %d 条数据格式不正确,错误如下:
|
||||
msg := i18n.TTemplate(language, "user.import.failTip", map[string]any{"num": failureNum})
|
||||
message = strings.Join(append([]string{msg}, failureMsgArr...), "<br/>")
|
||||
} else {
|
||||
// 恭喜您,数据已全部导入成功!共 %d 条,数据如下:
|
||||
msg := i18n.TTemplate(language, "user.import.successTip", map[string]any{"num": failureNum})
|
||||
message = strings.Join(append([]string{msg}, successMsgArr...), "<br/>")
|
||||
}
|
||||
|
||||
c.JSON(200, result.OkMsg(message))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user