diff --git a/README.md b/README.md index 8bf9b54..d93a03e 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,14 @@ docker-compose up -d # 安装依赖 pip install -e . -# 设置环境变量 +# 设置 MySQL 环境变量 +export MYSQL_HOST=localhost +export MYSQL_PORT=3306 +export MYSQL_USER=vitals +export MYSQL_PASSWORD=your_password +export MYSQL_DATABASE=vitals + +# 设置应用环境变量 export ADMIN_USERNAME=admin export ADMIN_PASSWORD=your_password export JWT_SECRET=$(openssl rand -hex 32) @@ -273,16 +280,21 @@ pip install -e . | 变量 | 必填 | 说明 | |------|------|------| +| `MYSQL_HOST` | 是 | MySQL 服务器地址(默认 `localhost`) | +| `MYSQL_PORT` | 否 | MySQL 端口(默认 `3306`) | +| `MYSQL_USER` | 是 | MySQL 用户名 | +| `MYSQL_PASSWORD` | 是 | MySQL 密码 | +| `MYSQL_DATABASE` | 是 | MySQL 数据库名(默认 `vitals`) | +| `MYSQL_ROOT_PASSWORD` | 是 | MySQL root 密码(Docker 部署时需要) | | `ADMIN_USERNAME` | 是 | 管理员用户名(首次启动时创建) | | `ADMIN_PASSWORD` | 是 | 管理员密码 | | `JWT_SECRET` | 是 | JWT 签名密钥(建议用 `openssl rand -hex 32` 生成) | -| `VITALS_DB_PATH` | 否 | 数据库路径(默认 `~/.vitals/vitals.db`) | | `DASHSCOPE_API_KEY` | 否 | 阿里云通义千问 API Key,用于 AI 食物识别 | | `DEEPSEEK_API_KEY` | 否 | DeepSeek API Key,用于 AI 食物识别 | ## 技术栈 -- **后端**: Python, FastAPI, SQLite +- **后端**: Python, FastAPI, MySQL 8.0 - **前端**: HTML, CSS, JavaScript, Chart.js - **认证**: JWT (PyJWT), bcrypt - **部署**: Docker, Docker Compose @@ -309,7 +321,7 @@ vitals/ ├── src/vitals/ │ ├── core/ │ │ ├── models.py # 数据模型(User, Invite, Exercise, Meal...) -│ │ ├── database.py # 数据库操作 +│ │ ├── database.py # MySQL 数据库操作(连接池管理) │ │ ├── auth.py # JWT 认证、密码哈希 │ │ ├── backup.py # 数据库备份 │ │ ├── export.py # 数据导出导入 @@ -322,12 +334,14 @@ vitals/ │ ├── web/ │ │ └── app.py # FastAPI 应用 │ └── cli.py # 命令行工具 +├── scripts/ +│ └── migrate_sqlite_to_mysql.py # SQLite 到 MySQL 迁移脚本 ├── tests/ # 测试文件 ├── docs/ │ ├── context/ # 开发上下文 │ └── plans/ # 设计文档 ├── Dockerfile # Docker 镜像配置 -├── docker-compose.yml # Docker Compose 配置 +├── docker-compose.yml # Docker Compose + MySQL 配置 ├── .env.example # 环境变量模板 ├── pyproject.toml # Python 项目配置 └── README.md @@ -401,6 +415,14 @@ vitals/ - [x] **Docker 支持** - Dockerfile + docker-compose.yml - [x] **环境变量配置** - 灵活的配置管理 - [x] **健康检查** - Docker 容器健康检查 +- [x] **MySQL 数据库** - MySQL 8.0 连接池,支持数据迁移 + +#### 移动端 H5 适配 +- [x] **响应式布局** - 所有页面适配移动端屏幕(768px/400px 断点) +- [x] **底部 Tab 导航** - 移动端专属底部导航栏,支持"更多"菜单 +- [x] **触控优化** - 按钮和交互元素符合 44px/48px 触控标准 +- [x] **iOS 安全区域** - 支持 iPhone 刘海屏和底部横条 +- [x] **全页面适配** - 登录/注册、首页、运动、饮食、睡眠、体重、阅读、报告、设置、管理页面 ### 待完善功能 🚧 @@ -413,7 +435,7 @@ vitals/ - [ ] **月度报告** - PDF 报告生成功能(已有框架,需完善) - [ ] **目标设定** - 运动目标、饮食目标、体重目标的设定和追踪 - [ ] **数据统计增强** - 更丰富的图表和趋势分析 -- [ ] **移动端优化** - 响应式设计改进,更好的移动端体验 +- [x] **移动端优化** - 响应式设计改进,全部页面已适配移动端 - [ ] **离线支持** - PWA 支持,离线数据缓存 #### 低优先级 @@ -427,11 +449,68 @@ vitals/ ### 已知问题 🐛 - [ ] 大量数据时列表加载性能需优化 -- [ ] 部分页面在小屏幕上布局需要调整 - [ ] 书籍封面搜索有时无法找到匹配结果 +## 数据迁移 + +### 从 SQLite 迁移到 MySQL + +如果你有旧版本的 SQLite 数据需要迁移,可以使用迁移脚本: + +```bash +# 1. 确保 MySQL 服务已启动并配置好环境变量 +export MYSQL_HOST=localhost +export MYSQL_PORT=3306 +export MYSQL_USER=vitals +export MYSQL_PASSWORD=your_password +export MYSQL_DATABASE=vitals + +# 2. 运行迁移脚本(默认从 ~/.vitals/vitals.db 读取) +python scripts/migrate_sqlite_to_mysql.py + +# 或指定 SQLite 数据库路径 +VITALS_DB_PATH=/path/to/old/vitals.db python scripts/migrate_sqlite_to_mysql.py +``` + +迁移脚本会自动处理: +- 用户数据(users) +- 运动记录(exercise) +- 饮食记录(meal) +- 睡眠记录(sleep) +- 体重记录(weight) +- 阅读记录(reading) +- 邀请码(invites) +- 配置数据(config) + ## 更新日志 +### 2026-01-23 + +#### 🗄️ MySQL 数据库迁移 +- **数据库切换** - 从 SQLite 迁移到 MySQL 8.0 +- **连接池支持** - 使用 MySQL 连接池管理,提升性能 +- **Docker 集成** - docker-compose 自动配置 MySQL 服务 +- **数据迁移脚本** - 提供 SQLite 到 MySQL 的数据迁移工具 +- **类型兼容性修复** - 添加 `_parse_datetime`、`_parse_date`、`_parse_time` 辅助函数,处理 MySQL 返回原生类型 + +#### 🔒 用户权限增强 +- **API 权限控制** - `/api/users` 非管理员仅返回自己,`/api/users/{id}` 非管理员只能查询自己(否则 403) +- **导航栏隐藏** - 非管理员用户隐藏「管理」入口 + +#### 📱 移动端 H5 全页面适配 +- **登录/注册页面** - 移动端布局优化,触摸目标符合标准 +- **首页 Dashboard** - 卡片布局适配,底部导航栏 +- **运动/饮食页面** - 表格转卡片列表,表单输入增大 +- **睡眠/体重/阅读页面** - 响应式布局,48px 输入框 +- **报告页面** - 按钮触摸目标优化(48px),底部导航 +- **设置页面** - 响应式布局,支持手机浏览 +- **管理页面** - 表格改为卡片列表(data-label) +- **底部 Tab 导航** - 固定底部导航栏 + "更多"菜单 +- **iOS 安全区域** - 支持刘海屏和底部横条 + +#### 🌐 网络访问 +- **绑定地址优化** - 默认绑定 `0.0.0.0`,支持局域网访问和移动端真机测试 + ### 2026-01-22 #### 🔐 混合认证方案优化