diff --git a/server/plugin/wechat-integration/api/enter.go b/server/plugin/wechat-integration/api/enter.go index a4e68968..35684da0 100644 --- a/server/plugin/wechat-integration/api/enter.go +++ b/server/plugin/wechat-integration/api/enter.go @@ -2,13 +2,13 @@ package api // ApiGroup 微信集成API组 type ApiGroup struct { - WechatMiniApi WechatMiniApi // 微信小程序API - MpUserApi MpUserApi // 公众号用户API - MpMessageApi MpMessageApi // 公众号消息API - MpAutoReplyApi MpAutoReplyApi // 公众号自动回复API - MpMenuApi MpMenuApi // 公众号菜单API - MpMaterialApi MpMaterialApi // 公众号素材API - WechatWebhookApi WechatWebhookApi // 微信Webhook API + MiniApi MiniApi // 微信小程序API + MpUserApi MpUserApi // 公众号用户API + MpMessageApi MpMessageApi // 公众号消息API + MpAutoReplyApi MpAutoReplyApi // 公众号自动回复API + MpMenuApi MpMenuApi // 公众号菜单API + MpMaterialApi MpMaterialApi // 公众号素材API + WebhookApi WebhookApi // 微信Webhook API } // ApiGroupApp API组实例 diff --git a/server/plugin/wechat-integration/api/wechat_mini_api.go b/server/plugin/wechat-integration/api/mini_api.go similarity index 87% rename from server/plugin/wechat-integration/api/wechat_mini_api.go rename to server/plugin/wechat-integration/api/mini_api.go index 5f036183..b34c4bb8 100644 --- a/server/plugin/wechat-integration/api/wechat_mini_api.go +++ b/server/plugin/wechat-integration/api/mini_api.go @@ -12,9 +12,9 @@ import ( "go.uber.org/zap" ) -type WechatMiniApi struct{} +type MiniApi struct{} -var wechatMiniService = service.ServiceGroupApp.WechatMiniService +var miniService = service.ServiceGroupApp.MiniService // Login 小程序登录 // @Tags WechatMini @@ -25,7 +25,7 @@ var wechatMiniService = service.ServiceGroupApp.WechatMiniService // @Param data body request.MiniLoginRequest true "登录参数" // @Success 200 {object} response.Response{data=response.MiniLoginResponse} "登录成功" // @Router /wechat/mini/login [post] -func (w *WechatMiniApi) Login(c *gin.Context) { +func (w *MiniApi) Login(c *gin.Context) { var req request.MiniLoginRequest err := c.ShouldBindJSON(&req) if err != nil { @@ -38,7 +38,7 @@ func (w *WechatMiniApi) Login(c *gin.Context) { return } - user, err := wechatMiniService.Code2Session(req.Code) + user, err := miniService.Code2Session(req.Code) if err != nil { global.GVA_LOG.Error("小程序登录失败!", zap.Error(err)) response.FailWithMessage("登录失败: "+err.Error(), c) @@ -64,14 +64,14 @@ func (w *WechatMiniApi) Login(c *gin.Context) { // @Param openid query string true "用户openid" // @Success 200 {object} response.Response{data=model.WechatMiniUser} "获取成功" // @Router /wechat/mini/userinfo [get] -func (w *WechatMiniApi) GetUserInfo(c *gin.Context) { +func (w *MiniApi) GetUserInfo(c *gin.Context) { openid := c.Query("openid") if openid == "" { response.FailWithMessage("openid不能为空", c) return } - user, err := wechatMiniService.GetUserInfo(openid) + user, err := miniService.GetUserInfo(openid) if err != nil { global.GVA_LOG.Error("获取用户信息失败!", zap.Error(err)) response.FailWithMessage("获取失败: "+err.Error(), c) @@ -90,7 +90,7 @@ func (w *WechatMiniApi) GetUserInfo(c *gin.Context) { // @Param data body request.UpdateUserInfoRequest true "用户信息" // @Success 200 {object} response.Response "更新成功" // @Router /wechat/mini/userinfo [put] -func (w *WechatMiniApi) UpdateUserInfo(c *gin.Context) { +func (w *MiniApi) UpdateUserInfo(c *gin.Context) { var req request.UpdateUserInfoRequest err := c.ShouldBindJSON(&req) if err != nil { @@ -103,7 +103,7 @@ func (w *WechatMiniApi) UpdateUserInfo(c *gin.Context) { return } - err = wechatMiniService.UpdateUserInfo(req.OpenID, req.UserInfo) + err = miniService.UpdateUserInfo(req.OpenID, req.UserInfo) if err != nil { global.GVA_LOG.Error("更新用户信息失败!", zap.Error(err)) response.FailWithMessage("更新失败: "+err.Error(), c) @@ -122,7 +122,7 @@ func (w *WechatMiniApi) UpdateUserInfo(c *gin.Context) { // @Param data body request.BindPhoneRequest true "绑定参数" // @Success 200 {object} response.Response{data=model.WechatMiniUser} "绑定成功" // @Router /wechat/mini/bind-phone [post] -func (w *WechatMiniApi) BindPhone(c *gin.Context) { +func (w *MiniApi) BindPhone(c *gin.Context) { var req request.BindPhoneRequest err := c.ShouldBindJSON(&req) if err != nil { @@ -135,7 +135,7 @@ func (w *WechatMiniApi) BindPhone(c *gin.Context) { return } - user, err := wechatMiniService.BindPhoneAndLinkUser(req.OpenID, req.Phone) + user, err := miniService.BindPhoneAndLinkUser(req.OpenID, req.Phone) if err != nil { global.GVA_LOG.Error("绑定手机号失败!", zap.Error(err)) response.FailWithMessage("绑定失败: "+err.Error(), c) @@ -155,7 +155,7 @@ func (w *WechatMiniApi) BindPhone(c *gin.Context) { // @Param pageSize query int false "每页数量" // @Success 200 {object} response.Response{data=response.PageResult} "获取成功" // @Router /wechat/mini/users [get] -func (w *WechatMiniApi) GetUserList(c *gin.Context) { +func (w *MiniApi) GetUserList(c *gin.Context) { page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10")) @@ -166,7 +166,7 @@ func (w *WechatMiniApi) GetUserList(c *gin.Context) { pageSize = 10 } - users, total, err := wechatMiniService.GetUserList(page, pageSize) + users, total, err := miniService.GetUserList(page, pageSize) if err != nil { global.GVA_LOG.Error("获取用户列表失败!", zap.Error(err)) response.FailWithMessage("获取失败: "+err.Error(), c) @@ -190,14 +190,14 @@ func (w *WechatMiniApi) GetUserList(c *gin.Context) { // @Param unionid query string true "UnionID" // @Success 200 {object} response.Response{data=model.WechatMiniUser} "检查成功" // @Router /wechat/mini/check-unionid [get] -func (w *WechatMiniApi) CheckUnionID(c *gin.Context) { +func (w *MiniApi) CheckUnionID(c *gin.Context) { unionid := c.Query("unionid") if unionid == "" { response.FailWithMessage("unionid不能为空", c) return } - user, err := wechatMiniService.CheckUnionIDExists(unionid) + user, err := miniService.CheckUnionIDExists(unionid) if err != nil { global.GVA_LOG.Error("检查UnionID失败!", zap.Error(err)) response.FailWithMessage("检查失败: "+err.Error(), c) diff --git a/server/plugin/wechat-integration/api/mp_config_api.go b/server/plugin/wechat-integration/api/mp_config_api.go index f0f8d0b9..81e6aa52 100644 --- a/server/plugin/wechat-integration/api/mp_config_api.go +++ b/server/plugin/wechat-integration/api/mp_config_api.go @@ -301,7 +301,7 @@ func (m *MpConfigApi) ValidateConfig(c *gin.Context) { } // 使用微信公众号服务验证配置 - wechatMpService := service.ServiceGroupApp.WechatMpService + wechatMpService := service.ServiceGroupApp.MpService err = wechatMpService.ValidateConfig(config) if err != nil { global.GVA_LOG.Error("配置连通性测试失败!", zap.Error(err)) diff --git a/server/plugin/wechat-integration/api/wechat_webhook_api.go b/server/plugin/wechat-integration/api/webhook_api.go similarity index 94% rename from server/plugin/wechat-integration/api/wechat_webhook_api.go rename to server/plugin/wechat-integration/api/webhook_api.go index 7d874b3c..10f44c74 100644 --- a/server/plugin/wechat-integration/api/wechat_webhook_api.go +++ b/server/plugin/wechat-integration/api/webhook_api.go @@ -16,7 +16,7 @@ import ( "go.uber.org/zap" ) -type WechatWebhookApi struct{} +type WebhookApi struct{} var webhookMessageService = service.ServiceGroupApp.MpMessageService @@ -32,7 +32,7 @@ var webhookMessageService = service.ServiceGroupApp.MpMessageService // @Param echostr query string false "随机字符串" // @Success 200 {string} string "success" // @Router /wechat/official/webhook [get,post] -func (w *WechatWebhookApi) OfficialAccountWebhook(c *gin.Context) { +func (w *WebhookApi) OfficialAccountWebhook(c *gin.Context) { startTime := time.Now() // 获取参数 @@ -133,7 +133,7 @@ func (w *WechatWebhookApi) OfficialAccountWebhook(c *gin.Context) { } // verifySignature 验证微信签名 -func (w *WechatWebhookApi) verifySignature(signature, timestamp, nonce string) bool { +func (w *WebhookApi) verifySignature(signature, timestamp, nonce string) bool { // 从数据库获取微信公众号配置 var mpConfig model.MpConfig err := global.GVA_DB.Where("config_type = ?", model.ConfigTypeMP).First(&mpConfig).Error @@ -167,7 +167,7 @@ func (w *WechatWebhookApi) verifySignature(signature, timestamp, nonce string) b } // saveWebhookLog 保存Webhook日志到数据库 -func (w *WechatWebhookApi) saveWebhookLog(log *model.MpWebhookLog) { +func (w *WebhookApi) saveWebhookLog(log *model.MpWebhookLog) { if err := global.GVA_DB.Create(log).Error; err != nil { global.GVA_LOG.Error("保存Webhook日志失败", zap.Error(err)) // 数据库记录失败不影响webhook正常响应 diff --git a/server/plugin/wechat-integration/initialize/gorm.go b/server/plugin/wechat-integration/initialize/gorm.go index 6e4481f4..9416b602 100644 --- a/server/plugin/wechat-integration/initialize/gorm.go +++ b/server/plugin/wechat-integration/initialize/gorm.go @@ -11,7 +11,7 @@ import ( func Gorm(ctx context.Context) { // 自动迁移数据库表 err := global.GVA_DB.WithContext(ctx).AutoMigrate( - &model.WechatMiniUser{}, + &model.MiniUser{}, &model.MpUser{}, &model.MpMessage{}, &model.MpMenu{}, diff --git a/server/plugin/wechat-integration/initialize/router.go b/server/plugin/wechat-integration/initialize/router.go index 32625c5c..8157341b 100644 --- a/server/plugin/wechat-integration/initialize/router.go +++ b/server/plugin/wechat-integration/initialize/router.go @@ -16,11 +16,11 @@ func Router(engine *gin.Engine) { privateGroup.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler()) // 初始化微信路由 - wechatRouter := router.WechatRouter{} + wechatRouter := router.Router{} // 公开路由(不需要认证) wechatRouter.InitWechatPublicRouter(publicGroup) // 私有路由(需要认证) - wechatRouter.InitWechatRouter(privateGroup) + wechatRouter.InitRouter(privateGroup) } diff --git a/server/plugin/wechat-integration/model/wechat_mini_user.go b/server/plugin/wechat-integration/model/mini_user.go similarity index 83% rename from server/plugin/wechat-integration/model/wechat_mini_user.go rename to server/plugin/wechat-integration/model/mini_user.go index 4f3ddf7f..40283b39 100644 --- a/server/plugin/wechat-integration/model/wechat_mini_user.go +++ b/server/plugin/wechat-integration/model/mini_user.go @@ -6,8 +6,8 @@ import ( "github.com/flipped-aurora/gin-vue-admin/server/global" ) -// WechatMiniUser 微信小程序用户表 -type WechatMiniUser struct { +// MiniUser 微信小程序用户表 +type MiniUser struct { global.GVA_MODEL OpenID string `json:"openid" gorm:"type:varchar(100);not null;uniqueIndex;comment:用户openid"` UnionID *string `json:"unionid" gorm:"type:varchar(64);index;comment:微信开放平台统一标识"` @@ -25,27 +25,27 @@ type WechatMiniUser struct { } // TableName 指定表名 -func (WechatMiniUser) TableName() string { +func (MiniUser) TableName() string { return "wechat_mini_users" } // IsLinkedToSystemUser 检查是否已关联系统用户 -func (w *WechatMiniUser) IsLinkedToSystemUser() bool { +func (w *MiniUser) IsLinkedToSystemUser() bool { return w.UserID != nil && *w.UserID > 0 } // HasUnionID 检查是否有 UnionID -func (w *WechatMiniUser) HasUnionID() bool { +func (w *MiniUser) HasUnionID() bool { return w.UnionID != nil && *w.UnionID != "" } // HasPhone 检查是否已绑定手机号 -func (w *WechatMiniUser) HasPhone() bool { +func (w *MiniUser) HasPhone() bool { return w.Phone != nil && *w.Phone != "" } // GetDisplayName 获取显示名称 -func (w *WechatMiniUser) GetDisplayName() string { +func (w *MiniUser) GetDisplayName() string { if w.Nickname != nil && *w.Nickname != "" { return *w.Nickname } @@ -53,7 +53,7 @@ func (w *WechatMiniUser) GetDisplayName() string { } // GetAvatarURL 获取头像URL -func (w *WechatMiniUser) GetAvatarURL() string { +func (w *MiniUser) GetAvatarURL() string { if w.AvatarURL != nil { return *w.AvatarURL } diff --git a/server/plugin/wechat-integration/model/request/wechat_mini_request.go b/server/plugin/wechat-integration/model/request/mini_request.go similarity index 100% rename from server/plugin/wechat-integration/model/request/wechat_mini_request.go rename to server/plugin/wechat-integration/model/request/mini_request.go diff --git a/server/plugin/wechat-integration/model/response/wechat_response.go b/server/plugin/wechat-integration/model/response/response.go similarity index 100% rename from server/plugin/wechat-integration/model/response/wechat_response.go rename to server/plugin/wechat-integration/model/response/response.go diff --git a/server/plugin/wechat-integration/router/wechat_router.go b/server/plugin/wechat-integration/router/router.go similarity index 91% rename from server/plugin/wechat-integration/router/wechat_router.go rename to server/plugin/wechat-integration/router/router.go index 8941fcde..591b816b 100644 --- a/server/plugin/wechat-integration/router/wechat_router.go +++ b/server/plugin/wechat-integration/router/router.go @@ -5,14 +5,14 @@ import ( "github.com/gin-gonic/gin" ) -type WechatRouter struct{} +type Router struct{} -// InitWechatRouter 初始化微信路由 -func (w *WechatRouter) InitWechatRouter(Router *gin.RouterGroup) { +// InitRouter 初始化微信路由 +func (w *Router) InitRouter(Router *gin.RouterGroup) { wechatRouter := Router.Group("wechat") // 初始化API实例 - wechatMiniApi := api.WechatMiniApi{} + miniApi := api.MiniApi{} mpUserApi := api.MpUserApi{} mpMessageApi := api.MpMessageApi{} mpMenuApi := api.MpMenuApi{} @@ -29,12 +29,12 @@ func (w *WechatRouter) InitWechatRouter(Router *gin.RouterGroup) { // 微信小程序路由 miniGroup := wechatRouter.Group("mini") { - miniGroup.POST("login", wechatMiniApi.Login) // 小程序登录 - miniGroup.GET("userinfo", wechatMiniApi.GetUserInfo) // 获取用户信息 - miniGroup.PUT("userinfo", wechatMiniApi.UpdateUserInfo) // 更新用户信息 - miniGroup.POST("bind-phone", wechatMiniApi.BindPhone) // 绑定手机号 - miniGroup.GET("users", wechatMiniApi.GetUserList) // 获取用户列表(管理) - miniGroup.GET("check-unionid", wechatMiniApi.CheckUnionID) // 检查UnionID + miniGroup.POST("login", miniApi.Login) // 小程序登录 + miniGroup.GET("userinfo", miniApi.GetUserInfo) // 获取用户信息 + miniGroup.PUT("userinfo", miniApi.UpdateUserInfo) // 更新用户信息 + miniGroup.POST("bind-phone", miniApi.BindPhone) // 绑定手机号 + miniGroup.GET("users", miniApi.GetUserList) // 获取用户列表(管理) + miniGroup.GET("check-unionid", miniApi.CheckUnionID) // 检查UnionID // 小程序统计 miniGroup.GET("statistics", miniStatisticsApi.GetMiniStatistics) // 获取基础统计数据 @@ -151,10 +151,10 @@ func (w *WechatRouter) InitWechatRouter(Router *gin.RouterGroup) { } // InitWechatPublicRouter 初始化微信公开路由(不需要认证) -func (w *WechatRouter) InitWechatPublicRouter(Router *gin.RouterGroup) { +func (w *Router) InitWechatPublicRouter(Router *gin.RouterGroup) { wechatPublicRouter := Router.Group("wechat") - webhookApi := api.WechatWebhookApi{} + webhookApi := api.WebhookApi{} { // 微信公众号Webhook(公开接口,微信服务器调用) diff --git a/server/plugin/wechat-integration/service/enter.go b/server/plugin/wechat-integration/service/enter.go index 17ed3bad..dcee41a2 100644 --- a/server/plugin/wechat-integration/service/enter.go +++ b/server/plugin/wechat-integration/service/enter.go @@ -2,8 +2,8 @@ package service // ServiceGroup 微信集成服务组 type ServiceGroup struct { - WechatMiniService WechatMiniService // 微信小程序服务 - WechatMpService WechatMpService // 微信公众号服务 + MiniService MiniService // 微信小程序服务 + MpService MpService // 微信公众号服务 MpUserService MpUserService // 公众号用户服务 MpMessageService MpMessageService // 公众号消息服务 MpMenuService MpMenuService // 公众号菜单服务 @@ -15,6 +15,7 @@ type ServiceGroup struct { MpConfigService MpConfigService // 微信配置管理服务 MpDraftService MpDraftService // 公众号草稿服务 MpTagService MpTagService // 公众号标签服务 + UserService UserService // 用户服务 } // ServiceGroupApp 服务组实例 diff --git a/server/plugin/wechat-integration/service/wechat_mini_service.go b/server/plugin/wechat-integration/service/mini_service.go similarity index 81% rename from server/plugin/wechat-integration/service/wechat_mini_service.go rename to server/plugin/wechat-integration/service/mini_service.go index 98aa0d43..0eb61c47 100644 --- a/server/plugin/wechat-integration/service/wechat_mini_service.go +++ b/server/plugin/wechat-integration/service/mini_service.go @@ -13,10 +13,10 @@ import ( "gorm.io/gorm" ) -type WechatMiniService struct{} +type MiniService struct{} // GetWechatMiniProgram 获取微信小程序实例 -func (w *WechatMiniService) GetWechatMiniProgram() (*miniprogram.MiniProgram, error) { +func (w *MiniService) GetWechatMiniProgram() (*miniprogram.MiniProgram, error) { if global.GVA_CONFIG.Wechat.MiniAppID == "" || global.GVA_CONFIG.Wechat.MiniAppSecret == "" { return nil, errors.New("微信小程序配置不完整") } @@ -33,7 +33,7 @@ func (w *WechatMiniService) GetWechatMiniProgram() (*miniprogram.MiniProgram, er } // Code2Session 小程序登录凭证校验 -func (w *WechatMiniService) Code2Session(code string) (*model.WechatMiniUser, error) { +func (w *MiniService) Code2Session(code string) (*model.MiniUser, error) { mini, err := w.GetWechatMiniProgram() if err != nil { return nil, err @@ -51,12 +51,12 @@ func (w *WechatMiniService) Code2Session(code string) (*model.WechatMiniUser, er } // 查找或创建用户 - var user model.WechatMiniUser + var user model.MiniUser err = global.GVA_DB.Where("openid = ?", session.OpenID).First(&user).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { // 创建新用户 - user = model.WechatMiniUser{ + user = model.MiniUser{ OpenID: session.OpenID, SessionKey: &session.SessionKey, } @@ -110,8 +110,8 @@ func (w *WechatMiniService) Code2Session(code string) (*model.WechatMiniUser, er } // GetUserInfo 获取用户信息 -func (w *WechatMiniService) GetUserInfo(openid string) (*model.WechatMiniUser, error) { - var user model.WechatMiniUser +func (w *MiniService) GetUserInfo(openid string) (*model.MiniUser, error) { + var user model.MiniUser err := global.GVA_DB.Where("openid = ?", openid).First(&user).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { @@ -123,7 +123,7 @@ func (w *WechatMiniService) GetUserInfo(openid string) (*model.WechatMiniUser, e } // UpdateUserInfo 更新用户信息 -func (w *WechatMiniService) UpdateUserInfo(openid string, userInfo map[string]interface{}) error { +func (w *MiniService) UpdateUserInfo(openid string, userInfo map[string]interface{}) error { updates := make(map[string]interface{}) if nickname, ok := userInfo["nickname"]; ok { @@ -166,7 +166,7 @@ func (w *WechatMiniService) UpdateUserInfo(openid string, userInfo map[string]in return errors.New("没有需要更新的信息") } - err := global.GVA_DB.Model(&model.WechatMiniUser{}).Where("openid = ?", openid).Updates(updates).Error + err := global.GVA_DB.Model(&model.MiniUser{}).Where("openid = ?", openid).Updates(updates).Error if err != nil { global.GVA_LOG.Error("更新微信小程序用户信息失败: " + err.Error()) return err @@ -176,11 +176,11 @@ func (w *WechatMiniService) UpdateUserInfo(openid string, userInfo map[string]in } // GetUserList 获取用户列表 -func (w *WechatMiniService) GetUserList(page, pageSize int) ([]model.WechatMiniUser, int64, error) { - var users []model.WechatMiniUser +func (w *MiniService) GetUserList(page, pageSize int) ([]model.MiniUser, int64, error) { + var users []model.MiniUser var total int64 - db := global.GVA_DB.Model(&model.WechatMiniUser{}) + db := global.GVA_DB.Model(&model.MiniUser{}) // 获取总数 err := db.Count(&total).Error @@ -199,7 +199,7 @@ func (w *WechatMiniService) GetUserList(page, pageSize int) ([]model.WechatMiniU } // linkSystemUser 关联系统用户 (通过 unionid 关联,为未来APP扩展预留) -func (w *WechatMiniService) linkSystemUser(user *model.WechatMiniUser) error { +func (w *MiniService) linkSystemUser(user *model.MiniUser) error { if user.UnionID == nil || *user.UnionID == "" { // 没有 unionid,无法跨平台关联,但小程序仍可正常使用 global.GVA_LOG.Warn("小程序用户没有 UnionID,无法跨平台关联") @@ -207,7 +207,7 @@ func (w *WechatMiniService) linkSystemUser(user *model.WechatMiniUser) error { } // 查找是否有其他小程序用户(或未来的APP用户)已经关联了系统用户 - var existingMiniUser model.WechatMiniUser + var existingMiniUser model.MiniUser err := global.GVA_DB.Where("unionid = ? AND user_id IS NOT NULL AND openid != ?", *user.UnionID, user.OpenID).First(&existingMiniUser).Error if err == nil { // 找到了已关联系统用户的用户,使用相同的 user_id @@ -224,8 +224,8 @@ func (w *WechatMiniService) linkSystemUser(user *model.WechatMiniUser) error { } // GetUserByUnionID 根据 UnionID 获取用户信息 -func (w *WechatMiniService) GetUserByUnionID(unionid string) (*model.WechatMiniUser, error) { - var user model.WechatMiniUser +func (w *MiniService) GetUserByUnionID(unionid string) (*model.MiniUser, error) { + var user model.MiniUser err := global.GVA_DB.Where("unionid = ?", unionid).First(&user).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { @@ -237,8 +237,8 @@ func (w *WechatMiniService) GetUserByUnionID(unionid string) (*model.WechatMiniU } // LinkToSystemUser 手动关联系统用户 -func (w *WechatMiniService) LinkToSystemUser(openid string, userID uint) error { - err := global.GVA_DB.Model(&model.WechatMiniUser{}).Where("openid = ?", openid).Update("user_id", userID).Error +func (w *MiniService) LinkToSystemUser(openid string, userID uint) error { + err := global.GVA_DB.Model(&model.MiniUser{}).Where("openid = ?", openid).Update("user_id", userID).Error if err != nil { global.GVA_LOG.Error("关联系统用户失败: " + err.Error()) return err @@ -249,16 +249,16 @@ func (w *WechatMiniService) LinkToSystemUser(openid string, userID uint) error { } // BindPhoneAndLinkUser 绑定手机号并关联系统用户 -func (w *WechatMiniService) BindPhoneAndLinkUser(openid, phone string) (*model.WechatMiniUser, error) { +func (w *MiniService) BindPhoneAndLinkUser(openid, phone string) (*model.MiniUser, error) { // 1. 更新小程序用户的手机号 - err := global.GVA_DB.Model(&model.WechatMiniUser{}).Where("openid = ?", openid).Update("phone", phone).Error + err := global.GVA_DB.Model(&model.MiniUser{}).Where("openid = ?", openid).Update("phone", phone).Error if err != nil { global.GVA_LOG.Error("更新手机号失败: " + err.Error()) return nil, err } // 2. 获取更新后的用户信息 - var user model.WechatMiniUser + var user model.MiniUser err = global.GVA_DB.Where("openid = ?", openid).First(&user).Error if err != nil { return nil, err @@ -279,8 +279,8 @@ func (w *WechatMiniService) BindPhoneAndLinkUser(openid, phone string) (*model.W } // GetUserByPhone 根据手机号获取用户 -func (w *WechatMiniService) GetUserByPhone(phone string) (*model.WechatMiniUser, error) { - var user model.WechatMiniUser +func (w *MiniService) GetUserByPhone(phone string) (*model.MiniUser, error) { + var user model.MiniUser err := global.GVA_DB.Where("phone = ?", phone).First(&user).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { @@ -292,12 +292,12 @@ func (w *WechatMiniService) GetUserByPhone(phone string) (*model.WechatMiniUser, } // CheckUnionIDExists 检查 UnionID 是否已存在(为APP登录预留) -func (w *WechatMiniService) CheckUnionIDExists(unionid string) (*model.WechatMiniUser, error) { +func (w *MiniService) CheckUnionIDExists(unionid string) (*model.MiniUser, error) { if unionid == "" { return nil, errors.New("unionid 不能为空") } - var user model.WechatMiniUser + var user model.MiniUser err := global.GVA_DB.Where("unionid = ?", unionid).First(&user).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { diff --git a/server/plugin/wechat-integration/service/mini_statistics_service.go b/server/plugin/wechat-integration/service/mini_statistics_service.go index 39bb92b3..ef3ef3ff 100644 --- a/server/plugin/wechat-integration/service/mini_statistics_service.go +++ b/server/plugin/wechat-integration/service/mini_statistics_service.go @@ -14,7 +14,7 @@ type MiniStatisticsService struct{} // getMiniProgram 获取微信小程序实例 func (m *MiniStatisticsService) getMiniProgram() (*miniprogram.MiniProgram, error) { // 使用微信小程序服务获取实例 - return ServiceGroupApp.WechatMiniService.GetWechatMiniProgram() + return ServiceGroupApp.MiniService.GetWechatMiniProgram() } // GetMiniStatistics 获取小程序基础统计数据 diff --git a/server/plugin/wechat-integration/service/mp_config_service.go b/server/plugin/wechat-integration/service/mp_config_service.go index 39dbbc34..342bf863 100644 --- a/server/plugin/wechat-integration/service/mp_config_service.go +++ b/server/plugin/wechat-integration/service/mp_config_service.go @@ -113,7 +113,7 @@ func (m *MpConfigService) testOfficialAccountConfig(config *model.MpConfig) erro // testMiniProgramConfig 测试小程序配置 func (m *MpConfigService) testMiniProgramConfig(config *model.MpConfig) error { // 使用ServiceGroupApp获取默认小程序实例进行测试 - mini, err := ServiceGroupApp.WechatMiniService.GetWechatMiniProgram() + mini, err := ServiceGroupApp.MiniService.GetWechatMiniProgram() if err != nil { return fmt.Errorf("获取小程序实例失败: %v", err) } @@ -252,7 +252,7 @@ func (m *MpConfigService) GenerateQrCode(config *model.MpConfig) (string, error) } // 使用微信公众号服务生成二维码 - wechatMpService := ServiceGroupApp.WechatMpService + wechatMpService := ServiceGroupApp.MpService return wechatMpService.GenerateQrCode(config) } @@ -263,6 +263,6 @@ func (m *MpConfigService) ClearQuota(config *model.MpConfig) error { } // 使用微信公众号服务清空配额 - wechatMpService := ServiceGroupApp.WechatMpService + wechatMpService := ServiceGroupApp.MpService return wechatMpService.ClearQuota(config) } diff --git a/server/plugin/wechat-integration/service/wechat_mp_service.go b/server/plugin/wechat-integration/service/mp_service.go similarity index 85% rename from server/plugin/wechat-integration/service/wechat_mp_service.go rename to server/plugin/wechat-integration/service/mp_service.go index 6e3b3c24..6a406eb3 100644 --- a/server/plugin/wechat-integration/service/wechat_mp_service.go +++ b/server/plugin/wechat-integration/service/mp_service.go @@ -13,10 +13,10 @@ import ( "github.com/silenceper/wechat/v2/officialaccount/config" ) -type WechatMpService struct{} +type MpService struct{} // GetWechatOfficialAccount 获取微信公众号实例 -func (w *WechatMpService) GetWechatOfficialAccount(mpConfig *model.MpConfig) (*officialaccount.OfficialAccount, error) { +func (w *MpService) GetWechatOfficialAccount(mpConfig *model.MpConfig) (*officialaccount.OfficialAccount, error) { if mpConfig == nil { return nil, errors.New("微信公众号配置不能为空") } @@ -46,7 +46,7 @@ func (w *WechatMpService) GetWechatOfficialAccount(mpConfig *model.MpConfig) (*o } // GenerateQrCode 生成公众号二维码 -func (w *WechatMpService) GenerateQrCode(mpConfig *model.MpConfig) (string, error) { +func (w *MpService) GenerateQrCode(mpConfig *model.MpConfig) (string, error) { oa, err := w.GetWechatOfficialAccount(mpConfig) if err != nil { return "", err @@ -73,7 +73,7 @@ func (w *WechatMpService) GenerateQrCode(mpConfig *model.MpConfig) (string, erro } // ClearQuota 清空API配额 -func (w *WechatMpService) ClearQuota(mpConfig *model.MpConfig) error { +func (w *MpService) ClearQuota(mpConfig *model.MpConfig) error { oa, err := w.GetWechatOfficialAccount(mpConfig) if err != nil { return err @@ -92,7 +92,7 @@ func (w *WechatMpService) ClearQuota(mpConfig *model.MpConfig) error { } // ValidateConfig 验证公众号配置 -func (w *WechatMpService) ValidateConfig(mpConfig *model.MpConfig) error { +func (w *MpService) ValidateConfig(mpConfig *model.MpConfig) error { oa, err := w.GetWechatOfficialAccount(mpConfig) if err != nil { return err @@ -115,7 +115,7 @@ func (w *WechatMpService) ValidateConfig(mpConfig *model.MpConfig) error { } // GetServerIPs 获取微信服务器IP地址 -func (w *WechatMpService) GetServerIPs(mpConfig *model.MpConfig) ([]string, error) { +func (w *MpService) GetServerIPs(mpConfig *model.MpConfig) ([]string, error) { oa, err := w.GetWechatOfficialAccount(mpConfig) if err != nil { return nil, err @@ -132,7 +132,7 @@ func (w *WechatMpService) GetServerIPs(mpConfig *model.MpConfig) ([]string, erro } // GetUserInfo 获取用户基本信息 -func (w *WechatMpService) GetUserInfo(mpConfig *model.MpConfig, openID string) (map[string]interface{}, error) { +func (w *MpService) GetUserInfo(mpConfig *model.MpConfig, openID string) (map[string]interface{}, error) { oa, err := w.GetWechatOfficialAccount(mpConfig) if err != nil { return nil, err @@ -158,7 +158,7 @@ func (w *WechatMpService) GetUserInfo(mpConfig *model.MpConfig, openID string) ( } // SendTextMessage 发送文本消息 (暂时注释,需要正确的API调用方式) -// func (w *WechatMpService) SendTextMessage(mpConfig *model.MpConfig, openID, content string) error { +// func (w *MpService) SendTextMessage(mpConfig *model.MpConfig, openID, content string) error { // // TODO: 实现发送文本消息功能 // return errors.New("发送消息功能暂未实现") // } diff --git a/server/plugin/wechat-integration/service/wechat_user_service.go b/server/plugin/wechat-integration/service/user_service.go similarity index 86% rename from server/plugin/wechat-integration/service/wechat_user_service.go rename to server/plugin/wechat-integration/service/user_service.go index 02b95bb3..b7801bd0 100644 --- a/server/plugin/wechat-integration/service/wechat_user_service.go +++ b/server/plugin/wechat-integration/service/user_service.go @@ -7,10 +7,10 @@ import ( "github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/model" ) -type WechatUserService struct{} +type UserService struct{} // GetUnifiedUserInfo 获取统一的微信用户信息 (通过 unionid 关联) -func (w *WechatUserService) GetUnifiedUserInfo(unionid string) (*UnifiedWechatUser, error) { +func (w *UserService) GetUnifiedUserInfo(unionid string) (*UnifiedWechatUser, error) { if unionid == "" { return nil, errors.New("unionid 不能为空") } @@ -18,7 +18,7 @@ func (w *WechatUserService) GetUnifiedUserInfo(unionid string) (*UnifiedWechatUs var unifiedUser UnifiedWechatUser // 查找小程序用户 - var miniUser model.WechatMiniUser + var miniUser model.MiniUser err := global.GVA_DB.Where("unionid = ?", unionid).First(&miniUser).Error if err == nil { unifiedUser.MiniUser = &miniUser @@ -45,12 +45,12 @@ func (w *WechatUserService) GetUnifiedUserInfo(unionid string) (*UnifiedWechatUs } // GetUserBySystemUserID 根据系统用户ID获取微信用户信息 -func (w *WechatUserService) GetUserBySystemUserID(userID uint) (*UnifiedWechatUser, error) { +func (w *UserService) GetUserBySystemUserID(userID uint) (*UnifiedWechatUser, error) { var unifiedUser UnifiedWechatUser unifiedUser.UserID = &userID // 查找小程序用户 - var miniUser model.WechatMiniUser + var miniUser model.MiniUser err := global.GVA_DB.Where("user_id = ?", userID).First(&miniUser).Error if err == nil { unifiedUser.MiniUser = &miniUser @@ -78,7 +78,7 @@ func (w *WechatUserService) GetUserBySystemUserID(userID uint) (*UnifiedWechatUs } // LinkAllAccountsToSystemUser 将所有微信账号关联到系统用户 -func (w *WechatUserService) LinkAllAccountsToSystemUser(unionid string, userID uint) error { +func (w *UserService) LinkAllAccountsToSystemUser(unionid string, userID uint) error { if unionid == "" { return errors.New("unionid 不能为空") } @@ -92,7 +92,7 @@ func (w *WechatUserService) LinkAllAccountsToSystemUser(unionid string, userID u }() // 关联小程序用户 - err := tx.Model(&model.WechatMiniUser{}).Where("unionid = ?", unionid).Update("user_id", userID).Error + err := tx.Model(&model.MiniUser{}).Where("unionid = ?", unionid).Update("user_id", userID).Error if err != nil { tx.Rollback() global.GVA_LOG.Error("关联小程序用户失败: " + err.Error()) @@ -119,7 +119,7 @@ func (w *WechatUserService) LinkAllAccountsToSystemUser(unionid string, userID u } // GetAllWechatUsers 获取所有微信用户列表 (分页) -func (w *WechatUserService) GetAllWechatUsers(page, pageSize int) ([]UnifiedWechatUser, int64, error) { +func (w *UserService) GetAllWechatUsers(page, pageSize int) ([]UnifiedWechatUser, int64, error) { var users []UnifiedWechatUser var total int64 @@ -130,7 +130,7 @@ func (w *WechatUserService) GetAllWechatUsers(page, pageSize int) ([]UnifiedWech var unionIDs []string // 从小程序用户中获取 unionid - err := global.GVA_DB.Model(&model.WechatMiniUser{}). + err := global.GVA_DB.Model(&model.MiniUser{}). Where("unionid IS NOT NULL AND unionid != ''"). Distinct("unionid"). Pluck("unionid", &unionIDs).Error @@ -190,10 +190,10 @@ func (w *WechatUserService) GetAllWechatUsers(page, pageSize int) ([]UnifiedWech // UnifiedWechatUser 统一的微信用户信息结构 type UnifiedWechatUser struct { - UnionID string `json:"unionid"` - UserID *uint `json:"userId"` - MiniUser *model.WechatMiniUser `json:"miniUser,omitempty"` - MpUser *model.MpUser `json:"mpUser,omitempty"` + UnionID string `json:"unionid"` + UserID *uint `json:"userId"` + MiniUser *model.MiniUser `json:"miniUser,omitempty"` + MpUser *model.MpUser `json:"mpUser,omitempty"` } // HasMiniProgram 是否有小程序账号