This commit is contained in:
孟帅
2023-05-10 23:54:50 +08:00
parent bbe655a4d8
commit 49a96750bf
314 changed files with 15138 additions and 6244 deletions

View File

@@ -113,9 +113,9 @@ func (s *sSysAddons) Selects(ctx context.Context, in sysin.AddonsSelectsInp) (re
Label: v,
})
}
sort.Sort(res.Status)
return res, nil
sort.Sort(res.Status)
return
}
// Build 提交生成

View File

@@ -34,11 +34,15 @@ func init() {
// GetConfigByGroup 获取指定分组的配置
func (s *sSysAddonsConfig) GetConfigByGroup(ctx context.Context, in sysin.GetAddonsConfigInp) (res *sysin.GetAddonsConfigModel, err error) {
if in.AddonName == "" {
return nil, gerror.New("插件名称不能为空")
err = gerror.New("插件名称不能为空")
return
}
if in.Group == "" {
return nil, gerror.New("分组不能为空")
err = gerror.New("分组不能为空")
return
}
var (
mod = dao.SysAddonsConfig.Ctx(ctx)
models []*entity.SysAddonsConfig
@@ -67,37 +71,44 @@ func (s *sSysAddonsConfig) GetConfigByGroup(ctx context.Context, in sysin.GetAdd
}
}
}
return
}
// ConversionType 转换类型
func (s *sSysAddonsConfig) ConversionType(ctx context.Context, models *entity.SysAddonsConfig) (value interface{}, err error) {
if models == nil {
return nil, gerror.New("数据不存在")
err = gerror.New("数据不存在")
return
}
return consts.ConvType(models.Value, models.Type), nil
}
// UpdateConfigByGroup 更新指定分组的配置
func (s *sSysAddonsConfig) UpdateConfigByGroup(ctx context.Context, in sysin.UpdateAddonsConfigInp) error {
func (s *sSysAddonsConfig) UpdateConfigByGroup(ctx context.Context, in sysin.UpdateAddonsConfigInp) (err error) {
if in.AddonName == "" {
return gerror.New("插件名称不能为空")
err = gerror.New("插件名称不能为空")
return
}
if in.Group == "" {
return gerror.New("分组不能为空")
err = gerror.New("分组不能为空")
return
}
var (
mod = dao.SysAddonsConfig.Ctx(ctx)
models []*entity.SysAddonsConfig
)
if err := mod.
if err = mod.
Where("addon_name", in.AddonName).
Where("group", in.Group).
Scan(&models); err != nil {
return err
}
err := dao.SysAddonsConfig.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
err = dao.SysAddonsConfig.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
for k, v := range in.List {
row := s.getConfigByKey(k, models)
// 新增
@@ -119,7 +130,7 @@ func (s *sSysAddonsConfig) UpdateConfigByGroup(ctx context.Context, in sysin.Upd
}
// 更新
_, err := dao.SysAddonsConfig.Ctx(ctx).Where("id", row.Id).Data(g.Map{"value": v, "updated_at": gtime.Now()}).Update()
_, err = dao.SysAddonsConfig.Ctx(ctx).Where("id", row.Id).Data(g.Map{"value": v, "updated_at": gtime.Now()}).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err

View File

@@ -3,17 +3,19 @@
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package sys
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gtime"
"hotgo/internal/consts"
"hotgo/internal/dao"
"hotgo/internal/library/contexts"
"hotgo/internal/library/hgorm/handler"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/form"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"hotgo/utility/format"
@@ -30,114 +32,90 @@ func init() {
service.RegisterSysAttachment(NewSysAttachment())
}
// Delete 删除
func (s *sSysAttachment) Delete(ctx context.Context, in sysin.AttachmentDeleteInp) error {
_, err := dao.SysAttachment.Ctx(ctx).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
// Model ORM模型
func (s *sSysAttachment) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
return handler.Model(dao.SysAttachment.Ctx(ctx), option...)
}
return nil
// Delete 删除
func (s *sSysAttachment) Delete(ctx context.Context, in sysin.AttachmentDeleteInp) (err error) {
_, err = s.Model(ctx).Where("id", in.Id).Delete()
return
}
// Edit 修改/新增
func (s *sSysAttachment) Edit(ctx context.Context, in sysin.AttachmentEditInp) (err error) {
if in.Name == "" {
err = gerror.New("标题不能为空")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
if in.Id > 0 {
_, err = dao.SysAttachment.Ctx(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
_, err = s.Model(ctx).Where("id", in.Id).Data(in).Update()
return
}
// 新增
in.CreatedAt = gtime.Now()
_, err = dao.SysAttachment.Ctx(ctx).Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// Status 更新部门状态
func (s *sSysAttachment) Status(ctx context.Context, in sysin.AttachmentStatusInp) (err error) {
if in.Id <= 0 {
err = gerror.New("ID不能为空")
return err
return
}
if in.Status <= 0 {
err = gerror.New("状态不能为空")
return err
return
}
if !validate.InSliceInt(consts.StatusMap, in.Status) {
err = gerror.New("状态不正确")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
_, err = dao.SysAttachment.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
_, err = s.Model(ctx).Where("id", in.Id).Data("status", in.Status).Update()
return
}
// MaxSort 最大排序
func (s *sSysAttachment) MaxSort(ctx context.Context, in sysin.AttachmentMaxSortInp) (*sysin.AttachmentMaxSortModel, error) {
var res sysin.AttachmentMaxSortModel
func (s *sSysAttachment) MaxSort(ctx context.Context, in sysin.AttachmentMaxSortInp) (res *sysin.AttachmentMaxSortModel, err error) {
if in.Id > 0 {
if err := dao.SysAttachment.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
if err = s.Model(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
return
}
}
res.Sort = res.Sort + 10
return &res, nil
if res == nil {
res = new(sysin.AttachmentMaxSortModel)
}
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return
}
// View 获取指定字典类型信息
func (s *sSysAttachment) View(ctx context.Context, in sysin.AttachmentViewInp) (res *sysin.AttachmentViewModel, err error) {
if err = dao.SysAttachment.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
return res, nil
err = s.Model(ctx).Where("id", in.Id).Scan(&res)
return
}
// List 获取列表
func (s *sSysAttachment) List(ctx context.Context, in sysin.AttachmentListInp) (list []*sysin.AttachmentListModel, totalCount int, err error) {
mod := dao.SysAttachment.Ctx(ctx)
mod := s.Model(ctx)
// 访问路径
if in.MemberId > 0 {
mod = mod.Where("member_id", in.MemberId)
}
// 模块
if in.Drive != "" {
mod = mod.Where("drive", in.Drive)
}
// 请求方式
if in.Status > 0 {
mod = mod.Where("status", in.Status)
}
@@ -145,21 +123,21 @@ func (s *sSysAttachment) List(ctx context.Context, in sysin.AttachmentListInp) (
totalCount, err = mod.Count()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
if totalCount == 0 {
return list, totalCount, nil
return
}
if err = mod.Page(in.Page, in.PerPage).Order("updated_at desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
conf, err := service.SysConfig().GetUpload(ctx)
if err != nil {
return list, totalCount, err
return
}
for _, v := range list {
@@ -167,21 +145,22 @@ func (s *sSysAttachment) List(ctx context.Context, in sysin.AttachmentListInp) (
v.FileUrl = service.CommonUpload().LastUrl(ctx, conf, v.FileUrl, v.Drive)
}
return list, totalCount, err
return
}
// Add 新增附件
func (s *sSysAttachment) Add(ctx context.Context, meta *sysin.UploadFileMeta, fullPath, drive string) (data *entity.SysAttachment, err error) {
func (s *sSysAttachment) Add(ctx context.Context, meta *sysin.UploadFileMeta, fullPath, drive string) (models *entity.SysAttachment, err error) {
var (
c = contexts.Get(ctx)
user = c.User
memberId int64 = 0
)
if user != nil {
memberId = user.Id
}
models := &entity.SysAttachment{
models = &entity.SysAttachment{
Id: 0,
AppId: c.Module,
MemberId: memberId,
@@ -201,9 +180,9 @@ func (s *sSysAttachment) Add(ctx context.Context, meta *sysin.UploadFileMeta, fu
}
id, err := dao.SysAttachment.Ctx(ctx).Data(models).InsertAndGetId()
if err != nil {
return nil, gerror.Wrap(err, consts.ErrorORM)
return
}
models.Id = id
return models, nil
return
}

View File

@@ -9,10 +9,10 @@ import (
"context"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"hotgo/internal/consts"
"hotgo/internal/dao"
"hotgo/internal/global"
"hotgo/internal/model/input/form"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"hotgo/utility/convert"
@@ -33,12 +33,7 @@ func init() {
func (s *sSysBlacklist) Delete(ctx context.Context, in sysin.BlacklistDeleteInp) (err error) {
defer s.VariableLoad(ctx, err)
_, err = dao.SysBlacklist.Ctx(ctx).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// Edit 修改/新增
@@ -46,29 +41,18 @@ func (s *sSysBlacklist) Edit(ctx context.Context, in sysin.BlacklistEditInp) (er
defer s.VariableLoad(ctx, err)
if in.Ip == "" {
err = gerror.New("ip不能为空")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
if in.Id > 0 {
_, err = dao.SysBlacklist.Ctx(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// 新增
in.CreatedAt = gtime.Now()
_, err = dao.SysBlacklist.Ctx(ctx).Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// Status 更新部门状态
@@ -76,50 +60,44 @@ func (s *sSysBlacklist) Status(ctx context.Context, in sysin.BlacklistStatusInp)
defer s.VariableLoad(ctx, err)
if in.Id <= 0 {
err = gerror.New("ID不能为空")
return err
return
}
if in.Status <= 0 {
err = gerror.New("状态不能为空")
return err
return
}
if !validate.InSliceInt(consts.StatusMap, in.Status) {
err = gerror.New("状态不正确")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
_, err = dao.SysBlacklist.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// MaxSort 最大排序
func (s *sSysBlacklist) MaxSort(ctx context.Context, in sysin.BlacklistMaxSortInp) (*sysin.BlacklistMaxSortModel, error) {
var res sysin.BlacklistMaxSortModel
func (s *sSysBlacklist) MaxSort(ctx context.Context, in sysin.BlacklistMaxSortInp) (res *sysin.BlacklistMaxSortModel, err error) {
if in.Id > 0 {
if err := dao.SysBlacklist.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
if err = dao.SysBlacklist.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
return
}
}
res.Sort = res.Sort + 10
return &res, nil
if res == nil {
res = new(sysin.BlacklistMaxSortModel)
}
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return
}
// View 获取指定字典类型信息
func (s *sSysBlacklist) View(ctx context.Context, in sysin.BlacklistViewInp) (res *sysin.BlacklistViewModel, err error) {
if err = dao.SysBlacklist.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
return res, nil
err = dao.SysBlacklist.Ctx(ctx).Where("id", in.Id).Scan(&res)
return
}
// List 获取列表
@@ -138,20 +116,18 @@ func (s *sSysBlacklist) List(ctx context.Context, in sysin.BlacklistListInp) (li
totalCount, err = mod.Count()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
if totalCount == 0 {
return list, totalCount, nil
return
}
if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
return list, totalCount, err
return
}
// VariableLoad 变化加载

View File

@@ -16,12 +16,15 @@ import (
"github.com/gogf/gf/v2/util/gconv"
"hotgo/internal/consts"
"hotgo/internal/dao"
"hotgo/internal/library/payment"
"hotgo/internal/library/wechat"
"hotgo/internal/model"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
)
// MaskDemoField 演示环境下需要隐藏的配置
var MaskDemoField = []string{
// 邮箱
"smtpUser", "smtpPass",
@@ -34,10 +37,18 @@ var MaskDemoField = []string{
// 地图
"geoAmapWebKey",
// 短信
"smsAliYunAccessKeyID", "smsAliYunAccessKeySecret",
"smsTencentSecretId", "smsTencentSecretKey",
// 支付
"payWxPayMchId", "payWxPaySerialNo", "payWxPayAPIv3Key",
"payWxPayPrivateKey", "payQQPayMchId", "payQQPayApiKey",
// 微信
"officialAccountAppSecret", "officialAccountToken", "officialAccountEncodingAESKey",
"openPlatformAppSecret", "openPlatformToken", "openPlatformEncodingAESKey",
}
type sSysConfig struct{}
@@ -50,6 +61,27 @@ func init() {
service.RegisterSysConfig(NewSysConfig())
}
func (s *sSysConfig) InitConfig(ctx context.Context) {
wx, err := s.GetWechat(ctx)
if err != nil {
g.Log().Fatalf(ctx, "init wechat conifg fail%+v", err)
}
wechat.SetConfig(wx)
pay, err := s.GetPay(ctx)
if err != nil {
g.Log().Fatalf(ctx, "init pay conifg fail%+v", err)
}
payment.SetConfig(pay)
}
// GetLoadTCP 获取本地tcp配置
func (s *sSysConfig) GetLoadTCP(ctx context.Context) (conf *model.TCPConfig, err error) {
err = g.Cfg().MustGet(ctx, "tcp").Scan(&conf)
return
}
// GetLoadCache 获取本地缓存配置
func (s *sSysConfig) GetLoadCache(ctx context.Context) (conf *model.CacheConfig, err error) {
err = g.Cfg().MustGet(ctx, "cache").Scan(&conf)
@@ -58,120 +90,120 @@ func (s *sSysConfig) GetLoadCache(ctx context.Context) (conf *model.CacheConfig,
// GetLoadGenerate 获取本地生成配置
func (s *sSysConfig) GetLoadGenerate(ctx context.Context) (conf *model.GenerateConfig, err error) {
generate := g.Cfg().MustGet(ctx, "hggen")
if err = gconv.Struct(generate, &conf); err != nil {
return nil, err
}
err = g.Cfg().MustGet(ctx, "hggen").Scan(&conf)
return
}
return conf, nil
// GetWechat 获取微信配置
func (s *sSysConfig) GetWechat(ctx context.Context) (conf *model.WechatConfig, err error) {
models, err := s.GetConfigByGroup(ctx, sysin.GetConfigInp{Group: "wechat"})
if err != nil {
return
}
err = gconv.Scan(models.List, &conf)
return
}
// GetPay 获取支付配置
func (s *sSysConfig) GetPay(ctx context.Context) (conf *model.PayConfig, err error) {
models, err := s.GetConfigByGroup(ctx, sysin.GetConfigInp{Group: "pay"})
if err != nil {
return
}
err = gconv.Scan(models.List, &conf)
return
}
// GetSms 获取短信配置
func (s *sSysConfig) GetSms(ctx context.Context) (conf *model.SmsConfig, err error) {
models, err := s.GetConfigByGroup(ctx, sysin.GetConfigInp{Group: "sms"})
if err != nil {
return nil, err
return
}
if err = gconv.Struct(models.List, &conf); err != nil {
return nil, err
}
return conf, nil
err = gconv.Scan(models.List, &conf)
return
}
// GetGeo 获取地理配置
func (s *sSysConfig) GetGeo(ctx context.Context) (conf *model.GeoConfig, err error) {
models, err := s.GetConfigByGroup(ctx, sysin.GetConfigInp{Group: "geo"})
if err != nil {
return nil, err
return
}
if err = gconv.Struct(models.List, &conf); err != nil {
return nil, err
}
return conf, nil
err = gconv.Scan(models.List, &conf)
return
}
// GetUpload 获取上传配置
func (s *sSysConfig) GetUpload(ctx context.Context) (conf *model.UploadConfig, err error) {
models, err := s.GetConfigByGroup(ctx, sysin.GetConfigInp{Group: "upload"})
if err != nil {
return nil, err
return
}
if err = gconv.Struct(models.List, &conf); err != nil {
return nil, err
}
return conf, nil
err = gconv.Scan(models.List, &conf)
return
}
// GetSmtp 获取邮件配置
func (s *sSysConfig) GetSmtp(ctx context.Context) (conf *model.EmailConfig, err error) {
models, err := s.GetConfigByGroup(ctx, sysin.GetConfigInp{Group: "smtp"})
if err != nil {
return nil, err
return
}
if err = gconv.Struct(models.List, &conf); err != nil {
return nil, err
if err = gconv.Scan(models.List, &conf); err != nil {
return
}
conf.Addr = fmt.Sprintf("%s:%d", conf.Host, conf.Port)
return conf, nil
return
}
// GetBasic 获取基础配置
func (s *sSysConfig) GetBasic(ctx context.Context) (conf *model.BasicConfig, err error) {
models, err := s.GetConfigByGroup(ctx, sysin.GetConfigInp{Group: "basic"})
if err != nil {
return nil, err
return
}
if err = gconv.Struct(models.List, &conf); err != nil {
return nil, err
}
return conf, nil
err = gconv.Scan(models.List, &conf)
return
}
// GetLoadSSL 获取本地日志配置
func (s *sSysConfig) GetLoadSSL(ctx context.Context) (conf *model.SSLConfig, err error) {
if err = g.Cfg().MustGet(ctx, "hotgo.ssl").Struct(&conf); err != nil {
return nil, err
}
return conf, nil
err = g.Cfg().MustGet(ctx, "hotgo.ssl").Scan(&conf)
return
}
// GetLoadLog 获取本地日志配置
func (s *sSysConfig) GetLoadLog(ctx context.Context) (conf *model.LogConfig, err error) {
if err = g.Cfg().MustGet(ctx, "hotgo.log").Struct(&conf); err != nil {
return nil, err
}
return conf, nil
err = g.Cfg().MustGet(ctx, "hotgo.log").Scan(&conf)
return
}
// GetLoadServeLog 获取本地服务日志配置
func (s *sSysConfig) GetLoadServeLog(ctx context.Context) (conf *model.ServeLogConfig, err error) {
if err = g.Cfg().MustGet(ctx, "hotgo.serveLog").Struct(&conf); err != nil {
return nil, err
}
return conf, nil
err = g.Cfg().MustGet(ctx, "hotgo.serveLog").Scan(&conf)
return
}
// GetConfigByGroup 获取指定分组的配置
func (s *sSysConfig) GetConfigByGroup(ctx context.Context, in sysin.GetConfigInp) (*sysin.GetConfigModel, error) {
func (s *sSysConfig) GetConfigByGroup(ctx context.Context, in sysin.GetConfigInp) (res *sysin.GetConfigModel, err error) {
if in.Group == "" {
return nil, gerror.New("分组不能为空")
err = gerror.New("分组不能为空")
return
}
var (
mod = dao.SysConfig.Ctx(ctx)
models []*entity.SysConfig
res sysin.GetConfigModel
)
if err := mod.Fields("key", "value", "type").Where("group", in.Group).Scan(&models); err != nil {
return nil, err
}
isDemo := g.Cfg().MustGet(ctx, "hotgo.isDemo", false)
var (
models []*entity.SysConfig
isDemo = g.Cfg().MustGet(ctx, "hotgo.isDemo", false).Bool()
)
if err = dao.SysConfig.Ctx(ctx).Fields("key", "value", "type").Where("group", in.Group).Scan(&models); err != nil {
return
}
res = new(sysin.GetConfigModel)
if len(models) > 0 {
res.List = make(g.Map, len(models))
for _, v := range models {
@@ -180,42 +212,41 @@ func (s *sSysConfig) GetConfigByGroup(ctx context.Context, in sysin.GetConfigInp
return nil, err
}
res.List[v.Key] = val
//if isDemo.Bool() && (v.Key == "smtpUser" || v.Key == "smtpPass") {
// res.List[v.Key] = consts.DemoTips
// res.List[v.Key] = consts.DemoTips
//}
if isDemo.Bool() && gstr.InArray(MaskDemoField, v.Key) {
if isDemo && gstr.InArray(MaskDemoField, v.Key) {
res.List[v.Key] = consts.DemoTips
res.List[v.Key] = consts.DemoTips
}
}
}
return &res, nil
return
}
// ConversionType 转换类型
func (s *sSysConfig) ConversionType(ctx context.Context, models *entity.SysConfig) (value interface{}, err error) {
if models == nil {
return nil, gerror.New("数据不存在")
err = gerror.New("数据不存在")
return
}
return consts.ConvType(models.Value, models.Type), nil
}
// UpdateConfigByGroup 更新指定分组的配置
func (s *sSysConfig) UpdateConfigByGroup(ctx context.Context, in sysin.UpdateConfigInp) error {
func (s *sSysConfig) UpdateConfigByGroup(ctx context.Context, in sysin.UpdateConfigInp) (err error) {
if in.Group == "" {
return gerror.New("分组不能为空")
err = gerror.New("分组不能为空")
return
}
var (
mod = dao.SysConfig.Ctx(ctx)
models []*entity.SysConfig
)
if err := mod.Where("group", in.Group).Scan(&models); err != nil {
return err
if err = mod.Where("group", in.Group).Scan(&models); err != nil {
return
}
err := dao.SysConfig.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
err = dao.SysConfig.Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
for k, v := range in.List {
row := s.getConfigByKey(k, models)
// 新增
@@ -233,24 +264,21 @@ func (s *sSysConfig) UpdateConfigByGroup(ctx context.Context, in sysin.UpdateCon
// return err
//}
//continue
return gerror.Newf("暂不支持从前台添加变量,请先在数据库表[%v]中配置变量:%v", dao.SysConfig.Table(), k)
err = gerror.Newf("暂不支持从前台添加变量,请先在数据库表[%v]中配置变量:%v", dao.SysConfig.Table(), k)
return
}
// 更新
_, err := dao.SysConfig.Ctx(ctx).Where("id", row.Id).Data(g.Map{"value": v, "updated_at": gtime.Now()}).Update()
_, err = dao.SysConfig.Ctx(ctx).Where("id", row.Id).Data(g.Map{"value": v, "updated_at": gtime.Now()}).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
return
}
}
return nil
return s.syncUpdate(ctx, in)
})
if err != nil {
return err
}
return nil
return
}
func (s *sSysConfig) getConfigByKey(key string, models []*entity.SysConfig) *entity.SysConfig {
@@ -266,3 +294,24 @@ func (s *sSysConfig) getConfigByKey(key string, models []*entity.SysConfig) *ent
return nil
}
// syncUpdate 同步更新一些加载配置
func (s *sSysConfig) syncUpdate(ctx context.Context, in sysin.UpdateConfigInp) (err error) {
switch in.Group {
case "wechat":
wx, err := s.GetWechat(ctx)
if err == nil {
wechat.SetConfig(wx)
}
case "pay":
pay, err := s.GetPay(ctx)
if err == nil {
payment.SetConfig(pay)
}
}
if err != nil {
err = gerror.Newf("syncUpdate %v conifg fail%+v", in.Group, err.Error())
}
return
}

View File

@@ -3,7 +3,6 @@
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package sys
import (
@@ -64,15 +63,12 @@ func (s *sSysCron) Delete(ctx context.Context, in sysin.CronDeleteInp) (err erro
}
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
_, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
if _, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Delete(); err != nil {
return
}
return crons.Delete(models)
})
return nil
return
}
// Edit 修改/新增
@@ -84,17 +80,12 @@ func (s *sSysCron) Edit(ctx context.Context, in sysin.CronEditInp) (err error) {
// 修改
if in.Id > 0 {
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
_, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
simple.SafeGo(ctx, func(ctx context.Context) {
crons.RefreshStatus(&in.SysCron)
})
if _, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Data(in).Update(); err != nil {
return
}
simple.SafeGo(ctx, func(ctx context.Context) {
crons.RefreshStatus(&in.SysCron)
})
return
}
@@ -104,26 +95,25 @@ func (s *sSysCron) Edit(ctx context.Context, in sysin.CronEditInp) (err error) {
return
}
// Status 更新部门状态
// Status 更新状态
func (s *sSysCron) Status(ctx context.Context, in sysin.CronStatusInp) (err error) {
if in.Id <= 0 {
err = gerror.New("ID不能为空")
return err
return
}
if in.Status <= 0 {
err = gerror.New("状态不能为空")
return err
return
}
if !validate.InSliceInt(consts.StatusMap, in.Status) {
err = gerror.New("状态不正确")
return err
return
}
var models *entity.SysCron
if err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Scan(&models); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return
}
@@ -132,18 +122,13 @@ func (s *sSysCron) Status(ctx context.Context, in sysin.CronStatusInp) (err erro
return
}
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
_, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
_, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
}
models.Status = in.Status
simple.SafeGo(ctx, func(ctx context.Context) {
crons.RefreshStatus(models)
})
return
models.Status = in.Status
simple.SafeGo(ctx, func(ctx context.Context) {
crons.RefreshStatus(models)
})
return
}
@@ -151,25 +136,24 @@ func (s *sSysCron) Status(ctx context.Context, in sysin.CronStatusInp) (err erro
// MaxSort 最大排序
func (s *sSysCron) MaxSort(ctx context.Context, in sysin.CronMaxSortInp) (res *sysin.CronMaxSortModel, err error) {
if err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
return
}
if res == nil {
res = new(sysin.CronMaxSortModel)
}
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return res, nil
return
}
// View 获取指定字典类型信息
// View 获取指定信息
func (s *sSysCron) View(ctx context.Context, in sysin.CronViewInp) (res *sysin.CronViewModel, err error) {
if err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
return
}
return res, nil
return
}
// List 获取列表
@@ -187,34 +171,34 @@ func (s *sSysCron) List(ctx context.Context, in sysin.CronListInp) (list []*sysi
totalCount, err = mod.Count()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
if totalCount == 0 {
return list, totalCount, nil
return
}
if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
for _, v := range list {
v.GroupName, _ = dao.SysCronGroup.GetName(ctx, v.GroupId)
}
return list, totalCount, err
return
}
// OnlineExec 在线执行
func (s *sSysCron) OnlineExec(ctx context.Context, in sysin.OnlineExecInp) (err error) {
var data *entity.SysCron
err = dao.SysCron.Ctx(ctx).Where(dao.SysCron.Columns().Id, in.Id).Scan(&data)
if err != nil {
if err = dao.SysCron.Ctx(ctx).Where(dao.SysCron.Columns().Id, in.Id).Scan(&data); err != nil {
return
}
if data == nil {
return gerror.New("定时任务不存在")
err = gerror.New("定时任务不存在")
return
}
newCtx := context.WithValue(gctx.New(), consts.ContextKeyCronArgs, strings.Split(data.Params, consts.CronSplitStr))

View File

@@ -3,16 +3,15 @@
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package sys
import (
"context"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gtime"
"hotgo/internal/consts"
"hotgo/internal/dao"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/form"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"hotgo/utility/validate"
@@ -29,129 +28,95 @@ func init() {
}
// Delete 删除
func (s *sSysCronGroup) Delete(ctx context.Context, in sysin.CronGroupDeleteInp) error {
_, err := dao.SysCronGroup.Ctx(ctx).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
func (s *sSysCronGroup) Delete(ctx context.Context, in sysin.CronGroupDeleteInp) (err error) {
_, err = dao.SysCronGroup.Ctx(ctx).Where("id", in.Id).Delete()
return
}
// Edit 修改/新增
func (s *sSysCronGroup) Edit(ctx context.Context, in sysin.CronGroupEditInp) (err error) {
if in.Name == "" {
err = gerror.New("分组名称不能为空")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
if in.Id > 0 {
_, err = dao.SysCronGroup.Ctx(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// 新增
in.CreatedAt = gtime.Now()
_, err = dao.SysCronGroup.Ctx(ctx).Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// Status 更新部门状态
// Status 更新状态
func (s *sSysCronGroup) Status(ctx context.Context, in sysin.CronGroupStatusInp) (err error) {
if in.Id <= 0 {
err = gerror.New("ID不能为空")
return err
return
}
if in.Status <= 0 {
err = gerror.New("状态不能为空")
return err
return
}
if !validate.InSliceInt(consts.StatusMap, in.Status) {
err = gerror.New("状态不正确")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
_, err = dao.SysCronGroup.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// MaxSort 最大排序
func (s *sSysCronGroup) MaxSort(ctx context.Context, in sysin.CronGroupMaxSortInp) (*sysin.CronGroupMaxSortModel, error) {
var res sysin.CronGroupMaxSortModel
func (s *sSysCronGroup) MaxSort(ctx context.Context, in sysin.CronGroupMaxSortInp) (res *sysin.CronGroupMaxSortModel, err error) {
if in.Id > 0 {
if err := dao.SysCronGroup.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
if err = dao.SysCronGroup.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
return
}
}
res.Sort = res.Sort + 10
return &res, nil
}
// View 获取指定字典类型信息
func (s *sSysCronGroup) View(ctx context.Context, in sysin.CronGroupViewInp) (res *sysin.CronGroupViewModel, err error) {
if err = dao.SysCronGroup.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
if res == nil {
res = new(sysin.CronGroupMaxSortModel)
}
return res, nil
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return
}
// View 获取指定信息
func (s *sSysCronGroup) View(ctx context.Context, in sysin.CronGroupViewInp) (res *sysin.CronGroupViewModel, err error) {
err = dao.SysCronGroup.Ctx(ctx).Where("id", in.Id).Scan(&res)
return
}
// List 获取列表
func (s *sSysCronGroup) List(ctx context.Context, in sysin.CronGroupListInp) (list []*sysin.CronGroupListModel, totalCount int, err error) {
mod := dao.SysCronGroup.Ctx(ctx)
// 访问路径
if in.Name != "" {
mod = mod.WhereLike("name", "%"+in.Name+"%")
}
// 请求方式
if in.Status > 0 {
mod = mod.Where("status", in.Status)
}
totalCount, err = mod.Count()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
if totalCount == 0 {
return list, totalCount, nil
return
}
if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
}
return list, totalCount, err
err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list)
return
}
// Select 选项

View File

@@ -3,9 +3,8 @@
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
// @AutoGenerate Version 2.1.4
// @AutoGenerate Date 2023-02-20 16:41:58
//
// @AutoGenerate Version 2.5.3
// @AutoGenerate Date 2023-04-28 15:28:40
package sys
import (
@@ -75,12 +74,8 @@ func (s *sSysCurdDemo) List(ctx context.Context, in sysin.CurdDemoListInp) (list
dao.TestCategory.Table(), "testCategory", dao.TestCategory.Columns().Id, // 关联表表名,别名,关联条件
)...)
totalCount, err = mod.Clone().Count(1)
if err != nil {
return
}
if totalCount == 0 {
totalCount, err = mod.Clone().Count()
if totalCount == 0 || err != nil {
return
}
@@ -88,7 +83,6 @@ func (s *sSysCurdDemo) List(ctx context.Context, in sysin.CurdDemoListInp) (list
fields, err := hgorm.GenJoinSelect(ctx, sysin.CurdDemoListModel{}, dao.SysGenCurdDemo, []*hgorm.Join{
{Dao: dao.TestCategory, Alias: "testCategory"},
})
err = mod.Fields(fields).Page(in.Page, in.PerPage).OrderAsc(dao.SysGenCurdDemo.Columns().Sort).OrderDesc(dao.SysGenCurdDemo.Columns().Id).Scan(&list)
return
}

View File

@@ -3,13 +3,11 @@
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package sys
import (
"context"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gtime"
"hotgo/internal/consts"
"hotgo/internal/dao"
"hotgo/internal/model/entity"
@@ -36,7 +34,7 @@ func (s *sSysDictType) Tree(ctx context.Context) (list []*sysin.DictTypeTree, er
if err = mod.Order("sort asc,id asc").Scan(&models); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, err
return
}
list = s.treeList(0, models)
@@ -44,17 +42,15 @@ func (s *sSysDictType) Tree(ctx context.Context) (list []*sysin.DictTypeTree, er
}
// Delete 删除
func (s *sSysDictType) Delete(ctx context.Context, in sysin.DictTypeDeleteInp) error {
var (
models *entity.SysDictType
)
err := dao.SysDictType.Ctx(ctx).Where("id", in.Id).Scan(&models)
if err != nil {
return err
func (s *sSysDictType) Delete(ctx context.Context, in sysin.DictTypeDeleteInp) (err error) {
var models *entity.SysDictType
if err = dao.SysDictType.Ctx(ctx).Where("id", in.Id).Scan(&models); err != nil {
return
}
if models == nil {
return gerror.New("数据不存在或已删除!")
err = gerror.New("数据不存在或已删除!")
return
}
exist, err := dao.SysDictData.Ctx(ctx).Where("type", models.Type).One()
@@ -63,7 +59,8 @@ func (s *sSysDictType) Delete(ctx context.Context, in sysin.DictTypeDeleteInp) e
return err
}
if !exist.IsEmpty() {
return gerror.New("请先删除该字典类型下得所有字典数据!")
err = gerror.New("请先删除该字典类型下得所有字典数据!")
return
}
pidExist, err := dao.SysDictType.Ctx(ctx).Where("pid", models.Id).One()
@@ -71,56 +68,42 @@ func (s *sSysDictType) Delete(ctx context.Context, in sysin.DictTypeDeleteInp) e
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
if !pidExist.IsEmpty() {
return gerror.New("请先删除该字典类型下得所有子级类型!")
err = gerror.New("请先删除该字典类型下得所有子级类型!")
return
}
_, err = dao.SysDictType.Ctx(ctx).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// Edit 修改/新增
func (s *sSysDictType) Edit(ctx context.Context, in sysin.DictTypeEditInp) (err error) {
if in.Name == "" {
err = gerror.New("名称不能为空")
return err
return
}
uniqueName, err := dao.SysDictType.IsUniqueType(ctx, in.Id, in.Name)
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
return
}
if !uniqueName {
err = gerror.New("名称已存在")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
if in.Id > 0 {
_, err = dao.SysDictType.Ctx(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// 新增
in.CreatedAt = gtime.Now()
_, err = dao.SysDictType.Ctx(ctx).Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// TreeSelect 获取类型关系树选项
@@ -132,7 +115,7 @@ func (s *sSysDictType) TreeSelect(ctx context.Context, in sysin.DictTreeSelectIn
if err = mod.Order("pid asc,sort asc").Scan(&models); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, err
return
}
list = s.treeList(0, models)

View File

@@ -3,7 +3,6 @@
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package sys
import (
@@ -42,77 +41,55 @@ func init() {
}
// Delete 删除
func (s *sSysEmsLog) Delete(ctx context.Context, in sysin.EmsLogDeleteInp) error {
_, err := dao.SysEmsLog.Ctx(ctx).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
func (s *sSysEmsLog) Delete(ctx context.Context, in sysin.EmsLogDeleteInp) (err error) {
_, err = dao.SysEmsLog.Ctx(ctx).Where("id", in.Id).Delete()
return
}
// Edit 修改/新增
func (s *sSysEmsLog) Edit(ctx context.Context, in sysin.EmsLogEditInp) (err error) {
if in.Ip == "" {
err = gerror.New("ip不能为空")
return err
return
}
// 修改
if in.Id > 0 {
_, err = dao.SysEmsLog.Ctx(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// 新增
_, err = dao.SysEmsLog.Ctx(ctx).Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// Status 更新部门状态
func (s *sSysEmsLog) Status(ctx context.Context, in sysin.EmsLogStatusInp) (err error) {
if in.Id <= 0 {
err = gerror.New("ID不能为空")
return err
return
}
if in.Status <= 0 {
err = gerror.New("状态不能为空")
return err
return
}
if !validate.InSliceInt(consts.StatusMap, in.Status) {
err = gerror.New("状态不正确")
return err
return
}
// 修改
_, err = dao.SysEmsLog.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// View 获取指定字典类型信息
func (s *sSysEmsLog) View(ctx context.Context, in sysin.EmsLogViewInp) (res *sysin.EmsLogViewModel, err error) {
if err = dao.SysEmsLog.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
return res, nil
err = dao.SysEmsLog.Ctx(ctx).Where("id", in.Id).Scan(&res)
return
}
// List 获取列表
@@ -126,19 +103,15 @@ func (s *sSysEmsLog) List(ctx context.Context, in sysin.EmsLogListInp) (list []*
totalCount, err = mod.Count()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
if totalCount == 0 {
return list, totalCount, nil
return
}
if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
}
return list, totalCount, err
err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list)
return
}
// Send 发送邮件
@@ -146,22 +119,21 @@ func (s *sSysEmsLog) Send(ctx context.Context, in sysin.SendEmsInp) (err error)
var models *entity.SysEmsLog
if err = dao.SysEmsLog.Ctx(ctx).Where("event", in.Event).Where("email", in.Email).Scan(&models); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
return
}
config, err := service.SysConfig().GetSmtp(ctx)
if err != nil {
return err
return
}
in.Template, err = s.GetTemplate(ctx, in.Event, config)
if err != nil {
return err
return
}
err = s.AllowSend(ctx, models, config)
if err != nil {
return err
if err = s.AllowSend(ctx, models, config); err != nil {
return
}
if consts.IsCodeEmsTemplate(in.Event) && in.Code == "" {
@@ -170,7 +142,7 @@ func (s *sSysEmsLog) Send(ctx context.Context, in sysin.SendEmsInp) (err error)
view, err := s.newView(ctx, in, config)
if err != nil {
return err
return
}
if in.TplData == nil {
@@ -204,7 +176,7 @@ func (s *sSysEmsLog) Send(ctx context.Context, in sysin.SendEmsInp) (err error)
err = ems.Send(config, in.Email, subject, in.Content)
if err != nil {
return err
return
}
var data = new(entity.SysEmsLog)
@@ -218,11 +190,7 @@ func (s *sSysEmsLog) Send(ctx context.Context, in sysin.SendEmsInp) (err error)
data.UpdatedAt = gtime.Now()
_, err = dao.SysEmsLog.Ctx(ctx).Data(data).Insert()
if err != nil {
return err
}
return nil
return
}
func (s *sSysEmsLog) newView(ctx context.Context, in sysin.SendEmsInp, config *model.EmailConfig) (view *gview.View, err error) {
@@ -238,6 +206,7 @@ func (s *sSysEmsLog) newView(ctx context.Context, in sysin.SendEmsInp, config *m
if in.Event == consts.EmsTemplateText {
return
}
var (
username string
user = contexts.GetUser(ctx)
@@ -319,17 +288,19 @@ func (s *sSysEmsLog) newView(ctx context.Context, in sysin.SendEmsInp, config *m
// GetTemplate 获取指定邮件模板
func (s *sSysEmsLog) GetTemplate(ctx context.Context, template string, config *model.EmailConfig) (val string, err error) {
if template == "" {
return "", gerror.New("模板不能为空")
err = gerror.New("模板不能为空")
return
}
if config == nil {
config, err = service.SysConfig().GetSmtp(ctx)
if err != nil {
return "", err
return
}
}
if len(config.Template) == 0 {
return "", gerror.New("管理员还没有配置任何模板!")
err = gerror.New("管理员还没有配置任何模板!")
return
}
for _, v := range config.Template {
@@ -344,23 +315,24 @@ func (s *sSysEmsLog) GetTemplate(ctx context.Context, template string, config *m
// AllowSend 是否允许发送
func (s *sSysEmsLog) AllowSend(ctx context.Context, models *entity.SysEmsLog, config *model.EmailConfig) (err error) {
if models == nil {
return nil
return
}
// 富文本事件不限制
if models.Event == consts.EmsTemplateText {
return nil
return
}
if config == nil {
config, err = service.SysConfig().GetSmtp(ctx)
if err != nil {
return err
return
}
}
if gtime.Now().Before(models.CreatedAt.Add(time.Second * time.Duration(config.MinInterval))) {
return gerror.New("发送频繁,请稍后再试!")
err = gerror.New("发送频繁,请稍后再试!")
return
}
if config.MaxIpLimit > 0 {
@@ -370,7 +342,8 @@ func (s *sSysEmsLog) AllowSend(ctx context.Context, models *entity.SysEmsLog, co
}
if count >= config.MaxIpLimit {
return gerror.New("今天发送短信过多,请次日后再试!")
err = gerror.New("今天发送短信过多,请次日后再试!")
return err
}
}
@@ -380,53 +353,56 @@ func (s *sSysEmsLog) AllowSend(ctx context.Context, models *entity.SysEmsLog, co
// VerifyCode 效验验证码
func (s *sSysEmsLog) VerifyCode(ctx context.Context, in sysin.VerifyEmsCodeInp) (err error) {
if in.Event == "" {
return gerror.New("事件不能为空")
err = gerror.New("事件不能为空")
return
}
if in.Email == "" {
return gerror.New("邮箱不能为空")
err = gerror.New("邮箱不能为空")
return
}
if in.Event == consts.EmsTemplateResetPwd || in.Event == consts.EmsTemplateText {
return gerror.Newf("事件类型无需验证:%v", in.Event)
err = gerror.Newf("事件类型无需验证:%v", in.Event)
return
}
config, err := service.SysConfig().GetSmtp(ctx)
if err != nil {
return err
return
}
var (
models *entity.SysEmsLog
)
var models *entity.SysEmsLog
if err = dao.SysEmsLog.Ctx(ctx).Where("event", in.Event).Where("email", in.Email).Order("id desc").Scan(&models); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
if models == nil {
return gerror.New("验证码错误")
err = gerror.New("验证码错误")
return
}
if models.Times >= 10 {
return gerror.New("验证码错误次数过多,请重新发送!")
err = gerror.New("验证码错误次数过多,请重新发送!")
return
}
if in.Event != consts.EmsTemplateCode {
if models.Status == consts.EmsStatusUsed {
return gerror.New("验证码已使用,请重新发送!")
err = gerror.New("验证码已使用,请重新发送!")
return
}
}
if gtime.Now().After(models.CreatedAt.Add(time.Second * time.Duration(config.CodeExpire))) {
return gerror.New("验证码已过期,请重新发送")
err = gerror.New("验证码已过期,请重新发送")
return
}
if models.Code != in.Code {
_, err = dao.SysEmsLog.Ctx(ctx).Where("id", models.Id).Increment("times", 1)
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return gerror.New("验证码错误!")
dao.SysEmsLog.Ctx(ctx).Where("id", models.Id).Increment("times", 1)
err = gerror.New("验证码错误!")
return
}
_, err = dao.SysEmsLog.Ctx(ctx).Where("id", models.Id).Data(g.Map{
@@ -434,10 +410,5 @@ func (s *sSysEmsLog) VerifyCode(ctx context.Context, in sysin.VerifyEmsCodeInp)
"status": consts.EmsStatusUsed,
"updated_at": gtime.Now(),
}).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return
}

View File

@@ -18,6 +18,7 @@ import (
"hotgo/internal/dao"
"hotgo/internal/library/hggen"
"hotgo/internal/model"
"hotgo/internal/model/input/form"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"hotgo/utility/validate"
@@ -34,25 +35,20 @@ func init() {
}
// Delete 删除
func (s *sSysGenCodes) Delete(ctx context.Context, in sysin.GenCodesDeleteInp) error {
_, err := dao.SysGenCodes.Ctx(ctx).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
func (s *sSysGenCodes) Delete(ctx context.Context, in sysin.GenCodesDeleteInp) (err error) {
_, err = dao.SysGenCodes.Ctx(ctx).Where("id", in.Id).Delete()
return
}
// Edit 修改/新增
func (s *sSysGenCodes) Edit(ctx context.Context, in sysin.GenCodesEditInp) (res *sysin.GenCodesEditModel, err error) {
if in.GenType == 0 {
err = gerror.New("生成类型不能为空")
return nil, err
return
}
if in.VarName == "" {
err = gerror.New("实体名称不能为空")
return nil, err
return
}
if in.GenType == consts.GenCodesTypeCurd {
@@ -69,7 +65,7 @@ func (s *sSysGenCodes) Edit(ctx context.Context, in sysin.GenCodesEditInp) (res
if temp.IsAddon && in.AddonName == "" {
err = gerror.New("插件模板必须选择一个有效的插件")
return nil, err
return
}
}
@@ -79,7 +75,7 @@ func (s *sSysGenCodes) Edit(ctx context.Context, in sysin.GenCodesEditInp) (res
_, err = dao.SysGenCodes.Ctx(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
return
}
return &sysin.GenCodesEditModel{SysGenCodes: in.SysGenCodes}, nil
}
@@ -95,7 +91,7 @@ func (s *sSysGenCodes) Edit(ctx context.Context, in sysin.GenCodesEditInp) (res
id, err := dao.SysGenCodes.Ctx(ctx).Data(in).InsertAndGetId()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
return
}
in.Id = id
@@ -106,49 +102,44 @@ func (s *sSysGenCodes) Edit(ctx context.Context, in sysin.GenCodesEditInp) (res
func (s *sSysGenCodes) Status(ctx context.Context, in sysin.GenCodesStatusInp) (err error) {
if in.Id <= 0 {
err = gerror.New("ID不能为空")
return err
return
}
if in.Status <= 0 {
err = gerror.New("状态不能为空")
return err
return
}
if !validate.InSliceInt(consts.StatusMap, in.Status) {
err = gerror.New("状态不正确")
return err
return
}
// 修改
_, err = dao.SysGenCodes.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// MaxSort 最大排序
func (s *sSysGenCodes) MaxSort(ctx context.Context, in sysin.GenCodesMaxSortInp) (*sysin.GenCodesMaxSortModel, error) {
var res sysin.GenCodesMaxSortModel
func (s *sSysGenCodes) MaxSort(ctx context.Context, in sysin.GenCodesMaxSortInp) (res *sysin.GenCodesMaxSortModel, err error) {
if in.Id > 0 {
if err := dao.SysGenCodes.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
if err = dao.SysGenCodes.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
}
res.Sort = res.Sort + 10
return &res, nil
if res == nil {
res = new(sysin.GenCodesMaxSortModel)
}
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return
}
// View 获取指定字典类型信息
func (s *sSysGenCodes) View(ctx context.Context, in sysin.GenCodesViewInp) (res *sysin.GenCodesViewModel, err error) {
if err = dao.SysGenCodes.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
return res, nil
err = dao.SysGenCodes.Ctx(ctx).Where("id", in.Id).Scan(&res)
return
}
// List 获取列表
@@ -168,18 +159,13 @@ func (s *sSysGenCodes) List(ctx context.Context, in sysin.GenCodesListInp) (list
}
totalCount, err = mod.Count()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
}
if totalCount == 0 {
return list, totalCount, nil
if err != nil || totalCount == 0 {
return
}
if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
typeSelect, err := hggen.GenTypeSelect(ctx)
@@ -187,7 +173,7 @@ func (s *sSysGenCodes) List(ctx context.Context, in sysin.GenCodesListInp) (list
return
}
getTemplateGroup := func(row *sysin.GenCodesListModel) string {
getTpGroup := func(row *sysin.GenCodesListModel) string {
if row == nil {
return ""
}
@@ -206,11 +192,11 @@ func (s *sSysGenCodes) List(ctx context.Context, in sysin.GenCodesListInp) (list
if len(list) > 0 {
for _, v := range list {
v.GenTemplateGroup = getTemplateGroup(v)
v.GenTemplateGroup = getTpGroup(v)
}
}
return list, totalCount, err
return
}
// Selects 选项
@@ -227,9 +213,8 @@ func (s *sSysGenCodes) TableSelect(ctx context.Context, in sysin.GenCodesTableSe
lists []*sysin.GenCodesTableSelectModel
)
err = g.DB(in.Name).Ctx(ctx).Raw(fmt.Sprintf(sql, config.Name)).Scan(&lists)
if err != nil {
return nil, err
if err = g.DB(in.Name).Ctx(ctx).Raw(fmt.Sprintf(sql, config.Name)).Scan(&lists); err != nil {
return
}
patternStr := `addon_(\w+)_`
@@ -267,7 +252,8 @@ func (s *sSysGenCodes) TableSelect(ctx context.Context, in sysin.GenCodesTableSe
res = append(res, row)
}
return res, nil
return
}
// ColumnSelect 表字段选项
@@ -277,20 +263,21 @@ func (s *sSysGenCodes) ColumnSelect(ctx context.Context, in sysin.GenCodesColumn
config = g.DB(in.Name).GetConfig()
)
err = g.DB(in.Name).Ctx(ctx).Raw(fmt.Sprintf(sql, config.Name, in.Table)).Scan(&res)
if err != nil {
return nil, err
if err = g.DB(in.Name).Ctx(ctx).Raw(fmt.Sprintf(sql, config.Name, in.Table)).Scan(&res); err != nil {
return
}
if len(res) == 0 {
return nil, gerror.Newf("table does not exist:%v", in.Table)
err = gerror.Newf("table does not exist:%v", in.Table)
return
}
for k, v := range res {
res[k].Name = fmt.Sprintf("%s (%s)", v.Value, v.Label)
res[k].Label = res[k].Name
}
return res, nil
return
}
// ColumnList 表字段列表
@@ -306,14 +293,12 @@ func (s *sSysGenCodes) Preview(ctx context.Context, in sysin.GenCodesPreviewInp)
// Build 提交生成
func (s *sSysGenCodes) Build(ctx context.Context, in sysin.GenCodesBuildInp) (err error) {
// 先保存配置
_, err = s.Edit(ctx, sysin.GenCodesEditInp{SysGenCodes: in.SysGenCodes})
if err != nil {
if _, err = s.Edit(ctx, sysin.GenCodesEditInp{SysGenCodes: in.SysGenCodes}); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
err = s.Status(ctx, sysin.GenCodesStatusInp{Id: in.Id, Status: consts.GenCodesStatusOk})
if err != nil {
if err = s.Status(ctx, sysin.GenCodesStatusInp{Id: in.Id, Status: consts.GenCodesStatusOk}); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}

View File

@@ -3,7 +3,6 @@
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package sys
import (
@@ -90,16 +89,13 @@ func (s *sSysLog) Export(ctx context.Context, in sysin.LogListInp) (err error) {
exportList = append(exportList, row)
}
if err = excel.ExportByStructs(ctx, titleList, exportList, fileName, sheetName); err != nil {
return err
}
err = excel.ExportByStructs(ctx, titleList, exportList, fileName, sheetName)
return
}
// RealWrite 真实写入
func (s *sSysLog) RealWrite(ctx context.Context, commonLog entity.SysLog) (err error) {
_, err = dao.SysLog.Ctx(ctx).Data(commonLog).FieldsEx(dao.SysLog.Columns().Id).Insert()
func (s *sSysLog) RealWrite(ctx context.Context, log entity.SysLog) (err error) {
_, err = dao.SysLog.Ctx(ctx).FieldsEx(dao.SysLog.Columns().Id).Data(log).Insert()
return
}
@@ -114,11 +110,7 @@ func (s *sSysLog) AutoLog(ctx context.Context) error {
}()
config, err := service.SysConfig().GetLoadLog(ctx)
if err != nil {
return
}
if !config.Switch {
if err != nil || !config.Switch {
return
}
@@ -144,23 +136,24 @@ func (s *sSysLog) AutoLog(ctx context.Context) error {
// AnalysisLog 解析日志数据
func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog {
var (
modelContext = contexts.Get(ctx)
response = modelContext.Response
user = modelContext.User
request = ghttp.RequestFromCtx(ctx)
module = modelContext.Module
clientIp = location.GetClientIp(request)
postData = gjson.New(request.GetBodyString())
getData = gjson.New(request.URL.Query())
headerData = gjson.New(consts.NilJsonToString)
errorData = gjson.New(consts.NilJsonToString)
data entity.SysLog
memberId int64
errorCode int
errorMsg string
traceID string
timestamp int64
appId string
mctx = contexts.Get(ctx)
response = mctx.Response
user = mctx.User
request = ghttp.RequestFromCtx(ctx)
module = mctx.Module
clientIp = location.GetClientIp(request)
postData = gjson.New(consts.NilJsonToString)
getData = gjson.New(request.URL.Query())
headerData = gjson.New(consts.NilJsonToString)
errorData = gjson.New(consts.NilJsonToString)
data entity.SysLog
memberId int64
errorCode int
errorMsg string
traceID string
timestamp int64
appId string
takeUpTime int64
)
// 响应数据
@@ -180,12 +173,18 @@ func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog {
}
// post参数
if body, ok := mctx.Data["request.body"].(*gjson.Json); ok {
postData = body
}
// post表单
postForm := gjson.New(gconv.String(request.PostForm)).Map()
if len(postForm) > 0 {
for k, v := range postForm {
postData.MustAppend(k, v)
}
}
if postData.IsNil() || len(postData.Map()) == 0 {
postData = gjson.New(consts.NilJsonToString)
}
@@ -200,10 +199,16 @@ func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog {
if err != nil {
g.Log().Infof(ctx, "location.GetLocation clientIp:%v, err:%+v", clientIp, err)
}
if ipData == nil {
ipData = new(location.IpLocationData)
}
// 请求耗时
if tt, ok := mctx.Data["request.takeUpTime"].(int64); ok {
takeUpTime = tt
}
data = entity.SysLog{
AppId: appId,
MerchantId: 0,
@@ -224,8 +229,9 @@ func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog {
Timestamp: timestamp,
UserAgent: request.Header.Get("User-Agent"),
Status: consts.StatusEnabled,
TakeUpTime: modelContext.TakeUpTime,
TakeUpTime: takeUpTime,
}
return data
}
@@ -305,20 +311,15 @@ func (s *sSysLog) List(ctx context.Context, in sysin.LogListInp) (list []*sysin.
}
totalCount, err = mod.Count()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
}
if totalCount == 0 {
return list, totalCount, err
if err != nil || totalCount == 0 {
return
}
if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
isDemo := g.Cfg().MustGet(ctx, "hotgo.isDemo", false)
isDemo := g.Cfg().MustGet(ctx, "hotgo.isDemo", false).Bool()
for i := 0; i < len(list); i++ {
// 管理员
if list[i].AppId == consts.AppAdmin {
@@ -329,6 +330,7 @@ func (s *sSysLog) List(ctx context.Context, in sysin.LogListInp) (list []*sysin.
}
list[i].MemberName = memberName.String()
}
// 接口
if list[i].AppId == consts.AppApi {
//memberName, err = dao.Member.Ctx(ctx).Fields("realname").Where("id", res.List[i].MemberId).Value()
@@ -354,7 +356,7 @@ func (s *sSysLog) List(ctx context.Context, in sysin.LogListInp) (list []*sysin.
list[i].Url = gstr.StrTillEx(list[i].Url, "?")
}
if isDemo.Bool() {
if isDemo {
list[i].HeaderData = gjson.New(`{
"none": [
"` + consts.DemoTips + `"
@@ -364,5 +366,5 @@ func (s *sSysLog) List(ctx context.Context, in sysin.LogListInp) (list []*sysin.
}
return list, totalCount, err
return
}

View File

@@ -3,7 +3,6 @@
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package sys
import (
@@ -79,13 +78,8 @@ func (s *sSysLoginLog) List(ctx context.Context, in sysin.LoginLogListInp) (list
)...)
totalCount, err = mod.Clone().Count(1)
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
}
if totalCount == 0 {
return list, totalCount, nil
if err != nil || totalCount == 0 {
return
}
//关联表select
@@ -99,7 +93,6 @@ func (s *sSysLoginLog) List(ctx context.Context, in sysin.LoginLogListInp) (list
}
for _, v := range list {
//g.DumpWithType(v)
//// 获取省市编码对应的地区名称
//region, err := location.ParseRegion(ctx, v.SysLogProvinceId, v.SysLogCityId, 0)
//if err != nil {
@@ -110,20 +103,20 @@ func (s *sSysLoginLog) List(ctx context.Context, in sysin.LoginLogListInp) (list
v.Browser = useragent.GetBrowser(v.SysLogUserAgent)
}
return list, totalCount, err
return
}
// Export 导出登录日志
func (s *sSysLoginLog) Export(ctx context.Context, in sysin.LoginLogListInp) (err error) {
list, totalCount, err := s.List(ctx, in)
if err != nil {
return err
return
}
// 字段的排序是依据tags的字段顺序如果你不想使用默认的排序方式可以直接定义 tags = []string{"字段名称", "字段名称2", ...}
tags, err := convert.GetEntityDescTags(sysin.LoginLogExportModel{})
if err != nil {
return err
return
}
var (
@@ -132,35 +125,24 @@ func (s *sSysLoginLog) Export(ctx context.Context, in sysin.LoginLogListInp) (er
exports []sysin.LoginLogExportModel
)
err = gconv.Scan(list, &exports)
if err != nil {
return err
}
if err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName); err != nil {
if err = gconv.Scan(list, &exports); err != nil {
return
}
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
return
}
// Delete 删除登录日志
func (s *sSysLoginLog) Delete(ctx context.Context, in sysin.LoginLogDeleteInp) (err error) {
_, err = dao.SysLoginLog.Ctx(ctx).Where(dao.SysLoginLog.Columns().Id, in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// View 获取登录日志指定信息
func (s *sSysLoginLog) View(ctx context.Context, in sysin.LoginLogViewInp) (res *sysin.LoginLogViewModel, err error) {
if err = dao.SysLoginLog.Ctx(ctx).Where(dao.SysLoginLog.Columns().Id, in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
return res, nil
err = dao.SysLoginLog.Ctx(ctx).Where(dao.SysLoginLog.Columns().Id, in.Id).Scan(&res)
return
}
// Push 推送登录日志
@@ -184,13 +166,13 @@ func (s *sSysLoginLog) Push(ctx context.Context, in sysin.LoginLogPushInp) {
}
if err := queue.Push(consts.QueueLoginLogTopic, models); err != nil {
g.Log().Warningf(ctx, "sSysLoginLog.Push err:%+v", err)
g.Log().Warningf(ctx, "sSysLoginLog.Push err:%+v, models:%+v", err, models)
}
return
}
// RealWrite 真实写入
func (s *sSysLoginLog) RealWrite(ctx context.Context, models entity.SysLoginLog) (err error) {
_, err = dao.SysLoginLog.Ctx(ctx).Data(models).FieldsEx(dao.SysLoginLog.Columns().Id).Insert()
_, err = dao.SysLoginLog.Ctx(ctx).FieldsEx(dao.SysLog.Columns().Id).Data(models).Insert()
return
}

View File

@@ -10,7 +10,6 @@ import (
"context"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv"
"hotgo/internal/consts"
"hotgo/internal/dao"
@@ -38,7 +37,7 @@ func (s *sSysProvinces) Tree(ctx context.Context) (list []g.Map, err error) {
var models []*entity.SysProvinces
if err = dao.SysProvinces.Ctx(ctx).Order("pid asc,id asc,sort asc").Scan(&models); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, err
return
}
list = gconv.SliceMap(models)
@@ -51,36 +50,30 @@ func (s *sSysProvinces) Tree(ctx context.Context) (list []g.Map, err error) {
}
// Delete 删除
func (s *sSysProvinces) Delete(ctx context.Context, in sysin.ProvincesDeleteInp) error {
var (
models *entity.SysProvinces
)
err := dao.SysProvinces.Ctx(ctx).Where("id", in.Id).Scan(&models)
if err != nil {
return err
func (s *sSysProvinces) Delete(ctx context.Context, in sysin.ProvincesDeleteInp) (err error) {
var models *entity.SysProvinces
if err = dao.SysProvinces.Ctx(ctx).Where("id", in.Id).Scan(&models); err != nil {
return
}
if models == nil {
return gerror.New("数据不存在或已删除!")
err = gerror.New("数据不存在或已删除!")
return
}
pidExist, err := dao.SysProvinces.Ctx(ctx).Where("pid", models.Id).One()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
return
}
if !pidExist.IsEmpty() {
return gerror.New("请先删除该地区下得所有子级!")
err = gerror.New("请先删除该地区下得所有子级!")
return
}
_, err = dao.SysProvinces.Ctx(ctx).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// Edit 修改/新增
@@ -98,7 +91,7 @@ func (s *sSysProvinces) Edit(ctx context.Context, in sysin.ProvincesEditInp) (er
// 关系树
in.Pid, in.Level, in.Tree, err = hgorm.GenSubTree(ctx, dao.SysProvinces, in.Pid)
if err != nil {
return err
return
}
isUpdate := false
@@ -114,70 +107,52 @@ func (s *sSysProvinces) Edit(ctx context.Context, in sysin.ProvincesEditInp) (er
// 修改
if isUpdate {
_, err = dao.SysProvinces.Ctx(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// 新增
_, err = dao.SysProvinces.Ctx(ctx).Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// Status 更新部门状态
func (s *sSysProvinces) Status(ctx context.Context, in sysin.ProvincesStatusInp) (err error) {
if in.Id <= 0 {
err = gerror.New("ID不能为空")
return err
return
}
if in.Status <= 0 {
err = gerror.New("状态不能为空")
return err
return
}
if !validate.InSliceInt(consts.StatusMap, in.Status) {
err = gerror.New("状态不正确")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
_, err = dao.SysProvinces.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// MaxSort 最大排序
func (s *sSysProvinces) MaxSort(ctx context.Context, in sysin.ProvincesMaxSortInp) (res *sysin.ProvincesMaxSortModel, err error) {
if err = dao.SysProvinces.Ctx(ctx).Fields(dao.SysProvinces.Columns().Sort).OrderDesc(dao.SysProvinces.Columns().Sort).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
return
}
if res == nil {
res = new(sysin.ProvincesMaxSortModel)
}
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return res, nil
return
}
// View 获取指定字典类型信息
func (s *sSysProvinces) View(ctx context.Context, in sysin.ProvincesViewInp) (res *sysin.ProvincesViewModel, err error) {
if err = dao.SysProvinces.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
return res, nil
err = dao.SysProvinces.Ctx(ctx).Where("id", in.Id).Scan(&res)
return
}
// List 获取列表
@@ -193,21 +168,12 @@ func (s *sSysProvinces) List(ctx context.Context, in sysin.ProvincesListInp) (li
}
totalCount, err = mod.Count()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
if err != nil || totalCount == 0 {
return
}
if totalCount == 0 {
return list, totalCount, nil
}
if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
}
return list, totalCount, err
err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list)
return
}
// ChildrenList 获取省市区下级列表
@@ -227,21 +193,12 @@ func (s *sSysProvinces) ChildrenList(ctx context.Context, in sysin.ProvincesChil
}
totalCount, err = mod.Count()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
if err != nil || totalCount == 0 {
return
}
if totalCount == 0 {
return list, totalCount, nil
}
if err = mod.Page(in.Page, in.PerPage).Order("sort asc,id desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
}
return list, totalCount, err
err = mod.Page(in.Page, in.PerPage).Order("sort asc,id desc").Scan(&list)
return
}
// UniqueId 获取省市区下级列表
@@ -254,10 +211,10 @@ func (s *sSysProvinces) UniqueId(ctx context.Context, in sysin.ProvincesUniqueId
if err = hgorm.IsUnique(ctx, dao.SysProvinces, g.Map{dao.SysProvinces.Columns().Id: in.NewId}, "", in.OldId); err != nil {
res.IsUnique = false
return res, nil
return
}
return res, nil
return
}
// Select 省市区选项

View File

@@ -3,17 +3,14 @@
// @Copyright Copyright (c) 2023 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package sys
import (
"context"
"fmt"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/util/gconv"
"hotgo/internal/consts"
"hotgo/internal/dao"
"hotgo/internal/library/hgorm"
"hotgo/internal/library/hgorm/handler"
@@ -71,38 +68,30 @@ func (s *sSysServeLog) List(ctx context.Context, in sysin.ServeLogListInp) (list
)...)
totalCount, err = mod.Clone().Count(1)
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
}
if totalCount == 0 {
return list, totalCount, nil
if err != nil || totalCount == 0 {
return
}
//关联表select
fields, err := hgorm.GenJoinSelect(ctx, sysin.ServeLogListModel{}, dao.SysServeLog, []*hgorm.Join{
{Dao: dao.SysLog, Alias: "sysLog"},
})
if err = mod.Fields(fields).Handler(handler.FilterAuth).Page(in.Page, in.PerPage).OrderDesc(dao.SysServeLog.Columns().Id).Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
}
return list, totalCount, err
err = mod.Fields(fields).Handler(handler.FilterAuth).Page(in.Page, in.PerPage).OrderDesc(dao.SysServeLog.Columns().Id).Scan(&list)
return
}
// Export 导出服务日志
func (s *sSysServeLog) Export(ctx context.Context, in sysin.ServeLogListInp) (err error) {
list, totalCount, err := s.List(ctx, in)
if err != nil {
return err
return
}
// 字段的排序是依据tags的字段顺序如果你不想使用默认的排序方式可以直接定义 tags = []string{"字段名称", "字段名称2", ...}
tags, err := convert.GetEntityDescTags(sysin.ServeLogExportModel{})
if err != nil {
return err
return
}
var (
@@ -111,39 +100,28 @@ func (s *sSysServeLog) Export(ctx context.Context, in sysin.ServeLogListInp) (er
exports []sysin.ServeLogExportModel
)
err = gconv.Scan(list, &exports)
if err != nil {
if err = gconv.Scan(list, &exports); err != nil {
return err
}
if err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName); err != nil {
return
}
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
return
}
// Delete 删除服务日志
func (s *sSysServeLog) Delete(ctx context.Context, in sysin.ServeLogDeleteInp) (err error) {
_, err = dao.SysServeLog.Ctx(ctx).Where(dao.SysServeLog.Columns().Id, in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// View 获取服务日志指定信息
func (s *sSysServeLog) View(ctx context.Context, in sysin.ServeLogViewInp) (res *sysin.ServeLogViewModel, err error) {
if err = dao.SysServeLog.Ctx(ctx).Where(dao.SysServeLog.Columns().Id, in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
return res, nil
err = dao.SysServeLog.Ctx(ctx).Where(dao.SysServeLog.Columns().Id, in.Id).Scan(&res)
return
}
// RealWrite 真实写入
func (s *sSysServeLog) RealWrite(ctx context.Context, models entity.SysServeLog) (err error) {
_, err = dao.SysServeLog.Ctx(ctx).Data(models).FieldsEx(dao.SysServeLog.Columns().Id).Insert()
_, err = dao.SysServeLog.Ctx(ctx).FieldsEx(dao.SysLog.Columns().Id).Data(models).Insert()
return
}

View File

@@ -18,6 +18,7 @@ import (
"hotgo/internal/library/sms"
"hotgo/internal/model"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/form"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"hotgo/utility/validate"
@@ -35,93 +36,75 @@ func init() {
}
// Delete 删除
func (s *sSysSmsLog) Delete(ctx context.Context, in sysin.SmsLogDeleteInp) error {
_, err := dao.SysSmsLog.Ctx(ctx).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
func (s *sSysSmsLog) Delete(ctx context.Context, in sysin.SmsLogDeleteInp) (err error) {
_, err = dao.SysSmsLog.Ctx(ctx).Where("id", in.Id).Delete()
return
}
// Edit 修改/新增
func (s *sSysSmsLog) Edit(ctx context.Context, in sysin.SmsLogEditInp) (err error) {
if in.Ip == "" {
err = gerror.New("ip不能为空")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
if in.Id > 0 {
_, err = dao.SysSmsLog.Ctx(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// 新增
in.CreatedAt = gtime.Now()
_, err = dao.SysSmsLog.Ctx(ctx).Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// Status 更新部门状态
func (s *sSysSmsLog) Status(ctx context.Context, in sysin.SmsLogStatusInp) (err error) {
if in.Id <= 0 {
err = gerror.New("ID不能为空")
return err
return
}
if in.Status <= 0 {
err = gerror.New("状态不能为空")
return err
return
}
if !validate.InSliceInt(consts.StatusMap, in.Status) {
err = gerror.New("状态不正确")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
_, err = dao.SysSmsLog.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// MaxSort 最大排序
func (s *sSysSmsLog) MaxSort(ctx context.Context, in sysin.SmsLogMaxSortInp) (*sysin.SmsLogMaxSortModel, error) {
var res sysin.SmsLogMaxSortModel
func (s *sSysSmsLog) MaxSort(ctx context.Context, in sysin.SmsLogMaxSortInp) (res *sysin.SmsLogMaxSortModel, err error) {
if in.Id > 0 {
if err := dao.SysSmsLog.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
if err = dao.SysSmsLog.Ctx(ctx).Where("id", in.Id).Order("sort desc").Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
return
}
}
res.Sort = res.Sort + 10
return &res, nil
if res == nil {
res = new(sysin.SmsLogMaxSortModel)
}
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return
}
// View 获取指定字典类型信息
func (s *sSysSmsLog) View(ctx context.Context, in sysin.SmsLogViewInp) (res *sysin.SmsLogViewModel, err error) {
if err = dao.SysSmsLog.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
return
}
return res, nil
return
}
// List 获取列表
@@ -165,31 +148,32 @@ func (s *sSysSmsLog) List(ctx context.Context, in sysin.SmsLogListInp) (list []*
// SendCode 发送验证码
func (s *sSysSmsLog) SendCode(ctx context.Context, in sysin.SendCodeInp) (err error) {
if in.Event == "" {
return gerror.New("事件不能为空")
err = gerror.New("事件不能为空")
return
}
if in.Mobile == "" {
return gerror.New("手机号不能为空")
err = gerror.New("手机号不能为空")
return
}
var models *entity.SysSmsLog
if err = dao.SysSmsLog.Ctx(ctx).Where("event", in.Event).Where("mobile", in.Mobile).Scan(&models); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
return
}
config, err := service.SysConfig().GetSms(ctx)
if err != nil {
return err
return
}
in.Template, err = s.GetTemplate(ctx, in.Event, config)
if err != nil {
return err
if in.Template, err = s.GetTemplate(ctx, in.Event, config); err != nil {
return
}
err = s.AllowSend(ctx, models, config)
if err != nil {
return err
if err = s.AllowSend(ctx, models, config); err != nil {
return
}
if in.Code == "" {
@@ -197,7 +181,7 @@ func (s *sSysSmsLog) SendCode(ctx context.Context, in sysin.SendCodeInp) (err er
}
if err = sms.New(config.SmsDrive).SendCode(ctx, in, config); err != nil {
return err
return
}
var data = new(entity.SysSmsLog)
@@ -210,29 +194,27 @@ func (s *sSysSmsLog) SendCode(ctx context.Context, in sysin.SendCodeInp) (err er
data.UpdatedAt = gtime.Now()
_, err = dao.SysSmsLog.Ctx(ctx).Data(data).Insert()
if err != nil {
return err
}
return nil
return
}
// GetTemplate 获取指定短信模板
func (s *sSysSmsLog) GetTemplate(ctx context.Context, template string, config *model.SmsConfig) (val string, err error) {
if template == "" {
return "", gerror.New("模板不能为空")
err = gerror.New("模板不能为空")
return
}
if config == nil {
config, err = service.SysConfig().GetSms(ctx)
if err != nil {
return "", err
return
}
}
switch config.SmsDrive {
case consts.SmsDriveAliYun:
if len(config.AliYunTemplate) == 0 {
return "", gerror.New("管理员还没有配置任何阿里云短信模板!")
err = gerror.New("管理员还没有配置任何阿里云短信模板!")
return
}
for _, v := range config.AliYunTemplate {
@@ -243,7 +225,8 @@ func (s *sSysSmsLog) GetTemplate(ctx context.Context, template string, config *m
case consts.SmsDriveTencent:
if len(config.TencentTemplate) == 0 {
return "", gerror.New("管理员还没有配置任何腾讯云短信模板!")
err = gerror.New("管理员还没有配置任何腾讯云短信模板!")
return
}
for _, v := range config.TencentTemplate {
@@ -252,7 +235,8 @@ func (s *sSysSmsLog) GetTemplate(ctx context.Context, template string, config *m
}
}
default:
return "", gerror.Newf("暂不支持短信驱动:%v", config.SmsDrive)
err = gerror.Newf("暂不支持短信驱动:%v", config.SmsDrive)
return
}
return
@@ -261,18 +245,18 @@ func (s *sSysSmsLog) GetTemplate(ctx context.Context, template string, config *m
// AllowSend 是否允许发送
func (s *sSysSmsLog) AllowSend(ctx context.Context, models *entity.SysSmsLog, config *model.SmsConfig) (err error) {
if models == nil {
return nil
return
}
if config == nil {
config, err = service.SysConfig().GetSms(ctx)
if err != nil {
return err
if config, err = service.SysConfig().GetSms(ctx); err != nil {
return
}
}
if gtime.Now().Before(models.CreatedAt.Add(time.Second * time.Duration(config.SmsMinInterval))) {
return gerror.New("发送频繁,请稍后再试!")
err = gerror.New("发送频繁,请稍后再试!")
return
}
if config.SmsMaxIpLimit > 0 {
@@ -282,7 +266,8 @@ func (s *sSysSmsLog) AllowSend(ctx context.Context, models *entity.SysSmsLog, co
}
if count >= config.SmsMaxIpLimit {
return gerror.New("今天发送短信过多,请次日后再试!")
err = gerror.New("今天发送短信过多,请次日后再试!")
return err
}
}
@@ -292,48 +277,52 @@ func (s *sSysSmsLog) AllowSend(ctx context.Context, models *entity.SysSmsLog, co
// VerifyCode 效验验证码
func (s *sSysSmsLog) VerifyCode(ctx context.Context, in sysin.VerifyCodeInp) (err error) {
if in.Event == "" {
return gerror.New("事件不能为空")
err = gerror.New("事件不能为空")
return
}
if in.Mobile == "" {
return gerror.New("手机号不能为空")
err = gerror.New("手机号不能为空")
return
}
config, err := service.SysConfig().GetSms(ctx)
if err != nil {
return err
return
}
var models *entity.SysSmsLog
if err = dao.SysSmsLog.Ctx(ctx).Where("event", in.Event).Where("mobile", in.Mobile).Order("id desc").Scan(&models); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
return
}
if models == nil {
return gerror.New("验证码错误")
err = gerror.New("验证码错误")
return
}
if models.Times >= 10 {
return gerror.New("验证码错误次数过多,请重新发送!")
err = gerror.New("验证码错误次数过多,请重新发送!")
return
}
if in.Event != consts.SmsTemplateCode {
if models.Status == consts.SmsStatusUsed {
return gerror.New("验证码已使用,请重新发送!")
err = gerror.New("验证码已使用,请重新发送!")
return
}
}
if gtime.Now().After(models.CreatedAt.Add(time.Second * time.Duration(config.SmsCodeExpire))) {
return gerror.New("验证码已过期,请重新发送")
err = gerror.New("验证码已过期,请重新发送")
return
}
if models.Code != in.Code {
_, err = dao.SysSmsLog.Ctx(ctx).Where("id", models.Id).Increment("times", 1)
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return gerror.New("验证码错误!")
dao.SysSmsLog.Ctx(ctx).Where("id", models.Id).Increment("times", 1)
err = gerror.New("验证码错误!")
return
}
_, err = dao.SysSmsLog.Ctx(ctx).Where("id", models.Id).Data(g.Map{