diff --git a/api/v1/system/personal.go b/api/v1/system/personal.go index c4ce9f9..6b70c0f 100644 --- a/api/v1/system/personal.go +++ b/api/v1/system/personal.go @@ -59,3 +59,14 @@ type PersonalResetPwdReq struct { type PersonalResetPwdRes struct { } + +type RefreshTokenReq struct { + g.Meta `path:"/personal/refreshToken" tags:"系统后台/用户管理" method:"get" summary:"刷新token"` + commonApi.Author +} + +type RefreshTokenRes struct { + commonApi.EmptyRes + Token string `json:"token"` + UserInfo *model.LoginUserRes `json:"userInfo"` +} diff --git a/internal/app/system/consts/consts.go b/internal/app/system/consts/consts.go index 5193e79..30c142f 100644 --- a/internal/app/system/consts/consts.go +++ b/internal/app/system/consts/consts.go @@ -12,4 +12,9 @@ const ( EffectiveTypeStartEnd = 1 // EffectiveTypeDate 按时间段 EffectiveTypeDate = 2 + + // WebsocketTypeTokenUpdated websocket通知类型-更新token + WebsocketTypeTokenUpdated = "tokenUpdated" + // WebsocketTypeNotice websocket通知类型-系统通知 + WebsocketTypeNotice = "notice" ) diff --git a/internal/app/system/controller/personal.go b/internal/app/system/controller/personal.go index 5538315..eb9df3e 100644 --- a/internal/app/system/controller/personal.go +++ b/internal/app/system/controller/personal.go @@ -9,11 +9,13 @@ package controller import ( "context" + "errors" "github.com/gogf/gf/v2/crypto/gmd5" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/util/gconv" "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" "github.com/tiger1103/gfast/v3/internal/app/system/service" "github.com/tiger1103/gfast/v3/library/libUtils" ) @@ -36,12 +38,7 @@ func (c *personalController) EditPersonal(ctx context.Context, req *system.Perso if err != nil { return } - key := gconv.String(res.UserInfo.Id) + "-" + gmd5.MustEncryptString(res.UserInfo.UserName) + gmd5.MustEncryptString(res.UserInfo.UserPassword) - if g.Cfg().MustGet(ctx, "gfToken.multiLogin").Bool() { - key = gconv.String(res.UserInfo.Id) + "-" + gmd5.MustEncryptString(res.UserInfo.UserName) + gmd5.MustEncryptString(res.UserInfo.UserPassword+ip+userAgent+gtime.Now().String()) - } - res.UserInfo.UserPassword = "" - res.Token, err = service.GfToken().GenerateToken(ctx, key, res.UserInfo) + res.Token, err = c.genToken(ctx, res.UserInfo, ip, userAgent) return } @@ -49,3 +46,31 @@ func (c *personalController) ResetPwdPersonal(ctx context.Context, req *system.P res, err = service.Personal().ResetPwdPersonal(ctx, req) return } + +func (c *personalController) RefreshToken(ctx context.Context, req *system.RefreshTokenReq) (res *system.RefreshTokenRes, err error) { + var ( + ip = libUtils.GetClientIp(ctx) + userAgent = libUtils.GetUserAgent(ctx) + ) + res = new(system.RefreshTokenRes) + res.UserInfo, err = service.SysUser().GetUserById(ctx, service.Context().GetUserId(ctx)) + if err != nil { + return + } + if res.UserInfo == nil { + err = errors.New("用户信息不存在") + return + } + res.Token, err = c.genToken(ctx, res.UserInfo, ip, userAgent) + return +} + +func (c *personalController) genToken(ctx context.Context, userInfo *model.LoginUserRes, ip, userAgent string) (token string, err error) { + key := gconv.String(userInfo.Id) + "-" + gmd5.MustEncryptString(userInfo.UserName) + gmd5.MustEncryptString(userInfo.UserPassword) + if g.Cfg().MustGet(ctx, "gfToken.multiLogin").Bool() { + key = gconv.String(userInfo.Id) + "-" + gmd5.MustEncryptString(userInfo.UserName) + gmd5.MustEncryptString(userInfo.UserPassword+ip+userAgent+gtime.Now().String()) + } + + token, err = service.GfToken().GenerateToken(ctx, key, userInfo) + return +} diff --git a/internal/app/system/logic/context/context.go b/internal/app/system/logic/context/context.go index 5640ef2..d203f5b 100644 --- a/internal/app/system/logic/context/context.go +++ b/internal/app/system/logic/context/context.go @@ -64,3 +64,12 @@ func (s *sContext) GetUserId(ctx context.Context) uint64 { } return 0 } + +// GetDeptId 获取当前登录用户部门id +func (s *sContext) GetDeptId(ctx context.Context) uint64 { + user := s.GetLoginUser(ctx) + if user != nil { + return user.DeptId + } + return 0 +} diff --git a/internal/app/system/logic/sysDept/sys_dept.go b/internal/app/system/logic/sysDept/sys_dept.go index f451916..6eab56b 100644 --- a/internal/app/system/logic/sysDept/sys_dept.go +++ b/internal/app/system/logic/sysDept/sys_dept.go @@ -9,6 +9,7 @@ package sysDept import ( "context" + "errors" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/text/gstr" "github.com/gogf/gf/v2/util/gconv" @@ -96,6 +97,9 @@ func (s *sSysDept) Add(ctx context.Context, req *system.DeptAddReq) (err error) // Edit 部门修改 func (s *sSysDept) Edit(ctx context.Context, req *system.DeptEditReq) (err error) { err = g.Try(ctx, func(ctx context.Context) { + if req.DeptId == req.ParentID { + liberr.ErrIsNil(ctx, errors.New("上级部门不能是自己")) + } _, err = dao.SysDept.Ctx(ctx).WherePri(req.DeptId).Update(do.SysDept{ ParentId: req.ParentID, DeptName: req.DeptName, @@ -177,3 +181,15 @@ func (s *sSysDept) GetByDeptId(ctx context.Context, deptId uint64) (dept *entity } return } + +// GetByDept 获取部门信息 +func (s *sSysDept) GetByDept(ctx context.Context, deptId interface{}) (dept *model.LinkDeptRes) { + deptEnt, _ := s.GetByDeptId(ctx, gconv.Uint64(deptId)) + if deptEnt != nil { + dept = &model.LinkDeptRes{ + DeptId: deptEnt.DeptId, + DeptName: deptEnt.DeptName, + } + } + return +} diff --git a/internal/app/system/logic/sysNotice/sys_notice.go b/internal/app/system/logic/sysNotice/sys_notice.go index 979308d..e6df3d2 100644 --- a/internal/app/system/logic/sysNotice/sys_notice.go +++ b/internal/app/system/logic/sysNotice/sys_notice.go @@ -175,7 +175,7 @@ func (s *sSysNotice) Add(ctx context.Context, req *model.SysNoticeAddReq) (err e data.Id, err = rows.LastInsertId() liberr.ErrIsNil(ctx, err, "获取ID失败") response := &libWebsocket.WResponse{ - Event: "notice", + Event: consts.WebsocketTypeNotice, Data: data, } if req.Type == consts.SysLetterType { @@ -210,7 +210,7 @@ func (s *sSysNotice) Edit(ctx context.Context, req *model.SysNoticeEditReq) (err data.Id = req.Id data.Type = req.Type response := &libWebsocket.WResponse{ - Event: "notice", + Event: consts.WebsocketTypeNotice, Data: data, } if req.Type == consts.SysLetterType { diff --git a/internal/app/system/logic/sysRole/sys_role.go b/internal/app/system/logic/sysRole/sys_role.go index 8ce4dbf..9bf1ab9 100644 --- a/internal/app/system/logic/sysRole/sys_role.go +++ b/internal/app/system/logic/sysRole/sys_role.go @@ -13,6 +13,7 @@ import ( "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/text/gstr" "github.com/gogf/gf/v2/util/gconv" "github.com/tiger1103/gfast/v3/api/v1/system" commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" @@ -22,6 +23,7 @@ import ( "github.com/tiger1103/gfast/v3/internal/app/system/model/do" "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/libWebsocket" "github.com/tiger1103/gfast/v3/library/liberr" ) @@ -251,6 +253,8 @@ func (s *sSysRole) EditRole(ctx context.Context, req *system.RoleEditReq) (err e liberr.ErrIsNil(ctx, e) //清除缓存 commonService.Cache().Remove(ctx, consts.CacheSysRole) + //通知刷新token + s.refreshToken(ctx, req.Id) }) return err }) @@ -360,6 +364,8 @@ func (s *sSysRole) RoleDataScope(ctx context.Context, req *system.DataScopeReq) _, err = dao.SysRoleScope.Ctx(ctx).Data(data).Insert() liberr.ErrIsNil(ctx, err, "设置权限信息失败") } + //通知刷新token + s.refreshToken(ctx, gconv.Int64(req.RoleId)) }) return err }) @@ -389,3 +395,20 @@ func (s *sSysRole) FindSonIdsByParentId(roleList []*entity.SysRole, id uint) []u } return children } + +// 刷新角色下用户token +func (s *sSysRole) refreshToken(ctx context.Context, roleId int64) { + _ = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + userRoleIds := enforcer.GetFilteredGroupingPolicy(1, gconv.String(roleId)) + for _, v := range userRoleIds { + userId := gstr.Split(v[0], "_")[1] + //通知用户更新token + libWebsocket.SendToUser(gconv.Uint64(userId), &libWebsocket.WResponse{ + Event: consts.WebsocketTypeTokenUpdated, + Data: nil, + }) + } + }) +} diff --git a/internal/app/system/logic/sysUser/sys_user.go b/internal/app/system/logic/sysUser/sys_user.go index a238253..d9a58ee 100644 --- a/internal/app/system/logic/sysUser/sys_user.go +++ b/internal/app/system/logic/sysUser/sys_user.go @@ -13,6 +13,7 @@ import ( "github.com/gogf/gf/v2/container/garray" "github.com/gogf/gf/v2/encoding/gurl" "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/library/libWebsocket" "reflect" "github.com/gogf/gf/v2/container/gset" @@ -687,6 +688,11 @@ func (s *sSysUser) Edit(ctx context.Context, req *system.UserEditReq) (err error liberr.ErrIsNil(ctx, err, "设置用户权限失败") err = s.AddUserPost(ctx, tx, req.PostIds, req.UserId) liberr.ErrIsNil(ctx, err) + //通知用户更新token + libWebsocket.SendToUser(gconv.Uint64(req.UserId), &libWebsocket.WResponse{ + Event: consts.WebsocketTypeTokenUpdated, + Data: nil, + }) }) return err }) @@ -758,6 +764,11 @@ func (s *sSysUser) SetUserRole(ctx context.Context, roleId uint, userIds []uint6 for _, v := range userIds { _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("%s%d", s.casBinUserPrefix, v), gconv.String(roleId)) liberr.ErrIsNil(ctx, err) + //通知用户更新token + libWebsocket.SendToUser(v, &libWebsocket.WResponse{ + Event: consts.WebsocketTypeTokenUpdated, + Data: nil, + }) } }) return @@ -893,7 +904,7 @@ func (s *sSysUser) GetUsers(ctx context.Context, ids []int) (users []*model.SysU } // GetDataWhere 获取数据权限判断条件 -// Deprecated : 此方法已废弃,请使用更简单的GetAuthWhere方法 +// Deprecated : 此方法已废弃,请使用更简单的GetAuthWhere方法或GetAuthDeptWhere方法 func (s *sSysUser) GetDataWhere(ctx context.Context, userInfo *model.ContextUser, entityData interface{}, menuId uint) (where g.Map, err error) { whereJustMe := g.Map{} //本人数据权限 t := reflect.TypeOf(entityData) @@ -963,6 +974,7 @@ func (s *sSysUser) GetDataWhere(ctx context.Context, userInfo *model.ContextUser return } +// GetAuthWhere 获取数据权限判断条件-按创建人id获取(created_by),数据权限会跟随创建人转移 func (s *sSysUser) GetAuthWhere(ctx context.Context, m *gdb.Model, userInfo *model.ContextUser, field ...string) *gdb.Model { var ( //当前请求api接口对应的菜单 @@ -985,7 +997,7 @@ func (s *sSysUser) GetAuthWhere(ctx context.Context, m *gdb.Model, userInfo *mod return nm } -// GetAuthDataWhere 获取数据权限判断条件 +// GetAuthDataWhere 获取数据权限判断条件-按创建用户 func (s *sSysUser) GetAuthDataWhere(ctx context.Context, m *gdb.Model, userInfo *model.ContextUser, menuId uint, field ...string) (nm *gdb.Model, err error) { whereJustMe := g.Map{} //本人数据权限 createdUserField := "created_by" @@ -1008,7 +1020,6 @@ func (s *sSysUser) GetAuthDataWhere(ctx context.Context, m *gdb.Model, userInfo roleIds []uint scope []*model.ScopeAuthData deptIdArr = gset.New() - allScope = false ) roleIds, err = s.GetAdminRoleIds(ctx, userInfo.Id) liberr.ErrIsNil(ctx, err) @@ -1022,7 +1033,6 @@ func (s *sSysUser) GetAuthDataWhere(ctx context.Context, m *gdb.Model, userInfo for _, sv := range scope { switch sv.DataScope { case 1: //全部数据权限 - allScope = true goto endLoop case 2: //自定数据权限 deptIdArr.Add(gconv.Interfaces(sv.DeptIds)...) @@ -1053,13 +1063,119 @@ func (s *sSysUser) GetAuthDataWhere(ctx context.Context, m *gdb.Model, userInfo } } endLoop: - if allScope { - nm = m - } else if !allScope && deptIdArr.Size() > 0 { + if deptIdArr.Size() > 0 { nm = m.WhereIn(createdUserField, dao.SysUser.Ctx(ctx).Fields(dao.SysUser.Columns().Id). WhereIn(dao.SysUser.Columns().DeptId, deptIdArr.Slice())) - } else if !allScope && len(whereJustMe) > 0 { + } else if len(whereJustMe) > 0 { nm = m.Where(whereJustMe) + } else { + nm = m + } + }) + return +} + +// GetAuthDeptWhere 获取部门数据权限判断条件-按部门id获取(dept_id),数据权限依赖部门,不会随创建人转移 +func (s *sSysUser) GetAuthDeptWhere(ctx context.Context, m *gdb.Model, userInfo *model.ContextUser, field ...string) *gdb.Model { + var ( + //当前请求api接口对应的菜单 + url = gstr.TrimLeft(ghttp.RequestFromCtx(ctx).Request.URL.Path, "/") + menuId uint + err error + nm *gdb.Model + ) + //获取菜单ID + menuId, err = service.SysAuthRule().GetIdByName(ctx, url) + if err != nil { + g.Log().Error(ctx, err) + return m + } + nm, err = s.GetAuthDeptDataWhere(ctx, m, userInfo, menuId, field...) + if err != nil { + g.Log().Error(ctx, err) + return m + } + return nm +} + +// GetAuthDeptDataWhere 获取数据权限判断条件-按部门 +func (s *sSysUser) GetAuthDeptDataWhere(ctx context.Context, m *gdb.Model, userInfo *model.ContextUser, menuId uint, field ...string) (nm *gdb.Model, err error) { + whereJustMe := g.Map{} //本人数据权限 + deptField := "dept_id" + createdUserField := "created_by" + //表别名 + tableAlias := "" + if len(field) > 0 && field[0] != "" { + tableAlias = field[0] + } + if len(field) > 1 && field[1] != "" { + deptField = field[1] + } + + if len(field) > 2 && field[2] != "" { + createdUserField = field[2] + } + + if tableAlias != "" { + deptField = tableAlias + "." + deptField + createdUserField = tableAlias + "." + createdUserField + } + err = g.Try(ctx, func(ctx context.Context) { + //若存在用户id的字段,则生成判断数据权限的条件 + //1、获取当前用户所属角色Ids + var ( + roleIds []uint + scope []*model.ScopeAuthData + deptIdArr = gset.New() + ) + roleIds, err = s.GetAdminRoleIds(ctx, userInfo.Id) + liberr.ErrIsNil(ctx, err) + scope, err = service.SysRole().GetRoleMenuScope(ctx, roleIds, menuId) + liberr.ErrIsNil(ctx, err) + if scope == nil { + //角色未设置数据权限,默认仅本人数据权限 + whereJustMe = g.Map{deptField: userInfo.DeptId, createdUserField: userInfo.Id} + } else { + //2获取角色对应数据权限 + for _, sv := range scope { + switch sv.DataScope { + case 1: //全部数据权限 + goto endLoop + case 2: //自定数据权限 + deptIdArr.Add(gconv.Interfaces(sv.DeptIds)...) + case 3: //本部门数据权限 + deptIdArr.Add(gconv.Int64(userInfo.DeptId)) + case 4: //本部门及以下数据权限 + deptIdArr.Add(gconv.Int64(userInfo.DeptId)) + //获取正常状态部门数据 + deptList := ([]*entity.SysDept)(nil) + deptList, err = service.SysDept().GetList(ctx, &system.DeptSearchReq{Status: "1"}) + liberr.ErrIsNil(ctx, err) + var dList g.List + for _, d := range deptList { + m := g.Map{ + "id": d.DeptId, + "pid": d.ParentId, + "label": d.DeptName, + } + dList = append(dList, m) + } + l := libUtils.FindSonByParentId(dList, userInfo.DeptId, "pid", "id") + for _, li := range l { + deptIdArr.Add(gconv.Int64(li["id"])) + } + case 5: //仅本人数据权限 + whereJustMe = g.Map{deptField: userInfo.Id, createdUserField: userInfo.Id} + } + } + } + endLoop: + if deptIdArr.Size() > 0 { + nm = m.WhereIn(deptField, deptIdArr.Slice()) + } else if len(whereJustMe) > 0 { + nm = m.Where(whereJustMe) + } else { + nm = m } }) return diff --git a/internal/app/system/logic/toolsGenTable/tools_gen_table.go b/internal/app/system/logic/toolsGenTable/tools_gen_table.go index a69f6e4..81bafc2 100644 --- a/internal/app/system/logic/toolsGenTable/tools_gen_table.go +++ b/internal/app/system/logic/toolsGenTable/tools_gen_table.go @@ -987,6 +987,8 @@ func (s *sToolsGenTable) SelectRecordById(ctx context.Context, tableId int64) (t _, hasCreatedBy := columnMap["created_by"] tableEx.HasCreatedBy = hasCreatedBy + _, hasDeptId := columnMap["dept_id"] + tableEx.HasDeptId = hasDeptId _, hasUpdateBy := columnMap["updated_by"] tableEx.HasUpdatedBy = hasUpdateBy diff --git a/internal/app/system/logic/toolsGenTableColumn/tools_gen_table_column.go b/internal/app/system/logic/toolsGenTableColumn/tools_gen_table_column.go index 89d0658..eec1068 100644 --- a/internal/app/system/logic/toolsGenTableColumn/tools_gen_table_column.go +++ b/internal/app/system/logic/toolsGenTableColumn/tools_gen_table_column.go @@ -32,7 +32,7 @@ func New() service.IToolsGenTableColumn { ColumnTypeStr: []string{"char", "varchar", "narchar", "varchar2", "tinytext", "text", "mediumtext", "longtext"}, ColumnTypeTime: []string{"datetime", "time", "date", "timestamp"}, ColumnTypeNumber: []string{"tinyint", "smallint", "mediumint", "int", "number", "integer", "bigint", "float", "float", "double", "decimal"}, - ColumnNameNotEdit: []string{"created_by", "created_at", "updated_by", "updated_at", "deleted_at"}, + ColumnNameNotEdit: []string{"created_by", "created_at", "updated_by", "updated_at", "deleted_at", "dept_id"}, ColumnNameNotList: []string{"updated_by", "updated_at", "deleted_at"}, ColumnNameNotDetail: []string{"updated_at", "deleted_at"}, ColumnNameNotQuery: []string{"updated_by", "updated_at", "deleted_at", "remark"}, @@ -76,10 +76,10 @@ func (s *sToolsGenTableColumn) SelectDbTableColumnsByName(ctx context.Context, t sql += "where " + gdb.FormatSqlWithArgs(" c.table_name=? ", []interface{}{tableName}) + " order by c.ordinal_position" } else { sql = " select column_name, (case when (is_nullable = 'YES' || is_nullable = 'NO' && column_default is not null) then '0' else '1' end) as is_required, " + - "(case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort_order_edit, column_comment," + - " (case when extra = 'auto_increment' then '1' else '0' end) as is_increment, column_type from information_schema.columns" + - " where table_schema = (select database()) " - sql += " and " + gdb.FormatSqlWithArgs(" table_name=? ", []interface{}{tableName}) + " order by ordinal_position ASC " + "(case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort_order_edit, column_comment," + + " (case when extra = 'auto_increment' then '1' else '0' end) as is_increment, column_type from information_schema.columns" + + " where table_schema = (select database()) " + sql += " and " + gdb.FormatSqlWithArgs(" table_name=? ", []interface{}{tableName}) + " order by ordinal_position ASC " } diff --git a/internal/app/system/model/sys_dept.go b/internal/app/system/model/sys_dept.go index d7f5226..141e401 100644 --- a/internal/app/system/model/sys_dept.go +++ b/internal/app/system/model/sys_dept.go @@ -7,9 +7,16 @@ package model -import "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) type SysDeptTreeRes struct { *entity.SysDept Children []*SysDeptTreeRes `json:"children"` } + +type LinkDeptRes struct { + DeptId uint64 `json:"deptId"` + DeptName string `json:"deptName"` +} diff --git a/internal/app/system/model/tools_gen_table.go b/internal/app/system/model/tools_gen_table.go index 87a0fc7..bd864fc 100644 --- a/internal/app/system/model/tools_gen_table.go +++ b/internal/app/system/model/tools_gen_table.go @@ -47,6 +47,7 @@ type ToolsGenTableEx struct { IsPkListable bool // 主键是否出现在列表中 HasTimeColumn bool // 是否有时间类型 HasCreatedBy bool // 是否有created_by字段 + HasDeptId bool // 是否右dept_id字段 HasUpdatedBy bool // 是否有updated_by字段 HasConversion bool // service中是否有转换函数 Columns []*ToolsGenTableColumnEx // 表列信息 diff --git a/internal/app/system/service/context.go b/internal/app/system/service/context.go index 7476bb9..0feedbc 100644 --- a/internal/app/system/service/context.go +++ b/internal/app/system/service/context.go @@ -18,6 +18,7 @@ type IContext interface { SetUser(ctx context.Context, ctxUser *model.ContextUser) GetLoginUser(ctx context.Context) *model.ContextUser GetUserId(ctx context.Context) uint64 + GetDeptId(ctx context.Context) uint64 } var localContext IContext diff --git a/internal/app/system/service/sys_dept.go b/internal/app/system/service/sys_dept.go index 83157aa..3e5038f 100644 --- a/internal/app/system/service/sys_dept.go +++ b/internal/app/system/service/sys_dept.go @@ -22,6 +22,7 @@ type ISysDept interface { FindSonByParentId(deptList []*entity.SysDept, deptId uint64) []*entity.SysDept GetListTree(pid uint64, list []*entity.SysDept) (deptTree []*model.SysDeptTreeRes) GetByDeptId(ctx context.Context, deptId uint64) (dept *entity.SysDept, err error) + GetByDept(ctx context.Context, deptId interface{}) (dept *model.LinkDeptRes) } var localSysDept ISysDept diff --git a/internal/app/system/service/sys_user.go b/internal/app/system/service/sys_user.go index 8b8dc72..c743e3c 100644 --- a/internal/app/system/service/sys_user.go +++ b/internal/app/system/service/sys_user.go @@ -52,14 +52,14 @@ type ( ChangeUserStatus(ctx context.Context, req *system.UserStatusReq) (err error) Delete(ctx context.Context, ids []int) (err error) GetUsers(ctx context.Context, ids []int) (users []*model.SysUserSimpleRes, err error) - // Deprecated : 此方法已废弃,请使用更简单的GetAuthWhere方法 + // Deprecated : 此方法已废弃,请使用更简单的GetAuthWhere方法或GetAuthDeptWhere方法 GetDataWhere(ctx context.Context, userInfo *model.ContextUser, entityData interface{}, menuId uint) (where g.Map, err error) HasAccessByDataWhere(ctx context.Context, where g.Map, uid interface{}) bool AccessRule(ctx context.Context, userId uint64, rule string) bool GetUserSelector(ctx context.Context, req *system.UserSelectorReq) (total interface{}, userList []*model.SysUserSimpleRes, err error) GetUsersByRoleId(ctx context.Context, roleId uint) (users []*model.SysUserRoleDeptRes, err error) GetAuthWhere(ctx context.Context, m *gdb.Model, userInfo *model.ContextUser, field ...string) *gdb.Model - GetAuthDataWhere(ctx context.Context, m *gdb.Model, userInfo *model.ContextUser, menuId uint, field ...string) (nm *gdb.Model, err error) + GetAuthDeptWhere(ctx context.Context, m *gdb.Model, userInfo *model.ContextUser, field ...string) *gdb.Model } ) diff --git a/internal/consts/version.go b/internal/consts/version.go index 84e39e8..b25afce 100644 --- a/internal/consts/version.go +++ b/internal/consts/version.go @@ -9,5 +9,5 @@ package consts const ( Logo = `CiAgIF9fX19fX19fX19fXyAgICAgICAgICAgX18gCiAgLyBfX19fLyBfX19fL19fXyBfX19fX18vIC9fCiAvIC8gX18vIC9fICAvIF9fIGAvIF9fXy8gX18vCi8gL18vIC8gX18vIC8gL18vIChfXyAgKSAvXyAgClxfX19fL18vICAgIFxfXyxfL19fX18vXF9fLyAg` - Version = "3.2.25" + Version = "3.2.26" ) diff --git a/library/libUtils/utils.go b/library/libUtils/utils.go index f6f3c96..d922d3a 100644 --- a/library/libUtils/utils.go +++ b/library/libUtils/utils.go @@ -163,6 +163,7 @@ func GetType(p string) (result string, err error) { g.Log().Error(context.TODO(), err) return } + defer file.Close() buff := make([]byte, 512) _, err = file.Read(buff) diff --git a/resource/template/vm/go/controller.template b/resource/template/vm/go/controller.template index 2b8fa0c..d6fae02 100644 --- a/resource/template/vm/go/controller.template +++ b/resource/template/vm/go/controller.template @@ -256,6 +256,7 @@ func (c *{{$structName}}Controller) Export(ctx context.Context, req *{{.table.Mo } //创建excel处理对象 excel := new(libUtils.ExcelHelper).CreateFile() + defer excel.Close() excel.ArrToExcel("Sheet1", "A1", excelData) col, _ := excelize.ColumnNumberToName(len(tableHead)) row := len(excelData) @@ -291,6 +292,7 @@ func (c *{{$structName}}Controller) ExcelTemplate(ctx context.Context,req *{{.ta ) //创建excel处理对象 excel := new(libUtils.ExcelHelper).CreateFile() + defer excel.Close() excel.ArrToExcel("Sheet1", "A1", excelData) col, _ := excelize.ColumnNumberToName(len(tableHead)) row := len(excelData) diff --git a/resource/template/vm/go/logic.template b/resource/template/vm/go/logic.template index 9e6d5d5..65e68ab 100644 --- a/resource/template/vm/go/logic.template +++ b/resource/template/vm/go/logic.template @@ -22,7 +22,7 @@ package {{$structName}} {{if eq $column.HtmlType "images" "file" "files"}} {{$libUtils = true}} {{end}} -{{if and (eq $column.HtmlField "createdBy" "updatedBy" "deletedBy") (ne $.table.ModuleName "system")}} +{{if and (eq $column.HtmlField "createdBy" "updatedBy" "deletedBy" "deptId") (ne $.table.ModuleName "system")}} {{$usedSystemModule = true}} {{end}} {{if eq $column.HtmlType "selects" "checkbox"}} @@ -203,6 +203,13 @@ func (s *s{{.table.ClassName}})List(ctx context.Context, req *model.{{.table.Cla {{end}} {{if eq $column.HtmlField "createdBy"}} CreatedUser:v.CreatedUser, + {{end}} + {{if eq $column.HtmlField "deptId"}} + {{if $usedSystemModule}} + DeptInfo:systemService.SysDept().GetByDept(ctx, v.DeptId), + {{else}} + DeptInfo:service.SysDept().GetByDept(ctx, v.DeptId), + {{end}} {{end}} {{if eq $column.HtmlField "UpdatedBy"}} UpdatedUser:v.UpdatedUser, @@ -230,6 +237,13 @@ func (s *s{{.table.ClassName}})List(ctx context.Context, req *model.{{.table.Cla {{if eq $column.HtmlField "createdBy"}} CreatedUser:v.CreatedUser, {{end}} + {{if eq $column.HtmlField "deptId"}} + {{if $usedSystemModule}} + DeptInfo:systemService.SysDept().GetByDept(ctx, v.DeptId), + {{else}} + DeptInfo:service.SysDept().GetByDept(ctx, v.DeptId), + {{end}} + {{end}} {{if eq $column.HtmlField "UpdatedBy"}} UpdatedUser:v.UpdatedUser, {{end}} @@ -426,6 +440,15 @@ func (s *s{{.table.ClassName}})GetBy{{$pkGoField}}(ctx context.Context, {{$.tabl err =g.Try(ctx, func(ctx context.Context){ err = dao.{{.table.ClassName}}.Ctx(ctx).WithAll().Where(dao.{{.table.ClassName}}.Columns().{{$pkGoField}}, {{$.table.PkColumn.HtmlField}}).Scan(&res) liberr.ErrIsNil(ctx,err,"获取信息失败") + if res!=nil{ + {{if $.table.HasDeptId}} + {{if $usedSystemModule}} + res.DeptInfo = systemService.SysDept().GetByDept(ctx, res.DeptId) + {{else}} + res.DeptInfo = service.SysDept().GetByDept(ctx, res.DeptId) + {{end}} + {{end}} + } {{range $index, $column := .table.Columns}} {{if eq $column.HtmlType "selects" "checkbox" "treeSelects"}} {{range $ti, $linkedTable := $.table.LinkedTables}} @@ -484,6 +507,13 @@ func (s *s{{.table.ClassName}})Add(ctx context.Context, req *model.{{.table.Clas CreatedBy:service.Context().GetUserId(ctx), {{end}} {{end}} + {{if .table.HasDeptId}} + {{if $usedSystemModule}} + DeptId:systemService.Context().GetDeptId(ctx), + {{else}} + DeptId:service.Context().GetDeptId(ctx), + {{end}} + {{end}} }) liberr.ErrIsNil(ctx, err, "添加失败") }) diff --git a/resource/template/vm/go/model.template b/resource/template/vm/go/model.template index e11c30c..9583d54 100644 --- a/resource/template/vm/go/model.template +++ b/resource/template/vm/go/model.template @@ -17,7 +17,7 @@ package model {{range $index,$column :=.table.Columns}} - {{if and (eq $column.HtmlField "createdBy" "updatedBy") (ne $.table.ModuleName "system")}} + {{if and (eq $column.HtmlField "createdBy" "updatedBy" "deptId") (ne $.table.ModuleName "system")}} {{$hasUser = true}} {{end}} {{if eq $column.HtmlType "imagefile" "images" "file" "files" }} @@ -28,7 +28,7 @@ package model {{end}} {{end}} {{range $index,$column :=.table.EditColumns}} - {{if and (eq $column.HtmlField "createdBy" "updatedBy") (ne $.table.ModuleName "system")}} + {{if and (eq $column.HtmlField "createdBy" "updatedBy" "deptId") (ne $.table.ModuleName "system")}} {{$hasUser = true}} {{end}} {{if eq $column.GoType "Time"}} @@ -63,6 +63,9 @@ type {{.table.ClassName}}InfoRes struct { {{if eq $column.HtmlField "createdBy"}} CreatedUser *{{if $hasUser}}systemModel.{{end}}LinkUserRes `orm:"with:id=created_by" json:"createdUser"` {{end}} + {{if eq $column.HtmlField "deptId"}} + DeptInfo *{{if $hasUser}}systemModel.{{end}}LinkDeptRes `json:"deptInfo"` + {{end}} {{if eq $column.HtmlField "updatedBy"}} UpdatedUser *{{if $hasUser}}systemModel.{{end}}LinkUserRes `orm:"with:id=updated_by" json:"updatedUser"` {{end}} @@ -101,6 +104,9 @@ type {{.table.ClassName}}ListRes struct{ {{if eq $column.HtmlField "createdBy"}} CreatedUser *{{if $hasUser}}systemModel.{{end}}LinkUserRes `orm:"with:id=created_by" json:"createdUser"` {{end}} + {{if eq $column.HtmlField "deptId"}} + DeptInfo *{{if $hasUser}}systemModel.{{end}}LinkDeptRes `json:"deptInfo"` + {{end}} {{if eq $column.HtmlField "updatedBy"}} UpdatedUser *{{if $hasUser}}systemModel.{{end}}LinkUserRes `orm:"with:id=updated_by" json:"updatedUser"` {{end}} @@ -114,6 +120,9 @@ type {{.table.ClassName}}ListRes struct{ {{if eq $column.HtmlField "createdBy"}} CreatedUser *{{if $hasUser}}systemModel.{{end}}LinkUserRes `orm:"with:id=created_by" json:"createdUser"` {{end}} + {{if eq $column.HtmlField "deptId"}} + DeptInfo *{{if $hasUser}}systemModel.{{end}}LinkDeptRes `json:"deptInfo"` + {{end}} {{if eq $column.HtmlField "updatedBy"}} UpdatedUser *{{if $hasUser}}systemModel.{{end}}LinkUserRes `orm:"with:id=updated_by" json:"updatedBy"` {{end}} @@ -168,6 +177,9 @@ type {{.table.ClassName}}AddReq struct { {{if .table.HasCreatedBy}} CreatedBy uint64 {{end}} + {{if .table.HasDeptId}} + DeptId uint64 + {{end}} } //// diff --git a/resource/template/vm/vue/detail-vue.template b/resource/template/vm/vue/detail-vue.template index 0b33bcb..75a6b71 100644 --- a/resource/template/vm/vue/detail-vue.template +++ b/resource/template/vm/vue/detail-vue.template @@ -309,6 +309,9 @@ {{if eq $column.HtmlField "createdBy"}} data.createdBy = data.createdUser?.userNickname {{end}} + {{if eq $column.HtmlField "deptId"}} + data.deptId = data.deptInfo?.deptName + {{end}} {{if eq $column.HtmlField "updatedBy"}} data.updatedBy = data.updatedUser?.userNickname {{end}} diff --git a/resource/template/vm/vue/list-vue.template b/resource/template/vm/vue/list-vue.template index 91607ef..32b6a8b 100644 --- a/resource/template/vm/vue/list-vue.template +++ b/resource/template/vm/vue/list-vue.template @@ -469,7 +469,7 @@ import {downLoadXml} from "/@/utils/zipdownload"; import loadExcel from "/@/components/loadExcel/index.vue" {{end}} export default defineComponent({ - name: "{{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}List", + name: "{{.apiVersion|replace "/" "_"|CaseCamelLower}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}List", components:{ {{if .table.ExcelImp}} loadExcel, @@ -591,11 +591,14 @@ export default defineComponent({ list{{.table.ClassName}}(state.tableData.param).then((res:any)=>{ let list = res.data.list??[]; {{range $index,$column := .table.ListColumns}} - {{if eq $column.HtmlField "createdBy" "updatedBy"}} + {{if eq $column.HtmlField "createdBy" "updatedBy" "deptId"}} list.map((item:any)=>{ {{if eq $column.HtmlField "createdBy"}} item.createdBy = item.createdUser?.userNickname {{end}} + {{if eq $column.HtmlField "deptId"}} + item.deptId = item.deptInfo?.deptName + {{end}} {{if eq $column.HtmlField "updatedBy"}} item.updatedBy = item.updatedUser?.userNickname {{end}} diff --git a/resource/template/vm/vue/tree-virtual-vue.template b/resource/template/vm/vue/tree-virtual-vue.template index 967f94a..518fa9a 100644 --- a/resource/template/vm/vue/tree-virtual-vue.template +++ b/resource/template/vm/vue/tree-virtual-vue.template @@ -340,7 +340,7 @@ import {{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|Ca import {{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}Detail from "/@/views/{{.modulePath}}/{{$businessName}}/list/component/detail.vue" import _ from 'lodash' export default defineComponent({ - name: "{{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}List", + name: "{{.apiVersion|replace "/" "_"|CaseCamelLower}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}List", components:{ {{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}Edit, {{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}Detail @@ -457,11 +457,14 @@ export default defineComponent({ list{{.table.ClassName}}(state.tableData.param).then((res:any)=>{ let list = res.data.list??[]; {{range $index,$column := .table.ListColumns}} - {{if eq $column.HtmlField "createdBy" "updatedBy"}} + {{if eq $column.HtmlField "createdBy" "updatedBy" "dept_id"}} list.map((item:any)=>{ {{if eq $column.HtmlField "createdBy"}} item.createdBy = item?.createdUser.userNickname {{end}} + {{if eq $column.HtmlField "deptId"}} + item.deptId = item.deptInfo?.deptName + {{end}} {{if eq $column.HtmlField "updatedBy"}} item.updatedBy = item?.updatedUser.userNickname {{end}} @@ -470,7 +473,7 @@ export default defineComponent({ {{end}} if(list.length > 0 && typeof list[0].id == "undefined"){ list.map((item:any)=>{ - item.id = item.categoryId + item.id = item.{{.table.PkColumn.HtmlField}} }) } dataList.value = _.clone(res.data.list) diff --git a/resource/template/vm/vue/tree-vue.template b/resource/template/vm/vue/tree-vue.template index 0a498ce..8dd7c5c 100644 --- a/resource/template/vm/vue/tree-vue.template +++ b/resource/template/vm/vue/tree-vue.template @@ -447,7 +447,7 @@ import {{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|Ca import {{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}Detail from "/@/views/{{.modulePath}}/{{$businessName}}/list/component/detail.vue" import _ from 'lodash' export default defineComponent({ - name: "{{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}List", + name: "{{.apiVersion|replace "/" "_"|CaseCamelLower}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}List", components:{ {{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}Edit, {{.apiVersion|replace "/" "_"|CaseCamel}}{{.modulePath|replace "/" "_"|CaseCamel}}{{.table.ClassName}}Detail @@ -564,11 +564,14 @@ export default defineComponent({ list{{.table.ClassName}}(state.tableData.param).then((res:any)=>{ let list = res.data.list??[]; {{range $index,$column := .table.ListColumns}} - {{if eq $column.HtmlField "createdBy" "updatedBy"}} + {{if eq $column.HtmlField "createdBy" "updatedBy" "deptId"}} list.map((item:any)=>{ {{if eq $column.HtmlField "createdBy"}} item.createdBy = item?.createdUser.userNickname {{end}} + {{if eq $column.HtmlField "deptId"}} + item.deptId = item.deptInfo?.deptName + {{end}} {{if eq $column.HtmlField "updatedBy"}} item.updatedBy = item?.updatedUser.userNickname {{end}}