mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-08-28 05:12:32 +08:00
发布v2.15.1版本,更新内容请查看:https://github.com/bufanyun/hotgo/blob/v2.0/docs/guide-zh-CN/start-update-log.md
This commit is contained in:
@@ -236,7 +236,7 @@ func (s *sAdminCreditsLog) Export(ctx context.Context, in *adminin.CreditsLogLis
|
||||
}
|
||||
|
||||
var (
|
||||
fileName = "导出资产变动-" + gctx.CtxId(ctx) + ".xlsx"
|
||||
fileName = "导出资产变动-" + gctx.CtxId(ctx)
|
||||
sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, form.CalPageCount(totalCount, in.PerPage), in.Page, len(list))
|
||||
exports []adminin.CreditsLogExportModel
|
||||
)
|
||||
|
@@ -14,6 +14,7 @@ import (
|
||||
"hotgo/internal/dao"
|
||||
"hotgo/internal/library/contexts"
|
||||
"hotgo/internal/library/hgorm"
|
||||
"hotgo/internal/library/hgorm/handler"
|
||||
"hotgo/internal/model/entity"
|
||||
"hotgo/internal/model/input/adminin"
|
||||
"hotgo/internal/model/input/form"
|
||||
@@ -33,10 +34,15 @@ func init() {
|
||||
service.RegisterAdminDept(NewAdminDept())
|
||||
}
|
||||
|
||||
// Model 部门ORM模型
|
||||
func (s *sAdminDept) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
|
||||
return handler.Model(dao.AdminDept.Ctx(ctx), option...)
|
||||
}
|
||||
|
||||
// Delete 删除
|
||||
func (s *sAdminDept) Delete(ctx context.Context, in *adminin.DeptDeleteInp) (err error) {
|
||||
var models *entity.AdminDept
|
||||
if err = dao.AdminDept.Ctx(ctx).Where("id", in.Id).Scan(&models); err != nil {
|
||||
if err = s.Model(ctx).WherePri(in.Id).Scan(&models); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -44,7 +50,7 @@ func (s *sAdminDept) Delete(ctx context.Context, in *adminin.DeptDeleteInp) (err
|
||||
return gerror.New("数据不存在或已删除!")
|
||||
}
|
||||
|
||||
pidExist, err := dao.AdminDept.Ctx(ctx).Where("pid", models.Id).One()
|
||||
pidExist, err := s.Model(ctx).Where(dao.AdminDept.Columns().Pid, models.Id).One()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, consts.ErrorORM)
|
||||
return err
|
||||
@@ -53,7 +59,7 @@ func (s *sAdminDept) Delete(ctx context.Context, in *adminin.DeptDeleteInp) (err
|
||||
return gerror.New("请先删除该部门下得所有子级!")
|
||||
}
|
||||
|
||||
_, err = dao.AdminDept.Ctx(ctx).Where("id", in.Id).Delete()
|
||||
_, err = s.Model(ctx).WherePri(in.Id).Delete()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -87,75 +93,41 @@ func (s *sAdminDept) VerifyUnique(ctx context.Context, in *adminin.VerifyUniqueI
|
||||
|
||||
// Edit 修改/新增
|
||||
func (s *sAdminDept) Edit(ctx context.Context, in *adminin.DeptEditInp) (err error) {
|
||||
where := g.Map{
|
||||
dao.AdminDept.Columns().Name: in.Name,
|
||||
dao.AdminDept.Columns().Code: in.Code,
|
||||
}
|
||||
// 验证唯一性
|
||||
err = s.VerifyUnique(ctx, &adminin.VerifyUniqueInp{
|
||||
Id: in.Id,
|
||||
Where: g.Map{
|
||||
dao.AdminDept.Columns().Name: in.Name,
|
||||
dao.AdminDept.Columns().Code: in.Code,
|
||||
},
|
||||
})
|
||||
err = s.VerifyUnique(ctx, &adminin.VerifyUniqueInp{Id: in.Id, Where: where})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// 生成下级关系树
|
||||
if in.Pid, in.Level, in.Tree, err = hgorm.GenSubTree(ctx, &dao.AdminDept, in.Pid); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
err = dao.AdminDept.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
||||
// 更新数据
|
||||
_, err = dao.AdminDept.Ctx(ctx).Fields(adminin.DeptUpdateFields{}).WherePri(in.Id).Data(in).Update()
|
||||
if err != nil {
|
||||
return err
|
||||
return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
|
||||
in.Pid, in.Level, in.Tree, err = hgorm.AutoUpdateTree(ctx, &dao.AdminDept, in.Id, in.Pid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "修改部门管理失败,请稍后重试!")
|
||||
}
|
||||
|
||||
// 如果当前部门有子级,更新子级tree关系树
|
||||
return updateChildrenTree(ctx, in.Id, in.Level, in.Tree)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
// 新增
|
||||
_, err = dao.AdminDept.Ctx(ctx).Fields(adminin.DeptInsertFields{}).Data(in).Insert()
|
||||
return
|
||||
}
|
||||
|
||||
func updateChildrenTree(ctx context.Context, _id int64, _level int, _tree string) (err error) {
|
||||
var list []*entity.AdminDept
|
||||
if err = dao.AdminDept.Ctx(ctx).Where("pid", _id).Scan(&list); err != nil || list == nil {
|
||||
return
|
||||
}
|
||||
for _, child := range list {
|
||||
child.Level = _level + 1
|
||||
child.Tree = tree.GenLabel(_tree, child.Pid)
|
||||
|
||||
if _, err = dao.AdminDept.Ctx(ctx).Where("id", child.Id).Data("level", child.Level, "tree", child.Tree).Update(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if err = updateChildrenTree(ctx, child.Id, child.Level, child.Tree); err != nil {
|
||||
return
|
||||
// 新增
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).Data(in).Insert(); err != nil {
|
||||
err = gerror.Wrap(err, "新增部门管理失败,请稍后重试!")
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Status 更新部门状态
|
||||
func (s *sAdminDept) Status(ctx context.Context, in *adminin.DeptStatusInp) (err error) {
|
||||
if _, err = dao.AdminDept.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "更新部门状态失败!")
|
||||
}
|
||||
return
|
||||
return
|
||||
})
|
||||
}
|
||||
|
||||
// MaxSort 最大排序
|
||||
func (s *sAdminDept) MaxSort(ctx context.Context, in *adminin.DeptMaxSortInp) (res *adminin.DeptMaxSortModel, err error) {
|
||||
if in.Id > 0 {
|
||||
if err = dao.AdminDept.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
|
||||
if err = dao.AdminDept.Ctx(ctx).WherePri(in.Id).OrderDesc(dao.AdminDept.Columns().Sort).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取部门数据异常!")
|
||||
return
|
||||
}
|
||||
@@ -171,13 +143,146 @@ func (s *sAdminDept) MaxSort(ctx context.Context, in *adminin.DeptMaxSortInp) (r
|
||||
|
||||
// View 获取指定部门信息
|
||||
func (s *sAdminDept) View(ctx context.Context, in *adminin.DeptViewInp) (res *adminin.DeptViewModel, err error) {
|
||||
if err = dao.AdminDept.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
|
||||
if err = dao.AdminDept.Ctx(ctx).WherePri(in.Id).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取部门信息失败!")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Option 选项
|
||||
// List 获取列表
|
||||
func (s *sAdminDept) List(ctx context.Context, in *adminin.DeptListInp) (res *adminin.DeptListModel, err error) {
|
||||
res = new(adminin.DeptListModel)
|
||||
|
||||
var (
|
||||
mod = dao.AdminDept.Ctx(ctx)
|
||||
cols = dao.AdminDept.Columns()
|
||||
)
|
||||
|
||||
// 部门名称
|
||||
if in.Name != "" {
|
||||
columns, err := dao.AdminDept.Ctx(ctx).Fields(cols.Id).WhereLike(cols.Name, "%"+in.Name+"%").Array()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "查询部门名称失败!")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(columns) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
res.Ids = append(res.Ids, g.NewVar(columns).Int64s()...)
|
||||
}
|
||||
|
||||
// 部门编码
|
||||
if in.Code != "" {
|
||||
columns, err := dao.AdminDept.Ctx(ctx).Fields(cols.Id).WhereLike(cols.Code, "%"+in.Code+"%").Array()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "查询部门编码失败!")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(columns) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
res.Ids = append(res.Ids, g.NewVar(columns).Int64s()...)
|
||||
}
|
||||
|
||||
// 负责人
|
||||
if in.Leader != "" {
|
||||
columns, err := dao.AdminDept.Ctx(ctx).Fields(cols.Id).Where(cols.Leader, in.Leader).Array()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "查询负责人失败!")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(columns) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
res.Ids = append(res.Ids, g.NewVar(columns).Int64s()...)
|
||||
}
|
||||
|
||||
// 创建时间
|
||||
if len(in.CreatedAt) == 2 {
|
||||
columns, err := dao.AdminDept.Ctx(ctx).Fields(cols.Id).WhereBetween(cols.CreatedAt, in.CreatedAt[0], in.CreatedAt[1]).Array()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "查询创建时间失败!")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(columns) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
res.Ids = append(res.Ids, g.NewVar(columns).Int64s()...)
|
||||
}
|
||||
|
||||
res.Ids = convert.UniqueSlice(res.Ids)
|
||||
if len(res.Ids) > 0 {
|
||||
// 找到匹配到的完整上级部门
|
||||
columns, err := dao.AdminDept.Ctx(ctx).Fields(cols.Tree).WhereIn(cols.Id, res.Ids).Array()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "查询部门失败,请稍后重试!")
|
||||
return nil, err
|
||||
}
|
||||
var pids []int64
|
||||
for _, tr := range g.NewVar(columns).Strings() {
|
||||
pids = append(pids, tree.GetIds(tr)...)
|
||||
}
|
||||
mod = mod.WhereIn(cols.Id, append(res.Ids, convert.UniqueSlice(pids)...))
|
||||
}
|
||||
|
||||
if err = mod.Order("pid asc,sort asc").Scan(&res.List); err != nil {
|
||||
err = gerror.Wrap(err, "获取部门列表失败!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// GetName 获取部门名称
|
||||
func (s *sAdminDept) GetName(ctx context.Context, id int64) (name string, err error) {
|
||||
var data *entity.AdminDept
|
||||
if err = dao.AdminDept.Ctx(ctx).Where("id", id).Fields("name").Scan(&data); err != nil {
|
||||
err = gerror.Wrap(err, "获取部门名称失败!")
|
||||
return
|
||||
}
|
||||
|
||||
if data == nil {
|
||||
err = gerror.Wrap(err, "部门不存在!")
|
||||
return
|
||||
}
|
||||
return data.Name, nil
|
||||
}
|
||||
|
||||
// VerifyDeptId 验证部门ID
|
||||
func (s *sAdminDept) VerifyDeptId(ctx context.Context, id int64) (err error) {
|
||||
var (
|
||||
pid int64 = 0
|
||||
mb = contexts.GetUser(ctx)
|
||||
mod = dao.AdminDept.Ctx(ctx).Fields(dao.AdminDept.Columns().Id)
|
||||
)
|
||||
|
||||
if mb == nil {
|
||||
err = gerror.New("用户信息获取失败!")
|
||||
return
|
||||
}
|
||||
|
||||
// 非超管只获取下级
|
||||
if !service.AdminMember().VerifySuperId(ctx, mb.Id) {
|
||||
pid = mb.DeptId
|
||||
mod = mod.WhereNot(dao.AdminDept.Columns().Id, pid).WhereLike(dao.AdminDept.Columns().Tree, "%"+tree.GetIdLabel(pid)+"%")
|
||||
}
|
||||
|
||||
columns, err := mod.Array()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !validate.InSlice(g.NewVar(columns).Int64s(), id) {
|
||||
err = gerror.New("部门ID是无效的")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Option 获取当前登录用户可选的部门选项
|
||||
func (s *sAdminDept) Option(ctx context.Context, in *adminin.DeptOptionInp) (res *adminin.DeptOptionModel, totalCount int, err error) {
|
||||
var (
|
||||
mod = dao.AdminDept.Ctx(ctx)
|
||||
@@ -209,104 +314,6 @@ func (s *sAdminDept) Option(ctx context.Context, in *adminin.DeptOptionInp) (res
|
||||
return
|
||||
}
|
||||
|
||||
// List 获取列表
|
||||
func (s *sAdminDept) List(ctx context.Context, in *adminin.DeptListInp) (res *adminin.DeptListModel, err error) {
|
||||
var (
|
||||
mod = dao.AdminDept.Ctx(ctx)
|
||||
cols = dao.AdminDept.Columns()
|
||||
models []*entity.AdminDept
|
||||
ids []int64
|
||||
pids []int64
|
||||
)
|
||||
|
||||
appends := func(columns []gdb.Value) {
|
||||
ds := g.NewVar(columns).Int64s()
|
||||
ids = append(ids, ds...)
|
||||
pids = append(pids, ds...)
|
||||
}
|
||||
|
||||
// 部门名称
|
||||
if in.Name != "" {
|
||||
columns, err := dao.AdminDept.Ctx(ctx).Fields(cols.Pid).WhereLike(cols.Name, "%"+in.Name+"%").Array()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "查询部门名称失败!")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(columns) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
appends(columns)
|
||||
}
|
||||
|
||||
if in.Code != "" {
|
||||
columns, err := dao.AdminDept.Ctx(ctx).Fields(cols.Pid).WhereLike(cols.Code, "%"+in.Code+"%").Array()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "查询部门编码失败!")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(columns) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
appends(columns)
|
||||
}
|
||||
|
||||
if in.Leader != "" {
|
||||
columns, err := dao.AdminDept.Ctx(ctx).Fields(cols.Pid).Where(cols.Leader, in.Leader).Array()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "查询负责人失败!")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(columns) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
appends(columns)
|
||||
}
|
||||
|
||||
if len(in.CreatedAt) == 2 {
|
||||
columns, err := dao.AdminDept.Ctx(ctx).Fields(cols.Pid).WhereBetween(cols.CreatedAt, in.CreatedAt[0], in.CreatedAt[1]).Array()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "查询创建时间失败!")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(columns) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
appends(columns)
|
||||
}
|
||||
|
||||
if len(ids) > 0 {
|
||||
mod = mod.Wheref(`id in (?) or pid in (?)`, convert.UniqueSlice(ids), convert.UniqueSlice(pids))
|
||||
}
|
||||
|
||||
if err = mod.Order("pid asc,sort asc").Scan(&models); err != nil {
|
||||
err = gerror.Wrap(err, "获取部门列表失败!")
|
||||
return
|
||||
}
|
||||
|
||||
res = new(adminin.DeptListModel)
|
||||
res.List = s.treeList(0, models)
|
||||
return
|
||||
}
|
||||
|
||||
// GetName 获取部门名称
|
||||
func (s *sAdminDept) GetName(ctx context.Context, id int64) (name string, err error) {
|
||||
var data *entity.AdminDept
|
||||
if err = dao.AdminDept.Ctx(ctx).Where("id", id).Fields("name").Scan(&data); err != nil {
|
||||
err = gerror.Wrap(err, "获取部门名称失败!")
|
||||
return
|
||||
}
|
||||
|
||||
if data == nil {
|
||||
err = gerror.Wrap(err, "部门不存在!")
|
||||
return
|
||||
}
|
||||
return data.Name, nil
|
||||
}
|
||||
|
||||
// treeList 树状列表
|
||||
func (s *sAdminDept) treeList(pid int64, nodes []*entity.AdminDept) (list []*adminin.DeptTree) {
|
||||
list = make([]*adminin.DeptTree, 0)
|
||||
@@ -327,34 +334,16 @@ func (s *sAdminDept) treeList(pid int64, nodes []*entity.AdminDept) (list []*adm
|
||||
return
|
||||
}
|
||||
|
||||
// VerifyDeptId 验证部门ID
|
||||
func (s *sAdminDept) VerifyDeptId(ctx context.Context, id int64) (err error) {
|
||||
var (
|
||||
pid int64 = 0
|
||||
mb = contexts.GetUser(ctx)
|
||||
mod = dao.AdminDept.Ctx(ctx).Fields(dao.AdminDept.Columns().Id)
|
||||
)
|
||||
|
||||
if mb == nil {
|
||||
err = gerror.New("用户信息获取失败!")
|
||||
// TreeOption 获取部门关系树选项
|
||||
func (s *sAdminDept) TreeOption(ctx context.Context) (nodes []tree.Node, err error) {
|
||||
var models []*adminin.DeptTreeOption
|
||||
if err = s.Model(ctx).Fields(adminin.DeptTreeOption{}).OrderAsc(dao.AdminDept.Columns().Pid).OrderAsc(dao.AdminDept.Columns().Sort).OrderDesc(dao.AdminDept.Columns().Id).Scan(&models); err != nil {
|
||||
err = gerror.Wrap(err, "获取部门关系树选项失败!")
|
||||
return
|
||||
}
|
||||
|
||||
// 非超管只获取下级
|
||||
if !service.AdminMember().VerifySuperId(ctx, mb.Id) {
|
||||
pid = mb.DeptId
|
||||
mod = mod.WhereNot(dao.AdminDept.Columns().Id, pid).WhereLike(dao.AdminDept.Columns().Tree, "%"+tree.GetIdLabel(pid)+"%")
|
||||
nodes = make([]tree.Node, len(models))
|
||||
for i, v := range models {
|
||||
nodes[i] = v
|
||||
}
|
||||
|
||||
columns, err := mod.Array()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ids := g.NewVar(columns).Int64s()
|
||||
if !validate.InSlice(ids, id) {
|
||||
err = gerror.New("部门ID是无效的")
|
||||
return
|
||||
}
|
||||
return
|
||||
return tree.ListToTree(0, nodes)
|
||||
}
|
||||
|
@@ -8,6 +8,7 @@ package admin
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/gogf/gf/v2/container/gvar"
|
||||
"github.com/gogf/gf/v2/crypto/gmd5"
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/database/gredis"
|
||||
@@ -719,6 +720,7 @@ func (s *sAdminMember) LoginMemberInfo(ctx context.Context) (res *adminin.LoginM
|
||||
res.Mobile = gstr.HideStr(res.Mobile, 40, `*`)
|
||||
res.Email = gstr.HideStr(res.Email, 40, `*`)
|
||||
res.OpenId, _ = service.CommonWechat().GetOpenId(ctx)
|
||||
res.DeptType = contexts.GetDeptType(ctx)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -772,6 +774,22 @@ func (s *sAdminMember) Select(ctx context.Context, in *adminin.MemberSelectInp)
|
||||
return
|
||||
}
|
||||
|
||||
// GetIdsByKeyword 根据关键词查找符合条件的用户ID
|
||||
func (s *sAdminMember) GetIdsByKeyword(ctx context.Context, ks string) (res []int64, err error) {
|
||||
ks = gstr.Trim(ks)
|
||||
if len(ks) == 0 {
|
||||
return
|
||||
}
|
||||
array, err := dao.AdminMember.Ctx(ctx).Fields("id").
|
||||
Where("`id` = ? or `real_name` = ? or `username` = ? or `mobile` = ?", ks, ks, ks, ks).
|
||||
Array()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "根据关键词获取用户ID失败,请稍后重试!")
|
||||
}
|
||||
res = gvar.New(array).Int64s()
|
||||
return
|
||||
}
|
||||
|
||||
// VerifySuperId 验证是否为超管
|
||||
func (s *sAdminMember) VerifySuperId(ctx context.Context, verifyId int64) bool {
|
||||
s.superAdmin.RLock()
|
||||
|
@@ -19,6 +19,7 @@ import (
|
||||
"hotgo/internal/library/casbin"
|
||||
"hotgo/internal/library/contexts"
|
||||
"hotgo/internal/library/hgorm"
|
||||
"hotgo/internal/library/hgorm/handler"
|
||||
"hotgo/internal/model/entity"
|
||||
"hotgo/internal/model/input/adminin"
|
||||
"hotgo/internal/service"
|
||||
@@ -36,6 +37,11 @@ func init() {
|
||||
service.RegisterAdminMenu(NewAdminMenu())
|
||||
}
|
||||
|
||||
// Model Orm模型
|
||||
func (s *sAdminMenu) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
|
||||
return handler.Model(dao.AdminMenu.Ctx(ctx), option...)
|
||||
}
|
||||
|
||||
// Delete 删除
|
||||
func (s *sAdminMenu) Delete(ctx context.Context, in *adminin.MenuDeleteInp) (err error) {
|
||||
exist, err := dao.AdminMenu.Ctx(ctx).Where("pid", in.Id).One()
|
||||
@@ -282,3 +288,17 @@ func (s *sAdminMenu) treeList(pid int64, nodes []*entity.AdminMenu) (list []*adm
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// GetFastList 获取菜单列表
|
||||
func (s *sAdminMenu) GetFastList(ctx context.Context) (res map[int64]*entity.AdminMenu, err error) {
|
||||
var models []*entity.AdminMenu
|
||||
if err = dao.AdminMenu.Ctx(ctx).Scan(&models); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
res = make(map[int64]*entity.AdminMenu, len(models))
|
||||
for _, v := range models {
|
||||
res[v.Id] = v
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@@ -317,7 +317,7 @@ func (s *sAdminOrder) Export(ctx context.Context, in *adminin.OrderListInp) (err
|
||||
}
|
||||
|
||||
var (
|
||||
fileName = "导出充值订单-" + gctx.CtxId(ctx) + ".xlsx"
|
||||
fileName = "导出充值订单-" + gctx.CtxId(ctx)
|
||||
sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, form.CalPageCount(totalCount, in.PerPage), in.Page, len(list))
|
||||
exports []adminin.OrderExportModel
|
||||
)
|
||||
|
@@ -226,6 +226,10 @@ func (s *sAdminRole) Delete(ctx context.Context, in *adminin.RoleDeleteInp) (err
|
||||
return gerror.New("数据不存在或已删除!")
|
||||
}
|
||||
|
||||
if models.Key == consts.SuperRoleKey {
|
||||
return gerror.New("超管角色禁止删除!")
|
||||
}
|
||||
|
||||
has, err := dao.AdminRole.Ctx(ctx).Where("pid", models.Id).One()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, consts.ErrorORM)
|
||||
|
@@ -82,11 +82,6 @@ func (s *sAdminSite) Register(ctx context.Context, in *adminin.RegisterInp) (err
|
||||
return
|
||||
}
|
||||
|
||||
if len(config.PostIds) == 0 {
|
||||
err = gerror.New("管理员未配置默认岗位")
|
||||
return
|
||||
}
|
||||
|
||||
// 验证唯一性
|
||||
err = service.AdminMember().VerifyUnique(ctx, &adminin.VerifyUniqueInp{
|
||||
Where: g.Map{
|
||||
@@ -225,39 +220,18 @@ func (s *sAdminSite) MobileLogin(ctx context.Context, in *adminin.MobileLoginInp
|
||||
|
||||
// handleLogin .
|
||||
func (s *sAdminSite) handleLogin(ctx context.Context, mb *entity.AdminMember) (res *adminin.LoginModel, err error) {
|
||||
var ro *entity.AdminRole
|
||||
if err = dao.AdminRole.Ctx(ctx).Fields("id,key,status").Where("id", mb.RoleId).Scan(&ro); err != nil {
|
||||
err = gerror.Wrap(err, consts.ErrorORM)
|
||||
return
|
||||
}
|
||||
|
||||
if ro == nil {
|
||||
err = gerror.New("角色不存在")
|
||||
return
|
||||
}
|
||||
|
||||
if ro.Status != consts.StatusEnabled {
|
||||
err = gerror.New("角色已被禁用")
|
||||
return
|
||||
}
|
||||
|
||||
var dept *entity.AdminDept
|
||||
if err = dao.AdminDept.Ctx(ctx).Fields("id,status").Where("id", mb.DeptId).Scan(&dept); err != nil || dept == nil {
|
||||
err = gerror.Wrap(err, "获取部门信息失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
|
||||
if dept.Status != consts.StatusEnabled {
|
||||
err = gerror.New("部门已被禁用,如有疑问请联系管理员")
|
||||
return
|
||||
role, dept, err := s.getLoginRoleAndDept(ctx, mb.RoleId, mb.DeptId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
user := &model.Identity{
|
||||
Id: mb.Id,
|
||||
Pid: mb.Pid,
|
||||
DeptId: mb.DeptId,
|
||||
RoleId: ro.Id,
|
||||
RoleKey: ro.Key,
|
||||
DeptId: dept.Id,
|
||||
DeptType: dept.Type,
|
||||
RoleId: role.Id,
|
||||
RoleKey: role.Key,
|
||||
Username: mb.Username,
|
||||
RealName: mb.RealName,
|
||||
Avatar: mb.Avatar,
|
||||
@@ -281,10 +255,48 @@ func (s *sAdminSite) handleLogin(ctx context.Context, mb *entity.AdminMember) (r
|
||||
return
|
||||
}
|
||||
|
||||
// getLoginRoleAndDept 获取登录的角色和部门信息
|
||||
func (s *sAdminSite) getLoginRoleAndDept(ctx context.Context, roleId, deptId int64) (role *entity.AdminRole, dept *entity.AdminDept, err error) {
|
||||
if err = dao.AdminRole.Ctx(ctx).Fields("id,key,status").WherePri(roleId).Scan(&role); err != nil {
|
||||
err = gerror.Wrap(err, consts.ErrorORM)
|
||||
return
|
||||
}
|
||||
|
||||
if role == nil {
|
||||
err = gerror.New("角色不存在或已被删除")
|
||||
return
|
||||
}
|
||||
|
||||
if role.Status != consts.StatusEnabled {
|
||||
err = gerror.New("角色已被禁用,如有疑问请联系管理员")
|
||||
return
|
||||
}
|
||||
|
||||
if err = dao.AdminDept.Ctx(ctx).Fields("id,type,status").WherePri(deptId).Scan(&dept); err != nil {
|
||||
err = gerror.Wrap(err, "获取部门信息失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
|
||||
if dept == nil {
|
||||
err = gerror.New("部门不存在或已被删除")
|
||||
return
|
||||
}
|
||||
|
||||
if dept.Status != consts.StatusEnabled {
|
||||
err = gerror.New("部门已被禁用,如有疑问请联系管理员")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// BindUserContext 绑定用户上下文
|
||||
func (s *sAdminSite) BindUserContext(ctx context.Context, claims *model.Identity) (err error) {
|
||||
//// 如果不想每次访问都重新加载用户信息,可以放开注释。但在本次登录未失效前,用户信息不会刷新
|
||||
//contexts.SetUser(ctx, claims)
|
||||
//return
|
||||
|
||||
var mb *entity.AdminMember
|
||||
if err = dao.AdminMember.Ctx(ctx).Where("id", claims.Id).Scan(&mb); err != nil {
|
||||
if err = dao.AdminMember.Ctx(ctx).WherePri(claims.Id).Scan(&mb); err != nil {
|
||||
err = gerror.Wrap(err, "获取用户信息失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
@@ -299,32 +311,16 @@ func (s *sAdminSite) BindUserContext(ctx context.Context, claims *model.Identity
|
||||
return
|
||||
}
|
||||
|
||||
var role *entity.AdminRole
|
||||
if err = dao.AdminRole.Ctx(ctx).Fields("id,key,status").Where("id", mb.RoleId).Scan(&role); err != nil || role == nil {
|
||||
err = gerror.Wrap(err, "获取角色信息失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
|
||||
if role.Status != consts.StatusEnabled {
|
||||
err = gerror.New("角色已被禁用,如有疑问请联系管理员")
|
||||
return
|
||||
}
|
||||
|
||||
var dept *entity.AdminDept
|
||||
if err = dao.AdminDept.Ctx(ctx).Fields("id,status").Where("id", mb.DeptId).Scan(&dept); err != nil || dept == nil {
|
||||
err = gerror.Wrap(err, "获取部门信息失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
|
||||
if dept.Status != consts.StatusEnabled {
|
||||
err = gerror.New("部门已被禁用,如有疑问请联系管理员")
|
||||
return
|
||||
role, dept, err := s.getLoginRoleAndDept(ctx, mb.RoleId, mb.DeptId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
user := &model.Identity{
|
||||
Id: mb.Id,
|
||||
Pid: mb.Pid,
|
||||
DeptId: mb.DeptId,
|
||||
DeptId: dept.Id,
|
||||
DeptType: dept.Type,
|
||||
RoleId: mb.RoleId,
|
||||
RoleKey: role.Key,
|
||||
Username: mb.Username,
|
||||
|
@@ -10,14 +10,19 @@ import (
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/net/ghttp"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
"github.com/gogf/gf/v2/text/gstr"
|
||||
"hotgo/internal/library/contexts"
|
||||
"hotgo/internal/service"
|
||||
"hotgo/utility/simple"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// 忽略的请求方式
|
||||
var ignoredRequestMethods = []string{"HEAD", "PRI"}
|
||||
|
||||
// accessLog 访问日志
|
||||
func (s *sHook) accessLog(r *ghttp.Request) {
|
||||
if r.IsFileRequest() {
|
||||
if s.isIgnoredRequest(r) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -37,3 +42,15 @@ func (s *sHook) accessLog(r *ghttp.Request) {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// isIgnoredRequest 是否忽略请求
|
||||
func (s *sHook) isIgnoredRequest(r *ghttp.Request) bool {
|
||||
if r.IsFileRequest() {
|
||||
return true
|
||||
}
|
||||
|
||||
if gstr.InArray(ignoredRequestMethods, strings.ToUpper(r.Method)) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
@@ -23,6 +23,7 @@ import (
|
||||
"hotgo/internal/library/token"
|
||||
"hotgo/internal/model"
|
||||
"hotgo/internal/service"
|
||||
"hotgo/utility/simple"
|
||||
"hotgo/utility/validate"
|
||||
"net/http"
|
||||
"strings"
|
||||
@@ -110,8 +111,7 @@ func (s *sMiddleware) CORS(r *ghttp.Request) {
|
||||
|
||||
// DemoLimit 演示系统操作限制
|
||||
func (s *sMiddleware) DemoLimit(r *ghttp.Request) {
|
||||
isDemo := g.Cfg().MustGet(r.Context(), "hotgo.isDemo", false)
|
||||
if !isDemo.Bool() {
|
||||
if !simple.IsDemo(r.Context()) {
|
||||
r.Middleware.Next()
|
||||
return
|
||||
}
|
||||
@@ -157,10 +157,6 @@ func (s *sMiddleware) Addon(r *ghttp.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
if sk.View != nil {
|
||||
r.SetView(sk.View)
|
||||
}
|
||||
|
||||
contexts.SetAddonName(ctx, sk.Name)
|
||||
r.Middleware.Next()
|
||||
}
|
||||
|
@@ -82,7 +82,7 @@ func parseResponse(r *ghttp.Request) (code int, message string, resp interface{}
|
||||
}
|
||||
|
||||
// 是否输出错误堆栈到页面
|
||||
if g.Cfg().MustGet(ctx, "hotgo.debug", true).Bool() {
|
||||
if simple.Debug(ctx) {
|
||||
message = gerror.Current(err).Error()
|
||||
if getContentType(r) == consts.HTTPContentTypeHtml {
|
||||
resp = charset.SerializeStack(err)
|
||||
|
@@ -88,7 +88,7 @@ func (s *sPay) Export(ctx context.Context, in payin.PayListInp) (err error) {
|
||||
}
|
||||
|
||||
var (
|
||||
fileName = "导出支付日志-" + gctx.CtxId(ctx) + ".xlsx"
|
||||
fileName = "导出支付日志-" + gctx.CtxId(ctx)
|
||||
sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, form.CalPageCount(totalCount, in.PerPage), in.Page, len(list))
|
||||
exports []payin.PayExportModel
|
||||
)
|
||||
|
@@ -204,7 +204,7 @@ func (s *sPayRefund) Export(ctx context.Context, in *payin.PayRefundListInp) (er
|
||||
}
|
||||
|
||||
var (
|
||||
fileName = "导出交易退款-" + gctx.CtxId(ctx) + ".xlsx"
|
||||
fileName = "导出交易退款-" + gctx.CtxId(ctx)
|
||||
sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, form.CalPageCount(totalCount, in.PerPage), in.Page, len(list))
|
||||
exports []payin.PayRefundExportModel
|
||||
)
|
||||
|
@@ -17,6 +17,7 @@ import (
|
||||
"hotgo/internal/model/entity"
|
||||
"hotgo/internal/model/input/sysin"
|
||||
"hotgo/internal/service"
|
||||
"hotgo/utility/simple"
|
||||
)
|
||||
|
||||
var AddonsMaskDemoField []string
|
||||
@@ -55,7 +56,6 @@ func (s *sSysAddonsConfig) GetConfigByGroup(ctx context.Context, in *sysin.GetAd
|
||||
return nil, err
|
||||
}
|
||||
|
||||
isDemo := g.Cfg().MustGet(ctx, "hotgo.isDemo", false)
|
||||
if len(models) > 0 {
|
||||
res = new(sysin.GetAddonsConfigModel)
|
||||
res.List = make(g.Map, len(models))
|
||||
@@ -65,7 +65,7 @@ func (s *sSysAddonsConfig) GetConfigByGroup(ctx context.Context, in *sysin.GetAd
|
||||
return nil, err
|
||||
}
|
||||
res.List[v.Key] = val
|
||||
if isDemo.Bool() && gstr.InArray(AddonsMaskDemoField, v.Key) {
|
||||
if simple.IsDemo(ctx) && gstr.InArray(AddonsMaskDemoField, v.Key) {
|
||||
res.List[v.Key] = consts.DemoTips
|
||||
res.List[v.Key] = consts.DemoTips
|
||||
}
|
||||
|
@@ -188,13 +188,13 @@ func (s *sSysConfig) GetLoadToken(ctx context.Context) (conf *model.TokenConfig,
|
||||
|
||||
// GetLoadLog 获取本地日志配置
|
||||
func (s *sSysConfig) GetLoadLog(ctx context.Context) (conf *model.LogConfig, err error) {
|
||||
err = g.Cfg().MustGet(ctx, "hotgo.log").Scan(&conf)
|
||||
err = g.Cfg().MustGet(ctx, "system.log").Scan(&conf)
|
||||
return
|
||||
}
|
||||
|
||||
// GetLoadServeLog 获取本地服务日志配置
|
||||
func (s *sSysConfig) GetLoadServeLog(ctx context.Context) (conf *model.ServeLogConfig, err error) {
|
||||
err = g.Cfg().MustGet(ctx, "hotgo.serveLog").Scan(&conf)
|
||||
err = g.Cfg().MustGet(ctx, "system.serveLog").Scan(&conf)
|
||||
return
|
||||
}
|
||||
|
||||
|
@@ -3,7 +3,7 @@
|
||||
// @Copyright Copyright (c) 2024 HotGo CLI
|
||||
// @Author Ms <133814250@qq.com>
|
||||
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
||||
// @AutoGenerate Version 2.12.10
|
||||
// @AutoGenerate Version 2.13.1
|
||||
package sys
|
||||
|
||||
import (
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"hotgo/internal/library/contexts"
|
||||
"hotgo/internal/library/hgorm"
|
||||
"hotgo/internal/library/hgorm/handler"
|
||||
"hotgo/internal/library/hgorm/hook"
|
||||
"hotgo/internal/model/input/form"
|
||||
"hotgo/internal/model/input/sysin"
|
||||
"hotgo/internal/service"
|
||||
@@ -37,69 +38,84 @@ func init() {
|
||||
service.RegisterSysCurdDemo(NewSysCurdDemo())
|
||||
}
|
||||
|
||||
// Model 生成演示ORM模型
|
||||
// Model CURD列表ORM模型
|
||||
func (s *sSysCurdDemo) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
|
||||
return handler.Model(dao.SysGenCurdDemo.Ctx(ctx), option...)
|
||||
}
|
||||
|
||||
// List 获取生成演示列表
|
||||
// List 获取CURD列表列表
|
||||
func (s *sSysCurdDemo) List(ctx context.Context, in *sysin.CurdDemoListInp) (list []*sysin.CurdDemoListModel, totalCount int, err error) {
|
||||
mod := s.Model(ctx)
|
||||
|
||||
// 字段过滤
|
||||
mod = mod.FieldsPrefix(dao.SysGenCurdDemo.Table(), sysin.CurdDemoListModel{})
|
||||
mod = mod.Fields(hgorm.JoinFields(ctx, sysin.CurdDemoListModel{}, &dao.TestCategory, "testCategory"))
|
||||
|
||||
// 关联表字段
|
||||
mod = mod.LeftJoinOnFields(dao.TestCategory.Table(), dao.SysGenCurdDemo.Columns().CategoryId, "=", dao.TestCategory.Columns().Id)
|
||||
|
||||
// 查询ID
|
||||
if in.Id > 0 {
|
||||
mod = mod.Where(dao.SysGenCurdDemo.Columns().Id, in.Id)
|
||||
}
|
||||
|
||||
// 查询标题
|
||||
if in.Title != "" {
|
||||
mod = mod.WhereLike(dao.SysGenCurdDemo.Columns().Title, "%"+in.Title+"%")
|
||||
}
|
||||
|
||||
// 查询描述
|
||||
if in.Description != "" {
|
||||
mod = mod.WhereLike(dao.SysGenCurdDemo.Columns().Description, "%"+in.Description+"%")
|
||||
}
|
||||
|
||||
// 查询状态
|
||||
if in.Status > 0 {
|
||||
mod = mod.Where(dao.SysGenCurdDemo.Columns().Status, in.Status)
|
||||
}
|
||||
|
||||
// 查询创建者
|
||||
if in.CreatedBy != "" {
|
||||
ids, err := service.AdminMember().GetIdsByKeyword(ctx, in.CreatedBy)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
mod = mod.WhereIn(dao.SysGenCurdDemo.Columns().CreatedBy, ids)
|
||||
}
|
||||
|
||||
// 查询创建时间
|
||||
if len(in.CreatedAt) == 2 {
|
||||
mod = mod.WhereBetween(dao.SysGenCurdDemo.Columns().CreatedAt, in.CreatedAt[0], in.CreatedAt[1])
|
||||
}
|
||||
|
||||
// 查询分类名称
|
||||
// 查询测试分类
|
||||
if in.CategoryId > 0 {
|
||||
mod = mod.Where(dao.SysGenCurdDemo.Columns().CategoryId, in.CategoryId)
|
||||
}
|
||||
|
||||
// 查询关联分类
|
||||
if in.TestCategoryName != "" {
|
||||
mod = mod.WhereLike(dao.TestCategory.Columns().Name, in.TestCategoryName)
|
||||
mod = mod.WherePrefix(dao.TestCategory.Table(), dao.TestCategory.Columns().Name, in.TestCategoryName)
|
||||
}
|
||||
|
||||
// 关联表testCategory
|
||||
mod = mod.LeftJoin(hgorm.GenJoinOnRelation(
|
||||
dao.SysGenCurdDemo.Table(), dao.SysGenCurdDemo.Columns().CategoryId, // 主表表名,关联字段
|
||||
dao.TestCategory.Table(), "testCategory", dao.TestCategory.Columns().Id, // 关联表表名,别名,关联字段
|
||||
)...)
|
||||
// 分页
|
||||
mod = mod.Page(in.Page, in.PerPage)
|
||||
|
||||
totalCount, err = mod.Clone().Count()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "获取生成演示数据行失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
// 排序
|
||||
mod = mod.OrderAsc(dao.SysGenCurdDemo.Table() + "." + dao.SysGenCurdDemo.Columns().Sort).OrderDesc(dao.SysGenCurdDemo.Table() + "." + dao.SysGenCurdDemo.Columns().Id)
|
||||
|
||||
if totalCount == 0 {
|
||||
return
|
||||
}
|
||||
// 操作人摘要信息
|
||||
mod = mod.Hook(hook.MemberSummary)
|
||||
|
||||
// 关联表select
|
||||
fields, err := hgorm.GenJoinSelect(ctx, sysin.CurdDemoListModel{}, &dao.SysGenCurdDemo, []*hgorm.Join{
|
||||
{Dao: &dao.TestCategory, Alias: "testCategory"},
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "获取生成演示关联字段失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
|
||||
if err = mod.Fields(fields).Page(in.Page, in.PerPage).OrderAsc(dao.SysGenCurdDemo.Columns().Sort).OrderDesc(dao.SysGenCurdDemo.Columns().Id).Scan(&list); err != nil {
|
||||
err = gerror.Wrap(err, "获取生成演示列表失败,请稍后重试!")
|
||||
// 查询数据
|
||||
if err = mod.ScanAndCount(&list, &totalCount, false); err != nil {
|
||||
err = gerror.Wrap(err, "获取CURD列表列表失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Export 导出生成演示
|
||||
// Export 导出CURD列表
|
||||
func (s *sSysCurdDemo) Export(ctx context.Context, in *sysin.CurdDemoListInp) (err error) {
|
||||
list, totalCount, err := s.List(ctx, in)
|
||||
if err != nil {
|
||||
@@ -113,7 +129,7 @@ func (s *sSysCurdDemo) Export(ctx context.Context, in *sysin.CurdDemoListInp) (e
|
||||
}
|
||||
|
||||
var (
|
||||
fileName = "导出生成演示-" + gctx.CtxId(ctx) + ".xlsx"
|
||||
fileName = "导出CURD列表-" + gctx.CtxId(ctx)
|
||||
sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, form.CalPageCount(totalCount, in.PerPage), in.Page, len(list))
|
||||
exports []sysin.CurdDemoExportModel
|
||||
)
|
||||
@@ -126,42 +142,46 @@ func (s *sSysCurdDemo) Export(ctx context.Context, in *sysin.CurdDemoListInp) (e
|
||||
return
|
||||
}
|
||||
|
||||
// Edit 修改/新增生成演示
|
||||
// Edit 修改/新增CURD列表
|
||||
func (s *sSysCurdDemo) Edit(ctx context.Context, in *sysin.CurdDemoEditInp) (err error) {
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
in.UpdatedBy = contexts.GetUserId(ctx)
|
||||
if _, err = s.Model(ctx).
|
||||
Fields(sysin.CurdDemoUpdateFields{}).
|
||||
WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "修改生成演示失败,请稍后重试!")
|
||||
return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
|
||||
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
in.UpdatedBy = contexts.GetUserId(ctx)
|
||||
if _, err = s.Model(ctx).
|
||||
Fields(sysin.CurdDemoUpdateFields{}).
|
||||
WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "修改CURD列表失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 新增
|
||||
in.CreatedBy = contexts.GetUserId(ctx)
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).
|
||||
Fields(sysin.CurdDemoInsertFields{}).
|
||||
Data(in).Insert(); err != nil {
|
||||
err = gerror.Wrap(err, "新增CURD列表失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 新增
|
||||
in.CreatedBy = contexts.GetUserId(ctx)
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).
|
||||
Fields(sysin.CurdDemoInsertFields{}).
|
||||
Data(in).Insert(); err != nil {
|
||||
err = gerror.Wrap(err, "新增生成演示失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
})
|
||||
}
|
||||
|
||||
// Delete 删除生成演示
|
||||
// Delete 删除CURD列表
|
||||
func (s *sSysCurdDemo) Delete(ctx context.Context, in *sysin.CurdDemoDeleteInp) (err error) {
|
||||
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Delete(); err != nil {
|
||||
err = gerror.Wrap(err, "删除生成演示失败,请稍后重试!")
|
||||
err = gerror.Wrap(err, "删除CURD列表失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// MaxSort 获取生成演示最大排序
|
||||
// MaxSort 获取CURD列表最大排序
|
||||
func (s *sSysCurdDemo) MaxSort(ctx context.Context, in *sysin.CurdDemoMaxSortInp) (res *sysin.CurdDemoMaxSortModel, err error) {
|
||||
if err = dao.SysGenCurdDemo.Ctx(ctx).Fields(dao.SysGenCurdDemo.Columns().Sort).OrderDesc(dao.SysGenCurdDemo.Columns().Sort).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取生成演示最大排序,请稍后重试!")
|
||||
err = gerror.Wrap(err, "获取CURD列表最大排序,请稍后重试!")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -173,32 +193,19 @@ func (s *sSysCurdDemo) MaxSort(ctx context.Context, in *sysin.CurdDemoMaxSortInp
|
||||
return
|
||||
}
|
||||
|
||||
// View 获取生成演示指定信息
|
||||
// View 获取CURD列表指定信息
|
||||
func (s *sSysCurdDemo) View(ctx context.Context, in *sysin.CurdDemoViewInp) (res *sysin.CurdDemoViewModel, err error) {
|
||||
if err = s.Model(ctx).WherePri(in.Id).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取生成演示信息,请稍后重试!")
|
||||
if err = s.Model(ctx).WherePri(in.Id).Hook(hook.MemberSummary).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取CURD列表信息,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Status 更新生成演示状态
|
||||
func (s *sSysCurdDemo) Status(ctx context.Context, in *sysin.CurdDemoStatusInp) (err error) {
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Data(g.Map{
|
||||
dao.SysGenCurdDemo.Columns().Status: in.Status,
|
||||
dao.SysGenCurdDemo.Columns().UpdatedBy: contexts.GetUserId(ctx),
|
||||
}).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "更新生成演示状态失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Switch 更新生成演示开关
|
||||
// Switch 更新CURD列表开关
|
||||
func (s *sSysCurdDemo) Switch(ctx context.Context, in *sysin.CurdDemoSwitchInp) (err error) {
|
||||
var fields = []string{
|
||||
dao.SysGenCurdDemo.Columns().Switch,
|
||||
|
||||
// ...
|
||||
}
|
||||
|
||||
@@ -211,7 +218,7 @@ func (s *sSysCurdDemo) Switch(ctx context.Context, in *sysin.CurdDemoSwitchInp)
|
||||
in.Key: in.Value,
|
||||
dao.SysGenCurdDemo.Columns().UpdatedBy: contexts.GetUserId(ctx),
|
||||
}).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "更新生成演示开关失败,请稍后重试!")
|
||||
err = gerror.Wrap(err, "更新CURD列表开关失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
|
@@ -84,12 +84,14 @@ func (s *sSysDictData) List(ctx context.Context, in *sysin.DictDataListInp) (lis
|
||||
mod = mod.Where("type", in.Type)
|
||||
}
|
||||
|
||||
// 访问路径
|
||||
if in.Value != "" {
|
||||
mod = mod.Where("value", in.Value)
|
||||
}
|
||||
|
||||
if in.Label != "" {
|
||||
mod = mod.WhereLike("label", "%"+in.Label+"%")
|
||||
}
|
||||
|
||||
// 请求方式
|
||||
if in.Status > 0 {
|
||||
mod = mod.Where("status", in.Status)
|
||||
}
|
||||
|
@@ -335,7 +335,7 @@ func (s *sSysEmsLog) AllowSend(ctx context.Context, models *entity.SysEmsLog, co
|
||||
}
|
||||
|
||||
if config.MaxIpLimit > 0 {
|
||||
count, err := s.NowDayCount(ctx, models.Event, models.Email)
|
||||
count, err := s.NowDayIpSendCount(ctx, models.Event)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -348,10 +348,10 @@ func (s *sSysEmsLog) AllowSend(ctx context.Context, models *entity.SysEmsLog, co
|
||||
return
|
||||
}
|
||||
|
||||
// NowDayCount 当天发送次数
|
||||
func (s *sSysEmsLog) NowDayCount(ctx context.Context, event, email string) (count int, err error) {
|
||||
// NowDayIpSendCount 当天IP累计发送次数
|
||||
func (s *sSysEmsLog) NowDayIpSendCount(ctx context.Context, event string) (count int, err error) {
|
||||
return dao.SysEmsLog.Ctx(ctx).
|
||||
Where("email", email).
|
||||
Where("ip", location.GetClientIp(ghttp.RequestFromCtx(ctx))).
|
||||
Where("event", event).
|
||||
WhereGTE("created_at", gtime.Now().Format("Y-m-d")).
|
||||
Count()
|
||||
|
@@ -61,7 +61,7 @@ func (s *sSysLog) Export(ctx context.Context, in *sysin.LogListInp) (err error)
|
||||
|
||||
var (
|
||||
titleList = []string{"ID", "应用", "提交类型", "模块", "提交url", "ip地址", "报错code", "报错信息", "对外id", "请求耗时", "创建时间", "用户", "访问地"}
|
||||
fileName = "访问日志导出-" + gctx.CtxId(ctx) + ".xlsx"
|
||||
fileName = "访问日志导出-" + gctx.CtxId(ctx)
|
||||
sheetName = simple.AppName(ctx)
|
||||
exportList []exportImage
|
||||
row exportImage
|
||||
@@ -168,7 +168,6 @@ func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog {
|
||||
}
|
||||
|
||||
// 请求头
|
||||
|
||||
if reqHeadersBytes, _ := gjson.New(request.Header).MarshalJSON(); len(reqHeadersBytes) > 0 {
|
||||
headerData = gjson.New(reqHeadersBytes)
|
||||
}
|
||||
@@ -216,7 +215,7 @@ func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog {
|
||||
MemberId: memberId,
|
||||
Method: request.Method,
|
||||
Module: module,
|
||||
Url: request.RequestURI,
|
||||
Url: request.URL.Path,
|
||||
GetData: getData,
|
||||
PostData: postData,
|
||||
HeaderData: headerData,
|
||||
@@ -246,7 +245,7 @@ func (s *sSysLog) View(ctx context.Context, in *sysin.LogViewInp) (res *sysin.Lo
|
||||
return
|
||||
}
|
||||
|
||||
if g.Cfg().MustGet(ctx, "hotgo.isDemo", false).Bool() {
|
||||
if simple.IsDemo(ctx) {
|
||||
res.HeaderData = gjson.New(`{
|
||||
"none": [
|
||||
"` + consts.DemoTips + `"
|
||||
@@ -315,7 +314,6 @@ func (s *sSysLog) List(ctx context.Context, in *sysin.LogListInp) (list []*sysin
|
||||
return
|
||||
}
|
||||
|
||||
isDemo := g.Cfg().MustGet(ctx, "hotgo.isDemo", false).Bool()
|
||||
for i := 0; i < len(list); i++ {
|
||||
// 管理员
|
||||
if list[i].AppId == consts.AppAdmin {
|
||||
@@ -339,7 +337,7 @@ func (s *sSysLog) List(ctx context.Context, in *sysin.LogListInp) (list []*sysin
|
||||
list[i].Url = gstr.StrTillEx(list[i].Url, "?")
|
||||
}
|
||||
|
||||
if isDemo {
|
||||
if simple.IsDemo(ctx) {
|
||||
list[i].HeaderData = gjson.New(`{
|
||||
"none": [
|
||||
"` + consts.DemoTips + `"
|
||||
|
@@ -18,7 +18,6 @@ import (
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"hotgo/internal/consts"
|
||||
"hotgo/internal/dao"
|
||||
"hotgo/internal/library/hgorm"
|
||||
"hotgo/internal/library/hgorm/handler"
|
||||
"hotgo/internal/library/hgorm/hook"
|
||||
"hotgo/internal/library/location"
|
||||
@@ -63,8 +62,8 @@ func (s *sSysLoginLog) List(ctx context.Context, in *sysin.LoginLogListInp) (lis
|
||||
}
|
||||
|
||||
// 查询IP地址
|
||||
if in.SysLogIp != "" {
|
||||
mod = mod.Where("sysLog."+dao.SysLog.Columns().Ip, in.SysLogIp)
|
||||
if in.LoginIp != "" {
|
||||
mod = mod.Where(dao.SysLoginLog.Columns().LoginIp, in.LoginIp)
|
||||
}
|
||||
|
||||
// 用户名
|
||||
@@ -72,34 +71,23 @@ func (s *sSysLoginLog) List(ctx context.Context, in *sysin.LoginLogListInp) (lis
|
||||
mod = mod.Where(dao.SysLoginLog.Columns().Username, in.Username)
|
||||
}
|
||||
|
||||
// 关联表sysLog
|
||||
mod = mod.LeftJoin(hgorm.GenJoinOnRelation(
|
||||
dao.SysLoginLog.Table(), dao.SysLoginLog.Columns().ReqId, // 主表表名,关联条件
|
||||
dao.SysLog.Table(), "sysLog", dao.SysLog.Columns().ReqId, // 关联表表名,别名,关联条件
|
||||
)...)
|
||||
|
||||
totalCount, err = mod.Clone().Count(1)
|
||||
if err != nil || totalCount == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
// 关联表select
|
||||
fields, err := hgorm.GenJoinSelect(ctx, sysin.LoginLogListModel{}, &dao.SysLoginLog, []*hgorm.Join{
|
||||
{Dao: &dao.SysLog, Alias: "sysLog"},
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if err = mod.Fields(fields).Hook(hook.CityLabel).Handler(handler.FilterAuth).Page(in.Page, in.PerPage).OrderDesc(dao.SysLoginLog.Columns().Id).Scan(&list); err != nil {
|
||||
if err = mod.Fields(sysin.LoginLogListModel{}).Hook(hook.CityLabel).Handler(handler.FilterAuth).Page(in.Page, in.PerPage).OrderDesc(dao.SysLoginLog.Columns().Id).Scan(&list); err != nil {
|
||||
err = gerror.Wrap(err, consts.ErrorORM)
|
||||
return list, totalCount, err
|
||||
}
|
||||
|
||||
for _, v := range list {
|
||||
v.Os = useragent.GetOs(v.SysLogUserAgent)
|
||||
v.Browser = useragent.GetBrowser(v.SysLogUserAgent)
|
||||
v.Os = useragent.GetOs(v.UserAgent)
|
||||
v.Browser = useragent.GetBrowser(v.UserAgent)
|
||||
v.SysLogId, err = dao.SysLog.Ctx(ctx).Fields("id").Where("req_id", v.ReqId).Value()
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -118,7 +106,7 @@ func (s *sSysLoginLog) Export(ctx context.Context, in *sysin.LoginLogListInp) (e
|
||||
}
|
||||
|
||||
var (
|
||||
fileName = "导出登录日志-" + gctx.CtxId(ctx) + ".xlsx"
|
||||
fileName = "导出登录日志-" + gctx.CtxId(ctx)
|
||||
sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, form.CalPageCount(totalCount, in.PerPage), in.Page, len(list))
|
||||
exports []sysin.LoginLogExportModel
|
||||
)
|
||||
@@ -148,12 +136,32 @@ func (s *sSysLoginLog) Push(ctx context.Context, in *sysin.LoginLogPushInp) {
|
||||
if in.Response == nil {
|
||||
in.Response = new(adminin.LoginModel)
|
||||
}
|
||||
|
||||
r := ghttp.RequestFromCtx(ctx)
|
||||
if r == nil {
|
||||
g.Log().Warningf(ctx, "ctx not http request")
|
||||
return
|
||||
}
|
||||
|
||||
clientIp := location.GetClientIp(r)
|
||||
ipData, err := location.GetLocation(ctx, clientIp)
|
||||
if err != nil {
|
||||
g.Log().Debugf(ctx, "location.GetLocation clientIp:%v, err:%+v", clientIp, err)
|
||||
}
|
||||
|
||||
if ipData == nil {
|
||||
ipData = new(location.IpLocationData)
|
||||
}
|
||||
|
||||
var models entity.SysLoginLog
|
||||
models.ReqId = gctx.CtxId(ctx)
|
||||
models.MemberId = in.Response.Id
|
||||
models.Username = in.Response.Username
|
||||
models.LoginAt = gtime.Now()
|
||||
models.LoginIp = location.GetClientIp(ghttp.RequestFromCtx(ctx))
|
||||
models.LoginIp = clientIp
|
||||
models.UserAgent = r.UserAgent()
|
||||
models.ProvinceId = ipData.ProvinceCode
|
||||
models.CityId = ipData.CityCode
|
||||
models.Status = consts.StatusEnabled
|
||||
|
||||
if in.Err != nil {
|
||||
@@ -166,8 +174,8 @@ func (s *sSysLoginLog) Push(ctx context.Context, in *sysin.LoginLogPushInp) {
|
||||
models.Response = gjson.New(in.Response)
|
||||
}
|
||||
|
||||
if err := queue.Push(consts.QueueLoginLogTopic, models); err != nil {
|
||||
g.Log().Warningf(ctx, "push err:%+v, models:%+v", err, models)
|
||||
if err = queue.Push(consts.QueueLoginLogTopic, models); err != nil {
|
||||
g.Log().Warningf(ctx, "push LoginLog err:%+v, models:%v", err, gjson.New(models).String())
|
||||
}
|
||||
}
|
||||
|
||||
|
176
server/internal/logic/sys/normal_tree_demo.go
Normal file
176
server/internal/logic/sys/normal_tree_demo.go
Normal file
@@ -0,0 +1,176 @@
|
||||
// Package sys
|
||||
// @Link https://github.com/bufanyun/hotgo
|
||||
// @Copyright Copyright (c) 2024 HotGo CLI
|
||||
// @Author Ms <133814250@qq.com>
|
||||
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
||||
// @AutoGenerate Version 2.13.1
|
||||
package sys
|
||||
|
||||
import (
|
||||
"context"
|
||||
"hotgo/internal/consts"
|
||||
"hotgo/internal/dao"
|
||||
"hotgo/internal/library/contexts"
|
||||
"hotgo/internal/library/hgorm"
|
||||
"hotgo/internal/library/hgorm/handler"
|
||||
"hotgo/internal/library/hgorm/hook"
|
||||
"hotgo/internal/model/input/form"
|
||||
"hotgo/internal/model/input/sysin"
|
||||
"hotgo/internal/service"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
|
||||
"hotgo/utility/tree"
|
||||
)
|
||||
|
||||
type sSysNormalTreeDemo struct{}
|
||||
|
||||
func NewSysNormalTreeDemo() *sSysNormalTreeDemo {
|
||||
return &sSysNormalTreeDemo{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterSysNormalTreeDemo(NewSysNormalTreeDemo())
|
||||
}
|
||||
|
||||
// Model 普通树表ORM模型
|
||||
func (s *sSysNormalTreeDemo) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
|
||||
return handler.Model(dao.SysGenTreeDemo.Ctx(ctx), option...)
|
||||
}
|
||||
|
||||
// List 获取普通树表列表
|
||||
func (s *sSysNormalTreeDemo) List(ctx context.Context, in *sysin.NormalTreeDemoListInp) (list []*sysin.NormalTreeDemoListModel, totalCount int, err error) {
|
||||
mod := s.Model(ctx)
|
||||
|
||||
// 字段过滤
|
||||
mod = mod.Fields(sysin.NormalTreeDemoListModel{})
|
||||
|
||||
// 查询标题
|
||||
if in.Title != "" {
|
||||
mod = mod.WhereLike(dao.SysGenTreeDemo.Columns().Title, "%"+in.Title+"%")
|
||||
}
|
||||
|
||||
// 查询上级
|
||||
if in.Pid > 0 {
|
||||
mod = mod.Where(dao.SysGenTreeDemo.Columns().Pid, in.Pid)
|
||||
}
|
||||
|
||||
// 查询测试分类
|
||||
if in.CategoryId > 0 {
|
||||
mod = mod.Where(dao.SysGenTreeDemo.Columns().CategoryId, in.CategoryId)
|
||||
}
|
||||
|
||||
// 查询状态
|
||||
if in.Status > 0 {
|
||||
mod = mod.Where(dao.SysGenTreeDemo.Columns().Status, in.Status)
|
||||
}
|
||||
|
||||
// 查询创建时间
|
||||
if len(in.CreatedAt) == 2 {
|
||||
mod = mod.WhereBetween(dao.SysGenTreeDemo.Columns().CreatedAt, in.CreatedAt[0], in.CreatedAt[1])
|
||||
}
|
||||
|
||||
// 树形列表判断是否需要分页
|
||||
if in.Pagination {
|
||||
mod = mod.Page(in.Page, in.PerPage)
|
||||
}
|
||||
|
||||
// 排序
|
||||
mod = mod.OrderAsc(dao.SysGenTreeDemo.Columns().Sort).OrderDesc(dao.SysGenTreeDemo.Columns().Id)
|
||||
|
||||
// 操作人摘要信息
|
||||
mod = mod.Hook(hook.MemberSummary)
|
||||
|
||||
// 查询数据
|
||||
if err = mod.ScanAndCount(&list, &totalCount, false); err != nil {
|
||||
err = gerror.Wrap(err, "获取普通树表列表失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Edit 修改/新增普通树表
|
||||
func (s *sSysNormalTreeDemo) Edit(ctx context.Context, in *sysin.NormalTreeDemoEditInp) (err error) {
|
||||
return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
|
||||
in.Pid, in.Level, in.Tree, err = hgorm.AutoUpdateTree(ctx, &dao.SysGenTreeDemo, in.Id, in.Pid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
in.UpdatedBy = contexts.GetUserId(ctx)
|
||||
if _, err = s.Model(ctx).
|
||||
Fields(sysin.NormalTreeDemoUpdateFields{}).
|
||||
WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "修改普通树表失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 新增
|
||||
in.CreatedBy = contexts.GetUserId(ctx)
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).
|
||||
Fields(sysin.NormalTreeDemoInsertFields{}).
|
||||
Data(in).Insert(); err != nil {
|
||||
err = gerror.Wrap(err, "新增普通树表失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
})
|
||||
}
|
||||
|
||||
// Delete 删除普通树表
|
||||
func (s *sSysNormalTreeDemo) Delete(ctx context.Context, in *sysin.NormalTreeDemoDeleteInp) (err error) {
|
||||
count, err := dao.SysGenTreeDemo.Ctx(ctx).Where(dao.SysGenTreeDemo.Columns().Pid, in.Id).Count()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, consts.ErrorORM)
|
||||
return err
|
||||
}
|
||||
if count > 0 {
|
||||
return gerror.New("请先删除该普通树表下的所有下级!")
|
||||
}
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Delete(); err != nil {
|
||||
err = gerror.Wrap(err, "删除普通树表失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// MaxSort 获取普通树表最大排序
|
||||
func (s *sSysNormalTreeDemo) MaxSort(ctx context.Context, in *sysin.NormalTreeDemoMaxSortInp) (res *sysin.NormalTreeDemoMaxSortModel, err error) {
|
||||
if err = dao.SysGenTreeDemo.Ctx(ctx).Fields(dao.SysGenTreeDemo.Columns().Sort).OrderDesc(dao.SysGenTreeDemo.Columns().Sort).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取普通树表最大排序,请稍后重试!")
|
||||
return
|
||||
}
|
||||
|
||||
if res == nil {
|
||||
res = new(sysin.NormalTreeDemoMaxSortModel)
|
||||
}
|
||||
|
||||
res.Sort = form.DefaultMaxSort(res.Sort)
|
||||
return
|
||||
}
|
||||
|
||||
// View 获取普通树表指定信息
|
||||
func (s *sSysNormalTreeDemo) View(ctx context.Context, in *sysin.NormalTreeDemoViewInp) (res *sysin.NormalTreeDemoViewModel, err error) {
|
||||
if err = s.Model(ctx).WherePri(in.Id).Hook(hook.MemberSummary).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取普通树表信息,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// TreeOption 获取普通树表关系树选项
|
||||
func (s *sSysNormalTreeDemo) TreeOption(ctx context.Context) (nodes []tree.Node, err error) {
|
||||
var models []*sysin.NormalTreeDemoTreeOption
|
||||
if err = s.Model(ctx).Fields(sysin.NormalTreeDemoTreeOption{}).OrderAsc(dao.SysGenTreeDemo.Columns().Pid).OrderAsc(dao.SysGenTreeDemo.Columns().Sort).OrderDesc(dao.SysGenTreeDemo.Columns().Id).Scan(&models); err != nil {
|
||||
err = gerror.Wrap(err, "获取普通树表关系树选项失败!")
|
||||
return
|
||||
}
|
||||
nodes = make([]tree.Node, len(models))
|
||||
for i, v := range models {
|
||||
nodes[i] = v
|
||||
}
|
||||
return tree.ListToTree(0, nodes)
|
||||
}
|
176
server/internal/logic/sys/option_tree_demo.go
Normal file
176
server/internal/logic/sys/option_tree_demo.go
Normal file
@@ -0,0 +1,176 @@
|
||||
// Package sys
|
||||
// @Link https://github.com/bufanyun/hotgo
|
||||
// @Copyright Copyright (c) 2024 HotGo CLI
|
||||
// @Author Ms <133814250@qq.com>
|
||||
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
||||
// @AutoGenerate Version 2.13.1
|
||||
package sys
|
||||
|
||||
import (
|
||||
"context"
|
||||
"hotgo/internal/consts"
|
||||
"hotgo/internal/dao"
|
||||
"hotgo/internal/library/contexts"
|
||||
"hotgo/internal/library/hgorm"
|
||||
"hotgo/internal/library/hgorm/handler"
|
||||
"hotgo/internal/library/hgorm/hook"
|
||||
"hotgo/internal/model/input/form"
|
||||
"hotgo/internal/model/input/sysin"
|
||||
"hotgo/internal/service"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
|
||||
"hotgo/utility/tree"
|
||||
)
|
||||
|
||||
type sSysOptionTreeDemo struct{}
|
||||
|
||||
func NewSysOptionTreeDemo() *sSysOptionTreeDemo {
|
||||
return &sSysOptionTreeDemo{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterSysOptionTreeDemo(NewSysOptionTreeDemo())
|
||||
}
|
||||
|
||||
// Model 选项树表ORM模型
|
||||
func (s *sSysOptionTreeDemo) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
|
||||
return handler.Model(dao.SysGenTreeDemo.Ctx(ctx), option...)
|
||||
}
|
||||
|
||||
// List 获取选项树表列表
|
||||
func (s *sSysOptionTreeDemo) List(ctx context.Context, in *sysin.OptionTreeDemoListInp) (list []*sysin.OptionTreeDemoListModel, totalCount int, err error) {
|
||||
mod := s.Model(ctx)
|
||||
|
||||
// 字段过滤
|
||||
mod = mod.Fields(sysin.OptionTreeDemoListModel{})
|
||||
|
||||
// 查询标题
|
||||
if in.Title != "" {
|
||||
mod = mod.WhereLike(dao.SysGenTreeDemo.Columns().Title, "%"+in.Title+"%")
|
||||
}
|
||||
|
||||
// 查询上级
|
||||
if in.Pid > 0 {
|
||||
mod = mod.Where(dao.SysGenTreeDemo.Columns().Pid, in.Pid)
|
||||
}
|
||||
|
||||
// 查询测试分类
|
||||
if in.CategoryId > 0 {
|
||||
mod = mod.Where(dao.SysGenTreeDemo.Columns().CategoryId, in.CategoryId)
|
||||
}
|
||||
|
||||
// 查询状态
|
||||
if in.Status > 0 {
|
||||
mod = mod.Where(dao.SysGenTreeDemo.Columns().Status, in.Status)
|
||||
}
|
||||
|
||||
// 查询创建时间
|
||||
if len(in.CreatedAt) == 2 {
|
||||
mod = mod.WhereBetween(dao.SysGenTreeDemo.Columns().CreatedAt, in.CreatedAt[0], in.CreatedAt[1])
|
||||
}
|
||||
|
||||
// 树形列表判断是否需要分页
|
||||
if in.Pagination {
|
||||
mod = mod.Page(in.Page, in.PerPage)
|
||||
}
|
||||
|
||||
// 排序
|
||||
mod = mod.OrderAsc(dao.SysGenTreeDemo.Columns().Sort).OrderDesc(dao.SysGenTreeDemo.Columns().Id)
|
||||
|
||||
// 操作人摘要信息
|
||||
mod = mod.Hook(hook.MemberSummary)
|
||||
|
||||
// 查询数据
|
||||
if err = mod.ScanAndCount(&list, &totalCount, false); err != nil {
|
||||
err = gerror.Wrap(err, "获取选项树表列表失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Edit 修改/新增选项树表
|
||||
func (s *sSysOptionTreeDemo) Edit(ctx context.Context, in *sysin.OptionTreeDemoEditInp) (err error) {
|
||||
return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
|
||||
in.Pid, in.Level, in.Tree, err = hgorm.AutoUpdateTree(ctx, &dao.SysGenTreeDemo, in.Id, in.Pid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
in.UpdatedBy = contexts.GetUserId(ctx)
|
||||
if _, err = s.Model(ctx).
|
||||
Fields(sysin.OptionTreeDemoUpdateFields{}).
|
||||
WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "修改选项树表失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 新增
|
||||
in.CreatedBy = contexts.GetUserId(ctx)
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).
|
||||
Fields(sysin.OptionTreeDemoInsertFields{}).
|
||||
Data(in).Insert(); err != nil {
|
||||
err = gerror.Wrap(err, "新增选项树表失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
})
|
||||
}
|
||||
|
||||
// Delete 删除选项树表
|
||||
func (s *sSysOptionTreeDemo) Delete(ctx context.Context, in *sysin.OptionTreeDemoDeleteInp) (err error) {
|
||||
count, err := dao.SysGenTreeDemo.Ctx(ctx).Where(dao.SysGenTreeDemo.Columns().Pid, in.Id).Count()
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, consts.ErrorORM)
|
||||
return err
|
||||
}
|
||||
if count > 0 {
|
||||
return gerror.New("请先删除该选项树表下的所有下级!")
|
||||
}
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Delete(); err != nil {
|
||||
err = gerror.Wrap(err, "删除选项树表失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// MaxSort 获取选项树表最大排序
|
||||
func (s *sSysOptionTreeDemo) MaxSort(ctx context.Context, in *sysin.OptionTreeDemoMaxSortInp) (res *sysin.OptionTreeDemoMaxSortModel, err error) {
|
||||
if err = dao.SysGenTreeDemo.Ctx(ctx).Fields(dao.SysGenTreeDemo.Columns().Sort).OrderDesc(dao.SysGenTreeDemo.Columns().Sort).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取选项树表最大排序,请稍后重试!")
|
||||
return
|
||||
}
|
||||
|
||||
if res == nil {
|
||||
res = new(sysin.OptionTreeDemoMaxSortModel)
|
||||
}
|
||||
|
||||
res.Sort = form.DefaultMaxSort(res.Sort)
|
||||
return
|
||||
}
|
||||
|
||||
// View 获取选项树表指定信息
|
||||
func (s *sSysOptionTreeDemo) View(ctx context.Context, in *sysin.OptionTreeDemoViewInp) (res *sysin.OptionTreeDemoViewModel, err error) {
|
||||
if err = s.Model(ctx).WherePri(in.Id).Hook(hook.MemberSummary).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取选项树表信息,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// TreeOption 获取选项树表关系树选项
|
||||
func (s *sSysOptionTreeDemo) TreeOption(ctx context.Context) (nodes []tree.Node, err error) {
|
||||
var models []*sysin.OptionTreeDemoTreeOption
|
||||
if err = s.Model(ctx).Fields(sysin.OptionTreeDemoTreeOption{}).OrderAsc(dao.SysGenTreeDemo.Columns().Pid).OrderAsc(dao.SysGenTreeDemo.Columns().Sort).OrderDesc(dao.SysGenTreeDemo.Columns().Id).Scan(&models); err != nil {
|
||||
err = gerror.Wrap(err, "获取选项树表关系树选项失败!")
|
||||
return
|
||||
}
|
||||
nodes = make([]tree.Node, len(models))
|
||||
for i, v := range models {
|
||||
nodes[i] = v
|
||||
}
|
||||
return tree.ListToTree(0, nodes)
|
||||
}
|
@@ -114,7 +114,7 @@ func (s *sSysServeLicense) Export(ctx context.Context, in *sysin.ServeLicenseLis
|
||||
}
|
||||
|
||||
var (
|
||||
fileName = "导出服务许可证-" + gctx.CtxId(ctx) + ".xlsx"
|
||||
fileName = "导出服务许可证-" + gctx.CtxId(ctx)
|
||||
sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, form.CalPageCount(totalCount, in.PerPage), in.Page, len(list))
|
||||
exports []sysin.ServeLicenseExportModel
|
||||
)
|
||||
|
@@ -99,7 +99,7 @@ func (s *sSysServeLog) Export(ctx context.Context, in *sysin.ServeLogListInp) (e
|
||||
}
|
||||
|
||||
var (
|
||||
fileName = "导出服务日志-" + gctx.CtxId(ctx) + ".xlsx"
|
||||
fileName = "导出服务日志-" + gctx.CtxId(ctx)
|
||||
sheetName = fmt.Sprintf("索引条件共%v行,共%v页,当前导出是第%v页,本页共%v行", totalCount, form.CalPageCount(totalCount, in.PerPage), in.Page, len(list))
|
||||
exports []sysin.ServeLogExportModel
|
||||
)
|
||||
|
@@ -20,7 +20,6 @@ import (
|
||||
"hotgo/internal/model/entity"
|
||||
"hotgo/internal/model/input/sysin"
|
||||
"hotgo/internal/service"
|
||||
"hotgo/utility/validate"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -40,46 +39,6 @@ func (s *sSysSmsLog) Delete(ctx context.Context, in *sysin.SmsLogDeleteInp) (err
|
||||
return
|
||||
}
|
||||
|
||||
// Edit 修改/新增
|
||||
func (s *sSysSmsLog) Edit(ctx context.Context, in *sysin.SmsLogEditInp) (err error) {
|
||||
if in.Ip == "" {
|
||||
err = gerror.New("ip不能为空")
|
||||
return
|
||||
}
|
||||
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
_, err = dao.SysSmsLog.Ctx(ctx).WherePri(in.Id).Data(in).Update()
|
||||
return
|
||||
}
|
||||
|
||||
// 新增
|
||||
_, err = dao.SysSmsLog.Ctx(ctx).Data(in).Insert()
|
||||
return
|
||||
}
|
||||
|
||||
// Status 更新短信状态
|
||||
func (s *sSysSmsLog) Status(ctx context.Context, in *sysin.SmsLogStatusInp) (err error) {
|
||||
if in.Id <= 0 {
|
||||
err = gerror.New("ID不能为空")
|
||||
return
|
||||
}
|
||||
|
||||
if in.Status <= 0 {
|
||||
err = gerror.New("状态不能为空")
|
||||
return
|
||||
}
|
||||
|
||||
if !validate.InSlice(consts.StatusSlice, in.Status) {
|
||||
err = gerror.New("状态不正确")
|
||||
return
|
||||
}
|
||||
|
||||
// 修改
|
||||
_, err = dao.SysSmsLog.Ctx(ctx).WherePri(in.Id).Data(dao.SysSmsLog.Columns().Status, in.Status).Update()
|
||||
return
|
||||
}
|
||||
|
||||
// View 获取指定字典类型信息
|
||||
func (s *sSysSmsLog) View(ctx context.Context, in *sysin.SmsLogViewInp) (res *sysin.SmsLogViewModel, err error) {
|
||||
if err = dao.SysSmsLog.Ctx(ctx).WherePri(in.Id).Scan(&res); err != nil {
|
||||
@@ -245,7 +204,7 @@ func (s *sSysSmsLog) AllowSend(ctx context.Context, models *entity.SysSmsLog, co
|
||||
}
|
||||
|
||||
if config.SmsMaxIpLimit > 0 {
|
||||
count, err := s.NowDayCount(ctx, models.Event, models.Mobile)
|
||||
count, err := s.NowDayIpSendCount(ctx, models.Event)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -258,10 +217,10 @@ func (s *sSysSmsLog) AllowSend(ctx context.Context, models *entity.SysSmsLog, co
|
||||
return
|
||||
}
|
||||
|
||||
// NowDayCount 当天发送次数
|
||||
func (s *sSysSmsLog) NowDayCount(ctx context.Context, event, mobile string) (count int, err error) {
|
||||
// NowDayIpSendCount 当天IP累计发送次数
|
||||
func (s *sSysSmsLog) NowDayIpSendCount(ctx context.Context, event string) (count int, err error) {
|
||||
return dao.SysSmsLog.Ctx(ctx).
|
||||
Where("mobile", mobile).
|
||||
Where("ip", location.GetClientIp(ghttp.RequestFromCtx(ctx))).
|
||||
Where("event", event).
|
||||
WhereGTE("created_at", gtime.Now().Format("Y-m-d")).
|
||||
Count()
|
||||
|
167
server/internal/logic/sys/test_category.go
Normal file
167
server/internal/logic/sys/test_category.go
Normal file
@@ -0,0 +1,167 @@
|
||||
// Package sys
|
||||
// @Link https://github.com/bufanyun/hotgo
|
||||
// @Copyright Copyright (c) 2024 HotGo CLI
|
||||
// @Author Ms <133814250@qq.com>
|
||||
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
||||
// @AutoGenerate Version 2.13.1
|
||||
package sys
|
||||
|
||||
import (
|
||||
"context"
|
||||
"hotgo/internal/dao"
|
||||
"hotgo/internal/library/hgorm/handler"
|
||||
"hotgo/internal/model/entity"
|
||||
"hotgo/internal/model/input/form"
|
||||
"hotgo/internal/model/input/sysin"
|
||||
"hotgo/internal/service"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
|
||||
"hotgo/internal/library/dict"
|
||||
"hotgo/internal/model"
|
||||
)
|
||||
|
||||
type sSysTestCategory struct{}
|
||||
|
||||
func NewSysTestCategory() *sSysTestCategory {
|
||||
return &sSysTestCategory{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterSysTestCategory(NewSysTestCategory())
|
||||
dict.RegisterFunc("testCategoryOption", "测试分类选项", service.SysTestCategory().Option)
|
||||
}
|
||||
|
||||
// Model 测试分类ORM模型
|
||||
func (s *sSysTestCategory) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
|
||||
return handler.Model(dao.TestCategory.Ctx(ctx), option...)
|
||||
}
|
||||
|
||||
// List 获取测试分类列表
|
||||
func (s *sSysTestCategory) List(ctx context.Context, in *sysin.TestCategoryListInp) (list []*sysin.TestCategoryListModel, totalCount int, err error) {
|
||||
mod := s.Model(ctx)
|
||||
|
||||
// 字段过滤
|
||||
mod = mod.Fields(sysin.TestCategoryListModel{})
|
||||
|
||||
// 查询分类ID
|
||||
if in.Id > 0 {
|
||||
mod = mod.Where(dao.TestCategory.Columns().Id, in.Id)
|
||||
}
|
||||
|
||||
// 查询分类名称
|
||||
if in.Name != "" {
|
||||
mod = mod.WhereLike(dao.TestCategory.Columns().Name, "%"+in.Name+"%")
|
||||
}
|
||||
|
||||
// 查询状态
|
||||
if in.Status > 0 {
|
||||
mod = mod.Where(dao.TestCategory.Columns().Status, in.Status)
|
||||
}
|
||||
|
||||
// 查询创建时间
|
||||
if len(in.CreatedAt) == 2 {
|
||||
mod = mod.WhereBetween(dao.TestCategory.Columns().CreatedAt, in.CreatedAt[0], in.CreatedAt[1])
|
||||
}
|
||||
|
||||
// 分页
|
||||
mod = mod.Page(in.Page, in.PerPage)
|
||||
|
||||
// 排序
|
||||
mod = mod.OrderAsc(dao.TestCategory.Columns().Sort).OrderDesc(dao.TestCategory.Columns().Id)
|
||||
|
||||
// 查询数据
|
||||
if err = mod.ScanAndCount(&list, &totalCount, false); err != nil {
|
||||
err = gerror.Wrap(err, "获取测试分类列表失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Edit 修改/新增测试分类
|
||||
func (s *sSysTestCategory) Edit(ctx context.Context, in *sysin.TestCategoryEditInp) (err error) {
|
||||
return g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
|
||||
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
if _, err = s.Model(ctx).
|
||||
Fields(sysin.TestCategoryUpdateFields{}).
|
||||
WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "修改测试分类失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 新增
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).
|
||||
Fields(sysin.TestCategoryInsertFields{}).
|
||||
Data(in).Insert(); err != nil {
|
||||
err = gerror.Wrap(err, "新增测试分类失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
})
|
||||
}
|
||||
|
||||
// Delete 删除测试分类
|
||||
func (s *sSysTestCategory) Delete(ctx context.Context, in *sysin.TestCategoryDeleteInp) (err error) {
|
||||
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Delete(); err != nil {
|
||||
err = gerror.Wrap(err, "删除测试分类失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// MaxSort 获取测试分类最大排序
|
||||
func (s *sSysTestCategory) MaxSort(ctx context.Context, in *sysin.TestCategoryMaxSortInp) (res *sysin.TestCategoryMaxSortModel, err error) {
|
||||
if err = dao.TestCategory.Ctx(ctx).Fields(dao.TestCategory.Columns().Sort).OrderDesc(dao.TestCategory.Columns().Sort).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取测试分类最大排序,请稍后重试!")
|
||||
return
|
||||
}
|
||||
|
||||
if res == nil {
|
||||
res = new(sysin.TestCategoryMaxSortModel)
|
||||
}
|
||||
|
||||
res.Sort = form.DefaultMaxSort(res.Sort)
|
||||
return
|
||||
}
|
||||
|
||||
// View 获取测试分类指定信息
|
||||
func (s *sSysTestCategory) View(ctx context.Context, in *sysin.TestCategoryViewInp) (res *sysin.TestCategoryViewModel, err error) {
|
||||
if err = s.Model(ctx).WherePri(in.Id).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取测试分类信息,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Status 更新测试分类状态
|
||||
func (s *sSysTestCategory) Status(ctx context.Context, in *sysin.TestCategoryStatusInp) (err error) {
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Data(g.Map{
|
||||
dao.TestCategory.Columns().Status: in.Status,
|
||||
}).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "更新测试分类状态失败,请稍后重试!")
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Option 获取测试分类选项
|
||||
func (s *sSysTestCategory) Option(ctx context.Context) (opts []*model.Option, err error) {
|
||||
var models []*entity.TestCategory
|
||||
if err = s.Model(ctx).Fields(dao.TestCategory.Columns().Id, dao.TestCategory.Columns().Name).
|
||||
OrderAsc(dao.TestCategory.Columns().Sort).OrderDesc(dao.TestCategory.Columns().Id).Scan(&models); err != nil {
|
||||
err = gerror.Wrap(err, "获取测试分类选项失败!")
|
||||
return
|
||||
}
|
||||
|
||||
opts = make([]*model.Option, len(models))
|
||||
for k, v := range models {
|
||||
opts[k] = dict.GenHashOption(v.Id, gconv.String(v.Name))
|
||||
}
|
||||
return
|
||||
}
|
@@ -108,3 +108,11 @@ func (s *sAuthClient) onLoginEvent() {
|
||||
func (s *sAuthClient) onCloseEvent() {
|
||||
g.Log().Debug(gctx.New(), "AuthClient closed.")
|
||||
}
|
||||
|
||||
// Summary 获取授权信息
|
||||
func (s *sAuthClient) Summary() *servmsgin.AuthSummaryModel {
|
||||
if s.summary == nil {
|
||||
s.summary = new(servmsgin.AuthSummaryModel)
|
||||
}
|
||||
return s.summary
|
||||
}
|
||||
|
@@ -9,7 +9,12 @@ import (
|
||||
"context"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gfile"
|
||||
"github.com/gogf/gf/v2/os/gres"
|
||||
"github.com/gogf/gf/v2/text/gstr"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"hotgo/internal/library/addons"
|
||||
"hotgo/internal/library/contexts"
|
||||
"hotgo/internal/model"
|
||||
"hotgo/internal/service"
|
||||
"hotgo/utility/charset"
|
||||
@@ -77,6 +82,24 @@ func (s *sView) RenderTpl(ctx context.Context, tpl string, data ...model.View) {
|
||||
// 内置对象
|
||||
viewData["BuildIn"] = &viewBuildIn{httpRequest: request}
|
||||
|
||||
// 插件模板,兼容从资源文件中读取
|
||||
if addonName := contexts.GetAddonName(ctx); len(addonName) > 0 {
|
||||
basePath := addons.GetResourcePath(ctx)
|
||||
if len(basePath) > 0 && !gstr.Contains(tpl, basePath) {
|
||||
path := addons.ViewPath(addonName, basePath)
|
||||
tpl = path + "/" + tpl
|
||||
}
|
||||
|
||||
content := ""
|
||||
if !gres.IsEmpty() {
|
||||
content = string(gres.GetContent(tpl))
|
||||
} else {
|
||||
content = gfile.GetContents(tpl)
|
||||
}
|
||||
_ = request.Response.WriteTplContent(content, viewData)
|
||||
return
|
||||
}
|
||||
|
||||
// 渲染模板
|
||||
_ = request.Response.WriteTpl(tpl, viewData)
|
||||
}
|
||||
@@ -95,7 +118,7 @@ func (s *sView) Error(ctx context.Context, err error) {
|
||||
)
|
||||
|
||||
// 是否输出错误堆栈到页面
|
||||
if g.Cfg().MustGet(ctx, "hotgo.debug", true).Bool() {
|
||||
if simple.Debug(ctx) {
|
||||
stack = charset.SerializeStack(err)
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user