优化目录结构
This commit is contained in:
parent
061f4b3f71
commit
0d3451cb5b
220
CHANGELOG.md
220
CHANGELOG.md
@ -1,220 +0,0 @@
|
|||||||
# 更新日志
|
|
||||||
|
|
||||||
本文档记录了身体平衡评估系统的所有重要更改。
|
|
||||||
|
|
||||||
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
|
|
||||||
并且本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
||||||
|
|
||||||
## [未发布]
|
|
||||||
|
|
||||||
### 计划新增
|
|
||||||
- [ ] 多语言支持(英文、日文)
|
|
||||||
- [ ] 云端数据同步功能
|
|
||||||
- [ ] 移动端应用支持
|
|
||||||
- [ ] AI辅助诊断建议
|
|
||||||
- [ ] 3D姿态可视化
|
|
||||||
- [ ] 报告模板自定义
|
|
||||||
- [ ] 批量数据分析
|
|
||||||
- [ ] 设备校准向导
|
|
||||||
|
|
||||||
### 计划改进
|
|
||||||
- [ ] 优化实时数据处理性能
|
|
||||||
- [ ] 增强数据可视化效果
|
|
||||||
- [ ] 改进用户界面交互体验
|
|
||||||
- [ ] 扩展设备兼容性
|
|
||||||
|
|
||||||
## [1.0.0] - 2024-01-15
|
|
||||||
|
|
||||||
### 新增
|
|
||||||
- ✅ 完整的身体平衡评估系统架构
|
|
||||||
- ✅ 基于Vue 3 + Electron的现代化前端界面
|
|
||||||
- ✅ 基于Flask的RESTful API后端服务
|
|
||||||
- ✅ 多传感器数据融合(摄像头、IMU、压力传感器)
|
|
||||||
- ✅ 实时姿态检测和平衡分析
|
|
||||||
- ✅ 患者信息管理系统
|
|
||||||
- ✅ 检测会话管理和历史记录
|
|
||||||
- ✅ 数据分析和可视化图表
|
|
||||||
- ✅ PDF报告生成和导出功能
|
|
||||||
- ✅ 系统设置和设备配置
|
|
||||||
- ✅ 完整的日志记录系统
|
|
||||||
- ✅ 数据备份和恢复功能
|
|
||||||
|
|
||||||
### 技术特性
|
|
||||||
- ✅ 基于MediaPipe的实时姿态检测
|
|
||||||
- ✅ WebSocket实时数据传输
|
|
||||||
- ✅ SQLite数据库存储
|
|
||||||
- ✅ 模块化架构设计
|
|
||||||
- ✅ 跨平台支持(Windows、macOS、Linux)
|
|
||||||
- ✅ 响应式UI设计
|
|
||||||
- ✅ 国际化支持框架
|
|
||||||
|
|
||||||
### 核心功能模块
|
|
||||||
|
|
||||||
#### 前端界面
|
|
||||||
- ✅ 现代化的用户界面设计
|
|
||||||
- ✅ 实时数据可视化
|
|
||||||
- ✅ 响应式布局适配
|
|
||||||
- ✅ 深色/浅色主题切换
|
|
||||||
- ✅ 多语言界面支持
|
|
||||||
|
|
||||||
#### 后端服务
|
|
||||||
- ✅ RESTful API设计
|
|
||||||
- ✅ 实时数据处理引擎
|
|
||||||
- ✅ 设备管理和通信
|
|
||||||
- ✅ 数据分析算法
|
|
||||||
- ✅ 报告生成服务
|
|
||||||
|
|
||||||
#### 数据管理
|
|
||||||
- ✅ 患者信息CRUD操作
|
|
||||||
- ✅ 检测会话管理
|
|
||||||
- ✅ 历史数据查询和分析
|
|
||||||
- ✅ 数据导出和备份
|
|
||||||
- ✅ 数据安全和隐私保护
|
|
||||||
|
|
||||||
#### 设备集成
|
|
||||||
- ✅ 摄像头视频采集和处理
|
|
||||||
- ✅ IMU传感器数据采集
|
|
||||||
- ✅ 压力传感器数据采集
|
|
||||||
- ✅ 设备状态监控
|
|
||||||
- ✅ 设备校准功能
|
|
||||||
|
|
||||||
#### 分析算法
|
|
||||||
- ✅ 重心轨迹分析
|
|
||||||
- ✅ 姿态稳定性评估
|
|
||||||
- ✅ 平衡能力评分
|
|
||||||
- ✅ 异常检测和预警
|
|
||||||
- ✅ 趋势分析和对比
|
|
||||||
|
|
||||||
### 文件结构
|
|
||||||
```
|
|
||||||
BodyBalanceEvaluation/
|
|
||||||
├── backend/ # 后端服务
|
|
||||||
│ ├── app.py # 主应用入口
|
|
||||||
│ ├── database.py # 数据库管理
|
|
||||||
│ ├── device_manager.py # 设备管理
|
|
||||||
│ ├── detection_engine.py # 检测引擎
|
|
||||||
│ ├── data_processor.py # 数据处理
|
|
||||||
│ ├── utils.py # 工具函数
|
|
||||||
│ ├── requirements.txt # Python依赖
|
|
||||||
│ └── tests/ # 测试文件
|
|
||||||
├── src/
|
|
||||||
│ ├── main/ # Electron主进程
|
|
||||||
│ └── renderer/ # Vue前端应用
|
|
||||||
│ ├── src/
|
|
||||||
│ │ ├── views/ # 页面组件
|
|
||||||
│ │ ├── stores/ # 状态管理
|
|
||||||
│ │ └── services/ # API服务
|
|
||||||
│ └── package.json
|
|
||||||
├── data/ # 数据目录
|
|
||||||
├── logs/ # 日志目录
|
|
||||||
├── temp/ # 临时文件
|
|
||||||
├── main.py # 启动脚本
|
|
||||||
├── config.json # 配置文件
|
|
||||||
├── package.json # 项目配置
|
|
||||||
├── README.md # 项目说明
|
|
||||||
├── LICENSE # 许可证
|
|
||||||
├── .gitignore # Git忽略规则
|
|
||||||
├── install.bat # 安装脚本
|
|
||||||
├── start_dev.bat # 开发环境启动
|
|
||||||
├── start_prod.bat # 生产环境启动
|
|
||||||
└── CHANGELOG.md # 更新日志
|
|
||||||
```
|
|
||||||
|
|
||||||
### 系统要求
|
|
||||||
- **操作系统**: Windows 10/11, macOS 10.15+, Ubuntu 18.04+
|
|
||||||
- **Python**: 3.8 或更高版本
|
|
||||||
- **Node.js**: 16.0 或更高版本
|
|
||||||
- **内存**: 最少 4GB RAM,推荐 8GB+
|
|
||||||
- **存储**: 最少 2GB 可用空间
|
|
||||||
- **摄像头**: USB摄像头或内置摄像头
|
|
||||||
- **串口设备**: IMU和压力传感器(可选)
|
|
||||||
|
|
||||||
### 安装和使用
|
|
||||||
1. 运行 `install.bat` 安装所有依赖
|
|
||||||
2. 运行 `start_dev.bat` 启动开发环境
|
|
||||||
3. 或运行 `start_prod.bat` 启动生产环境
|
|
||||||
4. 访问 http://localhost:5173 使用应用
|
|
||||||
|
|
||||||
### 已知问题
|
|
||||||
- 在某些低配置设备上可能出现实时处理延迟
|
|
||||||
- 部分USB摄像头可能需要额外驱动
|
|
||||||
- IMU传感器需要正确的串口配置
|
|
||||||
|
|
||||||
### 性能优化
|
|
||||||
- 实时数据处理采用多线程架构
|
|
||||||
- 图像处理使用GPU加速(如可用)
|
|
||||||
- 数据库查询优化和索引
|
|
||||||
- 前端虚拟滚动和懒加载
|
|
||||||
|
|
||||||
### 安全特性
|
|
||||||
- 本地数据存储,保护隐私
|
|
||||||
- 数据传输加密
|
|
||||||
- 用户会话管理
|
|
||||||
- 输入数据验证和清理
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 版本说明
|
|
||||||
|
|
||||||
### 版本号格式
|
|
||||||
本项目使用语义化版本号:`主版本号.次版本号.修订号`
|
|
||||||
|
|
||||||
- **主版本号**: 不兼容的API修改
|
|
||||||
- **次版本号**: 向下兼容的功能性新增
|
|
||||||
- **修订号**: 向下兼容的问题修正
|
|
||||||
|
|
||||||
### 更新类型
|
|
||||||
- **新增 (Added)**: 新功能
|
|
||||||
- **更改 (Changed)**: 对现有功能的更改
|
|
||||||
- **弃用 (Deprecated)**: 即将移除的功能
|
|
||||||
- **移除 (Removed)**: 已移除的功能
|
|
||||||
- **修复 (Fixed)**: 错误修复
|
|
||||||
- **安全 (Security)**: 安全相关的修复
|
|
||||||
|
|
||||||
### 发布周期
|
|
||||||
- **主版本**: 每年1-2次重大更新
|
|
||||||
- **次版本**: 每季度功能更新
|
|
||||||
- **修订版**: 每月bug修复和小改进
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 贡献指南
|
|
||||||
|
|
||||||
如果您想为本项目贡献代码,请:
|
|
||||||
|
|
||||||
1. Fork 本仓库
|
|
||||||
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
|
|
||||||
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
|
|
||||||
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
|
||||||
5. 创建 Pull Request
|
|
||||||
|
|
||||||
### 提交信息格式
|
|
||||||
```
|
|
||||||
type(scope): description
|
|
||||||
|
|
||||||
[optional body]
|
|
||||||
|
|
||||||
[optional footer]
|
|
||||||
```
|
|
||||||
|
|
||||||
类型包括:
|
|
||||||
- `feat`: 新功能
|
|
||||||
- `fix`: 修复bug
|
|
||||||
- `docs`: 文档更新
|
|
||||||
- `style`: 代码格式化
|
|
||||||
- `refactor`: 代码重构
|
|
||||||
- `test`: 测试相关
|
|
||||||
- `chore`: 构建过程或辅助工具的变动
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 支持和反馈
|
|
||||||
|
|
||||||
- **问题报告**: [GitHub Issues](https://github.com/example/body-balance-evaluation/issues)
|
|
||||||
- **功能请求**: [GitHub Discussions](https://github.com/example/body-balance-evaluation/discussions)
|
|
||||||
- **邮件支持**: dev@example.com
|
|
||||||
- **文档**: [项目Wiki](https://github.com/example/body-balance-evaluation/wiki)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*最后更新: 2024-01-15*
|
|
680
CONTRIBUTING.md
680
CONTRIBUTING.md
@ -1,680 +0,0 @@
|
|||||||
# 贡献指南
|
|
||||||
|
|
||||||
感谢您对身体平衡评估系统项目的关注!我们欢迎所有形式的贡献,包括但不限于代码、文档、测试、问题报告和功能建议。
|
|
||||||
|
|
||||||
## 目录
|
|
||||||
|
|
||||||
- [行为准则](#行为准则)
|
|
||||||
- [如何贡献](#如何贡献)
|
|
||||||
- [开发环境设置](#开发环境设置)
|
|
||||||
- [代码规范](#代码规范)
|
|
||||||
- [提交规范](#提交规范)
|
|
||||||
- [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. **单元测试**
|
|
||||||
- 测试单个函数或方法
|
|
||||||
- 使用 pytest(Python)或 Jest(JavaScript)
|
|
||||||
- 目标覆盖率 > 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)
|
|
||||||
|
|
||||||
### 特别感谢
|
|
||||||
|
|
||||||
- 感谢所有提供反馈和建议的用户
|
|
||||||
- 感谢开源社区提供的优秀工具和库
|
|
||||||
- 感谢医疗专业人士提供的专业指导
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
再次感谢您的贡献!如果您有任何问题,请随时联系我们。
|
|
@ -1,105 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""
|
|
||||||
初始化测试数据脚本
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'backend'))
|
|
||||||
|
|
||||||
from backend.database import DatabaseManager
|
|
||||||
import uuid
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
def init_test_data():
|
|
||||||
"""初始化测试数据"""
|
|
||||||
# 初始化数据库
|
|
||||||
db_manager = DatabaseManager('backend/data/body_balance.db')
|
|
||||||
db_manager.init_database()
|
|
||||||
|
|
||||||
print("数据库初始化完成")
|
|
||||||
|
|
||||||
# 检查是否已有患者数据
|
|
||||||
patients_count = db_manager.get_patients_count()
|
|
||||||
print(f"当前患者数量: {patients_count}")
|
|
||||||
|
|
||||||
if patients_count > 0:
|
|
||||||
print("数据库中已有患者数据,跳过插入")
|
|
||||||
return
|
|
||||||
|
|
||||||
# 插入测试患者数据
|
|
||||||
test_patients = [
|
|
||||||
{
|
|
||||||
'name': '张三',
|
|
||||||
'gender': 'male',
|
|
||||||
'age': 35,
|
|
||||||
'height': 175,
|
|
||||||
'weight': 70,
|
|
||||||
'phone': '13800138001',
|
|
||||||
'medical_history': '无特殊病史',
|
|
||||||
'notes': '测试患者1'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'name': '李四',
|
|
||||||
'gender': 'female',
|
|
||||||
'age': 28,
|
|
||||||
'height': 165,
|
|
||||||
'weight': 55,
|
|
||||||
'phone': '13800138002',
|
|
||||||
'medical_history': '轻微腰椎间盘突出',
|
|
||||||
'notes': '测试患者2'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'name': '王五',
|
|
||||||
'gender': 'male',
|
|
||||||
'age': 42,
|
|
||||||
'height': 180,
|
|
||||||
'weight': 80,
|
|
||||||
'phone': '13800138003',
|
|
||||||
'medical_history': '高血压',
|
|
||||||
'notes': '测试患者3'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'name': '赵六',
|
|
||||||
'gender': 'female',
|
|
||||||
'age': 31,
|
|
||||||
'height': 160,
|
|
||||||
'weight': 50,
|
|
||||||
'phone': '13800138004',
|
|
||||||
'medical_history': '无',
|
|
||||||
'notes': '测试患者4'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'name': '钱七',
|
|
||||||
'gender': 'male',
|
|
||||||
'age': 55,
|
|
||||||
'height': 170,
|
|
||||||
'weight': 75,
|
|
||||||
'phone': '13800138005',
|
|
||||||
'medical_history': '糖尿病',
|
|
||||||
'notes': '测试患者5'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
print("开始插入测试患者数据...")
|
|
||||||
|
|
||||||
for i, patient_data in enumerate(test_patients, 1):
|
|
||||||
try:
|
|
||||||
patient_id = db_manager.create_patient(patient_data)
|
|
||||||
print(f"插入患者 {i}: {patient_data['name']} (ID: {patient_id})")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"插入患者 {i} 失败: {e}")
|
|
||||||
|
|
||||||
# 验证插入结果
|
|
||||||
final_count = db_manager.get_patients_count()
|
|
||||||
print(f"\n插入完成,当前患者总数: {final_count}")
|
|
||||||
|
|
||||||
# 显示患者列表
|
|
||||||
patients = db_manager.get_patients(page=1, size=10)
|
|
||||||
print("\n患者列表:")
|
|
||||||
for patient in patients:
|
|
||||||
print(f"- {patient['name']} ({patient['gender']}, {patient['age']}岁) - {patient['phone']}")
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
init_test_data()
|
|
@ -70,7 +70,10 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.5.0",
|
"axios": "^1.5.0",
|
||||||
"electron-log": "^4.4.8",
|
"electron-log": "^4.4.8",
|
||||||
"socket.io-client": "^4.8.1"
|
"element-plus": "^2.10.4",
|
||||||
|
"html2canvas": "^1.4.1",
|
||||||
|
"socket.io-client": "^4.8.1",
|
||||||
|
"vue-router": "^4.5.1"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"backend_host": "0.0.0.0",
|
"backend_host": "0.0.0.0",
|
||||||
|
Loading…
Reference in New Issue
Block a user