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

14 KiB
Raw Blame History

贡献指南

感谢您对身体平衡评估系统项目的关注!我们欢迎所有形式的贡献,包括但不限于代码、文档、测试、问题报告和功能建议。

目录

行为准则

我们的承诺

为了营造一个开放和友好的环境,我们作为贡献者和维护者承诺,无论年龄、体型、残疾、种族、性别认同和表达、经验水平、国籍、个人形象、种族、宗教或性取向如何,参与我们项目和社区的每个人都能获得无骚扰的体验。

我们的标准

有助于创造积极环境的行为包括:

  • 使用友好和包容的语言
  • 尊重不同的观点和经验
  • 优雅地接受建设性批评
  • 关注对社区最有利的事情
  • 对其他社区成员表示同理心

不可接受的行为包括:

  • 使用性化的语言或图像,以及不受欢迎的性关注或性骚扰
  • 恶意评论、侮辱/贬损评论,以及个人或政治攻击
  • 公开或私下骚扰
  • 未经明确许可,发布他人的私人信息,如物理或电子地址
  • 在专业环境中可能被合理认为不适当的其他行为

如何贡献

贡献类型

我们欢迎以下类型的贡献:

  1. 代码贡献

    • 新功能开发
    • Bug 修复
    • 性能优化
    • 代码重构
  2. 文档贡献

    • API 文档
    • 用户指南
    • 开发者文档
    • 代码注释
  3. 测试贡献

    • 单元测试
    • 集成测试
    • 端到端测试
    • 性能测试
  4. 设计贡献

    • UI/UX 设计
    • 图标设计
    • 用户体验改进
  5. 其他贡献

    • 问题报告
    • 功能建议
    • 社区支持
    • 翻译工作

开发环境设置

