CircleChat 贡献指南
本仓库的行为准则遵循上游 GitHub 上的 CONTRIBUTING / CODE_OF_CONDUCT / SECURITY。本文不替代这些上游文件,只聚焦文档 / 开发流程相关的技术要点:环境要求、常用命令、分支约定、代码入口、后端 / 前端注意事项、审计动作常量、提交与部署、许可以及提交前检查清单。
一、环境与依赖
- Node.js ≥ 22.5:后端使用
node:sqlite;前端vite build需 Node ≥ 20.19。以整个仓库的更高要求(Node ≥ 22.5)为准。 - 安装依赖:
npm install(仅构建期)。 - 首次拉取后、依赖或锁文件变化后需重新
npm install;执行构建 / 类型检查前确保依赖已安装。
二、常用命令
bash
npm run dev # 开发模式:监听 src/ 增量构建 + Nitro dev,改代码即时生效
npm run build # 构建前端(Vite)+ 后端(Nitro)
npm run typecheck # 类型检查:vue-tsc + tsc(与 CI 一致)
npm start # 启动生产服务(默认 0.0.0.0:8090)
npm run adduser -- <用户名> [新密码] # 用户管理(新增 / 重置密码)npm run dev只监听src/;改动server/、public/或配置文件时,以实际开发体验和源码为准。npm run build同时覆盖前端(Vite)与后端(Nitro)构建,是提交前、部署前、验证生产构建时的必要步骤。- CI:
.github/workflows/lint.yml在 push / PR 时执行npm run typecheck。本地提交前跑一遍能提前发现问题、避免 PR 被阻塞。
三、分支约定
| 分支 | 用途 |
|---|---|
dev | 日常开发分支,功能完成后再合并回 main |
main | 稳定 / 发布分支,生产服务器据此部署 |
发布流程:
bash
git checkout dev
# ...开发、提交...
git push # 推送 dev
git checkout main && git merge dev && git push # 发布四、代码入口
- 后端路由与逻辑:
server/lib/runtime.ts(HTTP + WebSocket + 上传)。 - 后端领域模块:
server/lib/*.ts(auth / store / groups / friends / moderate / mailbox / audit / log / migrate / ws / filetypes / github / appconfig)。 - 前端请求层:
src/core/api.ts;配置:public/js/config.js。 - 前端业务核心:
src/core/chat.ts;UI:src/components/。 - 多语言文案:
src/i18n/messages/{zh,en,ja}.ts。 - 审计动作常量:
src/core/auditActions.ts。
定位问题时按此顺序:后端先看 runtime.ts,领域逻辑看对应 server/lib/*.ts;前端请求看 api.ts、配置看 config.js,业务核心看 chat.ts、UI 看 src/components/;多语言看 src/i18n/messages/;审计动作看 auditActions.ts。
五、后端改动注意事项
- 不推荐修改 PCL 源码:涉及第三方 / 上游资源时避免改动其源码(许可证约束)。
- 函数声明优先:模块初始化阶段被依赖的函数用
function xxx(){},避免const箭头函数的暂时性死区(TDZ)导致启动报错。 - 全局样式放对位置:关键布局样式放
public/css/chat-vue.css(非@layer,优先级高于组件内@layer样式),例如上传面板的流式布局。 - 新增 API 遵循既有模式:在
runtime.ts的handleApi中按if (pathname === '/api/...' && req.method === 'POST')追加;请求体统一读 body + JSON 解析;响应统一sendJSON;关键操作调用audit.add记录审计;末尾logger.write写访问日志。 - 新增表结构:在对应模块的
open()里用CREATE TABLE IF NOT EXISTS自维护,并在server/lib/migrate.ts中处理旧库升级(补列)。 - 安全默认值:新增上传 / 文件相关能力时,沿用白名单 + 魔数校验 +
UPLOAD_NAME_RE随机名 +path.basename比对的双层路径穿越防护,不要信任前端传来的原始路径。
六、前端改动注意事项
- 改动后构建:
npm run build(或开发模式npm run dev)。 - 测试时浏览器需硬刷新(
Ctrl+Shift+R),清理缓存的静态资源。 - 新增 i18n 文案时,zh / en / ja 三种语言都要补齐(文案键以扁平
'a.b.c'形式写,构建期nest()转成嵌套结构)。 - 实时能力改完需对照 WebSocket 协议,服务端与
src/core/chat.ts的onmessage分发要一致,不能只改一端。
七、审计动作常量
- 管理端日志接口
GET /api/admin/logs按action过滤,动作字符串集中在src/core/auditActions.ts。 - 动作以「命名空间」组织,可用
actionPrefix做前缀匹配(如只看治理类传actionPrefix=penalty)。 - 常见动作分布(权威列表以源码
auditActions.ts为准):- 账号类:
login/logout/register/pass(改密)/profile(改资料)。 - 社交类:
message(发消息)/upload(上传)/react(回应)/recall(撤回)/friend(好友操作)。 - 治理类:
penalty(处罚)/report(举报)/review.approve/review.reject(注册审核)。 - 群组类:
group.create/group.rename/group.dissolve/group.transfer/group.member(成员变更)等group.*。 - 管理类:
admin.user.add/admin.user.del/admin.announce(公告)/admin.file.del(删文件)。
- 账号类:
- 审计详情
detail以结构化{k: i18n键, v: 占位变量}的 JSON 字符串存储,单条上限MAX_DETAIL = 300字符,便于多语言前端直接翻译。
八、提交与部署
- 推送到
main后,生产服务器可通过git pull更新并重新npm run build+ 重启进程 / 容器(详见生产部署)。 - 部署目录须保持干净(无未提交改动,如
package-lock.json),否则git pull会中止;建议部署目录只做git fetch+git reset --hard。 - 也可以用远端仓库的
post-receive钩子把「拉取 → 构建 → 重启」自动化。
九、许可
- 本项目以 GNU GPL v3.0 开源。
- 贡献即表示同意以 GPL-3.0 条款许可所贡献的内容。
- 完整第三方资源与许可见 CREDITS。
十、提交前检查清单
- [ ] Node.js 版本 ≥ 22.5;已运行
npm install - [ ] 在
dev分支开发;提交前运行npm run typecheck - [ ] 改动在后端:新增 API 遵循
handleApi模式(读 body + JSON、sendJSON、audit.add、logger.write);新增表结构用CREATE TABLE IF NOT EXISTS并处理migrate.ts;函数声明优先;不修改 PCL 源码;上传 / 文件沿用双层路径穿越防护 - [ ] 改动在前端:运行
npm run build或npm run dev;测试硬刷新Ctrl+Shift+R;关键布局样式放public/css/chat-vue.css - [ ] 新增 i18n 文案时 zh / en / ja 都补齐,键用扁平
'a.b.c'形式 - [ ] 改实时能力时对照 WebSocket 协议,服务端与
src/core/chat.ts的onmessage分发一致 - [ ] 审计动作集中在
src/core/auditActions.ts;detail为{k: i18n键, v: 占位变量}JSON 且不超过MAX_DETAIL = 300 - [ ] 发布时切到
main合并dev并推送;部署目录干净,按需git fetch+git reset --hard - [ ] 理解贡献以 GPL-3.0 许可;查阅 CREDITS 了解第三方资源与许可