1. 数据库表结构
1.1 用户黑名单表 user_blacklist
- 字段说明:
id
:主键,自增user_id
:被封禁用户IDreason
:封禁原因banned_at
:封禁时间unbanned_at
:解封时间(可为空,表示永久封禁)created_at
:记录创建时间created_by
:操作人ID(管理员/系统)is_active
:当前是否为有效封禁(1=有效,0=已解除)
- 索引:
user_id
、created_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=0
和unbanned_at
,并将用户角色恢复为普通用户。CleanupExpiredBlacklist()
:自动检测所有已到期的封禁,批量解封并恢复用户角色。GetUserBlacklistHistory(userID)
:获取用户所有历史黑名单记录(含已解封)。
3. 权限与联动
- 用户表
users
有role
字段,黑名单用户会被设置为特殊角色(如9=黑名单用户),解封后恢复为普通用户。 - 所有需要权限控制的路由/中间件,如发帖、评论、访问等,都会检测用户是否被封禁(如
middleware.RequireNotBlacklisted
)。 - 管理后台 提供黑名单增删、规则管理、历史查询等接口。
4. 规则与自动化
- 支持通过规则(如关键词、IP等)自动批量封禁用户。
- 支持定时任务自动检测并解封到期用户,保证黑名单状态与用户权限同步。
5. 设计亮点
- 历史可追溯:所有封禁/解封操作均有记录,便于审计。
- 灵活性高:支持永久/临时封禁,支持规则批量操作。
- 自动化:到期自动解封,角色自动恢复,减少人工干预。
- 权限联动:黑名单状态与用户权限、功能访问严格绑定。