package svc import ( "qnc-server/app/main/api/internal/config" "qnc-server/app/main/api/internal/middleware" "qnc-server/app/main/api/internal/service" "qnc-server/app/main/model" "qnc-server/pkg/core/aliyun/cloudauth" "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/cache" "github.com/zeromicro/go-zero/core/stores/redis" "github.com/zeromicro/go-zero/core/stores/sqlx" "github.com/zeromicro/go-zero/rest" ) // ServiceContext 服务上下文 type ServiceContext struct { Config config.Config Redis *redis.Redis // 中间件 AuthInterceptor rest.Middleware UserAuthInterceptor rest.Middleware // 用户相关模型 UserModel model.UserModel UserAuthModel model.UserAuthModel UserTempModel model.UserTempModel // 产品相关模型 ProductModel model.ProductModel FeatureModel model.FeatureModel ProductFeatureModel model.ProductFeatureModel // 订单相关模型 OrderModel model.OrderModel OrderRefundModel model.OrderRefundModel AuthorizationModel model.AuthorizationModel AuthorizationFaceModel model.AuthorizationFaceModel QueryModel model.QueryModel QueryCleanupLogModel model.QueryCleanupLogModel QueryCleanupDetailModel model.QueryCleanupDetailModel QueryCleanupConfigModel model.QueryCleanupConfigModel // 代理相关模型 AgentModel model.AgentModel AgentAuditModel model.AgentAuditModel AgentClosureModel model.AgentClosureModel AgentCommissionModel model.AgentCommissionModel AgentCommissionDeductionModel model.AgentCommissionDeductionModel AgentWalletModel model.AgentWalletModel AgentLinkModel model.AgentLinkModel AgentOrderModel model.AgentOrderModel AgentRewardsModel model.AgentRewardsModel AgentMembershipConfigModel model.AgentMembershipConfigModel AgentMembershipRechargeOrderModel model.AgentMembershipRechargeOrderModel AgentMembershipUserConfigModel model.AgentMembershipUserConfigModel AgentProductConfigModel model.AgentProductConfigModel AgentPlatformDeductionModel model.AgentPlatformDeductionModel AgentActiveStatModel model.AgentActiveStatModel AgentWithdrawalModel model.AgentWithdrawalModel AgentWithdrawalTaxModel model.AgentWithdrawalTaxModel AgentWithdrawalTaxExemptionModel model.AgentWithdrawalTaxExemptionModel AgentRealNameModel model.AgentRealNameModel // 管理后台相关模型 AdminApiModel model.AdminApiModel AdminMenuModel model.AdminMenuModel AdminRoleModel model.AdminRoleModel AdminRoleApiModel model.AdminRoleApiModel AdminRoleMenuModel model.AdminRoleMenuModel AdminUserModel model.AdminUserModel AdminUserRoleModel model.AdminUserRoleModel AdminDictDataModel model.AdminDictDataModel AdminDictTypeModel model.AdminDictTypeModel AdminPromotionLinkModel model.AdminPromotionLinkModel AdminPromotionLinkStatsTotalModel model.AdminPromotionLinkStatsTotalModel AdminPromotionLinkStatsHistoryModel model.AdminPromotionLinkStatsHistoryModel AdminPromotionOrderModel model.AdminPromotionOrderModel // 其他模型 ExampleModel model.ExampleModel GlobalNotificationsModel model.GlobalNotificationsModel // 服务 AlipayService *service.AliPayService WechatPayService *service.WechatPayService ApplePayService *service.ApplePayService WestDexService *service.WestDexService YushanService *service.YushanService ApiRequestService *service.ApiRequestService AsynqServer *asynq.Server AsynqService *service.AsynqService VerificationService *service.VerificationService AgentService *service.AgentService UserService *service.UserService DictService *service.DictService AdminPromotionLinkStatsService *service.AdminPromotionLinkStatsService ImageService *service.ImageService // core service CloudAuthService *cloudauth.CloudAuthClient } // 用户相关模型初始化 type userModels struct { UserModel model.UserModel UserAuthModel model.UserAuthModel UserTempModel model.UserTempModel } func initUserModels(db sqlx.SqlConn, redis cache.CacheConf) userModels { return userModels{ UserModel: model.NewUserModel(db, redis), UserAuthModel: model.NewUserAuthModel(db, redis), UserTempModel: model.NewUserTempModel(db, redis), } } // 产品相关模型初始化 type productModels struct { ProductModel model.ProductModel FeatureModel model.FeatureModel ProductFeatureModel model.ProductFeatureModel } func initProductModels(db sqlx.SqlConn, redis cache.CacheConf) productModels { return productModels{ ProductModel: model.NewProductModel(db, redis), FeatureModel: model.NewFeatureModel(db, redis), ProductFeatureModel: model.NewProductFeatureModel(db, redis), } } // 订单相关模型初始化 type orderModels struct { OrderModel model.OrderModel OrderRefundModel model.OrderRefundModel AuthorizationModel model.AuthorizationModel AuthorizationFaceModel model.AuthorizationFaceModel QueryModel model.QueryModel QueryCleanupLogModel model.QueryCleanupLogModel QueryCleanupDetailModel model.QueryCleanupDetailModel QueryCleanupConfigModel model.QueryCleanupConfigModel } func initOrderModels(db sqlx.SqlConn, redis cache.CacheConf) orderModels { return orderModels{ OrderModel: model.NewOrderModel(db, redis), OrderRefundModel: model.NewOrderRefundModel(db, redis), AuthorizationModel: model.NewAuthorizationModel(db, redis), AuthorizationFaceModel: model.NewAuthorizationFaceModel(db, redis), QueryModel: model.NewQueryModel(db, redis), QueryCleanupLogModel: model.NewQueryCleanupLogModel(db, redis), QueryCleanupDetailModel: model.NewQueryCleanupDetailModel(db, redis), QueryCleanupConfigModel: model.NewQueryCleanupConfigModel(db, redis), } } // 代理相关模型初始化 type agentModels struct { AgentModel model.AgentModel AgentAuditModel model.AgentAuditModel AgentClosureModel model.AgentClosureModel AgentCommissionModel model.AgentCommissionModel AgentCommissionDeductionModel model.AgentCommissionDeductionModel AgentWalletModel model.AgentWalletModel AgentLinkModel model.AgentLinkModel AgentOrderModel model.AgentOrderModel AgentRewardsModel model.AgentRewardsModel AgentMembershipConfigModel model.AgentMembershipConfigModel AgentMembershipRechargeOrderModel model.AgentMembershipRechargeOrderModel AgentMembershipUserConfigModel model.AgentMembershipUserConfigModel AgentProductConfigModel model.AgentProductConfigModel AgentPlatformDeductionModel model.AgentPlatformDeductionModel AgentActiveStatModel model.AgentActiveStatModel AgentWithdrawalModel model.AgentWithdrawalModel AgentWithdrawalTaxModel model.AgentWithdrawalTaxModel AgentWithdrawalTaxExemptionModel model.AgentWithdrawalTaxExemptionModel AgentRealNameModel model.AgentRealNameModel } func initAgentModels(db sqlx.SqlConn, redis cache.CacheConf) agentModels { return agentModels{ AgentModel: model.NewAgentModel(db, redis), AgentAuditModel: model.NewAgentAuditModel(db, redis), AgentClosureModel: model.NewAgentClosureModel(db, redis), AgentCommissionModel: model.NewAgentCommissionModel(db, redis), AgentCommissionDeductionModel: model.NewAgentCommissionDeductionModel(db, redis), AgentWalletModel: model.NewAgentWalletModel(db, redis), AgentLinkModel: model.NewAgentLinkModel(db, redis), AgentOrderModel: model.NewAgentOrderModel(db, redis), AgentRewardsModel: model.NewAgentRewardsModel(db, redis), AgentMembershipConfigModel: model.NewAgentMembershipConfigModel(db, redis), AgentMembershipRechargeOrderModel: model.NewAgentMembershipRechargeOrderModel(db, redis), AgentMembershipUserConfigModel: model.NewAgentMembershipUserConfigModel(db, redis), AgentProductConfigModel: model.NewAgentProductConfigModel(db, redis), AgentPlatformDeductionModel: model.NewAgentPlatformDeductionModel(db, redis), AgentActiveStatModel: model.NewAgentActiveStatModel(db, redis), AgentWithdrawalModel: model.NewAgentWithdrawalModel(db, redis), AgentWithdrawalTaxModel: model.NewAgentWithdrawalTaxModel(db, redis), AgentWithdrawalTaxExemptionModel: model.NewAgentWithdrawalTaxExemptionModel(db, redis), AgentRealNameModel: model.NewAgentRealNameModel(db, redis), } } // 管理后台相关模型初始化 type adminModels struct { AdminApiModel model.AdminApiModel AdminMenuModel model.AdminMenuModel AdminRoleModel model.AdminRoleModel AdminRoleApiModel model.AdminRoleApiModel AdminRoleMenuModel model.AdminRoleMenuModel AdminUserModel model.AdminUserModel AdminUserRoleModel model.AdminUserRoleModel AdminDictDataModel model.AdminDictDataModel AdminDictTypeModel model.AdminDictTypeModel AdminPromotionLinkModel model.AdminPromotionLinkModel AdminPromotionLinkStatsTotalModel model.AdminPromotionLinkStatsTotalModel AdminPromotionLinkStatsHistoryModel model.AdminPromotionLinkStatsHistoryModel AdminPromotionOrderModel model.AdminPromotionOrderModel } func initAdminModels(db sqlx.SqlConn, redis cache.CacheConf) adminModels { return adminModels{ AdminApiModel: model.NewAdminApiModel(db, redis), AdminMenuModel: model.NewAdminMenuModel(db, redis), AdminRoleModel: model.NewAdminRoleModel(db, redis), AdminRoleApiModel: model.NewAdminRoleApiModel(db, redis), AdminRoleMenuModel: model.NewAdminRoleMenuModel(db, redis), AdminUserModel: model.NewAdminUserModel(db, redis), AdminUserRoleModel: model.NewAdminUserRoleModel(db, redis), AdminDictDataModel: model.NewAdminDictDataModel(db, redis), AdminDictTypeModel: model.NewAdminDictTypeModel(db, redis), AdminPromotionLinkModel: model.NewAdminPromotionLinkModel(db, redis), AdminPromotionLinkStatsTotalModel: model.NewAdminPromotionLinkStatsTotalModel(db, redis), AdminPromotionLinkStatsHistoryModel: model.NewAdminPromotionLinkStatsHistoryModel(db, redis), AdminPromotionOrderModel: model.NewAdminPromotionOrderModel(db, redis), } } // 其他模型初始化 type otherModels struct { ExampleModel model.ExampleModel GlobalNotificationsModel model.GlobalNotificationsModel } func initOtherModels(db sqlx.SqlConn, redis cache.CacheConf) otherModels { return otherModels{ ExampleModel: model.NewExampleModel(db, redis), GlobalNotificationsModel: model.NewGlobalNotificationsModel(db, redis), } } // 服务初始化 type services struct { AlipayService *service.AliPayService WechatPayService *service.WechatPayService ApplePayService *service.ApplePayService WestDexService *service.WestDexService YushanService *service.YushanService ApiRequestService *service.ApiRequestService AsynqServer *asynq.Server AsynqService *service.AsynqService VerificationService *service.VerificationService AgentService *service.AgentService UserService *service.UserService DictService *service.DictService AdminPromotionLinkStatsService *service.AdminPromotionLinkStatsService ImageService *service.ImageService CloudAuthService *cloudauth.CloudAuthClient } func initServices(c config.Config, userAuthModel model.UserAuthModel, westDexService *service.WestDexService, yushanService *service.YushanService, featureModel model.FeatureModel, productFeatureModel model.ProductFeatureModel, agentModels agentModels, userModels userModels, adminModels adminModels, userTempModel model.UserTempModel) services { alipayService := service.NewAliPayService(c) wechatPayService := service.NewWechatPayService(c, userAuthModel, service.InitTypeWxPayPubKey) applePayService := service.NewApplePayService(c) apiRequestService := service.NewApiRequestService(c, westDexService, yushanService, featureModel, productFeatureModel) verificationService := service.NewVerificationService(c, westDexService, apiRequestService) asynqService := service.NewAsynqService(c) agentService := service.NewAgentService(c, agentModels.AgentModel, agentModels.AgentAuditModel, agentModels.AgentClosureModel, agentModels.AgentCommissionModel, agentModels.AgentCommissionDeductionModel, agentModels.AgentWalletModel, agentModels.AgentLinkModel, agentModels.AgentOrderModel, agentModels.AgentRewardsModel, agentModels.AgentMembershipConfigModel, agentModels.AgentMembershipRechargeOrderModel, agentModels.AgentMembershipUserConfigModel, agentModels.AgentProductConfigModel, agentModels.AgentPlatformDeductionModel, agentModels.AgentActiveStatModel, asynqService, agentModels.AgentWithdrawalModel) userService := service.NewUserService(&c, userModels.UserModel, userModels.UserAuthModel, userTempModel, agentModels.AgentModel) dictService := service.NewDictService(adminModels.AdminDictTypeModel, adminModels.AdminDictDataModel) AdminPromotionLinkStatsService := service.NewAdminPromotionLinkStatsService(adminModels.AdminPromotionLinkModel, adminModels.AdminPromotionLinkStatsTotalModel, adminModels.AdminPromotionLinkStatsHistoryModel) imageService := service.NewImageService() asynqServer := asynq.NewServer( asynq.RedisClientOpt{Addr: c.CacheRedis[0].Host, Password: c.CacheRedis[0].Pass}, asynq.Config{ IsFailure: func(err error) bool { logx.Errorf("异步任务失败: %+v \n", err) return true }, Concurrency: 10, Queues: map[string]int{ "default": 10, "agent_balance": 6, }, }, ) cloudAuthService, err := cloudauth.NewCloudAuthClient(cloudauth.CloudAuthConfig{ AccessKeyId: c.CloudAuth.AccessKeyId, AccessKeySecret: c.CloudAuth.AccessKeySecret, Endpoint: c.CloudAuth.Endpoint, SceneId: c.CloudAuth.SceneId, ReturnUrl: c.CloudAuth.ReturnUrl, }) if err != nil { logx.Errorf("初始化阿里云人脸认证服务失败: %+v", err) panic(err) } return services{ AlipayService: alipayService, WechatPayService: wechatPayService, ApplePayService: applePayService, WestDexService: westDexService, YushanService: yushanService, ApiRequestService: apiRequestService, AsynqServer: asynqServer, AsynqService: asynqService, VerificationService: verificationService, AgentService: agentService, UserService: userService, DictService: dictService, AdminPromotionLinkStatsService: AdminPromotionLinkStatsService, ImageService: imageService, // core service CloudAuthService: cloudAuthService, } } // NewServiceContext 创建服务上下文 func NewServiceContext(c config.Config) *ServiceContext { db := sqlx.NewMysql(c.DataSource) // 使用配置中的CacheRedis配置 cacheConf := c.CacheRedis // 初始化Redis客户端(用于异步任务等) redisConf := redis.RedisConf{ Host: cacheConf[0].Host, Pass: cacheConf[0].Pass, Type: cacheConf[0].Type, } redisClient := redis.MustNewRedis(redisConf) // 初始化各个模块的模型 userModels := initUserModels(db, cacheConf) productModels := initProductModels(db, cacheConf) orderModels := initOrderModels(db, cacheConf) agentModels := initAgentModels(db, cacheConf) adminModels := initAdminModels(db, cacheConf) otherModels := initOtherModels(db, cacheConf) // 初始化第三方服务 westDexService := service.NewWestDexService(c) yushanService := service.NewYushanService(c) // 初始化所有服务 services := initServices(c, userModels.UserAuthModel, westDexService, yushanService, productModels.FeatureModel, productModels.ProductFeatureModel, agentModels, userModels, adminModels, userModels.UserTempModel) return &ServiceContext{ Config: c, Redis: redisClient, AuthInterceptor: middleware.NewAuthInterceptorMiddleware(c).Handle, UserAuthInterceptor: middleware.NewUserAuthInterceptorMiddleware().Handle, // 用户相关模型 UserModel: userModels.UserModel, UserAuthModel: userModels.UserAuthModel, UserTempModel: userModels.UserTempModel, // 产品相关模型 ProductModel: productModels.ProductModel, FeatureModel: productModels.FeatureModel, ProductFeatureModel: productModels.ProductFeatureModel, // 订单相关模型 OrderModel: orderModels.OrderModel, QueryModel: orderModels.QueryModel, AuthorizationModel: orderModels.AuthorizationModel, AuthorizationFaceModel: orderModels.AuthorizationFaceModel, OrderRefundModel: orderModels.OrderRefundModel, QueryCleanupLogModel: orderModels.QueryCleanupLogModel, QueryCleanupDetailModel: orderModels.QueryCleanupDetailModel, QueryCleanupConfigModel: orderModels.QueryCleanupConfigModel, // 代理相关模型 AgentModel: agentModels.AgentModel, AgentAuditModel: agentModels.AgentAuditModel, AgentClosureModel: agentModels.AgentClosureModel, AgentCommissionModel: agentModels.AgentCommissionModel, AgentCommissionDeductionModel: agentModels.AgentCommissionDeductionModel, AgentWalletModel: agentModels.AgentWalletModel, AgentLinkModel: agentModels.AgentLinkModel, AgentOrderModel: agentModels.AgentOrderModel, AgentRewardsModel: agentModels.AgentRewardsModel, AgentMembershipConfigModel: agentModels.AgentMembershipConfigModel, AgentMembershipRechargeOrderModel: agentModels.AgentMembershipRechargeOrderModel, AgentMembershipUserConfigModel: agentModels.AgentMembershipUserConfigModel, AgentProductConfigModel: agentModels.AgentProductConfigModel, AgentPlatformDeductionModel: agentModels.AgentPlatformDeductionModel, AgentActiveStatModel: agentModels.AgentActiveStatModel, AgentWithdrawalModel: agentModels.AgentWithdrawalModel, AgentWithdrawalTaxModel: agentModels.AgentWithdrawalTaxModel, AgentWithdrawalTaxExemptionModel: agentModels.AgentWithdrawalTaxExemptionModel, AgentRealNameModel: agentModels.AgentRealNameModel, // 管理后台相关模型 AdminApiModel: adminModels.AdminApiModel, AdminMenuModel: adminModels.AdminMenuModel, AdminRoleModel: adminModels.AdminRoleModel, AdminRoleApiModel: adminModels.AdminRoleApiModel, AdminRoleMenuModel: adminModels.AdminRoleMenuModel, AdminUserModel: adminModels.AdminUserModel, AdminUserRoleModel: adminModels.AdminUserRoleModel, AdminDictDataModel: adminModels.AdminDictDataModel, AdminDictTypeModel: adminModels.AdminDictTypeModel, AdminPromotionLinkModel: adminModels.AdminPromotionLinkModel, AdminPromotionLinkStatsTotalModel: adminModels.AdminPromotionLinkStatsTotalModel, AdminPromotionLinkStatsHistoryModel: adminModels.AdminPromotionLinkStatsHistoryModel, AdminPromotionOrderModel: adminModels.AdminPromotionOrderModel, // 其他模型 ExampleModel: otherModels.ExampleModel, GlobalNotificationsModel: otherModels.GlobalNotificationsModel, // 服务 AlipayService: services.AlipayService, WechatPayService: services.WechatPayService, ApplePayService: services.ApplePayService, WestDexService: services.WestDexService, YushanService: services.YushanService, ApiRequestService: services.ApiRequestService, AsynqServer: services.AsynqServer, AsynqService: services.AsynqService, VerificationService: services.VerificationService, AgentService: services.AgentService, UserService: services.UserService, DictService: services.DictService, AdminPromotionLinkStatsService: services.AdminPromotionLinkStatsService, ImageService: services.ImageService, // core service CloudAuthService: services.CloudAuthService, } } func (s *ServiceContext) Close() { if s.AsynqService != nil { s.AsynqService.Close() } }