package middleware import ( "context" "encoding/json" "fmt" "gitee.com/red-future---jilin-g/common/beans" "gitee.com/red-future---jilin-g/common/http" "gitee.com/red-future---jilin-g/common/message" "gitee.com/red-future---jilin-g/common/utils" "github.com/gogf/gf/v2/database/gredis" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/util/gconv" "time" ) func ModuleTenantCheck(r *ghttp.Request) { //将 http.Header 转换为 map[string]string headers := make(map[string]string) for k, v := range r.Request.Header { if len(v) > 0 { headers[k] = v[0] } } // 检查是否是超级管理员 IsSuperAdmin, err := IsSuperAdmin(r.Context(), headers) if err != nil { SetResponseInfo(r.Context(), r, err) } // 如果是超级管理员,则不进行模块租户检查 if IsSuperAdmin.IsSuperAdmin { r.Middleware.Next() return } getUserInfo, err := utils.GetUserInfo(r.Context()) if err != nil { SetResponseInfo(r.Context(), r, err) } exit := gconv.Int64(time.Minute * 1) getEX, err := message.GetRedisClientTest("test").GetEX(r.Context(), fmt.Sprintf("module_tenant:tenantId-%v", getUserInfo.TenantId), gredis.GetEXOption{ TTLOption: gredis.TTLOption{ EX: &exit, }, }) if err != nil { SetResponseInfo(r.Context(), r, err) } // 获取模块key moduleKey := g.Cfg().MustGet(context.Background(), "server.name") if !g.IsEmpty(getEX.String()) { list := make([]beans.ModuleTenant, 0) if err = json.Unmarshal([]byte(getEX.String()), &list); err != nil { SetResponseInfo(r.Context(), r, err) } var expireAt *gtime.Time for _, value := range list { if value.ModuleKey == moduleKey.String() { expireAt = value.ExpireAt break } } // 缓存中有数据,检查是否过期 if !g.IsEmpty(expireAt) { gt1 := gtime.New(time.Now()) gt2 := gtime.New(expireAt) if !gt1.Before(gt2) { SetResponseInfo(r.Context(), r, "您访问的模块已过期,请续期后再使用") } } else { SetResponseInfo(r.Context(), r, "您未开通此模块,请开通后再使用") } } else { // 缓存为空,调用admin-go的Check接口检查模块开通状态 res, err := Check(r.Context(), headers, beans.ModuleTenantCheckReq{ ModuleKey: moduleKey.String(), TenantId: gconv.Uint64(getUserInfo.TenantId), }) if err != nil { SetResponseInfo(r.Context(), r, err) } // 根据检查结果判断是否允许访问 if res.Status == "not_activated" { SetResponseInfo(r.Context(), r, "您未开通此模块,请开通后再使用") } else if res.Status == "expired" { SetResponseInfo(r.Context(), r, "您访问的模块已过期,请续期后再使用") } } r.Middleware.Next() // 继续执行后续中间件和路由处理 } // SetResponseInfo 设置响应信息 func SetResponseInfo(ctx context.Context, r *ghttp.Request, message any) { _ = ctx r.Response.Status = 503 r.Response.WriteJsonExit(map[string]interface{}{ "success": false, "code": 503, "message": fmt.Sprintf("服务不可用:%s", message), }) r.Exit() } // Check 调用admin-go服务检查模块开通状态 func Check(ctx context.Context, headerMap map[string]string, req beans.ModuleTenantCheckReq) (res *beans.ModuleTenantCheckRes, err error) { if err = http.Get(ctx, "admin-go/api/v1/system/moduleTenant/check", headerMap, &res, "moduleKey", req.ModuleKey, "tenantId", req.TenantId, ); err != nil { return } return } // IsSuperAdmin 调用admin-go服务检查是否是超级管理员 func IsSuperAdmin(ctx context.Context, headerMap map[string]string) (res *beans.IsSuperAdminRes, err error) { if err = http.Get(ctx, "admin-go/api/v1/system/user/checkIsSuperAdmin", headerMap, &res); err != nil { return } return }