user 表新增 ban_type/ban_reason/ban_admin_uid/ban_time 4 字段,复用 banned_until 表示封禁截止时间(0=未封禁/9999999999=永久) [配置不同步]
新增 bbs_user_ban_log 表(封禁历史:uid/admin_uid/action/ban_type/reason/duration/create_time) [缓存失效]
新增 bbs_banned_ip 表(IP 段黑名单:ip_start/ip_end/reason/admin_uid/create_time/expire_time) [边界未校验]
UpgradeService::upgradeUserBanSystem() 升级项:4 字段 ALTER + 2 表 CREATE + 旧数据 ban_type=0 初始化 [状态不同步]
conf.default.php 新增 ban_show_public_list/ban_inherit_to_same_ip 配置 [配置不同步]
创建 model/ban_log.func.php(6 函数:ban_log_create/find_by_uid/count_by_uid/find_all/delete_by_uid/find_recent_unbanned) [SQL N+1]
创建 model/banned_ip.func.php(6 函数:banned_ip_create/delete/find/count/check/read,IP 用 ip2long+sprintf 处理 32 位溢出) [类型误用]
创建 lib/XnEvent.php 轻量事件机制(on/once/trigger/off/hasListeners,回调异常不中断主流程) [异步竞态]
XnEvent 已同步到 xiunophp.php 和 xiunophp.min.php,check_min_sync.sh 通过 [状态不同步]
创建 lib/UserBanService.php 核心服务(ban/unban/checkBan/checkBanByScene/clearContent/getBanStatus + 6 事件触发) [逻辑错误]
UserBanService 不能封禁管理员组(gid=1,2)/不能封禁自己,永久封禁用 9999999999 避免 32 位溢出 [边界未校验]
通知用 notify_create(uid, 0, 'system', ...) 而非 notice_send(Xiuno 实际函数名) [配置不同步]