bindbox-game/.trae/documents/工会审核与成员管理完善.md
邹方成 6ee627139c
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 40s
feat: 新增支付测试小程序与微信支付集成
feat(pay): 添加支付API基础结构
feat(miniapp): 创建支付测试小程序页面与配置
feat(wechatpay): 配置微信支付参数与证书
fix(guild): 修复成员列表查询条件
docs: 更新代码规范文档与需求文档
style: 统一前后端枚举显示与注释格式
refactor(admin): 重构用户奖励发放接口参数处理
test(title): 添加称号效果参数验证测试
2025-11-17 00:42:08 +08:00

58 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 现状与缺口
- 审核未落地:`internal/service/guild/join.go:13-48` 加入逻辑固定写 `JoinStatus=2`(同意),未按 `join_mode=1` 走待审流程;接口仅 `JoinGuild/LeaveGuild`,无审批。
- 管理端缺踢人:仅成员列表 `internal/api/admin/guild_members.go:42-73`;前端成员页无操作列 `web/admin/src/views/guild/members/index.vue:30-35`
- 角色字段未赋权:虽有 `owner/admin/member``internal/repository/mysql/model/guild_members.gen.go:19-23`),但未做权限绑定与校验。
## 目标与范围
- 增加「加入申请与审核」能力:支持待审、通过、拒绝;仅当 `join_mode=1` 生效。
- 增加「成员剔除」能力:管理端支持踢人,并记录操作日志。
- 基础优化:完善角色权限(会长/官员)、分页/检索一致性、接口与 Swagger 描述对齐。
## 后端改造
- 模型与数据流
- 新增表 `guild_join_applications`(推荐方案):字段 `id/guild_id/user_id/apply_time/status(0待审,1通过,2拒绝)/reviewer_id/review_time/remark`
- `JoinGuild` 改造:
-`join_mode=1` 时,仅写一条 `applications(pending)`,不立即写 `guild_members`;返回“申请已提交”。
-`join_mode=2` 时,维持现状直接入会(`JoinStatus=2`)。
- 为兼容保留 24h 离开限制与重复加入校验。
- 审批动作:
- 通过:写 `guild_members``status=1, role=member, start_time=now, join_status=2`),并更新申请为 `approved`;拒绝:仅更新申请为 `rejected`
- 踢人动作:新增服务 `KickMember(ctx, guildID, userID)`,仅将成员 `status=2` 并回写时间;禁止踢会长自身,需先转移会长。
- 服务接口(`internal/service/guild/guild.go`
- 新增:`ListApplications/ApproveApplication/RejectApplication/KickMember` 方法。
- 控制器与路由Admin
- `GET /api/admin/guilds/:guild_id/applications` 列表(分页、按状态过滤)。
- `POST /api/admin/guilds/:guild_id/applications/:id/approve``POST .../reject`
- `DELETE /api/admin/guilds/:guild_id/members/:user_id` 踢人。
- 接口均校验:`IsSuper==1`(现行规则),并记录操作日志(`log_operation`)。
- 控制器与路由App可选
- `POST /api/app/guilds/:guild_id/applications` 提交申请;`GET /api/app/guilds/:guild_id/applications/:id` 查询状态。
- 查询一致性
- 成员列表 `internal/service/guild/members_list.go:9-29` 保持 `status=1` 过滤;无需受待审数据影响。
## 管理端前端改造
- API 封装(`web/admin/src/api/guild.ts`
- 增加 `fetchGetGuildApplications``approveGuildApplication``rejectGuildApplication``kickGuildMember`
- 成员页(`web/admin/src/views/guild/members/index.vue`
- 增加操作列与「踢出」按钮;调用 `kickGuildMember`,成功后刷新当前页。
- 新增「申请审核」页
- 列表展示用户ID、申请时间、状态提供「通过/拒绝」操作;支持按状态筛选与分页。
- 路由与菜单
-`web/admin/src/router/modules/guild.ts` 增加“工会申请审核”菜单。
## 权限与审计
- 权限:管理端暂按 `IsSuper==1`;后续可拓展为“会长/官员”在 App 端可审与踢人(基于 `GuildMembers.Role` 校验)。
- 审计:所有审批与踢人动作写入 `log_operation`,包含 guild_id/user_id/reviewer_id/动作/结果。
## 验收标准
- 加入审核:当 `join_mode=1` 时,提交申请后在管理端可见;可通过/拒绝;通过后出现在成员列表。
- 成员剔除:管理端成员页出现「踢出」操作,成功后该成员不再出现在成员列表;禁止踢会长。
- 权限:非超管无法访问管理端相关接口;错误提示与状态码规范。
- 文档Swagger 增补新端点与模型;接口参数与响应示例完整。
## 风险与兼容
- 数据迁移:新增 `guild_join_applications`DDL 与 gorm/gen 代码生成);对现有 `guild_members` 无破坏性更改。
- 并发与一致性:审批通过与重复申请的幂等处理;用户离开后重新申请的限制延续。
- 回滚策略:所有写操作事务化;失败回滚不影响既有功能。
请确认以上方案,确认后我将分步骤提交后端与前端改造,并补齐测试与文档。