mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-09-17 08:46:39 +08:00
Compare commits
6 Commits
530a1b1f74
...
4fce189087
Author | SHA1 | Date | |
---|---|---|---|
|
4fce189087 | ||
|
7957371a6c | ||
|
e0d9279685 | ||
|
a57f148cd2 | ||
|
f18ce6384b | ||
|
2a87055b62 |
@ -65,5 +65,31 @@ Error: connect ECONNREFUSED ::1:8000
|
||||
- 服务端没有启动
|
||||
- `.\wen\.env.development`中的`VITE_PROXY`配置的服务器地址或端口与实际不一致
|
||||
|
||||
### 四、Debug相关
|
||||
|
||||
如果Debug不能正常运行,请手动更换Goland调试工具路径
|
||||
|
||||
首先安装GO最新调试工具(注意是master分支)
|
||||
```shell
|
||||
go install github.com/go-delve/delve/cmd/dlv@master
|
||||
```
|
||||
或
|
||||
```shell
|
||||
git clone https://github.com/go-delve/delve
|
||||
cd delve
|
||||
go install github.com/go-delve/delve/cmd/dlv
|
||||
```
|
||||
依次打开Goland对应配置
|
||||
```text
|
||||
Toolbar->Help->Edit Customer Properties
|
||||
```
|
||||
```properties
|
||||
dlv.path=/${your path}/go/bin/dlv
|
||||
```
|
||||
重启Goland
|
||||
|
||||
- 服务端没有启动
|
||||
- `.\wen\.env.development`中的`VITE_PROXY`配置的服务器地址或端口与实际不一致
|
||||
|
||||
|
||||
|
||||
|
@ -29,7 +29,7 @@ func init() {
|
||||
func (s *sSysIndex) Test(ctx context.Context, in *sysin.IndexTestInp) (res *sysin.IndexTestModel, err error) {
|
||||
res = new(sysin.IndexTestModel)
|
||||
res.Name = in.Name
|
||||
res.Module = fmt.Sprintf("当前插件模块是:%s,当前应用模块是:%s", global.GetSkeleton().Name, contexts.Get(ctx).Module)
|
||||
res.Module = fmt.Sprintf("当前插件模块是:%s,当前应用模块是:%s", global.GetSkeleton().Name, contexts.Get[any](ctx).Module)
|
||||
res.Time = gtime.Now()
|
||||
return
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ func (s *sSysTable) Export(ctx context.Context, in *sysin.TableListInp) (err err
|
||||
return
|
||||
}
|
||||
|
||||
if err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName); err != nil {
|
||||
if err = excel.ExportByStructs[any](ctx, tags, exports, fileName, sheetName); err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
@ -143,7 +143,7 @@ func (s *sSysTable) Edit(ctx context.Context, in *sysin.TableEditInp) (err error
|
||||
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
in.UpdatedBy = contexts.GetUserId(ctx)
|
||||
in.UpdatedBy = contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "修改表格失败,请稍后重试!")
|
||||
return
|
||||
@ -152,7 +152,7 @@ func (s *sSysTable) Edit(ctx context.Context, in *sysin.TableEditInp) (err error
|
||||
}
|
||||
|
||||
// 新增
|
||||
in.CreatedBy = contexts.GetUserId(ctx)
|
||||
in.CreatedBy = contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).Data(in).OmitEmptyData().Insert(); err != nil {
|
||||
err = gerror.Wrap(err, "新增表格失败,请稍后重试!")
|
||||
return
|
||||
@ -173,7 +173,7 @@ func (s *sSysTable) Delete(ctx context.Context, in *sysin.TableDeleteInp) (err e
|
||||
func (s *sSysTable) Status(ctx context.Context, in *sysin.TableStatusInp) (err error) {
|
||||
update := g.Map{
|
||||
dao.AddonHgexampleTable.Columns().Status: in.Status,
|
||||
dao.AddonHgexampleTable.Columns().UpdatedBy: contexts.GetUserId(ctx),
|
||||
dao.AddonHgexampleTable.Columns().UpdatedBy: contexts.GetUserId[any](ctx),
|
||||
}
|
||||
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Data(update).Update(); err != nil {
|
||||
@ -197,7 +197,7 @@ func (s *sSysTable) Switch(ctx context.Context, in *sysin.TableSwitchInp) (err e
|
||||
|
||||
update := g.Map{
|
||||
in.Key: in.Value,
|
||||
dao.AddonHgexampleTable.Columns().UpdatedBy: contexts.GetUserId(ctx),
|
||||
dao.AddonHgexampleTable.Columns().UpdatedBy: contexts.GetUserId[any](ctx),
|
||||
}
|
||||
|
||||
if _, err = s.Model(ctx).Where(dao.AddonHgexampleTable.Columns().Id, in.Id).Data(update).Update(); err != nil {
|
||||
|
@ -126,7 +126,7 @@ func (s *sSysTenantOrder) Export(ctx context.Context, in *sysin.TenantOrderListI
|
||||
return
|
||||
}
|
||||
|
||||
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
|
||||
err = excel.ExportByStructs[any](ctx, tags, exports, fileName, sheetName)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -118,13 +118,13 @@ func (s *sSysTreeTable) Edit(ctx context.Context, in *sysin.TableEditInp) (err e
|
||||
}
|
||||
|
||||
if in.Id > 0 {
|
||||
in.UpdatedBy = contexts.GetUserId(ctx)
|
||||
in.UpdatedBy = contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "修改表格失败,请稍后重试!")
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
in.CreatedBy = contexts.GetUserId(ctx)
|
||||
in.CreatedBy = contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).Data(in).OmitEmptyData().Insert(); err != nil {
|
||||
err = gerror.Wrap(err, "新增表格失败,请稍后重试!")
|
||||
return err
|
||||
|
@ -1,6 +1,6 @@
|
||||
module hotgo
|
||||
|
||||
go 1.23.0
|
||||
go 1.23.1
|
||||
|
||||
require (
|
||||
github.com/IBM/sarama v1.43.3
|
||||
@ -14,10 +14,10 @@ require (
|
||||
github.com/forgoer/openssl v1.6.0
|
||||
github.com/go-pay/crypto v0.0.1
|
||||
github.com/go-pay/gopay v1.5.104
|
||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.2
|
||||
github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.2
|
||||
github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.2
|
||||
github.com/gogf/gf/v2 v2.7.2
|
||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.3
|
||||
github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.3
|
||||
github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.3
|
||||
github.com/gogf/gf/v2 v2.7.3
|
||||
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1
|
||||
github.com/gorilla/websocket v1.5.3
|
||||
|
@ -162,14 +162,14 @@ github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PU
|
||||
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
||||
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
|
||||
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
|
||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.2 h1:GpE2JuHVoNJD4lNP1omC1+TKXNCSvXr5oil1bNULYd0=
|
||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.2/go.mod h1:0h3UmNAmA8hnjvTyozZelSWWxiAjGDQttzZqMhkCkJo=
|
||||
github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.2 h1:V1hdGnyjU9kT0I3DDDFDl6Ll8yC6aAIFJa/lMQwB8V4=
|
||||
github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.2/go.mod h1:XzkPv3G8TdKczqoB/ydR3bxvBRdQLQNCOCEgxso/c3o=
|
||||
github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.2 h1:YKMJMhJJjbaPhgjpH9veZpn80mwkPgPAIatSvUFTt38=
|
||||
github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.2/go.mod h1:kzxWAaY5Livk2SNPNrs9PJJvxK8A7uVwd8UGwjdMEfU=
|
||||
github.com/gogf/gf/v2 v2.7.2 h1:uZDfyblasI12lZUtFd1mfxsIr8b14cd/F88DJUTCSDM=
|
||||
github.com/gogf/gf/v2 v2.7.2/go.mod h1:EBXneAg/wes86rfeh68XC0a2JBNQylmT7Sp6/8Axk88=
|
||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.3 h1:VvDrsKuKa2obtMqbmdGt73YOpnDCiZ+dPcHfKtdcHLE=
|
||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.7.3/go.mod h1:WsLwt84iuBi2e+RVWb65yfyaaYxGWCtpqOoviH2JpIA=
|
||||
github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.3 h1:DUnJFoxLgOMmUjbybZ6X7x9G3vS8eujq5hbnBMTSyLs=
|
||||
github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.3/go.mod h1:3GNHVmnA/dnTsMFOWQw65AsFTJBHI9xpIUc4lwyPNig=
|
||||
github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.3 h1:Zf+ZdgeB5rQeH4SGaM6XVwsZ3hnzTIDgY1/iTdQzzcg=
|
||||
github.com/gogf/gf/contrib/trace/jaeger/v2 v2.7.3/go.mod h1:VLaGqNbTiEh21qvBz9XHJj8vbOpCWC38i885+6bX+y8=
|
||||
github.com/gogf/gf/v2 v2.7.3 h1:0RTqeDYJOrD/FpiSsEopTs5SvYg+u6WPtS0TaXJcGoQ=
|
||||
github.com/gogf/gf/v2 v2.7.3/go.mod h1:EBXneAg/wes86rfeh68XC0a2JBNQylmT7Sp6/8Axk88=
|
||||
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f h1:7xfXR/BhG3JDqO1s45n65Oyx9t4E/UqDOXep6jXdLCM=
|
||||
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f/go.mod h1:HnYoio6S7VaFJdryKcD/r9HgX+4QzYfr00XiXUo/xz0=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
|
||||
|
@ -48,7 +48,7 @@ func (c *cCash) List(ctx context.Context, req *cash.ListReq) (res *cash.ListRes,
|
||||
func (c *cCash) Apply(ctx context.Context, req *cash.ApplyReq) (res *cash.ApplyRes, err error) {
|
||||
err = service.AdminCash().Apply(ctx, &adminin.CashApplyInp{
|
||||
Money: req.Money,
|
||||
MemberId: contexts.GetUserId(ctx),
|
||||
MemberId: contexts.GetUserId[any](ctx),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ func (c *cMember) UpdateProfile(ctx context.Context, req *member.UpdateProfileRe
|
||||
|
||||
// UpdatePwd 修改登录密码
|
||||
func (c *cMember) UpdatePwd(ctx context.Context, req *member.UpdatePwdReq) (res *member.UpdatePwdRes, err error) {
|
||||
var memberId = contexts.Get(ctx).User.Id
|
||||
var memberId = contexts.Get[any](ctx).User.Id
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
|
@ -46,7 +46,7 @@ func (c *cRole) Delete(ctx context.Context, req *role.DeleteReq) (res *role.Dele
|
||||
|
||||
// Dynamic 动态路由
|
||||
func (c *cRole) Dynamic(ctx context.Context, _ *role.DynamicReq) (res *role.DynamicRes, err error) {
|
||||
return service.AdminMenu().GetMenuList(ctx, contexts.GetUserId(ctx))
|
||||
return service.AdminMenu().GetMenuList(ctx, contexts.GetUserId[any](ctx))
|
||||
}
|
||||
|
||||
// GetPermissions 获取指定角色权限
|
||||
|
@ -44,7 +44,7 @@ func (c *cEms) SendTest(ctx context.Context, req *common.SendTestEmailReq) (res
|
||||
// SendBindEms 发送换绑邮件
|
||||
func (c *cEms) SendBindEms(ctx context.Context, _ *common.SendBindEmsReq) (res *common.SendBindEmsRes, err error) {
|
||||
var (
|
||||
memberId = contexts.GetUserId(ctx)
|
||||
memberId = contexts.GetUserId[any](ctx)
|
||||
models *entity.AdminMember
|
||||
)
|
||||
|
||||
|
@ -143,6 +143,6 @@ func (c *cSite) MobileLogin(ctx context.Context, req *common.MobileLoginReq) (re
|
||||
|
||||
// Logout 注销登录
|
||||
func (c *cSite) Logout(ctx context.Context, _ *common.LoginLogoutReq) (res *common.LoginLogoutRes, err error) {
|
||||
err = token.Logout(ghttp.RequestFromCtx(ctx))
|
||||
err = token.Logout[any](ghttp.RequestFromCtx(ctx))
|
||||
return
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ func (c *cSms) SendTest(ctx context.Context, req *common.SendTestSmsReq) (res *c
|
||||
// SendBindSms 发送换绑短信
|
||||
func (c *cSms) SendBindSms(ctx context.Context, _ *common.SendBindSmsReq) (res *common.SendBindSmsRes, err error) {
|
||||
var (
|
||||
memberId = contexts.GetUserId(ctx)
|
||||
memberId = contexts.GetUserId[any](ctx)
|
||||
models *entity.AdminMember
|
||||
)
|
||||
|
||||
|
@ -14,25 +14,25 @@ import (
|
||||
)
|
||||
|
||||
// Init 初始化上下文对象指针到上下文对象中,以便后续的请求流程中可以修改
|
||||
func Init(r *ghttp.Request, customCtx *model.Context) {
|
||||
func Init[T any](r *ghttp.Request, customCtx *model.Context[T]) {
|
||||
r.SetCtxVar(consts.ContextHTTPKey, customCtx)
|
||||
}
|
||||
|
||||
// Get 获得上下文变量,如果没有设置,那么返回nil
|
||||
func Get(ctx context.Context) *model.Context {
|
||||
func Get[T any](ctx context.Context) *model.Context[T] {
|
||||
value := ctx.Value(consts.ContextHTTPKey)
|
||||
if value == nil {
|
||||
return nil
|
||||
}
|
||||
if localCtx, ok := value.(*model.Context); ok {
|
||||
if localCtx, ok := value.(*model.Context[T]); ok {
|
||||
return localCtx
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetUser 将上下文信息设置到上下文请求中,注意是完整覆盖
|
||||
func SetUser(ctx context.Context, user *model.Identity) {
|
||||
c := Get(ctx)
|
||||
func SetUser[T any](ctx context.Context, user *model.Identity) {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
g.Log().Warning(ctx, "contexts.SetUser, c == nil ")
|
||||
return
|
||||
@ -41,8 +41,8 @@ func SetUser(ctx context.Context, user *model.Identity) {
|
||||
}
|
||||
|
||||
// SetResponse 设置组件响应 用于访问日志使用
|
||||
func SetResponse(ctx context.Context, response *model.Response) {
|
||||
c := Get(ctx)
|
||||
func SetResponse[T any](ctx context.Context, response *model.Response[T]) {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
g.Log().Warning(ctx, "contexts.SetResponse, c == nil ")
|
||||
return
|
||||
@ -51,8 +51,8 @@ func SetResponse(ctx context.Context, response *model.Response) {
|
||||
}
|
||||
|
||||
// SetModule 设置应用模块
|
||||
func SetModule(ctx context.Context, module string) {
|
||||
c := Get(ctx)
|
||||
func SetModule[T any](ctx context.Context, module string) {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
g.Log().Warning(ctx, "contexts.SetModule, c == nil ")
|
||||
return
|
||||
@ -61,8 +61,8 @@ func SetModule(ctx context.Context, module string) {
|
||||
}
|
||||
|
||||
// GetUser 获取用户信息
|
||||
func GetUser(ctx context.Context) *model.Identity {
|
||||
c := Get(ctx)
|
||||
func GetUser[T any](ctx context.Context) *model.Identity {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
return nil
|
||||
}
|
||||
@ -70,8 +70,8 @@ func GetUser(ctx context.Context) *model.Identity {
|
||||
}
|
||||
|
||||
// GetUserId 获取用户ID
|
||||
func GetUserId(ctx context.Context) int64 {
|
||||
user := GetUser(ctx)
|
||||
func GetUserId[T any](ctx context.Context) int64 {
|
||||
user := GetUser[T](ctx)
|
||||
if user == nil {
|
||||
return 0
|
||||
}
|
||||
@ -79,8 +79,8 @@ func GetUserId(ctx context.Context) int64 {
|
||||
}
|
||||
|
||||
// GetRoleId 获取用户角色ID
|
||||
func GetRoleId(ctx context.Context) int64 {
|
||||
user := GetUser(ctx)
|
||||
func GetRoleId[T any](ctx context.Context) int64 {
|
||||
user := GetUser[T](ctx)
|
||||
if user == nil {
|
||||
return 0
|
||||
}
|
||||
@ -88,8 +88,8 @@ func GetRoleId(ctx context.Context) int64 {
|
||||
}
|
||||
|
||||
// GetRoleKey 获取用户角色唯一编码
|
||||
func GetRoleKey(ctx context.Context) string {
|
||||
user := GetUser(ctx)
|
||||
func GetRoleKey[T any](ctx context.Context) string {
|
||||
user := GetUser[T](ctx)
|
||||
if user == nil {
|
||||
return ""
|
||||
}
|
||||
@ -97,8 +97,8 @@ func GetRoleKey(ctx context.Context) string {
|
||||
}
|
||||
|
||||
// GetDeptType 获取用户部门类型
|
||||
func GetDeptType(ctx context.Context) string {
|
||||
user := GetUser(ctx)
|
||||
func GetDeptType[T any](ctx context.Context) string {
|
||||
user := GetUser[T](ctx)
|
||||
if user == nil {
|
||||
return ""
|
||||
}
|
||||
@ -106,28 +106,28 @@ func GetDeptType(ctx context.Context) string {
|
||||
}
|
||||
|
||||
// IsCompanyDept 是否为公司部门
|
||||
func IsCompanyDept(ctx context.Context) bool {
|
||||
return GetDeptType(ctx) == consts.DeptTypeCompany
|
||||
func IsCompanyDept[T any](ctx context.Context) bool {
|
||||
return GetDeptType[T](ctx) == consts.DeptTypeCompany
|
||||
}
|
||||
|
||||
// IsTenantDept 是否为租户部门
|
||||
func IsTenantDept(ctx context.Context) bool {
|
||||
return GetDeptType(ctx) == consts.DeptTypeTenant
|
||||
func IsTenantDept[T any](ctx context.Context) bool {
|
||||
return GetDeptType[T](ctx) == consts.DeptTypeTenant
|
||||
}
|
||||
|
||||
// IsMerchantDept 是否为商户部门
|
||||
func IsMerchantDept(ctx context.Context) bool {
|
||||
return GetDeptType(ctx) == consts.DeptTypeMerchant
|
||||
func IsMerchantDept[T any](ctx context.Context) bool {
|
||||
return GetDeptType[T](ctx) == consts.DeptTypeMerchant
|
||||
}
|
||||
|
||||
// IsUserDept 是否为普通用户部门
|
||||
func IsUserDept(ctx context.Context) bool {
|
||||
return GetDeptType(ctx) == consts.DeptTypeUser
|
||||
func IsUserDept[T any](ctx context.Context) bool {
|
||||
return GetDeptType[T](ctx) == consts.DeptTypeUser
|
||||
}
|
||||
|
||||
// GetModule 获取应用模块
|
||||
func GetModule(ctx context.Context) string {
|
||||
c := Get(ctx)
|
||||
func GetModule[T any](ctx context.Context) string {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
return ""
|
||||
}
|
||||
@ -135,59 +135,59 @@ func GetModule(ctx context.Context) string {
|
||||
}
|
||||
|
||||
// SetAddonName 设置插件信息
|
||||
func SetAddonName(ctx context.Context, name string) {
|
||||
c := Get(ctx)
|
||||
func SetAddonName[T any](ctx context.Context, name string) {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
g.Log().Warning(ctx, "contexts.SetAddonName, c == nil ")
|
||||
return
|
||||
}
|
||||
Get(ctx).AddonName = name
|
||||
Get[T](ctx).AddonName = name
|
||||
}
|
||||
|
||||
// IsAddonRequest 是否为插件模块请求
|
||||
func IsAddonRequest(ctx context.Context) bool {
|
||||
c := Get(ctx)
|
||||
func IsAddonRequest[T any](ctx context.Context) bool {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
return false
|
||||
}
|
||||
return GetAddonName(ctx) != ""
|
||||
return GetAddonName[T](ctx) != ""
|
||||
}
|
||||
|
||||
// GetAddonName 获取插件信息
|
||||
func GetAddonName(ctx context.Context) string {
|
||||
c := Get(ctx)
|
||||
func GetAddonName[T any](ctx context.Context) string {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
return ""
|
||||
}
|
||||
return Get(ctx).AddonName
|
||||
return Get[T](ctx).AddonName
|
||||
}
|
||||
|
||||
// SetData 设置额外数据
|
||||
func SetData(ctx context.Context, k string, v interface{}) {
|
||||
c := Get(ctx)
|
||||
func SetData[T any](ctx context.Context, k string, v interface{}) {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
g.Log().Warning(ctx, "contexts.SetData, c == nil ")
|
||||
return
|
||||
}
|
||||
Get(ctx).Data[k] = v
|
||||
Get[T](ctx).Data[k] = v
|
||||
}
|
||||
|
||||
// SetDataMap 设置额外数据
|
||||
func SetDataMap(ctx context.Context, vs g.Map) {
|
||||
c := Get(ctx)
|
||||
func SetDataMap[T any](ctx context.Context, vs g.Map) {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
g.Log().Warning(ctx, "contexts.SetData, c == nil ")
|
||||
return
|
||||
}
|
||||
|
||||
for k, v := range vs {
|
||||
Get(ctx).Data[k] = v
|
||||
Get[T](ctx).Data[k] = v
|
||||
}
|
||||
}
|
||||
|
||||
// GetData 获取额外数据
|
||||
func GetData(ctx context.Context) g.Map {
|
||||
c := Get(ctx)
|
||||
func GetData[T any](ctx context.Context) g.Map {
|
||||
c := Get[T](ctx)
|
||||
if c == nil {
|
||||
return nil
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ import (
|
||||
|
||||
// FilterAuth 过滤数据权限
|
||||
// 通过上下文中的用户角色权限和表中是否含有需要过滤的字段附加查询条件
|
||||
func FilterAuth(m *gdb.Model) *gdb.Model {
|
||||
func FilterAuth[T any](m *gdb.Model) *gdb.Model {
|
||||
var (
|
||||
needAuth bool
|
||||
filterField string
|
||||
@ -40,16 +40,16 @@ func FilterAuth(m *gdb.Model) *gdb.Model {
|
||||
if !needAuth {
|
||||
return m
|
||||
}
|
||||
return m.Handler(FilterAuthWithField(filterField))
|
||||
return m.Handler(FilterAuthWithField[T](filterField))
|
||||
}
|
||||
|
||||
// FilterAuthWithField 过滤数据权限,设置指定字段
|
||||
func FilterAuthWithField(filterField string) func(m *gdb.Model) *gdb.Model {
|
||||
func FilterAuthWithField[T any](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)
|
||||
co = contexts.Get[T](ctx)
|
||||
)
|
||||
|
||||
if co == nil || co.User == nil {
|
||||
|
@ -30,13 +30,13 @@ func Model(m *gdb.Model, opt ...*Option) *gdb.Model {
|
||||
option = DefaultOption
|
||||
}
|
||||
if option.FilterAuth {
|
||||
m = m.Handler(FilterAuth)
|
||||
m = m.Handler(FilterAuth[any])
|
||||
}
|
||||
if option.ForceCache {
|
||||
m = m.Handler(ForceCache)
|
||||
}
|
||||
if option.FilterTenant {
|
||||
m = m.Handler(FilterTenant)
|
||||
m = m.Handler(FilterTenant[any])
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ import (
|
||||
|
||||
// FilterTenant 过滤多租户数据权限
|
||||
// 根据部门类型识别当前租户、商户、用户身份,过滤只属于自己的数据
|
||||
func FilterTenant(m *gdb.Model) *gdb.Model {
|
||||
func FilterTenant[T any](m *gdb.Model) *gdb.Model {
|
||||
var (
|
||||
needAuth bool
|
||||
filterField string
|
||||
@ -23,19 +23,19 @@ func FilterTenant(m *gdb.Model) *gdb.Model {
|
||||
)
|
||||
|
||||
// 租户
|
||||
if contexts.IsTenantDept(ctx) && gstr.InArray(fields, "tenant_id") {
|
||||
if contexts.IsTenantDept[T](ctx) && gstr.InArray(fields, "tenant_id") {
|
||||
needAuth = true
|
||||
filterField = "tenant_id"
|
||||
}
|
||||
|
||||
// 商户
|
||||
if contexts.IsMerchantDept(ctx) && gstr.InArray(fields, "merchant_id") {
|
||||
if contexts.IsMerchantDept[T](ctx) && gstr.InArray(fields, "merchant_id") {
|
||||
needAuth = true
|
||||
filterField = "merchant_id"
|
||||
}
|
||||
|
||||
// 用户
|
||||
if contexts.IsUserDept(ctx) && gstr.InArray(fields, "user_id") {
|
||||
if contexts.IsUserDept[T](ctx) && gstr.InArray(fields, "user_id") {
|
||||
needAuth = true
|
||||
filterField = "user_id"
|
||||
}
|
||||
@ -44,6 +44,6 @@ func FilterTenant(m *gdb.Model) *gdb.Model {
|
||||
return m
|
||||
}
|
||||
|
||||
m = m.Where(filterField, contexts.GetUserId(ctx))
|
||||
m = m.Where(filterField, contexts.GetUserId[T](ctx))
|
||||
return m
|
||||
}
|
||||
|
@ -165,7 +165,7 @@ func (h *hookSaveTenant) checkRelationSingle(idx any, relation, limitType string
|
||||
return
|
||||
}
|
||||
|
||||
relationId := contexts.GetUserId(h.ctx)
|
||||
relationId := contexts.GetUserId[any](h.ctx)
|
||||
switch relation {
|
||||
case consts.DeptTypeTenant:
|
||||
if ok = tr.TenantId == relationId; !ok {
|
||||
@ -210,8 +210,8 @@ func (h *hookSaveTenant) handle() (result sql.Result, err error) {
|
||||
var (
|
||||
update = make(g.Map)
|
||||
fields = h.getFields()
|
||||
memberId = contexts.GetUserId(h.ctx)
|
||||
deptType = contexts.GetDeptType(h.ctx)
|
||||
memberId = contexts.GetUserId[any](h.ctx)
|
||||
deptType = contexts.GetDeptType[any](h.ctx)
|
||||
tr *hgorm.TenantRelation
|
||||
)
|
||||
|
||||
@ -221,7 +221,7 @@ func (h *hookSaveTenant) handle() (result sql.Result, err error) {
|
||||
}
|
||||
|
||||
// 非公司类型,加载自己的租户关系,用于重写关系
|
||||
if !contexts.IsCompanyDept(h.ctx) {
|
||||
if !contexts.IsCompanyDept[any](h.ctx) {
|
||||
tr, err = h.getRelation(memberId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -22,12 +22,13 @@ func JsonExit(r *ghttp.Request, code int, message string, data ...interface{}) {
|
||||
}
|
||||
|
||||
// RXml xml
|
||||
func RXml(r *ghttp.Request, code int, message string, data ...interface{}) {
|
||||
responseData := interface{}(nil)
|
||||
func RXml[T any](r *ghttp.Request, code int, message string, data ...T) {
|
||||
//responseData := interface{}(nil)
|
||||
var responseData T
|
||||
if len(data) > 0 {
|
||||
responseData = data[0]
|
||||
}
|
||||
res := &model.Response{
|
||||
res := &model.Response[T]{
|
||||
Code: code,
|
||||
Message: message,
|
||||
Timestamp: gtime.Timestamp(),
|
||||
@ -52,12 +53,13 @@ func RXml(r *ghttp.Request, code int, message string, data ...interface{}) {
|
||||
}
|
||||
|
||||
// RJson 标准返回结果数据结构封装
|
||||
func RJson(r *ghttp.Request, code int, message string, data ...interface{}) {
|
||||
responseData := interface{}(nil)
|
||||
func RJson[T any](r *ghttp.Request, code int, message string, data ...T) {
|
||||
//responseData := interface{}(nil)
|
||||
var responseData T
|
||||
if len(data) > 0 {
|
||||
responseData = data[0]
|
||||
}
|
||||
res := &model.Response{
|
||||
res := &model.Response[T]{
|
||||
Code: code,
|
||||
Message: message,
|
||||
Timestamp: gtime.Timestamp(),
|
||||
@ -82,7 +84,7 @@ func RJson(r *ghttp.Request, code int, message string, data ...interface{}) {
|
||||
}
|
||||
|
||||
// CustomJson 自定义JSON
|
||||
func CustomJson(r *ghttp.Request, content interface{}) {
|
||||
func CustomJson[T any](r *ghttp.Request, content T) {
|
||||
// 清空响应
|
||||
r.Response.ClearBuffer()
|
||||
|
||||
@ -90,7 +92,7 @@ func CustomJson(r *ghttp.Request, content interface{}) {
|
||||
r.Response.WriteJson(content)
|
||||
|
||||
// 加入到上下文
|
||||
contexts.SetResponse(r.Context(), &model.Response{
|
||||
contexts.SetResponse(r.Context(), &model.Response[T]{
|
||||
Code: 0,
|
||||
Message: "",
|
||||
Data: content,
|
||||
|
@ -67,7 +67,7 @@ func New(name ...string) UploadDrive {
|
||||
}
|
||||
|
||||
// DoUpload 上传入口
|
||||
func DoUpload(ctx context.Context, typ string, file *ghttp.UploadFile) (result *entity.SysAttachment, err error) {
|
||||
func DoUpload[T any](ctx context.Context, typ string, file *ghttp.UploadFile) (result *entity.SysAttachment, err error) {
|
||||
if file == nil {
|
||||
err = gerror.New("文件必须!")
|
||||
return
|
||||
@ -88,7 +88,7 @@ func DoUpload(ctx context.Context, typ string, file *ghttp.UploadFile) (result *
|
||||
}
|
||||
|
||||
// 相同存储相同身份才复用
|
||||
if result != nil && result.Drive == config.Drive && result.MemberId == contexts.GetUserId(ctx) && result.AppId == contexts.GetModule(ctx) {
|
||||
if result != nil && result.Drive == config.Drive && result.MemberId == contexts.GetUserId[T](ctx) && result.AppId == contexts.GetModule[T](ctx) {
|
||||
return
|
||||
}
|
||||
|
||||
@ -98,7 +98,7 @@ func DoUpload(ctx context.Context, typ string, file *ghttp.UploadFile) (result *
|
||||
return
|
||||
}
|
||||
// 写入附件记录
|
||||
return write(ctx, meta, fullPath)
|
||||
return write[T](ctx, meta, fullPath)
|
||||
}
|
||||
|
||||
// ValidateFileMeta 验证文件元数据
|
||||
@ -215,11 +215,11 @@ func GenFullPath(basePath, ext string) string {
|
||||
}
|
||||
|
||||
// write 写入附件记录
|
||||
func write(ctx context.Context, meta *FileMeta, fullPath string) (models *entity.SysAttachment, err error) {
|
||||
func write[T any](ctx context.Context, meta *FileMeta, fullPath string) (models *entity.SysAttachment, err error) {
|
||||
models = &entity.SysAttachment{
|
||||
Id: 0,
|
||||
AppId: contexts.GetModule(ctx),
|
||||
MemberId: contexts.GetUserId(ctx),
|
||||
AppId: contexts.GetModule[T](ctx),
|
||||
MemberId: contexts.GetUserId[T](ctx),
|
||||
Drive: config.Drive,
|
||||
Size: meta.Size,
|
||||
Path: fullPath,
|
||||
@ -264,7 +264,7 @@ func HasFile(ctx context.Context, md5 string) (res *entity.SysAttachment, err er
|
||||
}
|
||||
|
||||
// CheckMultipart 检查文件分片
|
||||
func CheckMultipart(ctx context.Context, in *CheckMultipartParams) (res *CheckMultipartModel, err error) {
|
||||
func CheckMultipart[T any](ctx context.Context, in *CheckMultipartParams) (res *CheckMultipartModel, err error) {
|
||||
res = new(CheckMultipartModel)
|
||||
|
||||
meta := new(FileMeta)
|
||||
@ -295,7 +295,7 @@ func CheckMultipart(ctx context.Context, in *CheckMultipartParams) (res *CheckMu
|
||||
}
|
||||
|
||||
// 文件已存在,直接返回。相同存储相同身份才复用
|
||||
if result != nil && result.Drive == config.Drive && result.MemberId == contexts.GetUserId(ctx) && result.AppId == contexts.GetModule(ctx) {
|
||||
if result != nil && result.Drive == config.Drive && result.MemberId == contexts.GetUserId[T](ctx) && result.AppId == contexts.GetModule[T](ctx) {
|
||||
res.Attachment = result
|
||||
return
|
||||
}
|
||||
@ -305,7 +305,7 @@ func CheckMultipart(ctx context.Context, in *CheckMultipartParams) (res *CheckMu
|
||||
}
|
||||
|
||||
in.meta = meta
|
||||
progress, err := GetOrCreateMultipartProgress(ctx, in)
|
||||
progress, err := GetOrCreateMultipartProgress[T](ctx, in)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -329,13 +329,13 @@ func CalcUploadProgress(uploadedIndex []int, shardCount int) float64 {
|
||||
}
|
||||
|
||||
// GenUploadId 生成上传ID
|
||||
func GenUploadId(ctx context.Context, md5 string) string {
|
||||
return fmt.Sprintf("%v:%v:%v@%v", md5, contexts.GetUserId(ctx), contexts.GetModule(ctx), config.Drive)
|
||||
func GenUploadId[T any](ctx context.Context, md5 string) string {
|
||||
return fmt.Sprintf("%v:%v:%v@%v", md5, contexts.GetUserId[T](ctx), contexts.GetModule[T](ctx), config.Drive)
|
||||
}
|
||||
|
||||
// GetOrCreateMultipartProgress 获取或创建分片上传事件进度
|
||||
func GetOrCreateMultipartProgress(ctx context.Context, in *CheckMultipartParams) (res *MultipartProgress, err error) {
|
||||
uploadId := GenUploadId(ctx, in.Md5)
|
||||
func GetOrCreateMultipartProgress[T any](ctx context.Context, in *CheckMultipartParams) (res *MultipartProgress, err error) {
|
||||
uploadId := GenUploadId[T](ctx, in.Md5)
|
||||
res, err = GetMultipartProgress(ctx, uploadId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -55,7 +55,7 @@ func (d *LocalDrive) Upload(ctx context.Context, file *ghttp.UploadFile) (fullPa
|
||||
// CreateMultipart 创建分片事件
|
||||
func (d *LocalDrive) CreateMultipart(ctx context.Context, in *CheckMultipartParams) (mp *MultipartProgress, err error) {
|
||||
mp = new(MultipartProgress)
|
||||
mp.UploadId = GenUploadId(ctx, in.Md5)
|
||||
mp.UploadId = GenUploadId[any](ctx, in.Md5)
|
||||
mp.Meta = in.meta
|
||||
mp.ShardCount = in.ShardCount
|
||||
mp.UploadedIndex = make([]int, 0)
|
||||
@ -119,7 +119,7 @@ func (d *LocalDrive) UploadPart(ctx context.Context, in *UploadPartParams) (res
|
||||
}
|
||||
|
||||
// 写入附件记录
|
||||
attachment, err := write(ctx, in.mp.Meta, finalDirPath)
|
||||
attachment, err := write[any](ctx, in.mp.Meta, finalDirPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ func Login(ctx context.Context, user *model.Identity) (string, int64, error) {
|
||||
}
|
||||
|
||||
// Logout 注销登录
|
||||
func Logout(r *ghttp.Request) (err error) {
|
||||
func Logout[T any](r *ghttp.Request) (err error) {
|
||||
var (
|
||||
ctx = r.Context()
|
||||
header = GetAuthorization(r)
|
||||
@ -112,9 +112,9 @@ func Logout(r *ghttp.Request) (err error) {
|
||||
// 认证key
|
||||
authKey = GetAuthKey(header)
|
||||
// 登录token
|
||||
tokenKey = GetTokenKey(contexts.GetModule(ctx), authKey)
|
||||
tokenKey = GetTokenKey(contexts.GetModule[T](ctx), authKey)
|
||||
// 身份绑定
|
||||
bindKey = GetBindKey(contexts.GetModule(ctx), claims.Id)
|
||||
bindKey = GetBindKey(contexts.GetModule[T](ctx), claims.Id)
|
||||
)
|
||||
|
||||
// 删除token
|
||||
|
@ -27,18 +27,18 @@ import (
|
||||
|
||||
type sAdminCash struct{}
|
||||
|
||||
func NewAdminCash() *sAdminCash {
|
||||
func newAdminCash() *sAdminCash {
|
||||
return &sAdminCash{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminCash(NewAdminCash())
|
||||
service.RegisterAdminCash(newAdminCash())
|
||||
}
|
||||
|
||||
// View 获取指定提现信息
|
||||
func (s *sAdminCash) View(ctx context.Context, in *adminin.CashViewInp) (res *adminin.CashViewModel, err error) {
|
||||
// 这里做了强制限制非超管不允许访问,如果你想通过菜单权限控制,请注释掉以下验证
|
||||
if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId(ctx)) {
|
||||
if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId[any](ctx)) {
|
||||
err = gerror.New("没有访问权限")
|
||||
return
|
||||
}
|
||||
@ -72,7 +72,7 @@ func (s *sAdminCash) View(ctx context.Context, in *adminin.CashViewInp) (res *ad
|
||||
func (s *sAdminCash) List(ctx context.Context, in *adminin.CashListInp) (list []*adminin.CashListModel, totalCount int, err error) {
|
||||
var (
|
||||
mod = dao.AdminCash.Ctx(ctx)
|
||||
opMemberId = contexts.GetUserId(ctx)
|
||||
opMemberId = contexts.GetUserId[any](ctx)
|
||||
isSuper = service.AdminMember().VerifySuperId(ctx, opMemberId)
|
||||
)
|
||||
|
||||
@ -233,8 +233,8 @@ func (s *sAdminCash) Apply(ctx context.Context, in *adminin.CashApplyInp) (err e
|
||||
// 更新余额
|
||||
_, err = service.AdminCreditsLog().SaveBalance(ctx, &adminin.CreditsLogSaveBalanceInp{
|
||||
MemberId: in.MemberId,
|
||||
AppId: contexts.GetModule(ctx),
|
||||
AddonsName: contexts.GetAddonName(ctx),
|
||||
AppId: contexts.GetModule[any](ctx),
|
||||
AddonsName: contexts.GetAddonName[any](ctx),
|
||||
CreditGroup: consts.CreditGroupApplyCash,
|
||||
Num: -in.Money,
|
||||
MapId: lastInsertId,
|
||||
@ -253,7 +253,7 @@ func (s *sAdminCash) Apply(ctx context.Context, in *adminin.CashApplyInp) (err e
|
||||
|
||||
// Payment 提现打款处理
|
||||
func (s *sAdminCash) Payment(ctx context.Context, in *adminin.CashPaymentInp) (err error) {
|
||||
if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId(ctx)) {
|
||||
if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId[any](ctx)) {
|
||||
err = gerror.New("没有访问权限")
|
||||
return
|
||||
}
|
||||
|
@ -29,12 +29,12 @@ import (
|
||||
|
||||
type sAdminCreditsLog struct{}
|
||||
|
||||
func NewAdminCreditsLog() *sAdminCreditsLog {
|
||||
func newAdminCreditsLog() *sAdminCreditsLog {
|
||||
return &sAdminCreditsLog{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminCreditsLog(NewAdminCreditsLog())
|
||||
service.RegisterAdminCreditsLog(newAdminCreditsLog())
|
||||
}
|
||||
|
||||
// Model 资产变动ORM模型
|
||||
@ -245,6 +245,6 @@ func (s *sAdminCreditsLog) Export(ctx context.Context, in *adminin.CreditsLogLis
|
||||
return
|
||||
}
|
||||
|
||||
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
|
||||
err = excel.ExportByStructs[any](ctx, tags, exports, fileName, sheetName)
|
||||
return
|
||||
}
|
||||
|
@ -26,12 +26,12 @@ import (
|
||||
|
||||
type sAdminDept struct{}
|
||||
|
||||
func NewAdminDept() *sAdminDept {
|
||||
func newAdminDept() *sAdminDept {
|
||||
return &sAdminDept{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminDept(NewAdminDept())
|
||||
service.RegisterAdminDept(newAdminDept())
|
||||
}
|
||||
|
||||
// Model 部门ORM模型
|
||||
@ -255,7 +255,7 @@ func (s *sAdminDept) GetName(ctx context.Context, id int64) (name string, err er
|
||||
func (s *sAdminDept) VerifyDeptId(ctx context.Context, id int64) (err error) {
|
||||
var (
|
||||
pid int64 = 0
|
||||
mb = contexts.GetUser(ctx)
|
||||
mb = contexts.GetUser[any](ctx)
|
||||
mod = dao.AdminDept.Ctx(ctx).Fields(dao.AdminDept.Columns().Id)
|
||||
)
|
||||
|
||||
@ -291,8 +291,8 @@ func (s *sAdminDept) Option(ctx context.Context, in *adminin.DeptOptionInp) (res
|
||||
)
|
||||
|
||||
// 非超管只获取下级
|
||||
if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId(ctx)) {
|
||||
pid = contexts.GetUser(ctx).DeptId
|
||||
if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId[any](ctx)) {
|
||||
pid = contexts.GetUser[any](ctx).DeptId
|
||||
mod = mod.WhereLike(dao.AdminDept.Columns().Tree, "%"+tree.GetIdLabel(pid)+"%")
|
||||
}
|
||||
|
||||
|
@ -44,21 +44,21 @@ type sAdminMember struct {
|
||||
superAdmin *SuperAdmin
|
||||
}
|
||||
|
||||
func NewAdminMember() *sAdminMember {
|
||||
func newAdminMember() *sAdminMember {
|
||||
return &sAdminMember{
|
||||
superAdmin: new(SuperAdmin),
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminMember(NewAdminMember())
|
||||
service.RegisterAdminMember(newAdminMember())
|
||||
}
|
||||
|
||||
// AddBalance 增加余额
|
||||
func (s *sAdminMember) AddBalance(ctx context.Context, in *adminin.MemberAddBalanceInp) (err error) {
|
||||
var (
|
||||
mb *entity.AdminMember
|
||||
memberId = contexts.GetUserId(ctx)
|
||||
memberId = contexts.GetUserId[any](ctx)
|
||||
)
|
||||
|
||||
if err = s.FilterAuthModel(ctx, memberId).WherePri(in.Id).Scan(&mb); err != nil {
|
||||
@ -102,7 +102,7 @@ func (s *sAdminMember) AddBalance(ctx context.Context, in *adminin.MemberAddBala
|
||||
func (s *sAdminMember) AddIntegral(ctx context.Context, in *adminin.MemberAddIntegralInp) (err error) {
|
||||
var (
|
||||
mb *entity.AdminMember
|
||||
memberId = contexts.GetUserId(ctx)
|
||||
memberId = contexts.GetUserId[any](ctx)
|
||||
)
|
||||
|
||||
if err = s.FilterAuthModel(ctx, memberId).WherePri(in.Id).Scan(&mb); err != nil {
|
||||
@ -144,7 +144,7 @@ func (s *sAdminMember) AddIntegral(ctx context.Context, in *adminin.MemberAddInt
|
||||
|
||||
// UpdateCash 修改提现信息
|
||||
func (s *sAdminMember) UpdateCash(ctx context.Context, in *adminin.MemberUpdateCashInp) (err error) {
|
||||
memberId := contexts.Get(ctx).User.Id
|
||||
memberId := contexts.Get[any](ctx).User.Id
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
@ -180,7 +180,7 @@ func (s *sAdminMember) UpdateCash(ctx context.Context, in *adminin.MemberUpdateC
|
||||
|
||||
// UpdateEmail 换绑邮箱
|
||||
func (s *sAdminMember) UpdateEmail(ctx context.Context, in *adminin.MemberUpdateEmailInp) (err error) {
|
||||
memberId := contexts.Get(ctx).User.Id
|
||||
memberId := contexts.Get[any](ctx).User.Id
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
@ -232,7 +232,7 @@ func (s *sAdminMember) UpdateEmail(ctx context.Context, in *adminin.MemberUpdate
|
||||
|
||||
// UpdateMobile 换绑手机号
|
||||
func (s *sAdminMember) UpdateMobile(ctx context.Context, in *adminin.MemberUpdateMobileInp) (err error) {
|
||||
memberId := contexts.Get(ctx).User.Id
|
||||
memberId := contexts.Get[any](ctx).User.Id
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
@ -284,7 +284,7 @@ func (s *sAdminMember) UpdateMobile(ctx context.Context, in *adminin.MemberUpdat
|
||||
|
||||
// UpdateProfile 更新用户资料
|
||||
func (s *sAdminMember) UpdateProfile(ctx context.Context, in *adminin.MemberUpdateProfileInp) (err error) {
|
||||
memberId := contexts.Get(ctx).User.Id
|
||||
memberId := contexts.Get[any](ctx).User.Id
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
@ -347,7 +347,7 @@ func (s *sAdminMember) UpdatePwd(ctx context.Context, in *adminin.MemberUpdatePw
|
||||
func (s *sAdminMember) ResetPwd(ctx context.Context, in *adminin.MemberResetPwdInp) (err error) {
|
||||
var (
|
||||
mb *entity.AdminMember
|
||||
memberId = contexts.GetUserId(ctx)
|
||||
memberId = contexts.GetUserId[any](ctx)
|
||||
)
|
||||
|
||||
if err = s.FilterAuthModel(ctx, memberId).WherePri(in.Id).Scan(&mb); err != nil {
|
||||
@ -403,7 +403,7 @@ func (s *sAdminMember) VerifyUnique(ctx context.Context, in *adminin.VerifyUniqu
|
||||
|
||||
// Delete 删除用户
|
||||
func (s *sAdminMember) Delete(ctx context.Context, in *adminin.MemberDeleteInp) (err error) {
|
||||
memberId := contexts.GetUserId(ctx)
|
||||
memberId := contexts.GetUserId[any](ctx)
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
@ -454,7 +454,7 @@ func (s *sAdminMember) Delete(ctx context.Context, in *adminin.MemberDeleteInp)
|
||||
|
||||
// Edit 修改/新增用户
|
||||
func (s *sAdminMember) Edit(ctx context.Context, in *adminin.MemberEditInp) (err error) {
|
||||
opMemberId := contexts.GetUserId(ctx)
|
||||
opMemberId := contexts.GetUserId[any](ctx)
|
||||
if opMemberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
@ -582,7 +582,7 @@ func (s *sAdminMember) Edit(ctx context.Context, in *adminin.MemberEditInp) (err
|
||||
|
||||
// View 获取用户信息
|
||||
func (s *sAdminMember) View(ctx context.Context, in *adminin.MemberViewInp) (res *adminin.MemberViewModel, err error) {
|
||||
if err = s.FilterAuthModel(ctx, contexts.GetUserId(ctx)).Hook(hook.MemberInfo).WherePri(in.Id).Scan(&res); err != nil {
|
||||
if err = s.FilterAuthModel(ctx, contexts.GetUserId[any](ctx)).Hook(hook.MemberInfo).WherePri(in.Id).Scan(&res); err != nil {
|
||||
err = gerror.Wrap(err, "获取用户信息失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
@ -590,7 +590,7 @@ 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) {
|
||||
mod := s.FilterAuthModel(ctx, contexts.GetUserId(ctx))
|
||||
mod := s.FilterAuthModel(ctx, contexts.GetUserId[any](ctx))
|
||||
cols := dao.AdminMember.Columns()
|
||||
|
||||
if in.RealName != "" {
|
||||
@ -652,7 +652,7 @@ func (s *sAdminMember) Status(ctx context.Context, in *adminin.MemberStatusInp)
|
||||
return
|
||||
}
|
||||
|
||||
if _, err = s.FilterAuthModel(ctx, contexts.GetUserId(ctx)).WherePri(in.Id).Data(dao.AdminMember.Columns().Status, in.Status).Update(); err != nil {
|
||||
if _, err = s.FilterAuthModel(ctx, contexts.GetUserId[any](ctx)).WherePri(in.Id).Data(dao.AdminMember.Columns().Status, in.Status).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "更新用户状态失败,请稍后重试!")
|
||||
}
|
||||
return
|
||||
@ -677,7 +677,7 @@ func (s *sAdminMember) GenTree(ctx context.Context, pid int64) (level int, newTr
|
||||
|
||||
// LoginMemberInfo 获取登录用户信息
|
||||
func (s *sAdminMember) LoginMemberInfo(ctx context.Context) (res *adminin.LoginMemberInfoModel, err error) {
|
||||
var memberId = contexts.GetUserId(ctx)
|
||||
var memberId = contexts.GetUserId[any](ctx)
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("用户身份异常,请重新登录!")
|
||||
return
|
||||
@ -710,7 +710,7 @@ func (s *sAdminMember) LoginMemberInfo(ctx context.Context) (res *adminin.LoginM
|
||||
res.Mobile = gstr.HideStr(res.Mobile, 40, `*`)
|
||||
res.Email = gstr.HideStr(res.Email, 40, `*`)
|
||||
res.OpenId, _ = service.CommonWechat().GetOpenId(ctx)
|
||||
res.DeptType = contexts.GetDeptType(ctx)
|
||||
res.DeptType = contexts.GetDeptType[any](ctx)
|
||||
return
|
||||
}
|
||||
|
||||
@ -756,7 +756,7 @@ func (s *sAdminMember) GetIdByCode(ctx context.Context, in *adminin.GetIdByCodeI
|
||||
// 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")).
|
||||
Handler(handler.FilterAuthWithField[any]("id")).
|
||||
Scan(&res)
|
||||
if err != nil {
|
||||
err = gerror.Wrap(err, "获取可选用户选项失败,请稍后重试!")
|
||||
@ -837,9 +837,9 @@ func (s *sAdminMember) FilterAuthModel(ctx context.Context, memberId int64) *gdb
|
||||
}
|
||||
|
||||
var roleId int64
|
||||
if contexts.GetUserId(ctx) == memberId {
|
||||
if contexts.GetUserId[any](ctx) == memberId {
|
||||
// 当前登录用户直接从上下文中取角色ID
|
||||
roleId = contexts.GetRoleId(ctx)
|
||||
roleId = contexts.GetRoleId[any](ctx)
|
||||
} else {
|
||||
ro, err := dao.AdminMember.Ctx(ctx).Fields("role_id").Where("id", memberId).Value()
|
||||
if err != nil {
|
||||
@ -854,5 +854,5 @@ func (s *sAdminMember) FilterAuthModel(ctx context.Context, memberId int64) *gdb
|
||||
g.Log().Panicf(ctx, "get the subordinate role permission exception, err:%+v", err)
|
||||
return nil
|
||||
}
|
||||
return m.Where("id <> ?", memberId).WhereIn("role_id", roleIds).Handler(handler.FilterAuthWithField("id"))
|
||||
return m.Where("id <> ?", memberId).WhereIn("role_id", roleIds).Handler(handler.FilterAuthWithField[any]("id"))
|
||||
}
|
||||
|
@ -15,12 +15,12 @@ import (
|
||||
|
||||
type sAdminMemberPost struct{}
|
||||
|
||||
func NewAdminMemberPost() *sAdminMemberPost {
|
||||
func newAdminMemberPost() *sAdminMemberPost {
|
||||
return &sAdminMemberPost{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminMemberPost(NewAdminMemberPost())
|
||||
service.RegisterAdminMemberPost(newAdminMemberPost())
|
||||
}
|
||||
|
||||
// UpdatePostIds 更新用户岗位
|
||||
|
@ -29,12 +29,12 @@ import (
|
||||
|
||||
type sAdminMenu struct{}
|
||||
|
||||
func NewAdminMenu() *sAdminMenu {
|
||||
func newAdminMenu() *sAdminMenu {
|
||||
return &sAdminMenu{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminMenu(NewAdminMenu())
|
||||
service.RegisterAdminMenu(newAdminMenu())
|
||||
}
|
||||
|
||||
// Model Orm模型
|
||||
@ -183,7 +183,7 @@ func (s *sAdminMenu) GetMenuList(ctx context.Context, memberId int64) (res *role
|
||||
|
||||
// 非超管验证允许的菜单列表
|
||||
if !service.AdminMember().VerifySuperId(ctx, memberId) {
|
||||
menuIds, err := dao.AdminRoleMenu.Ctx(ctx).Fields("menu_id").Where("role_id", contexts.GetRoleId(ctx)).Array()
|
||||
menuIds, err := dao.AdminRoleMenu.Ctx(ctx).Fields("menu_id").Where("role_id", contexts.GetRoleId[any](ctx)).Array()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -242,7 +242,7 @@ func (s *sAdminMenu) LoginPermissions(ctx context.Context, memberId int64) (list
|
||||
|
||||
// 非超管验证允许的菜单列表
|
||||
if !service.AdminMember().VerifySuperId(ctx, memberId) {
|
||||
menuIds, err := dao.AdminRoleMenu.Ctx(ctx).Fields("menu_id").Where("role_id", contexts.GetRoleId(ctx)).Array()
|
||||
menuIds, err := dao.AdminRoleMenu.Ctx(ctx).Fields("menu_id").Where("role_id", contexts.GetRoleId[any](ctx)).Array()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -26,14 +26,14 @@ type sAdminMonitor struct {
|
||||
sync.RWMutex
|
||||
}
|
||||
|
||||
func NewAdminMonitor() *sAdminMonitor {
|
||||
func newAdminMonitor() *sAdminMonitor {
|
||||
return &sAdminMonitor{
|
||||
data: new(model.MonitorData),
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminMonitor(NewAdminMonitor())
|
||||
service.RegisterAdminMonitor(newAdminMonitor())
|
||||
}
|
||||
|
||||
// StartMonitor 启动服务监控
|
||||
|
@ -27,12 +27,12 @@ import (
|
||||
|
||||
type sAdminNotice struct{}
|
||||
|
||||
func NewAdminNotice() *sAdminNotice {
|
||||
func newAdminNotice() *sAdminNotice {
|
||||
return &sAdminNotice{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminNotice(NewAdminNotice())
|
||||
service.RegisterAdminNotice(newAdminNotice())
|
||||
}
|
||||
|
||||
// Model Orm模型
|
||||
@ -48,7 +48,7 @@ func (s *sAdminNotice) Delete(ctx context.Context, in *adminin.NoticeDeleteInp)
|
||||
|
||||
// Edit 修改/新增
|
||||
func (s *sAdminNotice) Edit(ctx context.Context, in *adminin.NoticeEditInp) (err error) {
|
||||
var member = contexts.Get(ctx).User
|
||||
var member = contexts.Get[any](ctx).User
|
||||
if member == nil {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
@ -66,7 +66,7 @@ func (s *sAdminNotice) Edit(ctx context.Context, in *adminin.NoticeEditInp) (err
|
||||
|
||||
// 检查选项接收人是否合法
|
||||
if in.Type == consts.NoticeTypeLetter {
|
||||
count, _ := dao.AdminMember.Ctx(ctx).Handler(handler.FilterAuthWithField("id")).WhereIn("id", in.Receiver).Count()
|
||||
count, _ := dao.AdminMember.Ctx(ctx).Handler(handler.FilterAuthWithField[any]("id")).WhereIn("id", in.Receiver).Count()
|
||||
if count != len(in.Receiver) {
|
||||
err = gerror.New("接收人不合法")
|
||||
return
|
||||
@ -159,7 +159,7 @@ 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) {
|
||||
var memberId = contexts.GetUserId(ctx)
|
||||
var memberId = contexts.GetUserId[any](ctx)
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
@ -224,7 +224,7 @@ func (s *sAdminNotice) List(ctx context.Context, in *adminin.NoticeListInp) (lis
|
||||
|
||||
// PullMessages 拉取未读消息列表
|
||||
func (s *sAdminNotice) PullMessages(ctx context.Context, in *adminin.PullMessagesInp) (res *adminin.PullMessagesModel, err error) {
|
||||
var memberId = contexts.GetUserId(ctx)
|
||||
var memberId = contexts.GetUserId[any](ctx)
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
@ -269,7 +269,7 @@ func (s *sAdminNotice) PullMessages(ctx context.Context, in *adminin.PullMessage
|
||||
// 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 {
|
||||
if in.MemberId = contexts.GetUserId[any](ctx); in.MemberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
}
|
||||
@ -340,7 +340,7 @@ func (s *sAdminNotice) messageIds(ctx context.Context, memberId int64) (ids []in
|
||||
func (s *sAdminNotice) UpRead(ctx context.Context, in *adminin.NoticeUpReadInp) (err error) {
|
||||
var (
|
||||
data *entity.AdminNotice
|
||||
memberId = contexts.GetUserId(ctx)
|
||||
memberId = contexts.GetUserId[any](ctx)
|
||||
)
|
||||
|
||||
if memberId <= 0 {
|
||||
@ -361,7 +361,7 @@ func (s *sAdminNotice) UpRead(ctx context.Context, in *adminin.NoticeUpReadInp)
|
||||
|
||||
// ReadAll 已读全部
|
||||
func (s *sAdminNotice) ReadAll(ctx context.Context, in *adminin.NoticeReadAllInp) (err error) {
|
||||
var memberId = contexts.GetUserId(ctx)
|
||||
var memberId = contexts.GetUserId[any](ctx)
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
@ -435,7 +435,7 @@ func (s *sAdminNotice) updatedReadClicks(ctx context.Context, noticeId, memberId
|
||||
|
||||
// MessageList 我的消息列表
|
||||
func (s *sAdminNotice) MessageList(ctx context.Context, in *adminin.NoticeMessageListInp) (list []*adminin.NoticeMessageListModel, totalCount int, err error) {
|
||||
var memberId = contexts.GetUserId(ctx)
|
||||
var memberId = contexts.GetUserId[any](ctx)
|
||||
if memberId <= 0 {
|
||||
err = gerror.New("获取用户信息失败!")
|
||||
return
|
||||
|
@ -34,12 +34,12 @@ import (
|
||||
|
||||
type sAdminOrder struct{}
|
||||
|
||||
func NewAdminOrder() *sAdminOrder {
|
||||
func newAdminOrder() *sAdminOrder {
|
||||
return &sAdminOrder{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminOrder(NewAdminOrder())
|
||||
service.RegisterAdminOrder(newAdminOrder())
|
||||
}
|
||||
|
||||
// Model 充值订单ORM模型
|
||||
@ -70,8 +70,8 @@ func (s *sAdminOrder) AcceptRefund(ctx context.Context, in *adminin.OrderAcceptR
|
||||
// 更新余额
|
||||
_, err = service.AdminCreditsLog().SaveBalance(ctx, &adminin.CreditsLogSaveBalanceInp{
|
||||
MemberId: view.MemberId,
|
||||
AppId: contexts.GetModule(ctx),
|
||||
AddonsName: contexts.GetAddonName(ctx),
|
||||
AppId: contexts.GetModule[any](ctx),
|
||||
AddonsName: contexts.GetAddonName[any](ctx),
|
||||
CreditGroup: consts.CreditGroupBalanceRefund,
|
||||
Num: -view.Money,
|
||||
MapId: view.Id,
|
||||
@ -217,7 +217,7 @@ func (s *sAdminOrder) Create(ctx context.Context, in *adminin.OrderCreateInp) (r
|
||||
res = new(adminin.OrderCreateModel)
|
||||
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
|
||||
_, err = s.Model(ctx).Data(entity.AdminOrder{
|
||||
MemberId: contexts.GetUserId(ctx),
|
||||
MemberId: contexts.GetUserId[any](ctx),
|
||||
OrderType: in.OrderType,
|
||||
ProductId: in.ProductId,
|
||||
OrderSn: orderSn,
|
||||
@ -326,7 +326,7 @@ func (s *sAdminOrder) Export(ctx context.Context, in *adminin.OrderListInp) (err
|
||||
return
|
||||
}
|
||||
|
||||
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
|
||||
err = excel.ExportByStructs[any](ctx, tags, exports, fileName, sheetName)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -22,12 +22,12 @@ import (
|
||||
|
||||
type sAdminPost struct{}
|
||||
|
||||
func NewAdminPost() *sAdminPost {
|
||||
func newAdminPost() *sAdminPost {
|
||||
return &sAdminPost{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminPost(NewAdminPost())
|
||||
service.RegisterAdminPost(newAdminPost())
|
||||
dict.RegisterFunc("adminPostOption", "岗位选项", service.AdminPost().Option)
|
||||
}
|
||||
|
||||
|
@ -28,18 +28,18 @@ import (
|
||||
|
||||
type sAdminRole struct{}
|
||||
|
||||
func NewAdminRole() *sAdminRole {
|
||||
func newAdminRole() *sAdminRole {
|
||||
return &sAdminRole{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminRole(NewAdminRole())
|
||||
service.RegisterAdminRole(newAdminRole())
|
||||
}
|
||||
|
||||
// Verify 验证权限
|
||||
func (s *sAdminRole) Verify(ctx context.Context, path, method string) bool {
|
||||
var (
|
||||
user = contexts.Get(ctx).User
|
||||
user = contexts.Get[any](ctx).User
|
||||
err error
|
||||
)
|
||||
|
||||
@ -69,8 +69,8 @@ func (s *sAdminRole) List(ctx context.Context, in *adminin.RoleListInp) (res *ad
|
||||
)
|
||||
|
||||
// 非超管只获取下级角色
|
||||
if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId(ctx)) {
|
||||
pid = contexts.GetRoleId(ctx)
|
||||
if !service.AdminMember().VerifySuperId(ctx, contexts.GetUserId[any](ctx)) {
|
||||
pid = contexts.GetRoleId[any](ctx)
|
||||
mod = mod.WhereLike(dao.AdminRole.Columns().Tree, "%"+tree.GetIdLabel(pid)+"%")
|
||||
}
|
||||
|
||||
@ -309,7 +309,7 @@ func (s *sAdminRole) treeList(pid int64, nodes []*entity.AdminRole) (list []*adm
|
||||
|
||||
// VerifyRoleId 验证角色ID
|
||||
func (s *sAdminRole) VerifyRoleId(ctx context.Context, id int64) (err error) {
|
||||
mb := contexts.GetUser(ctx)
|
||||
mb := contexts.GetUser[any](ctx)
|
||||
if mb == nil {
|
||||
err = gerror.New("用户信息获取失败!")
|
||||
return
|
||||
|
@ -28,12 +28,12 @@ import (
|
||||
|
||||
type sAdminSite struct{}
|
||||
|
||||
func NewAdminSite() *sAdminSite {
|
||||
func newAdminSite() *sAdminSite {
|
||||
return &sAdminSite{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterAdminSite(NewAdminSite())
|
||||
service.RegisterAdminSite(newAdminSite())
|
||||
}
|
||||
|
||||
// Register 账号注册
|
||||
@ -333,6 +333,6 @@ func (s *sAdminSite) BindUserContext(ctx context.Context, claims *model.Identity
|
||||
LoginAt: claims.LoginAt,
|
||||
}
|
||||
|
||||
contexts.SetUser(ctx, user)
|
||||
contexts.SetUser[any](ctx, user)
|
||||
return
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ func init() {
|
||||
|
||||
// UploadFile 上传文件
|
||||
func (s *sCommonUpload) UploadFile(ctx context.Context, uploadType string, file *ghttp.UploadFile) (res *sysin.AttachmentListModel, err error) {
|
||||
attachment, err := storager.DoUpload(ctx, uploadType, file)
|
||||
attachment, err := storager.DoUpload[any](ctx, uploadType, file)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -41,7 +41,7 @@ func (s *sCommonUpload) UploadFile(ctx context.Context, uploadType string, file
|
||||
|
||||
// CheckMultipart 检查文件分片
|
||||
func (s *sCommonUpload) CheckMultipart(ctx context.Context, in *sysin.CheckMultipartInp) (res *sysin.CheckMultipartModel, err error) {
|
||||
data, err := storager.CheckMultipart(ctx, in.CheckMultipartParams)
|
||||
data, err := storager.CheckMultipart[any](ctx, in.CheckMultipartParams)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ func (s *sCommonWechat) Authorize(ctx context.Context, in *commonin.WechatAuthor
|
||||
prefix = g.Cfg().MustGet(ctx, "router.admin.prefix", "/admin").String()
|
||||
path = gmeta.Get(common.WechatAuthorizeCallReq{}, "path").String()
|
||||
redirectUri = basic.Domain + prefix + path
|
||||
memberId = contexts.GetUserId(ctx)
|
||||
memberId = contexts.GetUserId[any](ctx)
|
||||
state = s.GetCacheKey(in.Type, token.GetAuthKey(token.GetAuthorization(request)))
|
||||
scope string
|
||||
)
|
||||
|
@ -27,11 +27,11 @@ func (s *sHook) accessLog(r *ghttp.Request) {
|
||||
}
|
||||
|
||||
var ctx = r.Context()
|
||||
if contexts.Get(ctx) == nil {
|
||||
if contexts.Get[any](ctx) == nil {
|
||||
return
|
||||
}
|
||||
|
||||
contexts.SetDataMap(ctx, g.Map{
|
||||
contexts.SetDataMap[any](ctx, g.Map{
|
||||
"request.takeUpTime": gtime.Now().Sub(gtime.New(r.EnterTime)).Milliseconds(),
|
||||
// ...
|
||||
})
|
||||
|
@ -71,7 +71,7 @@ func (s *sHook) lastAdminActive(r *ghttp.Request) {
|
||||
|
||||
var (
|
||||
ctx = r.Context()
|
||||
member = contexts.GetUser(ctx)
|
||||
member = contexts.GetUser[any](ctx)
|
||||
)
|
||||
|
||||
if member == nil || member.App != consts.AppAdmin {
|
||||
|
@ -44,7 +44,7 @@ func (s *sMiddleware) AdminAuth(r *ghttp.Request) {
|
||||
|
||||
// 验证路由访问权限
|
||||
if !service.AdminRole().Verify(ctx, path, r.Method) {
|
||||
g.Log().Debugf(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[any](ctx), r.Method)
|
||||
response.JsonExit(r, gcode.CodeSecurityReason.Code(), "你没有访问权限!")
|
||||
return
|
||||
}
|
||||
|
@ -73,7 +73,7 @@ func (s *sMiddleware) Ctx(r *ghttp.Request) {
|
||||
data["request.body"] = gjson.New(r.GetBodyString())
|
||||
}
|
||||
|
||||
contexts.Init(r, &model.Context{
|
||||
contexts.Init(r, &model.Context[any]{
|
||||
Data: data,
|
||||
Module: getModule(r.URL.Path),
|
||||
})
|
||||
@ -129,13 +129,13 @@ func (s *sMiddleware) DemoLimit(r *ghttp.Request) {
|
||||
func (s *sMiddleware) Addon(r *ghttp.Request) {
|
||||
var ctx = r.Context()
|
||||
|
||||
if contexts.Get(ctx).Module == "" {
|
||||
if contexts.Get[any](ctx).Module == "" {
|
||||
g.Log().Warning(ctx, "application module is not initialized.")
|
||||
return
|
||||
}
|
||||
|
||||
// 替换掉应用模块前缀
|
||||
path := gstr.Replace(r.URL.Path, "/"+contexts.Get(ctx).Module+"/", "", 1)
|
||||
path := gstr.Replace(r.URL.Path, "/"+contexts.Get[any](ctx).Module+"/", "", 1)
|
||||
ss := gstr.Explode("/", path)
|
||||
if len(ss) == 0 {
|
||||
g.Log().Warning(ctx, "addon was not recognized.")
|
||||
@ -154,7 +154,7 @@ func (s *sMiddleware) Addon(r *ghttp.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
contexts.SetAddonName(ctx, sk.Name)
|
||||
contexts.SetAddonName[any](ctx, sk.Name)
|
||||
r.Middleware.Next()
|
||||
}
|
||||
|
||||
@ -171,7 +171,7 @@ func (s *sMiddleware) DeliverUserContext(r *ghttp.Request) (err error) {
|
||||
return
|
||||
}
|
||||
default:
|
||||
contexts.SetUser(r.Context(), user)
|
||||
contexts.SetUser[any](r.Context(), user)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -69,9 +69,9 @@ func (s *sPay) Create(ctx context.Context, in payin.PayCreateInp) (res *payin.Pa
|
||||
}
|
||||
|
||||
data := &entity.PayLog{
|
||||
MemberId: contexts.GetUserId(ctx),
|
||||
AppId: contexts.GetModule(ctx),
|
||||
AddonsName: contexts.GetAddonName(ctx),
|
||||
MemberId: contexts.GetUserId[any](ctx),
|
||||
AppId: contexts.GetModule[any](ctx),
|
||||
AddonsName: contexts.GetAddonName[any](ctx),
|
||||
OrderSn: in.OrderSn,
|
||||
OrderGroup: in.OrderGroup,
|
||||
Openid: in.Openid,
|
||||
|
@ -97,7 +97,7 @@ func (s *sPay) Export(ctx context.Context, in payin.PayListInp) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
|
||||
err = excel.ExportByStructs[any](ctx, tags, exports, fileName, sheetName)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -213,6 +213,6 @@ func (s *sPayRefund) Export(ctx context.Context, in *payin.PayRefundListInp) (er
|
||||
return
|
||||
}
|
||||
|
||||
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
|
||||
err = excel.ExportByStructs[any](ctx, tags, exports, fileName, sheetName)
|
||||
return
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ func (s *sSysAttachment) View(ctx context.Context, in *sysin.AttachmentViewInp)
|
||||
// List 获取附件列表
|
||||
func (s *sSysAttachment) List(ctx context.Context, in *sysin.AttachmentListInp) (list []*sysin.AttachmentListModel, totalCount int, err error) {
|
||||
mod := s.Model(ctx)
|
||||
memberId := contexts.GetUserId(ctx)
|
||||
memberId := contexts.GetUserId[any](ctx)
|
||||
|
||||
// 超管允许查看指定用户的附件
|
||||
if service.AdminMember().VerifySuperId(ctx, memberId) && in.MemberId > 0 {
|
||||
@ -108,7 +108,7 @@ func (s *sSysAttachment) List(ctx context.Context, in *sysin.AttachmentListInp)
|
||||
|
||||
// ClearKind 清空上传类型
|
||||
func (s *sSysAttachment) ClearKind(ctx context.Context, in *sysin.AttachmentClearKindInp) (err error) {
|
||||
memberId := contexts.GetUserId(ctx)
|
||||
memberId := contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx).Where(dao.SysAttachment.Columns().MemberId, memberId).Where(dao.SysAttachment.Columns().Kind, in.Kind).Delete(); err != nil {
|
||||
err = gerror.Wrap(err, "删除附件上传类型失败,请稍后重试!")
|
||||
}
|
||||
|
@ -129,7 +129,7 @@ func (s *sSysCurdDemo) Export(ctx context.Context, in *sysin.CurdDemoListInp) (e
|
||||
return
|
||||
}
|
||||
|
||||
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
|
||||
err = excel.ExportByStructs[any](ctx, tags, exports, fileName, sheetName)
|
||||
return
|
||||
}
|
||||
|
||||
@ -139,7 +139,7 @@ func (s *sSysCurdDemo) Edit(ctx context.Context, in *sysin.CurdDemoEditInp) (err
|
||||
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
in.UpdatedBy = contexts.GetUserId(ctx)
|
||||
in.UpdatedBy = contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx).
|
||||
Fields(sysin.CurdDemoUpdateFields{}).
|
||||
WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
@ -149,7 +149,7 @@ func (s *sSysCurdDemo) Edit(ctx context.Context, in *sysin.CurdDemoEditInp) (err
|
||||
}
|
||||
|
||||
// 新增
|
||||
in.CreatedBy = contexts.GetUserId(ctx)
|
||||
in.CreatedBy = contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).
|
||||
Fields(sysin.CurdDemoInsertFields{}).
|
||||
Data(in).OmitEmptyData().Insert(); err != nil {
|
||||
@ -163,7 +163,7 @@ func (s *sSysCurdDemo) Edit(ctx context.Context, in *sysin.CurdDemoEditInp) (err
|
||||
func (s *sSysCurdDemo) Delete(ctx context.Context, in *sysin.CurdDemoDeleteInp) (err error) {
|
||||
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Data(g.Map{
|
||||
dao.SysGenCurdDemo.Columns().DeletedBy: contexts.GetUserId(ctx),
|
||||
dao.SysGenCurdDemo.Columns().DeletedBy: contexts.GetUserId[any](ctx),
|
||||
dao.SysGenCurdDemo.Columns().DeletedAt: gtime.Now(),
|
||||
}).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "删除CURD列表失败,请稍后重试!")
|
||||
@ -200,7 +200,7 @@ func (s *sSysCurdDemo) View(ctx context.Context, in *sysin.CurdDemoViewInp) (res
|
||||
func (s *sSysCurdDemo) Status(ctx context.Context, in *sysin.CurdDemoStatusInp) (err error) {
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Data(g.Map{
|
||||
dao.SysGenCurdDemo.Columns().Status: in.Status,
|
||||
dao.SysGenCurdDemo.Columns().UpdatedBy: contexts.GetUserId(ctx),
|
||||
dao.SysGenCurdDemo.Columns().UpdatedBy: contexts.GetUserId[any](ctx),
|
||||
}).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "更新CURD列表状态失败,请稍后重试!")
|
||||
return
|
||||
@ -222,7 +222,7 @@ func (s *sSysCurdDemo) Switch(ctx context.Context, in *sysin.CurdDemoSwitchInp)
|
||||
|
||||
if _, err = s.Model(ctx).WherePri(in.Id).Data(g.Map{
|
||||
in.Key: in.Value,
|
||||
dao.SysGenCurdDemo.Columns().UpdatedBy: contexts.GetUserId(ctx),
|
||||
dao.SysGenCurdDemo.Columns().UpdatedBy: contexts.GetUserId[any](ctx),
|
||||
}).Update(); err != nil {
|
||||
err = gerror.Wrap(err, "更新CURD列表开关失败,请稍后重试!")
|
||||
return
|
||||
|
@ -210,7 +210,7 @@ func (s *sSysEmsLog) newView(ctx context.Context, in *sysin.SendEmsInp, config *
|
||||
|
||||
var (
|
||||
username string
|
||||
user = contexts.GetUser(ctx)
|
||||
user = contexts.GetUser[any](ctx)
|
||||
request = ghttp.RequestFromCtx(ctx)
|
||||
ip = location.GetClientIp(request)
|
||||
)
|
||||
|
@ -101,7 +101,7 @@ func (s *sSysLog) Export(ctx context.Context, in *sysin.LogListInp) (err error)
|
||||
exportList = append(exportList, row)
|
||||
}
|
||||
|
||||
err = excel.ExportByStructs(ctx, titleList, exportList, fileName, sheetName)
|
||||
err = excel.ExportByStructs[any](ctx, titleList, exportList, fileName, sheetName)
|
||||
return
|
||||
}
|
||||
|
||||
@ -151,7 +151,7 @@ func (s *sSysLog) AutoLog(ctx context.Context) error {
|
||||
// AnalysisLog 解析日志数据
|
||||
func (s *sSysLog) AnalysisLog(ctx context.Context) entity.SysLog {
|
||||
var (
|
||||
mctx = contexts.Get(ctx)
|
||||
mctx = contexts.Get[any](ctx)
|
||||
response = mctx.Response
|
||||
user = mctx.User
|
||||
request = ghttp.RequestFromCtx(ctx)
|
||||
|
@ -115,7 +115,7 @@ func (s *sSysLoginLog) Export(ctx context.Context, in *sysin.LoginLogListInp) (e
|
||||
return
|
||||
}
|
||||
|
||||
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
|
||||
err = excel.ExportByStructs[any](ctx, tags, exports, fileName, sheetName)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -100,7 +100,7 @@ func (s *sSysNormalTreeDemo) Edit(ctx context.Context, in *sysin.NormalTreeDemoE
|
||||
}
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
in.UpdatedBy = contexts.GetUserId(ctx)
|
||||
in.UpdatedBy = contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx).
|
||||
Fields(sysin.NormalTreeDemoUpdateFields{}).
|
||||
WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
@ -110,7 +110,7 @@ func (s *sSysNormalTreeDemo) Edit(ctx context.Context, in *sysin.NormalTreeDemoE
|
||||
}
|
||||
|
||||
// 新增
|
||||
in.CreatedBy = contexts.GetUserId(ctx)
|
||||
in.CreatedBy = contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).
|
||||
Fields(sysin.NormalTreeDemoInsertFields{}).
|
||||
Data(in).OmitEmptyData().Insert(); err != nil {
|
||||
|
@ -100,7 +100,7 @@ func (s *sSysOptionTreeDemo) Edit(ctx context.Context, in *sysin.OptionTreeDemoE
|
||||
}
|
||||
// 修改
|
||||
if in.Id > 0 {
|
||||
in.UpdatedBy = contexts.GetUserId(ctx)
|
||||
in.UpdatedBy = contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx).
|
||||
Fields(sysin.OptionTreeDemoUpdateFields{}).
|
||||
WherePri(in.Id).Data(in).Update(); err != nil {
|
||||
@ -110,7 +110,7 @@ func (s *sSysOptionTreeDemo) Edit(ctx context.Context, in *sysin.OptionTreeDemoE
|
||||
}
|
||||
|
||||
// 新增
|
||||
in.CreatedBy = contexts.GetUserId(ctx)
|
||||
in.CreatedBy = contexts.GetUserId[any](ctx)
|
||||
if _, err = s.Model(ctx, &handler.Option{FilterAuth: false}).
|
||||
Fields(sysin.OptionTreeDemoInsertFields{}).
|
||||
Data(in).OmitEmptyData().Insert(); err != nil {
|
||||
|
@ -123,7 +123,7 @@ func (s *sSysServeLicense) Export(ctx context.Context, in *sysin.ServeLicenseLis
|
||||
return
|
||||
}
|
||||
|
||||
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
|
||||
err = excel.ExportByStructs[any](ctx, tags, exports, fileName, sheetName)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -88,7 +88,7 @@ func (s *sSysServeLog) List(ctx context.Context, in *sysin.ServeLogListInp) (lis
|
||||
return
|
||||
}
|
||||
|
||||
err = mod.Fields(fields).Handler(handler.FilterAuth).Page(in.Page, in.PerPage).OrderDesc(dao.SysServeLog.Columns().Id).Scan(&list)
|
||||
err = mod.Fields(fields).Handler(handler.FilterAuth[any]).Page(in.Page, in.PerPage).OrderDesc(dao.SysServeLog.Columns().Id).Scan(&list)
|
||||
return
|
||||
}
|
||||
|
||||
@ -115,7 +115,7 @@ func (s *sSysServeLog) Export(ctx context.Context, in *sysin.ServeLogListInp) (e
|
||||
return err
|
||||
}
|
||||
|
||||
err = excel.ExportByStructs(ctx, tags, exports, fileName, sheetName)
|
||||
err = excel.ExportByStructs[any](ctx, tags, exports, fileName, sheetName)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -83,7 +83,7 @@ func (s *sView) RenderTpl(ctx context.Context, tpl string, data ...model.View) {
|
||||
viewData["BuildIn"] = &viewBuildIn{httpRequest: request}
|
||||
|
||||
// 插件模板,兼容从资源文件中读取
|
||||
if addonName := contexts.GetAddonName(ctx); len(addonName) > 0 {
|
||||
if addonName := contexts.GetAddonName[any](ctx); len(addonName) > 0 {
|
||||
basePath := addons.GetResourcePath(ctx)
|
||||
if len(basePath) > 0 && !gstr.Contains(tpl, basePath) {
|
||||
path := addons.ViewPath(addonName, basePath)
|
||||
|
@ -11,12 +11,12 @@ import (
|
||||
)
|
||||
|
||||
// Context 请求上下文结构
|
||||
type Context struct {
|
||||
Module string // 应用模块 admin|api|home|websocket
|
||||
AddonName string // 插件名称 如果不是插件模块请求,可能为空
|
||||
User *Identity // 上下文用户信息
|
||||
Response *Response // 请求响应
|
||||
Data g.Map // 自定kv变量 业务模块根据需要设置,不固定
|
||||
type Context[T any] struct {
|
||||
Module string // 应用模块 admin|api|home|websocket
|
||||
AddonName string // 插件名称 如果不是插件模块请求,可能为空
|
||||
User *Identity // 上下文用户信息
|
||||
Response *Response[T] // 请求响应
|
||||
Data g.Map // 自定kv变量 业务模块根据需要设置,不固定
|
||||
}
|
||||
|
||||
// Identity 通用身份模型
|
||||
|
@ -37,7 +37,7 @@ func (in *CreditsLogSaveBalanceInp) Filter(ctx context.Context) (err error) {
|
||||
}
|
||||
|
||||
if in.AppId == "" {
|
||||
in.AppId = contexts.GetModule(ctx)
|
||||
in.AppId = contexts.GetModule[any](ctx)
|
||||
}
|
||||
|
||||
if in.CreditGroup == "" {
|
||||
@ -75,7 +75,7 @@ func (in *CreditsLogSaveIntegralInp) Filter(ctx context.Context) (err error) {
|
||||
}
|
||||
|
||||
if in.AppId == "" {
|
||||
in.AppId = contexts.GetModule(ctx)
|
||||
in.AppId = contexts.GetModule[any](ctx)
|
||||
}
|
||||
|
||||
if in.CreditGroup == "" {
|
||||
|
@ -287,8 +287,8 @@ func (in *MemberAddBalanceInp) Filter(ctx context.Context) (err error) {
|
||||
in.Remark = fmt.Sprintf("扣除余额:%v", in.OtherNum)
|
||||
}
|
||||
|
||||
in.AppId = contexts.GetModule(ctx)
|
||||
in.AddonsName = contexts.GetAddonName(ctx)
|
||||
in.AppId = contexts.GetModule[any](ctx)
|
||||
in.AddonsName = contexts.GetAddonName[any](ctx)
|
||||
return
|
||||
}
|
||||
|
||||
@ -330,8 +330,8 @@ func (in *MemberAddIntegralInp) Filter(ctx context.Context) (err error) {
|
||||
in.Remark = fmt.Sprintf("扣除积分:%v", in.OtherNum)
|
||||
}
|
||||
|
||||
in.AppId = contexts.GetModule(ctx)
|
||||
in.AddonsName = contexts.GetAddonName(ctx)
|
||||
in.AppId = contexts.GetModule[any](ctx)
|
||||
in.AddonsName = contexts.GetAddonName[any](ctx)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -3,14 +3,13 @@
|
||||
// @Copyright Copyright (c) 2023 HotGo CLI
|
||||
// @Author Ms <133814250@qq.com>
|
||||
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
||||
//
|
||||
package model
|
||||
|
||||
// Response HTTP响应
|
||||
type Response struct {
|
||||
type Response[T any] struct {
|
||||
Code int `json:"code" example:"0" description:"状态码"`
|
||||
Message string `json:"message,omitempty" example:"操作成功" description:"提示消息"`
|
||||
Data interface{} `json:"data,omitempty" description:"数据集"`
|
||||
Data T `json:"data,omitempty" description:"数据集"`
|
||||
Error interface{} `json:"error,omitempty" description:"错误信息"`
|
||||
Timestamp int64 `json:"timestamp" example:"1640966400" description:"服务器时间戳"`
|
||||
TraceID string `json:"traceID" v:"0" example:"d0bb93048bc5c9164cdee845dcb7f820" description:"链路ID"`
|
||||
|
@ -29,7 +29,7 @@ func WebSocket(ctx context.Context, group *ghttp.RouterGroup) {
|
||||
group.Middleware(service.Middleware().WebSocketAuth)
|
||||
|
||||
// ws
|
||||
group.GET("/", websocket.WsPage)
|
||||
group.GET("/", websocket.WsPage[any])
|
||||
})
|
||||
|
||||
// 启动websocket监听
|
||||
|
@ -55,7 +55,7 @@ type Client struct {
|
||||
}
|
||||
|
||||
// NewClient 初始化
|
||||
func NewClient(r *ghttp.Request, socket *websocket.Conn, firstTime uint64) (client *Client) {
|
||||
func NewClient[T any](r *ghttp.Request, socket *websocket.Conn, firstTime uint64) (client *Client) {
|
||||
client = &Client{
|
||||
Addr: socket.RemoteAddr().String(),
|
||||
ID: guid.S(),
|
||||
@ -65,7 +65,7 @@ func NewClient(r *ghttp.Request, socket *websocket.Conn, firstTime uint64) (clie
|
||||
closeSignal: make(chan struct{}, 1),
|
||||
FirstTime: firstTime,
|
||||
HeartbeatTime: firstTime,
|
||||
User: contexts.GetUser(r.Context()),
|
||||
User: contexts.GetUser[T](r.Context()),
|
||||
IP: location.GetClientIp(r),
|
||||
UserAgent: r.UserAgent(),
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ func Stop() {
|
||||
}
|
||||
|
||||
// WsPage ws入口
|
||||
func WsPage(r *ghttp.Request) {
|
||||
func WsPage[T any](r *ghttp.Request) {
|
||||
upGrader := websocket.Upgrader{
|
||||
ReadBufferSize: 1024,
|
||||
WriteBufferSize: 1024,
|
||||
@ -48,7 +48,7 @@ func WsPage(r *ghttp.Request) {
|
||||
return
|
||||
}
|
||||
currentTime := uint64(gtime.Now().Unix())
|
||||
client := NewClient(r, conn, currentTime)
|
||||
client := NewClient[T](r, conn, currentTime)
|
||||
go client.read()
|
||||
go client.write()
|
||||
// 用户连接事件
|
||||
|
@ -30,7 +30,7 @@ var (
|
||||
)
|
||||
|
||||
// ExportByStructs 导出切片结构体到excel表格
|
||||
func ExportByStructs(ctx context.Context, tags []string, list interface{}, fileName string, sheetName string) (err error) {
|
||||
func ExportByStructs[T any](ctx context.Context, tags []string, list interface{}, fileName string, sheetName string) (err error) {
|
||||
f := excelize.NewFile()
|
||||
f.SetSheetName("Sheet1", sheetName)
|
||||
_ = f.SetRowHeight("Sheet1", 1, 30)
|
||||
@ -94,7 +94,7 @@ func ExportByStructs(ctx context.Context, tags []string, list interface{}, fileN
|
||||
}
|
||||
|
||||
// 加入到上下文
|
||||
contexts.SetResponse(ctx, &model.Response{
|
||||
contexts.SetResponse(ctx, &model.Response[T]{
|
||||
Code: gcode.CodeOK.Code(),
|
||||
Message: "export successfully!",
|
||||
Timestamp: time.Now().Unix(),
|
||||
|
Loading…
Reference in New Issue
Block a user