This commit is contained in:
孟帅
2024-04-22 23:08:40 +08:00
parent 82483bd7b9
commit e144b12580
445 changed files with 17457 additions and 6708 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

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