fix 1、修复虚拟树形结构ID错误问题

2、修复组件name首字母大写造成的页面缓存失败问题
    3、修复excel导出文件未关闭资源的问题
    4、更新数据权限同时支持按创建人划分(created_by)或按部门(dept_id划分)
    5、更新token自动刷新功能
This commit is contained in:
yxh 2024-06-08 23:17:33 +08:00
parent 6e2f38c945
commit 379abd65e0
24 changed files with 309 additions and 35 deletions

View File

@ -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"`
}

View File

@ -12,4 +12,9 @@ const (
EffectiveTypeStartEnd = 1
// EffectiveTypeDate 按时间段
EffectiveTypeDate = 2
// WebsocketTypeTokenUpdated websocket通知类型-更新token
WebsocketTypeTokenUpdated = "tokenUpdated"
// WebsocketTypeNotice websocket通知类型-系统通知
WebsocketTypeNotice = "notice"
)

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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 {

View File

@ -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,
})
}
})
}

View File

@ -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

View File

@ -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

View File

@ -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 "
}

View File

@ -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"`
}

View File

@ -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 // 表列信息

View File

@ -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

View File

@ -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

View File

@ -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
}
)

View File

@ -9,5 +9,5 @@ package consts
const (
Logo = `CiAgIF9fX19fX19fX19fXyAgICAgICAgICAgX18gCiAgLyBfX19fLyBfX19fL19fXyBfX19fX18vIC9fCiAvIC8gX18vIC9fICAvIF9fIGAvIF9fXy8gX18vCi8gL18vIC8gX18vIC8gL18vIChfXyAgKSAvXyAgClxfX19fL18vICAgIFxfXyxfL19fX18vXF9fLyAg`
Version = "3.2.25"
Version = "3.2.26"
)

View File

@ -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)

View File

@ -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)

View File

@ -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, "添加失败")
})

View File

@ -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}}
}
////

View File

@ -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}}

View File

@ -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}}

View File

@ -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)

View File

@ -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}}