本项目基于开源校园墙系统 Campux 二次开发,在上游基础上新增了 投稿 AI 自动审核 与 「青青子衿,悠悠我心」双向表白 两个功能。 上游代码版权归原作者及贡献者所有,遵循 Apache License 2.0,详见 NOTICE 与 CHANGES.md。
部署方式一句话:用 Docker Compose 一条命令跑起来,另外可选 nginx + HTTPS 对外提供访问。 从空白服务器到能收投稿的完整流程见 DEPLOY.md。
上游 Campux 已有的能力(网页/私聊双投稿渠道、审核、QQ 机器人、QQ 空间自动发布、评论同步、统计看板、多租户、插件系统等)全部保留,本仓库在此之上新增:
新投稿(网页投稿和 QQ 私聊投稿都算)自动交给大模型初审,审核员不用再逐条看:
| AI 判定 | 系统行为 |
|---|---|
| 低风险、置信度达标 | 自动通过,按墙的发布设置进入发布队列 |
| 明确违规、置信度达标 | 自动拒绝,写明理由并私聊告知投稿人 |
| 不确定 / 中风险 | 保持待审核,只在稿件时间线留下一条 AI 预审:… 提示 |
- 审核口径是一段随时可改的「墙规」文本,管理员在后台编辑,保存即生效,不需要改代码或重启。
- 通过/拒绝置信度阈值、每日自动通过上限、两个自动开关都能在后台调。
- 兜底策略:超时、报错、返回格式不对、含图片视频 —— 一律保持待审核,绝不放行,也不影响投稿响应。
- 每次判定写进稿件时间线与审计日志(模型、风险等级、置信度、理由),可追溯、可人工覆盖。
把表白做成双向确认,避免"单方面投递"变成骚扰:
- 甲向乙表白时,乙没有任何感知(不通知、不显示条数、网页上也看不到)。
- 只有乙也向甲表白时,机器人才同时私聊通知双方,并把两人的原话互相转达;网页端同步出现在「已互相表白」列表。
- 两个入口:机器人私聊
#表白 对方QQ号 想说的话,或网页端「表白」标签页。 - 只能向本墙已注册用户表白;不能向自己表白;被封禁账号不能发也不能收。
- 每人每天次数、单条字数、是否先用大模型过滤表白内容(广告、涉政、辱骂、联系方式等)、是否允许网页发起,全部可在后台配置。
- 管理员可在插件配置页查看全部表白记录(含未匹配的),用于风控;普通用户与审核员看不到。
| 方面 | 上游 Campux | 本仓库 |
|---|---|---|
| 投稿审核 | 人工审核(另有 AI 打标签、私聊语义收稿) | 保留,并新增投稿 AI 自动审核 |
| AI 供应商 | OpenAI 兼容接口(baseUrl 可填任意服务) | 同上,附带针对 DeepSeek 的适配(自动关闭思考模式、成本优化),实测约 ¥0.0013/条 |
| 用户互动 | 稿件、评论、投票竞选 | 保留,并新增双向表白 |
| 管理入口 | 预设插件开关机制 | 新增预设插件「青青子衿」;AI 审核开关在 LLM 设置面板 |
| 数据库 | 上游表结构 | 新增 Confession 表(启动时自动迁移,不改动原有表) |
| CI | 官方发布流水线 | 已移除(个人仓库用不上,避免失败任务) |
代码级差异清单见 CHANGES.md。
# 1. 准备一台 Linux 服务器(2 核 2G 起),装好 Docker 与 compose 插件
# 2. 拉取代码
git clone https://github.com/<你的用户名>/<仓库名>.git campux
cd campux
# 3. 生成配置:必填一项加密密钥
cp .env.example .env
echo "CAMPUX_BOT_SESSION_SECRET=$(openssl rand -hex 32)" >> .env
# 4. 构建并启动(首次编译前后端,2 核机器约 5-10 分钟)
docker compose up -d --build
# 5. 浏览器打开 http://<服务器IP>:8989 进入初始化向导接着在向导里创建管理员账号、选择部署模式,然后按 DEPLOY.md 完成:
- 接入 QQ 机器人(NapCat / LLOneBot,反向 WebSocket)
- 配置审核群与 QQ 空间发布目标
- 配置域名 + HTTPS(可选但强烈建议)
- 配置 AI 自动审核(填 DeepSeek 的 Key 即可用)
- 配置并开启「青青子衿」表白插件
⚠️ 1 核 1G 的服务器编译镜像时容易因内存不足失败或极慢,建议先加 swap:sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile这是实测经验:1C1G + 4G swap 能编过但很慢,2C2G 顺畅得多。
| 方式 | 适用场景 | 说明 |
|---|---|---|
| Docker Compose(推荐) | 绝大多数生产环境 | 一条命令拉起应用 + PostgreSQL + MinIO;升级就是重新 build;见 DEPLOY.md 第 2 节 |
| 单文件可执行 | 不想装 Docker / 数据库 | 上游 Release 提供自包含二进制(内嵌 SQLite + 本地存储),本仓库改动同样可自行编译;见 DEPLOY.md 第 3 节 |
| 本地开发 | 二次开发调试 | bun install 后 bun run dev:server / bun run dev:web |
- 后台 → 管理 → 元数据 → LLM 设置,填入:
baseUrl:https://api.deepseek.com(或任意 OpenAI 兼容服务地址)model:deepseek-flash(推荐:支持 JSON 输出、约 1 秒/条、约 ¥0.0013/条)API Key:platform.deepseek.com 申请的 Key
- 展开 「AI 初审」:打开总开关,按需开启「低风险自动通过」「明确违规自动拒绝」,设置置信度阈值与每日上限。
- 按你所在学校的口径改写「初审墙规」文本(已内置一份通用校园墙墙规)。
DeepSeek 默认开启"思考模式"且思考 token 按输出计费,本项目调用时已自动关闭,无需额外配置; 也可以改用 pro 模型,但成本约为 flash 的 4 倍。
- 后台 → 管理 → 插件配置 → 「青青子衿,悠悠我心」,打开开关。
- 在「配置」页设置每人每天次数、单条字数上限、是否让大模型过滤内容、是否允许网页端发起。
- 用户侧:机器人私聊
#表白 对方QQ号 想说的话,或网页端「表白」标签页。 - 同一页下方可查看最近表白记录(仅管理员可见)。
apps/server 后端(Fastify + Prisma)
src/runtime/ai-review.ts ← 新增:AI 投稿初审
src/lib/confession.ts ← 新增:双向表白核心逻辑
src/routes/confessions.ts ← 新增:表白接口
apps/web 前端(React + Vite)
src/features/confession/ ← 新增:表白页
src/features/admin/ ← 修改:AI 初审面板、插件配置面板
packages/db Prisma schema 与迁移(新增 Confession 表)
packages/domain 共享常量与默认文案
docs/ 上游文档(VitePress)
legacy/ 上游早期 Go 实现(历史归档)
只想用上游原版功能? 把「AI 初审」开关和「青青子衿」插件开关都关掉即可,行为与上游一致。
AI 会误判吗? 会,所以默认只让"低风险 + 高置信度"自动通过,并且失败/超时一律转人工。 误判补救:审核列表与审计日志能看到每次 AI 判定与理由,已发布的稿件管理员可直接撤回。
表白会泄露隐私吗? 单方表白的内容只有发送者本人(和管理员)能看到;双方互相表白后才互相公开身份与原话。
管理员可见全部记录是刻意设计的(风控与纠纷处理),不需要的话可以改 apps/server/src/lib/confession.ts 里的管理端查询。
数据库迁移安全吗? 容器启动时自动执行 Prisma 迁移,仅新增 Confession 表,不改动原有表结构。
- 本项目基于 Campux(Apache License 2.0)二次开发,基线提交
4f1bfaf; 修改内容见 NOTICE 与 CHANGES.md。 - 上游文档:https://docs.campux.top
- 许可证:Apache License 2.0