docs: 添加 H5/MySQL/权限增强设计方案
- H5 移动端适配:响应式 CSS + 底部 Tab 导航 - MySQL 迁移:mysql-connector-python 裸 SQL - 用户权限:非管理员仅能看到自己 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
209
docs/plans/2026-01-23-h5-mysql-permissions-design.md
Normal file
209
docs/plans/2026-01-23-h5-mysql-permissions-design.md
Normal file
@@ -0,0 +1,209 @@
|
||||
# Vitals 改造设计方案
|
||||
|
||||
> 日期: 2026-01-23
|
||||
> 状态: 已确认
|
||||
|
||||
## 概述
|
||||
|
||||
本次改造包含三个主要目标:
|
||||
1. **H5 移动端适配** - 所有页面优化为移动端友好
|
||||
2. **MySQL 数据库迁移** - 从 SQLite 迁移到 MySQL
|
||||
3. **用户权限增强** - 非管理员仅能看到自己
|
||||
|
||||
## 一、技术决策
|
||||
|
||||
| 决策项 | 选择 | 理由 |
|
||||
|--------|------|------|
|
||||
| 前端框架 | 保持 Python 渲染 HTML | 改动最小,无需重写前端 |
|
||||
| 数据库驱动 | mysql-connector-python 裸 SQL | 保持现有查询结构 |
|
||||
| CSS 方案 | 响应式 CSS + 媒体查询 | 无需引入新框架 |
|
||||
|
||||
## 二、H5 移动端设计系统
|
||||
|
||||
### 2.1 配色方案
|
||||
|
||||
| 元素 | 色值 | 用途 |
|
||||
|------|------|------|
|
||||
| Primary | `#3B82F6` | 主色调、链接、选中状态 |
|
||||
| Secondary | `#60A5FA` | 辅助色、次要元素 |
|
||||
| CTA | `#F97316` | 主要操作按钮、强调 |
|
||||
| Background | `#F8FAFC` | 页面背景 |
|
||||
| Text | `#1E293B` | 正文文字 |
|
||||
|
||||
### 2.2 字体
|
||||
|
||||
```css
|
||||
@import url('https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600;700&family=Fira+Sans:wght@300;400;500;600;700&display=swap');
|
||||
|
||||
--font-heading: 'Fira Sans', sans-serif;
|
||||
--font-body: 'Fira Sans', sans-serif;
|
||||
--font-mono: 'Fira Code', monospace;
|
||||
```
|
||||
|
||||
### 2.3 响应式断点
|
||||
|
||||
```css
|
||||
/* 移动优先策略 */
|
||||
默认样式 → 手机 (< 768px)
|
||||
@media (min-width: 768px) → 平板
|
||||
@media (min-width: 1024px) → 桌面
|
||||
```
|
||||
|
||||
### 2.4 移动端 UX 规范
|
||||
|
||||
| 规范 | 要求 |
|
||||
|------|------|
|
||||
| 触摸目标 | 最小 44x44px |
|
||||
| 触摸间距 | 元素间至少 8px |
|
||||
| 输入框 | 使用正确的 `inputmode` 属性 |
|
||||
| 点击优化 | `touch-action: manipulation` |
|
||||
| 固定元素 | 使用 `z-index: 50` |
|
||||
| 安全区域 | 底部导航考虑 `safe-area-inset-bottom` |
|
||||
|
||||
### 2.5 导航栏改造
|
||||
|
||||
**桌面端 (≥768px):** 保持顶部水平导航
|
||||
|
||||
**移动端 (<768px):** 底部 Tab 栏
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ 页面内容区域 │
|
||||
│ │
|
||||
├─────────────────────────────────────┤
|
||||
│ 🏠 🏃 🍽️ 😴 ⚙️ │
|
||||
│ 首页 运动 饮食 睡眠 更多 │
|
||||
└─────────────────────────────────────┘
|
||||
|
||||
"更多" 展开菜单:体重、阅读、报告、设置、管理(仅管理员)
|
||||
```
|
||||
|
||||
### 2.6 页面适配清单
|
||||
|
||||
| 页面 | 适配要点 |
|
||||
|------|----------|
|
||||
| 登录/注册 | 全屏表单,大按钮 |
|
||||
| 首页 Dashboard | 卡片单列堆叠,数据卡片全宽 |
|
||||
| 数据录入页 | 表单全宽,输入框加大 |
|
||||
| 数据列表 | 表格改卡片列表 |
|
||||
| 图表 | 响应式宽度 100% |
|
||||
| 设置/管理 | 单列列表布局 |
|
||||
|
||||
## 三、MySQL 数据库迁移
|
||||
|
||||
### 3.1 SQLite vs MySQL 差异
|
||||
|
||||
| 功能 | SQLite | MySQL |
|
||||
|------|--------|-------|
|
||||
| 占位符 | `?` | `%s` |
|
||||
| 自增 | `AUTOINCREMENT` | `AUTO_INCREMENT` |
|
||||
| 时间函数 | `datetime('now')` | `NOW()` |
|
||||
| 字符串拼接 | `\|\|` | `CONCAT()` |
|
||||
|
||||
### 3.2 配置方式
|
||||
|
||||
```bash
|
||||
# 环境变量
|
||||
MYSQL_HOST=localhost
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_USER=vitals
|
||||
MYSQL_PASSWORD=xxx
|
||||
MYSQL_DATABASE=vitals
|
||||
```
|
||||
|
||||
### 3.3 database.py 改动清单
|
||||
|
||||
1. 添加 MySQL 连接池管理
|
||||
2. 所有 `?` 占位符改为 `%s`
|
||||
3. `AUTOINCREMENT` 改为 `AUTO_INCREMENT`
|
||||
4. 时间函数调整
|
||||
5. 字段类型映射 (TEXT → VARCHAR/TEXT)
|
||||
|
||||
### 3.4 表结构映射
|
||||
|
||||
```sql
|
||||
-- users 表
|
||||
CREATE TABLE users (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||||
name VARCHAR(255) NOT NULL UNIQUE,
|
||||
created_at DATETIME NOT NULL,
|
||||
is_active TINYINT DEFAULT 0,
|
||||
gender VARCHAR(10),
|
||||
height_cm FLOAT,
|
||||
weight_kg FLOAT,
|
||||
age INT,
|
||||
password_hash VARCHAR(255),
|
||||
email VARCHAR(255),
|
||||
is_admin TINYINT DEFAULT 0,
|
||||
is_disabled TINYINT DEFAULT 0
|
||||
);
|
||||
|
||||
-- 其他表类似处理
|
||||
```
|
||||
|
||||
## 四、用户权限增强
|
||||
|
||||
### 4.1 权限模型
|
||||
|
||||
```
|
||||
管理员 (is_admin=1)
|
||||
├── 查看所有用户列表
|
||||
├── 启用/禁用用户
|
||||
├── 删除用户
|
||||
├── 管理邀请码
|
||||
└── 访问 /admin 页面
|
||||
|
||||
普通用户 (is_admin=0)
|
||||
├── 仅能看到自己的用户信息
|
||||
├── 无法访问 /admin 页面
|
||||
└── 无法看到其他用户存在
|
||||
```
|
||||
|
||||
### 4.2 API 接口改动
|
||||
|
||||
| 接口 | 当前行为 | 改动后 |
|
||||
|------|----------|--------|
|
||||
| `GET /api/users` | 返回所有用户 | 非管理员仅返回自己 |
|
||||
| `GET /api/users/{id}` | 返回指定用户 | 非管理员只能查自己,否则 403 |
|
||||
|
||||
### 4.3 页面访问控制
|
||||
|
||||
| 页面 | 管理员 | 普通用户 |
|
||||
|------|--------|----------|
|
||||
| `/admin` | 完整功能 | 重定向到首页 |
|
||||
| `/settings` | 完整功能 | 仅自己信息 |
|
||||
| 导航栏「管理」 | 显示 | 隐藏 |
|
||||
|
||||
## 五、实施阶段
|
||||
|
||||
### 阶段 1: MySQL 迁移
|
||||
- [ ] 改造 database.py 支持 MySQL
|
||||
- [ ] 编写数据迁移脚本
|
||||
- [ ] 测试所有数据库操作
|
||||
|
||||
### 阶段 2: 用户权限
|
||||
- [ ] 修改 /api/users 接口
|
||||
- [ ] 修改 /api/users/{id} 接口
|
||||
- [ ] 隐藏非管理员的管理入口
|
||||
|
||||
### 阶段 3: H5 移动端适配
|
||||
- [ ] 全局样式基础设施(viewport, 字体, 变量)
|
||||
- [ ] 底部导航栏组件
|
||||
- [ ] 逐页适配(11个页面)
|
||||
|
||||
### 阶段 4: 测试验证
|
||||
- [ ] 移动端真机测试
|
||||
- [ ] MySQL 生产环境测试
|
||||
- [ ] 权限功能测试
|
||||
|
||||
## 六、不变的部分
|
||||
|
||||
以下模块保持不变,不在本次改造范围:
|
||||
- `models.py` - 数据模型定义
|
||||
- `auth.py` - 认证逻辑
|
||||
- `vision/` - AI 食物识别
|
||||
- `importers/` - 数据导入
|
||||
- `backup.py` - 备份功能
|
||||
- `export.py` - 导出功能
|
||||
- `report.py` - 报告生成
|
||||
- `calories.py` - 热量计算
|
||||
- API 业务逻辑(仅改数据库层和权限检查)
|
||||
Reference in New Issue
Block a user