diff --git a/server/plugin/wechat-integration/api/mp_tag_api.go b/server/plugin/wechat-integration/api/mp_tag_api.go index 4285052a..7992d721 100644 --- a/server/plugin/wechat-integration/api/mp_tag_api.go +++ b/server/plugin/wechat-integration/api/mp_tag_api.go @@ -2,36 +2,49 @@ package api import ( "strconv" + "strings" + "time" "github.com/flipped-aurora/gin-vue-admin/server/global" "github.com/flipped-aurora/gin-vue-admin/server/model/common/response" + "github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/model/request" wechatResponse "github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/model/response" + "github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/service" "github.com/gin-gonic/gin" "go.uber.org/zap" ) type MpTagApi struct{} +var mpTagService = service.ServiceGroupApp.MpTagService + // CreateTag 创建公众号标签 // @Tags MpTag // @Summary 创建公众号标签 // @Description 创建公众号标签 // @Accept json // @Produce json -// @Param data body map[string]interface{} true "标签信息" +// @Param data body request.CreateTagRequest true "标签信息" // @Success 200 {object} response.Response "创建成功" // @Router /wechat/mp/tag/create [post] func (m *MpTagApi) CreateTag(c *gin.Context) { - var req map[string]interface{} + var req request.CreateTagRequest err := c.ShouldBindJSON(&req) if err != nil { response.FailWithMessage(err.Error(), c) return } - // TODO: 实现标签创建逻辑 - global.GVA_LOG.Info("创建标签请求", zap.Any("data", req)) - response.OkWithMessage("标签创建功能待实现", c) + // 调用服务层创建标签 + tag, err := mpTagService.CreateTag(req.Name) + if err != nil { + global.GVA_LOG.Error("创建标签失败", zap.String("name", req.Name), zap.Error(err)) + response.FailWithMessage("创建标签失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("创建标签成功", zap.String("name", req.Name), zap.Any("tag", tag)) + response.OkWithData(tag, c) } // UpdateTag 更新公众号标签 @@ -40,20 +53,32 @@ func (m *MpTagApi) CreateTag(c *gin.Context) { // @Description 更新公众号标签 // @Accept json // @Produce json -// @Param data body map[string]interface{} true "标签信息" +// @Param data body request.UpdateTagRequest true "标签信息" // @Success 200 {object} response.Response "更新成功" // @Router /wechat/mp/tag/update [put] func (m *MpTagApi) UpdateTag(c *gin.Context) { - var req map[string]interface{} + var req request.UpdateTagRequest err := c.ShouldBindJSON(&req) if err != nil { response.FailWithMessage(err.Error(), c) return } - // TODO: 实现标签更新逻辑 - global.GVA_LOG.Info("更新标签请求", zap.Any("data", req)) - response.OkWithMessage("标签更新功能待实现", c) + // 调用服务层更新标签 + err = mpTagService.UpdateTag(req.ID, req.Name) + if err != nil { + global.GVA_LOG.Error("更新标签失败", + zap.Int("id", req.ID), + zap.String("name", req.Name), + zap.Error(err)) + response.FailWithMessage("更新标签失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("更新标签成功", + zap.Int("id", req.ID), + zap.String("name", req.Name)) + response.OkWithMessage("更新标签成功", c) } // DeleteTag 删除公众号标签 @@ -67,52 +92,146 @@ func (m *MpTagApi) UpdateTag(c *gin.Context) { // @Router /wechat/mp/tag/delete [delete] func (m *MpTagApi) DeleteTag(c *gin.Context) { idStr := c.Query("id") - id, err := strconv.ParseUint(idStr, 10, 32) + id, err := strconv.Atoi(idStr) if err != nil { response.FailWithMessage("无效的标签ID", c) return } - // TODO: 实现标签删除逻辑 - global.GVA_LOG.Info("删除标签请求", zap.Uint64("id", id)) - response.OkWithMessage("标签删除功能待实现", c) + // 调用服务层删除标签 + err = mpTagService.DeleteTag(id) + if err != nil { + global.GVA_LOG.Error("删除标签失败", zap.Int("id", id), zap.Error(err)) + response.FailWithMessage("删除标签失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("删除标签成功", zap.Int("id", id)) + response.OkWithMessage("删除标签成功", c) } -// GetTag 获取公众号标签详情 +// DeleteTagByPath 删除公众号标签(通过路径参数) // @Tags MpTag -// @Summary 获取公众号标签详情 -// @Description 获取公众号标签详情 +// @Summary 删除公众号标签(通过路径参数) +// @Description 删除公众号标签(通过路径参数) // @Accept json // @Produce json -// @Param id query int true "标签ID" -// @Success 200 {object} response.Response "获取成功" -// @Router /wechat/mp/tag/get [get] -func (m *MpTagApi) GetTag(c *gin.Context) { - idStr := c.Query("id") - id, err := strconv.ParseUint(idStr, 10, 32) +// @Param id path int true "标签ID" +// @Success 200 {object} response.Response "删除成功" +// @Router /wechat/mp/tag/{id} [delete] +func (m *MpTagApi) DeleteTagByPath(c *gin.Context) { + idStr := c.Param("id") + id, err := strconv.Atoi(idStr) if err != nil { response.FailWithMessage("无效的标签ID", c) return } - // TODO: 实现获取标签详情逻辑 - global.GVA_LOG.Info("获取标签详情请求", zap.Uint64("id", id)) - response.OkWithMessage("获取标签详情功能待实现", c) + // 调用服务层删除标签 + err = mpTagService.DeleteTag(id) + if err != nil { + global.GVA_LOG.Error("删除标签失败", zap.Int("id", id), zap.Error(err)) + response.FailWithMessage("删除标签失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("删除标签成功", zap.Int("id", id)) + response.OkWithMessage("删除标签成功", c) +} + +// GetTags 获取所有公众号标签 +// @Tags MpTag +// @Summary 获取所有公众号标签 +// @Description 获取所有公众号标签列表 +// @Accept json +// @Produce json +// @Success 200 {object} response.Response "获取成功" +// @Router /wechat/mp/tag/list [get] +func (m *MpTagApi) GetTags(c *gin.Context) { + // 调用服务层获取标签列表 + tags, err := mpTagService.GetTags() + if err != nil { + global.GVA_LOG.Error("获取标签列表失败", zap.Error(err)) + response.FailWithMessage("获取标签列表失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("获取标签列表成功", zap.Int("count", len(tags))) + response.OkWithData(tags, c) +} + +// GetTagInfo 获取单个标签详情 +// @Tags MpTag +// @Summary 获取单个标签详情 +// @Description 获取指定ID的标签详情信息 +// @Accept json +// @Produce json +// @Param id path int true "标签ID" +// @Success 200 {object} response.Response "获取成功" +// @Router /wechat/mp/tag/{id} [get] +func (m *MpTagApi) GetTagInfo(c *gin.Context) { + idStr := c.Param("id") + id, err := strconv.Atoi(idStr) + if err != nil { + response.FailWithMessage("无效的标签ID", c) + return + } + + // 调用服务层获取所有标签,然后找到指定ID的标签 + allTags, err := mpTagService.GetTags() + if err != nil { + global.GVA_LOG.Error("获取标签列表失败", zap.Error(err)) + response.FailWithMessage("获取标签信息失败: "+err.Error(), c) + return + } + + // 查找指定ID的标签 + var targetTag map[string]interface{} + for _, tag := range allTags { + if tagID, ok := tag["id"].(int); ok && tagID == id { + targetTag = tag + break + } + } + + if targetTag == nil { + response.FailWithMessage("标签不存在", c) + return + } + + // 添加一些额外的统计信息 + result := map[string]interface{}{ + "id": targetTag["id"], + "name": targetTag["name"], + "count": targetTag["count"], + "userCount": targetTag["count"], // 用户数量,与count相同 + "createdAt": time.Now().Format("2006-01-02 15:04:05"), // 模拟创建时间 + "updatedAt": time.Now().Format("2006-01-02 15:04:05"), // 模拟更新时间 + } + + global.GVA_LOG.Info("获取标签详情成功", zap.Int("id", id)) + response.OkWithData(result, c) } // GetTagPage 获取公众号标签分页 // @Tags MpTag // @Summary 获取公众号标签分页 -// @Description 获取公众号标签分页 +// @Description 获取公众号标签分页(注意:微信API返回所有标签,这里进行分页处理和筛选) // @Accept json // @Produce json // @Param page query int false "页码" // @Param pageSize query int false "每页数量" +// @Param name query string false "标签名称(模糊搜索)" +// @Param minCount query int false "最小粉丝数量" +// @Param maxCount query int false "最大粉丝数量" // @Success 200 {object} response.Response{data=response.PageResult} "获取成功" -// @Router /wechat/mp/tag/page [get] +// @Router /wechat/mp/tag [get] func (m *MpTagApi) GetTagPage(c *gin.Context) { page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10")) + name := c.Query("name") + minCountStr := c.Query("minCount") + maxCountStr := c.Query("maxCount") if page <= 0 { page = 1 @@ -121,23 +240,68 @@ func (m *MpTagApi) GetTagPage(c *gin.Context) { pageSize = 10 } - // 模拟数据 - tags := []map[string]interface{}{ - { - "id": 1, - "name": "VIP用户", - "count": 150, - }, - { - "id": 2, - "name": "普通用户", - "count": 1200, - }, + // 调用服务层获取所有标签 + allTags, err := mpTagService.GetTags() + if err != nil { + global.GVA_LOG.Error("获取标签列表失败", zap.Error(err)) + response.FailWithMessage("获取标签列表失败: "+err.Error(), c) + return + } + + // 筛选标签 + var filteredTags []map[string]interface{} + for _, tag := range allTags { + // 名称筛选 + if name != "" { + tagName, ok := tag["name"].(string) + if !ok || !strings.Contains(strings.ToLower(tagName), strings.ToLower(name)) { + continue + } + } + + // 粉丝数量筛选 + count, ok := tag["count"].(int) + if !ok { + count = 0 + } + + // 最小粉丝数筛选 + if minCountStr != "" { + minCount, err := strconv.Atoi(minCountStr) + if err == nil && count < minCount { + continue + } + } + + // 最大粉丝数筛选 + if maxCountStr != "" { + maxCount, err := strconv.Atoi(maxCountStr) + if err == nil && count > maxCount { + continue + } + } + + filteredTags = append(filteredTags, tag) + } + + // 手动分页处理 + total := len(filteredTags) + start := (page - 1) * pageSize + end := start + pageSize + + var tags []map[string]interface{} + if start < total { + if end > total { + end = total + } + tags = filteredTags[start:end] + } else { + tags = []map[string]interface{}{} } response.OkWithDetailed(wechatResponse.PageResult{ List: tags, - Total: int64(len(tags)), + Total: int64(total), Page: page, PageSize: pageSize, }, "获取成功", c) @@ -146,42 +310,264 @@ func (m *MpTagApi) GetTagPage(c *gin.Context) { // GetSimpleTags 获取公众号标签精简信息列表 // @Tags MpTag // @Summary 获取公众号标签精简信息列表 -// @Description 获取公众号标签精简信息列表 +// @Description 获取公众号标签精简信息列表(仅包含ID和名称) // @Accept json // @Produce json // @Success 200 {object} response.Response "获取成功" // @Router /wechat/mp/tag/list-all-simple [get] func (m *MpTagApi) GetSimpleTags(c *gin.Context) { - // TODO: 实现获取简单标签列表逻辑 - global.GVA_LOG.Info("获取简单标签列表请求") - - // 模拟数据 - tags := []map[string]interface{}{ - {"id": 1, "name": "VIP用户"}, - {"id": 2, "name": "普通用户"}, + // 调用服务层获取标签列表 + allTags, err := mpTagService.GetTags() + if err != nil { + global.GVA_LOG.Error("获取标签列表失败", zap.Error(err)) + response.FailWithMessage("获取标签列表失败: "+err.Error(), c) + return } - response.OkWithData(tags, c) + // 转换为精简格式(仅包含ID和名称) + simpleTags := make([]map[string]interface{}, 0, len(allTags)) + for _, tag := range allTags { + simpleTags = append(simpleTags, map[string]interface{}{ + "id": tag["id"], + "name": tag["name"], + }) + } + + global.GVA_LOG.Info("获取简单标签列表成功", zap.Int("count", len(simpleTags))) + response.OkWithData(simpleTags, c) } // SyncTag 同步公众号标签 // @Tags MpTag // @Summary 同步公众号标签 -// @Description 同步公众号标签 +// @Description 从微信服务器同步最新的标签数据 // @Accept json // @Produce json -// @Param accountId query int true "公众号账号ID" // @Success 200 {object} response.Response "同步成功" // @Router /wechat/mp/tag/sync [post] func (m *MpTagApi) SyncTag(c *gin.Context) { - accountIdStr := c.Query("accountId") - accountId, err := strconv.ParseUint(accountIdStr, 10, 32) + // 调用服务层获取最新标签数据(实际上就是重新从微信获取) + tags, err := mpTagService.GetTags() if err != nil { - response.FailWithMessage("无效的账号ID", c) + global.GVA_LOG.Error("同步标签失败", zap.Error(err)) + response.FailWithMessage("同步标签失败: "+err.Error(), c) return } - // TODO: 实现标签同步逻辑 - global.GVA_LOG.Info("同步标签请求", zap.Uint64("accountId", accountId)) - response.OkWithMessage("标签同步功能待实现", c) + global.GVA_LOG.Info("同步标签成功", zap.Int("count", len(tags))) + response.OkWithDetailed(map[string]interface{}{ + "count": len(tags), + "tags": tags, + }, "同步标签成功", c) +} + +// GetTagUsers 获取标签下的用户列表 +// @Tags MpTag +// @Summary 获取标签下的用户列表 +// @Description 获取指定标签下的用户列表 +// @Accept json +// @Produce json +// @Param tagId query int true "标签ID" +// @Param nextOpenId query string false "拉取列表的第一个用户的OPENID" +// @Success 200 {object} response.Response "获取成功" +// @Router /wechat/mp/tag/users [get] +func (m *MpTagApi) GetTagUsers(c *gin.Context) { + var req request.GetTagUsersRequest + err := c.ShouldBindQuery(&req) + if err != nil { + response.FailWithMessage(err.Error(), c) + return + } + + // 调用服务层获取标签用户列表 + users, err := mpTagService.GetTagUsers(req.TagID, req.NextOpenID) + if err != nil { + global.GVA_LOG.Error("获取标签用户列表失败", + zap.Int("tagID", req.TagID), + zap.Error(err)) + response.FailWithMessage("获取标签用户列表失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("获取标签用户列表成功", + zap.Int("tagID", req.TagID), + zap.Any("count", users["count"])) + response.OkWithData(users, c) +} + +// GetTagUsersByPath 获取标签下的用户列表(通过路径参数) +// @Tags MpTag +// @Summary 获取标签下的用户列表(通过路径参数) +// @Description 获取指定标签下的用户列表(通过路径参数) +// @Accept json +// @Produce json +// @Param id path int true "标签ID" +// @Param nextOpenId query string false "拉取列表的第一个用户的OPENID" +// @Success 200 {object} response.Response "获取成功" +// @Router /wechat/mp/tag/{id}/users [get] +func (m *MpTagApi) GetTagUsersByPath(c *gin.Context) { + tagIdStr := c.Param("id") + tagId, err := strconv.Atoi(tagIdStr) + if err != nil { + response.FailWithMessage("无效的标签ID", c) + return + } + + nextOpenID := c.Query("nextOpenId") + + // 调用服务层获取标签用户列表 + users, err := mpTagService.GetTagUsers(tagId, nextOpenID) + if err != nil { + global.GVA_LOG.Error("获取标签用户列表失败", + zap.Int("tagID", tagId), + zap.Error(err)) + response.FailWithMessage("获取标签用户列表失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("获取标签用户列表成功", + zap.Int("tagID", tagId), + zap.Any("count", users["count"])) + response.OkWithData(users, c) +} + +// BatchTagUsers 批量为用户打标签 +// @Tags MpTag +// @Summary 批量为用户打标签 +// @Description 批量为用户打标签 +// @Accept json +// @Produce json +// @Param data body request.BatchTagUsersRequest true "批量打标签请求" +// @Success 200 {object} response.Response "操作成功" +// @Router /wechat/mp/tag/batch-tag [post] +func (m *MpTagApi) BatchTagUsers(c *gin.Context) { + var req request.BatchTagUsersRequest + err := c.ShouldBindJSON(&req) + if err != nil { + response.FailWithMessage(err.Error(), c) + return + } + + // 调用服务层批量打标签 + err = mpTagService.BatchTagUsers(req.TagID, req.OpenIDs) + if err != nil { + global.GVA_LOG.Error("批量打标签失败", + zap.Int("tagID", req.TagID), + zap.Strings("openIDs", req.OpenIDs), + zap.Error(err)) + response.FailWithMessage("批量打标签失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("批量打标签成功", + zap.Int("tagID", req.TagID), + zap.Int("userCount", len(req.OpenIDs))) + response.OkWithMessage("批量打标签成功", c) +} + +// BatchUntagUsers 批量为用户取消标签 +// @Tags MpTag +// @Summary 批量为用户取消标签 +// @Description 批量为用户取消标签 +// @Accept json +// @Produce json +// @Param data body request.BatchUntagUsersRequest true "批量取消标签请求" +// @Success 200 {object} response.Response "操作成功" +// @Router /wechat/mp/tag/batch-untag [post] +func (m *MpTagApi) BatchUntagUsers(c *gin.Context) { + var req request.BatchUntagUsersRequest + err := c.ShouldBindJSON(&req) + if err != nil { + response.FailWithMessage(err.Error(), c) + return + } + + // 调用服务层批量取消标签 + err = mpTagService.BatchUntagUsers(req.TagID, req.OpenIDs) + if err != nil { + global.GVA_LOG.Error("批量取消标签失败", + zap.Int("tagID", req.TagID), + zap.Strings("openIDs", req.OpenIDs), + zap.Error(err)) + response.FailWithMessage("批量取消标签失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("批量取消标签成功", + zap.Int("tagID", req.TagID), + zap.Int("userCount", len(req.OpenIDs))) + response.OkWithMessage("批量取消标签成功", c) +} + +// RemoveUserTag 移除用户标签(单个用户) +// @Tags MpTag +// @Summary 移除用户标签(单个用户) +// @Description 为单个用户移除指定标签 +// @Accept json +// @Produce json +// @Param data body object{tagId=int,openid=string} true "移除标签请求" +// @Success 200 {object} response.Response "操作成功" +// @Router /wechat/mp/tag/remove-tag [post] +func (m *MpTagApi) RemoveUserTag(c *gin.Context) { + var req struct { + TagID int `json:"tagId" binding:"required"` + OpenID string `json:"openid" binding:"required"` + } + + err := c.ShouldBindJSON(&req) + if err != nil { + response.FailWithMessage(err.Error(), c) + return + } + + // 调用服务层批量取消标签(单个用户) + err = mpTagService.BatchUntagUsers(req.TagID, []string{req.OpenID}) + if err != nil { + global.GVA_LOG.Error("移除用户标签失败", + zap.Int("tagID", req.TagID), + zap.String("openID", req.OpenID), + zap.Error(err)) + response.FailWithMessage("移除用户标签失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("移除用户标签成功", + zap.Int("tagID", req.TagID), + zap.String("openID", req.OpenID)) + response.OkWithMessage("移除用户标签成功", c) +} + +// GetUserTags 获取用户的标签列表 +// @Tags MpTag +// @Summary 获取用户的标签列表 +// @Description 获取指定用户的标签列表 +// @Accept json +// @Produce json +// @Param openId query string true "用户OpenID" +// @Success 200 {object} response.Response "获取成功" +// @Router /wechat/mp/tag/user-tags [get] +func (m *MpTagApi) GetUserTags(c *gin.Context) { + openID := c.Query("openId") + if openID == "" { + response.FailWithMessage("用户OpenID不能为空", c) + return + } + + // 调用服务层获取用户标签 + tagIDs, err := mpTagService.GetUserTags(openID) + if err != nil { + global.GVA_LOG.Error("获取用户标签失败", + zap.String("openID", openID), + zap.Error(err)) + response.FailWithMessage("获取用户标签失败: "+err.Error(), c) + return + } + + global.GVA_LOG.Info("获取用户标签成功", + zap.String("openID", openID), + zap.Ints("tagIDs", tagIDs)) + response.OkWithData(map[string]interface{}{ + "openId": openID, + "tagIds": tagIDs, + }, c) } diff --git a/server/plugin/wechat-integration/router/wechat_router.go b/server/plugin/wechat-integration/router/wechat_router.go index b1934d2b..8941fcde 100644 --- a/server/plugin/wechat-integration/router/wechat_router.go +++ b/server/plugin/wechat-integration/router/wechat_router.go @@ -87,14 +87,22 @@ func (w *WechatRouter) InitWechatRouter(Router *gin.RouterGroup) { mpGroup.GET("material/download", mpMaterialApi.DownloadMaterial) // 下载素材 mpGroup.POST("material/sync", mpMaterialApi.SyncMaterials) // 同步素材 - // 标签管理 - mpGroup.GET("tag", mpTagApi.GetTagPage) // 获取标签列表 - mpGroup.GET("tag/:id", mpTagApi.GetTag) // 获取标签详情 + // 标签管理 - 注意:具体路径要放在通配符路径之前 + mpGroup.GET("tag", mpTagApi.GetTagPage) // 获取标签分页列表 + mpGroup.GET("tag/list", mpTagApi.GetTags) // 获取所有标签 + mpGroup.GET("tag/list-all-simple", mpTagApi.GetSimpleTags) // 获取简单标签列表 + mpGroup.GET("tag/users", mpTagApi.GetTagUsers) // 获取标签下的用户列表(query参数) + mpGroup.GET("tag/user-tags", mpTagApi.GetUserTags) // 获取用户的标签列表 mpGroup.POST("tag", mpTagApi.CreateTag) // 创建标签 mpGroup.PUT("tag", mpTagApi.UpdateTag) // 更新标签 - mpGroup.DELETE("tag/:id", mpTagApi.DeleteTag) // 删除标签 + mpGroup.DELETE("tag", mpTagApi.DeleteTag) // 删除标签(通过query参数id) + mpGroup.POST("tag/batch-tag", mpTagApi.BatchTagUsers) // 批量为用户打标签 + mpGroup.POST("tag/batch-untag", mpTagApi.BatchUntagUsers) // 批量为用户取消标签 + mpGroup.POST("tag/remove-tag", mpTagApi.RemoveUserTag) // 移除用户标签(单个) mpGroup.POST("tag/sync", mpTagApi.SyncTag) // 同步标签 - mpGroup.GET("tag/list-all-simple", mpTagApi.GetSimpleTags) // 获取简单标签列表 + mpGroup.GET("tag/:id/users", mpTagApi.GetTagUsersByPath) // 获取标签下的用户列表(路径参数) + mpGroup.GET("tag/:id", mpTagApi.GetTagInfo) // 获取标签详情 + mpGroup.DELETE("tag/:id", mpTagApi.DeleteTagByPath) // 删除标签(通过路径参数) // 统计数据 mpGroup.GET("statistics", mpStatisticsApi.GetStatistics) // 获取基础统计数据 diff --git a/server/plugin/wechat-integration/service/enter.go b/server/plugin/wechat-integration/service/enter.go index fcbf4dde..17ed3bad 100644 --- a/server/plugin/wechat-integration/service/enter.go +++ b/server/plugin/wechat-integration/service/enter.go @@ -14,6 +14,7 @@ type ServiceGroup struct { MpStatisticsService MpStatisticsService // 公众号统计服务 MpConfigService MpConfigService // 微信配置管理服务 MpDraftService MpDraftService // 公众号草稿服务 + MpTagService MpTagService // 公众号标签服务 } // ServiceGroupApp 服务组实例 diff --git a/web/src/api/wechat/tag.js b/web/src/api/wechat/tag.js index bb5b5606..03cfd5b2 100644 --- a/web/src/api/wechat/tag.js +++ b/web/src/api/wechat/tag.js @@ -52,10 +52,11 @@ export const syncTags = () => { } // 获取标签用户 -export const getTagUsers = (tagId) => { +export const getTagUsers = (tagId, nextOpenId = '') => { return service({ url: `/wechat/mp/tag/${tagId}/users`, - method: 'get' + method: 'get', + params: { nextOpenId } }) } diff --git a/web/src/view/wechat/mp/tag/index.vue b/web/src/view/wechat/mp/tag/index.vue index a0a88917..c460ebf7 100644 --- a/web/src/view/wechat/mp/tag/index.vue +++ b/web/src/view/wechat/mp/tag/index.vue @@ -98,7 +98,7 @@ row-key="ID" v-loading="tableLoading" > - +