1. 数据库表结构

1.1 用户黑名单表 user_blacklist

  • 字段说明
    • id:主键,自增
    • user_id:被封禁用户ID
    • reason:封禁原因
    • banned_at:封禁时间
    • unbanned_at:解封时间(可为空,表示永久封禁)
    • created_at:记录创建时间
    • created_by:操作人ID(管理员/系统)
    • is_active:当前是否为有效封禁(1=有效,0=已解除)
  • 索引user_idcreated_by
  • 用途:记录所有黑名单操作历史,支持多次封禁/解封。

1.2 黑名单规则表 blacklist_rules

  • 字段说明
    • id:主键
    • type:规则类型(如IP、用户名、关键词等)
    • value:规则值
    • reason:规则说明
    • duration:封禁时长(秒,0为永久)
    • created_by:创建人
    • is_active:是否启用
    • 其他时间戳字段
  • 用途:支持批量/自动化封禁,便于管理和追溯。

2. Go模型与主要方法

2.1 结构体

  • BlacklistRecord:封装一条黑名单记录,含用户、原因、时间、操作者、是否有效等。

2.2 主要方法

  • GetBlacklistRecords(page, pageSize):分页获取所有黑名单记录,含用户和操作者信息。
  • GetUserBlacklistRecord(userID):获取某用户当前有效的黑名单记录。
  • IsUserBannedNow(userID):判断用户当前是否处于封禁状态(未到解封时间且is_active=1)。
  • RemoveFromBlacklist(userID):解除用户封禁,设置is_active=0unbanned_at,并将用户角色恢复为普通用户。
  • CleanupExpiredBlacklist():自动检测所有已到期的封禁,批量解封并恢复用户角色。
  • GetUserBlacklistHistory(userID):获取用户所有历史黑名单记录(含已解封)。

3. 权限与联动

  • 用户表 usersrole 字段,黑名单用户会被设置为特殊角色(如9=黑名单用户),解封后恢复为普通用户。
  • 所有需要权限控制的路由/中间件,如发帖、评论、访问等,都会检测用户是否被封禁(如middleware.RequireNotBlacklisted)。
  • 管理后台 提供黑名单增删、规则管理、历史查询等接口。

4. 规则与自动化

  • 支持通过规则(如关键词、IP等)自动批量封禁用户。
  • 支持定时任务自动检测并解封到期用户,保证黑名单状态与用户权限同步。

5. 设计亮点

  • 历史可追溯:所有封禁/解封操作均有记录,便于审计。
  • 灵活性高:支持永久/临时封禁,支持规则批量操作。
  • 自动化:到期自动解封,角色自动恢复,减少人工干预。
  • 权限联动:黑名单状态与用户权限、功能访问严格绑定。