感谢你对 MagicPush 项目的关注!本文档将引导你完成从环境搭建到提交 PR 的完整流程。
无论你是新手还是老手,以下方式都能帮助项目:
- 🐛 修复 Bug - 在 Issues 中挑选未解决的 bug
- ✨ 新功能 - 先提 Issue 讨论,确认后再动手实现
- 📝 改进文档 - 修正错别字、补充说明、翻译文档
- 💡 提出建议 - 功能需求、优化思路都可以提 Issue
新手友好:如果你是第一次参与开源,可以在 Issue 标题加上
[新手]前缀,维护者会给予更多指导。
| 工具 | 最低版本 | 推荐版本 | 安装方式 |
|---|---|---|---|
| Node.js | >= 18.0.0 | LTS (20.x) | nodejs.org |
| pnpm | >= 8.0.0 | 最新版 | npm i -g pnpm |
| Git | 任意 | 最新版 | git-scm.com |
| IDE | - | VS Code | code.visualstudio.com(推荐) |
# 1. 在 GitHub 页面点击右上角 "Fork" 按钮,复制到自己的账号下
# 2. 克隆你 fork 的仓库
git clone https://github.com/<你的用户名>/magicpush.git
cd magicpush
# 3. 添加原始仓库为上游(方便后续同步更新)
git remote add upstream https://github.com/原作者/magicpush.git
# 安装后端依赖
cd apps/server
pnpm install
# 安装前端依赖
cd ../web
pnpm install
# 如果需要修改官网文档
cd ../website
pnpm install终端 1 - 启动后端:
cd apps/server
cp .env.example .env # 首次运行需要配置环境变量(见下方说明)
pnpm dev # 使用 nodemon 热重载,默认端口 3000终端 2 - 启动前端:
cd apps/web
pnpm dev # 默认端口 5173访问 http://localhost:5173 即可看到页面。
首次运行需要在 apps/server/.env 中配置:
# 必填项
PORT=3000 # 服务端口
JWT_SECRET=your-secret-key # JWT 密钥(随便填一个复杂字符串)
# 可选项(按需填写)
ADMIN_PASSWORD=admin123 # 初始管理员密码本项目采用 Fork + Feature Branch 工作流:
┌─────────────┐ fork ┌───────────────────┐
│ upstream │ ───────────→ │ 你的仓库 (origin) │
│ (原始仓库) │ │ │
└─────────────┘ └───────────────────┘
│
clone
│
▼
┌───────────────────┐
│ 本地仓库 │
│ ┌─────────────┐ │
│ │ dev 分支 │←─┼── 主开发分支(从这里切出新分支)
│ ├─────────────┤ │
│ │ feat/xxx分支 │←─┼── 你的工作分支
│ └─────────────┘ │
└───────────────────┘
每次开始新工作前,先同步最新的代码:
# 切换到 dev 分支
git checkout dev
# 从上游仓库拉取最新代码
git fetch upstream
git merge upstream/dev从 dev 分支创建你的工作分支:
# 格式: <类型>/<简短描述>
git checkout -b fix/login-error # 修复:登录报错
git checkout -b feature/add-dark-mode # 新功能:暗黑模式
git checkout -b docs/update-readme # 文档:更新 README分支命名规则:
| 类型 | 前缀 | 说明 |
|---|---|---|
| Bug 修复 | fix/ |
修复问题 |
| 新功能 | feature/ |
新增功能 |
| 文档更新 | docs/ |
只改文档 |
| 重构 | refactor/ |
重构代码(不改变行为) |
| 样式调整 | style/ |
代码格式、分号等 |
# 推送你的分支到你的 GitHub 仓库
git push origin fix/login-error文件命名: 小驼峰 (userService.js, authController.js)
基本结构示例:
// apps/server/src/services/userService.js
const db = require('../database');
const logger = require('../utils/logger');
/**
* 根据 ID 获取用户
* @param {number} id 用户 ID
* @returns {Object|null} 用户对象或 null
*/
function getUserById(id) {
try {
const user = db.prepare('SELECT * FROM users WHERE id = ?').get(id);
return user;
} catch (error) {
logger.error('查询用户失败:', error);
throw error;
}
}
module.exports = { getUserById };注意事项:
- ✅ 函数要有 JSDoc 注释
- ✅ 用
try-catch包裹可能出错的操作 - ✅ 使用
logger而不是console.log - ✅ 一个模块只做一件事
组件命名: 大驼峰 (UserProfile.vue, LoginDialog.vue)
基本结构示例:
<!-- apps/web/src/components/UserProfile.vue -->
<template>
<div class="user-profile">
<h2>{{ user.name }}</h2>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { useUserStore } from '@/stores/user';
const userStore = useUserStore();
const user = ref({});
onMounted(() => {
user.value = userStore.currentUser;
});
</script>
<style scoped>
.user-profile {
padding: 16px;
}
</style>注意事项:
- ✅ 使用
<script setup>语法 - ✅ 样式加
scoped避免污染全局 - ✅ 组件名要有意义,避免
Foo.vue、Thing.vue这种模糊名字
- 不要在提交中包含
.env文件(包含敏感信息) - 不要在代码中留下
console.log调试语句 - 不要一次性改太多不相关的东西(一个 PR 做一件事)
- 不要跳过本地测试就直接提交
我们使用 Conventional Commits 规范,格式如下:
<类型>(<范围>): <简短描述>
<详细描述(可选)>
| 类型 | 说明 | 示例 |
|---|---|---|
feat |
新功能 | feat(channel): 支持飞书渠道推送 |
fix |
修复 Bug | fix(auth): 修复 token 刷新逻辑错误 |
docs |
文档变更 | docs: 更新部署说明 |
style |
代码格式(不影响功能) | style: 统一缩进为 2 空格 |
refactor |
重构(不是新功能也不是修复) | refactor(db): 优化查询语句性能 |
perf |
性能优化 | perf: 减少首页加载时间 |
test |
测试相关 | test: 添加登录接口测试用例 |
chore |
构建/工具变动 | chore: 更新依赖版本 |
# ✅ 好的提交
git commit -m "feat(channel): 新增钉钉机器人推送支持"
git commit -m "fix(login): 修复密码含特殊字符时验证失败的bug"
git commit -m "docs(readme): 补充 Windows 环境安装步骤"
# ❌ 不好的提交
git commit -m "改了一些bug" # 太模糊
git commit -m "fix" # 没有具体内容
git commit -m "feat xxx and fix yyy" # 一个提交做了两件不同的事在提交 PR 前,请确认以下几点:
- 代码可以正常运行(本地测试通过)
- 提交信息符合上述规范
- 没有引入不必要的依赖
- 没有
console.log/ 调试代码残留 - 如果修改了 UI,在不同屏幕尺寸下查看效果
- 打开 GitHub,进入你 fork 的仓库页面
- 点击 "Compare & pull request" 按钮(如果提示的话)
- 如果没有提示:点击 "New Pull Request",然后:
- base repository: 选择原始仓库的
dev分支 - compare: 选择你刚才推送的分支
- base repository: 选择原始仓库的
- 填写 PR 信息(模板如下)
标题格式: [类型] 简短描述
[feat] 支持企业微信 Webhook 推送
## 相关Issue
<!-- 如果有对应的 Issue,填上编号 -->
Closes #123
## 变更内容
<!-- 简要描述你做了什么 -->
- 新增 WeComAdapter 适配器
- 添加企业微信渠道配置界面
- 更新渠道选择下拉框
## 测试方法
<!-- 写清楚如何测试你的改动 -->
1. 进入「渠道管理」页面
2. 新建渠道,选择「企业微信」
3. 填入 Webhook 地址,保存
4. 发送测试消息,验证是否收到
## 截图(可选)
<!-- UI 变更建议附上截图 -->
提交后会发生这些事:
你提交 PR
↓
🤖 自动检查(如果有 CI)
↓
👀 维护者进行 Code Review(可能会要求修改)
↓
✅ 通过审核 → 合并到 dev 分支
❌ 需要修改 → 你更新代码 → 重新审核
不要害怕被要求修改! Code Review 是正常的学习过程,不是针对个人。
# 在你的工作分支上继续修改
git add .
git commit -m "fix: 根据review意见修改xxx"
git push origin <你的分支名>
# PR 会自动更新,无需重新创建如果你的 PR 开发周期较长,期间 dev 分支可能有新的提交。合并前需要同步:
# 切换到 dev 分支
git checkout dev
# 拉取上游最新代码
git fetch upstream
git merge upstream/dev
# 切回你的工作分支,合并最新的 dev
git checkout <你的分支>
git merge dev
# 解决可能的冲突(如果有)
# git status # 查看冲突文件
# 手动编辑冲突文件,解决后:
# git add <冲突文件>
# git merge --continue
# 重新推送
git push origin <你的分支>A: 当然可以!哪怕只是修复一个错别字,也是受欢迎的贡献。
A: 可以!改进文档、报告 Bug、帮忙测试都是很好的贡献方式。
A: 如果还没推送到远程,可以用 git reset 撤销;如果已经推送了,可以再提交一次修正。不要慌张。
A: 不是的!所有代码都要经过 Review,这是保证质量的方式。把 Review 当作免费的技术指导就好。
A: 可以在 PR 评论里请求帮助,或者在 Issue 里提问。
每一位贡献者都值得感谢!你的参与让这个项目变得更好。
Happy coding! 🎉