感谢你对 Snack Platform 项目的关注!本指南将帮助你了解如何参与项目开发。
参与本项目时,请遵守以下准则:
- 尊重所有参与者
- 接受建设性的批评
- 关注对社区最有利的事情
- 对其他社区成员表示同理心
| 类型 | 说明 | 难度 |
|---|---|---|
| 🐛 Bug 修复 | 修复已知问题 | ⭐ |
| 📝 文档改进 | 完善或修正文档 | ⭐ |
| ✨ 新功能 | 实现新的功能特性 | ⭐⭐⭐ |
| 🔧 代码优化 | 重构或优化现有代码 | ⭐⭐ |
| 🧪 测试用例 | 添加或改进测试 | ⭐⭐ |
查找标记为 good first issue 的 Issue,这些通常是:
- 简单的 Bug 修复
- 文档改进
- 小型功能增强
点击 GitHub 页面右上角的 "Fork" 按钮,将仓库复制到你的账号下。
git clone https://github.com/YOUR_USERNAME/snack-platform.git
cd snack-platformgit remote add upstream https://github.com/ORIGINAL_OWNER/snack-platform.git# 同步最新代码
git fetch upstream
git checkout main
git merge upstream/main
# 创建新分支
git checkout -b feature/your-feature-name# 启动后端
cd snack-platform-backend
./mvnw spring-boot:run
# 启动前端
cd snack-platform-frontend
npm run dev
# 运行测试
./mvnw test # 后端测试
npm run test # 前端测试(如有)git add .
git commit -m "feat: add new feature description"
git push origin feature/your-feature-name在 GitHub 上创建 Pull Request,等待代码审查。
| 类型 | 规范 | 示例 |
|---|---|---|
| 类名 | PascalCase | OrderService, UserController |
| 方法名 | camelCase | createOrder(), getUserById() |
| 常量 | UPPER_SNAKE_CASE | MAX_RETRY_COUNT, DEFAULT_PAGE_SIZE |
| 变量 | camelCase | orderList, currentUser |
| 包名 | 全小写 | com.snackchain.module.order |
// 1. 包声明
package com.snackchain.snack_platform_backend.module.order.service.impl;
// 2. 导入语句(按字母顺序,分组)
import com.snackchain.snack_platform_backend.entity.Order;
import com.snackchain.snack_platform_backend.mapper.OrderMapper;
import org.springframework.stereotype.Service;
// 3. 类声明
@Service
public class OrderServiceImpl implements OrderService {
// 4. 常量
private static final int DEFAULT_PAGE_SIZE = 20;
// 5. 成员变量
private final OrderMapper orderMapper;
// 6. 构造函数
public OrderServiceImpl(OrderMapper orderMapper) {
this.orderMapper = orderMapper;
}
// 7. 公共方法
@Override
public Order getOrderById(Long id) {
// 实现
}
// 8. 私有方法
private void validateOrder(Order order) {
// 实现
}
}/**
* 订单服务实现类
*
* @author your-name
* @since 1.0.0
*/
@Service
public class OrderServiceImpl implements OrderService {
/**
* 根据ID获取订单
*
* @param id 订单ID
* @return 订单信息,不存在返回null
* @throws BusinessException 当订单状态异常时抛出
*/
@Override
public Order getOrderById(Long id) {
// TODO: 添加缓存支持
return orderMapper.selectById(id);
}
}| 类型 | 规范 | 示例 |
|---|---|---|
| 组件文件 | PascalCase | OrderList.vue, ProductCard.vue |
| 工具文件 | camelCase | request.js, formatDate.js |
| 样式文件 | kebab-case | order-list.css |
<script setup>
// 1. 导入
import { ref, computed, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { getOrderList } from '@/api/order'
// 2. Props 和 Emits
const props = defineProps({
storeId: {
type: Number,
required: true
}
})
const emit = defineEmits(['update', 'delete'])
// 3. 响应式数据
const loading = ref(false)
const orderList = ref([])
// 4. 计算属性
const totalAmount = computed(() => {
return orderList.value.reduce((sum, order) => sum + order.amount, 0)
})
// 5. 方法
const fetchOrders = async () => {
loading.value = true
try {
const res = await getOrderList(props.storeId)
orderList.value = res.data
} finally {
loading.value = false
}
}
const handleDelete = (id) => {
emit('delete', id)
}
// 6. 生命周期
onMounted(() => {
fetchOrders()
})
</script>
<template>
<div class="order-list">
<!-- 模板内容 -->
</div>
</template>
<style scoped>
.order-list {
/* 样式 */
}
</style>-- 表名使用小写下划线
CREATE TABLE order_items (
-- 主键放在第一位
id BIGINT PRIMARY KEY AUTO_INCREMENT,
-- 外键字段
order_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
-- 业务字段
quantity INT NOT NULL DEFAULT 1,
price DECIMAL(10,2) NOT NULL,
-- 时间字段放在最后
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- 索引定义
INDEX idx_order_id (order_id),
INDEX idx_product_id (product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单明细表';<type>(<scope>): <subject>
<body>
<footer>
| 类型 | 说明 | 示例 |
|---|---|---|
feat |
新功能 | feat(order): add order cancel feature |
fix |
Bug 修复 | fix(auth): fix token expiration issue |
docs |
文档更新 | docs: update API documentation |
style |
代码格式 | style: format code with prettier |
refactor |
重构 | refactor(user): simplify user service |
test |
测试 | test(order): add order service tests |
chore |
构建/工具 | chore: update dependencies |
auth- 认证模块order- 订单模块product- 商品模块store- 门店模块sku- 库存模块report- 报表模块frontend- 前端相关backend- 后端相关docs- 文档相关
# 新功能
git commit -m "feat(order): add order export to Excel feature"
# Bug 修复
git commit -m "fix(auth): fix JWT token refresh issue
Token was not being refreshed correctly when expired.
Added automatic refresh logic in the interceptor.
Closes #123"
# 文档更新
git commit -m "docs: add API examples to README"[类型] 简短描述
示例:
[Feature] 添加订单导出功能[Fix] 修复登录Token过期问题[Docs] 更新API文档
## 变更说明
简要描述本次变更的内容
## 变更类型
- [ ] 新功能 (feat)
- [ ] Bug 修复 (fix)
- [ ] 文档更新 (docs)
- [ ] 代码重构 (refactor)
- [ ] 测试 (test)
- [ ] 其他
## 相关 Issue
关联的 Issue 编号:#xxx
## 测试说明
描述如何测试这些变更
## 检查清单
- [ ] 代码已自测通过
- [ ] 已添加必要的测试用例
- [ ] 已更新相关文档
- [ ] 代码符合项目规范审查者会关注以下方面:
- 功能正确性 - 代码是否实现了预期功能
- 代码质量 - 是否符合代码规范
- 测试覆盖 - 是否有足够的测试
- 安全性 - 是否存在安全隐患
- 性能 - 是否有性能问题
- 文档 - 是否更新了相关文档
创建 Issue 时请包含以下信息:
## Bug 描述
清晰简洁地描述问题
## 复现步骤
1. 进入 '...'
2. 点击 '...'
3. 滚动到 '...'
4. 看到错误
## 期望行为
描述你期望发生的事情
## 实际行为
描述实际发生的事情
## 截图
如果适用,添加截图帮助解释问题
## 环境信息
- 操作系统: [例如 Windows 11]
- 浏览器: [例如 Chrome 120]
- 项目版本: [例如 1.0.0]
## 附加信息
添加任何其他相关信息## 功能描述
清晰简洁地描述你想要的功能
## 使用场景
描述这个功能的使用场景
## 建议方案
如果有的话,描述你建议的实现方案
## 替代方案
描述你考虑过的替代方案
## 附加信息
添加任何其他相关信息或截图如有问题,可以通过以下方式联系:
- 提交 GitHub Issue
- 发送邮件至项目维护者
💡 感谢你的贡献! 每一个贡献都让这个项目变得更好。