前置要求

  • Python 3.8+
  • Node.js 16.0+
  • Git
  • 代码编辑器(推荐 VS Code

环境配置

  1. 克隆仓库

    git clone https://github.com/example/body-balance-evaluation.git
    cd body-balance-evaluation
    
  2. 安装依赖

    # 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. 配置开发环境

    # 复制配置文件
    cp config.json config.local.json
    
    # 编辑本地配置(可选)
    # 修改 config.local.json 中的设置
    
  4. 启动开发服务器

    # 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 规范:

# 好的示例
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 进行代码格式化:

black . --line-length=88

代码检查

使用 flake8 进行代码检查:

flake8 . --max-line-length=88 --exclude=venv,__pycache__

JavaScript/Vue 代码规范

我们遵循 Vue.js 风格指南

// 好的示例
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 进行代码格式化:

npm run format

代码检查

使用 ESLint 进行代码检查:

npm run lint

通用规范

  1. 命名规范

    • 使用有意义的变量和函数名
    • Python: snake_case
    • JavaScript: camelCase
    • 常量: UPPER_CASE
    • 类名: PascalCase
  2. 注释规范

    • 为复杂逻辑添加注释
    • 使用文档字符串描述函数和类
    • 注释应该解释"为什么"而不是"是什么"
  3. 文件组织

    • 保持文件结构清晰
    • 相关功能放在同一模块
    • 避免循环导入

提交规范

我们使用 Conventional Commits 规范:

提交消息格式

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: 测试相关

示例

# 新功能
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. 创建功能分支

    git checkout -b feature/your-feature-name
    # 或
    git checkout -b fix/your-bug-fix
    
  3. 进行开发

    • 编写代码
    • 添加测试
    • 更新文档
  4. 提交更改

    git add .
    git commit -m "feat(scope): your commit message"
    
  5. 推送分支

    git push origin feature/your-feature-name
    
  6. 创建 Pull Request

    • 在 GitHub 上创建 Pull Request
    • 填写详细的描述

Pull Request 模板

## 描述
简要描述这个 PR 的目的和内容。

## 更改类型
- [ ] Bug 修复
- [ ] 新功能
- [ ] 重构
- [ ] 文档更新
- [ ] 性能优化
- [ ] 其他(请说明)

## 测试
- [ ] 已添加单元测试
- [ ] 已添加集成测试
- [ ] 已手动测试
- [ ] 所有测试通过

## 检查清单
- [ ] 代码遵循项目规范
- [ ] 已添加必要的注释
- [ ] 已更新相关文档
- [ ] 没有引入新的警告
- [ ] 已测试在不同环境下的兼容性

## 相关问题
关闭 #issue_number

## 截图(如适用)
添加截图来帮助解释你的更改。

## 额外说明
添加任何其他相关信息。

代码审查

所有 Pull Request 都需要经过代码审查:

  1. 自动检查

    • CI/CD 流水线检查
    • 代码格式检查
    • 测试覆盖率检查
  2. 人工审查

    • 代码质量
    • 设计合理性
    • 测试完整性
    • 文档完整性
  3. 审查标准

    • 代码可读性
    • 性能影响
    • 安全性考虑
    • 向后兼容性

问题报告

报告 Bug

使用 Bug 报告模板

**描述 Bug**
清晰简洁地描述 bug 是什么。

**重现步骤**
重现行为的步骤:
1. 转到 '...'
2. 点击 '....'
3. 滚动到 '....'
4. 看到错误

**预期行为**
清晰简洁地描述你期望发生什么。

**截图**
如果适用,添加截图来帮助解释你的问题。

**环境信息**
 - 操作系统: [例如 Windows 10]
 - Python 版本: [例如 3.9.0]
 - Node.js 版本: [例如 16.14.0]
 - 应用版本: [例如 1.0.0]

**额外信息**
添加任何其他关于问题的信息。

报告安全问题

如果发现安全漏洞,请不要在公开的 issue 中报告。请发送邮件到 security@example.com。

功能请求

使用 功能请求模板

**功能描述**
清晰简洁地描述你想要的功能。

**问题描述**
清晰简洁地描述问题是什么。例如:我总是感到沫丧当 [...]

**解决方案**
清晰简洁地描述你想要发生什么。

**替代方案**
清晰简洁地描述你考虑过的任何替代解决方案或功能。

**额外信息**
添加任何其他关于功能请求的信息或截图。

文档贡献

文档类型

  1. 用户文档

    • 安装指南
    • 使用教程
    • 常见问题
    • 故障排除
  2. 开发者文档

    • API 文档
    • 架构说明
    • 贡献指南
    • 代码注释
  3. 项目文档

    • README
    • CHANGELOG
    • LICENSE
    • 项目规划

文档规范

  1. Markdown 格式

    • 使用标准 Markdown 语法
    • 保持一致的格式
    • 使用有意义的标题
  2. 内容要求

    • 清晰准确
    • 及时更新
    • 包含示例
    • 考虑不同用户水平
  3. 图片和媒体

    • 使用 SVG 格式(如可能)
    • 优化文件大小
    • 提供替代文本

测试指南

测试类型

  1. 单元测试

    • 测试单个函数或方法
    • 使用 pytestPython或 JestJavaScript
    • 目标覆盖率 > 80%
  2. 集成测试

    • 测试模块间交互
    • 测试 API 端点
    • 测试数据库操作
  3. 端到端测试

    • 测试完整用户流程
    • 使用 Playwright 或 Cypress
    • 测试关键业务场景

测试规范

# 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 测试示例
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]])
  })
})

运行测试

# Python 测试
cd backend
python -m pytest tests/ -v --cov=.

# JavaScript 测试
cd src/renderer
npm run test

# 所有测试
npm run test

发布流程

版本管理

我们使用语义化版本控制:

  • 主版本号: 不兼容的 API 修改
  • 次版本号: 向下兼容的功能性新增
  • 修订号: 向下兼容的问题修正

发布步骤

  1. 更新版本号

    # 更新 package.json 中的版本号
    npm version patch|minor|major
    
  2. 更新 CHANGELOG

    • 记录所有重要更改
    • 按类型分组(新增、更改、修复等)
  3. 创建发布标签

    git tag -a v1.0.0 -m "Release version 1.0.0"
    git push origin v1.0.0
    
  4. 构建和测试

    npm run build
    npm run test
    
  5. 发布

    • 创建 GitHub Release
    • 上传构建产物
    • 发布到包管理器(如需要)

社区支持

获取帮助

  • GitHub Discussions: 一般讨论和问题
  • GitHub Issues: Bug 报告和功能请求
  • 邮件: dev@example.com
  • 文档: 项目 Wiki

参与社区

  • 回答其他用户的问题
  • 参与功能讨论
  • 分享使用经验
  • 推广项目

致谢

感谢所有为这个项目做出贡献的开发者!

贡献者

特别感谢

  • 感谢所有提供反馈和建议的用户
  • 感谢开源社区提供的优秀工具和库
  • 感谢医疗专业人士提供的专业指导

再次感谢您的贡献!如果您有任何问题,请随时联系我们。