BodyBalanceEvaluation/CONTRIBUTING.md
2025-07-28 11:59:56 +08:00

680 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 贡献指南
感谢您对身体平衡评估系统项目的关注!我们欢迎所有形式的贡献,包括但不限于代码、文档、测试、问题报告和功能建议。
## 目录
- [行为准则](#行为准则)
- [如何贡献](#如何贡献)
- [开发环境设置](#开发环境设置)
- [代码规范](#代码规范)
- [提交规范](#提交规范)
- [Pull Request 流程](#pull-request-流程)
- [问题报告](#问题报告)
- [功能请求](#功能请求)
- [文档贡献](#文档贡献)
- [测试指南](#测试指南)
## 行为准则
### 我们的承诺
为了营造一个开放和友好的环境,我们作为贡献者和维护者承诺,无论年龄、体型、残疾、种族、性别认同和表达、经验水平、国籍、个人形象、种族、宗教或性取向如何,参与我们项目和社区的每个人都能获得无骚扰的体验。
### 我们的标准
有助于创造积极环境的行为包括:
- 使用友好和包容的语言
- 尊重不同的观点和经验
- 优雅地接受建设性批评
- 关注对社区最有利的事情
- 对其他社区成员表示同理心
不可接受的行为包括:
- 使用性化的语言或图像,以及不受欢迎的性关注或性骚扰
- 恶意评论、侮辱/贬损评论,以及个人或政治攻击
- 公开或私下骚扰
- 未经明确许可,发布他人的私人信息,如物理或电子地址
- 在专业环境中可能被合理认为不适当的其他行为
## 如何贡献
### 贡献类型
我们欢迎以下类型的贡献:
1. **代码贡献**
- 新功能开发
- Bug 修复
- 性能优化
- 代码重构
2. **文档贡献**
- API 文档
- 用户指南
- 开发者文档
- 代码注释
3. **测试贡献**
- 单元测试
- 集成测试
- 端到端测试
- 性能测试
4. **设计贡献**
- UI/UX 设计
- 图标设计
- 用户体验改进
5. **其他贡献**
- 问题报告
- 功能建议
- 社区支持
- 翻译工作
## 开发环境设置
### 前置要求
- Python 3.8+
- Node.js 16.0+
- Git
- 代码编辑器(推荐 VS Code
### 环境配置
1. **克隆仓库**
```bash
git clone https://github.com/example/body-balance-evaluation.git
cd body-balance-evaluation
```
2. **安装依赖**
```bash
# Windows
install.bat
# 或手动安装
python -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # macOS/Linux
pip install -r backend/requirements.txt
cd src/renderer && npm install
```
3. **配置开发环境**
```bash
# 复制配置文件
cp config.json config.local.json
# 编辑本地配置(可选)
# 修改 config.local.json 中的设置
```
4. **启动开发服务器**
```bash
# Windows
start_dev.bat
# 或手动启动
python main.py --mode development
```
### 开发工具推荐
#### VS Code 扩展
- Python
- Pylance
- Vue Language Features (Volar)
- TypeScript Vue Plugin (Volar)
- ESLint
- Prettier
- GitLens
#### 浏览器扩展
- Vue.js devtools
- React Developer Tools如果使用
## 代码规范
### Python 代码规范
我们遵循 [PEP 8](https://www.python.org/dev/peps/pep-0008/) 规范:
```python
# 好的示例
class PatientManager:
"""患者管理器类"""
def __init__(self, database_path: str):
self.db_path = database_path
self.logger = logging.getLogger(__name__)
def create_patient(self, patient_data: dict) -> int:
"""创建新患者
Args:
patient_data: 患者信息字典
Returns:
患者ID
Raises:
ValueError: 当患者数据无效时
"""
if not self._validate_patient_data(patient_data):
raise ValueError("Invalid patient data")
# 实现逻辑...
return patient_id
```
#### 代码格式化
使用 Black 进行代码格式化:
```bash
black . --line-length=88
```
#### 代码检查
使用 flake8 进行代码检查:
```bash
flake8 . --max-line-length=88 --exclude=venv,__pycache__
```
### JavaScript/Vue 代码规范
我们遵循 [Vue.js 风格指南](https://vuejs.org/style-guide/)
```javascript
// 好的示例
export default {
name: 'PatientList',
props: {
patients: {
type: Array,
required: true
},
loading: {
type: Boolean,
default: false
}
},
emits: ['patient-selected', 'patient-deleted'],
setup(props, { emit }) {
const selectedPatient = ref(null)
const handlePatientClick = (patient) => {
selectedPatient.value = patient
emit('patient-selected', patient)
}
return {
selectedPatient,
handlePatientClick
}
}
}
```
#### 代码格式化
使用 Prettier 进行代码格式化:
```bash
npm run format
```
#### 代码检查
使用 ESLint 进行代码检查:
```bash
npm run lint
```
### 通用规范
1. **命名规范**
- 使用有意义的变量和函数名
- Python: snake_case
- JavaScript: camelCase
- 常量: UPPER_CASE
- 类名: PascalCase
2. **注释规范**
- 为复杂逻辑添加注释
- 使用文档字符串描述函数和类
- 注释应该解释"为什么"而不是"是什么"
3. **文件组织**
- 保持文件结构清晰
- 相关功能放在同一模块
- 避免循环导入
## 提交规范
我们使用 [Conventional Commits](https://www.conventionalcommits.org/) 规范:
### 提交消息格式
```
type(scope): description
[optional body]
[optional footer(s)]
```
### 类型 (type)
- `feat`: 新功能
- `fix`: 修复 bug
- `docs`: 文档更新
- `style`: 代码格式化(不影响代码运行的变动)
- `refactor`: 重构(既不是新增功能,也不是修复 bug 的代码变动)
- `perf`: 性能优化
- `test`: 增加测试
- `chore`: 构建过程或辅助工具的变动
- `ci`: CI 配置文件和脚本的变动
- `revert`: 回滚之前的提交
### 范围 (scope)
- `frontend`: 前端相关
- `backend`: 后端相关
- `database`: 数据库相关
- `device`: 设备管理相关
- `analysis`: 数据分析相关
- `ui`: 用户界面相关
- `api`: API 相关
- `config`: 配置相关
- `docs`: 文档相关
- `test`: 测试相关
### 示例
```bash
# 新功能
git commit -m "feat(frontend): add patient search functionality"
# Bug 修复
git commit -m "fix(backend): resolve database connection timeout issue"
# 文档更新
git commit -m "docs(api): update patient management API documentation"
# 重构
git commit -m "refactor(device): simplify camera initialization logic"
```
## Pull Request 流程
### 创建 Pull Request
1. **Fork 仓库**
- 点击 GitHub 页面右上角的 "Fork" 按钮
2. **创建功能分支**
```bash
git checkout -b feature/your-feature-name
# 或
git checkout -b fix/your-bug-fix
```
3. **进行开发**
- 编写代码
- 添加测试
- 更新文档
4. **提交更改**
```bash
git add .
git commit -m "feat(scope): your commit message"
```
5. **推送分支**
```bash
git push origin feature/your-feature-name
```
6. **创建 Pull Request**
- 在 GitHub 上创建 Pull Request
- 填写详细的描述
### Pull Request 模板
```markdown
## 描述
简要描述这个 PR 的目的和内容。
## 更改类型
- [ ] Bug 修复
- [ ] 新功能
- [ ] 重构
- [ ] 文档更新
- [ ] 性能优化
- [ ] 其他(请说明)
## 测试
- [ ] 已添加单元测试
- [ ] 已添加集成测试
- [ ] 已手动测试
- [ ] 所有测试通过
## 检查清单
- [ ] 代码遵循项目规范
- [ ] 已添加必要的注释
- [ ] 已更新相关文档
- [ ] 没有引入新的警告
- [ ] 已测试在不同环境下的兼容性
## 相关问题
关闭 #issue_number
## 截图(如适用)
添加截图来帮助解释你的更改。
## 额外说明
添加任何其他相关信息。
```
### 代码审查
所有 Pull Request 都需要经过代码审查:
1. **自动检查**
- CI/CD 流水线检查
- 代码格式检查
- 测试覆盖率检查
2. **人工审查**
- 代码质量
- 设计合理性
- 测试完整性
- 文档完整性
3. **审查标准**
- 代码可读性
- 性能影响
- 安全性考虑
- 向后兼容性
## 问题报告
### 报告 Bug
使用 [Bug 报告模板](https://github.com/example/body-balance-evaluation/issues/new?template=bug_report.md)
```markdown
**描述 Bug**
清晰简洁地描述 bug 是什么。
**重现步骤**
重现行为的步骤:
1. 转到 '...'
2. 点击 '....'
3. 滚动到 '....'
4. 看到错误
**预期行为**
清晰简洁地描述你期望发生什么。
**截图**
如果适用,添加截图来帮助解释你的问题。
**环境信息**
- 操作系统: [例如 Windows 10]
- Python 版本: [例如 3.9.0]
- Node.js 版本: [例如 16.14.0]
- 应用版本: [例如 1.0.0]
**额外信息**
添加任何其他关于问题的信息。
```
### 报告安全问题
如果发现安全漏洞,请不要在公开的 issue 中报告。请发送邮件到 security@example.com。
## 功能请求
使用 [功能请求模板](https://github.com/example/body-balance-evaluation/issues/new?template=feature_request.md)
```markdown
**功能描述**
清晰简洁地描述你想要的功能。
**问题描述**
清晰简洁地描述问题是什么。例如:我总是感到沫丧当 [...]
**解决方案**
清晰简洁地描述你想要发生什么。
**替代方案**
清晰简洁地描述你考虑过的任何替代解决方案或功能。
**额外信息**
添加任何其他关于功能请求的信息或截图。
```
## 文档贡献
### 文档类型
1. **用户文档**
- 安装指南
- 使用教程
- 常见问题
- 故障排除
2. **开发者文档**
- API 文档
- 架构说明
- 贡献指南
- 代码注释
3. **项目文档**
- README
- CHANGELOG
- LICENSE
- 项目规划
### 文档规范
1. **Markdown 格式**
- 使用标准 Markdown 语法
- 保持一致的格式
- 使用有意义的标题
2. **内容要求**
- 清晰准确
- 及时更新
- 包含示例
- 考虑不同用户水平
3. **图片和媒体**
- 使用 SVG 格式(如可能)
- 优化文件大小
- 提供替代文本
## 测试指南
### 测试类型
1. **单元测试**
- 测试单个函数或方法
- 使用 pytestPython或 JestJavaScript
- 目标覆盖率 > 80%
2. **集成测试**
- 测试模块间交互
- 测试 API 端点
- 测试数据库操作
3. **端到端测试**
- 测试完整用户流程
- 使用 Playwright 或 Cypress
- 测试关键业务场景
### 测试规范
```python
# Python 测试示例
import pytest
from unittest.mock import Mock, patch
class TestPatientManager:
"""患者管理器测试类"""
@pytest.fixture
def patient_manager(self):
"""测试夹具"""
return PatientManager(":memory:")
def test_create_patient_success(self, patient_manager):
"""测试成功创建患者"""
patient_data = {
"name": "测试患者",
"age": 30,
"gender": "male"
}
patient_id = patient_manager.create_patient(patient_data)
assert patient_id is not None
assert isinstance(patient_id, int)
def test_create_patient_invalid_data(self, patient_manager):
"""测试无效数据创建患者"""
invalid_data = {"name": ""}
with pytest.raises(ValueError):
patient_manager.create_patient(invalid_data)
```
```javascript
// JavaScript 测试示例
import { describe, it, expect, vi } from 'vitest'
import { mount } from '@vue/test-utils'
import PatientList from '@/components/PatientList.vue'
describe('PatientList', () => {
it('renders patient list correctly', () => {
const patients = [
{ id: 1, name: '患者1', age: 30 },
{ id: 2, name: '患者2', age: 25 }
]
const wrapper = mount(PatientList, {
props: { patients }
})
expect(wrapper.findAll('.patient-item')).toHaveLength(2)
expect(wrapper.text()).toContain('患者1')
expect(wrapper.text()).toContain('患者2')
})
it('emits patient-selected event when patient is clicked', async () => {
const patients = [{ id: 1, name: '患者1', age: 30 }]
const wrapper = mount(PatientList, {
props: { patients }
})
await wrapper.find('.patient-item').trigger('click')
expect(wrapper.emitted('patient-selected')).toBeTruthy()
expect(wrapper.emitted('patient-selected')[0]).toEqual([patients[0]])
})
})
```
### 运行测试
```bash
# Python 测试
cd backend
python -m pytest tests/ -v --cov=.
# JavaScript 测试
cd src/renderer
npm run test
# 所有测试
npm run test
```
## 发布流程
### 版本管理
我们使用语义化版本控制:
- **主版本号**: 不兼容的 API 修改
- **次版本号**: 向下兼容的功能性新增
- **修订号**: 向下兼容的问题修正
### 发布步骤
1. **更新版本号**
```bash
# 更新 package.json 中的版本号
npm version patch|minor|major
```
2. **更新 CHANGELOG**
- 记录所有重要更改
- 按类型分组(新增、更改、修复等)
3. **创建发布标签**
```bash
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0
```
4. **构建和测试**
```bash
npm run build
npm run test
```
5. **发布**
- 创建 GitHub Release
- 上传构建产物
- 发布到包管理器(如需要)
## 社区支持
### 获取帮助
- **GitHub Discussions**: 一般讨论和问题
- **GitHub Issues**: Bug 报告和功能请求
- **邮件**: dev@example.com
- **文档**: 项目 Wiki
### 参与社区
- 回答其他用户的问题
- 参与功能讨论
- 分享使用经验
- 推广项目
## 致谢
感谢所有为这个项目做出贡献的开发者!
### 贡献者
- [贡献者列表](https://github.com/example/body-balance-evaluation/contributors)
### 特别感谢
- 感谢所有提供反馈和建议的用户
- 感谢开源社区提供的优秀工具和库
- 感谢医疗专业人士提供的专业指导
---
再次感谢您的贡献!如果您有任何问题,请随时联系我们。