## 现状与缺口 - 审核未落地:`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` 无破坏性更改。 - 并发与一致性:审批通过与重复申请的幂等处理;用户离开后重新申请的限制延续。 - 回滚策略:所有写操作事务化;失败回滚不影响既有功能。 请确认以上方案,确认后我将分步骤提交后端与前端改造,并补齐测试与文档。