版本预发布

This commit is contained in:
孟帅
2023-02-08 20:29:34 +08:00
parent f11c7c5bf2
commit 2068d05c93
269 changed files with 16122 additions and 12075 deletions

View File

@@ -54,14 +54,14 @@ var (
g.Log().Debug(ctx, "starting all server")
simple.SafeGo(ctx, func(ctx context.Context) {
if err := Http.Func(ctx, parser); err != nil {
g.Log().Fatal(ctx, "http server start fail:", err)
if err := Queue.Func(ctx, parser); err != nil {
g.Log().Fatal(ctx, "queue consumer start fail:", err)
}
})
simple.SafeGo(ctx, func(ctx context.Context) {
if err := Queue.Func(ctx, parser); err != nil {
g.Log().Fatal(ctx, "queue consumer start fail:", err)
if err := Http.Func(ctx, parser); err != nil {
g.Log().Fatal(ctx, "http server start fail:", err)
}
})

View File

@@ -36,7 +36,8 @@ var (
})
// 请求结束事件回调
s.BindHookHandler("/*any", ghttp.HookAfterOutput, service.Hook().GlobalLog)
s.BindHookHandler("/*any", ghttp.HookAfterOutput, service.Hook().AccessLog)
s.BindHookHandler("/*any", ghttp.HookAfterOutput, service.Hook().LastActive)
s.Group("/", func(group *ghttp.RouterGroup) {
@@ -74,7 +75,7 @@ var (
// Just run the server.
s.Run()
return nil
return
},
}
)
@@ -83,7 +84,6 @@ func setSSL(ctx context.Context, s *ghttp.Server) {
config, err := service.SysConfig().GetLoadSSL(ctx)
if err != nil {
g.Log().Fatal(ctx, "ssl配置获取失败err:%+v", err)
return
}
if config != nil && config.Switch {
s.EnableHTTPS(config.CrtPath, config.KeyPath)

View File

@@ -10,5 +10,6 @@ package consts
const (
DemoTips = "演示系统已隐藏"
NilJsonToString = "{}" // 空json初始化值
NilJsonToString = "{}" // 空json初始化值
RegionSpilt = " / " // 地区分隔符
)

View File

@@ -0,0 +1,39 @@
package consts
import "github.com/gogf/gf/v2/frame/g"
// 邮件内置模板
const (
EmsTemplateText = "text" // 通用文本
EmsTemplateCode = "code" // 通用验证码
EmsTemplateLogin = "login" // 登录
EmsTemplateRegister = "register" // 注册
EmsTemplateResetPwd = "resetPwd" // 重置密码
EmsTemplateBind = "bind" // 绑定邮箱
EmsTemplateCash = "cash" // 申请提现
)
// 验证码状态
const (
EmsStatusNotUsed = 1 // 未使用
EmsStatusUsed = 2 // 已使用
)
var EmsSubjectMap = g.MapStrStr{
EmsTemplateText: "这是一封来自HotGo的邮件",
EmsTemplateCode: "验证码",
EmsTemplateLogin: "登录验证码",
EmsTemplateRegister: "注册验证码",
EmsTemplateResetPwd: "重置密码",
EmsTemplateBind: "绑定邮箱验证码",
EmsTemplateCash: "申请提现验证码",
}
// IsCodeEmsTemplate 是否是验证码类型的模板
func IsCodeEmsTemplate(template string) bool {
return template == EmsTemplateCode ||
template == EmsTemplateLogin ||
template == EmsTemplateRegister ||
template == EmsTemplateBind ||
template == EmsTemplateCash
}

View File

@@ -21,6 +21,13 @@ var GenCodesTypeNameMap = map[int]string{
GenCodesTypeCron: "定时任务(未实现)",
}
var GenCodesTypeConfMap = map[int]string{
GenCodesTypeCurd: "crud",
GenCodesTypeTree: "tree",
GenCodesTypeQueue: "queue",
GenCodesTypeCron: "cron",
}
// 生成代码状态
const (
GenCodesStatusOk = 1 // 生成成功

View File

@@ -0,0 +1,8 @@
package consts
// 公告类型
const (
NoticeTypeNotify = 1 // 通知
NoticeTypeNotice = 2 // 公告
NoticeTypeLetter = 3 // 私信
)

View File

@@ -17,7 +17,7 @@ const (
SmsTemplateCash = "cash" // 申请提现
)
// 短信状态
// 验证码状态
const (
SmsStatusNotUsed = 1 // 未使用
SmsStatusUsed = 2 // 已使用

View File

@@ -8,5 +8,5 @@ package consts
// VersionApp HotGo版本
const (
VersionApp = "2.1.2"
VersionApp = "2.1.3"
)

View File

@@ -21,122 +21,102 @@ var (
type cDept struct{}
// NameUnique 名称是否唯一
func (c *cDept) NameUnique(ctx context.Context, req *dept.NameUniqueReq) (*dept.NameUniqueRes, error) {
func (c *cDept) NameUnique(ctx context.Context, req *dept.NameUniqueReq) (res *dept.NameUniqueRes, err error) {
data, err := service.AdminDept().NameUnique(ctx, adminin.DeptNameUniqueInp{Id: req.Id, Name: req.Name})
if err != nil {
return nil, err
return
}
var res dept.NameUniqueRes
res = new(dept.NameUniqueRes)
res.IsUnique = data.IsUnique
return &res, nil
return
}
// Delete 删除
func (c *cDept) Delete(ctx context.Context, req *dept.DeleteReq) (res *dept.DeleteRes, err error) {
var in adminin.DeptDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.AdminDept().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.AdminDept().Delete(ctx, in)
return
}
// Edit 更新
func (c *cDept) Edit(ctx context.Context, req *dept.EditReq) (res *dept.EditRes, err error) {
var in adminin.DeptEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.AdminDept().Edit(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.AdminDept().Edit(ctx, in)
return
}
// MaxSort 最大排序
func (c *cDept) MaxSort(ctx context.Context, req *dept.MaxSortReq) (*dept.MaxSortRes, error) {
func (c *cDept) MaxSort(ctx context.Context, req *dept.MaxSortReq) (res *dept.MaxSortRes, err error) {
data, err := service.AdminDept().MaxSort(ctx, adminin.DeptMaxSortInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res dept.MaxSortRes
res = new(dept.MaxSortRes)
res.Sort = data.Sort
return &res, nil
return
}
// View 获取指定信息
func (c *cDept) View(ctx context.Context, req *dept.ViewReq) (*dept.ViewRes, error) {
func (c *cDept) View(ctx context.Context, req *dept.ViewReq) (res *dept.ViewRes, err error) {
data, err := service.AdminDept().View(ctx, adminin.DeptViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res dept.ViewRes
res = new(dept.ViewRes)
res.DeptViewModel = data
return &res, nil
return
}
// List 查看列表
func (c *cDept) List(ctx context.Context, req *dept.ListReq) (*dept.ListRes, error) {
var (
in adminin.DeptListInp
res dept.ListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cDept) List(ctx context.Context, req *dept.ListReq) (res *dept.ListRes, err error) {
var in adminin.DeptListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
data, err := service.AdminDept().List(ctx, in)
if err != nil {
return nil, err
return
}
_ = gconv.Structs(data, &res)
return &res, nil
res = (*dept.ListRes)(&data)
return
}
// ListTree 查看列表树
func (c *cDept) ListTree(ctx context.Context, req *dept.ListTreeReq) (*dept.ListTreeRes, error) {
var (
in adminin.DeptListTreeInp
res dept.ListTreeRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cDept) ListTree(ctx context.Context, req *dept.ListTreeReq) (res *dept.ListTreeRes, err error) {
var in adminin.DeptListTreeInp
if err = gconv.Scan(req, &in); err != nil {
return
}
data, err := service.AdminDept().ListTree(ctx, in)
if err != nil {
return nil, err
return
}
_ = gconv.Structs(data, &res)
return &res, nil
res = (*dept.ListTreeRes)(&data)
return
}
// Status 更新部门状态
func (c *cDept) Status(ctx context.Context, req *dept.StatusReq) (res *dept.StatusRes, err error) {
var in adminin.DeptStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.AdminDept().Status(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.AdminDept().Status(ctx, in)
return
}

View File

@@ -23,269 +23,228 @@ var (
type cMember struct{}
// UpdateProfile 修改登录密码
func (c *cMember) UpdateProfile(ctx context.Context, req *member.UpdateProfileReq) (res *member.UpdateProfileRes, err error) {
// UpdateCash 修改代理商提现信息
func (c *cMember) UpdateCash(ctx context.Context, req *member.UpdateCashReq) (res *member.UpdateCashRes, err error) {
var in adminin.MemberUpdateCashInp
if err = gconv.Scan(req, &in); err != nil {
return
}
err = service.AdminMember().UpdateCash(ctx, in)
return
}
// UpdateEmail 换绑邮箱
func (c *cMember) UpdateEmail(ctx context.Context, req *member.UpdateEmailReq) (res *member.UpdateEmailRes, err error) {
var in adminin.MemberUpdateEmailInp
if err = gconv.Scan(req, &in); err != nil {
return
}
err = service.AdminMember().UpdateEmail(ctx, in)
return
}
// UpdateMobile 换绑手机号
func (c *cMember) UpdateMobile(ctx context.Context, req *member.UpdateMobileReq) (res *member.UpdateMobileRes, err error) {
var in adminin.MemberUpdateMobileInp
if err = gconv.Scan(req, &in); err != nil {
return
}
err = service.AdminMember().UpdateMobile(ctx, in)
return
}
// UpdateProfile 更新用户资料
func (c *cMember) UpdateProfile(ctx context.Context, req *member.UpdateProfileReq) (res *member.UpdateProfileRes, err error) {
var in adminin.MemberUpdateProfileInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.AdminMember().UpdateProfile(ctx, in); err != nil {
return nil, err
return
}
err = service.AdminMember().UpdateProfile(ctx, in)
return
}
// UpdatePwd 修改登录密码
func (c *cMember) UpdatePwd(ctx context.Context, req *member.UpdatePwdReq) (res *member.UpdatePwdRes, err error) {
memberId := contexts.Get(ctx).User.Id
var memberId = contexts.Get(ctx).User.Id
if memberId <= 0 {
err := gerror.New("获取用户信息失败!")
err = gerror.New("获取用户信息失败!")
return nil, err
}
if err = service.AdminMember().
UpdatePwd(ctx, adminin.MemberUpdatePwdInp{Id: memberId, OldPassword: req.OldPassword, NewPassword: req.NewPassword}); err != nil {
return nil, err
var in = adminin.MemberUpdatePwdInp{
Id: memberId,
OldPassword: req.OldPassword,
NewPassword: req.NewPassword,
}
err = service.AdminMember().UpdatePwd(ctx, in)
return
}
// Profile 获取登录用户的基本信息
func (c *cMember) Profile(ctx context.Context, req *member.ProfileReq) (*member.ProfileRes, error) {
var res member.ProfileRes
memberId := contexts.Get(ctx).User.Id
if memberId <= 0 {
err := gerror.New("获取用户信息失败!")
return nil, err
}
// 用户基本信息
memberInfo, err := service.AdminMember().View(ctx, adminin.MemberViewInp{Id: memberId})
if err != nil {
return nil, err
}
res.User = memberInfo
// 所在部门
sysDept, err := service.AdminDept().View(ctx, adminin.DeptViewInp{Id: memberInfo.DeptId})
if err != nil {
return nil, err
}
res.SysDept = sysDept
// 角色列表
sysRoles, err := service.AdminRole().GetMemberList(ctx, memberInfo.RoleId)
if err != nil {
return nil, err
}
res.SysRoles = sysRoles
// 获取角色名称
roleGroup, err := service.AdminRole().GetName(ctx, memberInfo.RoleId)
if err != nil {
return nil, err
}
res.RoleGroup = roleGroup
// 获取第一岗位名称
postGroup, err := service.AdminPost().GetMemberByStartName(ctx, memberInfo.Id)
if err != nil {
return nil, err
}
res.PostGroup = postGroup
return &res, nil
}
// ResetPwd 重置密码
func (c *cMember) ResetPwd(ctx context.Context, req *member.ResetPwdReq) (res *member.ResetPwdRes, err error) {
if err = service.AdminMember().
ResetPwd(ctx, adminin.MemberResetPwdInp{Id: req.Id, Password: req.Password}); err != nil {
return nil, err
var in = adminin.MemberResetPwdInp{
Id: req.Id,
Password: req.Password,
}
err = service.AdminMember().ResetPwd(ctx, in)
return
}
// EmailUnique 邮箱是否唯一
func (c *cMember) EmailUnique(ctx context.Context, req *member.EmailUniqueReq) (*member.EmailUniqueRes, error) {
data, err := service.AdminMember().EmailUnique(ctx, adminin.MemberEmailUniqueInp{Id: req.Id, Email: req.Email})
if err != nil {
return nil, err
func (c *cMember) EmailUnique(ctx context.Context, req *member.EmailUniqueReq) (res *member.EmailUniqueRes, err error) {
var in = adminin.MemberEmailUniqueInp{
Id: req.Id,
Email: req.Email,
}
var res member.EmailUniqueRes
data, err := service.AdminMember().EmailUnique(ctx, in)
if err != nil {
return
}
res = new(member.EmailUniqueRes)
res.IsUnique = data.IsUnique
return &res, nil
return
}
// MobileUnique 手机号是否唯一
func (c *cMember) MobileUnique(ctx context.Context, req *member.MobileUniqueReq) (*member.MobileUniqueRes, error) {
data, err := service.AdminMember().MobileUnique(ctx, adminin.MemberMobileUniqueInp{Id: req.Id, Mobile: req.Mobile})
if err != nil {
return nil, err
func (c *cMember) MobileUnique(ctx context.Context, req *member.MobileUniqueReq) (res *member.MobileUniqueRes, err error) {
var in = adminin.MemberMobileUniqueInp{
Id: req.Id,
Mobile: req.Mobile,
}
var res member.MobileUniqueRes
data, err := service.AdminMember().MobileUnique(ctx, in)
if err != nil {
return
}
res = new(member.MobileUniqueRes)
res.IsUnique = data.IsUnique
return &res, nil
return
}
// NameUnique 名称是否唯一
func (c *cMember) NameUnique(ctx context.Context, req *member.NameUniqueReq) (*member.NameUniqueRes, error) {
data, err := service.AdminMember().NameUnique(ctx, adminin.MemberNameUniqueInp{Id: req.Id, Username: req.Username})
if err != nil {
return nil, err
func (c *cMember) NameUnique(ctx context.Context, req *member.NameUniqueReq) (res *member.NameUniqueRes, err error) {
var in = adminin.MemberNameUniqueInp{
Id: req.Id,
Username: req.Username,
}
var res member.NameUniqueRes
data, err := service.AdminMember().NameUnique(ctx, in)
if err != nil {
return
}
res = new(member.NameUniqueRes)
res.IsUnique = data.IsUnique
return &res, nil
return
}
// Delete 删除
func (c *cMember) Delete(ctx context.Context, req *member.DeleteReq) (res *member.DeleteRes, err error) {
var in adminin.MemberDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.AdminMember().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.AdminMember().Delete(ctx, in)
return
}
// Edit 修改/新增
func (c *cMember) Edit(ctx context.Context, req *member.EditReq) (res *member.EditRes, err error) {
var in adminin.MemberEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
in.PostIds = req.PostIds
if err = service.AdminMember().Edit(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.AdminMember().Edit(ctx, in)
return
}
// MaxSort 最大排序
func (c *cMember) MaxSort(ctx context.Context, req *member.MaxSortReq) (*member.MaxSortRes, error) {
data, err := service.AdminMember().MaxSort(ctx, adminin.MemberMaxSortInp{Id: req.Id})
func (c *cMember) MaxSort(ctx context.Context, req *member.MaxSortReq) (res *member.MaxSortRes, err error) {
var in = adminin.MemberMaxSortInp{Id: req.Id}
data, err := service.AdminMember().MaxSort(ctx, in)
if err != nil {
return nil, err
return
}
var res member.MaxSortRes
res = new(member.MaxSortRes)
res.Sort = data.Sort
return &res, nil
return
}
// View 获取指定信息
func (c *cMember) View(ctx context.Context, req *member.ViewReq) (*member.ViewRes, error) {
postsList, _, err := service.AdminPost().List(ctx, adminin.PostListInp{})
func (c *cMember) View(ctx context.Context, req *member.ViewReq) (res *member.ViewRes, err error) {
data, err := service.AdminMember().View(ctx, adminin.MemberViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
//roleList, _, err := service.AdminRole().List(ctx, adminin.RoleListInp{})
//if err != nil {
// return nil, err
//}
var res member.ViewRes
res.Posts = postsList
//res.Roles = roleList
if req.Id <= 0 {
return &res, err
}
memberInfo, err := service.AdminMember().View(ctx, adminin.MemberViewInp{Id: req.Id})
if err != nil {
return nil, err
}
res.MemberViewModel = memberInfo
res.PostIds, err = service.AdminMemberPost().GetMemberByIds(ctx, memberInfo.Id)
if err != nil {
return nil, err
}
res.RoleIds = []int64{memberInfo.RoleId}
res.DeptName, err = service.AdminDept().GetName(ctx, memberInfo.DeptId)
if err != nil {
return nil, err
}
return &res, nil
res = new(member.ViewRes)
res.MemberViewModel = data
return
}
// List 查看列表
func (c *cMember) List(ctx context.Context, req *member.ListReq) (*member.ListRes, error) {
var (
in adminin.MemberListInp
res member.ListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cMember) List(ctx context.Context, req *member.ListReq) (res *member.ListRes, err error) {
var in adminin.MemberListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.AdminMember().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(member.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Info 登录用户信息
func (c *cMember) Info(ctx context.Context, req *member.InfoReq) (res *member.InfoRes, err error) {
model, err := service.AdminMember().LoginMemberInfo(ctx, req)
// LoginInfo 登录用户信息
func (c *cMember) LoginInfo(ctx context.Context, req *member.LoginInfoReq) (res *member.LoginInfoRes, err error) {
data, err := service.AdminMember().LoginMemberInfo(ctx)
if err != nil {
return nil, err
return
}
if err = gconv.Scan(model, &res); err != nil {
return nil, err
}
res = new(member.LoginInfoRes)
res.LoginMemberInfoModel = data
return
}
// Status 更新状态
func (c *cMember) Status(ctx context.Context, req *member.StatusReq) (res *member.StatusRes, err error) {
var in adminin.MemberStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.AdminMember().Status(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.AdminMember().Status(ctx, in)
return
}
// Select 获取可选的后台用户选项
func (c *cMember) Select(ctx context.Context, req *member.SelectReq) (res *member.SelectRes, err error) {
data, err := service.AdminMember().Select(ctx, adminin.MemberSelectInp{})
if err != nil {
return
}
res = (*member.SelectRes)(&data)
return
}

View File

@@ -22,99 +22,67 @@ var (
type cMenu struct{}
// RoleList 查询角色菜单列表
func (c *cMenu) RoleList(ctx context.Context, req *menu.RoleListReq) (*menu.RoleListRes, error) {
func (c *cMenu) RoleList(ctx context.Context, req *menu.RoleListReq) (res *menu.RoleListRes, err error) {
var in adminin.MenuRoleListInp
if err := gconv.Scan(req, &in); err != nil {
return nil, err
if err = gconv.Scan(req, &in); err != nil {
return
}
data, err := service.AdminMenu().RoleList(ctx, in)
if err != nil {
return nil, err
return
}
var res menu.RoleListRes
res = new(menu.RoleListRes)
res.CheckedKeys = data.CheckedKeys
res.Menus = data.Menus
return &res, nil
return
}
// SearchList 查询菜单列表
func (c *cMenu) SearchList(ctx context.Context, req *menu.SearchListReq) (res *menu.SearchListRes, err error) {
res, err = service.AdminMenu().SearchList(ctx, req)
if err != nil {
return nil, err
}
return res, nil
return
}
// MaxSort 最大排序
func (c *cMenu) MaxSort(ctx context.Context, req *menu.MaxSortReq) (res *menu.MaxSortRes, err error) {
res, err = service.AdminMenu().MaxSort(ctx, req)
if err != nil {
return nil, err
}
return res, nil
return
}
// NameUnique 菜单名称是否唯一
func (c *cMenu) NameUnique(ctx context.Context, req *menu.NameUniqueReq) (res *menu.NameUniqueRes, err error) {
res, err = service.AdminMenu().NameUnique(ctx, req)
if err != nil {
return nil, err
}
return res, nil
return
}
// CodeUnique 菜单编码是否唯一
func (c *cMenu) CodeUnique(ctx context.Context, req *menu.CodeUniqueReq) (res *menu.CodeUniqueRes, err error) {
res, err = service.AdminMenu().CodeUnique(ctx, req)
if err != nil {
return nil, err
}
return res, nil
return
}
// Delete 删除
func (c *cMenu) Delete(ctx context.Context, req *menu.DeleteReq) (res *menu.DeleteRes, err error) {
if err = service.AdminMenu().Delete(ctx, req); err != nil {
return nil, err
}
return res, nil
err = service.AdminMenu().Delete(ctx, req)
return
}
// Edit 更新
func (c *cMenu) Edit(ctx context.Context, req *menu.EditReq) (res *menu.EditRes, err error) {
if err = service.AdminMenu().Edit(ctx, req); err != nil {
return nil, err
}
return res, nil
err = service.AdminMenu().Edit(ctx, req)
return
}
// View 获取信息
func (c *cMenu) View(ctx context.Context, req *menu.ViewReq) (res *menu.ViewRes, err error) {
res, err = service.AdminMenu().View(ctx, req)
if err != nil {
return nil, err
}
return res, nil
return
}
// List 获取列表
func (c *cMenu) List(ctx context.Context, req *menu.ListReq) (res menu.ListRes, err error) {
res.List, err = service.AdminMenu().List(ctx, req)
if err != nil {
return res, err
}
return res, nil
return
}

View File

@@ -42,24 +42,23 @@ func (c *cMonitor) Offline(ctx context.Context, req *monitor.OfflineReq) (res *m
websocket.Close(client)
})
return res, nil
return
}
// View 获取指定信息
func (c *cMonitor) View(ctx context.Context, req *monitor.OnlineViewReq) (*monitor.OnlineViewRes, error) {
return &monitor.OnlineViewRes{}, nil
func (c *cMonitor) View(ctx context.Context, req *monitor.OnlineViewReq) (res *monitor.OnlineViewRes, err error) {
return
}
// OnlineList 获取在线列表
func (c *cMonitor) OnlineList(ctx context.Context, req *monitor.OnlineListReq) (*monitor.OnlineListRes, error) {
func (c *cMonitor) OnlineList(ctx context.Context, req *monitor.OnlineListReq) (res *monitor.OnlineListRes, err error) {
var (
res monitor.OnlineListRes
clients []*monitor.OnlineModel
i int
)
if c.wsManager.GetClientsLen() == 0 {
return &res, nil
return
}
for conn, _ := range c.wsManager.GetClients() {
@@ -90,6 +89,7 @@ func (c *cMonitor) OnlineList(ctx context.Context, req *monitor.OnlineListReq) (
})
}
res = new(monitor.OnlineListRes)
res.PageCount = form.CalPageCount(len(clients), req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
@@ -108,5 +108,5 @@ func (c *cMonitor) OnlineList(ctx context.Context, req *monitor.OnlineListReq) (
}
}
return &res, nil
return
}

View File

@@ -10,6 +10,7 @@ import (
"context"
"github.com/gogf/gf/v2/util/gconv"
"hotgo/api/backend/notice"
"hotgo/internal/consts"
"hotgo/internal/model/input/adminin"
"hotgo/internal/model/input/form"
"hotgo/internal/service"
@@ -25,63 +26,53 @@ type cNotice struct{}
func (c *cNotice) Delete(ctx context.Context, req *notice.DeleteReq) (res *notice.DeleteRes, err error) {
var in adminin.NoticeDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.AdminNotice().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.AdminNotice().Delete(ctx, in)
return
}
// Edit 更新
func (c *cNotice) Edit(ctx context.Context, req *notice.EditReq) (res *notice.EditRes, err error) {
var in adminin.NoticeEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.AdminNotice().Edit(ctx, in); err != nil {
return nil, err
return
}
return res, nil
in.Receiver = req.Receiver
err = service.AdminNotice().Edit(ctx, in)
return
}
// MaxSort 最大排序
func (c *cNotice) MaxSort(ctx context.Context, req *notice.MaxSortReq) (*notice.MaxSortRes, error) {
func (c *cNotice) MaxSort(ctx context.Context, req *notice.MaxSortReq) (res *notice.MaxSortRes, err error) {
data, err := service.AdminNotice().MaxSort(ctx, adminin.NoticeMaxSortInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res notice.MaxSortRes
res = new(notice.MaxSortRes)
res.Sort = data.Sort
return &res, nil
return
}
// View 获取指定信息
func (c *cNotice) View(ctx context.Context, req *notice.ViewReq) (*notice.ViewRes, error) {
func (c *cNotice) View(ctx context.Context, req *notice.ViewReq) (res *notice.ViewRes, err error) {
data, err := service.AdminNotice().View(ctx, adminin.NoticeViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res notice.ViewRes
res = new(notice.ViewRes)
res.NoticeViewModel = data
return &res, nil
return
}
// List 查看列表
func (c *cNotice) List(ctx context.Context, req *notice.ListReq) (*notice.ListRes, error) {
var (
in adminin.NoticeListInp
res notice.ListRes
)
if err := gconv.Scan(req, &in); err != nil {
func (c *cNotice) List(ctx context.Context, req *notice.ListReq) (res *notice.ListRes, err error) {
var in adminin.NoticeListInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
@@ -90,24 +81,123 @@ func (c *cNotice) List(ctx context.Context, req *notice.ListReq) (*notice.ListRe
return nil, err
}
res = new(notice.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Status 更新部门状态
func (c *cNotice) Status(ctx context.Context, req *notice.StatusReq) (res *notice.StatusRes, err error) {
var in adminin.NoticeStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.AdminNotice().Status(ctx, in); err != nil {
err = service.AdminNotice().Status(ctx, in)
return
}
// Notify 更新通知
func (c *cNotice) Notify(ctx context.Context, req *notice.EditNotifyReq) (res *notice.EditNotifyRes, err error) {
var in adminin.NoticeEditInp
if err = gconv.Scan(req, &in); err != nil {
return
}
in.Type = consts.NoticeTypeNotify
in.Receiver = req.Receiver
err = service.AdminNotice().Edit(ctx, in)
return
}
// Notice 更新公告
func (c *cNotice) Notice(ctx context.Context, req *notice.EditNoticeReq) (res *notice.EditNoticeRes, err error) {
var in adminin.NoticeEditInp
if err = gconv.Scan(req, &in); err != nil {
return
}
in.Type = consts.NoticeTypeNotice
in.Receiver = req.Receiver
err = service.AdminNotice().Edit(ctx, in)
return
}
// Letter 更新私信
func (c *cNotice) Letter(ctx context.Context, req *notice.EditLetterReq) (res *notice.EditLetterRes, err error) {
var in adminin.NoticeEditInp
if err = gconv.Scan(req, &in); err != nil {
return
}
in.Type = consts.NoticeTypeLetter
in.Receiver = req.Receiver
err = service.AdminNotice().Edit(ctx, in)
return
}
// UpRead 更新已读
func (c *cNotice) UpRead(ctx context.Context, req *notice.UpReadReq) (res *notice.UpReadRes, err error) {
var in adminin.NoticeUpReadInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
err = service.AdminNotice().UpRead(ctx, in)
return res, nil
}
// PullMessages 拉取未读消息列表
func (c *cNotice) PullMessages(ctx context.Context, req *notice.PullMessagesReq) (res *notice.PullMessagesRes, err error) {
var in adminin.PullMessagesInp
if err = gconv.Scan(req, &in); err != nil {
return
}
if in.Limit == 0 {
in.Limit = 100
}
data, err := service.AdminNotice().PullMessages(ctx, in)
if err != nil {
return
}
res = new(notice.PullMessagesRes)
res.PullMessagesModel = data
return
}
// ReadAll 全部已读
func (c *cNotice) ReadAll(ctx context.Context, req *notice.ReadAllReq) (res *notice.ReadAllRes, err error) {
var in adminin.NoticeReadAllInp
if err = gconv.Scan(req, &in); err != nil {
return
}
err = service.AdminNotice().ReadAll(ctx, in)
return
}
// MessageList 我的消息列表
func (c *cNotice) MessageList(ctx context.Context, req *notice.MessageListReq) (res *notice.MessageListRes, err error) {
var in adminin.NoticeMessageListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.AdminNotice().MessageList(ctx, in)
if err != nil {
return
}
res = new(notice.MessageListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return
}

View File

@@ -24,117 +24,99 @@ type cPost struct{}
func (c *cPost) Delete(ctx context.Context, req *post.DeleteReq) (res *post.DeleteRes, err error) {
var in adminin.PostDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.AdminPost().Delete(ctx, in); err != nil {
return nil, err
return
}
err = service.AdminPost().Delete(ctx, in)
return res, nil
}
// Edit 修改/新增
func (c *cPost) Edit(ctx context.Context, req *post.EditReq) (res *post.EditRes, err error) {
var in adminin.PostEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.AdminPost().Edit(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.AdminPost().Edit(ctx, in)
return
}
// MaxSort 最大排序
func (c *cPost) MaxSort(ctx context.Context, req *post.MaxSortReq) (*post.MaxSortRes, error) {
func (c *cPost) MaxSort(ctx context.Context, req *post.MaxSortReq) (res *post.MaxSortRes, err error) {
data, err := service.AdminPost().MaxSort(ctx, adminin.PostMaxSortInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res post.MaxSortRes
res = new(post.MaxSortRes)
res.Sort = data.Sort
return &res, nil
return
}
// NameUnique 名称是否唯一
func (c *cPost) NameUnique(ctx context.Context, req *post.NameUniqueReq) (*post.NameUniqueRes, error) {
func (c *cPost) NameUnique(ctx context.Context, req *post.NameUniqueReq) (res *post.NameUniqueRes, err error) {
data, err := service.AdminPost().NameUnique(ctx, adminin.PostNameUniqueInp{Id: req.Id, Name: req.Name})
if err != nil {
return nil, err
return
}
var res post.NameUniqueRes
res = new(post.NameUniqueRes)
res.IsUnique = data.IsUnique
return &res, nil
return
}
// CodeUnique 编码是否唯一
func (c *cPost) CodeUnique(ctx context.Context, req *post.CodeUniqueReq) (*post.CodeUniqueRes, error) {
func (c *cPost) CodeUnique(ctx context.Context, req *post.CodeUniqueReq) (res *post.CodeUniqueRes, err error) {
data, err := service.AdminPost().CodeUnique(ctx, adminin.PostCodeUniqueInp{Id: req.Id, Code: req.Code})
if err != nil {
return nil, err
}
var res post.CodeUniqueRes
res = new(post.CodeUniqueRes)
res.IsUnique = data.IsUnique
return &res, nil
return
}
// View 获取指定信息
func (c *cPost) View(ctx context.Context, req *post.ViewReq) (*post.ViewRes, error) {
func (c *cPost) View(ctx context.Context, req *post.ViewReq) (res *post.ViewRes, err error) {
data, err := service.AdminPost().View(ctx, adminin.PostViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res post.ViewRes
res = new(post.ViewRes)
res.PostViewModel = data
return &res, nil
return
}
// List 获取列表
func (c *cPost) List(ctx context.Context, req *post.ListReq) (*post.ListRes, error) {
func (c *cPost) List(ctx context.Context, req *post.ListReq) (res *post.ListRes, err error) {
var in adminin.PostListInp
if err := gconv.Scan(req, &in); err != nil {
return nil, err
}
//adminin.PostListInp{
// Page: req.Page,
// PerPage: req.PerPage,
// Name: req.Name,
// Code: req.Code,
// Status: req.Status,
//}
list, totalCount, err := service.AdminPost().List(ctx, in)
if err != nil {
return nil, err
if err = gconv.Scan(req, &in); err != nil {
return
}
var res post.ListRes
list, totalCount, err := service.AdminPost().List(ctx, in)
if err != nil {
return
}
res = new(post.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Status 更新状态
func (c *cPost) Status(ctx context.Context, req *post.StatusReq) (res *post.StatusRes, err error) {
var in adminin.PostStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.AdminPost().Status(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.AdminPost().Status(ctx, in)
return
}

View File

@@ -22,73 +22,61 @@ var (
type cRole struct{}
// RoleMemberList 获取角色下的会员列表
func (c *cRole) RoleMemberList(ctx context.Context, req *role.MemberListReq) (*role.MemberListRes, error) {
// RoleMemberList 获取角色下的用户列表
func (c *cRole) RoleMemberList(ctx context.Context, req *role.MemberListReq) (res *role.MemberListRes, err error) {
var in adminin.RoleMemberListInp
if err := gconv.Scan(req, &in); err != nil {
return nil, err
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.AdminMember().RoleMemberList(ctx, in)
if err != nil {
return nil, err
return
}
var res role.MemberListRes
res = new(role.MemberListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.PerPage = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// List 获取列表
func (c *cRole) List(ctx context.Context, req *role.ListReq) (*role.ListRes, error) {
func (c *cRole) List(ctx context.Context, req *role.ListReq) (res *role.ListRes, err error) {
var in adminin.RoleListInp
if err := gconv.Scan(req, &in); err != nil {
return nil, err
}
list, totalCount, err := service.AdminRole().List(ctx, in)
if err != nil {
return nil, err
if err = gconv.Scan(req, &in); err != nil {
return
}
var res role.ListRes
list, totalCount, err := service.AdminRole().List(ctx, in)
if err != nil {
return
}
res = new(role.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Edit 修改角色
func (c *cRole) Edit(ctx context.Context, req *role.EditReq) (res *role.EditRes, err error) {
err = service.AdminRole().Edit(ctx, req)
if err != nil {
return nil, err
}
return res, nil
return
}
// Delete 删除
func (c *cRole) Delete(ctx context.Context, req *role.DeleteReq) (res *role.DeleteRes, err error) {
if err = service.AdminRole().Delete(ctx, req); err != nil {
return nil, err
}
return res, nil
err = service.AdminRole().Delete(ctx, req)
return
}
// Dynamic 动态路由
func (c *cRole) Dynamic(ctx context.Context, req *role.DynamicReq) (res role.DynamicRes, err error) {
res, err = service.AdminMenu().GetMenuList(ctx, contexts.GetUserId(ctx))
if err != nil {
return res, err
}
return res, nil
return service.AdminMenu().GetMenuList(ctx, contexts.GetUserId(ctx))
}
// GetPermissions 获取指定角色权限
@@ -97,23 +85,21 @@ func (c *cRole) GetPermissions(ctx context.Context, req *role.GetPermissionsReq)
if err != nil {
return nil, err
}
res = &role.GetPermissionsRes{
MenuIds: []int64{},
}
if MenuIds != nil {
res.MenuIds = MenuIds
}
return res, nil
}
// UpdatePermissions 修改角色菜单权限
func (c *cRole) UpdatePermissions(ctx context.Context, req *role.UpdatePermissionsReq) (res *role.UpdatePermissionsRes, err error) {
err = service.AdminRole().UpdatePermissions(ctx, req)
if err != nil {
return nil, err
}
return res, nil
return
}
// DataScopeSelect 获取数据权限选项
@@ -121,21 +107,17 @@ func (c *cRole) DataScopeSelect(ctx context.Context, req *role.DataScopeSelectRe
data := service.AdminRole().DataScopeSelect(ctx)
res = new(role.DataScopeSelectRes)
res.List = data
return res, nil
return
}
// DataScopeEdit 获取数据权限选项
func (c *cRole) DataScopeEdit(ctx context.Context, req *role.DataScopeEditReq) (res *role.DataScopeEditRes, err error) {
var in adminin.DataScopeEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
in.CustomDept = req.CustomDept
err = service.AdminRole().DataScopeEdit(ctx, &in)
if err != nil {
return nil, err
}
return res, nil
return
}

View File

@@ -26,16 +26,16 @@ type cTest struct{}
func (c *cTest) List(ctx context.Context, req *test.ListReq) (res *test.ListRes, err error) {
var in adminin.TestListInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
list, totalCount, err := service.AdminTest().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(test.ListRes)
@@ -43,102 +43,93 @@ func (c *cTest) List(ctx context.Context, req *test.ListReq) (res *test.ListRes,
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return res, nil
return
}
// Export 导出列表
func (c *cTest) Export(ctx context.Context, req *test.ExportReq) (res *test.ExportRes, err error) {
var in adminin.TestListInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.AdminTest().Export(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.AdminTest().Export(ctx, in)
return
}
// Edit 更新
func (c *cTest) Edit(ctx context.Context, req *test.EditReq) (res *test.EditRes, err error) {
var in adminin.TestEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
if err = service.AdminTest().Edit(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.AdminTest().Edit(ctx, in)
return
}
// MaxSort 最大排序
func (c *cTest) MaxSort(ctx context.Context, req *test.MaxSortReq) (res *test.MaxSortRes, err error) {
data, err := service.AdminTest().MaxSort(ctx, adminin.TestMaxSortInp{})
if err != nil {
return nil, err
return
}
res = new(test.MaxSortRes)
res.TestMaxSortModel = data
return res, nil
return
}
// View 获取指定信息
func (c *cTest) View(ctx context.Context, req *test.ViewReq) (res *test.ViewRes, err error) {
var in adminin.TestViewInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
data, err := service.AdminTest().View(ctx, in)
if err != nil {
return nil, err
return
}
res = new(test.ViewRes)
res.TestViewModel = data
return res, nil
return
}
// Delete 删除
func (c *cTest) Delete(ctx context.Context, req *test.DeleteReq) (res *test.DeleteRes, err error) {
var in adminin.TestDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.AdminTest().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.AdminTest().Delete(ctx, in)
return
}
// Status 更新状态
func (c *cTest) Status(ctx context.Context, req *test.StatusReq) (res *test.StatusRes, err error) {
var in adminin.TestStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.AdminTest().Status(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.AdminTest().Status(ctx, in)
return
}
// Switch 更新开关状态
func (c *cTest) Switch(ctx context.Context, req *test.SwitchReq) (res *test.SwitchRes, err error) {
var in adminin.TestSwitchInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.AdminTest().Switch(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.AdminTest().Switch(ctx, in)
return
}

View File

@@ -37,6 +37,5 @@ func (c *cConsole) Stat(ctx context.Context, req *common.ConsoleStatReq) (res *c
res.Volume.Rise = 40202
res.Volume.Decline = 45003
res.Volume.Amount = 49004
return
}

View File

@@ -8,8 +8,13 @@ package common
import (
"context"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"hotgo/api/backend/common"
"hotgo/internal/library/ems"
"hotgo/internal/consts"
"hotgo/internal/library/contexts"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
)
@@ -19,14 +24,56 @@ type cEms struct{}
// SendTest 发送测试邮件
func (c *cEms) SendTest(ctx context.Context, req *common.SendTestEmailReq) (res *common.SendTestEmailRes, err error) {
err = service.SysEmsLog().Send(ctx, sysin.SendEmsInp{
Event: consts.EmsTemplateText,
Email: req.To,
Content: `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="iso-8859-15">
<title>这是一封来自HotGo的测试邮件</title>
</head>
<body>
这是您通过HotGo后台发送的测试邮件。当你收到这封邮件的时候说明已经联调成功了恭喜你
</body>
</html>`,
})
return
}
conf, err := service.SysConfig().GetSmtp(ctx)
// SendBindEms 发送换绑邮件
func (c *cSms) SendBindEms(ctx context.Context, req *common.SendBindEmsReq) (res *common.SendBindEmsRes, err error) {
var (
memberId = contexts.GetUserId(ctx)
models *entity.AdminMember
)
if memberId <= 0 {
err = gerror.New("用户身份异常,请重新登录!")
return
}
err = g.Model("admin_member").
Fields("email").
Where("id", memberId).
Scan(&models)
if err != nil {
return
}
if err = ems.SendTestMail(conf, req.To); err != nil {
return nil, err
if models == nil {
err = gerror.New("用户信息不存在")
return
}
if models.Email == "" {
err = gerror.New("未绑定邮箱无需发送")
return
}
err = service.SysEmsLog().Send(ctx, sysin.SendEmsInp{
Event: consts.EmsTemplateBind,
Email: models.Email,
})
return
}

View File

@@ -70,7 +70,7 @@ func (c *cSite) Captcha(ctx context.Context, req *common.LoginCaptchaReq) (res *
func (c *cSite) Login(ctx context.Context, req *common.LoginReq) (res *common.LoginRes, err error) {
var in adminin.MemberLoginInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
defer func() {
@@ -89,33 +89,23 @@ func (c *cSite) Login(ctx context.Context, req *common.LoginReq) (res *common.Lo
model, err := service.AdminMember().Login(ctx, in)
if err != nil {
return nil, err
return
}
if err = gconv.Scan(model, &res); err != nil {
return nil, err
}
err = gconv.Scan(model, &res)
return
}
// Logout 注销登录
func (c *cSite) Logout(ctx context.Context, req *common.LoginLogoutReq) (res *common.LoginLogoutRes, err error) {
var authorization = jwt.GetAuthorization(ghttp.RequestFromCtx(ctx))
// 获取jwtToken
jwtToken := consts.RedisJwtToken + gmd5.MustEncryptString(authorization)
if len(jwtToken) == 0 {
token := consts.RedisJwtToken + gmd5.MustEncryptString(jwt.GetAuthorization(ghttp.RequestFromCtx(ctx)))
if len(token) == 0 {
err = gerror.New("当前用户未登录!")
return res, err
}
// 删除登录token
ca := cache.New()
_, err = ca.Remove(ctx, jwtToken)
if err != nil {
return res, err
}
_, err = ca.Remove(ctx, token)
return
}

View File

@@ -8,8 +8,13 @@ package common
import (
"context"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
"hotgo/api/backend/common"
"hotgo/internal/consts"
"hotgo/internal/library/contexts"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"hotgo/utility/validate"
@@ -23,15 +28,50 @@ type cSms struct{}
func (c *cSms) SendTest(ctx context.Context, req *common.SendTestSmsReq) (res *common.SendTestSmsRes, err error) {
var in sysin.SendCodeInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
if err = service.SysSmsLog().SendCode(ctx, in); err != nil {
return nil, err
}
err = service.SysSmsLog().SendCode(ctx, in)
return
}
// SendBindSms 发送换绑短信
func (c *cSms) SendBindSms(ctx context.Context, req *common.SendBindSmsReq) (res *common.SendBindSmsRes, err error) {
var (
memberId = contexts.GetUserId(ctx)
models *entity.AdminMember
)
if memberId <= 0 {
err = gerror.New("用户身份异常,请重新登录!")
return
}
err = g.Model("admin_member").
Fields("mobile").
Where("id", memberId).
Scan(&models)
if err != nil {
return
}
if models == nil {
err = gerror.New("用户信息不存在")
return
}
if models.Mobile == "" {
err = gerror.New("未绑定手机号无需发送")
return
}
err = service.SysSmsLog().SendCode(ctx, sysin.SendCodeInp{
Event: consts.SmsTemplateBind,
Mobile: models.Mobile,
})
return
}

View File

@@ -20,34 +20,22 @@ type cUpload struct{}
// UploadImage 上传图片
func (c *cUpload) UploadImage(ctx context.Context, req *common.UploadImageReq) (res common.UploadImageRes, err error) {
r := g.RequestFromCtx(ctx)
file := r.GetUploadFile("file")
file := g.RequestFromCtx(ctx).GetUploadFile("file")
if file == nil {
err = gerror.New("没有找到上传的文件")
return
}
res, err = service.CommonUpload().UploadImage(ctx, file)
if err != nil {
return
}
return
return service.CommonUpload().UploadImage(ctx, file)
}
// UploadFile 上传附件
func (c *cUpload) UploadFile(ctx context.Context, req *common.UploadFileReq) (res common.UploadFileRes, err error) {
r := g.RequestFromCtx(ctx)
file := r.GetUploadFile("file")
file := g.RequestFromCtx(ctx).GetUploadFile("file")
if file == nil {
err = gerror.New("没有找到上传的文件")
return
}
res, err = service.CommonUpload().UploadFile(ctx, file)
if err != nil {
return
}
return
return service.CommonUpload().UploadFile(ctx, file)
}

View File

@@ -25,89 +25,75 @@ type cAttachment struct{}
func (c *cAttachment) Delete(ctx context.Context, req *attachment.DeleteReq) (res *attachment.DeleteRes, err error) {
var in sysin.AttachmentDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysAttachment().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysAttachment().Delete(ctx, in)
return
}
// Edit 更新
func (c *cAttachment) Edit(ctx context.Context, req *attachment.EditReq) (res *attachment.EditRes, err error) {
var in sysin.AttachmentEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysAttachment().Edit(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysAttachment().Edit(ctx, in)
return
}
// MaxSort 最大排序
func (c *cAttachment) MaxSort(ctx context.Context, req *attachment.MaxSortReq) (*attachment.MaxSortRes, error) {
func (c *cAttachment) MaxSort(ctx context.Context, req *attachment.MaxSortReq) (res *attachment.MaxSortRes, err error) {
data, err := service.SysAttachment().MaxSort(ctx, sysin.AttachmentMaxSortInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res attachment.MaxSortRes
res = new(attachment.MaxSortRes)
res.Sort = data.Sort
return &res, nil
return
}
// View 获取指定信息
func (c *cAttachment) View(ctx context.Context, req *attachment.ViewReq) (*attachment.ViewRes, error) {
func (c *cAttachment) View(ctx context.Context, req *attachment.ViewReq) (res *attachment.ViewRes, err error) {
data, err := service.SysAttachment().View(ctx, sysin.AttachmentViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res attachment.ViewRes
res = new(attachment.ViewRes)
res.AttachmentViewModel = data
return &res, nil
return
}
// List 查看列表
func (c *cAttachment) List(ctx context.Context, req *attachment.ListReq) (*attachment.ListRes, error) {
var (
in sysin.AttachmentListInp
res attachment.ListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cAttachment) List(ctx context.Context, req *attachment.ListReq) (res *attachment.ListRes, err error) {
var in sysin.AttachmentListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysAttachment().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(attachment.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Status 更新部门状态
func (c *cAttachment) Status(ctx context.Context, req *attachment.StatusReq) (res *attachment.StatusRes, err error) {
var in sysin.AttachmentStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysAttachment().Status(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysAttachment().Status(ctx, in)
return
}

View File

@@ -25,89 +25,75 @@ type cBlacklist struct{}
func (c *cBlacklist) Delete(ctx context.Context, req *blacklist.DeleteReq) (res *blacklist.DeleteRes, err error) {
var in sysin.BlacklistDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysBlacklist().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysBlacklist().Delete(ctx, in)
return
}
// Edit 更新
func (c *cBlacklist) Edit(ctx context.Context, req *blacklist.EditReq) (res *blacklist.EditRes, err error) {
var in sysin.BlacklistEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysBlacklist().Edit(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysBlacklist().Edit(ctx, in)
return
}
// MaxSort 最大排序
func (c *cBlacklist) MaxSort(ctx context.Context, req *blacklist.MaxSortReq) (*blacklist.MaxSortRes, error) {
func (c *cBlacklist) MaxSort(ctx context.Context, req *blacklist.MaxSortReq) (res *blacklist.MaxSortRes, err error) {
data, err := service.SysBlacklist().MaxSort(ctx, sysin.BlacklistMaxSortInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res blacklist.MaxSortRes
res = new(blacklist.MaxSortRes)
res.Sort = data.Sort
return &res, nil
return
}
// View 获取指定信息
func (c *cBlacklist) View(ctx context.Context, req *blacklist.ViewReq) (*blacklist.ViewRes, error) {
func (c *cBlacklist) View(ctx context.Context, req *blacklist.ViewReq) (res *blacklist.ViewRes, err error) {
data, err := service.SysBlacklist().View(ctx, sysin.BlacklistViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res blacklist.ViewRes
res = new(blacklist.ViewRes)
res.BlacklistViewModel = data
return &res, nil
return
}
// List 查看列表
func (c *cBlacklist) List(ctx context.Context, req *blacklist.ListReq) (*blacklist.ListRes, error) {
var (
in sysin.BlacklistListInp
res blacklist.ListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cBlacklist) List(ctx context.Context, req *blacklist.ListReq) (res *blacklist.ListRes, err error) {
var in sysin.BlacklistListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysBlacklist().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(blacklist.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Status 更新部门状态
func (c *cBlacklist) Status(ctx context.Context, req *blacklist.StatusReq) (res *blacklist.StatusRes, err error) {
var in sysin.BlacklistStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysBlacklist().Status(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysBlacklist().Status(ctx, in)
return
}

View File

@@ -23,39 +23,26 @@ var (
type cConfig struct{}
// GetConfig 获取指定分组的配置
func (c *cConfig) GetConfig(ctx context.Context, req *config.GetReq) (*config.GetRes, error) {
var (
in sysin.GetConfigInp
res config.GetRes
err error
)
func (c *cConfig) GetConfig(ctx context.Context, req *config.GetReq) (res *config.GetRes, err error) {
var in sysin.GetConfigInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
res.GetConfigModel, err = service.SysConfig().GetConfigByGroup(ctx, in)
if err != nil {
return nil, err
return
}
return &res, nil
res = new(config.GetRes)
res.GetConfigModel, err = service.SysConfig().GetConfigByGroup(ctx, in)
return
}
// UpdateConfig 更新指定分组的配置
func (c *cConfig) UpdateConfig(ctx context.Context, req *config.UpdateReq) (*config.UpdateRes, error) {
var (
in sysin.UpdateConfigInp
res config.UpdateRes
err error
)
func (c *cConfig) UpdateConfig(ctx context.Context, req *config.UpdateReq) (res *config.UpdateRes, err error) {
var in sysin.UpdateConfigInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysConfig().UpdateConfigByGroup(ctx, in); err != nil {
return nil, err
}
return &res, nil
err = service.SysConfig().UpdateConfigByGroup(ctx, in)
return
}
// TypeSelect 数据类型选项

View File

@@ -26,91 +26,77 @@ type cCron struct{}
func (c *cCron) Delete(ctx context.Context, req *cron.DeleteReq) (res *cron.DeleteRes, err error) {
var in sysin.CronDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysCron().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysCron().Delete(ctx, in)
return
}
// Edit 更新
func (c *cCron) Edit(ctx context.Context, req *cron.EditReq) (res *cron.EditRes, err error) {
var in sysin.CronEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysCron().Edit(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysCron().Edit(ctx, in)
return
}
// MaxSort 最大排序
func (c *cCron) MaxSort(ctx context.Context, req *cron.MaxSortReq) (*cron.MaxSortRes, error) {
func (c *cCron) MaxSort(ctx context.Context, req *cron.MaxSortReq) (res *cron.MaxSortRes, err error) {
data, err := service.SysCron().MaxSort(ctx, sysin.CronMaxSortInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res cron.MaxSortRes
res = new(cron.MaxSortRes)
res.Sort = data.Sort
return &res, nil
return
}
// View 获取指定信息
func (c *cCron) View(ctx context.Context, req *cron.ViewReq) (*cron.ViewRes, error) {
func (c *cCron) View(ctx context.Context, req *cron.ViewReq) (res *cron.ViewRes, err error) {
data, err := service.SysCron().View(ctx, sysin.CronViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res cron.ViewRes
res = new(cron.ViewRes)
res.CronViewModel = data
return &res, nil
return
}
// List 查看列表
func (c *cCron) List(ctx context.Context, req *cron.ListReq) (*cron.ListRes, error) {
var (
in sysin.CronListInp
res cron.ListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cCron) List(ctx context.Context, req *cron.ListReq) (res *cron.ListRes, err error) {
var in sysin.CronListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysCron().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(cron.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Status 更新部门状态
func (c *cCron) Status(ctx context.Context, req *cron.StatusReq) (res *cron.StatusRes, err error) {
var in sysin.CronStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysCron().Status(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysCron().Status(ctx, in)
return
}
// OnlineExec 在线执行
@@ -121,7 +107,7 @@ func (c *cCron) OnlineExec(ctx context.Context, req *cron.OnlineExecReq) (res *c
var in sysin.OnlineExecInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
return res, service.SysCron().OnlineExec(ctx, in)

View File

@@ -25,90 +25,76 @@ type cCronGroup struct{}
func (c *cCronGroup) Delete(ctx context.Context, req *cron.GroupDeleteReq) (res *cron.GroupDeleteRes, err error) {
var in sysin.CronGroupDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysCronGroup().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysCronGroup().Delete(ctx, in)
return
}
// Edit 更新
func (c *cCronGroup) Edit(ctx context.Context, req *cron.GroupEditReq) (res *cron.GroupEditRes, err error) {
var in sysin.CronGroupEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysCronGroup().Edit(ctx, in); err != nil {
return nil, err
return
}
err = service.SysCronGroup().Edit(ctx, in)
return res, nil
}
// MaxSort 最大排序
func (c *cCronGroup) MaxSort(ctx context.Context, req *cron.GroupMaxSortReq) (*cron.GroupMaxSortRes, error) {
func (c *cCronGroup) MaxSort(ctx context.Context, req *cron.GroupMaxSortReq) (res *cron.GroupMaxSortRes, err error) {
data, err := service.SysCronGroup().MaxSort(ctx, sysin.CronGroupMaxSortInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res cron.GroupMaxSortRes
res = new(cron.GroupMaxSortRes)
res.Sort = data.Sort
return &res, nil
return
}
// View 获取指定信息
func (c *cCronGroup) View(ctx context.Context, req *cron.GroupViewReq) (*cron.GroupViewRes, error) {
func (c *cCronGroup) View(ctx context.Context, req *cron.GroupViewReq) (res *cron.GroupViewRes, err error) {
data, err := service.SysCronGroup().View(ctx, sysin.CronGroupViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res cron.GroupViewRes
res = new(cron.GroupViewRes)
res.CronGroupViewModel = data
return &res, nil
return
}
// List 查看列表
func (c *cCronGroup) List(ctx context.Context, req *cron.GroupListReq) (*cron.GroupListRes, error) {
var (
in sysin.CronGroupListInp
res cron.GroupListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cCronGroup) List(ctx context.Context, req *cron.GroupListReq) (res *cron.GroupListRes, err error) {
var in sysin.CronGroupListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysCronGroup().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(cron.GroupListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Status 更新部门状态
// Status 更新状态
func (c *cCronGroup) Status(ctx context.Context, req *cron.GroupStatusReq) (res *cron.GroupStatusRes, err error) {
var in sysin.CronGroupStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysCronGroup().Status(ctx, in); err != nil {
return nil, err
return
}
err = service.SysCronGroup().Status(ctx, in)
return res, nil
}
@@ -116,9 +102,9 @@ func (c *cCronGroup) Status(ctx context.Context, req *cron.GroupStatusReq) (res
func (c *cCronGroup) Select(ctx context.Context, req *cron.GroupSelectReq) (res *cron.GroupSelectRes, err error) {
list, err := service.SysCronGroup().Select(ctx, sysin.CronGroupSelectInp{})
if err != nil {
return nil, err
return
}
res = (*cron.GroupSelectRes)(&list)
return res, nil
res = (*cron.GroupSelectRes)(&list)
return
}

View File

@@ -3,8 +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.0
// @AutoGenerate Date 2023-01-18 15:19:42
// @AutoGenerate Version 2.1.2
// @AutoGenerate Date 2023-02-08 17:47:32
//
package sys
@@ -164,6 +164,5 @@ func (c *cCurdDemo) Switch(ctx context.Context, req *curddemo.SwitchReq) (res *c
if err = service.SysCurdDemo().Switch(ctx, in); err != nil {
return nil, err
}
return res, nil
}

View File

@@ -25,75 +25,63 @@ type cDictData struct{}
func (c *cDictData) Delete(ctx context.Context, req *dict.DataDeleteReq) (res *dict.DataDeleteRes, err error) {
var in sysin.DictDataDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysDictData().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysDictData().Delete(ctx, in)
return
}
// Edit 更新
func (c *cDictData) Edit(ctx context.Context, req *dict.DataEditReq) (res *dict.DataEditRes, err error) {
var in sysin.DictDataEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysDictData().Edit(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysDictData().Edit(ctx, in)
return
}
// List 查看列表
func (c *cDictData) List(ctx context.Context, req *dict.DataListReq) (*dict.DataListRes, error) {
var (
in sysin.DictDataListInp
res dict.DataListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cDictData) List(ctx context.Context, req *dict.DataListReq) (res *dict.DataListRes, err error) {
var in sysin.DictDataListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysDictData().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(dict.DataListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Select 指定选项
func (c *cDictData) Select(ctx context.Context, req *dict.DataSelectReq) (*dict.DataSelectRes, error) {
var (
in sysin.DataSelectInp
res dict.DataSelectRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cDictData) Select(ctx context.Context, req *dict.DataSelectReq) (res dict.DataSelectRes, err error) {
var in sysin.DataSelectInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, err := service.SysDictData().Select(ctx, in)
if err != nil {
return nil, err
return
}
res = dict.DataSelectRes(list)
return &res, nil
return
}
// Selects 多个选项
func (c *cDictData) Selects(ctx context.Context, req *dict.DataSelectsReq) (*dict.DataSelectsRes, error) {
res := make(dict.DataSelectsRes)
func (c *cDictData) Selects(ctx context.Context, req *dict.DataSelectsReq) (res dict.DataSelectsRes, err error) {
res = make(dict.DataSelectsRes)
for _, v := range req.Types {
option, err := service.SysDictData().Select(ctx, sysin.DataSelectInp{Type: v})
if err != nil {
@@ -102,5 +90,5 @@ func (c *cDictData) Selects(ctx context.Context, req *dict.DataSelectsReq) (*dic
res[v] = option
}
return &res, nil
return
}

View File

@@ -21,52 +21,41 @@ var (
type cDictType struct{}
// Tree 树
func (c *cDictType) Tree(ctx context.Context, req *dict.TypeTreeReq) (*dict.TypeTreeRes, error) {
var (
res dict.TypeTreeRes
err error
)
func (c *cDictType) Tree(ctx context.Context, req *dict.TypeTreeReq) (res *dict.TypeTreeRes, err error) {
res = new(dict.TypeTreeRes)
res.List, err = service.SysDictType().Tree(ctx)
if err != nil {
return nil, err
}
return &res, nil
return
}
// Delete 删除
func (c *cDictType) Delete(ctx context.Context, req *dict.TypeDeleteReq) (res *dict.TypeDeleteRes, err error) {
var in sysin.DictTypeDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysDictType().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysDictType().Delete(ctx, in)
return
}
// Edit 更新
func (c *cDictType) Edit(ctx context.Context, req *dict.TypeEditReq) (res *dict.TypeEditRes, err error) {
var in sysin.DictTypeEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysDictType().Edit(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysDictType().Edit(ctx, in)
return
}
// Select 选项
func (c *cDictType) Select(ctx context.Context, req *dict.TypeSelectReq) (res *dict.TypeSelectRes, err error) {
list, err := service.SysDictType().Select(ctx, sysin.DictTypeSelectInp{})
if err != nil {
return nil, err
return
}
res = (*dict.TypeSelectRes)(&list)
return res, nil
res = (*dict.TypeSelectRes)(&list)
return
}

View File

@@ -0,0 +1,87 @@
// Package sys
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2022 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/util/gconv"
"hotgo/api/backend/emslog"
"hotgo/internal/model/input/form"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
)
var (
EmsLog = cEmsLog{}
)
type cEmsLog struct{}
// Delete 删除
func (c *cEmsLog) Delete(ctx context.Context, req *emslog.DeleteReq) (res *emslog.DeleteRes, err error) {
var in sysin.EmsLogDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return
}
err = service.SysEmsLog().Delete(ctx, in)
return
}
// Edit 更新
func (c *cEmsLog) Edit(ctx context.Context, req *emslog.EditReq) (res *emslog.EditRes, err error) {
var in sysin.EmsLogEditInp
if err = gconv.Scan(req, &in); err != nil {
return
}
err = service.SysEmsLog().Edit(ctx, in)
return
}
// View 获取指定信息
func (c *cEmsLog) View(ctx context.Context, req *emslog.ViewReq) (res *emslog.ViewRes, err error) {
data, err := service.SysEmsLog().View(ctx, sysin.EmsLogViewInp{Id: req.Id})
if err != nil {
return
}
res = new(emslog.ViewRes)
res.EmsLogViewModel = data
return
}
// List 查看列表
func (c *cEmsLog) List(ctx context.Context, req *emslog.ListReq) (res *emslog.ListRes, err error) {
var in sysin.EmsLogListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysEmsLog().List(ctx, in)
if err != nil {
return
}
res = new(emslog.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return
}
// Status 更新部门状态
func (c *cEmsLog) Status(ctx context.Context, req *emslog.StatusReq) (res *emslog.StatusRes, err error) {
var in sysin.EmsLogStatusInp
if err = gconv.Scan(req, &in); err != nil {
return
}
err = service.SysEmsLog().Status(ctx, in)
return
}

View File

@@ -25,184 +25,159 @@ type cGenCodes struct{}
func (c *cGenCodes) Delete(ctx context.Context, req *gencodes.DeleteReq) (res *gencodes.DeleteRes, err error) {
var in sysin.GenCodesDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysGenCodes().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysGenCodes().Delete(ctx, in)
return
}
// Edit 更新
func (c *cGenCodes) Edit(ctx context.Context, req *gencodes.EditReq) (res *gencodes.EditRes, err error) {
var in sysin.GenCodesEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
data, err := service.SysGenCodes().Edit(ctx, in)
if err != nil {
return nil, err
return
}
res = new(gencodes.EditRes)
res.GenCodesEditModel = data
return res, nil
return
}
// MaxSort 最大排序
func (c *cGenCodes) MaxSort(ctx context.Context, req *gencodes.MaxSortReq) (*gencodes.MaxSortRes, error) {
func (c *cGenCodes) MaxSort(ctx context.Context, req *gencodes.MaxSortReq) (res *gencodes.MaxSortRes, err error) {
data, err := service.SysGenCodes().MaxSort(ctx, sysin.GenCodesMaxSortInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res gencodes.MaxSortRes
res = new(gencodes.MaxSortRes)
res.Sort = data.Sort
return &res, nil
return
}
// View 获取指定信息
func (c *cGenCodes) View(ctx context.Context, req *gencodes.ViewReq) (*gencodes.ViewRes, error) {
func (c *cGenCodes) View(ctx context.Context, req *gencodes.ViewReq) (res *gencodes.ViewRes, err error) {
data, err := service.SysGenCodes().View(ctx, sysin.GenCodesViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res gencodes.ViewRes
res = new(gencodes.ViewRes)
res.GenCodesViewModel = data
return &res, nil
return
}
// List 查看列表
func (c *cGenCodes) List(ctx context.Context, req *gencodes.ListReq) (*gencodes.ListRes, error) {
var (
in sysin.GenCodesListInp
res gencodes.ListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cGenCodes) List(ctx context.Context, req *gencodes.ListReq) (res *gencodes.ListRes, err error) {
var in sysin.GenCodesListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysGenCodes().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(gencodes.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Status 更新部门状态
func (c *cGenCodes) Status(ctx context.Context, req *gencodes.StatusReq) (res *gencodes.StatusRes, err error) {
var in sysin.GenCodesStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysGenCodes().Status(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysGenCodes().Status(ctx, in)
return
}
// Selects 获取指定信息
func (c *cGenCodes) Selects(ctx context.Context, req *gencodes.SelectsReq) (*gencodes.SelectsRes, error) {
func (c *cGenCodes) Selects(ctx context.Context, req *gencodes.SelectsReq) (res *gencodes.SelectsRes, err error) {
data, err := service.SysGenCodes().Selects(ctx, sysin.GenCodesSelectsInp{})
if err != nil {
return nil, err
return
}
var res gencodes.SelectsRes
res = new(gencodes.SelectsRes)
res.GenCodesSelectsModel = data
return &res, nil
return
}
// TableSelect 数据库表选项
func (c *cGenCodes) TableSelect(ctx context.Context, req *gencodes.TableSelectReq) (*gencodes.TableSelectRes, error) {
func (c *cGenCodes) TableSelect(ctx context.Context, req *gencodes.TableSelectReq) (res *gencodes.TableSelectRes, err error) {
data, err := service.SysGenCodes().TableSelect(ctx, sysin.GenCodesTableSelectInp{Name: req.Name})
if err != nil {
return nil, err
return
}
var res gencodes.TableSelectRes
res = data
return &res, nil
res = (*gencodes.TableSelectRes)(&data)
return
}
// ColumnSelect 表字段选项
func (c *cGenCodes) ColumnSelect(ctx context.Context, req *gencodes.ColumnSelectReq) (*gencodes.ColumnSelectRes, error) {
func (c *cGenCodes) ColumnSelect(ctx context.Context, req *gencodes.ColumnSelectReq) (res *gencodes.ColumnSelectRes, err error) {
data, err := service.SysGenCodes().ColumnSelect(ctx, sysin.GenCodesColumnSelectInp{Name: req.Name, Table: req.Table})
if err != nil {
return nil, err
return
}
var res gencodes.ColumnSelectRes
res = data
return &res, nil
res = (*gencodes.ColumnSelectRes)(&data)
return
}
// ColumnList 表字段列表
func (c *cGenCodes) ColumnList(ctx context.Context, req *gencodes.ColumnListReq) (*gencodes.ColumnListRes, error) {
var (
in sysin.GenCodesColumnListInp
err error
)
func (c *cGenCodes) ColumnList(ctx context.Context, req *gencodes.ColumnListReq) (res *gencodes.ColumnListRes, err error) {
var in sysin.GenCodesColumnListInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
data, err := service.SysGenCodes().ColumnList(ctx, in)
if err != nil {
return nil, err
return
}
var res gencodes.ColumnListRes
res = data
return &res, nil
res = (*gencodes.ColumnListRes)(&data)
return
}
// Preview 生成预览
func (c *cGenCodes) Preview(ctx context.Context, req *gencodes.PreviewReq) (*gencodes.PreviewRes, error) {
var (
in sysin.GenCodesPreviewInp
err error
)
func (c *cGenCodes) Preview(ctx context.Context, req *gencodes.PreviewReq) (res *gencodes.PreviewRes, err error) {
var in sysin.GenCodesPreviewInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
data, err := service.SysGenCodes().Preview(ctx, in)
if err != nil {
return nil, err
return
}
res := new(gencodes.PreviewRes)
res = new(gencodes.PreviewRes)
res.GenCodesPreviewModel = data
return res, nil
return
}
// Build 生成预览
func (c *cGenCodes) Build(ctx context.Context, req *gencodes.BuildReq) (*gencodes.BuildRes, error) {
var (
in sysin.GenCodesBuildInp
err error
)
func (c *cGenCodes) Build(ctx context.Context, req *gencodes.BuildReq) (res *gencodes.BuildRes, err error) {
var in sysin.GenCodesBuildInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysGenCodes().Build(ctx, in); err != nil {
return nil, err
}
return nil, nil
err = service.SysGenCodes().Build(ctx, in)
return
}

View File

@@ -23,7 +23,7 @@ type sLog struct{}
// Clear 清空日志
func (c *sLog) Clear(ctx context.Context, req *log.ClearReq) (res *log.ClearRes, err error) {
err = gerror.New("考虑安全,请到数据库清空")
err = gerror.New("暂时考虑安全问题,请到数据库清空")
return
}
@@ -31,58 +31,52 @@ func (c *sLog) Clear(ctx context.Context, req *log.ClearReq) (res *log.ClearRes,
func (c *sLog) Export(ctx context.Context, req *log.ExportReq) (res *log.ExportRes, err error) {
var in sysin.LogListInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysLog().Export(ctx, in); err != nil {
return nil, err
return
}
err = service.SysLog().Export(ctx, in)
return
}
// List 获取访问日志列表
func (c *sLog) List(ctx context.Context, req *log.ListReq) (*log.ListRes, error) {
var (
in sysin.LogListInp
res log.ListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *sLog) List(ctx context.Context, req *log.ListReq) (res *log.ListRes, err error) {
var in sysin.LogListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysLog().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(log.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// View 获取指定信息
func (c *sLog) View(ctx context.Context, req *log.ViewReq) (*log.ViewRes, error) {
var res log.ViewRes
func (c *sLog) View(ctx context.Context, req *log.ViewReq) (res *log.ViewRes, err error) {
data, err := service.SysLog().View(ctx, sysin.LogViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
res = new(log.ViewRes)
res.LogViewModel = data
return &res, nil
return
}
// Delete 删除
func (c *sLog) Delete(ctx context.Context, req *log.DeleteReq) (res *log.DeleteRes, err error) {
var in sysin.LogDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysLog().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysLog().Delete(ctx, in)
return
}

View File

@@ -28,16 +28,16 @@ type cLoginLog struct{}
func (c *cLoginLog) List(ctx context.Context, req *loginlog.ListReq) (res *loginlog.ListRes, err error) {
var in sysin.LoginLogListInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
list, totalCount, err := service.SysLoginLog().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(loginlog.ListRes)
@@ -45,60 +45,56 @@ func (c *cLoginLog) List(ctx context.Context, req *loginlog.ListReq) (res *login
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return res, nil
return
}
// Export 导出登录日志列表
func (c *cLoginLog) Export(ctx context.Context, req *loginlog.ExportReq) (res *loginlog.ExportRes, err error) {
var in sysin.LoginLogListInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
if err = service.SysLoginLog().Export(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysLoginLog().Export(ctx, in)
return
}
// View 获取指定登录日志信息
func (c *cLoginLog) View(ctx context.Context, req *loginlog.ViewReq) (res *loginlog.ViewRes, err error) {
var in sysin.LoginLogViewInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
data, err := service.SysLoginLog().View(ctx, in)
if err != nil {
return nil, err
return
}
res = new(loginlog.ViewRes)
res.LoginLogViewModel = data
return res, nil
return
}
// Delete 删除登录日志
func (c *cLoginLog) Delete(ctx context.Context, req *loginlog.DeleteReq) (res *loginlog.DeleteRes, err error) {
var in sysin.LoginLogDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
if err = service.SysLoginLog().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysLoginLog().Delete(ctx, in)
return
}

View File

@@ -10,6 +10,7 @@ import (
"context"
"github.com/gogf/gf/v2/util/gconv"
"hotgo/api/backend/provinces"
"hotgo/internal/library/location"
"hotgo/internal/model/input/form"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
@@ -22,140 +23,150 @@ var (
type cProvinces struct{}
// Tree 关系树选项列表
func (c *cProvinces) Tree(ctx context.Context, req *provinces.TreeReq) (*provinces.TreeRes, error) {
var (
res provinces.TreeRes
err error
)
func (c *cProvinces) Tree(ctx context.Context, req *provinces.TreeReq) (res *provinces.TreeRes, err error) {
res = new(provinces.TreeRes)
res.List, err = service.SysProvinces().Tree(ctx)
if err != nil {
return nil, err
}
return &res, nil
return
}
// Delete 删除
func (c *cProvinces) Delete(ctx context.Context, req *provinces.DeleteReq) (res *provinces.DeleteRes, err error) {
var in sysin.ProvincesDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysProvinces().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysProvinces().Delete(ctx, in)
return
}
// Edit 更新
func (c *cProvinces) Edit(ctx context.Context, req *provinces.EditReq) (res *provinces.EditRes, err error) {
var in sysin.ProvincesEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysProvinces().Edit(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysProvinces().Edit(ctx, in)
return
}
// MaxSort 最大排序
func (c *cProvinces) MaxSort(ctx context.Context, req *provinces.MaxSortReq) (res *provinces.MaxSortRes, err error) {
data, err := service.SysProvinces().MaxSort(ctx, sysin.ProvincesMaxSortInp{})
if err != nil {
return nil, err
return
}
res = new(provinces.MaxSortRes)
res.ProvincesMaxSortModel = data
return res, nil
return
}
// View 获取指定信息
func (c *cProvinces) View(ctx context.Context, req *provinces.ViewReq) (*provinces.ViewRes, error) {
func (c *cProvinces) View(ctx context.Context, req *provinces.ViewReq) (res *provinces.ViewRes, err error) {
data, err := service.SysProvinces().View(ctx, sysin.ProvincesViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res provinces.ViewRes
res = new(provinces.ViewRes)
res.ProvincesViewModel = data
return &res, nil
return
}
// List 查看列表
func (c *cProvinces) List(ctx context.Context, req *provinces.ListReq) (*provinces.ListRes, error) {
var (
in sysin.ProvincesListInp
res provinces.ListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cProvinces) List(ctx context.Context, req *provinces.ListReq) (res *provinces.ListRes, err error) {
var in sysin.ProvincesListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysProvinces().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(provinces.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Status 更新部门状态
func (c *cProvinces) Status(ctx context.Context, req *provinces.StatusReq) (res *provinces.StatusRes, err error) {
var in sysin.ProvincesStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysProvinces().Status(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysProvinces().Status(ctx, in)
return
}
// ChildrenList 获取省市区下级列表
func (c *cProvinces) ChildrenList(ctx context.Context, req *provinces.ChildrenListReq) (*provinces.ChildrenListRes, error) {
var (
in sysin.ProvincesChildrenListInp
res provinces.ChildrenListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cProvinces) ChildrenList(ctx context.Context, req *provinces.ChildrenListReq) (res *provinces.ChildrenListRes, err error) {
var in sysin.ProvincesChildrenListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysProvinces().ChildrenList(ctx, in)
if err != nil {
return nil, err
return
}
res = new(provinces.ChildrenListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// UniqueId 地区ID是否唯一
func (c *cProvinces) UniqueId(ctx context.Context, req *provinces.UniqueIdReq) (res *provinces.UniqueIdRes, err error) {
var in sysin.ProvincesUniqueIdInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
data, err := service.SysProvinces().UniqueId(ctx, in)
if err != nil {
return nil, err
return
}
res = new(provinces.UniqueIdRes)
res.ProvincesUniqueIdModel = data
return res, nil
return
}
// Select 省市区选项
func (c *cProvinces) Select(ctx context.Context, req *provinces.SelectReq) (res *provinces.SelectRes, err error) {
var in sysin.ProvincesSelectInp
if err = gconv.Scan(req, &in); err != nil {
return
}
data, err := service.SysProvinces().Select(ctx, in)
if err != nil {
return
}
res = new(provinces.SelectRes)
res.ProvincesSelectModel = data
return
}
// CityLabel 省市区选项
func (c *cProvinces) CityLabel(ctx context.Context, req *provinces.CityLabelReq) (res *provinces.CityLabelRes, err error) {
cityLabel, err := location.ParseSimpleRegion(ctx, req.Id, req.Spilt)
if err != nil {
return
}
res = (*provinces.CityLabelRes)(&cityLabel)
return
}

View File

@@ -26,16 +26,16 @@ type cServeLog struct{}
func (c *cServeLog) List(ctx context.Context, req *servelog.ListReq) (res *servelog.ListRes, err error) {
var in sysin.ServeLogListInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
list, totalCount, err := service.SysServeLog().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(servelog.ListRes)
@@ -43,60 +43,56 @@ func (c *cServeLog) List(ctx context.Context, req *servelog.ListReq) (res *serve
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return res, nil
return
}
// Export 导出服务日志列表
func (c *cServeLog) Export(ctx context.Context, req *servelog.ExportReq) (res *servelog.ExportRes, err error) {
var in sysin.ServeLogListInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
if err = service.SysServeLog().Export(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysServeLog().Export(ctx, in)
return
}
// View 获取指定服务日志信息
func (c *cServeLog) View(ctx context.Context, req *servelog.ViewReq) (res *servelog.ViewRes, err error) {
var in sysin.ServeLogViewInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
data, err := service.SysServeLog().View(ctx, in)
if err != nil {
return nil, err
return
}
res = new(servelog.ViewRes)
res.ServeLogViewModel = data
return res, nil
return
}
// Delete 删除服务日志
func (c *cServeLog) Delete(ctx context.Context, req *servelog.DeleteReq) (res *servelog.DeleteRes, err error) {
var in sysin.ServeLogDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = validate.PreFilter(ctx, &in); err != nil {
return nil, err
return
}
if err = service.SysServeLog().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysServeLog().Delete(ctx, in)
return
}

View File

@@ -25,89 +25,75 @@ type cSmsLog struct{}
func (c *cSmsLog) Delete(ctx context.Context, req *smslog.DeleteReq) (res *smslog.DeleteRes, err error) {
var in sysin.SmsLogDeleteInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysSmsLog().Delete(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysSmsLog().Delete(ctx, in)
return
}
// Edit 更新
func (c *cSmsLog) Edit(ctx context.Context, req *smslog.EditReq) (res *smslog.EditRes, err error) {
var in sysin.SmsLogEditInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
}
if err = service.SysSmsLog().Edit(ctx, in); err != nil {
return nil, err
return
}
return res, nil
err = service.SysSmsLog().Edit(ctx, in)
return
}
// MaxSort 最大排序
func (c *cSmsLog) MaxSort(ctx context.Context, req *smslog.MaxSortReq) (*smslog.MaxSortRes, error) {
func (c *cSmsLog) MaxSort(ctx context.Context, req *smslog.MaxSortReq) (res *smslog.MaxSortRes, err error) {
data, err := service.SysSmsLog().MaxSort(ctx, sysin.SmsLogMaxSortInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res smslog.MaxSortRes
res = new(smslog.MaxSortRes)
res.Sort = data.Sort
return &res, nil
return
}
// View 获取指定信息
func (c *cSmsLog) View(ctx context.Context, req *smslog.ViewReq) (*smslog.ViewRes, error) {
func (c *cSmsLog) View(ctx context.Context, req *smslog.ViewReq) (res *smslog.ViewRes, err error) {
data, err := service.SysSmsLog().View(ctx, sysin.SmsLogViewInp{Id: req.Id})
if err != nil {
return nil, err
return
}
var res smslog.ViewRes
res = new(smslog.ViewRes)
res.SmsLogViewModel = data
return &res, nil
return
}
// List 查看列表
func (c *cSmsLog) List(ctx context.Context, req *smslog.ListReq) (*smslog.ListRes, error) {
var (
in sysin.SmsLogListInp
res smslog.ListRes
)
if err := gconv.Scan(req, &in); err != nil {
return nil, err
func (c *cSmsLog) List(ctx context.Context, req *smslog.ListReq) (res *smslog.ListRes, err error) {
var in sysin.SmsLogListInp
if err = gconv.Scan(req, &in); err != nil {
return
}
list, totalCount, err := service.SysSmsLog().List(ctx, in)
if err != nil {
return nil, err
return
}
res = new(smslog.ListRes)
res.List = list
res.PageCount = form.CalPageCount(totalCount, req.PerPage)
res.Page = req.Page
res.PerPage = req.PerPage
return &res, nil
return
}
// Status 更新部门状态
func (c *cSmsLog) Status(ctx context.Context, req *smslog.StatusReq) (res *smslog.StatusRes, err error) {
var in sysin.SmsLogStatusInp
if err = gconv.Scan(req, &in); err != nil {
return nil, err
return
}
if err = service.SysSmsLog().Status(ctx, in); err != nil {
return nil, err
}
return res, nil
err = service.SysSmsLog().Status(ctx, in)
return
}

View File

@@ -10,6 +10,7 @@ import (
"context"
"hotgo/internal/model/input/websocketin"
"hotgo/internal/websocket"
"hotgo/utility/simple"
)
// Send 通过http发送ws消息
@@ -19,10 +20,11 @@ type send struct{}
// ToTag 发送标签消息
func (c *send) ToTag(ctx context.Context, req *websocketin.SendToTagReq) (res *websocketin.SendToTagRes, err error) {
go websocket.SendToTag(req.Tag, &websocket.WResponse{
Event: req.Response.Event,
Data: req.Response,
simple.SafeGo(ctx, func(ctx context.Context) {
websocket.SendToTag(req.Tag, &websocket.WResponse{
Event: req.Response.Event,
Data: req.Response,
})
})
return
}

View File

@@ -134,9 +134,28 @@ func StartALL(sysCron []*entity.SysCron) error {
return nil
}
// RefreshStatus 刷新状态
func RefreshStatus(sysCron *entity.SysCron) (err error) {
if sysCron == nil {
return
}
g.DumpWithType(sysCron)
if sysCron.Status == consts.StatusEnabled {
return Start(sysCron)
}
return Stop(sysCron)
}
// Stop 停止单个任务
func Stop(sysCron *entity.SysCron) error {
return nil
func Stop(sysCron *entity.SysCron) (err error) {
cr := gcron.Search(sysCron.Name)
if cr == nil {
return
}
cr.Stop()
return
}
// Once 立即执行一次某个任务
@@ -152,15 +171,31 @@ func Once(ctx context.Context, sysCron *entity.SysCron) error {
}
// Delete 删除任务
func Delete(sysCron *entity.SysCron) error {
// ...
func Delete(sysCron *entity.SysCron) (err error) {
if sysCron == nil {
return
}
for _, v := range gcron.Entries() {
if v.Name == sysCron.Name {
gcron.Remove(v.Name)
}
return Stop(sysCron)
}
return
}
// Start 启动单个任务
func Start(sysCron *entity.SysCron) error {
return nil
func Start(sysCron *entity.SysCron) (err error) {
if sysCron == nil {
return
}
cr := gcron.Search(sysCron.Name)
if cr != nil {
cr.Start()
return
}
return StartALL([]*entity.SysCron{sysCron})
}
// Add 添加任务

View File

@@ -47,7 +47,7 @@ func (dao *adminMemberPostDao) UpdatePostIds(ctx context.Context, memberId int64
PostId: postIds[i],
})
if err != nil {
err = gerror.Wrap(err, "插入会员岗位失败")
err = gerror.Wrap(err, "插入用户岗位失败")
return err
}
}

View File

@@ -0,0 +1,27 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// =================================================================================
package dao
import (
"hotgo/internal/dao/internal"
)
// internalAdminNoticeReadDao is internal type for wrapping internal DAO implements.
type internalAdminNoticeReadDao = *internal.AdminNoticeReadDao
// adminNoticeReadDao is the data access object for table hg_admin_notice_read.
// You can define custom methods on it to extend its functionality as you wish.
type adminNoticeReadDao struct {
internalAdminNoticeReadDao
}
var (
// AdminNoticeRead is globally public accessible object for table hg_admin_notice_read operations.
AdminNoticeRead = adminNoticeReadDao{
internal.NewAdminNoticeReadDao(),
}
)
// Fill with you ideas below.

View File

@@ -29,22 +29,20 @@ type AdminMemberColumns struct {
Salt string // 密码盐
AuthKey string // 授权令牌
PasswordResetToken string // 密码重置令牌
Balance string // 余额
Avatar string // 头像
Sex string // 性别
Qq string // qq
Email string // 邮箱
Mobile string // 手机号码
Birthday string // 生日
ProvinceId string // 省编码
CityId string // 城市编码
CountyId string // 区域编码
Address string // 联系地址
VisitCount string // 访问次数
LastTime string // 最后一次登录时间
LastIp string // 最后一次登录ip
Pid string // 上级管理员ID
Level string // 关系树等级
Tree string // 关系树
Cash string // 提现配置
LastActiveAt string // 最后活跃时间
Remark string // 备注
Status string // 状态
CreatedAt string // 创建时间
@@ -62,22 +60,20 @@ var adminMemberColumns = AdminMemberColumns{
Salt: "salt",
AuthKey: "auth_key",
PasswordResetToken: "password_reset_token",
Balance: "balance",
Avatar: "avatar",
Sex: "sex",
Qq: "qq",
Email: "email",
Mobile: "mobile",
Birthday: "birthday",
ProvinceId: "province_id",
CityId: "city_id",
CountyId: "county_id",
Address: "address",
VisitCount: "visit_count",
LastTime: "last_time",
LastIp: "last_ip",
Pid: "pid",
Level: "level",
Tree: "tree",
Cash: "cash",
LastActiveAt: "last_active_at",
Remark: "remark",
Status: "status",
CreatedAt: "created_at",

View File

@@ -23,14 +23,17 @@ type AdminNoticeColumns struct {
Id string // 公告ID
Title string // 公告标题
Type string // 公告类型
Tag string // 标签
Content string // 公告内容
Receiver string // 接收者
Reader string // 已读人
Remark string // 备注
Sort string // 排序
Status string // 公告状态
CreatedBy string // 发送人
UpdatedBy string // 修改人
CreatedAt string // 创建时间
UpdatedAt string // 更新时间
DeletedAt string // 删除时间
}
// adminNoticeColumns holds the columns for table hg_admin_notice.
@@ -38,14 +41,17 @@ var adminNoticeColumns = AdminNoticeColumns{
Id: "id",
Title: "title",
Type: "type",
Tag: "tag",
Content: "content",
Receiver: "receiver",
Reader: "reader",
Remark: "remark",
Sort: "sort",
Status: "status",
CreatedBy: "created_by",
UpdatedBy: "updated_by",
CreatedAt: "created_at",
UpdatedAt: "updated_at",
DeletedAt: "deleted_at",
}
// NewAdminNoticeDao creates and returns a new DAO object for table data access.

View File

@@ -0,0 +1,83 @@
// ==========================================================================
// Code generated by GoFrame CLI tool. DO NOT EDIT.
// ==========================================================================
package internal
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
)
// AdminNoticeReadDao is the data access object for table hg_admin_notice_read.
type AdminNoticeReadDao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
columns AdminNoticeReadColumns // columns contains all the column names of Table for convenient usage.
}
// AdminNoticeReadColumns defines and stores column names for table hg_admin_notice_read.
type AdminNoticeReadColumns struct {
Id string // 记录ID
NoticeId string // 公告ID
MemberId string // 会员ID
Clicks string // 已读次数
UpdatedAt string // 更新时间
CreatedAt string // 阅读时间
}
// adminNoticeReadColumns holds the columns for table hg_admin_notice_read.
var adminNoticeReadColumns = AdminNoticeReadColumns{
Id: "id",
NoticeId: "notice_id",
MemberId: "member_id",
Clicks: "clicks",
UpdatedAt: "updated_at",
CreatedAt: "created_at",
}
// NewAdminNoticeReadDao creates and returns a new DAO object for table data access.
func NewAdminNoticeReadDao() *AdminNoticeReadDao {
return &AdminNoticeReadDao{
group: "default",
table: "hg_admin_notice_read",
columns: adminNoticeReadColumns,
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
func (dao *AdminNoticeReadDao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
func (dao *AdminNoticeReadDao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
func (dao *AdminNoticeReadDao) Columns() AdminNoticeReadColumns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
func (dao *AdminNoticeReadDao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
func (dao *AdminNoticeReadDao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// as it is automatically handled by this function.
func (dao *AdminNoticeReadDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)
}

View File

@@ -0,0 +1,91 @@
// ==========================================================================
// Code generated by GoFrame CLI tool. DO NOT EDIT.
// ==========================================================================
package internal
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
)
// SysEmsLogDao is the data access object for table hg_sys_ems_log.
type SysEmsLogDao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
columns SysEmsLogColumns // columns contains all the column names of Table for convenient usage.
}
// SysEmsLogColumns defines and stores column names for table hg_sys_ems_log.
type SysEmsLogColumns struct {
Id string // 主键
Event string // 事件
Email string // 邮箱地址,多个用;隔开
Code string // 验证码
Times string // 验证次数
Content string // 邮件内容
Ip string // ip地址
Status string // 状态(1未验证,2已验证)
CreatedAt string // 创建时间
UpdatedAt string // 更新时间
}
// sysEmsLogColumns holds the columns for table hg_sys_ems_log.
var sysEmsLogColumns = SysEmsLogColumns{
Id: "id",
Event: "event",
Email: "email",
Code: "code",
Times: "times",
Content: "content",
Ip: "ip",
Status: "status",
CreatedAt: "created_at",
UpdatedAt: "updated_at",
}
// NewSysEmsLogDao creates and returns a new DAO object for table data access.
func NewSysEmsLogDao() *SysEmsLogDao {
return &SysEmsLogDao{
group: "default",
table: "hg_sys_ems_log",
columns: sysEmsLogColumns,
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
func (dao *SysEmsLogDao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
func (dao *SysEmsLogDao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
func (dao *SysEmsLogDao) Columns() SysEmsLogColumns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
func (dao *SysEmsLogDao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
func (dao *SysEmsLogDao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// as it is automatically handled by this function.
func (dao *SysEmsLogDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)
}

View File

@@ -22,6 +22,7 @@ type SysGenCodesDao struct {
type SysGenCodesColumns struct {
Id string // 生成ID
GenType string // 生成类型
GenTemplate string // 生成模板
VarName string // 实体命名
Options string // 配置选项
DbName string // 数据库名称
@@ -38,6 +39,7 @@ type SysGenCodesColumns struct {
var sysGenCodesColumns = SysGenCodesColumns{
Id: "id",
GenType: "gen_type",
GenTemplate: "gen_template",
VarName: "var_name",
Options: "options",
DbName: "db_name",

View File

@@ -27,6 +27,7 @@ type SysGenCurdDemoColumns struct {
Content string // 内容
Image string // 单图
Attachfile string // 附件
CityId string // 所在城市
Switch string // 显示开关
Sort string // 排序
Status string // 状态
@@ -46,6 +47,7 @@ var sysGenCurdDemoColumns = SysGenCurdDemoColumns{
Content: "content",
Image: "image",
Attachfile: "attachfile",
CityId: "city_id",
Switch: "switch",
Sort: "sort",
Status: "status",

View File

@@ -26,6 +26,7 @@ type SysLoginLogColumns struct {
Username string // 用户名
Response string // 响应数据
LoginAt string // 登录时间
LoginIp string // 登录IP
ErrMsg string // 错误提示
Status string // 状态
CreatedAt string // 创建时间
@@ -40,6 +41,7 @@ var sysLoginLogColumns = SysLoginLogColumns{
Username: "username",
Response: "response",
LoginAt: "login_at",
LoginIp: "login_ip",
ErrMsg: "err_msg",
Status: "status",
CreatedAt: "created_at",

View File

@@ -46,6 +46,7 @@ type TestColumns struct {
Mobile string // 手机号码
Hobby string // 爱好
Channel string // 渠道
CityId string // 所在城市
Pid string // 上级ID
Level string // 树等级
Tree string // 关系树
@@ -86,6 +87,7 @@ var testColumns = TestColumns{
Mobile: "mobile",
Hobby: "hobby",
Channel: "channel",
CityId: "city_id",
Pid: "pid",
Level: "level",
Tree: "tree",

View File

@@ -0,0 +1,43 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// =================================================================================
package dao
import (
"context"
"github.com/gogf/gf/v2/os/gtime"
"hotgo/internal/dao/internal"
)
// internalSysEmsLogDao is internal type for wrapping internal DAO implements.
type internalSysEmsLogDao = *internal.SysEmsLogDao
// sysEmsLogDao is the data access object for table hg_sys_ems_log.
// You can define custom methods on it to extend its functionality as you wish.
type sysEmsLogDao struct {
internalSysEmsLogDao
}
var (
// SysEmsLog is globally public accessible object for table hg_sys_ems_log operations.
SysEmsLog = sysEmsLogDao{
internal.NewSysEmsLogDao(),
}
)
// Fill with you ideas below.
// NowDayCount 当天发送次数
func (dao *sysEmsLogDao) NowDayCount(ctx context.Context, event, email string) (count int, err error) {
count, err = dao.Ctx(ctx).
Where("email", email).
Where("event", event).
WhereGTE("created_at", gtime.Now().Format("Y-m-d")).
Count()
if err != nil {
return 0, err
}
return
}

View File

@@ -5,10 +5,6 @@
package dao
import (
"context"
"github.com/gogf/gf/v2/container/gvar"
"github.com/gogf/gf/v2/errors/gerror"
"hotgo/internal/consts"
"hotgo/internal/dao/internal"
)
@@ -29,38 +25,3 @@ var (
)
// Fill with you ideas below.
// GetRegion 获取省市编码对应的地区名称
func (dao *sysProvincesDao) GetRegion(ctx context.Context, province int64, city int64, spilt ...string) (string, error) {
var (
provinceName *gvar.Var
cityName *gvar.Var
err error
)
// 分隔符
spiltSymbol := "-"
if len(spilt) > 0 {
spiltSymbol = spilt[0]
}
if province > 0 && province < 999999 {
provinceName, err = dao.Ctx(ctx).Where("id", province).Fields("title").Value()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return "", err
}
if city > 0 {
cityName, err = dao.Ctx(ctx).Where("id", city).Fields("title").Value()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return "", err
}
}
} else {
return "内网IP", nil
}
return provinceName.String() + spiltSymbol + cityName.String(), nil
}

View File

@@ -26,6 +26,7 @@ import (
"hotgo/utility/charset"
"hotgo/utility/simple"
"os"
"strings"
)
func Init(ctx context.Context) {
@@ -45,12 +46,12 @@ func Init(ctx context.Context) {
RootPtah, _ = os.Getwd()
fmt.Printf("欢迎使用HotGo\r\n当前运行环境%v, 运行根路径为:%v \r\nHotGo版本v%v, gf版本%v \n", SysType, RootPtah, consts.VersionApp, gf.VERSION)
g.Log().SetHandlers(LoggingServeLogHandler)
setOrmCacheAdapter()
service.SysBlacklist().Load(ctx)
g.Log().SetHandlers(LoggingServeLogHandler)
startMonitor(ctx)
hggen.InIt(ctx)
@@ -61,13 +62,13 @@ func startMonitor(ctx context.Context) {
MonitorData.STartTime = gtime.Now()
intranetIP, err := location.GetLocalIP()
if err != nil {
g.Log().Warningf(ctx, "parse intranetIP err:%+v", err)
g.Log().Infof(ctx, "parse intranetIP err:%+v", err)
}
MonitorData.IntranetIP = intranetIP
publicIP, err := location.GetPublicIP(ctx)
if err != nil {
g.Log().Warningf(ctx, "parse publicIP err:%+v", err)
g.Log().Infof(ctx, "parse publicIP err:%+v", err)
}
MonitorData.PublicIP = publicIP
})
@@ -81,47 +82,59 @@ func setOrmCacheAdapter() {
func LoggingServeLogHandler(ctx context.Context, in *glog.HandlerInput) {
in.Next(ctx)
conf, err := service.SysConfig().GetLoadServeLog(ctx)
if err != nil {
return
}
err := g.Try(ctx, func(ctx context.Context) {
var err error
defer func() {
if err != nil {
panic(err)
}
}()
conf, err := service.SysConfig().GetLoadServeLog(ctx)
if err != nil {
return
}
if conf == nil {
return
}
if conf == nil {
return
}
if !conf.Switch {
return
}
if !conf.Switch {
return
}
if in.LevelFormat == "" || !gstr.InArray(conf.LevelFormat, in.LevelFormat) {
return
}
if in.LevelFormat == "" || !gstr.InArray(conf.LevelFormat, in.LevelFormat) {
return
}
var data entity.SysServeLog
data.TraceId = gctx.CtxId(ctx)
data.LevelFormat = in.LevelFormat
data.Content = in.Content
data.Stack = gjson.New(charset.ParseStack(in.Stack))
data.Line = in.CallerPath
data.TriggerNs = in.Time.UnixNano()
data.Status = consts.StatusEnabled
if in.Stack == "" {
in.Stack = in.Logger.GetStack(4) // 4是跳过当前方法如果调整本行位置需要重新调整skip
}
if data.Stack.IsNil() {
data.Stack = gjson.New(consts.NilJsonToString)
}
var data entity.SysServeLog
data.TraceId = gctx.CtxId(ctx)
data.LevelFormat = in.LevelFormat
data.Content = in.Content
data.Stack = gjson.New(charset.ParseStack(in.Stack))
data.Line = strings.TrimRight(in.CallerPath, ":")
data.TriggerNs = in.Time.UnixNano()
data.Status = consts.StatusEnabled
if gstr.Contains(in.Content, `exception recovered`) {
data.LevelFormat = "PANI"
}
if data.Stack.IsNil() {
data.Stack = gjson.New(consts.NilJsonToString)
}
if conf.Queue {
err = queue.Push(consts.QueueServeLogTopic, data)
} else {
err = service.SysServeLog().RealWrite(ctx, data)
}
if gstr.Contains(in.Content, `exception recovered`) {
data.LevelFormat = "PANI"
}
if conf.Queue {
err = queue.Push(consts.QueueServeLogTopic, data)
} else {
err = service.SysServeLog().RealWrite(ctx, data)
}
})
if err != nil {
g.Log().Printf(ctx, "LoggingServeLogHandler err:%+v", err)
g.Log("serveLog").Errorf(ctx, "LoggingServeLogHandler err:%+v", err)
}
}

View File

@@ -33,7 +33,7 @@ func Generate(ctx context.Context) (id string, base64 string) {
// Fonts: []string{"chromohv.ttf"},
//}
//
// 算
driver := &base64Captcha.DriverMath{
Height: 42,
Width: 100,

View File

@@ -50,6 +50,16 @@ func SetTakeUpTime(ctx context.Context, takeUpTime int64) {
Get(ctx).TakeUpTime = takeUpTime
}
// GetUser 获取用户信息
func GetUser(ctx context.Context) *model.Identity {
c := Get(ctx)
if c == nil {
return nil
}
return c.User
}
// GetUserId 获取用户ID
func GetUserId(ctx context.Context) int64 {
user := Get(ctx).User

View File

@@ -7,7 +7,3 @@
package debris
// 碎片
func Test() {
}

View File

@@ -19,24 +19,6 @@ func Send(config *model.EmailConfig, to string, subject string, body string) err
return sendToMail(config, to, subject, body, "html")
}
// SendTestMail 发送测试邮件
func SendTestMail(config *model.EmailConfig, to string) error {
subject := "这是一封来自HotGo的测试邮件"
body := `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="iso-8859-15">
<title>这是一封来自HotGo的测试邮件</title>
</head>
<body>
当你收到这封邮件的时候,说明已经联调成功了,恭喜你!
</body>
</html>`
return Send(config, to, subject, body)
}
func sendToMail(config *model.EmailConfig, to, subject, body, mailType string) error {
if config == nil {

View File

@@ -15,6 +15,7 @@ import (
"hotgo/internal/library/hggen/internal/cmd"
"hotgo/internal/library/hggen/internal/cmd/gendao"
"hotgo/internal/library/hggen/views"
"hotgo/internal/model"
"hotgo/internal/model/input/form"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
@@ -49,11 +50,33 @@ func TableColumns(ctx context.Context, in sysin.GenCodesColumnListInp) (fields [
func TableSelects(ctx context.Context, in sysin.GenCodesSelectsInp) (res *sysin.GenCodesSelectsModel, err error) {
res = new(sysin.GenCodesSelectsModel)
for k, v := range consts.GenCodesTypeNameMap {
res.GenType = append(res.GenType, &form.Select{
Value: k,
Name: v,
Label: v,
})
row := &sysin.GenTypeSelect{
Value: k,
Name: v,
Label: v,
Templates: make(form.Selects, 0),
}
confName, ok := consts.GenCodesTypeConfMap[k]
if ok {
var temps []*model.GenerateAppCrudTemplate
err = g.Cfg().MustGet(ctx, "hggen.application."+confName+".templates").Scan(&temps)
if err != nil {
return
}
if len(temps) > 0 {
for index, temp := range temps {
row.Templates = append(row.Templates, &form.Select{
Value: index,
Label: temp.Group,
Name: temp.Group,
})
}
sort.Sort(row.Templates)
}
}
res.GenType = append(res.GenType, row)
}
sort.Sort(res.GenType)
res.Db = DbSelect(ctx)

View File

@@ -61,7 +61,6 @@ func GetServiceConfig() genservice.CGenServiceInput {
}
func GetDaoConfig(group string) gendao.CGenDaoInput {
inp := defaultGenDaoInput
find := func(group string) g.Map {
for _, v := range daoConfig {
if v.(g.Map)["group"].(string) == group {
@@ -72,9 +71,9 @@ func GetDaoConfig(group string) gendao.CGenDaoInput {
}
v := find(group)
inp := defaultGenDaoInput
if v != nil {
err := gconv.Scan(v, &inp)
if err != nil {
if err := gconv.Scan(v, &inp); err != nil {
panic(err)
}
}

View File

@@ -10,7 +10,7 @@ var (
)
type cGen struct {
g.Meta `name:"hggen" brief:"{cGenBrief}" dc:"{cGenDc}"`
g.Meta `name:"gen" brief:"{cGenBrief}" dc:"{cGenDc}"`
cGenDao
cGenPb
cGenPbEntity
@@ -20,9 +20,9 @@ type cGen struct {
const (
cGenBrief = `automatically generate go files for dao/do/entity/pb/pbentity`
cGenDc = `
The "hggen" command is designed for multiple generating purposes.
The "gen" command is designed for multiple generating purposes.
It's currently supporting generating go files for ORM models, protobuf and protobuf entity files.
Please use "gf hggen dao -h" for specified type help.
Please use "gf gen dao -h" for specified type help.
`
)

View File

@@ -44,22 +44,22 @@ type (
)
const (
cGenPbEntityConfig = `gfcli.hggen.pbentity`
cGenPbEntityConfig = `gfcli.gen.pbentity`
cGenPbEntityBrief = `generate entity message files in protobuf3 format`
cGenPbEntityEg = `
gf hggen pbentity
gf hggen pbentity -l "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
gf hggen pbentity -p ./protocol/demos/entity -t user,user_detail,user_login
gf hggen pbentity -r user_
gf gen pbentity
gf gen pbentity -l "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
gf gen pbentity -p ./protocol/demos/entity -t user,user_detail,user_login
gf gen pbentity -r user_
`
cGenPbEntityAd = `
CONFIGURATION SUPPORT
Options are also supported by configuration file.
It's suggested using configuration file instead of command line arguments making producing.
The configuration node name is "gf.hggen.pbentity", which also supports multiple databases, for example(config.yaml):
The configuration node name is "gf.gen.pbentity", which also supports multiple databases, for example(config.yaml):
gfcli:
hggen:
gen:
- pbentity:
link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
path: "protocol/demos/entity"

View File

@@ -18,23 +18,23 @@ import (
)
const (
CGenDaoConfig = `gfcli.hggen.dao`
CGenDaoUsage = `gf hggen dao [OPTION]`
CGenDaoConfig = `gfcli.gen.dao`
CGenDaoUsage = `gf gen dao [OPTION]`
CGenDaoBrief = `automatically generate go files for dao/do/entity`
CGenDaoEg = `
gf hggen dao
gf hggen dao -l "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
gf hggen dao -p ./model -g user-center -t user,user_detail,user_login
gf hggen dao -r user_
gf gen dao
gf gen dao -l "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
gf gen dao -p ./model -g user-center -t user,user_detail,user_login
gf gen dao -r user_
`
CGenDaoAd = `
CONFIGURATION SUPPORT
Options are also supported by configuration file.
It's suggested using configuration file instead of command line arguments making producing.
The configuration node name is "gfcli.hggen.dao", which also supports multiple databases, for example(config.yaml):
The configuration node name is "gfcli.gen.dao", which also supports multiple databases, for example(config.yaml):
gfcli:
hggen:
gen:
dao:
- link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
tables: "order,products"
@@ -179,7 +179,6 @@ type (
)
func (c CGenDao) Dao(ctx context.Context, in CGenDaoInput) (out *CGenDaoOutput, err error) {
g.Log().Warningf(ctx, "g.Cfg().Available(ctx):%v", g.Cfg().Available(ctx))
if g.Cfg().Available(ctx) {
v := g.Cfg().MustGet(ctx, CGenDaoConfig)
if v.IsSlice() {
@@ -200,7 +199,7 @@ func DoGenDaoForArray(ctx context.Context, in CGenDaoInput) {
doGenDaoForArray(ctx, -1, in)
}
// doGenDaoForArray implements the "hggen dao" command for configuration array.
// doGenDaoForArray implements the "gen dao" command for configuration array.
func doGenDaoForArray(ctx context.Context, index int, in CGenDaoInput) {
var (
err error

View File

@@ -20,12 +20,12 @@ import (
)
const (
CGenServiceConfig = `gfcli.hggen.service`
CGenServiceUsage = `gf hggen service [OPTION]`
CGenServiceConfig = `gfcli.gen.service`
CGenServiceUsage = `gf gen service [OPTION]`
CGenServiceBrief = `parse struct and associated functions from packages to generate service go file`
CGenServiceEg = `
gf hggen service
gf hggen service -f Snake
gf gen service
gf gen service -f Snake
`
CGenServiceBriefSrcFolder = `source folder path to be parsed. default: internal/logic`
CGenServiceBriefDstFolder = `destination folder path storing automatically generated go files. default: internal/service`
@@ -89,13 +89,13 @@ const (
func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGenServiceOutput, err error) {
// File lock to avoid multiple processes.
var (
flockFilePath = gfile.Temp("gf.cli.hggen.service.lock")
flockFilePath = gfile.Temp("gf.cli.gen.service.lock")
flockContent = gfile.GetContents(flockFilePath)
)
if flockContent != "" {
if gtime.Timestamp()-gconv.Int64(flockContent) < genServiceFileLockSeconds {
// If another "hggen service" process is running, it just exits.
mlog.Debug(`another "hggen service" process is running, exit`)
// If another "gen service" process is running, it just exits.
mlog.Debug(`another "gen service" process is running, exit`)
return
}
}
@@ -127,7 +127,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe
mlog.Debug("Chdir:", newWorkingDir)
_ = gfile.Remove(flockFilePath)
var command = fmt.Sprintf(
`%s hggen service -packages=%s`,
`%s gen service -packages=%s`,
gfile.SelfName(), gfile.Basename(watchFileDir),
)
err = gproc.ShellRun(ctx, command)

View File

@@ -157,6 +157,11 @@ func setDefaultFormMode(field *sysin.GenCodesColumnListModel) {
return
}
if (field.GoName == "ProvinceId" || field.GoName == "CityId") && IsNumberType(field.GoType) {
field.FormMode = FormModeCitySelector
return
}
if field.DataType == "datetime" || field.DataType == "timestamp" || field.DataType == "timestamptz" {
field.FormMode = FormModeTime
return

View File

@@ -115,6 +115,7 @@ const (
FormModeUploadFiles = "UploadFiles" // 多文件上传
FormModeSwitch = "Switch" // 开关
FormModeRate = "Rate" // 评分
FormModeCitySelector = "CitySelector" // 省市区选择
)
var FormModes = []string{
@@ -124,6 +125,7 @@ var FormModes = []string{
FormModeUploadImage, FormModeUploadImages, FormModeUploadFile, FormModeUploadFiles,
FormModeSwitch,
FormModeRate,
FormModeCitySelector,
}
var FormModeMap = map[string]string{
@@ -146,6 +148,7 @@ var FormModeMap = map[string]string{
FormModeUploadFiles: "多文件上传",
FormModeSwitch: "开关",
FormModeRate: "评分",
FormModeCitySelector: "省市区选择",
}
// 表单验证

View File

@@ -118,7 +118,16 @@ func (l *gCurd) initInput(ctx context.Context, in *CurdPreviewInput) (err error)
initStep(ctx, in)
in.options.dictMap = make(g.Map)
in.options.TemplateGroup = "sys"
if len(in.Config.Application.Crud.Templates)-1 < in.In.GenTemplate {
return gerror.New("没有找到生成模板的配置,请检查!")
}
err = checkCurdPath(in.Config.Application.Crud.Templates[in.In.GenTemplate])
if err != nil {
return
}
in.options.TemplateGroup = in.Config.Application.Crud.Templates[in.In.GenTemplate].MasterPackage
return
}
@@ -137,14 +146,14 @@ func initStep(ctx context.Context, in *CurdPreviewInput) {
in.options.Step.HasMenu = gstr.InArray(in.options.AutoOps, "genMenuPermissions")
}
func (l *gCurd) loadView(ctx context.Context, in *CurdPreviewInput) error {
func (l *gCurd) loadView(ctx context.Context, in *CurdPreviewInput) (err error) {
view := gview.New()
err := view.SetConfigWithMap(g.Map{
"Paths": "./resource/template/generate/default/curd",
err = view.SetConfigWithMap(g.Map{
"Paths": in.Config.Application.Crud.Templates[in.In.GenTemplate].TemplatePath,
"Delimiters": in.Config.Delimiters,
})
if err != nil {
return err
return
}
view.BindFuncMap(g.Map{
@@ -156,7 +165,7 @@ func (l *gCurd) loadView(ctx context.Context, in *CurdPreviewInput) error {
dictOptions, err := l.generateWebModelDictOptions(ctx, in)
if err != nil {
return err
return
}
view.Assigns(gview.Params{
@@ -174,13 +183,13 @@ func (l *gCurd) loadView(ctx context.Context, in *CurdPreviewInput) error {
"dictOptions": dictOptions, // web字典选项
})
in.view = view
return nil
return
}
func (l *gCurd) DoBuild(ctx context.Context, in *CurdBuildInput) (err error) {
preview, err := l.DoPreview(ctx, in.PreviewIn)
if err != nil {
return err
return
}
// 前置操作
@@ -307,7 +316,7 @@ func (l *gCurd) generateApiContent(ctx context.Context, in *CurdPreviewInput) (e
return err
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].ApiPath, strings.ToLower(in.In.VarName), strings.ToLower(in.In.VarName)+".go")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].ApiPath, strings.ToLower(in.In.VarName), strings.ToLower(in.In.VarName)+".go")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip
@@ -338,7 +347,7 @@ func (l *gCurd) generateInputContent(ctx context.Context, in *CurdPreviewInput)
if err != nil {
return err
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].InputPath, convert.CamelCaseToUnderline(in.In.VarName)+".go")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].InputPath, convert.CamelCaseToUnderline(in.In.VarName)+".go")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip
@@ -364,7 +373,7 @@ func (l *gCurd) generateControllerContent(ctx context.Context, in *CurdPreviewIn
if err != nil {
return err
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].ControllerPath, convert.CamelCaseToUnderline(in.In.VarName)+".go")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].ControllerPath, convert.CamelCaseToUnderline(in.In.VarName)+".go")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip
@@ -394,7 +403,7 @@ func (l *gCurd) generateLogicContent(ctx context.Context, in *CurdPreviewInput)
if err != nil {
return err
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].LogicPath, convert.CamelCaseToUnderline(in.In.VarName)+".go")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].LogicPath, convert.CamelCaseToUnderline(in.In.VarName)+".go")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip
@@ -420,7 +429,7 @@ func (l *gCurd) generateRouterContent(ctx context.Context, in *CurdPreviewInput)
return err
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].RouterPath, convert.CamelCaseToUnderline(in.In.VarName)+".go")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].RouterPath, convert.CamelCaseToUnderline(in.In.VarName)+".go")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip
@@ -446,7 +455,7 @@ func (l *gCurd) generateWebApiContent(ctx context.Context, in *CurdPreviewInput)
return err
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].WebApiPath, gstr.LcFirst(in.In.VarName), "index.ts")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].WebApiPath, gstr.LcFirst(in.In.VarName), "index.ts")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip
@@ -477,7 +486,7 @@ func (l *gCurd) generateWebModelContent(ctx context.Context, in *CurdPreviewInpu
return err
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].WebViewsPath, gstr.LcFirst(in.In.VarName), "model.ts")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].WebViewsPath, gstr.LcFirst(in.In.VarName), "model.ts")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip
@@ -507,7 +516,7 @@ func (l *gCurd) generateWebIndexContent(ctx context.Context, in *CurdPreviewInpu
return err
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].WebViewsPath, gstr.LcFirst(in.In.VarName), "index.vue")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].WebViewsPath, gstr.LcFirst(in.In.VarName), "index.vue")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip
@@ -538,7 +547,7 @@ func (l *gCurd) generateWebEditContent(ctx context.Context, in *CurdPreviewInput
return err
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].WebViewsPath, gstr.LcFirst(in.In.VarName), "edit.vue")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].WebViewsPath, gstr.LcFirst(in.In.VarName), "edit.vue")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip
@@ -573,7 +582,7 @@ func (l *gCurd) generateWebViewContent(ctx context.Context, in *CurdPreviewInput
return err
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].WebViewsPath, gstr.LcFirst(in.In.VarName), "view.vue")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].WebViewsPath, gstr.LcFirst(in.In.VarName), "view.vue")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip
@@ -609,7 +618,7 @@ func (l *gCurd) generateSqlContent(ctx context.Context, in *CurdPreviewInput) (e
tplData["mainComponent"] = "ParentLayout" //gstr.LcFirst(in.In.VarName)
}
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[0].SqlPath, convert.CamelCaseToUnderline(in.In.VarName)+"_menu.sql")
genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].SqlPath, convert.CamelCaseToUnderline(in.In.VarName)+"_menu.sql")
genFile.Meth = consts.GenCodesBuildMethCreate
if gfile.Exists(genFile.Path) {
genFile.Meth = consts.GenCodesBuildMethSkip

View File

@@ -19,11 +19,13 @@ import (
const (
LogicWhereComments = "\n\t// 查询%s\n"
LogicWhereNoSupport = "\t// TODO 暂不支持生成[ %s ]查询方式,请自行补充此处代码!"
LogicListSimpleSelect = "\tfields, err := hgorm.GenSelect(ctx, sysin.%sListModel{}, dao.%s)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}"
LogicListSimpleSelect = "\tfields, err := hgorm.GenSelect(ctx, sysin.%sListModel{}, dao.%s)\n\tif err != nil {\n\t\treturn\n\t}"
LogicListJoinSelect = "\t//关联表select\n\tfields, err := hgorm.GenJoinSelect(ctx, %sin.%sListModel{}, dao.%s, []*hgorm.Join{\n%v\t})"
LogicListJoinOnRelation = "\t// 关联表%s\n\tmod = mod.%s(hgorm.GenJoinOnRelation(\n\t\tdao.%s.Table(), dao.%s.Columns().%s, // 主表表名,关联条件\n\t\tdao.%s.Table(), \"%s\", dao.%s.Columns().%s, // 关联表表名,别名,关联条件\n\t)...)\n\n"
LogicEditUpdate = "\t\t_, err = dao.%s.Ctx(ctx).\n\t\t\tFieldsEx(\n%s\t\t\t).\n\t\t\tWhere(dao.%s.Columns().%s, in.%s).Data(in).Update()\n\t\tif err != nil {\n\t\t\terr = gerror.Wrap(err, consts.ErrorORM)\n\t\t\treturn err\n\t\t}\n\t\treturn nil"
LogicEditInsert = "\t_, err = dao.%s.Ctx(ctx).\n\t\tFieldsEx(\n%s\t\t).\n\t\tData(in).Insert()\n\tif err != nil {\n\t\terr = gerror.Wrap(err, consts.ErrorORM)\n\t\treturn err\n\t}"
LogicEditUpdate = "\t\t_, err = s.Model(ctx).\n\t\t\tFieldsEx(\n%s\t\t\t).\n\t\t\tWhere(dao.%s.Columns().%s, in.%s).Data(in).Update()\n\t\treturn "
LogicEditInsert = "\t_, err = s.Model(ctx, &handler.Option{FilterAuth: false}).\n\t\tFieldsEx(\n%s\t\t).\n\t\tData(in).Insert()"
LogicSwitchUpdate = "g.Map{\n\t\tin.Key: in.Value,\n%s}"
LogicStatusUpdate = "g.Map{\n\t\tdao.%s.Columns().Status: in.Status,\n%s}"
)
func (l *gCurd) logicTplData(ctx context.Context, in *CurdPreviewInput) (data g.Map, err error) {
@@ -33,9 +35,35 @@ func (l *gCurd) logicTplData(ctx context.Context, in *CurdPreviewInput) (data g.
data["listOrder"] = l.generateLogicListOrder(ctx, in)
data["edit"] = l.generateLogicEdit(ctx, in)
data["switchFields"] = l.generateLogicSwitchFields(ctx, in)
data["switchUpdate"] = l.generateLogicSwitchUpdate(ctx, in)
data["statusUpdate"] = l.generateLogicStatusUpdate(ctx, in)
return
}
func (l *gCurd) generateLogicStatusUpdate(ctx context.Context, in *CurdPreviewInput) string {
var update string
for _, field := range in.masterFields {
if field.GoName == "UpdatedBy" {
update += "\t\tdao." + in.In.DaoName + ".Columns().UpdatedBy: contexts.GetUserId(ctx),\n"
}
}
update += "\t"
return fmt.Sprintf(LogicStatusUpdate, in.In.DaoName, update)
}
func (l *gCurd) generateLogicSwitchUpdate(ctx context.Context, in *CurdPreviewInput) string {
var update string
for _, field := range in.masterFields {
if field.GoName == "UpdatedBy" {
update += "\t\tdao." + in.In.DaoName + ".Columns().UpdatedBy: contexts.GetUserId(ctx),\n"
}
}
update += "\t"
return fmt.Sprintf(LogicSwitchUpdate, update)
}
func (l *gCurd) generateLogicSwitchFields(ctx context.Context, in *CurdPreviewInput) string {
buffer := bytes.NewBuffer(nil)
if in.options.Step.HasSwitch {
@@ -71,8 +99,8 @@ func (l *gCurd) generateLogicEdit(ctx context.Context, in *CurdPreviewInput) g.M
}
}
updateBuffer.WriteString(fmt.Sprintf(LogicEditUpdate, in.In.DaoName, updateFieldsEx, in.In.DaoName, in.pk.GoName, in.pk.GoName))
insertBuffer.WriteString(fmt.Sprintf(LogicEditInsert, in.In.DaoName, insertFieldsEx))
updateBuffer.WriteString(fmt.Sprintf(LogicEditUpdate, updateFieldsEx, in.In.DaoName, in.pk.GoName, in.pk.GoName))
insertBuffer.WriteString(fmt.Sprintf(LogicEditInsert, insertFieldsEx))
data["update"] = updateBuffer.String()
data["insert"] = insertBuffer.String()

View File

@@ -34,7 +34,7 @@ func (l *gCurd) generateWebEditFormItem(ctx context.Context, in *CurdPreviewInpu
}
var (
defaultComponent = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-input placeholder=\"请输入%s\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.Dc, field.TsName)
defaultComponent = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-input placeholder=\"请输入%s\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.Dc, field.TsName)
component string
)
@@ -43,65 +43,68 @@ func (l *gCurd) generateWebEditFormItem(ctx context.Context, in *CurdPreviewInpu
component = defaultComponent
case FormModeInputNumber:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-input-number placeholder=\"请输入%s\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.Dc, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-input-number placeholder=\"请输入%s\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.Dc, field.TsName)
case FormModeInputTextarea:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-input type=\"textarea\" placeholder=\"%s\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.Dc, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-input type=\"textarea\" placeholder=\"%s\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.Dc, field.TsName)
case FormModeInputEditor:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <Editor style=\"height: 450px\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <Editor style=\"height: 450px\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
case FormModeInputDynamic:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-dynamic-input\n v-model:value=\"params.%s\"\n preset=\"pair\"\n key-placeholder=\"键名\"\n value-placeholder=\"键值\"\n />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-dynamic-input\n v-model:value=\"params.%s\"\n preset=\"pair\"\n key-placeholder=\"键名\"\n value-placeholder=\"键值\"\n />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
case FormModeDate:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <DatePicker v-model:formValue=\"params.%s\" type=\"date\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <DatePicker v-model:formValue=\"params.%s\" type=\"date\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
//case FormModeDateRange: // 必须要有两个字段,后面优化下
case FormModeTime:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <DatePicker v-model:formValue=\"params.%s\" type=\"datetime\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <DatePicker v-model:formValue=\"params.%s\" type=\"datetime\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
//case FormModeTimeRange: // 必须要有两个字段,后面优化下
case FormModeRadio:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-radio-group v-model:value=\"params.%s\" name=\"%s\">\n <n-radio-button\n v-for=\"%s in options.%s\"\n :key=\"%s.value\"\n :value=\"%s.value\"\n :label=\"%s.label\"\n />\n </n-radio-group>\n </n-form-item>", field.Dc, field.TsName, field.TsName, field.TsName, field.TsName, in.options.dictMap[field.TsName], field.TsName, field.TsName, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-radio-group v-model:value=\"params.%s\" name=\"%s\">\n <n-radio-button\n v-for=\"%s in options.%s\"\n :key=\"%s.value\"\n :value=\"%s.value\"\n :label=\"%s.label\"\n />\n </n-radio-group>\n </n-form-item>", field.Dc, field.TsName, field.TsName, field.TsName, field.TsName, in.options.dictMap[field.TsName], field.TsName, field.TsName, field.TsName)
case FormModeCheckbox:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-checkbox-group v-model:value=\"params.%s\">\n <n-space>\n <n-checkbox\n v-for=\"item in options.%s\"\n :key=\"item.value\"\n :value=\"item.value\"\n :label=\"item.label\"\n />\n </n-space>\n </n-checkbox-group>\n </n-form-item>", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName])
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-checkbox-group v-model:value=\"params.%s\">\n <n-space>\n <n-checkbox\n v-for=\"item in options.%s\"\n :key=\"item.value\"\n :value=\"item.value\"\n :label=\"item.label\"\n />\n </n-space>\n </n-checkbox-group>\n </n-form-item>", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName])
case FormModeSelect:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-select v-model:value=\"params.%s\" :options=\"options.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName])
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-select v-model:value=\"params.%s\" :options=\"options.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName])
case FormModeSelectMultiple:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-select multiple v-model:value=\"params.%s\" :options=\"options.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName])
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-select multiple v-model:value=\"params.%s\" :options=\"options.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName, in.options.dictMap[field.TsName])
case FormModeUploadImage:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <UploadImage :maxNumber=\"1\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <UploadImage :maxNumber=\"1\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
case FormModeUploadImages:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <UploadImage :maxNumber=\"10\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <UploadImage :maxNumber=\"10\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
case FormModeUploadFile:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <UploadFile :maxNumber=\"1\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <UploadFile :maxNumber=\"1\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
case FormModeUploadFiles:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <UploadFile :maxNumber=\"10\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <UploadFile :maxNumber=\"10\" v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
case FormModeSwitch:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-switch v-model:value=\"params.%s\"\n />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-switch :unchecked-value=\"2\" :checked-value=\"1\" v-model:value=\"params.%s\"\n />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
case FormModeRate:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-rate allow-half :default-value=\"params.%s\" :on-update:value=\"update%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName, field.GoName)
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <n-rate allow-half :default-value=\"params.%s\" :on-update:value=\"update%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName, field.GoName)
case FormModeCitySelector:
component = fmt.Sprintf("<n-form-item label=\"%s\" path=\"%s\">\n <CitySelector v-model:value=\"params.%s\" />\n </n-form-item>", field.Dc, field.TsName, field.TsName)
default:
component = defaultComponent
}
if len(in.masterFields) == k {
buffer.WriteString(" " + component)
buffer.WriteString(" " + component)
} else {
buffer.WriteString(" " + component + "\n\n")
buffer.WriteString(" " + component + "\n\n")
}
}
@@ -117,11 +120,12 @@ func (l *gCurd) generateWebEditScript(ctx context.Context, in *CurdPreviewInput)
if in.options.Step.HasMaxSort {
importBuffer.WriteString(" import { onMounted, ref, computed, watch } from 'vue';\n")
importBuffer.WriteString(" import { Edit, MaxSort } from '@/api/" + gstr.LcFirst(in.In.VarName) + "';\n")
setupBuffer.WriteString(" watch(\n () => params.value,\n (value) => {\n if (value.id === 0) {\n MaxSort().then((res) => {\n params.value.sort = res.sort;\n });\n }\n }\n );\n\n")
importBuffer.WriteString(" import { Edit, MaxSort, View } from '@/api/" + gstr.LcFirst(in.In.VarName) + "';\n")
setupBuffer.WriteString(" function loadForm(value) {\n loading.value = true;\n\n // 新增\n if (value.id < 1) {\n params.value = newState(value);\n MaxSort()\n .then((res) => {\n params.value.sort = res.sort;\n })\n .finally(() => {\n loading.value = false;\n });\n return;\n }\n\n // 编辑\n View({ id: value.id })\n .then((res) => {\n params.value = res;\n })\n .finally(() => {\n loading.value = false;\n });\n }\n\n watch(\n () => props.formParams,\n (value) => {\n loadForm(value);\n }\n );")
} else {
importBuffer.WriteString(" import { onMounted, ref, computed } from 'vue';\n")
importBuffer.WriteString(" import { Edit } from '@/api/" + gstr.LcFirst(in.In.VarName) + "';\n")
importBuffer.WriteString(" import { Edit, View } from '@/api/" + gstr.LcFirst(in.In.VarName) + "';\n")
setupBuffer.WriteString(" function loadForm(value) {\n // 新增\n if (value.id < 1) {\n params.value = newState(value);\n loading.value = false;\n return;\n }\n\n loading.value = true;\n // 编辑\n View({ id: value.id })\n .then((res) => {\n params.value = res;\n })\n .finally(() => {\n loading.value = false;\n });\n }\n\n watch(\n () => props.formParams,\n (value) => {\n loadForm(value);\n }\n );")
}
for _, field := range in.masterFields {
@@ -147,12 +151,15 @@ func (l *gCurd) generateWebEditScript(ctx context.Context, in *CurdPreviewInput)
}
case FormModeRate:
setupBuffer.WriteString(fmt.Sprintf(" function update%s(num) {\n params.value.%s = num;\n }\n", field.GoName, field.TsName))
case FormModeCitySelector:
if !gstr.Contains(importBuffer.String(), `import CitySelector`) {
importBuffer.WriteString(" import CitySelector from '@/components/CitySelector/citySelector.vue';\n")
}
}
}
data["import"] = importBuffer.String()
data["setup"] = setupBuffer.String()
return data
}

View File

@@ -1,4 +1,4 @@
// Package hggen
// Package views
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2022 HotGo CLI
// @Author Ms <133814250@qq.com>
@@ -8,9 +8,12 @@ package views
import (
"context"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gstr"
"hotgo/internal/consts"
"hotgo/internal/model"
"hotgo/internal/model/input/sysin"
"io/ioutil"
"strings"
@@ -94,3 +97,41 @@ func ImportSql(ctx context.Context, path string) error {
return nil
}
func checkCurdPath(temp *model.GenerateAppCrudTemplate) (err error) {
if temp == nil {
return gerror.New("生成模板配置不能为空")
}
tip := `生成模板配置参数'%s'路径不存在,请先创建路径`
if !gfile.Exists(temp.TemplatePath) {
return gerror.Newf(tip, "TemplatePath")
}
if !gfile.Exists(temp.ApiPath) {
return gerror.Newf(tip, "ApiPath")
}
if !gfile.Exists(temp.InputPath) {
return gerror.Newf(tip, "InputPath")
}
if !gfile.Exists(temp.ControllerPath) {
return gerror.Newf(tip, "ControllerPath")
}
if !gfile.Exists(temp.LogicPath) {
return gerror.Newf(tip, "LogicPath")
}
if !gfile.Exists(temp.RouterPath) {
return gerror.Newf(tip, "RouterPath")
}
if !gfile.Exists(temp.SqlPath) {
return gerror.Newf(tip, "SqlPath")
}
if !gfile.Exists(temp.WebApiPath) {
return gerror.Newf(tip, "WebApiPath")
}
if !gfile.Exists(temp.WebViewsPath) {
return gerror.Newf(tip, "WebViewsPath")
}
return
}

View File

@@ -19,15 +19,6 @@ import (
"hotgo/utility/tree"
)
// GenJoinOnRelation 生成关联表关联条件
func GenJoinOnRelation(masterTable, masterField, joinTable, alias, onField string) []string {
return []string{
joinTable,
alias,
fmt.Sprintf("`%s`.`%s` = `%s`.`%s`", alias, onField, masterTable, masterField),
}
}
type daoInstance interface {
Table() string
Ctx(ctx context.Context) *gdb.Model
@@ -40,6 +31,15 @@ type Join struct {
fields map[string]*gdb.TableField // 表字段列表
}
// GenJoinOnRelation 生成关联表关联条件
func GenJoinOnRelation(masterTable, masterField, joinTable, alias, onField string) []string {
return []string{
joinTable,
alias,
fmt.Sprintf("`%s`.`%s` = `%s`.`%s`", alias, onField, masterTable, masterField),
}
}
// GenJoinSelect 生成关联表select
// 这里会将实体中的字段驼峰转为下划线于数据库进行匹配,意味着数据库字段必须全部是小写字母+下划线的格式
func GenJoinSelect(ctx context.Context, entity interface{}, masterDao interface{}, joins []*Join) (allFields string, err error) {

View File

@@ -1,14 +1,6 @@
// Package hgorm
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2022 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package hgorm
package handler
// 预处理
import (
"fmt"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/text/gstr"
@@ -18,22 +10,15 @@ import (
"hotgo/utility/tree"
)
// HandlerFilterAuth 过滤数据权限
// FilterAuth 过滤数据权限
// 通过上下文中的用户角色权限和表中是否含有需要过滤的字段附加查询条件
func HandlerFilterAuth(m *gdb.Model) *gdb.Model {
func FilterAuth(m *gdb.Model) *gdb.Model {
var (
needAuth bool
filterField string
role *entity.AdminRole
ctx = m.GetCtx()
fields = escapeFieldsToSlice(m.GetFieldsStr())
co = contexts.Get(ctx)
)
if co == nil || co.User == nil {
return m
}
// 优先级created_by > member_id
if gstr.InArray(fields, "created_by") {
needAuth = true
@@ -49,43 +34,54 @@ func HandlerFilterAuth(m *gdb.Model) *gdb.Model {
return m
}
err := g.Model("admin_role").Where("id", co.User.RoleId).Scan(&role)
if err != nil {
panic(fmt.Sprintf("failed to role information err:%+v", err))
}
if role == nil {
panic("failed to role information roleModel == nil")
}
sq := g.Model("admin_member").Fields("id")
switch role.DataScope {
case consts.RoleDataAll: // 全部权限
// ...
case consts.RoleDataNowDept: // 当前部门
m = m.WhereIn(filterField, sq.Where("dept_id", co.User.DeptId))
case consts.RoleDataDeptAndSub: // 当前部门及以下部门
m = m.WhereIn(filterField, sq.WhereIn("dept_id", GetDeptAndSub(co.User.DeptId)))
case consts.RoleDataDeptCustom: // 自定义部门
m = m.WhereIn(filterField, sq.WhereIn("dept_id", role.CustomDept.Var().Ints()))
case consts.RoleDataSelf: // 仅自己
m = m.Where(filterField, co.User.Id)
case consts.RoleDataSelfAndSub: // 自己和直属下级
m = m.WhereIn(filterField, GetSelfAndSub(co.User.Id))
case consts.RoleDataSelfAndAllSub: // 自己和全部下级
m = m.WhereIn(filterField, GetSelfAndAllSub(co.User.Id))
default:
panic("dataScope is not registered")
}
return m
return m.Handler(FilterAuthWithField(filterField))
}
// HandlerForceCache 强制缓存
func HandlerForceCache(m *gdb.Model) *gdb.Model {
return m.Cache(gdb.CacheOption{Duration: -1, Force: true})
// FilterAuthWithField 过滤数据权限,设置指定字段
func FilterAuthWithField(filterField string) func(m *gdb.Model) *gdb.Model {
return func(m *gdb.Model) *gdb.Model {
var (
role *entity.AdminRole
ctx = m.GetCtx()
co = contexts.Get(ctx)
)
if co == nil || co.User == nil {
return m
}
err := g.Model("admin_role").Where("id", co.User.RoleId).Scan(&role)
if err != nil {
g.Log().Fatalf(ctx, "failed to role information err:%+v", err)
}
if role == nil {
g.Log().Fatalf(ctx, "failed to role information roleModel == nil")
}
sq := g.Model("admin_member").Fields("id")
switch role.DataScope {
case consts.RoleDataAll: // 全部权限
// ...
case consts.RoleDataNowDept: // 当前部门
m = m.WhereIn(filterField, sq.Where("dept_id", co.User.DeptId))
case consts.RoleDataDeptAndSub: // 当前部门及以下部门
m = m.WhereIn(filterField, sq.WhereIn("dept_id", GetDeptAndSub(co.User.DeptId)))
case consts.RoleDataDeptCustom: // 自定义部门
m = m.WhereIn(filterField, sq.WhereIn("dept_id", role.CustomDept.Var().Ints()))
case consts.RoleDataSelf: // 仅自己
m = m.Where(filterField, co.User.Id)
case consts.RoleDataSelfAndSub: // 自己和直属下级
m = m.WhereIn(filterField, GetSelfAndSub(co.User.Id))
case consts.RoleDataSelfAndAllSub: // 自己和全部下级
m = m.WhereIn(filterField, GetSelfAndAllSub(co.User.Id))
default:
g.Log().Fatalf(ctx, "dataScope is not registered")
}
return m
}
}
// escapeFieldsToSlice 将转义过的字段转换为字段集切片

View File

@@ -0,0 +1,8 @@
package handler
import "github.com/gogf/gf/v2/database/gdb"
// ForceCache 强制缓存
func ForceCache(m *gdb.Model) *gdb.Model {
return m.Cache(gdb.CacheOption{Duration: -1, Force: true})
}

View File

@@ -0,0 +1,39 @@
// Package handler
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2022 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package handler
// handler.
import (
"github.com/gogf/gf/v2/database/gdb"
)
// Option 预处理选项
type Option struct {
FilterAuth bool // 过滤权限
ForceCache bool // 强制缓存
}
// DefaultOption 默认预处理选项
var DefaultOption = &Option{
FilterAuth: true,
}
func Model(m *gdb.Model, opt ...*Option) *gdb.Model {
var option *Option
if len(opt) > 0 {
option = opt[0]
} else {
option = DefaultOption
}
if option.FilterAuth {
m = m.Handler(FilterAuth)
}
if option.ForceCache {
m = m.Handler(ForceCache)
}
return m
}

View File

@@ -1,9 +0,0 @@
// Package hgorm
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2022 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package hgorm
// 常用钩子

View File

@@ -0,0 +1,3 @@
package hook
// hook.

View File

@@ -0,0 +1,58 @@
package hook
import (
"context"
"github.com/gogf/gf/v2/container/gvar"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
)
// MemberInfo 后台用户信息
var MemberInfo = gdb.HookHandler{
Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) {
result, err = in.Next(ctx)
if err != nil {
return
}
for i, record := range result {
// 部门
if !record["dept_id"].IsEmpty() {
deptName, err := g.Model("admin_dept").Ctx(ctx).
Fields("name").
Where("id", record["dept_id"]).
Value()
if err != nil {
break
}
record["deptName"] = deptName
}
// 角色
if !record["role_id"].IsEmpty() {
roleName, err := g.Model("admin_role").Ctx(ctx).
Fields("name").
Where("id", record["role_id"]).
Value()
if err != nil {
break
}
record["roleName"] = roleName
}
if !record["password_hash"].IsEmpty() {
record["password_hash"] = gvar.New("")
}
if !record["salt"].IsEmpty() {
record["salt"] = gvar.New("")
}
if !record["auth_key"].IsEmpty() {
record["auth_key"] = gvar.New("")
}
result[i] = record
}
return
},
}

View File

@@ -0,0 +1,59 @@
package hook
import (
"context"
"github.com/gogf/gf/v2/container/gvar"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"hotgo/internal/library/location"
)
// CityLabel 城市地区标签
var CityLabel = gdb.HookHandler{
Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) {
result, err = in.Next(ctx)
if err != nil {
return
}
parse := func(id int64, index int) {
cityLabel, err := location.ParseSimpleRegion(ctx, id)
if err != nil {
g.Log().Warningf(ctx, "hook.CityLabel parse err:%+v", err)
}
result[index]["cityLabel"] = gvar.New(cityLabel)
return
}
for i, record := range result {
// 优先级: 区 > 市 > 省
cityId, ok := record["city_id"]
if ok && !cityId.IsEmpty() {
parse(cityId.Int64(), i)
continue
}
provinceId, ok := record["province_id"]
if ok && !provinceId.IsEmpty() {
parse(cityId.Int64(), i)
continue
}
// 以下是默认关联表 省市区字段
sysLogCityId, ok := record["sysLogCityId"]
if ok && !sysLogCityId.IsEmpty() {
parse(sysLogCityId.Int64(), i)
continue
}
sysLogProvinceId, ok := record["sysLogProvinceId"]
if ok && !sysLogProvinceId.IsEmpty() {
parse(cityId.Int64(), i)
continue
}
}
return
},
}

View File

@@ -38,12 +38,9 @@ func GenerateLoginToken(ctx context.Context, user *model.Identity, isRefresh boo
"avatar": user.Avatar,
"email": user.Email,
"mobile": user.Mobile,
"lastTime": user.LastTime,
"lastIp": user.LastIp,
"exp": user.Exp,
"expires": user.Expires,
"app": user.App,
"visitCount": user.VisitCount,
"isRefresh": isRefresh,
"jwtVersion": jwtVersion.String(),
})

View File

@@ -46,8 +46,8 @@ type AddressRegion struct {
CountyCode string `json:"countyCode"`
}
// AnalysisAddress 将地址解析出省市区编码
func AnalysisAddress(ctx context.Context, address, key string) (region *AddressRegion, err error) {
// ParseAddress 将地址解析出省市区编码
func ParseAddress(ctx context.Context, address, key string) (region *AddressRegion, err error) {
var (
url = fmt.Sprintf("https://restapi.amap.com/v3/geocode/geo?address=%v&output=JSON&key=%v", address, key)
responseMap = make(g.Map)

View File

@@ -141,12 +141,12 @@ func GetPublicIP(ctx context.Context) (ip string, err error) {
var data *WhoisRegionData
err = g.Client().Timeout(10*time.Second).GetVar(ctx, whoisApi).Scan(&data)
if err != nil {
g.Log().Warningf(ctx, "GetPublicIP alternatives are being tried err:%+v", err)
g.Log().Infof(ctx, "GetPublicIP alternatives are being tried err:%+v", err)
return GetPublicIP2()
}
if data == nil {
g.Log().Warningf(ctx, "publicIP address Parsing failure, check the network and firewall blocking.")
g.Log().Infof(ctx, "publicIP address Parsing failure, check the network and firewall blocking.")
return "0.0.0.0", nil
}
return data.Ip, nil

View File

@@ -0,0 +1,104 @@
package location
import (
"context"
"github.com/gogf/gf/v2/container/gvar"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"hotgo/internal/consts"
"hotgo/internal/model/entity"
"hotgo/utility/tree"
)
// ParseSimpleRegion 通过地区ID解析地区名称自动加入上级地区
func ParseSimpleRegion(ctx context.Context, id int64, spilt ...string) (string, error) {
if id == 0 {
return "", nil
}
var (
models *entity.SysProvinces
err error
)
if err = g.Model("sys_provinces").Ctx(ctx).Fields("title,level,tree").Where("id", id).Scan(&models); err != nil {
return "", err
}
if models == nil {
return "", gerror.Newf("the area code :%v is not in the database", id)
}
if models.Level == 1 {
return models.Title, nil
}
ids := tree.GetIds(models.Tree)
if models.Level == 2 {
if len(ids) != 1 {
return "", gerror.Newf("the region code is incorrectly configured, models:%+v, ids:%v", models, ids)
}
return ParseRegion(ctx, ids[0], id, 0, spilt...)
}
if models.Level == 3 {
if len(ids) != 2 {
return "", gerror.Newf("the region code is incorrectly configured, models:%+v, ids:%v", models, ids)
}
return ParseRegion(ctx, ids[0], ids[1], id, spilt...)
}
return "", gerror.New("currently, it is only supported to regional areas")
}
// ParseRegion 解析省市编码对应的地区名称
func ParseRegion(ctx context.Context, province int64, city int64, county int64, spilt ...string) (string, error) {
var (
provinceName *gvar.Var
cityName *gvar.Var
countyName *gvar.Var
err error
)
// 分隔符
sp := consts.RegionSpilt
if len(spilt) > 0 {
sp = spilt[0]
}
if province > 0 && province < 999999 {
provinceName, err = g.Model("sys_provinces").Ctx(ctx).Where("id", province).Fields("title").Value()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return "", err
}
if city > 0 {
cityName, err = g.Model("sys_provinces").Ctx(ctx).Where("id", city).Fields("title").Value()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return "", err
}
}
if county > 0 {
countyName, err = g.Model("sys_provinces").Ctx(ctx).Where("id", county).Fields("title").Value()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return "", err
}
}
} else {
return "保留地址", nil
}
if province > 0 && city > 0 && county > 0 {
return provinceName.String() + sp + cityName.String() + sp + countyName.String(), nil
}
if province > 0 && city > 0 {
return provinceName.String() + sp + cityName.String(), nil
}
return provinceName.String(), nil
}

View File

@@ -79,8 +79,9 @@ var (
func init() {
mqProducerInstanceMap = make(map[string]MqProducer)
mqConsumerInstanceMap = make(map[string]MqConsumer)
get := g.Cfg().MustGet(ctx, "queue")
get.Scan(&config)
if err := g.Cfg().MustGet(ctx, "queue").Scan(&config); err != nil {
g.Log().Infof(ctx, "queue init err:%+v", err)
}
}
// InstanceConsumer 实例化消费者
@@ -100,30 +101,34 @@ func NewProducer(groupName string) (mqClient MqProducer, err error) {
}
if groupName == "" {
return mqClient, gerror.New("mq groupName is empty.")
err = gerror.New("mq groupName is empty.")
return
}
switch config.Driver {
case "rocketmq":
if len(config.Rocketmq.Address) == 0 {
g.Log().Fatal(ctx, "queue rocketmq address is not support")
err = gerror.New("queue rocketmq address is not support")
return
}
mqClient = RegisterRocketProducerMust(config.Rocketmq.Address, groupName, config.Retry)
mqClient, err = RegisterRocketProducer(config.Rocketmq.Address, groupName, config.Retry)
case "kafka":
if len(config.Kafka.Address) == 0 {
g.Log().Fatal(ctx, "queue kafka address is not support")
err = gerror.New("queue kafka address is not support")
return
}
mqClient = RegisterKafkaProducerMust(KafkaConfig{
mqClient, err = RegisterKafkaProducer(KafkaConfig{
Brokers: config.Kafka.Address,
GroupID: groupName,
Version: config.Kafka.Version,
})
case "redis":
address := g.Cfg().MustGet(ctx, "queue.redis.address", nil)
if len(address.String()) == 0 {
g.Log().Fatal(ctx, "queue redis address is not support")
address := g.Cfg().MustGet(ctx, "queue.redis.address", nil).String()
if len(address) == 0 {
err = gerror.New("queue redis address is not support")
return
}
mqClient = RegisterRedisMqProducerMust(RedisOption{
mqClient, err = RegisterRedisMqProducer(RedisOption{
Addr: config.Redis.Address,
Passwd: config.Redis.Pass,
DBnum: config.Redis.Db,
@@ -133,14 +138,18 @@ func NewProducer(groupName string) (mqClient MqProducer, err error) {
}, groupName, config.Retry)
default:
g.Log().Fatal(ctx, "queue driver is not support")
err = gerror.New("queue driver is not support")
}
if err != nil {
return
}
mutex.Lock()
defer mutex.Unlock()
mqProducerInstanceMap[groupName] = mqClient
return mqClient, nil
return
}
// NewConsumer 初始化消费者实例
@@ -157,18 +166,21 @@ func NewConsumer(groupName string) (mqClient MqConsumer, err error) {
}
if groupName == "" {
return mqClient, gerror.New("mq groupName is empty.")
err = gerror.New("mq groupName is empty.")
return
}
switch config.Driver {
case "rocketmq":
if len(config.Rocketmq.Address) == 0 {
return nil, gerror.New("queue.rocketmq.address is empty.")
err = gerror.New("queue.rocketmq.address is empty.")
return
}
mqClient = RegisterRocketConsumerMust(config.Rocketmq.Address, groupName)
mqClient, err = RegisterRocketConsumer(config.Rocketmq.Address, groupName)
case "kafka":
if len(config.Kafka.Address) == 0 {
g.Log().Fatal(ctx, "queue kafka address is not support")
err = gerror.New("queue kafka address is not support")
return
}
clientId := "HOTGO-Consumer-" + groupName
@@ -176,7 +188,7 @@ func NewConsumer(groupName string) (mqClient MqConsumer, err error) {
clientId += "-" + randTag
}
mqClient = RegisterKafkaMqConsumerMust(KafkaConfig{
mqClient, err = RegisterKafkaMqConsumer(KafkaConfig{
Brokers: config.Kafka.Address,
GroupID: groupName,
Version: config.Kafka.Version,
@@ -184,10 +196,11 @@ func NewConsumer(groupName string) (mqClient MqConsumer, err error) {
})
case "redis":
if len(config.Redis.Address) == 0 {
g.Log().Fatal(ctx, "queue redis address is not support")
err = gerror.New("queue redis address is not support")
return
}
mqClient = RegisterRedisMqConsumerMust(RedisOption{
mqClient, err = RegisterRedisMqConsumer(RedisOption{
Addr: config.Redis.Address,
Passwd: config.Redis.Pass,
DBnum: config.Redis.Db,
@@ -196,14 +209,18 @@ func NewConsumer(groupName string) (mqClient MqConsumer, err error) {
5, 50, 5,
}, groupName)
default:
g.Log().Fatal(ctx, "queue driver is not support")
err = gerror.New("queue driver is not support")
}
if err != nil {
return
}
mutex.Lock()
defer mutex.Unlock()
mqConsumerInstanceMap[groupName] = mqClient
return mqClient, nil
return
}
// BodyString 返回消息体

View File

@@ -48,12 +48,13 @@ func (r *KafkaMq) SendByteMsg(topic string, body []byte) (mqMsg MqMsg, err error
}
if r.producerIns == nil {
return mqMsg, gerror.New("queue kafka producerIns is nil")
err = gerror.New("queue kafka producerIns is nil")
return
}
r.producerIns.Input() <- msg
ctx, cancle := context.WithTimeout(context.Background(), 5*time.Second)
defer cancle()
sendCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
select {
case info := <-r.producerIns.Successes():
@@ -68,7 +69,7 @@ func (r *KafkaMq) SendByteMsg(topic string, body []byte) (mqMsg MqMsg, err error
if nil != fail {
return mqMsg, fail.Err
}
case <-ctx.Done():
case <-sendCtx.Done():
return mqMsg, gerror.New("send mqMst timeout")
}
@@ -86,22 +87,23 @@ func (r *KafkaMq) ListenReceiveMsgDo(topic string, receiveDo func(mqMsg MqMsg))
receiveDoFun: receiveDo,
}
ctx, cancel := context.WithCancel(context.Background())
go func(ctx context.Context) {
consumerCtx, cancel := context.WithCancel(context.Background())
go func(consumerCtx context.Context) {
for {
if err := r.consumerIns.Consume(ctx, []string{topic}, &consumer); err != nil {
if err = r.consumerIns.Consume(consumerCtx, []string{topic}, &consumer); err != nil {
g.Log().Fatalf(ctx, "kafka Error from consumer, err%+v", err)
}
if ctx.Err() != nil {
g.Log().Debugf(ctx, fmt.Sprintf("kafka consoumer stop : %v", ctx.Err()))
if consumerCtx.Err() != nil {
g.Log().Debugf(ctx, fmt.Sprintf("kafka consoumer stop : %v", consumerCtx.Err()))
return
}
consumer.ready = make(chan bool)
}
}(ctx)
}(consumerCtx)
<-consumer.ready // Await till the consumer has been set up
// await till the consumer has been set up
<-consumer.ready
g.Log().Debug(ctx, "kafka consumer up and running!...")
signal.AppDefer(func() {
@@ -115,85 +117,94 @@ func (r *KafkaMq) ListenReceiveMsgDo(topic string, receiveDo func(mqMsg MqMsg))
return
}
// RegisterKafkaMqConsumerMust 注册消费者
func RegisterKafkaMqConsumerMust(connOpt KafkaConfig) (client MqConsumer) {
// RegisterKafkaMqConsumer 注册消费者
func RegisterKafkaMqConsumer(connOpt KafkaConfig) (client MqConsumer, err error) {
mqIns := &KafkaMq{}
kfkVersion, _ := sarama.ParseKafkaVersion(connOpt.Version)
kfkVersion, err := sarama.ParseKafkaVersion(connOpt.Version)
if err != nil {
return
}
if validateVersion(kfkVersion) == false {
kfkVersion = sarama.V2_4_0_0
}
brokers := connOpt.Brokers
config := sarama.NewConfig()
config.Consumer.Return.Errors = true
config.Version = kfkVersion
conf := sarama.NewConfig()
conf.Consumer.Return.Errors = true
conf.Version = kfkVersion
if connOpt.UserName != "" {
config.Net.SASL.Enable = true
config.Net.SASL.User = connOpt.UserName
config.Net.SASL.Password = connOpt.Password
conf.Net.SASL.Enable = true
conf.Net.SASL.User = connOpt.UserName
conf.Net.SASL.Password = connOpt.Password
}
// 默认按随机方式消费
config.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRange
config.Consumer.Offsets.Initial = sarama.OffsetNewest
config.Consumer.Offsets.AutoCommit.Interval = 10 * time.Millisecond
config.ClientID = connOpt.ClientId
conf.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRange
conf.Consumer.Offsets.Initial = sarama.OffsetNewest
conf.Consumer.Offsets.AutoCommit.Interval = 10 * time.Millisecond
conf.ClientID = connOpt.ClientId
consumerClient, err := sarama.NewConsumerGroup(brokers, connOpt.GroupID, config)
consumerClient, err := sarama.NewConsumerGroup(brokers, connOpt.GroupID, conf)
if err != nil {
g.Log().Fatal(ctx, err)
return
}
mqIns.consumerIns = consumerClient
return mqIns
return mqIns, err
}
// RegisterKafkaProducerMust 注册并启动生产者接口实现
func RegisterKafkaProducerMust(connOpt KafkaConfig) (client MqProducer) {
// RegisterKafkaProducer 注册并启动生产者接口实现
func RegisterKafkaProducer(connOpt KafkaConfig) (client MqProducer, err error) {
mqIns := &KafkaMq{}
connOpt.ClientId = "HOTGO-Producer"
RegisterKafkaProducer(connOpt, mqIns) //这里如果使用go程需要处理chan同步问题
return mqIns
// 这里如果使用go程需要处理chan同步问题
if err = doRegisterKafkaProducer(connOpt, mqIns); err != nil {
return nil, err
}
return mqIns, nil
}
// RegisterKafkaProducer 注册同步类型实例
func RegisterKafkaProducer(connOpt KafkaConfig, mqIns *KafkaMq) {
kfkVersion, _ := sarama.ParseKafkaVersion(connOpt.Version)
// doRegisterKafkaProducer 注册同步类型实例
func doRegisterKafkaProducer(connOpt KafkaConfig, mqIns *KafkaMq) (err error) {
kfkVersion, err := sarama.ParseKafkaVersion(connOpt.Version)
if err != nil {
return
}
if validateVersion(kfkVersion) == false {
kfkVersion = sarama.V2_4_0_0
}
brokers := connOpt.Brokers
config := sarama.NewConfig()
conf := sarama.NewConfig()
// 等待服务器所有副本都保存成功后的响应
config.Producer.RequiredAcks = sarama.WaitForAll
conf.Producer.RequiredAcks = sarama.WaitForAll
// 随机向partition发送消息
config.Producer.Partitioner = sarama.NewRandomPartitioner
conf.Producer.Partitioner = sarama.NewRandomPartitioner
// 是否等待成功和失败后的响应,只有上面的RequireAcks设置不是NoReponse这里才有用.
config.Producer.Return.Successes = true
conf.Producer.Return.Successes = true
config.Producer.Return.Errors = true
config.Producer.Compression = sarama.CompressionNone
config.ClientID = connOpt.ClientId
conf.Producer.Return.Errors = true
conf.Producer.Compression = sarama.CompressionNone
conf.ClientID = connOpt.ClientId
config.Version = kfkVersion
conf.Version = kfkVersion
if connOpt.UserName != "" {
config.Net.SASL.Enable = true
config.Net.SASL.User = connOpt.UserName
config.Net.SASL.Password = connOpt.Password
conf.Net.SASL.Enable = true
conf.Net.SASL.User = connOpt.UserName
conf.Net.SASL.Password = connOpt.Password
}
var err error
mqIns.producerIns, err = sarama.NewAsyncProducer(brokers, config)
mqIns.producerIns, err = sarama.NewAsyncProducer(brokers, conf)
if err != nil {
g.Log().Fatal(ctx, err)
return
}
signal.AppDefer(func() {
g.Log().Debug(ctx, "kafka producer AsyncClose...")
mqIns.producerIns.AsyncClose()
})
return
}
// validateVersion 验证版本是否有效

View File

@@ -1,7 +1,6 @@
package queue
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
)
@@ -9,8 +8,7 @@ import (
func Push(topic string, data interface{}) (err error) {
q, err := InstanceProducer()
if err != nil {
g.Log().Fatalf(ctx, "queue.InstanceProducer err:%+v", err)
return err
return
}
mqMsg, err := q.SendMsg(topic, gconv.String(data))
ProducerLog(ctx, topic, mqMsg.MsgId, err)

View File

@@ -146,25 +146,23 @@ func (r *RedisMq) loopReadQueue(queueName string) (mqMsgList []MqMsg) {
return mqMsgList
}
func RegisterRedisMqProducerMust(connOpt RedisOption, poolOpt PoolOption, groupName string, retry int) (client MqProducer) {
var err error
func RegisterRedisMqProducer(connOpt RedisOption, poolOpt PoolOption, groupName string, retry int) (client MqProducer, err error) {
client, err = RegisterRedisMq(connOpt, poolOpt, groupName, retry)
if err != nil {
g.Log().Fatal(ctx, "RegisterRedisMqProducerMust err:%+v", err)
err = gerror.Newf("RegisterRedisMqProducer err:%+v", err)
return
}
return client
return
}
// RegisterRedisMqConsumerMust 注册消费者
func RegisterRedisMqConsumerMust(connOpt RedisOption, poolOpt PoolOption, groupName string) (client MqConsumer) {
var err error
// RegisterRedisMqConsumer 注册消费者
func RegisterRedisMqConsumer(connOpt RedisOption, poolOpt PoolOption, groupName string) (client MqConsumer, err error) {
client, err = RegisterRedisMq(connOpt, poolOpt, groupName, 0)
if err != nil {
g.Log().Fatal(ctx, "RegisterRedisMqConsumerMust err:%+v", err)
err = gerror.Newf("RegisterRedisMqConsumer err:%+v", err)
return
}
return client
return
}
// RegisterRedisMq 注册redis实例
@@ -200,12 +198,12 @@ func registerRedis(host, pass string, dbNum int, opt PoolOption) (poolName strin
return nil, err
}
if pass != "" {
if _, err := conn.Do("AUTH", pass); err != nil {
if _, err = conn.Do("AUTH", pass); err != nil {
return nil, err
}
}
if dbNum > 0 {
if _, err := conn.Do("SELECT", dbNum); err != nil {
if _, err = conn.Do("SELECT", dbNum); err != nil {
return nil, err
}
}
@@ -270,19 +268,20 @@ func getRedis(poolName string, retry int) (db redis.Conn, put func(), err error)
if err != nil {
return nil, put, err
}
put = func() {
redisPool.Put(conn)
if err = redisPool.Put(conn); err != nil {
return
}
}
db = conn.(redis.Conn)
return db, put, nil
}
func getRandMsgId() (msgId string) {
func getRandMsgId() string {
rand.Seed(time.Now().UnixNano())
radium := rand.Intn(999) + 1
timeCode := time.Now().UnixNano()
msgId = fmt.Sprintf("%d%.4d", timeCode, radium)
return msgId
return fmt.Sprintf("%d%.4d", timeCode, radium)
}

View File

@@ -26,30 +26,27 @@ type RocketMq struct {
// rewriteLog 重写日志
func rewriteLog() {
level := g.Cfg().MustGet(ctx, "queue.rocketmq.logLevel", "debug").String()
rlog.SetLogger(&RocketMqLogger{Flag: "[rocket_mq]", LevelLog: level})
rlog.SetLogger(&RocketMqLogger{Flag: "[rocket_mq]", LevelLog: g.Cfg().MustGet(ctx, "queue.rocketmq.logLevel", "debug").String()})
}
// RegisterRocketProducerMust 注册并启动生产者接口实现
func RegisterRocketProducerMust(endPoints []string, groupName string, retry int) (client MqProducer) {
// RegisterRocketProducer 注册并启动生产者接口实现
func RegisterRocketProducer(endPoints []string, groupName string, retry int) (client MqProducer, err error) {
rewriteLog()
var err error
client, err = RegisterRocketMqProducer(endPoints, groupName, retry)
if err != nil {
panic(err)
return
}
return client
return
}
// RegisterRocketConsumerMust 注册消费者
func RegisterRocketConsumerMust(endPoints []string, groupName string) (client MqConsumer) {
// RegisterRocketConsumer 注册消费者
func RegisterRocketConsumer(endPoints []string, groupName string) (client MqConsumer, err error) {
rewriteLog()
var err error
client, err = RegisterRocketMqConsumer(endPoints, groupName)
if err != nil {
panic(err)
return
}
return client
return
}
// SendMsg 按字符串类型生产数据
@@ -90,8 +87,7 @@ func (r *RocketMq) ListenReceiveMsgDo(topic string, receiveDo func(mqMsg MqMsg))
return errors.New("RocketMq consumer not register")
}
err = r.consumerIns.Subscribe(topic, consumer.MessageSelector{}, func(ctx context.Context,
msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
err = r.consumerIns.Subscribe(topic, consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
for _, item := range msgs {
go receiveDo(MqMsg{
RunType: ReceiveMsg,

View File

@@ -9,25 +9,26 @@ package admin
import (
"context"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/encoding/gbase64"
"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/net/ghttp"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/grand"
"hotgo/api/backend/member"
"hotgo/internal/consts"
"hotgo/internal/dao"
"hotgo/internal/library/contexts"
"hotgo/internal/library/hgorm/handler"
"hotgo/internal/library/hgorm/hook"
"hotgo/internal/library/jwt"
"hotgo/internal/library/location"
"hotgo/internal/model"
"hotgo/internal/model/do"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/adminin"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"hotgo/utility/encrypt"
"hotgo/utility/simple"
"hotgo/utility/tree"
"hotgo/utility/validate"
)
@@ -42,7 +43,148 @@ func init() {
service.RegisterAdminMember(NewAdminMember())
}
// UpdateProfile 更新会员资料
// UpdateCash 修改提现信息
func (s *sAdminMember) UpdateCash(ctx context.Context, in adminin.MemberUpdateCashInp) (err error) {
memberId := contexts.Get(ctx).User.Id
if memberId <= 0 {
err = gerror.New("获取用户信息失败!")
return
}
var memberInfo entity.AdminMember
if err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Scan(&memberInfo); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return
}
if gmd5.MustEncryptString(in.Password+memberInfo.Salt) != memberInfo.PasswordHash {
err = gerror.New("登录密码不正确")
return
}
_, err = dao.AdminMember.Ctx(ctx).
Where("id", memberId).
Data(g.Map{
"cash": adminin.MemberCash{
Name: in.Name,
Account: in.Account,
PayeeCode: in.PayeeCode,
},
}).
Update()
return
}
// UpdateEmail 换绑邮箱
func (s *sAdminMember) UpdateEmail(ctx context.Context, in adminin.MemberUpdateEmailInp) (err error) {
memberId := contexts.Get(ctx).User.Id
if memberId <= 0 {
err = gerror.New("获取用户信息失败!")
return err
}
var memberInfo *entity.AdminMember
if err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Scan(&memberInfo); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
if memberInfo == nil {
err = gerror.New("用户信息不存在")
return err
}
if memberInfo.Email == in.Email {
err = gerror.New("新旧邮箱不能一样")
return
}
if !validate.IsEmail(in.Email) {
err = gerror.New("邮箱地址不正确")
return
}
// 存在原绑定号码,需要进行验证
if memberInfo.Email != "" {
err = service.SysEmsLog().VerifyCode(ctx, sysin.VerifyEmsCodeInp{
Event: consts.EmsTemplateBind,
Email: memberInfo.Email,
Code: in.Code,
})
if err != nil {
return err
}
}
update := g.Map{
dao.AdminMember.Columns().Email: in.Email,
}
_, err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Data(update).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return
}
// UpdateMobile 换绑手机号
func (s *sAdminMember) UpdateMobile(ctx context.Context, in adminin.MemberUpdateMobileInp) (err error) {
memberId := contexts.Get(ctx).User.Id
if memberId <= 0 {
err = gerror.New("获取用户信息失败!")
return err
}
var memberInfo *entity.AdminMember
if err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Scan(&memberInfo); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
if memberInfo == nil {
err = gerror.New("用户信息不存在")
return err
}
if memberInfo.Mobile == in.Mobile {
err = gerror.New("新旧手机号不能一样")
return
}
if !validate.IsMobile(in.Mobile) {
err = gerror.New("手机号码不正确")
return
}
// 存在原绑定号码,需要进行验证
if memberInfo.Mobile != "" {
err = service.SysSmsLog().VerifyCode(ctx, sysin.VerifyCodeInp{
Event: consts.SmsTemplateBind,
Mobile: memberInfo.Mobile,
Code: in.Code,
})
if err != nil {
return err
}
}
update := g.Map{
dao.AdminMember.Columns().Mobile: in.Mobile,
}
_, err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Data(update).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return
}
// UpdateProfile 更新用户资料
func (s *sAdminMember) UpdateProfile(ctx context.Context, in adminin.MemberUpdateProfileInp) (err error) {
memberId := contexts.Get(ctx).User.Id
if memberId <= 0 {
@@ -50,21 +192,28 @@ func (s *sAdminMember) UpdateProfile(ctx context.Context, in adminin.MemberUpdat
return err
}
var memberInfo entity.AdminMember
var memberInfo *entity.AdminMember
if err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Scan(&memberInfo); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
_, err = dao.AdminMember.Ctx(ctx).
Where("id", memberId).
Data(g.Map{
"mobile": in.Mobile,
"email": in.Email,
"real_name": in.Realname,
}).
Update()
if memberInfo == nil {
err = gerror.New("用户信息不存在")
return err
}
update := g.Map{
dao.AdminMember.Columns().Avatar: in.Avatar,
dao.AdminMember.Columns().RealName: in.RealName,
dao.AdminMember.Columns().Qq: in.Qq,
dao.AdminMember.Columns().Birthday: in.Birthday,
dao.AdminMember.Columns().Sex: in.Sex,
dao.AdminMember.Columns().CityId: in.CityId,
dao.AdminMember.Columns().Address: in.Address,
}
_, err = dao.AdminMember.Ctx(ctx).Where("id", memberId).Data(update).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
@@ -104,19 +253,25 @@ func (s *sAdminMember) UpdatePwd(ctx context.Context, in adminin.MemberUpdatePwd
// ResetPwd 重置密码
func (s *sAdminMember) ResetPwd(ctx context.Context, in adminin.MemberResetPwdInp) (err error) {
var (
memberInfo entity.AdminMember
memberInfo *entity.AdminMember
memberId = contexts.GetUserId(ctx)
)
if err = dao.AdminMember.Ctx(ctx).Where("id", in.Id).Scan(&memberInfo); err != nil {
if err = s.FilterAuthModel(ctx, memberId).Where("id", in.Id).Scan(&memberInfo); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
if memberInfo == nil {
err = gerror.New("用户信息不存在")
return err
}
if memberInfo.Pid != memberId && !s.VerifySuperId(ctx, memberId) {
err = gerror.New("操作非法")
return err
}
_, err = dao.AdminMember.Ctx(ctx).
_, err = s.FilterAuthModel(ctx, memberId).
Where("id", in.Id).
Data(g.Map{
"password_hash": gmd5.MustEncryptString(in.Password + memberInfo.Salt),
@@ -192,7 +347,7 @@ func (s *sAdminMember) Delete(ctx context.Context, in adminin.MemberDeleteInp) e
return gerror.New("获取用户信息失败!")
}
_, err := dao.AdminMember.Ctx(ctx).Where("id", in.Id).Where("pid", memberId).Delete()
_, err := s.FilterAuthModel(ctx, memberId).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
@@ -246,11 +401,7 @@ func (s *sAdminMember) Edit(ctx context.Context, in adminin.MemberEditInp) (err
}
// 权限验证
var mm = dao.AdminMember.Ctx(ctx).Where("id", in.Id)
if !s.VerifySuperId(ctx, opMemberId) {
mm = mm.Where("pid", opMemberId)
}
var mm = s.FilterAuthModel(ctx, opMemberId).Where("id", in.Id)
_, err = mm.Data(in).Update()
if err != nil {
return gerror.Wrap(err, consts.ErrorORM)
@@ -307,7 +458,7 @@ func (s *sAdminMember) MaxSort(ctx context.Context, in adminin.MemberMaxSortInp)
// View 获取信息
func (s *sAdminMember) View(ctx context.Context, in adminin.MemberViewInp) (res *adminin.MemberViewModel, err error) {
if err = dao.AdminMember.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
if err = s.FilterAuthModel(ctx, contexts.GetUserId(ctx)).Hook(hook.MemberInfo).Where("id", in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
@@ -317,10 +468,9 @@ func (s *sAdminMember) View(ctx context.Context, in adminin.MemberViewInp) (res
// List 获取列表
func (s *sAdminMember) List(ctx context.Context, in adminin.MemberListInp) (list []*adminin.MemberListModel, totalCount int, err error) {
g.Log().Printf(ctx, "in:%#v", in)
mod := dao.AdminMember.Ctx(ctx)
if in.Realname != "" {
mod = mod.WhereLike("real_name", "%"+in.Realname+"%")
mod := s.FilterAuthModel(ctx, contexts.GetUserId(ctx))
if in.RealName != "" {
mod = mod.WhereLike("real_name", "%"+in.RealName+"%")
}
if in.Username != "" {
mod = mod.WhereLike("username", "%"+in.Username+"%")
@@ -349,32 +499,11 @@ func (s *sAdminMember) List(ctx context.Context, in adminin.MemberListInp) (list
return list, totalCount, nil
}
if err = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil {
if err = mod.Hook(hook.MemberInfo).Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil {
return nil, 0, gerror.Wrap(err, consts.ErrorORM)
}
// 重写树入参
for i := 0; i < len(list); i++ {
// 部门
deptName, err := dao.AdminDept.Ctx(ctx).
Fields("name").
Where("id", list[i].DeptId).
Value()
if err != nil {
return nil, 0, gerror.Wrap(err, consts.ErrorORM)
}
list[i].DeptName = deptName.String()
// 角色
roleName, err := dao.AdminRole.Ctx(ctx).
Fields("name").
Where("id", list[i].RoleId).
Value()
if err != nil {
return nil, 0, gerror.Wrap(err, consts.ErrorORM)
}
list[i].RoleName = roleName.String()
// 岗位
posts, err := dao.AdminMemberPost.Ctx(ctx).
Fields("post_id").
@@ -414,27 +543,43 @@ func (s *sAdminMember) genTree(ctx context.Context, pid int64) (level int, newTr
}
// LoginMemberInfo 获取登录用户信息
func (s *sAdminMember) LoginMemberInfo(ctx context.Context, req *member.InfoReq) (res *adminin.MemberLoginModel, err error) {
identity := contexts.Get(ctx).User
if identity == nil {
func (s *sAdminMember) LoginMemberInfo(ctx context.Context) (res *adminin.LoginMemberInfoModel, err error) {
var memberId = contexts.GetUserId(ctx)
if memberId <= 0 {
err = gerror.New("用户身份异常,请重新登录!")
return
}
permissions, err := service.AdminMenu().LoginPermissions(ctx, identity.Id)
err = dao.AdminMember.Ctx(ctx).
Hook(hook.MemberInfo).
Where("id", memberId).
Scan(&res)
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return
}
res = &adminin.MemberLoginModel{
UserId: identity.Id,
Username: identity.Username,
RealName: identity.RealName,
Avatar: identity.Avatar,
Permissions: permissions,
Token: jwt.GetAuthorization(ghttp.RequestFromCtx(ctx)),
if res == nil {
err = gerror.New("用户不存在!")
return
}
// 细粒度权限
permissions, err := service.AdminMenu().LoginPermissions(ctx, memberId)
if err != nil {
return
}
res.Permissions = permissions
// 登录统计
stat, err := s.MemberLoginStat(ctx, adminin.MemberLoginStatInp{MemberId: memberId})
if err != nil {
return nil, err
}
res.MemberLoginStatModel = stat
res.Mobile = gstr.HideStr(res.Mobile, 40, `*`)
res.Email = gstr.HideStr(res.Email, 40, `*`)
return
}
@@ -443,11 +588,7 @@ func (s *sAdminMember) Login(ctx context.Context, in adminin.MemberLoginInp) (re
var (
roleInfo *entity.AdminRole
memberInfo *entity.AdminMember
identity *model.Identity
timestamp = gtime.Timestamp()
expires = g.Cfg().MustGet(ctx, "jwt.expires", 1).Int64()
exp = gconv.Int64(timestamp) + expires
lastIp = location.GetClientIp(ghttp.RequestFromCtx(ctx))
)
err = dao.AdminMember.Ctx(ctx).Where("username", in.Username).Scan(&memberInfo)
@@ -465,18 +606,13 @@ func (s *sAdminMember) Login(ctx context.Context, in adminin.MemberLoginInp) (re
return
}
// 解密密码
password, err := gbase64.Decode([]byte(in.Password))
err = simple.CheckPassword(in.Password, memberInfo.Salt, memberInfo.PasswordHash)
if err != nil {
return nil, err
}
password, err = encrypt.AesECBDecrypt(password, consts.RequestEncryptKey)
if err != nil {
return nil, err
return
}
if memberInfo.PasswordHash != gmd5.MustEncryptString(string(password)+memberInfo.Salt) {
err = gerror.New("用户密码不正确")
if memberInfo.Status != consts.StatusEnabled {
err = gerror.New("账号已被禁用")
return
}
@@ -494,27 +630,24 @@ func (s *sAdminMember) Login(ctx context.Context, in adminin.MemberLoginInp) (re
}
if roleInfo.Status != consts.StatusEnabled {
err = gerror.New("角色权限已被禁用")
err = gerror.New("角色已被禁用")
return
}
identity = &model.Identity{
Id: memberInfo.Id,
Pid: memberInfo.Pid,
DeptId: memberInfo.DeptId,
RoleId: roleInfo.Id,
RoleKey: roleInfo.Key,
Username: memberInfo.Username,
RealName: memberInfo.RealName,
Avatar: memberInfo.Avatar,
Email: memberInfo.Email,
Mobile: memberInfo.Mobile,
VisitCount: memberInfo.VisitCount,
LastTime: memberInfo.LastTime,
LastIp: lastIp,
Exp: exp,
Expires: expires,
App: consts.AppAdmin,
identity := &model.Identity{
Id: memberInfo.Id,
Pid: memberInfo.Pid,
DeptId: memberInfo.DeptId,
RoleId: roleInfo.Id,
RoleKey: roleInfo.Key,
Username: memberInfo.Username,
RealName: memberInfo.RealName,
Avatar: memberInfo.Avatar,
Email: memberInfo.Email,
Mobile: memberInfo.Mobile,
Exp: gtime.Timestamp() + expires,
Expires: expires,
App: consts.AppAdmin,
}
token, err := jwt.GenerateLoginToken(ctx, identity, false)
@@ -524,14 +657,10 @@ func (s *sAdminMember) Login(ctx context.Context, in adminin.MemberLoginInp) (re
}
// 更新登录信息
_, err = dao.AdminMember.Ctx(ctx).Data(do.AdminMember{
AuthKey: gmd5.MustEncryptString(token),
VisitCount: memberInfo.VisitCount + 1,
LastTime: timestamp,
LastIp: lastIp,
}).Where(do.AdminMember{
Id: memberInfo.Id,
}).Update()
_, err = dao.AdminMember.Ctx(ctx).
Data(do.AdminMember{AuthKey: gmd5.MustEncryptString(token)}).
Where(do.AdminMember{Id: memberInfo.Id}).
Update()
if err != nil {
err = gerror.New(err.Error())
@@ -539,17 +668,15 @@ func (s *sAdminMember) Login(ctx context.Context, in adminin.MemberLoginInp) (re
}
res = &adminin.MemberLoginModel{
UserId: identity.Id,
Username: identity.Username,
RealName: identity.RealName,
Avatar: identity.Avatar,
Token: token,
Id: identity.Id,
Token: token,
Expires: expires,
}
return res, nil
}
// RoleMemberList 获取角色下的会员列表
// RoleMemberList 获取角色下的用户列表
func (s *sAdminMember) RoleMemberList(ctx context.Context, in adminin.RoleMemberListInp) (list []*adminin.MemberListModel, totalCount int, err error) {
mod := dao.AdminMember.Ctx(ctx)
if in.Role > 0 {
@@ -594,7 +721,7 @@ func (s *sAdminMember) Status(ctx context.Context, in adminin.MemberStatusInp) (
// 修改
in.UpdatedAt = gtime.Now()
_, err = dao.AdminMember.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
_, err = s.FilterAuthModel(ctx, contexts.GetUserId(ctx)).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
@@ -603,7 +730,7 @@ func (s *sAdminMember) Status(ctx context.Context, in adminin.MemberStatusInp) (
return nil
}
// GetIdByCode 通过邀请码获取会员ID
// GetIdByCode 通过邀请码获取用户ID
func (s *sAdminMember) GetIdByCode(ctx context.Context, in adminin.GetIdByCodeInp) (res *adminin.GetIdByCodeModel, err error) {
if err = dao.AdminMember.Ctx(ctx).
Fields("invite_code").
@@ -615,3 +742,53 @@ func (s *sAdminMember) GetIdByCode(ctx context.Context, in adminin.GetIdByCodeIn
return res, nil
}
// Select 获取可选的用户选项
func (s *sAdminMember) Select(ctx context.Context, in adminin.MemberSelectInp) (res []*adminin.MemberSelectModel, err error) {
err = dao.AdminMember.Ctx(ctx).
Fields("id as value,real_name as label,username,avatar").
Handler(handler.FilterAuthWithField("id")).
Scan(&res)
if err != nil {
return nil, gerror.Wrap(err, consts.ErrorORM)
}
return res, nil
}
func (s *sAdminMember) FilterAuthModel(ctx context.Context, memberId int64) *gdb.Model {
m := dao.AdminMember.Ctx(ctx)
if !s.VerifySuperId(ctx, memberId) {
m = m.Where("id <> ?", memberId)
}
return m.Handler(handler.FilterAuthWithField("id"))
}
// MemberLoginStat 用户登录统计
func (s *sAdminMember) MemberLoginStat(ctx context.Context, in adminin.MemberLoginStatInp) (res *adminin.MemberLoginStatModel, err error) {
var models *entity.SysLoginLog
err = dao.SysLoginLog.Ctx(ctx).
Fields("login_at,login_ip").
Where("member_id", in.MemberId).
Where("status", consts.StatusEnabled).
Scan(&models)
if err != nil {
return nil, err
}
res = new(adminin.MemberLoginStatModel)
if models == nil {
return
}
res.LastLoginAt = models.LoginAt
res.LastLoginIp = models.LoginIp
res.LoginCount, err = dao.SysLoginLog.Ctx(ctx).
Where("member_id", in.MemberId).
Where("status", consts.StatusEnabled).Count()
if err != nil {
return nil, err
}
return
}

View File

@@ -39,7 +39,7 @@ func (s *sAdminMemberPost) UpdatePostIds(ctx context.Context, member_id int64, p
PostId: post_ids[i],
})
if err != nil {
err = gerror.Wrap(err, "插入会员岗位失败")
err = gerror.Wrap(err, "插入用户岗位失败")
return err
}
}
@@ -47,7 +47,7 @@ func (s *sAdminMemberPost) UpdatePostIds(ctx context.Context, member_id int64, p
return nil
}
// GetMemberByIds 获取指定会员的岗位ids
// GetMemberByIds 获取指定用户的岗位ids
func (s *sAdminMemberPost) GetMemberByIds(ctx context.Context, member_id int64) (post_ids []int64, err error) {
var list []*entity.AdminMemberPost
err = dao.AdminMemberPost.Ctx(ctx).

View File

@@ -23,6 +23,7 @@ import (
"hotgo/internal/model/entity"
"hotgo/internal/model/input/adminin"
"hotgo/internal/service"
"hotgo/utility/convert"
"hotgo/utility/tree"
)
@@ -369,13 +370,8 @@ func (s *sAdminMenu) GetMenuList(ctx context.Context, memberId int64) (lists rol
return
}
// LoginPermissions 获取登录成功后的细权限
func (s *sAdminMenu) LoginPermissions(ctx context.Context, memberId int64) (lists []*adminin.MemberLoginPermissions, err error) {
// 空跑
lists = append(lists, &adminin.MemberLoginPermissions{
Value: "value",
})
// LoginPermissions 获取登录成功后的细粒度权限
func (s *sAdminMenu) LoginPermissions(ctx context.Context, memberId int64) (lists adminin.MemberLoginPermissions, err error) {
type Permissions struct {
Permissions string `json:"permissions"`
}
@@ -401,17 +397,18 @@ func (s *sAdminMenu) LoginPermissions(ctx context.Context, memberId int64) (list
return lists, err
}
// 无权限
if len(allPermissions) == 0 {
lists = append(lists, "value")
return
}
for _, v := range allPermissions {
for _, p := range gstr.Explode(`,`, v.Permissions) {
lists = append(lists, &adminin.MemberLoginPermissions{
Value: p,
})
lists = append(lists, p)
}
}
lists = convert.UniqueSliceString(lists)
return
}

View File

@@ -8,17 +8,22 @@ package admin
import (
"context"
"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/os/gtime"
"github.com/gogf/gf/v2/util/gconv"
"hotgo/internal/consts"
"hotgo/internal/dao"
"hotgo/internal/library/contexts"
"hotgo/internal/library/hgorm/handler"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/adminin"
"hotgo/internal/model/input/form"
"hotgo/internal/service"
"hotgo/internal/websocket"
"hotgo/utility/charset"
"hotgo/utility/simple"
"hotgo/utility/validate"
"strings"
)
type sAdminNotice struct{}
@@ -31,9 +36,14 @@ func init() {
service.RegisterAdminNotice(NewAdminNotice())
}
// Model Orm模型
func (s *sAdminNotice) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
return handler.Model(dao.AdminNotice.Ctx(ctx), option...)
}
// Delete 删除
func (s *sAdminNotice) Delete(ctx context.Context, in adminin.NoticeDeleteInp) error {
_, err := dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Delete()
_, err := s.Model(ctx).Where("id", in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
@@ -44,44 +54,64 @@ func (s *sAdminNotice) Delete(ctx context.Context, in adminin.NoticeDeleteInp) e
// Edit 修改/新增
func (s *sAdminNotice) Edit(ctx context.Context, in adminin.NoticeEditInp) (err error) {
var member = contexts.Get(ctx).User
if member == nil {
err = gerror.New("获取用户信息失败!")
return
}
if in.Title == "" {
err = gerror.New("标题不能为空")
return err
return
}
if in.Type == consts.NoticeTypeLetter && len(in.Receiver) == 0 {
err = gerror.New("私信类型必须选择接收人")
return
}
// 检查选项接收人是否合法
if in.Type == consts.NoticeTypeLetter {
count, _ := dao.AdminMember.Ctx(ctx).Handler(handler.FilterAuthWithField("id")).WhereIn("id", in.Receiver).Count()
if count != len(in.Receiver) {
err = gerror.New("接收人不合法")
return
}
in.SenderAvatar = member.Avatar
}
// 修改
in.UpdatedAt = gtime.Now()
if in.Id > 0 {
_, err = dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Data(in).Update()
in.UpdatedBy = member.Id
_, err = s.Model(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
}
// 新增
in.CreatedBy = member.Id
in.CreatedAt = gtime.Now()
_, err = dao.AdminNotice.Ctx(ctx).Data(in).Insert()
in.Id, err = s.Model(ctx, &handler.Option{FilterAuth: false}).Data(in).InsertAndGetId()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
// 推送通知
memberIds := charset.SplitMemberIds(in.Receiver, ",")
response := &websocket.WResponse{
Event: "notice",
Data: in,
}
simple.SafeGo(ctx, func(ctx context.Context) {
if len(memberIds) == 0 {
websocket.SendToAll(response)
} else {
for _, memberId := range memberIds {
websocket.SendToUser(memberId, response)
if in.Type == consts.NoticeTypeLetter {
for _, receiverId := range in.Receiver {
websocket.SendToUser(receiverId, response)
}
} else {
websocket.SendToAll(response)
}
})
@@ -106,8 +136,7 @@ func (s *sAdminNotice) Status(ctx context.Context, in adminin.NoticeStatusInp) (
}
// 修改
in.UpdatedAt = gtime.Now()
_, err = dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
_, err = s.Model(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
@@ -119,19 +148,17 @@ func (s *sAdminNotice) Status(ctx context.Context, in adminin.NoticeStatusInp) (
// MaxSort 最大排序
func (s *sAdminNotice) MaxSort(ctx context.Context, in adminin.NoticeMaxSortInp) (*adminin.NoticeMaxSortModel, error) {
var res adminin.NoticeMaxSortModel
if in.Id > 0 {
if err := dao.AdminNotice.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).Order("sort desc").Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
res.Sort = res.Sort + 10
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return &res, nil
}
// View 获取指定字典类型信息
func (s *sAdminNotice) View(ctx context.Context, in adminin.NoticeViewInp) (res *adminin.NoticeViewModel, err error) {
if err = dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Scan(&res); err != nil {
if err = s.Model(ctx).Where("id", in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
@@ -141,19 +168,26 @@ func (s *sAdminNotice) View(ctx context.Context, in adminin.NoticeViewInp) (res
// List 获取列表
func (s *sAdminNotice) List(ctx context.Context, in adminin.NoticeListInp) (list []*adminin.NoticeListModel, totalCount int, err error) {
mod := dao.AdminNotice.Ctx(ctx)
var memberId = contexts.GetUserId(ctx)
if memberId <= 0 {
err = gerror.New("获取用户信息失败!")
return
}
mod := s.Model(ctx)
// 访问路径
if in.Title != "" {
mod = mod.WhereLike("title", "%"+in.Title+"%")
}
// 模块
if in.Content != "" {
mod = mod.WhereLike("content", "%"+in.Content+"%")
}
// 请求方式
if in.Type > 0 {
mod = mod.Where("type", in.Type)
}
if in.Status > 0 {
mod = mod.Where("status", in.Status)
}
@@ -173,8 +207,291 @@ func (s *sAdminNotice) List(ctx context.Context, in adminin.NoticeListInp) (list
return list, totalCount, err
}
for k, v := range list {
list[k].ReceiveNum = len(strings.Split(v.Reader, ","))
for _, v := range list {
// 接收人头像组
if v.Type == consts.NoticeTypeLetter {
err = dao.AdminMember.Ctx(ctx).
Fields("real_name as name,avatar as src").
WhereIn("id", v.Receiver.Var().Int64s()).
Scan(&v.ReceiverGroup)
if err != nil {
return
}
}
if v.ReceiverGroup == nil || len(v.ReceiverGroup) == 0 {
v.ReceiverGroup = make([]form.AvatarGroup, 0)
}
// 阅读次数
v.ReadCount, err = dao.AdminNoticeRead.Ctx(ctx).Where("notice_id", v.Id).Sum("clicks")
if err != nil {
return
}
}
return list, totalCount, err
}
// PullMessages 拉取未读消息列表
func (s *sAdminNotice) PullMessages(ctx context.Context, in adminin.PullMessagesInp) (res *adminin.PullMessagesModel, err error) {
var memberId = contexts.GetUserId(ctx)
if memberId <= 0 {
err = gerror.New("获取用户信息失败!")
return
}
messageIds, err := s.messageIds(ctx, memberId)
if err != nil {
return
}
res = new(adminin.PullMessagesModel)
unread, err := s.UnreadCount(ctx, adminin.NoticeUnreadCountInp{MemberId: memberId, MessageIds: messageIds})
if err != nil {
return
}
if unread != nil {
res.NoticeUnreadCountModel = unread
}
if err = s.Model(ctx).WhereIn("id", messageIds).Limit(in.Limit).Order("id desc").Scan(&res.List); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return
}
for _, v := range res.List {
count, _ := dao.AdminNoticeRead.Ctx(ctx).Where("notice_id", v.Id).Where("member_id", memberId).Count()
if count > 0 {
v.IsRead = true
}
if v.Type == consts.NoticeTypeLetter {
val, err := dao.AdminMember.Ctx(ctx).Fields("avatar").Where("id", v.CreatedBy).Value()
if err == nil {
v.SenderAvatar = val.String()
}
}
}
return
}
// UnreadCount 获取所有类型消息的未读数量
func (s *sAdminNotice) UnreadCount(ctx context.Context, in adminin.NoticeUnreadCountInp) (res *adminin.NoticeUnreadCountModel, err error) {
if in.MemberId <= 0 {
if in.MemberId = contexts.GetUserId(ctx); in.MemberId <= 0 {
err = gerror.New("获取用户信息失败!")
return
}
}
if len(in.MessageIds) == 0 {
in.MessageIds, err = s.messageIds(ctx, in.MemberId)
if err != nil {
return
}
if len(in.MessageIds) == 0 {
return
}
}
stat := func(t int) (count int) {
all, err := dao.AdminNotice.Ctx(ctx).As("nr").
Where("type =? and id IN(?)", t, in.MessageIds).
Count()
if err != nil {
g.Log().Infof(ctx, "UnreadCount stat err:%+v", err)
return
}
if all == 0 {
return
}
read, err := dao.AdminNoticeRead.Ctx(ctx).As("nr").
LeftJoin("admin_notice n", "nr.notice_id=n.id").
Where("n.type = ? and n.id IN(?)", t, in.MessageIds).
Where("nr.member_id", in.MemberId).
Count()
if err != nil {
g.Log().Infof(ctx, "UnreadCount stat2 err:%+v", err)
return
}
count = all - read
return
}
res = new(adminin.NoticeUnreadCountModel)
res.NotifyCount = stat(consts.NoticeTypeNotify)
res.NoticeCount = stat(consts.NoticeTypeNotice)
res.LetterCount = stat(consts.NoticeTypeLetter)
return
}
// messageIds 获取我的消息所有的消息ID
func (s *sAdminNotice) messageIds(ctx context.Context, memberId int64) (ids []int64, err error) {
mod := s.Model(ctx, &handler.Option{FilterAuth: false}).
Fields("id").
Where("status", consts.StatusEnabled).
Where("(`type` IN(?) OR (`type` = ? and JSON_CONTAINS(`receiver`,'"+gconv.String(memberId)+"')))",
[]int{consts.NoticeTypeNotify, consts.NoticeTypeNotice}, consts.NoticeTypeLetter,
)
array, err := mod.Array()
if err != nil {
return nil, err
}
for _, v := range array {
ids = append(ids, v.Int64())
}
return
}
// UpRead 更新已读
func (s *sAdminNotice) UpRead(ctx context.Context, in adminin.NoticeUpReadInp) (err error) {
var (
data *entity.AdminNotice
memberId = contexts.GetUserId(ctx)
)
if memberId <= 0 {
err = gerror.New("获取用户信息失败!")
return
}
if err = dao.AdminNotice.Ctx(ctx).Where("id", in.Id).Scan(&data); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
if data == nil {
return gerror.New("公告不存在")
}
return s.updatedReadClicks(ctx, in.Id, memberId)
}
// ReadAll 已读全部
func (s *sAdminNotice) ReadAll(ctx context.Context, in adminin.NoticeReadAllInp) (err error) {
var memberId = contexts.GetUserId(ctx)
if memberId <= 0 {
err = gerror.New("获取用户信息失败!")
return
}
allMessageIds, err := s.messageIds(ctx, memberId)
if err != nil {
return
}
if len(allMessageIds) == 0 {
return
}
array, err := dao.AdminNotice.Ctx(ctx).
Fields("id").
Where("type = ? and id IN(?)", in.Type, allMessageIds).
Array()
if err != nil {
return
}
var messageIds []int64
for _, v := range array {
messageIds = append(messageIds, v.Int64())
}
array, err = dao.AdminNoticeRead.Ctx(ctx).As("nr").
Fields("nr.notice_id").
LeftJoin("admin_notice n", "nr.notice_id=n.id").
Where("n.type = ? and n.id IN(?)", in.Type, messageIds).
Where("nr.member_id", memberId).
Array()
if err != nil {
return
}
var readIds []int64
for _, v := range array {
readIds = append(readIds, v.Int64())
}
for _, messageId := range messageIds {
if !validate.InSliceInt64(readIds, messageId) {
if err = s.updatedReadClicks(ctx, messageId, memberId); err != nil {
return
}
}
}
return
}
// updatedReadClicks 更新公告已读次数
func (s *sAdminNotice) updatedReadClicks(ctx context.Context, noticeId, memberId int64) (err error) {
var (
models *entity.AdminNoticeRead
)
err = dao.AdminNoticeRead.Ctx(ctx).
Where(dao.AdminNoticeRead.Columns().NoticeId, noticeId).
Where(dao.AdminNoticeRead.Columns().MemberId, memberId).
Scan(&models)
if err != nil {
return
}
if models == nil {
_, err = dao.AdminNoticeRead.Ctx(ctx).Data(entity.AdminNoticeRead{NoticeId: noticeId, MemberId: memberId}).Insert()
return
}
_, err = dao.AdminNoticeRead.Ctx(ctx).Where(dao.AdminNoticeRead.Columns().Id, models.Id).Increment("clicks", 1)
return
}
// MessageList 我的消息列表
func (s *sAdminNotice) MessageList(ctx context.Context, in adminin.NoticeMessageListInp) (list []*adminin.NoticeMessageListModel, totalCount int, err error) {
var memberId = contexts.GetUserId(ctx)
if memberId <= 0 {
err = gerror.New("获取用户信息失败!")
return
}
allMessageIds, err := s.messageIds(ctx, memberId)
if err != nil {
return
}
if len(allMessageIds) == 0 {
return
}
mod := s.Model(ctx, &handler.Option{FilterAuth: false}).WhereIn("id", allMessageIds).Where("type", in.Type)
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 = mod.Page(in.Page, in.PerPage).Order("id desc").Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
}
for _, v := range list {
count, _ := dao.AdminNoticeRead.Ctx(ctx).Where("notice_id", v.Id).Where("member_id", memberId).Count()
if count > 0 {
v.IsRead = true
}
if v.Type == consts.NoticeTypeLetter {
val, err := dao.AdminMember.Ctx(ctx).Fields("avatar").Where("id", v.CreatedBy).Value()
if err == nil {
v.SenderAvatar = val.String()
}
}
}
return list, totalCount, err
}

View File

@@ -27,6 +27,7 @@ import (
"hotgo/utility/convert"
"hotgo/utility/tree"
"sort"
"strconv"
)
type sAdminRole struct{}
@@ -60,7 +61,7 @@ func (s *sAdminRole) Verify(ctx context.Context, path, method string) bool {
}
ok, err := casbin.Enforcer.Enforce(user.RoleKey, path, method)
if err != nil {
g.Log().Warningf(ctx, "admin Verify Enforce err:%v", err)
g.Log().Warningf(ctx, "admin Verify Enforce err:%+v", err)
return false
}
@@ -86,6 +87,12 @@ func (s *sAdminRole) List(ctx context.Context, in adminin.RoleListInp) (list []g
return list, totalCount, err
}
for _, v := range models {
v.Label = v.Name
v.Value = v.Id
v.Key = strconv.FormatInt(v.Id, 10)
}
return tree.GenTree(gconv.SliceMap(models)), totalCount, err
}
@@ -104,7 +111,7 @@ func (s *sAdminRole) GetName(ctx context.Context, RoleId int64) (name string, er
return roleName.String(), nil
}
// GetMemberList 获取指定会员的岗位列表
// GetMemberList 获取指定用户的岗位列表
func (s *sAdminRole) GetMemberList(ctx context.Context, RoleId int64) (list []*adminin.RoleListModel, err error) {
err = dao.AdminRole.Ctx(ctx).
Where("id", RoleId).

View File

@@ -18,6 +18,7 @@ import (
"hotgo/internal/dao"
"hotgo/internal/library/contexts"
"hotgo/internal/library/hgorm"
"hotgo/internal/library/hgorm/handler"
"hotgo/internal/model/input/adminin"
"hotgo/internal/model/input/form"
"hotgo/internal/service"
@@ -37,13 +38,13 @@ func init() {
}
// Model Orm模型
func (s *sAdminTest) Model(ctx context.Context) *gdb.Model {
return dao.Test.Ctx(ctx)
func (s *sAdminTest) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
return handler.Model(dao.Test.Ctx(ctx), option...)
}
// List 获取列表
func (s *sAdminTest) List(ctx context.Context, in adminin.TestListInp) (list []*adminin.TestListModel, totalCount int, err error) {
mod := dao.Test.Ctx(ctx)
mod := s.Model(ctx)
if in.Title != "" {
mod = mod.WhereLike(dao.Test.Columns().Title, "%"+in.Title+"%")
@@ -98,11 +99,11 @@ func (s *sAdminTest) List(ctx context.Context, in adminin.TestListInp) (list []*
totalCount, err = mod.Clone().Count(1)
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
if totalCount == 0 {
return list, totalCount, nil
return
}
////关联表select
@@ -113,28 +114,27 @@ func (s *sAdminTest) List(ctx context.Context, in adminin.TestListInp) (list []*
fields, err := hgorm.GenSelect(ctx, adminin.TestListModel{}, dao.Test)
if err != nil {
return nil, 0, err
return
}
if err = mod.Fields(fields).Handler(hgorm.HandlerFilterAuth, hgorm.HandlerForceCache).Page(in.Page, in.PerPage).OrderAsc(dao.Test.Columns().Sort).OrderDesc(dao.Test.Columns().Id).Scan(&list); err != nil {
if err = mod.Fields(fields).Handler(handler.FilterAuth, handler.ForceCache).Page(in.Page, in.PerPage).OrderAsc(dao.Test.Columns().Sort).OrderDesc(dao.Test.Columns().Id).Scan(&list); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
return list, totalCount, err
return
}
// Export 导出
func (s *sAdminTest) Export(ctx context.Context, in adminin.TestListInp) (err error) {
list, totalCount, err := s.List(ctx, in)
if err != nil {
return err
return
}
// 字段的排序是依据tags的字段顺序如果你不想使用默认的排序方式可以直接定义 tags = []string{"字段名称", "字段名称2", ...}
tags, err := convert.GetEntityDescTags(adminin.TestExportModel{})
if err != nil {
return err
return
}
var (
@@ -143,10 +143,10 @@ func (s *sAdminTest) Export(ctx context.Context, in adminin.TestListInp) (err er
exports []adminin.TestExportModel
)
err = gconv.Scan(list, &exports)
if err != nil {
return err
if err = gconv.Scan(list, &exports); err != nil {
return
}
if err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName); err != nil {
return
}
@@ -156,70 +156,51 @@ func (s *sAdminTest) Export(ctx context.Context, in adminin.TestListInp) (err er
// Edit 修改/新增
func (s *sAdminTest) Edit(ctx context.Context, in adminin.TestEditInp) (err error) {
if err = hgorm.IsUnique(ctx, dao.Test, g.Map{dao.Test.Columns().Qq: in.Qq}, "QQ号码已存在请换一个", in.Id); err != nil {
if err != nil {
return err
}
return
}
// 修改
if in.Id > 0 {
in.UpdatedBy = contexts.GetUserId(ctx)
_, err = dao.Test.Ctx(ctx).Where(dao.Test.Columns().Id, in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
_, err = s.Model(ctx).Where(dao.Test.Columns().Id, in.Id).Data(in).Update()
return
}
// 新增
in.CreatedBy = contexts.GetUserId(ctx)
_, err = dao.Test.Ctx(ctx).Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
_, err = s.Model(ctx, &handler.Option{FilterAuth: false}).Data(in).Insert()
return
}
// Delete 删除
func (s *sAdminTest) Delete(ctx context.Context, in adminin.TestDeleteInp) (err error) {
_, err = dao.Test.Ctx(ctx).Where(dao.Test.Columns().Id, in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
_, err = s.Model(ctx).Where(dao.Test.Columns().Id, in.Id).Delete()
return
}
// Status 更新状态
func (s *sAdminTest) Status(ctx context.Context, in adminin.TestStatusInp) (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.Test.Ctx(ctx).Where(dao.Test.Columns().Id, in.Id).Data(dao.Test.Columns().Status, in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
_, err = s.Model(ctx).Where(dao.Test.Columns().Id, in.Id).Data(g.Map{
dao.Test.Columns().Status: in.Status,
dao.Test.Columns().UpdatedBy: contexts.GetUserId(ctx),
}).Update()
return
}
// Switch 更新开关状态
@@ -231,36 +212,34 @@ func (s *sAdminTest) Switch(ctx context.Context, in adminin.TestSwitchInp) (err
if !validate.InSliceString(fields, in.Key) {
err = gerror.New("开关键名不在白名单")
return err
return
}
// 修改
_, err = dao.Test.Ctx(ctx).Where(dao.Test.Columns().Id, in.Id).Data(in.Key, in.Value).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
_, err = s.Model(ctx).Where(dao.Test.Columns().Id, in.Id).Data(g.Map{
in.Key: in.Value,
dao.Test.Columns().UpdatedBy: contexts.GetUserId(ctx),
}).Update()
return
}
// MaxSort 最大排序
func (s *sAdminTest) MaxSort(ctx context.Context, in adminin.TestMaxSortInp) (res *adminin.TestMaxSortModel, err error) {
if err = dao.Test.Ctx(ctx).Fields(dao.Test.Columns().Sort).OrderDesc(dao.Test.Columns().Sort).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
return
}
res.Sort = res.Sort + g.Cfg().MustGet(ctx, "hotgo.admin.maxSortIncrement").Int()
return res, nil
if res == nil {
res = new(adminin.TestMaxSortModel)
}
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return
}
// View 获取指定字典类型信息
func (s *sAdminTest) View(ctx context.Context, in adminin.TestViewInp) (res *adminin.TestViewModel, err error) {
if err = dao.Test.Ctx(ctx).Where(dao.Test.Columns().Id, in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
return res, nil
err = s.Model(ctx).Where(dao.Test.Columns().Id, in.Id).Scan(&res)
return
}

View File

@@ -205,8 +205,6 @@ func (s *sCommonUpload) UploadUCloud(ctx context.Context, conf *model.UploadConf
return nil, err
}
g.Log().Warningf(ctx, "ras:%+v", string(req.LastResponseBody))
attachment, err := service.SysAttachment().Add(ctx, meta, fullPath, consts.UploadDriveUCloud)
if err != nil {
return nil, err

View File

@@ -14,8 +14,8 @@ import (
"hotgo/internal/service"
)
// GlobalLog 访问日志
func (s *sHook) GlobalLog(r *ghttp.Request) {
// AccessLog 访问日志
func (s *sHook) AccessLog(r *ghttp.Request) {
var (
ctx = r.Context()
)
@@ -31,7 +31,7 @@ func (s *sHook) GlobalLog(r *ghttp.Request) {
go func() {
if err := service.SysLog().AutoLog(ctx); err != nil {
g.Log().Info(ctx, "GlobalLog AutoLog err:", err)
g.Log().Info(ctx, "hook AccessLog err:", err)
}
}()
}

View File

@@ -0,0 +1,80 @@
package hook
import (
"context"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/os/gtimer"
"hotgo/internal/library/contexts"
"sync"
"time"
)
type visitor struct {
lastSeen *gtime.Time
}
var (
visitors = make(map[int64]*visitor)
mtx sync.Mutex
)
// Run a background goroutine to remove old entries from the visitors map.
func init() {
go cleanupVisitors()
}
// Every minute check the map for visitors that haven't been seen for
// more than 3 minutes and delete the entries.
func cleanupVisitors() {
gtimer.AddSingleton(gctx.New(), time.Minute, func(ctx context.Context) {
mtx.Lock()
for memberId, v := range visitors {
if gtime.Now().Sub(v.lastSeen) > 3*time.Minute {
delete(visitors, memberId)
}
}
mtx.Unlock()
})
}
func allow(memberId int64) bool {
mtx.Lock()
defer mtx.Unlock()
v, exists := visitors[memberId]
if !exists {
visitors[memberId] = &visitor{gtime.Now()}
return true
}
if gtime.Now().Sub(v.lastSeen) > time.Second*3 {
v.lastSeen = gtime.Now()
return true
}
return false
}
// LastActive 更新用户最后活跃
func (s *sHook) LastActive(r *ghttp.Request) {
var (
ctx = r.Context()
memberId = contexts.GetUserId(ctx)
)
if memberId == 0 {
return
}
if allow(memberId) {
_, err := g.Model("admin_member").Ctx(ctx).
Where("id", memberId).
Data(g.Map{"last_active_at": gtime.Now()}).
Update()
if err != nil {
g.Log().Warningf(ctx, "hook LastActive err:%+v, memberId:%v", err, memberId)
}
}
}

View File

@@ -42,7 +42,7 @@ func (s *sMiddleware) AdminAuth(r *ghttp.Request) {
// 验证路由访问权限
if !service.AdminRole().Verify(ctx, path, r.Method) {
g.Log().Warningf(ctx, "AdminAuth fail path:%+v, GetRoleKey:%+v, r.Method:%+v", path, contexts.GetRoleKey(ctx), r.Method)
g.Log().Debugf(ctx, "AdminAuth fail path:%+v, GetRoleKey:%+v, r.Method:%+v", path, contexts.GetRoleKey(ctx), r.Method)
response.JsonExit(r, gcode.CodeSecurityReason.Code(), "你没有访问权限!")
return
}

View File

@@ -151,22 +151,19 @@ func inspectAuth(r *ghttp.Request, appName string) error {
// 保存到上下文
if user != nil {
customCtx.User = &model.Identity{
Id: user.Id,
Pid: user.Pid,
DeptId: user.DeptId,
RoleId: user.RoleId,
RoleKey: user.RoleKey,
Username: user.Username,
RealName: user.RealName,
Avatar: user.Avatar,
Email: user.Email,
Mobile: user.Mobile,
VisitCount: user.VisitCount,
LastTime: user.LastTime,
LastIp: user.LastIp,
Exp: user.Exp,
Expires: user.Expires,
App: user.App,
Id: user.Id,
Pid: user.Pid,
DeptId: user.DeptId,
RoleId: user.RoleId,
RoleKey: user.RoleKey,
Username: user.Username,
RealName: user.RealName,
Avatar: user.Avatar,
Email: user.Email,
Mobile: user.Mobile,
Exp: user.Exp,
Expires: user.Expires,
App: user.App,
}
}
contexts.SetUser(ctx, customCtx.User)

View File

@@ -0,0 +1,36 @@
package middleware
import (
"fmt"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/text/gstr"
"hotgo/internal/library/location"
"hotgo/internal/library/response"
)
// Develop 开发工具白名单过滤
func (s *sMiddleware) Develop(r *ghttp.Request) {
ips := g.Cfg().MustGet(r.Context(), "hggen.allowedIPs").Strings()
if len(ips) == 0 {
response.JsonExit(r, gcode.CodeNotSupported.Code(), "请配置生成白名单!")
}
if !gstr.InArray(ips, "*") {
cuIp := location.GetClientIp(r)
ok := false
for _, ip := range ips {
if ip == cuIp {
ok = true
break
}
}
if !ok {
response.JsonExit(r, gcode.CodeNotSupported.Code(), fmt.Sprintf("当前IP[%s]没有配置生成白名单!", cuIp))
}
}
r.Middleware.Next()
}

View File

@@ -96,6 +96,19 @@ func (s *sSysConfig) GetSmtp(ctx context.Context) (conf *model.EmailConfig, err
return conf, nil
}
// 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
}
if err = gconv.Struct(models.List, &conf); err != nil {
return nil, err
}
return conf, nil
}
// 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 {

View File

@@ -8,14 +8,15 @@ package sys
import (
"context"
"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/os/gctx"
"github.com/gogf/gf/v2/os/gtime"
"hotgo/internal/consts"
"hotgo/internal/crons"
"hotgo/internal/dao"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/form"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"hotgo/utility/validate"
@@ -33,10 +34,7 @@ func init() {
}
func (s *sSysCron) StartCron(ctx context.Context) {
var (
list []*entity.SysCron
)
var list []*entity.SysCron
if err := dao.SysCron.Ctx(ctx).
Where("status", consts.StatusEnabled).
Order("sort asc,id desc").
@@ -49,17 +47,30 @@ func (s *sSysCron) StartCron(ctx context.Context) {
g.Log().Fatalf(ctx, "定时任务启动失败, err . %v", err)
return
}
}
// Delete 删除
func (s *sSysCron) Delete(ctx context.Context, in sysin.CronDeleteInp) error {
_, err := dao.SysCron.Ctx(ctx).Where("id", in.Id).Delete()
if err != nil {
func (s *sSysCron) Delete(ctx context.Context, in sysin.CronDeleteInp) (err error) {
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 err
return
}
if models == nil {
err = gerror.New("定时任务不存在或已被删除")
return
}
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
}
return crons.Delete(models)
})
return nil
}
@@ -67,34 +78,30 @@ func (s *sSysCron) Delete(ctx context.Context, in sysin.CronDeleteInp) error {
func (s *sSysCron) Edit(ctx context.Context, in sysin.CronEditInp) (err error) {
if in.Name == "" {
err = gerror.New("标题不能为空")
return err
return
}
// 修改
in.UpdatedAt = gtime.Now()
if in.Id > 0 {
_, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
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
}
return nil
return crons.RefreshStatus(&in.SysCron)
})
return
}
// 新增
in.CreatedAt = gtime.Now()
_, err = dao.SysCron.Ctx(ctx).Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// Status 更新部门状态
func (s *sSysCron) Status(ctx context.Context, in sysin.CronStatusInp) (err error) {
if in.Id <= 0 {
err = gerror.New("ID不能为空")
return err
@@ -110,36 +117,46 @@ func (s *sSysCron) Status(ctx context.Context, in sysin.CronStatusInp) (err erro
return err
}
// 修改
in.UpdatedAt = gtime.Now()
_, err = dao.SysCron.Ctx(ctx).Where("id", in.Id).Data("status", in.Status).Update()
if err != nil {
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 err
return
}
return nil
if models == nil {
err = gerror.New("定时任务不存在")
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
}
models.Status = in.Status
return crons.RefreshStatus(models)
})
return
}
// MaxSort 最大排序
func (s *sSysCron) MaxSort(ctx context.Context, in sysin.CronMaxSortInp) (*sysin.CronMaxSortModel, error) {
var res sysin.CronMaxSortModel
if in.Id > 0 {
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
}
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
}
if res == nil {
res = new(sysin.CronMaxSortModel)
}
res.Sort = res.Sort + 10
return &res, nil
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return res, nil
}
// 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
@@ -152,12 +169,10 @@ func (s *sSysCron) View(ctx context.Context, in sysin.CronViewInp) (res *sysin.C
func (s *sSysCron) List(ctx context.Context, in sysin.CronListInp) (list []*sysin.CronListModel, totalCount int, err error) {
mod := dao.SysCron.Ctx(ctx)
// 访问路径
if in.Name != "" {
mod = mod.WhereLike("name", "%"+in.Name+"%")
}
// 请求方式
if in.Status > 0 {
mod = mod.Where("status", in.Status)
}
@@ -180,7 +195,6 @@ func (s *sSysCron) List(ctx context.Context, in sysin.CronListInp) (list []*sysi
for _, v := range list {
v.GroupName, _ = dao.SysCronGroup.GetName(ctx, v.GroupId)
}
return list, totalCount, err
}
@@ -197,6 +211,5 @@ func (s *sSysCron) OnlineExec(ctx context.Context, in sysin.OnlineExecInp) (err
}
newCtx := context.WithValue(gctx.New(), consts.ContextKeyCronArgs, strings.Split(data.Params, consts.CronSplitStr))
return crons.Once(newCtx, data)
}

View File

@@ -3,8 +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.0
// @AutoGenerate Date 2023-01-18 15:19:42
// @AutoGenerate Version 2.1.2
// @AutoGenerate Date 2023-02-08 17:47:32
//
package sys
@@ -15,6 +15,7 @@ import (
"hotgo/internal/dao"
"hotgo/internal/library/contexts"
"hotgo/internal/library/hgorm"
"hotgo/internal/library/hgorm/handler"
"hotgo/internal/model/input/form"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
@@ -39,14 +40,14 @@ func init() {
service.RegisterSysCurdDemo(NewSysCurdDemo())
}
// Model 生成演示Orm模型
func (s *sSysCurdDemo) Model(ctx context.Context) *gdb.Model {
return dao.SysGenCurdDemo.Ctx(ctx)
// Model 生成演示ORM模型
func (s *sSysCurdDemo) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
return handler.Model(dao.SysGenCurdDemo.Ctx(ctx), option...)
}
// List 获取生成演示列表
func (s *sSysCurdDemo) List(ctx context.Context, in sysin.CurdDemoListInp) (list []*sysin.CurdDemoListModel, totalCount int, err error) {
mod := dao.SysGenCurdDemo.Ctx(ctx)
mod := s.Model(ctx)
// 查询ID
if in.Id > 0 {
@@ -77,36 +78,37 @@ func (s *sSysCurdDemo) List(ctx context.Context, in sysin.CurdDemoListInp) (list
totalCount, err = mod.Clone().Count(1)
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return list, totalCount, err
return
}
if totalCount == 0 {
return list, totalCount, nil
return
}
//关联表select
fields, err := hgorm.GenJoinSelect(ctx, sysin.CurdDemoListModel{}, dao.SysGenCurdDemo, []*hgorm.Join{
{Dao: dao.TestCategory, Alias: "testCategory"},
})
if err = mod.Fields(fields).Handler(hgorm.HandlerFilterAuth).Page(in.Page, in.PerPage).OrderAsc(dao.SysGenCurdDemo.Columns().Sort).OrderDesc(dao.SysGenCurdDemo.Columns().Id).Scan(&list); err != nil {
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, consts.ErrorORM)
return list, totalCount, err
return
}
return list, totalCount, err
return
}
// Export 导出生成演示
func (s *sSysCurdDemo) Export(ctx context.Context, in sysin.CurdDemoListInp) (err error) {
list, totalCount, err := s.List(ctx, in)
if err != nil {
return err
return
}
// 字段的排序是依据tags的字段顺序如果你不想使用默认的排序方式可以直接定义 tags = []string{"字段名称", "字段名称2", ...}
tags, err := convert.GetEntityDescTags(sysin.CurdDemoExportModel{})
if err != nil {
return err
return
}
var (
@@ -115,13 +117,11 @@ func (s *sSysCurdDemo) Export(ctx context.Context, in sysin.CurdDemoListInp) (er
exports []sysin.CurdDemoExportModel
)
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
}
@@ -130,7 +130,7 @@ func (s *sSysCurdDemo) Edit(ctx context.Context, in sysin.CurdDemoEditInp) (err
// 修改
if in.Id > 0 {
in.UpdatedBy = contexts.GetUserId(ctx)
_, err = dao.SysGenCurdDemo.Ctx(ctx).
_, err = s.Model(ctx).
FieldsEx(
dao.SysGenCurdDemo.Columns().Id,
dao.SysGenCurdDemo.Columns().CreatedBy,
@@ -138,85 +138,70 @@ func (s *sSysCurdDemo) Edit(ctx context.Context, in sysin.CurdDemoEditInp) (err
dao.SysGenCurdDemo.Columns().DeletedAt,
).
Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Data(in).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
return
}
// 新增
in.CreatedBy = contexts.GetUserId(ctx)
_, err = dao.SysGenCurdDemo.Ctx(ctx).
_, err = s.Model(ctx, &handler.Option{FilterAuth: false}).
FieldsEx(
dao.SysGenCurdDemo.Columns().Id,
dao.SysGenCurdDemo.Columns().UpdatedBy,
dao.SysGenCurdDemo.Columns().DeletedAt,
).
Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return
}
// Delete 删除生成演示
func (s *sSysCurdDemo) Delete(ctx context.Context, in sysin.CurdDemoDeleteInp) (err error) {
_, err = dao.SysGenCurdDemo.Ctx(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Delete()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
_, err = s.Model(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Delete()
return
}
// MaxSort 获取生成演示最大排序
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, consts.ErrorORM)
return nil, err
return
}
res.Sort = res.Sort + g.Cfg().MustGet(ctx, "hotgo.admin.maxSortIncrement").Int()
return res, nil
if res == nil {
res = new(sysin.CurdDemoMaxSortModel)
}
res.Sort = form.DefaultMaxSort(ctx, res.Sort)
return
}
// View 获取生成演示指定信息
func (s *sSysCurdDemo) View(ctx context.Context, in sysin.CurdDemoViewInp) (res *sysin.CurdDemoViewModel, err error) {
if err = dao.SysGenCurdDemo.Ctx(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Scan(&res); err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return nil, err
}
return res, nil
err = s.Model(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Scan(&res)
return
}
// Status 更新生成演示状态
func (s *sSysCurdDemo) Status(ctx context.Context, in sysin.CurdDemoStatusInp) (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.SysGenCurdDemo.Ctx(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Data(dao.SysGenCurdDemo.Columns().Status, in.Status).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
_, err = s.Model(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Data(g.Map{
dao.SysGenCurdDemo.Columns().Status: in.Status,
dao.SysGenCurdDemo.Columns().UpdatedBy: contexts.GetUserId(ctx),
}).Update()
return
}
// Switch 更新生成演示开关
@@ -229,14 +214,12 @@ func (s *sSysCurdDemo) Switch(ctx context.Context, in sysin.CurdDemoSwitchInp) (
if !validate.InSliceString(fields, in.Key) {
err = gerror.New("开关键名不在白名单")
return err
return
}
_, err = dao.SysGenCurdDemo.Ctx(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Data(in.Key, in.Value).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
_, err = s.Model(ctx).Where(dao.SysGenCurdDemo.Columns().Id, in.Id).Data(g.Map{
in.Key: in.Value,
dao.SysGenCurdDemo.Columns().UpdatedBy: contexts.GetUserId(ctx),
}).Update()
return
}

View File

@@ -0,0 +1,443 @@
// Package sys
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2022 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/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/os/gview"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/grand"
"hotgo/internal/consts"
"hotgo/internal/dao"
"hotgo/internal/library/contexts"
"hotgo/internal/library/ems"
"hotgo/internal/library/location"
"hotgo/internal/model"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"hotgo/utility/charset"
"hotgo/utility/useragent"
"hotgo/utility/validate"
"time"
)
type sSysEmsLog struct{}
func NewSysEmsLog() *sSysEmsLog {
return &sSysEmsLog{}
}
func init() {
service.RegisterSysEmsLog(NewSysEmsLog())
}
// 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
}
// Edit 修改/新增
func (s *sSysEmsLog) Edit(ctx context.Context, in sysin.EmsLogEditInp) (err error) {
if in.Ip == "" {
err = gerror.New("ip不能为空")
return err
}
// 修改
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
}
// 新增
_, err = dao.SysEmsLog.Ctx(ctx).Data(in).Insert()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return nil
}
// Status 更新部门状态
func (s *sSysEmsLog) Status(ctx context.Context, in sysin.EmsLogStatusInp) (err error) {
if in.Id <= 0 {
err = gerror.New("ID不能为空")
return err
}
if in.Status <= 0 {
err = gerror.New("状态不能为空")
return err
}
if !validate.InSliceInt(consts.StatusMap, in.Status) {
err = gerror.New("状态不正确")
return err
}
// 修改
_, 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
}
// 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
}
// List 获取列表
func (s *sSysEmsLog) List(ctx context.Context, in sysin.EmsLogListInp) (list []*sysin.EmsLogListModel, totalCount int, err error) {
mod := dao.SysEmsLog.Ctx(ctx)
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
}
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
}
// Send 发送邮件
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
}
config, err := service.SysConfig().GetSmtp(ctx)
if err != nil {
return err
}
in.Template, err = s.GetTemplate(ctx, in.Event, config)
if err != nil {
return err
}
err = s.AllowSend(ctx, models, config)
if err != nil {
return err
}
if consts.IsCodeEmsTemplate(in.Event) && in.Code == "" {
in.Code = grand.Digits(4)
}
view, err := s.newView(ctx, in, config)
if err != nil {
return err
}
if in.TplData == nil {
in.TplData = make(g.Map)
}
switch in.Event {
// 富文本
case consts.EmsTemplateText:
if in.Content == "" {
err = gerror.New("富文本类型邮件内容不能为空")
return
}
in.TplData["content"] = in.Content
in.Content, err = view.Parse(ctx, in.Template, in.TplData)
if err != nil {
return err
}
// 验证码、重置密码类
default:
in.Content, err = view.Parse(ctx, in.Template, in.TplData)
if err != nil {
return err
}
}
subject, ok := consts.EmsSubjectMap[in.Event]
if !ok {
subject = "HotGo"
}
err = ems.Send(config, in.Email, subject, in.Content)
if err != nil {
return err
}
var data = new(entity.SysEmsLog)
data.Event = in.Event
data.Email = in.Email
data.Content = in.Content
data.Code = in.Code
data.Ip = location.GetClientIp(ghttp.RequestFromCtx(ctx))
data.Status = consts.EmsStatusNotUsed
data.CreatedAt = gtime.Now()
data.UpdatedAt = gtime.Now()
_, err = dao.SysEmsLog.Ctx(ctx).Data(data).Insert()
if err != nil {
return err
}
return nil
}
func (s *sSysEmsLog) newView(ctx context.Context, in sysin.SendEmsInp, config *model.EmailConfig) (view *gview.View, err error) {
view = gview.New()
err = view.SetConfig(gview.Config{
Delimiters: g.Cfg().MustGet(ctx, "viewer.delimiters").Strings(),
})
if err != nil {
return
}
// 富文本为自定义内容,可能不需要变量
if in.Event == consts.EmsTemplateText {
return
}
var (
username string
user = contexts.GetUser(ctx)
request = ghttp.RequestFromCtx(ctx)
ip = location.GetClientIp(request)
)
loc, err := location.GetLocation(ctx, ip)
if err != nil {
return
}
if loc == nil {
loc = new(location.IpLocationData)
}
cityLabel, err := location.ParseRegion(ctx, loc.ProvinceCode, loc.CityCode, 0)
if err != nil {
return
}
basic, err := service.SysConfig().GetBasic(ctx)
if err != nil {
return
}
if basic == nil {
basic = new(model.BasicConfig)
basic.Name = "HotGo"
basic.Domain = "https://hotgo.facms.cn"
basic.Logo = "http://bufanyun.cn-bj.ufileos.com/haoka/attachment/images/2023-02-04/cq9kf7s66jt7hkpvbh.png"
basic.SystemOpen = true
}
if user != nil {
username = user.Username
}
// 公共变量
view.Assigns(gview.Params{
"code": in.Code, // 验证码
"expires": config.CodeExpire / 60, // 验证码有效期(分钟)
"username": username, // 发送者用户名
"name": basic.Name, // 网站名称
"logo": basic.Logo, // 网站logo
"domain": basic.Domain, // 网站域名
"github": "https://github.com/bufanyun/hotgo", // github
"os": useragent.GetOs(request.Header.Get("User-Agent")), // 发送者操作系统
"ip": gstr.HideStr(ip, 30, `*`), // 发送者IP
"cityLabel": cityLabel, // IP归属地
})
// 重置密码
if in.Event == consts.EmsTemplateResetPwd {
var (
passwordResetLink string
resetToken = charset.RandomCreateBytes(32)
)
if user != nil {
switch user.App {
// 后台用户
case consts.AppAdmin:
_, err = g.Model("admin_member").Ctx(ctx).Where("id", user.Id).Data(g.Map{"password_reset_token": resetToken}).Update()
if err != nil {
return
}
passwordResetLink = fmt.Sprintf("%s/admin/passwordReset?token=%s", basic.Domain, resetToken)
// 前台用户
case consts.AppApi:
// ...
}
}
view.Assign("passwordResetLink", passwordResetLink)
}
return
}
// GetTemplate 获取指定邮件模板
func (s *sSysEmsLog) GetTemplate(ctx context.Context, template string, config *model.EmailConfig) (val string, err error) {
if template == "" {
return "", gerror.New("模板不能为空")
}
if config == nil {
config, err = service.SysConfig().GetSmtp(ctx)
if err != nil {
return "", err
}
}
if len(config.Template) == 0 {
return "", gerror.New("管理员还没有配置任何模板!")
}
for _, v := range config.Template {
if v.Key == template {
return v.Value, nil
}
}
return
}
// AllowSend 是否允许发送
func (s *sSysEmsLog) AllowSend(ctx context.Context, models *entity.SysEmsLog, config *model.EmailConfig) (err error) {
if models == nil {
return nil
}
// 富文本事件不限制
if models.Event == consts.EmsTemplateText {
return nil
}
if config == nil {
config, err = service.SysConfig().GetSmtp(ctx)
if err != nil {
return err
}
}
if gtime.Now().Before(models.CreatedAt.Add(time.Second * time.Duration(config.MinInterval))) {
return gerror.New("发送频繁,请稍后再试!")
}
if config.MaxIpLimit > 0 {
count, err := dao.SysEmsLog.NowDayCount(ctx, models.Event, models.Email)
if err != nil {
return err
}
if count >= config.MaxIpLimit {
return gerror.New("今天发送短信过多,请次日后再试!")
}
}
return
}
// VerifyCode 效验验证码
func (s *sSysEmsLog) VerifyCode(ctx context.Context, in sysin.VerifyEmsCodeInp) (err error) {
if in.Event == "" {
return gerror.New("事件不能为空")
}
if in.Email == "" {
return gerror.New("邮箱不能为空")
}
if in.Event == consts.EmsTemplateResetPwd || in.Event == consts.EmsTemplateText {
return gerror.Newf("事件类型无需验证:%v", in.Event)
}
config, err := service.SysConfig().GetSmtp(ctx)
if err != nil {
return err
}
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("验证码错误")
}
if models.Times >= 10 {
return gerror.New("验证码错误次数过多,请重新发送!")
}
if in.Event != consts.EmsTemplateCode {
if models.Status == consts.EmsStatusUsed {
return gerror.New("验证码已使用,请重新发送!")
}
}
if gtime.Now().After(models.CreatedAt.Add(time.Second * time.Duration(config.CodeExpire))) {
return gerror.New("验证码已过期,请重新发送")
}
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("验证码错误!")
}
_, err = dao.SysEmsLog.Ctx(ctx).Where("id", models.Id).Data(g.Map{
"times": models.Times + 1,
"status": consts.EmsStatusUsed,
"updated_at": gtime.Now(),
}).Update()
if err != nil {
err = gerror.Wrap(err, consts.ErrorORM)
return err
}
return
}

Some files were not shown because too many files have changed in this diff Show More