管理后台
管理能力集中在管理面板 admin.html(由 AppAdmin 驱动),仅对 role=admin 开放,所有管理操作都受管理员角色限制,并写入审计日志(audit.add)。入口有服务端与前端两层限制:
- 服务端鉴权:对
/admin.html与/js/admin.js做鉴权,非管理员被 302 重定向到聊天页。 - 前端拦截:
main-admin.ts再拦一道,role !== 'admin'跳回聊天页。
管理面板分五个业务页签:审核 / 用户 / 治理 / 文件 / OAuth / 日志(对应源码卡片 Approvals / Users / Files / Logs / Moderation / OAuth)。
用户管理
| 能力 | 方法 | 路径 |
|---|---|---|
| 用户列表 | GET | /api/admin/users |
| 新增用户 | POST | /api/admin/user/add |
| 删除用户 | POST | /api/admin/user/del |
| 重命名 | POST | /api/admin/user/rename |
| 改头像 | POST | /api/admin/user/image |
| 重置密码 | POST | /api/admin/user/pass |
- 用户列表(
GET /api/admin/users):查看全部用户及状态——激活(active)/ 待审(pending)/ 封禁(banned)等。 - 新增用户(
POST /api/admin/user/add):在面板直接建账号设密码;也可走命令行npm run adduser -- <用户名> [新密码],省略密码则交互式隐藏输入。 - 删除用户(
POST /api/admin/user/del):移除用户,并清掉其消息、私聊、回应、群组、好友里的引用(在auth.renameUser同类的清理逻辑里做事务处理)。 - 重命名(
POST /api/admin/user/rename):改用户名,在一个事务里同步 users / messages / dm / reactions / groups / friends 的全部引用。 - 改头像(
POST /api/admin/user/image):设置用户头像(/uploads/...)。 - 重置密码(
POST /api/admin/user/pass):为用户设置新密码,无需旧密码。
注册审核
开放注册产生的账号先进入 pending,审核通过前无法登录。未过审(待审或被拒)的账号登录时返回 403 对应提示。
| 能力 | 方法 | 路径 |
|---|---|---|
| 待审列表 | GET | /api/admin/approvals |
| 通过 | POST | /api/admin/review/approve |
| 拒绝 | POST | /api/admin/review/reject |
- 待审列表在「审核」页签。
- 通过(
POST /api/admin/review/approve):账号激活,用户可登录。 - 拒绝(
POST /api/admin/review/reject):账号被拒,无法登录。
举报与处罚
| 能力 | 方法 | 路径 |
|---|---|---|
| 举报处理 | GET | /api/admin/reports |
| 驳回 | POST | /api/admin/reports/dismiss |
| 从举报执行处罚 | POST | /api/admin/reports/punish |
| 处罚记录 | GET | /api/admin/penalties |
| 撤销处罚 | POST | /api/admin/penalties/revoke |
| 新增处罚 | POST | /api/admin/penalties/add |
- 举报处理(
GET /api/admin/reports):查看用户上报的举报,每条记录举报者 IP 与消息快照。可驳回(POST /api/admin/reports/dismiss)或从举报执行处罚(POST /api/admin/reports/punish,带user/action/duration)。 - 处罚类型:
warning(警告)/mute(禁言)/ban(封禁)/ipban(IP 封禁)。时长上限MAX_DAYS = 3650天;永久处罚expires = null。 - 处罚记录(
GET /api/admin/penalties):查看全部处罚,可撤销(POST /api/admin/penalties/revoke);新增处罚走POST /api/admin/penalties/add(user/action/duration)。 - 自动通知:执行账号类处罚后,系统自动向被处罚用户写一条站内「通知」,并实时推
penaltyWebSocket 消息,前端据此禁用输入框。 - 服务端拦截:
moderate.blockFor计算 muted / banned / ipBanned 状态,发消息或建连时都会被拦。处罚状态由服务端计算,不是前端自判,无法绕过限制。
公告
| 能力 | 方法 | 路径 |
|---|---|---|
| 发布公告 | POST | /api/admin/announcements |
| 删除公告 | DELETE | /api/admin/announcements |
- 发布(
POST /api/admin/announcements):系统级公告,标题 + 内容,全员可见,出现在每用户信箱「公告」标签,返回新建id。 - 删除(
DELETE /api/admin/announcements):删已有公告,需带id。
文件管理
| 能力 | 方法 | 路径 |
|---|---|---|
| 查看文件 | GET | /api/admin/files |
| 删除单个 | POST | /api/admin/file/del |
| 批量删除 | POST | /api/admin/files/del-batch |
- 查看(
GET /api/admin/files):已上传文件列表,可与FILE_TTL_DAYS保留策略配合查看哪些快过期。used是被引用次数(0就是没人引用),avatar标记头像文件。 - 删除单个 / 批量删除(
POST /api/admin/file/del、/api/admin/files/del-batch):请求体用落盘文件名(name/names),用path.basename比对防穿越。删除后同步去重记录,并把仍引用它的消息标记为「已过期」——聊天记录保留,只是打不开了。 - 头像受保护:用户头像与群头像会被标记为「已引用」,不计入未引用文件、不参与过期清理,也不能在文件管理里删除(返回
api.admin.fileIsAvatar)。换头像请到该用户的资料或群设置里操作。这样能避免头像被当成垃圾文件清理掉、整站冒出空白头像。
操作日志
- 审计日志(
GET /api/admin/logs):分页查看审计 / 操作日志——登录、登出、发消息、上传、处罚、举报等活动,以及来源 IP。audit.list支持按 actor / action / target / actionPrefix / excludeActions 过滤。detail以结构化{k: i18n键, v: 占位变量}存储,前端按语言翻译;单条详情上限 300 字符,总容量 5000 条。 - 访问日志:所有 HTTP 请求与 WebSocket 连接以 JSON 行写入
data/access.log,可配合外部日志系统(ELK / Loki 等)做更细的监控,不在管理面板内。
小程序
「小程序」页签管理索引源:官方源 + 任意第三方源,平台启动时会合并加载一次(之后缓存 30 分钟,可手动「保存并刷新」)。
- 每条源可配名称、索引地址、优先级、启用开关;官方源优先级最高且不可删除(可停用)。
- 「各源状态」会显示这次加载是否成功、拿到几个小程序、耗时,失败时直接给出原因(超时 / 404 / JSON 解析失败等)。
- 用户在聊天页侧栏「+ → 小程序商店」自行安装,装到个人(侧栏入口)或某个群(
#指令调用);安装时勾选的权限由后端逐次校验。 - 管理侧只管「有哪些小程序可用」,不参与授权;相关日志在「日志」里按「小程序」类别筛选。
详见小程序 · 部署者指南。
OAuth 配置
| 能力 | 方法 | 路径 |
|---|---|---|
| 管理 OAuth | GET/POST | /api/admin/oauth |
| 用户侧 providers | GET | /api/oauth/providers |
| 用户侧 me | GET | /api/oauth/me |
| 用户侧 unbind | POST | /api/oauth/github/unbind |
- 管理侧:管理面板「OAuth」页签管理 GitHub 登录账号,
GET/POST /api/admin/oauth读写 GitHub 的client_id/client_secret,secret 存app_config,永不下发前端。 - 用户侧流程:
GET /api/oauth/providers查看可用 Provider、<start>跳转授权、<callback>回跳绑定、GET /api/oauth/me查看绑定状态、POST /api/oauth/github/unbind解绑(<start>/<callback>为占位表示)。
依赖命令行
| 命令 | 作用 |
|---|---|
npm run adduser -- <用户名> [新密码] | 新增 / 重置用户密码(服务端命令行,适合无界面时批量建号) |
相关文档
- 更多安全与数据细节见配置说明 · 内置安全限制。
- 接口字段与请求体见 API 参考 · 管理端 API。