mirror of
				https://github.com/bufanyun/hotgo.git
				synced 2025-11-04 08:13:45 +08:00 
			
		
		
		
	发布v2.4.4版本,本次为优化版本。更新内容请查看:https://github.com/bufanyun/hotgo/blob/v2.0/docs/guide-zh-CN/start-update-log.md
This commit is contained in:
		@@ -11,6 +11,11 @@
 | 
			
		||||
 | 
			
		||||
> 如果升级(覆盖)代码后打开会出现 sql 报错, 请检查更新的数据库格式或自行调整
 | 
			
		||||
 | 
			
		||||
### v2.4.4
 | 
			
		||||
updated 2023.03.16
 | 
			
		||||
- 优化:优化代码生成多库生成时的菜单sql默认指向默认数据库分组
 | 
			
		||||
- 优化:优化TCP服务认证机制
 | 
			
		||||
 | 
			
		||||
### v2.4.2
 | 
			
		||||
updated 2023.03.11
 | 
			
		||||
- 修复:修复字典管理列表无法添加/编辑问题
 | 
			
		||||
 
 | 
			
		||||
@@ -131,6 +131,7 @@
 | 
			
		||||
- 字段名小写,多关键字使用下划线分割(关键字尽量全称)
 | 
			
		||||
- 禁止使用保留字并且尽量少用含有关键词来命名
 | 
			
		||||
- 临时表必须以tmp_开头、以日期结尾,备份表必须以bak_开头、以日期结尾
 | 
			
		||||
- 同数据库表名设置统一前缀,默认是`hg_`
 | 
			
		||||
- 插件模块表名建议以`hg_addon_`开头,如:`hg_addon_hgexample_table`,含义:`插件_案例_表格`。在生成代码时可自动识别实体命名为:`Table`
 | 
			
		||||
 | 
			
		||||
#### 基础规范
 | 
			
		||||
 
 | 
			
		||||
@@ -7,5 +7,5 @@ package consts
 | 
			
		||||
 | 
			
		||||
// VersionApp HotGo版本
 | 
			
		||||
