fix 1、修复虚拟树形结构ID错误问题
2、修复组件name首字母大写造成的页面缓存失败问题 3、修复excel导出文件未关闭资源的问题 4、更新数据权限同时支持按创建人划分(created_by)或按部门(dept_id划分) 5、更新token自动刷新功能
This commit is contained in:
parent
6e2f38c945
commit
379abd65e0
@ -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"`
|
||||
}
|
||||
|
@ -12,4 +12,9 @@ const (
|
||||
EffectiveTypeStartEnd = 1
|
||||
// EffectiveTypeDate 按时间段
|
||||
EffectiveTypeDate = 2
|
||||
|
||||
// WebsocketTypeTokenUpdated websocket通知类型-更新token
|
||||
WebsocketTypeTokenUpdated = "tokenUpdated"
|
||||
// WebsocketTypeNotice websocket通知类型-系统通知
|
||||
WebsocketTypeNotice = "notice"
|
||||
)
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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,
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 "
|
||||
|
||||
}
|
||||
|
||||
|
@ -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"`
|
||||
}
|
||||
|
@ -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 // 表列信息
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -9,5 +9,5 @@ package consts
|
||||
|
||||
const (
|
||||
Logo = `CiAgIF9fX19fX19fX19fXyAgICAgICAgICAgX18gCiAgLyBfX19fLyBfX19fL19fXyBfX19fX18vIC9fCiAvIC8gX18vIC9fICAvIF9fIGAvIF9fXy8gX18vCi8gL18vIC8gX18vIC8gL18vIChfXyAgKSAvXyAgClxfX19fL18vICAgIFxfXyxfL19fX18vXF9fLyAg`
|
||||
Version = "3.2.25"
|
||||
Version = "3.2.26"
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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, "添加失败")
|
||||
})
|
||||
|
@ -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}}
|
||||
}
|
||||
|
||||
////
|
||||
|
@ -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}}
|
||||
|
@ -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}}
|
||||
|
@ -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)
|
||||
|
@ -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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user