const (
 | 
			
		||||
	VersionApp = "2.4.2"
 | 
			
		||||
	VersionApp = "2.4.4"
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -116,7 +116,7 @@ func (l *gCurd) initInput(ctx context.Context, in *CurdPreviewInput) (err error)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	initStep(ctx, in)
 | 
			
		||||
	initStep(in)
 | 
			
		||||
	in.options.dictMap = make(g.Map)
 | 
			
		||||
 | 
			
		||||
	if len(in.Config.Application.Crud.Templates)-1 < in.In.GenTemplate {
 | 
			
		||||
@@ -138,7 +138,7 @@ func (l *gCurd) initInput(ctx context.Context, in *CurdPreviewInput) (err error)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func initStep(ctx context.Context, in *CurdPreviewInput) {
 | 
			
		||||
func initStep(in *CurdPreviewInput) {
 | 
			
		||||
	in.options.Step = new(CurdStep)
 | 
			
		||||
	in.options.Step.HasMaxSort = HasMaxSort(in.masterFields)
 | 
			
		||||
	in.options.Step.HasAdd = gstr.InArray(in.options.HeadOps, "add")
 | 
			
		||||
@@ -642,7 +642,7 @@ func (l *gCurd) generateWebViewContent(ctx context.Context, in *CurdPreviewInput
 | 
			
		||||
func (l *gCurd) generateSqlContent(ctx context.Context, in *CurdPreviewInput) (err error) {
 | 
			
		||||
	var (
 | 
			
		||||
		name    = "source.sql"
 | 
			
		||||
		config  = g.DB(in.In.DbName).GetConfig()
 | 
			
		||||
		config  = g.DB("default").GetConfig()
 | 
			
		||||
		tplData = g.Map{
 | 
			
		||||
			"dbName":        config.Name,
 | 
			
		||||
			"menuTable":     config.Prefix + "admin_menu",
 | 
			
		||||
@@ -652,7 +652,7 @@ func (l *gCurd) generateSqlContent(ctx context.Context, in *CurdPreviewInput) (e
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	if in.options.Menu.Pid > 0 {
 | 
			
		||||
		tplData["mainComponent"] = "ParentLayout" //gstr.LcFirst(in.In.VarName)
 | 
			
		||||
		tplData["mainComponent"] = "ParentLayout"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	genFile.Path = file.MergeAbs(in.Config.Application.Crud.Templates[in.In.GenTemplate].SqlPath, convert.CamelCaseToUnderline(in.In.VarName)+"_menu.sql")
 | 
			
		||||
 
 | 
			
		||||
@@ -54,10 +54,6 @@ type WhoisRegionData struct {
 | 
			
		||||
 | 
			
		||||
// WhoisLocation 通过Whois接口查询IP归属地
 | 
			
		||||
func WhoisLocation(ctx context.Context, ip string) (*IpLocationData, error) {
 | 
			
		||||
	if !validate.IsIp(ip) {
 | 
			
		||||
		return nil, fmt.Errorf("invalid input ip:%v", ip)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	response, err := g.Client().Timeout(10*time.Second).Get(ctx, whoisApi+ip)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@@ -90,10 +86,6 @@ func WhoisLocation(ctx context.Context, ip string) (*IpLocationData, error) {
 | 
			
		||||
 | 
			
		||||
// Cz88Find 通过Cz88的IP库查询IP归属地
 | 
			
		||||
func Cz88Find(ctx context.Context, ip string) (*IpLocationData, error) {
 | 
			
		||||
	if !validate.IsIp(ip) {
 | 
			
		||||
		return nil, fmt.Errorf("invalid input ip:%v", ip)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	loc, err := iploc.OpenWithoutIndexes("./resource/ip/qqwry-utf8.dat")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("%v for help, please go to: https://github.com/kayon/iploc", err.Error())
 | 
			
		||||
@@ -129,6 +121,13 @@ func IsJurisByIpTitle(title string) bool {
 | 
			
		||||
 | 
			
		||||
// GetLocation 获取IP归属地信息
 | 
			
		||||
func GetLocation(ctx context.Context, ip string) (*IpLocationData, error) {
 | 
			
		||||
	if !validate.IsIp(ip) {
 | 
			
		||||
		return nil, fmt.Errorf("invalid input ip:%v", ip)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if validate.IsLocalIPAddr(ip) {
 | 
			
		||||
		return nil, fmt.Errorf("must be a public ip:%v", ip)
 | 
			
		||||
	}
 | 
			
		||||
	method := g.Cfg().MustGet(ctx, "hotgo.ipMethod", "cz88")
 | 
			
		||||
	if method.String() == "whois" {
 | 
			
		||||
		return WhoisLocation(ctx, ip)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,12 @@
 | 
			
		||||
package tcp
 | 
			
		||||
 | 
			
		||||
import "github.com/gogf/gf/v2/os/gtime"
 | 
			
		||||
 | 
			
		||||
// 定时任务
 | 
			
		||||
const (
 | 
			
		||||
	cronHeartbeatVerify = "tcpHeartbeatVerify"
 | 
			
		||||
	cronHeartbeat       = "tcpHeartbeat"
 | 
			
		||||
	cronAuthVerify      = "tcpAuthVerify"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 认证分组
 | 
			
		||||
@@ -15,10 +18,11 @@ const (
 | 
			
		||||
 | 
			
		||||
// AuthMeta 认证元数据
 | 
			
		||||
type AuthMeta struct {
 | 
			
		||||
	Group     string `json:"group"`
 | 
			
		||||
	Name      string `json:"name"`
 | 
			
		||||
	AppId     string `json:"appId"`
 | 
			
		||||
	SecretKey string `json:"secretKey"`
 | 
			
		||||
	Group     string      `json:"group"`
 | 
			
		||||
	Name      string      `json:"name"`
 | 
			
		||||
	AppId     string      `json:"appId"`
 | 
			
		||||
	SecretKey string      `json:"secretKey"`
 | 
			
		||||
	EndAt     *gtime.Time `json:"-"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CallbackEvent 回调事件
 | 
			
		||||
 
 | 
			
		||||
@@ -27,9 +27,24 @@ func (server *Server) startCron() {
 | 
			
		||||
			for _, client := range server.clients {
 | 
			
		||||
				if client.heartbeat < gtime.Timestamp()-300 {
 | 
			
		||||
					client.Conn.Close()
 | 
			
		||||
					server.Logger.Debugf(server.Ctx, "client heartbeat timeout, about to reconnect.. auth:%+v", client.Auth)
 | 
			
		||||
					server.Logger.Debugf(server.Ctx, "client heartbeat timeout, close conn. auth:%+v", client.Auth)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}, server.getCronKey(cronHeartbeatVerify))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 认证检查
 | 
			
		||||
	if gcron.Search(server.getCronKey(cronAuthVerify)) == nil {
 | 
			
		||||
		gcron.AddSingleton(server.Ctx, "@every 300s", func(ctx context.Context) {
 | 
			
		||||
			if server.clients == nil {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			for _, client := range server.clients {
 | 
			
		||||
				if client.Auth.EndAt.Before(gtime.Now()) {
 | 
			
		||||
					client.Conn.Close()
 | 
			
		||||
					server.Logger.Debugf(server.Ctx, "client auth expired, close conn. auth:%+v", client.Auth)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}, server.getCronKey(cronAuthVerify))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -107,6 +107,7 @@ func (server *Server) onServerLogin(args ...interface{}) {
 | 
			
		||||
			Name:      in.Name,
 | 
			
		||||
			AppId:     in.AppId,
 | 
			
		||||
			SecretKey: models.SecretKey,
 | 
			
		||||
			EndAt:     models.EndAt,
 | 
			
		||||
		},
 | 
			
		||||
		heartbeat: gtime.Timestamp(),
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -240,22 +240,31 @@ func (s *sSysGenCodes) TableSelect(ctx context.Context, in sysin.GenCodesTableSe
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		newValue := v.Value
 | 
			
		||||
		if config.Prefix != "" {
 | 
			
		||||
			newValue = gstr.SubStrFromEx(v.Value, config.Prefix)
 | 
			
		||||
		}
 | 
			
		||||
		if newValue == "" {
 | 
			
		||||
			err = gerror.Newf("表名[%v]前缀必须和配置中的前缀设置[%v] 保持一致", v.Value, config.Prefix)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 如果是插件模块,则移除掉插件表前缀
 | 
			
		||||
		defVarName := gstr.SubStrFromEx(v.Value, config.Prefix)
 | 
			
		||||
		bt, err := gregex.Replace(patternStr, []byte(repStr), []byte(defVarName))
 | 
			
		||||
		bt, err := gregex.Replace(patternStr, []byte(repStr), []byte(newValue))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			err = gerror.Newf("表名[%v] gregex.Replace err:%v", v.Value, err.Error())
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		defVarName = gstr.CaseCamel(string(bt))
 | 
			
		||||
 | 
			
		||||
		row := new(sysin.GenCodesTableSelectModel)
 | 
			
		||||
		row = v
 | 
			
		||||
		row.DefTableComment = v.Label
 | 
			
		||||
		row.DaoName = gstr.CaseCamel(gstr.SubStrFromEx(v.Value, config.Prefix))
 | 
			
		||||
		row.DefVarName = defVarName
 | 
			
		||||
		row.DefAlias = gstr.CaseCamelLower(gstr.SubStrFromEx(v.Value, config.Prefix))
 | 
			
		||||
		row.DaoName = gstr.CaseCamel(newValue)
 | 
			
		||||
		row.DefVarName = gstr.CaseCamel(string(bt))
 | 
			
		||||
		row.DefAlias = gstr.CaseCamelLower(newValue)
 | 
			
		||||
		row.Name = fmt.Sprintf("%s (%s)", v.Value, v.Label)
 | 
			
		||||
		row.Label = row.Name
 | 
			
		||||
 | 
			
		||||
		res = append(res, row)
 | 
			
		||||
	}
 | 
			
		||||
	return res, nil
 | 
			
		||||
 
 | 
			
		||||
@@ -198,7 +198,7 @@ func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog {
 | 
			
		||||
 | 
			
		||||
	ipData, err := location.GetLocation(ctx, clientIp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		g.Log().Errorf(ctx, "location.GetLocation err:%+v", err)
 | 
			
		||||
		g.Log().Infof(ctx, "location.GetLocation clientIp:%v, err:%+v", clientIp, err)
 | 
			
		||||
	}
 | 
			
		||||
	if ipData == nil {
 | 
			
		||||
		ipData = new(location.IpLocationData)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,8 @@ package tcpclient
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/gogf/gf/v2/errors/gcode"
 | 
			
		||||
	"github.com/gogf/gf/v2/frame/g"
 | 
			
		||||
	"github.com/gogf/gf/v2/os/gcron"
 | 
			
		||||
	"github.com/gogf/gf/v2/util/gconv"
 | 
			
		||||
	"hotgo/internal/library/network/tcp"
 | 
			
		||||
	"hotgo/internal/model/input/msgin"
 | 
			
		||||
	"hotgo/internal/service"
 | 
			
		||||
	"hotgo/utility/simple"
 | 
			
		||||
)
 | 
			
		||||
@@ -37,8 +33,8 @@ func (s *sTCPAuth) Start(ctx context.Context) {
 | 
			
		||||
				AppId:     "mengshuai",
 | 
			
		||||
				SecretKey: "123456",
 | 
			
		||||
			},
 | 
			
		||||
			LoginEvent: s.loginEvent,
 | 
			
		||||
			CloseEvent: s.closeEvent,
 | 
			
		||||
			LoginEvent: s.onLoginEvent,
 | 
			
		||||
			CloseEvent: s.onCloseEvent,
 | 
			
		||||
		})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			g.Log().Infof(ctx, "TCPAuth NewClient fail:%+v", err)
 | 
			
		||||
@@ -48,7 +44,7 @@ func (s *sTCPAuth) Start(ctx context.Context) {
 | 
			
		||||
		s.client = client
 | 
			
		||||
 | 
			
		||||
		err = s.client.RegisterRouter(map[string]tcp.RouterHandler{
 | 
			
		||||
			"ResponseAuthSummary": s.onResponseAuthSummary, // 获取授权信息
 | 
			
		||||
			// ...
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -63,7 +59,7 @@ func (s *sTCPAuth) Start(ctx context.Context) {
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stop 关闭服务
 | 
			
		||||
// Stop 停止服务
 | 
			
		||||
func (s *sTCPAuth) Stop(ctx context.Context) {
 | 
			
		||||
	if s.client != nil {
 | 
			
		||||
		s.client.Stop()
 | 
			
		||||
@@ -71,40 +67,17 @@ func (s *sTCPAuth) Stop(ctx context.Context) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *sTCPAuth) loginEvent() {
 | 
			
		||||
	// 登录成功后立即请求一次授权信息
 | 
			
		||||
	s.client.Write(&msgin.AuthSummary{})
 | 
			
		||||
 | 
			
		||||
	// 定时检查授权
 | 
			
		||||
	gcron.Add(s.client.Ctx, "@every 1200s", func(ctx context.Context) {
 | 
			
		||||
		if !s.client.IsLogin {
 | 
			
		||||
			g.Log().Infof(ctx, "TCPAuthVerify client is not logged in, skipped")
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		s.client.Write(&msgin.AuthSummary{})
 | 
			
		||||
	}, "TCPAuthVerify")
 | 
			
		||||
// IsLogin 是否已登录认证
 | 
			
		||||
func (s *sTCPAuth) IsLogin() bool {
 | 
			
		||||
	return s.client.IsLogin
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *sTCPAuth) closeEvent() {
 | 
			
		||||
	// 关闭连接后,删除定时检查授权
 | 
			
		||||
	gcron.Remove("TCPAuthVerify")
 | 
			
		||||
// onLoginEvent 登录认证成功事件
 | 
			
		||||
func (s *sTCPAuth) onLoginEvent() {
 | 
			
		||||
	// ...
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *sTCPAuth) onResponseAuthSummary(args ...interface{}) {
 | 
			
		||||
	var in *msgin.ResponseAuthSummary
 | 
			
		||||
	if err := gconv.Scan(args[0], &in); err != nil {
 | 
			
		||||
		s.client.Logger.Infof(s.client.Ctx, "ResponseAuthSummary message Scan failed:%+v, args:%+v", err, args[0])
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	s.client.Logger.Infof(s.client.Ctx, "onResponseAuthSummary in:%+v", *in)
 | 
			
		||||
 | 
			
		||||
	// 授权异常
 | 
			
		||||
	if in.Code != gcode.CodeOK.Code() {
 | 
			
		||||
		s.client.Logger.Infof(s.client.Ctx, "onResponseAuthSummary authorization verification failed:%+v", in.Message)
 | 
			
		||||
		s.client.Destroy()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 授权通过
 | 
			
		||||
	// 后续可以做一些操作...
 | 
			
		||||
// onCloseEvent 连接关闭回调事件
 | 
			
		||||
func (s *sTCPAuth) onCloseEvent() {
 | 
			
		||||
	// ...
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,23 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	IAdminMenu interface {
 | 
			
		||||
		RoleList(ctx context.Context, in adminin.MenuRoleListInp) (*adminin.MenuRoleListModel, error)
 | 
			
		||||
		SearchList(ctx context.Context, req *menu.SearchListReq) (*menu.SearchListRes, error)
 | 
			
		||||
		MaxSort(ctx context.Context, req *menu.MaxSortReq) (*menu.MaxSortRes, error)
 | 
			
		||||
		NameUnique(ctx context.Context, req *menu.NameUniqueReq) (*menu.NameUniqueRes, error)
 | 
			
		||||
		CodeUnique(ctx context.Context, req *menu.CodeUniqueReq) (*menu.CodeUniqueRes, error)
 | 
			
		||||
		Delete(ctx context.Context, req *menu.DeleteReq) error
 | 
			
		||||
		Edit(ctx context.Context, req *menu.EditReq) (err error)
 | 
			
		||||
		View(ctx context.Context, req *menu.ViewReq) (res *menu.ViewRes, err error)
 | 
			
		||||
		List(ctx context.Context, req *menu.ListReq) (lists []map[string]interface{}, err error)
 | 
			
		||||
		GetMenuList(ctx context.Context, memberId int64) (lists role.DynamicRes, err error)
 | 
			
		||||
		LoginPermissions(ctx context.Context, memberId int64) (lists adminin.MemberLoginPermissions, err error)
 | 
			
		||||
	}
 | 
			
		||||
	IAdminMonitor interface {
 | 
			
		||||
		StartMonitor(ctx context.Context)
 | 
			
		||||
		GetMeta(ctx context.Context) *model.MonitorData
 | 
			
		||||
	}
 | 
			
		||||
	IAdminNotice interface {
 | 
			
		||||
		Model(ctx context.Context, option ...*handler.Option) *gdb.Model
 | 
			
		||||
		Delete(ctx context.Context, in adminin.NoticeDeleteInp) error
 | 
			
		||||
@@ -94,23 +111,6 @@ type (
 | 
			
		||||
		UpdatePostIds(ctx context.Context, memberId int64, postIds []int64) (err error)
 | 
			
		||||
		GetMemberByIds(ctx context.Context, memberId int64) (postIds []int64, err error)
 | 
			
		||||
	}
 | 
			
		||||
	IAdminMenu interface {
 | 
			
		||||
		RoleList(ctx context.Context, in adminin.MenuRoleListInp) (*adminin.MenuRoleListModel, error)
 | 
			
		||||
		SearchList(ctx context.Context, req *menu.SearchListReq) (*menu.SearchListRes, error)
 | 
			
		||||
		MaxSort(ctx context.Context, req *menu.MaxSortReq) (*menu.MaxSortRes, error)
 | 
			
		||||
		NameUnique(ctx context.Context, req *menu.NameUniqueReq) (*menu.NameUniqueRes, error)
 | 
			
		||||
		CodeUnique(ctx context.Context, req *menu.CodeUniqueReq) (*menu.CodeUniqueRes, error)
 | 
			
		||||
		Delete(ctx context.Context, req *menu.DeleteReq) error
 | 
			
		||||
		Edit(ctx context.Context, req *menu.EditReq) (err error)
 | 
			
		||||
		View(ctx context.Context, req *menu.ViewReq) (res *menu.ViewRes, err error)
 | 
			
		||||
		List(ctx context.Context, req *menu.ListReq) (lists []map[string]interface{}, err error)
 | 
			
		||||
		GetMenuList(ctx context.Context, memberId int64) (lists role.DynamicRes, err error)
 | 
			
		||||
		LoginPermissions(ctx context.Context, memberId int64) (lists adminin.MemberLoginPermissions, err error)
 | 
			
		||||
	}
 | 
			
		||||
	IAdminMonitor interface {
 | 
			
		||||
		StartMonitor(ctx context.Context)
 | 
			
		||||
		GetMeta(ctx context.Context) *model.MonitorData
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
 
 | 
			
		||||
@@ -17,18 +17,6 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	ISysProvinces interface {
 | 
			
		||||
		Tree(ctx context.Context) (list []g.Map, err error)
 | 
			
		||||
		Delete(ctx context.Context, in sysin.ProvincesDeleteInp) error
 | 
			
		||||
		Edit(ctx context.Context, in sysin.ProvincesEditInp) (err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.ProvincesStatusInp) (err error)
 | 
			
		||||
		MaxSort(ctx context.Context, in sysin.ProvincesMaxSortInp) (res *sysin.ProvincesMaxSortModel, err error)
 | 
			
		||||
		View(ctx context.Context, in sysin.ProvincesViewInp) (res *sysin.ProvincesViewModel, err error)
 | 
			
		||||
		List(ctx context.Context, in sysin.ProvincesListInp) (list []*sysin.ProvincesListModel, totalCount int, err error)
 | 
			
		||||
		ChildrenList(ctx context.Context, in sysin.ProvincesChildrenListInp) (list []*sysin.ProvincesChildrenListModel, totalCount int, err error)
 | 
			
		||||
		UniqueId(ctx context.Context, in sysin.ProvincesUniqueIdInp) (res *sysin.ProvincesUniqueIdModel, err error)
 | 
			
		||||
		Select(ctx context.Context, in sysin.ProvincesSelectInp) (res *sysin.ProvincesSelectModel, err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysCron interface {
 | 
			
		||||
		StartCron(ctx context.Context)
 | 
			
		||||
		Delete(ctx context.Context, in sysin.CronDeleteInp) (err error)
 | 
			
		||||
@@ -39,14 +27,16 @@ type (
 | 
			
		||||
		List(ctx context.Context, in sysin.CronListInp) (list []*sysin.CronListModel, totalCount int, err error)
 | 
			
		||||
		OnlineExec(ctx context.Context, in sysin.OnlineExecInp) (err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysCronGroup interface {
 | 
			
		||||
		Delete(ctx context.Context, in sysin.CronGroupDeleteInp) error
 | 
			
		||||
		Edit(ctx context.Context, in sysin.CronGroupEditInp) (err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.CronGroupStatusInp) (err error)
 | 
			
		||||
		MaxSort(ctx context.Context, in sysin.CronGroupMaxSortInp) (*sysin.CronGroupMaxSortModel, error)
 | 
			
		||||
		View(ctx context.Context, in sysin.CronGroupViewInp) (res *sysin.CronGroupViewModel, err error)
 | 
			
		||||
		List(ctx context.Context, in sysin.CronGroupListInp) (list []*sysin.CronGroupListModel, totalCount int, err error)
 | 
			
		||||
		Select(ctx context.Context, in sysin.CronGroupSelectInp) (res *sysin.CronGroupSelectModel, err error)
 | 
			
		||||
	ISysCurdDemo interface {
 | 
			
		||||
		Model(ctx context.Context, option ...*handler.Option) *gdb.Model
 | 
			
		||||
		List(ctx context.Context, in sysin.CurdDemoListInp) (list []*sysin.CurdDemoListModel, totalCount int, err error)
 | 
			
		||||
		Export(ctx context.Context, in sysin.CurdDemoListInp) (err error)
 | 
			
		||||
		Edit(ctx context.Context, in sysin.CurdDemoEditInp) (err error)
 | 
			
		||||
		Delete(ctx context.Context, in sysin.CurdDemoDeleteInp) (err error)
 | 
			
		||||
		MaxSort(ctx context.Context, in sysin.CurdDemoMaxSortInp) (res *sysin.CurdDemoMaxSortModel, err error)
 | 
			
		||||
		View(ctx context.Context, in sysin.CurdDemoViewInp) (res *sysin.CurdDemoViewModel, err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.CurdDemoStatusInp) (err error)
 | 
			
		||||
		Switch(ctx context.Context, in sysin.CurdDemoSwitchInp) (err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysEmsLog interface {
 | 
			
		||||
		Delete(ctx context.Context, in sysin.EmsLogDeleteInp) error
 | 
			
		||||
@@ -59,6 +49,15 @@ type (
 | 
			
		||||
		AllowSend(ctx context.Context, models *entity.SysEmsLog, config *model.EmailConfig) (err error)
 | 
			
		||||
		VerifyCode(ctx context.Context, in sysin.VerifyEmsCodeInp) (err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysEmployeeBase interface {
 | 
			
		||||
		Model(ctx context.Context, option ...*handler.Option) *gdb.Model
 | 
			
		||||
		List(ctx context.Context, in sysin.EmployeeBaseListInp) (list []*sysin.EmployeeBaseListModel, totalCount int, err error)
 | 
			
		||||
		Export(ctx context.Context, in sysin.EmployeeBaseListInp) (err error)
 | 
			
		||||
		Edit(ctx context.Context, in sysin.EmployeeBaseEditInp) (err error)
 | 
			
		||||
		Delete(ctx context.Context, in sysin.EmployeeBaseDeleteInp) (err error)
 | 
			
		||||
		View(ctx context.Context, in sysin.EmployeeBaseViewInp) (res *sysin.EmployeeBaseViewModel, err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.EmployeeBaseStatusInp) (err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysLoginLog interface {
 | 
			
		||||
		Model(ctx context.Context) *gdb.Model
 | 
			
		||||
		List(ctx context.Context, in sysin.LoginLogListInp) (list []*sysin.LoginLogListModel, totalCount int, err error)
 | 
			
		||||
@@ -68,13 +67,29 @@ type (
 | 
			
		||||
		Push(ctx context.Context, in sysin.LoginLogPushInp)
 | 
			
		||||
		RealWrite(ctx context.Context, models entity.SysLoginLog) (err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysAddons interface {
 | 
			
		||||
		List(ctx context.Context, in sysin.AddonsListInp) (list []*sysin.AddonsListModel, totalCount int, err error)
 | 
			
		||||
		Selects(ctx context.Context, in sysin.AddonsSelectsInp) (res *sysin.AddonsSelectsModel, err error)
 | 
			
		||||
		Build(ctx context.Context, in sysin.AddonsBuildInp) (err error)
 | 
			
		||||
		Install(ctx context.Context, in sysin.AddonsInstallInp) (err error)
 | 
			
		||||
		Upgrade(ctx context.Context, in sysin.AddonsUpgradeInp) (err error)
 | 
			
		||||
		UnInstall(ctx context.Context, in sysin.AddonsUnInstallInp) (err error)
 | 
			
		||||
	ISysAddonsConfig interface {
 | 
			
		||||
		GetConfigByGroup(ctx context.Context, in sysin.GetAddonsConfigInp) (res *sysin.GetAddonsConfigModel, err error)
 | 
			
		||||
		ConversionType(ctx context.Context, models *entity.SysAddonsConfig) (value interface{}, err error)
 | 
			
		||||
		UpdateConfigByGroup(ctx context.Context, in sysin.UpdateAddonsConfigInp) error
 | 
			
		||||
	}
 | 
			
		||||
	ISysBlacklist interface {
 | 
			
		||||
		Delete(ctx context.Context, in sysin.BlacklistDeleteInp) (err error)
 | 
			
		||||
		Edit(ctx context.Context, in sysin.BlacklistEditInp) (err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.BlacklistStatusInp) (err error)
 | 
			
		||||
		MaxSort(ctx context.Context, in sysin.BlacklistMaxSortInp) (*sysin.BlacklistMaxSortModel, error)
 | 
			
		||||
		View(ctx context.Context, in sysin.BlacklistViewInp) (res *sysin.BlacklistViewModel, err error)
 | 
			
		||||
		List(ctx context.Context, in sysin.BlacklistListInp) (list []*sysin.BlacklistListModel, totalCount int, err error)
 | 
			
		||||
		VariableLoad(ctx context.Context, err error)
 | 
			
		||||
		Load(ctx context.Context)
 | 
			
		||||
	}
 | 
			
		||||
	ISysCronGroup interface {
 | 
			
		||||
		Delete(ctx context.Context, in sysin.CronGroupDeleteInp) error
 | 
			
		||||
		Edit(ctx context.Context, in sysin.CronGroupEditInp) (err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.CronGroupStatusInp) (err error)
 | 
			
		||||
		MaxSort(ctx context.Context, in sysin.CronGroupMaxSortInp) (*sysin.CronGroupMaxSortModel, error)
 | 
			
		||||
		View(ctx context.Context, in sysin.CronGroupViewInp) (res *sysin.CronGroupViewModel, err error)
 | 
			
		||||
		List(ctx context.Context, in sysin.CronGroupListInp) (list []*sysin.CronGroupListModel, totalCount int, err error)
 | 
			
		||||
		Select(ctx context.Context, in sysin.CronGroupSelectInp) (res *sysin.CronGroupSelectModel, err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysGenCodes interface {
 | 
			
		||||
		Delete(ctx context.Context, in sysin.GenCodesDeleteInp) error
 | 
			
		||||
@@ -90,19 +105,17 @@ type (
 | 
			
		||||
		Preview(ctx context.Context, in sysin.GenCodesPreviewInp) (res *sysin.GenCodesPreviewModel, err error)
 | 
			
		||||
		Build(ctx context.Context, in sysin.GenCodesBuildInp) (err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysAddonsConfig interface {
 | 
			
		||||
		GetConfigByGroup(ctx context.Context, in sysin.GetAddonsConfigInp) (res *sysin.GetAddonsConfigModel, err error)
 | 
			
		||||
		ConversionType(ctx context.Context, models *entity.SysAddonsConfig) (value interface{}, err error)
 | 
			
		||||
		UpdateConfigByGroup(ctx context.Context, in sysin.UpdateAddonsConfigInp) error
 | 
			
		||||
	}
 | 
			
		||||
	ISysAttachment interface {
 | 
			
		||||
		Delete(ctx context.Context, in sysin.AttachmentDeleteInp) error
 | 
			
		||||
		Edit(ctx context.Context, in sysin.AttachmentEditInp) (err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.AttachmentStatusInp) (err error)
 | 
			
		||||
		MaxSort(ctx context.Context, in sysin.AttachmentMaxSortInp) (*sysin.AttachmentMaxSortModel, error)
 | 
			
		||||
		View(ctx context.Context, in sysin.AttachmentViewInp) (res *sysin.AttachmentViewModel, err error)
 | 
			
		||||
		List(ctx context.Context, in sysin.AttachmentListInp) (list []*sysin.AttachmentListModel, totalCount int, err error)
 | 
			
		||||
		Add(ctx context.Context, meta *sysin.UploadFileMeta, fullPath, drive string) (data *entity.SysAttachment, err error)
 | 
			
		||||
	ISysProvinces interface {
 | 
			
		||||
		Tree(ctx context.Context) (list []g.Map, err error)
 | 
			
		||||
		Delete(ctx context.Context, in sysin.ProvincesDeleteInp) error
 | 
			
		||||
		Edit(ctx context.Context, in sysin.ProvincesEditInp) (err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.ProvincesStatusInp) (err error)
 | 
			
		||||
		MaxSort(ctx context.Context, in sysin.ProvincesMaxSortInp) (res *sysin.ProvincesMaxSortModel, err error)
 | 
			
		||||
		View(ctx context.Context, in sysin.ProvincesViewInp) (res *sysin.ProvincesViewModel, err error)
 | 
			
		||||
		List(ctx context.Context, in sysin.ProvincesListInp) (list []*sysin.ProvincesListModel, totalCount int, err error)
 | 
			
		||||
		ChildrenList(ctx context.Context, in sysin.ProvincesChildrenListInp) (list []*sysin.ProvincesChildrenListModel, totalCount int, err error)
 | 
			
		||||
		UniqueId(ctx context.Context, in sysin.ProvincesUniqueIdInp) (res *sysin.ProvincesUniqueIdModel, err error)
 | 
			
		||||
		Select(ctx context.Context, in sysin.ProvincesSelectInp) (res *sysin.ProvincesSelectModel, err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysServeLog interface {
 | 
			
		||||
		Model(ctx context.Context) *gdb.Model
 | 
			
		||||
@@ -124,30 +137,13 @@ type (
 | 
			
		||||
		AllowSend(ctx context.Context, models *entity.SysSmsLog, config *model.SmsConfig) (err error)
 | 
			
		||||
		VerifyCode(ctx context.Context, in sysin.VerifyCodeInp) (err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysDictType interface {
 | 
			
		||||
		Tree(ctx context.Context) (list []*sysin.DictTypeTree, err error)
 | 
			
		||||
		Delete(ctx context.Context, in sysin.DictTypeDeleteInp) error
 | 
			
		||||
		Edit(ctx context.Context, in sysin.DictTypeEditInp) (err error)
 | 
			
		||||
		TreeSelect(ctx context.Context, in sysin.DictTreeSelectInp) (list []*sysin.DictTypeTree, err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysLog interface {
 | 
			
		||||
		Export(ctx context.Context, in sysin.LogListInp) (err error)
 | 
			
		||||
		RealWrite(ctx context.Context, commonLog entity.SysLog) (err error)
 | 
			
		||||
		AutoLog(ctx context.Context) error
 | 
			
		||||
		AnalysisLog(ctx context.Context) entity.SysLog
 | 
			
		||||
		View(ctx context.Context, in sysin.LogViewInp) (res *sysin.LogViewModel, err error)
 | 
			
		||||
		Delete(ctx context.Context, in sysin.LogDeleteInp) (err error)
 | 
			
		||||
		List(ctx context.Context, in sysin.LogListInp) (list []*sysin.LogListModel, totalCount int, err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysBlacklist interface {
 | 
			
		||||
		Delete(ctx context.Context, in sysin.BlacklistDeleteInp) (err error)
 | 
			
		||||
		Edit(ctx context.Context, in sysin.BlacklistEditInp) (err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.BlacklistStatusInp) (err error)
 | 
			
		||||
		MaxSort(ctx context.Context, in sysin.BlacklistMaxSortInp) (*sysin.BlacklistMaxSortModel, error)
 | 
			
		||||
		View(ctx context.Context, in sysin.BlacklistViewInp) (res *sysin.BlacklistViewModel, err error)
 | 
			
		||||
		List(ctx context.Context, in sysin.BlacklistListInp) (list []*sysin.BlacklistListModel, totalCount int, err error)
 | 
			
		||||
		VariableLoad(ctx context.Context, err error)
 | 
			
		||||
		Load(ctx context.Context)
 | 
			
		||||
	ISysAddons interface {
 | 
			
		||||
		List(ctx context.Context, in sysin.AddonsListInp) (list []*sysin.AddonsListModel, totalCount int, err error)
 | 
			
		||||
		Selects(ctx context.Context, in sysin.AddonsSelectsInp) (res *sysin.AddonsSelectsModel, err error)
 | 
			
		||||
		Build(ctx context.Context, in sysin.AddonsBuildInp) (err error)
 | 
			
		||||
		Install(ctx context.Context, in sysin.AddonsInstallInp) (err error)
 | 
			
		||||
		Upgrade(ctx context.Context, in sysin.AddonsUpgradeInp) (err error)
 | 
			
		||||
		UnInstall(ctx context.Context, in sysin.AddonsUnInstallInp) (err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysConfig interface {
 | 
			
		||||
		GetLoadCache(ctx context.Context) (conf *model.CacheConfig, err error)
 | 
			
		||||
@@ -164,16 +160,20 @@ type (
 | 
			
		||||
		ConversionType(ctx context.Context, models *entity.SysConfig) (value interface{}, err error)
 | 
			
		||||
		UpdateConfigByGroup(ctx context.Context, in sysin.UpdateConfigInp) error
 | 
			
		||||
	}
 | 
			
		||||
	ISysCurdDemo interface {
 | 
			
		||||
		Model(ctx context.Context, option ...*handler.Option) *gdb.Model
 | 
			
		||||
		List(ctx context.Context, in sysin.CurdDemoListInp) (list []*sysin.CurdDemoListModel, totalCount int, err error)
 | 
			
		||||
		Export(ctx context.Context, in sysin.CurdDemoListInp) (err error)
 | 
			
		||||
		Edit(ctx context.Context, in sysin.CurdDemoEditInp) (err error)
 | 
			
		||||
		Delete(ctx context.Context, in sysin.CurdDemoDeleteInp) (err error)
 | 
			
		||||
		MaxSort(ctx context.Context, in sysin.CurdDemoMaxSortInp) (res *sysin.CurdDemoMaxSortModel, err error)
 | 
			
		||||
		View(ctx context.Context, in sysin.CurdDemoViewInp) (res *sysin.CurdDemoViewModel, err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.CurdDemoStatusInp) (err error)
 | 
			
		||||
		Switch(ctx context.Context, in sysin.CurdDemoSwitchInp) (err error)
 | 
			
		||||
	ISysDictType interface {
 | 
			
		||||
		Tree(ctx context.Context) (list []*sysin.DictTypeTree, err error)
 | 
			
		||||
		Delete(ctx context.Context, in sysin.DictTypeDeleteInp) error
 | 
			
		||||
		Edit(ctx context.Context, in sysin.DictTypeEditInp) (err error)
 | 
			
		||||
		TreeSelect(ctx context.Context, in sysin.DictTreeSelectInp) (list []*sysin.DictTypeTree, err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysAttachment interface {
 | 
			
		||||
		Delete(ctx context.Context, in sysin.AttachmentDeleteInp) error
 | 
			
		||||
		Edit(ctx context.Context, in sysin.AttachmentEditInp) (err error)
 | 
			
		||||
		Status(ctx context.Context, in sysin.AttachmentStatusInp) (err error)
 | 
			
		||||
		MaxSort(ctx context.Context, in sysin.AttachmentMaxSortInp) (*sysin.AttachmentMaxSortModel, error)
 | 
			
		||||
		View(ctx context.Context, in sysin.AttachmentViewInp) (res *sysin.AttachmentViewModel, err error)
 | 
			
		||||
		List(ctx context.Context, in sysin.AttachmentListInp) (list []*sysin.AttachmentListModel, totalCount int, err error)
 | 
			
		||||
		Add(ctx context.Context, meta *sysin.UploadFileMeta, fullPath, drive string) (data *entity.SysAttachment, err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysDictData interface {
 | 
			
		||||
		Delete(ctx context.Context, in sysin.DictDataDeleteInp) error
 | 
			
		||||
@@ -181,59 +181,47 @@ type (
 | 
			
		||||
		List(ctx context.Context, in sysin.DictDataListInp) (list []*sysin.DictDataListModel, totalCount int, err error)
 | 
			
		||||
		Select(ctx context.Context, in sysin.DataSelectInp) (list sysin.DataSelectModel, err error)
 | 
			
		||||
	}
 | 
			
		||||
	ISysLog interface {
 | 
			
		||||
		Export(ctx context.Context, in sysin.LogListInp) (err error)
 | 
			
		||||
		RealWrite(ctx context.Context, commonLog entity.SysLog) (err error)
 | 
			
		||||
		AutoLog(ctx context.Context) error
 | 
			
		||||
		AnalysisLog(ctx context.Context) entity.SysLog
 | 
			
		||||
		View(ctx context.Context, in sysin.LogViewInp) (res *sysin.LogViewModel, err error)
 | 
			
		||||
		Delete(ctx context.Context, in sysin.LogDeleteInp) (err error)
 | 
			
		||||
		List(ctx context.Context, in sysin.LogListInp) (list []*sysin.LogListModel, totalCount int, err error)
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	localSysAddonsConfig ISysAddonsConfig
 | 
			
		||||
	localSysAttachment   ISysAttachment
 | 
			
		||||
	localSysServeLog     ISysServeLog
 | 
			
		||||
	localSysSmsLog       ISysSmsLog
 | 
			
		||||
	localSysBlacklist    ISysBlacklist
 | 
			
		||||
	localSysAddons       ISysAddons
 | 
			
		||||
	localSysConfig       ISysConfig
 | 
			
		||||
	localSysCurdDemo     ISysCurdDemo
 | 
			
		||||
	localSysDictData     ISysDictData
 | 
			
		||||
	localSysDictType     ISysDictType
 | 
			
		||||
	localSysGenCodes     ISysGenCodes
 | 
			
		||||
	localSysProvinces    ISysProvinces
 | 
			
		||||
	localSysAttachment   ISysAttachment
 | 
			
		||||
	localSysDictData     ISysDictData
 | 
			
		||||
	localSysLog          ISysLog
 | 
			
		||||
	localSysCron         ISysCron
 | 
			
		||||
	localSysCronGroup    ISysCronGroup
 | 
			
		||||
	localSysCurdDemo     ISysCurdDemo
 | 
			
		||||
	localSysEmsLog       ISysEmsLog
 | 
			
		||||
	localSysAddonsConfig ISysAddonsConfig
 | 
			
		||||
	localSysBlacklist    ISysBlacklist
 | 
			
		||||
	localSysCronGroup    ISysCronGroup
 | 
			
		||||
	localSysEmployeeBase ISysEmployeeBase
 | 
			
		||||
	localSysLoginLog     ISysLoginLog
 | 
			
		||||
	localSysProvinces    ISysProvinces
 | 
			
		||||
	localSysAddons       ISysAddons
 | 
			
		||||
	localSysGenCodes     ISysGenCodes
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func SysDictData() ISysDictData {
 | 
			
		||||
	if localSysDictData == nil {
 | 
			
		||||
		panic("implement not found for interface ISysDictData, forgot register?")
 | 
			
		||||
func SysAddonsConfig() ISysAddonsConfig {
 | 
			
		||||
	if localSysAddonsConfig == nil {
 | 
			
		||||
		panic("implement not found for interface ISysAddonsConfig, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysDictData
 | 
			
		||||
	return localSysAddonsConfig
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysDictData(i ISysDictData) {
 | 
			
		||||
	localSysDictData = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysDictType() ISysDictType {
 | 
			
		||||
	if localSysDictType == nil {
 | 
			
		||||
		panic("implement not found for interface ISysDictType, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysDictType
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysDictType(i ISysDictType) {
 | 
			
		||||
	localSysDictType = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysLog() ISysLog {
 | 
			
		||||
	if localSysLog == nil {
 | 
			
		||||
		panic("implement not found for interface ISysLog, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysLog
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysLog(i ISysLog) {
 | 
			
		||||
	localSysLog = i
 | 
			
		||||
func RegisterSysAddonsConfig(i ISysAddonsConfig) {
 | 
			
		||||
	localSysAddonsConfig = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysBlacklist() ISysBlacklist {
 | 
			
		||||
@@ -247,26 +235,26 @@ func RegisterSysBlacklist(i ISysBlacklist) {
 | 
			
		||||
	localSysBlacklist = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysConfig() ISysConfig {
 | 
			
		||||
	if localSysConfig == nil {
 | 
			
		||||
		panic("implement not found for interface ISysConfig, forgot register?")
 | 
			
		||||
func SysCronGroup() ISysCronGroup {
 | 
			
		||||
	if localSysCronGroup == nil {
 | 
			
		||||
		panic("implement not found for interface ISysCronGroup, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysConfig
 | 
			
		||||
	return localSysCronGroup
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysConfig(i ISysConfig) {
 | 
			
		||||
	localSysConfig = i
 | 
			
		||||
func RegisterSysCronGroup(i ISysCronGroup) {
 | 
			
		||||
	localSysCronGroup = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysCurdDemo() ISysCurdDemo {
 | 
			
		||||
	if localSysCurdDemo == nil {
 | 
			
		||||
		panic("implement not found for interface ISysCurdDemo, forgot register?")
 | 
			
		||||
func SysEmployeeBase() ISysEmployeeBase {
 | 
			
		||||
	if localSysEmployeeBase == nil {
 | 
			
		||||
		panic("implement not found for interface ISysEmployeeBase, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysCurdDemo
 | 
			
		||||
	return localSysEmployeeBase
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysCurdDemo(i ISysCurdDemo) {
 | 
			
		||||
	localSysCurdDemo = i
 | 
			
		||||
func RegisterSysEmployeeBase(i ISysEmployeeBase) {
 | 
			
		||||
	localSysEmployeeBase = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysLoginLog() ISysLoginLog {
 | 
			
		||||
@@ -280,50 +268,6 @@ func RegisterSysLoginLog(i ISysLoginLog) {
 | 
			
		||||
	localSysLoginLog = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysProvinces() ISysProvinces {
 | 
			
		||||
	if localSysProvinces == nil {
 | 
			
		||||
		panic("implement not found for interface ISysProvinces, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysProvinces
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysProvinces(i ISysProvinces) {
 | 
			
		||||
	localSysProvinces = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysCron() ISysCron {
 | 
			
		||||
	if localSysCron == nil {
 | 
			
		||||
		panic("implement not found for interface ISysCron, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysCron
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysCron(i ISysCron) {
 | 
			
		||||
	localSysCron = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysCronGroup() ISysCronGroup {
 | 
			
		||||
	if localSysCronGroup == nil {
 | 
			
		||||
		panic("implement not found for interface ISysCronGroup, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysCronGroup
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysCronGroup(i ISysCronGroup) {
 | 
			
		||||
	localSysCronGroup = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysEmsLog() ISysEmsLog {
 | 
			
		||||
	if localSysEmsLog == nil {
 | 
			
		||||
		panic("implement not found for interface ISysEmsLog, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysEmsLog
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysEmsLog(i ISysEmsLog) {
 | 
			
		||||
	localSysEmsLog = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysAddons() ISysAddons {
 | 
			
		||||
	if localSysAddons == nil {
 | 
			
		||||
		panic("implement not found for interface ISysAddons, forgot register?")
 | 
			
		||||
@@ -335,6 +279,28 @@ func RegisterSysAddons(i ISysAddons) {
 | 
			
		||||
	localSysAddons = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysConfig() ISysConfig {
 | 
			
		||||
	if localSysConfig == nil {
 | 
			
		||||
		panic("implement not found for interface ISysConfig, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysConfig
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysConfig(i ISysConfig) {
 | 
			
		||||
	localSysConfig = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysDictType() ISysDictType {
 | 
			
		||||
	if localSysDictType == nil {
 | 
			
		||||
		panic("implement not found for interface ISysDictType, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysDictType
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysDictType(i ISysDictType) {
 | 
			
		||||
	localSysDictType = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysGenCodes() ISysGenCodes {
 | 
			
		||||
	if localSysGenCodes == nil {
 | 
			
		||||
		panic("implement not found for interface ISysGenCodes, forgot register?")
 | 
			
		||||
@@ -346,6 +312,28 @@ func RegisterSysGenCodes(i ISysGenCodes) {
 | 
			
		||||
	localSysGenCodes = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysProvinces() ISysProvinces {
 | 
			
		||||
	if localSysProvinces == nil {
 | 
			
		||||
		panic("implement not found for interface ISysProvinces, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysProvinces
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysProvinces(i ISysProvinces) {
 | 
			
		||||
	localSysProvinces = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysServeLog() ISysServeLog {
 | 
			
		||||
	if localSysServeLog == nil {
 | 
			
		||||
		panic("implement not found for interface ISysServeLog, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysServeLog
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysServeLog(i ISysServeLog) {
 | 
			
		||||
	localSysServeLog = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysSmsLog() ISysSmsLog {
 | 
			
		||||
	if localSysSmsLog == nil {
 | 
			
		||||
		panic("implement not found for interface ISysSmsLog, forgot register?")
 | 
			
		||||
@@ -357,17 +345,6 @@ func RegisterSysSmsLog(i ISysSmsLog) {
 | 
			
		||||
	localSysSmsLog = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysAddonsConfig() ISysAddonsConfig {
 | 
			
		||||
	if localSysAddonsConfig == nil {
 | 
			
		||||
		panic("implement not found for interface ISysAddonsConfig, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysAddonsConfig
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysAddonsConfig(i ISysAddonsConfig) {
 | 
			
		||||
	localSysAddonsConfig = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysAttachment() ISysAttachment {
 | 
			
		||||
	if localSysAttachment == nil {
 | 
			
		||||
		panic("implement not found for interface ISysAttachment, forgot register?")
 | 
			
		||||
@@ -379,13 +356,57 @@ func RegisterSysAttachment(i ISysAttachment) {
 | 
			
		||||
	localSysAttachment = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysServeLog() ISysServeLog {
 | 
			
		||||
	if localSysServeLog == nil {
 | 
			
		||||
		panic("implement not found for interface ISysServeLog, forgot register?")
 | 
			
		||||
func SysDictData() ISysDictData {
 | 
			
		||||
	if localSysDictData == nil {
 | 
			
		||||
		panic("implement not found for interface ISysDictData, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysServeLog
 | 
			
		||||
	return localSysDictData
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysServeLog(i ISysServeLog) {
 | 
			
		||||
	localSysServeLog = i
 | 
			
		||||
func RegisterSysDictData(i ISysDictData) {
 | 
			
		||||
	localSysDictData = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysLog() ISysLog {
 | 
			
		||||
	if localSysLog == nil {
 | 
			
		||||
		panic("implement not found for interface ISysLog, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysLog
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysLog(i ISysLog) {
 | 
			
		||||
	localSysLog = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysCron() ISysCron {
 | 
			
		||||
	if localSysCron == nil {
 | 
			
		||||
		panic("implement not found for interface ISysCron, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysCron
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysCron(i ISysCron) {
 | 
			
		||||
	localSysCron = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysCurdDemo() ISysCurdDemo {
 | 
			
		||||
	if localSysCurdDemo == nil {
 | 
			
		||||
		panic("implement not found for interface ISysCurdDemo, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysCurdDemo
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysCurdDemo(i ISysCurdDemo) {
 | 
			
		||||
	localSysCurdDemo = i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SysEmsLog() ISysEmsLog {
 | 
			
		||||
	if localSysEmsLog == nil {
 | 
			
		||||
		panic("implement not found for interface ISysEmsLog, forgot register?")
 | 
			
		||||
	}
 | 
			
		||||
	return localSysEmsLog
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RegisterSysEmsLog(i ISysEmsLog) {
 | 
			
		||||
	localSysEmsLog = i
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ type (
 | 
			
		||||
	ITCPAuth interface {
 | 
			
		||||
		Start(ctx context.Context)
 | 
			
		||||
		Stop(ctx context.Context)
 | 
			
		||||
		IsLogin() bool
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
-- https://www.phpmyadmin.net/
 | 
			
		||||
--
 | 
			
		||||
-- 主机: localhost:3306
 | 
			
		||||
-- 生成日期: 2023-03-13 16:58:42
 | 
			
		||||
-- 生成日期: 2023-03-16 15:25:23
 | 
			
		||||
-- 服务器版本: 5.7.38-log
 | 
			
		||||
-- PHP 版本: 5.6.40
 | 
			
		||||
 | 
			
		||||
@@ -155,7 +155,7 @@ CREATE TABLE `hg_admin_member` (
 | 
			
		||||
--
 | 
			
		||||
 | 
			
		||||
INSERT INTO `hg_admin_member` (`id`, `dept_id`, `role_id`, `real_name`, `username`, `password_hash`, `salt`, `auth_key`, `password_reset_token`, `balance`, `avatar`, `sex`, `qq`, `email`, `mobile`, `birthday`, `city_id`, `address`, `pid`, `level`, `tree`, `cash`, `last_active_at`, `remark`, `status`, `created_at`, `updated_at`) VALUES
 | 
			
		||||
(1, 100, 1, '孟帅', 'admin', 'a7c588fffeb2c1d99b29879d7fe97c78', '6541561', '58d8b63af5f7fccd87b052539c0a090e', '', '0.00', 'http://bufanyun.cn-bj.ufileos.com/hotgo/attachment/2023-02-09/cqdq8er9nfkchdopav.png', 1, '133814250', '133814250@qq.com', '15303830571', '2016-04-16', 410172, '莲花街001号', 0, 1, '', '{\"name\": \"孟帅\", \"account\": \"15303830571\", \"payeeCode\": \"http://bufanyun.cn-bj.ufileos.com/hotgo/attachment/2023-02-09/cqdq8mqal5isvcb58g.jpg\"}', '2023-03-11 16:55:34', NULL, 1, '2021-02-12 17:59:45', '2023-03-11 16:55:33'),
 | 
			
		||||
(1, 100, 1, '孟帅', 'admin', 'a7c588fffeb2c1d99b29879d7fe97c78', '6541561', '799923d21be374d4fa9a0775eb24ca86', '', '0.00', 'http://bufanyun.cn-bj.ufileos.com/hotgo/attachment/2023-02-09/cqdq8er9nfkchdopav.png', 1, '133814250', '133814250@qq.com', '15303830571', '2016-04-16', 410172, '莲花街001号', 0, 1, '', '{\"name\": \"孟帅\", \"account\": \"15303830571\", \"payeeCode\": \"http://bufanyun.cn-bj.ufileos.com/hotgo/attachment/2023-02-09/cqdq8mqal5isvcb58g.jpg\"}', '2023-03-16 15:21:02', NULL, 1, '2021-02-12 17:59:45', '2023-03-16 15:21:01'),
 | 
			
		||||
(3, 100, 2, '测试账号', 'test', 'a7c588fffeb2c1d99b29879d7fe97c78', '6541561', '2c7db9eca4ed02a718e794ba4c904f56', '', '0.00', 'http://alioss.qvnidaye.com//images/2021/03/12/image_1615529198_vMK4kwq2.jpg', 1, '', 'c@qq.cc', '15303888888', '2016-04-13', 371100, '大潮街道666号', 1, 2, 'tr_1 ', NULL, NULL, '', 1, '2022-02-11 17:59:45', '2023-01-10 16:47:00'),
 | 
			
		||||
(8, 105, 206, 'ameng', 'ameng', '4501790a9b89f4e66f4417c899836511', 'hfuUEb', '0d796b377f77f1e1d42278eedbab6110', '', '0.00', '', 1, '', '', '', NULL, 0, '', 1, 2, 'tr_1 ', NULL, '2023-03-05 15:25:49', '', 1, '2023-02-03 17:34:31', '2023-02-26 00:31:13');
 | 
			
		||||
 | 
			
		||||
@@ -177,10 +177,7 @@ CREATE TABLE `hg_admin_member_post` (
 | 
			
		||||
INSERT INTO `hg_admin_member_post` (`member_id`, `post_id`) VALUES
 | 
			
		||||
(1, 1),
 | 
			
		||||
(3, 4),
 | 
			
		||||
(7, 3),
 | 
			
		||||
(7, 4),
 | 
			
		||||
(8, 2),
 | 
			
		||||
(9, 3);
 | 
			
		||||
(8, 2);
 | 
			
		||||
 | 
			
		||||
-- --------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@@ -5041,8 +5038,9 @@ CREATE TABLE `hg_sys_serve_license` (
 | 
			
		||||
  `appid` varchar(64) NOT NULL COMMENT '应用ID',
 | 
			
		||||
  `secret_key` varchar(255) DEFAULT NULL COMMENT '应用秘钥',
 | 
			
		||||
  `desc` text COMMENT '授权说明',
 | 
			
		||||
  `remote_addr` varchar(64) DEFAULT NULL COMMENT '连接地址',
 | 
			
		||||
  `online` tinyint(4) DEFAULT '0' COMMENT '是否在线',
 | 
			
		||||
  `remote_addr` varchar(64) DEFAULT NULL COMMENT '最后连接地址',
 | 
			
		||||
  `online` tinyint(4) DEFAULT '0' COMMENT '在线数量',
 | 
			
		||||
  `online_limit` int(11) DEFAULT '1' COMMENT '在线数量限制,默认1',
 | 
			
		||||
  `login_times` bigint(20) DEFAULT NULL COMMENT '登录次数',
 | 
			
		||||
  `last_login_at` datetime DEFAULT NULL COMMENT '最后登录时间',
 | 
			
		||||
  `last_active_at` datetime DEFAULT NULL COMMENT '最后活跃时间',
 | 
			
		||||
@@ -5059,10 +5057,10 @@ CREATE TABLE `hg_sys_serve_license` (
 | 
			
		||||
-- 转存表中的数据 `hg_sys_serve_license`
 | 
			
		||||
--
 | 
			
		||||
 | 
			
		||||
INSERT INTO `hg_sys_serve_license` (`id`, `group`, `name`, `appid`, `secret_key`, `desc`, `remote_addr`, `online`, `login_times`, `last_login_at`, `last_active_at`, `routes`, `allowed_ips`, `end_at`, `remark`, `status`, `created_at`, `updated_at`) VALUES
 | 
			
		||||
(1, 'queue', '默认的消息队列', '1001', 'hotgo', '这是默认的消息队列TCP客户端授权凭证。', NULL, 0, 1, '2023-03-23 00:00:00', NULL, NULL, '127.0.0.1', '2033-03-09 00:00:00', '', 1, '2023-03-11 00:00:00', '2023-03-05 00:00:00'),
 | 
			
		||||
(2, 'cron', '默认的定时任务', '1002', 'hotgo', '这是默认的定时任务TCP客户端授权凭证。', NULL, 0, 1, '2023-03-23 00:00:00', NULL, NULL, '127.0.0.1', '2033-03-09 00:00:00', '', 1, '2023-03-11 00:00:00', '2023-03-05 00:00:00'),
 | 
			
		||||
(3, 'auth', '测试授权', 'mengshuai', '123456', '这是一个测试的授权服务,可以为第三方平台提供授权支持。', '127.0.0.1:54182', 1, 20, '2023-03-13 16:01:02', '2023-03-13 16:57:04', NULL, '127.0.0.1', '2033-03-09 00:00:00', '', 1, '2023-03-11 00:00:00', '2023-03-13 16:57:03');
 | 
			
		||||
INSERT INTO `hg_sys_serve_license` (`id`, `group`, `name`, `appid`, `secret_key`, `desc`, `remote_addr`, `online`, `online_limit`, `login_times`, `last_login_at`, `last_active_at`, `routes`, `allowed_ips`, `end_at`, `remark`, `status`, `created_at`, `updated_at`) VALUES
 | 
			
		||||
(1, 'queue', '默认的消息队列', '1001', 'hotgo', '这是默认的消息队列TCP客户端授权凭证。', NULL, 0, 1, 1, '2023-03-23 00:00:00', NULL, NULL, '127.0.0.1', '2033-03-09 00:00:00', '', 1, '2023-03-11 00:00:00', '2023-03-05 00:00:00'),
 | 
			
		||||
(2, 'cron', '默认的定时任务', '1002', 'hotgo', '这是默认的定时任务TCP客户端授权凭证。', NULL, 0, 1, 1, '2023-03-23 00:00:00', NULL, NULL, '127.0.0.1', '2033-03-09 00:00:00', '', 1, '2023-03-11 00:00:00', '2023-03-05 00:00:00'),
 | 
			
		||||
(3, 'auth', '测试授权', 'mengshuai', '123456', '这是一个测试的授权服务,可以为第三方平台提供授权支持。', '127.0.0.1:54182', 1, 1, 20, '2023-03-13 16:01:02', '2023-03-13 17:15:04', NULL, '127.0.0.1', '2033-03-09 00:00:00', '', 1, '2023-03-11 00:00:00', '2023-03-13 17:15:03');
 | 
			
		||||
 | 
			
		||||
-- --------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@@ -5387,13 +5385,13 @@ ALTER TABLE `hg_admin_dept`
 | 
			
		||||
-- 使用表AUTO_INCREMENT `hg_admin_member`
 | 
			
		||||
--
 | 
			
		||||
ALTER TABLE `hg_admin_member`
 | 
			
		||||
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '管理员ID', AUTO_INCREMENT=9;
 | 
			
		||||
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '管理员ID', AUTO_INCREMENT=10;
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
-- 使用表AUTO_INCREMENT `hg_admin_menu`
 | 
			
		||||
--
 | 
			
		||||
ALTER TABLE `hg_admin_menu`
 | 
			
		||||
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单ID', AUTO_INCREMENT=2232;
 | 
			
		||||
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单ID', AUTO_INCREMENT=2253;
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
-- 使用表AUTO_INCREMENT `hg_admin_notice`
 | 
			
		||||
@@ -5489,7 +5487,7 @@ ALTER TABLE `hg_sys_ems_log`
 | 
			
		||||
-- 使用表AUTO_INCREMENT `hg_sys_gen_codes`
 | 
			
		||||
--
 | 
			
		||||
ALTER TABLE `hg_sys_gen_codes`
 | 
			
		||||
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '生成ID', AUTO_INCREMENT=5;
 | 
			
		||||
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '生成ID', AUTO_INCREMENT=8;
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
-- 使用表AUTO_INCREMENT `hg_sys_gen_curd_demo`
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "hotgo",
 | 
			
		||||
  "version": "2.4.2",
 | 
			
		||||
  "version": "2.4.4",
 | 
			
		||||
  "author": {
 | 
			
		||||
    "name": "MengShuai",
 | 
			
		||||
    "email": "133814250@qq.com",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user