Hotfix release available: 2026-07-14c "Mort".
upgrade now! [57.3] (what's this?)
家庭管理系统h5:冷启动文件
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| 家庭管理系统h5:冷启动文件 [2026/09/16 13:06] – 补 折叠+身份证记录模块 172.17.0.1 | 家庭管理系统h5:冷启动文件 [2026/10/18 01:18] (current) – 4.58 新增成长记录模块 172.17.0.1 | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| > 版本 1.0 | 更新 2026-09-16 | 访问 `https:// | > 版本 1.0 | 更新 2026-09-16 | 访问 `https:// | ||
| > 与研发任务/ | > 与研发任务/ | ||
| + | |||
| + | |||
| + | ====== 4.x 果果工资模块(2026-09-17 新增,仅管理员) ====== | ||
| + | |||
| + | **需求**:记录**请假**(类型/ | ||
| + | |||
| + | **① 数据表** `salary_month`(family.db) | ||
| + | | 字段 | 说明 | | ||
| + | |---|---| | ||
| + | | month | 月份(2026-08)| | ||
| + | | base / days_per_month / day_rate | 月工资 / 计薪天数(默认 26)/ 日工资(0=自动=base÷dpm)| | ||
| + | | sleep_rate | 带睡单价(默认 100 元/晚)| | ||
| + | | leave_items | 请假明细 JSON `[{type, | ||
| + | | ot_items | 加班明细 JSON `[{type, | ||
| + | | leave_days / leave_deduct | 请假合计天数 / 扣费 | | ||
| + | | ot_days_sleep / ot_pay_sleep | 加班天数(带睡) / 加班费(带睡) | | ||
| + | | ot_days_day / ot_pay_day | 加班天数(日班) / 加班费(日班) | | ||
| + | | total / actual / paid / note | 月总薪水(自动)/ | ||
| + | |||
| + | **② 计算规则**(后端 `_calc_salary_month()` 权威计算 + 前端实时预览) | ||
| + | < | ||
| + | 日工资 | ||
| + | 请假扣费 | ||
| + | 加班费(带睡) = 带睡晚数 × 带睡单价 | ||
| + | 加班费(日班) = 日班天数 × 日工资 | ||
| + | 月总薪水 | ||
| + | 实际薪水 | ||
| + | </ | ||
| + | |||
| + | **③ 接口**(`family_api.py`) | ||
| + | - `GET / | ||
| + | - `POST / | ||
| + | - `DELETE / | ||
| + | - ⚠️ 权限守卫是全局 `@bp.before_request def _guard()`(登录校验);新增管理员判定函数命名为 **`_is_admin_user`**(★ 不能叫 `_guard`,会覆盖全局守卫) | ||
| + | |||
| + | **④ 前端**(`family.html`) | ||
| + | - 新 tab「💰 果果工资」→ 仅管理员(加入 `ALL_TABS`,**不入 `USER_TABS`**) | ||
| + | - 列表:月份 | 月工资 | 请假(天) | 扣费 | 加班费 | 实发 | 操作(编辑/ | ||
| + | - 表单:月份 / 月工资 / 计薪天数(自动显示日工资)/ | ||
| + | - ★ 关键实现细节:`salPaint()` **只更新" | ||
| + | |||
| + | **⑤ 权限判定(2026-09-17 修复踩坑)** | ||
| + | - ❌ 现象:管理员(武燕青)新增工资 → 提示「仅管理员可操作」 | ||
| + | - 根因:后端只按 `d.get(" | ||
| + | - ✅ 修复:新增 **`_is_admin_req(d)`** —— **优先按登录态** `cur_user(conn).role == ' | ||
| + | - 验证:管理员保存 → 成功(实发自动计算)✅|普通用户(果果 13780562913)→ **403** ✅ | ||
| + | |||
| + | **⑥ 验证** | ||
| + | - 与用户图片逐项核对:日工资 192.31 ✅|3月 请假2天 → 扣 384.62 ✅|带睡 2 晚 = 200 ✅|4月 日班 1 天 = 192.31 ✅ | ||
| + | - 前端实测:日工资自动显示 ✅|请假 2 天 → 扣 384.62 ✅|带睡 3 晚 = 300 ✅|月总薪水 = 5000+300−384.62 = **4915.38** ✅|输入过程中值不丢失 ✅ | ||
| + | - 非管理员访问 → 403 / 不可见 tab ✅ | ||
| ====== 1. 系统概览 ====== | ====== 1. 系统概览 ====== | ||
| Line 79: | Line 130: | ||
| **监护人(10 项/ | **监护人(10 项/ | ||
| + | |||
| + | ====== 4.y 积分管理「扣分」人员下拉为空修复(2026-09-17) ====== | ||
| + | |||
| + | **现象**:积分管理 → 「-扣分」弹窗里**人员下拉是空的**。 | ||
| + | |||
| + | **根因**(原有 bug,自扣分功能上线起即存在) | ||
| + | < | ||
| + | Promise.all([api(' | ||
| + | var mem = a.members || []; // ❌ a 是数组,a.members 恒为 undefined → mem 始终为空 | ||
| + | CACHE.deductRules = (a[1].rules||[])... | ||
| + | </ | ||
| + | → 接口其实正常返回人员(席子初/ | ||
| + | |||
| + | **修复** | ||
| + | < | ||
| + | var mem = (a[0]||{}).members || []; | ||
| + | CACHE.deductRules = ((a[1]||{}).rules||[]).filter(r => (r.kind===' | ||
| + | </ | ||
| + | |||
| + | **验证**:扣分弹窗人员下拉 = 席子初 / 席子恩 ✅|加分弹窗同样正常 ✅(加分/ | ||
| + | |||
| + | > ★ 教训:`Promise.all([...])` 的回调参数是**数组**,必须用 `a[0] / a[1]` 取,不能按对象字段取。 | ||
| + | |||
| + | ====== 4.z 家务计划:去重 + 永久有效(2026-09-17) ====== | ||
| + | |||
| + | **用户需求**:① 删除重复标题的任务;② 去掉截止日期(默认永久有效);③ 去掉「永久有效」选项。 | ||
| + | |||
| + | **① 数据去重**(`family.db` → `tasks` 表,删前已备份 `/ | ||
| + | | 重复标题 | 份数 | 处理 | | ||
| + | |---|---|---| | ||
| + | | 加湿器加满水 | 14 | 保留 # | ||
| + | | 小恩课后作业的辅导与完成 | 19 | 保留 # | ||
| + | - 共删除 **31** 条 → 任务数 **49 → 18** | ||
| + | - 规则:同标题**保留 id 最小**(最早条目),其余删除 | ||
| + | |||
| + | **② 截止日期 → 永久有效** | ||
| + | - 全部 18 条 `due_date` 统一置为 **`永久`** | ||
| + | - 后端 `_overdue()` 已有 try/except 兜底(`fromisoformat(' | ||
| + | |||
| + | **③ 前端移除**(`family.html`) | ||
| + | - 列表:去掉「截止 XXX」显示(`_dueTxt` 置空) | ||
| + | - 编辑表单 / 新增表单:移除「截止日期」输入框 与「永久有效」复选框(及 `foreverChg/ | ||
| + | - 提交时 `due_date` 固定传 `' | ||
| + | - 残留变量(`et_due/ | ||
| + | |||
| + | **验证**:家务页面显示 18 条 ✅|列表无「截止」字样 ✅|新增/ | ||
| + | |||
| + | > 📌 待确认:现有两条语义相近但标题不同 —— # | ||
| + | |||
| + | ====== 4.w 果果工资:全勤/ | ||
| + | |||
| + | **用户反馈**:工资计算不对 —— **全勤就是 5000 的工资**。 | ||
| + | |||
| + | **现象**:2026-06、2026-09 两个月**请假 0 天(全勤)**,但「实发」显示 **4807.69**(少了 192.31)❌ | ||
| + | - 根因:`actual`(实际薪水)字段被**旧的手填值**占用 —— 用户曾填过 1 天请假(自动算出 4807.69),后来把请假改成 0 天,但 `actual` 仍是旧值 4807.69 ❌ | ||
| + | |||
| + | **修复** | ||
| + | | 位置 | 改动 | | ||
| + | |---|---| | ||
| + | | 数据 | 2026-06、2026-09 的 `actual` 修正为 = `total`(5000)✅ | | ||
| + | | 前端 | 新增 `_actualPrefill(m)`:若已存 `actual` 与当时 `total` **相同**(说明是自动值)→ 编辑时**不预填**,跟随新的自动计算结果;只有**用户确实手填过**(两者不同)才保留预填 ✅ | | ||
| + | |||
| + | **当前数据(已核对)** | ||
| + | | 月份 | 月工资 | 请假 | 扣费 | 加班费 | 实发 | | ||
| + | |---|---|---|---|---|---| | ||
| + | | 2026-09 | 5000 | 0天 | -0.00 | +0.00 | **5000.00** ✅ 全勤 | | ||
| + | | 2026-07 | 5000 | 1天 | -192.31 | +0.00 | 4807.69 | | ||
| + | | 2026-06 | 5000 | 0天 | -0.00 | +0.00 | **5000.00** ✅ 全勤 | | ||
| + | | 2026-05 | 5000 | 2.5天 | -480.77 | +492.31 | 5011.54 | | ||
| + | | 2026-04 | 5000 | 2天 | -384.62 | +100.00 | 4715.38 | | ||
| + | | 2026-03 | 5000 | **11天** | -2115.38 | +200.00 | 3084.62 | | ||
| + | |||
| + | > ⚠️ 待用户确认:**2026-03 请假 11 天** 是否为误填?(对照用户提供的 Excel 图,3月应为**病假 2 天**、扣 384.62、实发 5000)—— 可能是把" | ||
| + | |||
| + | ====== 4.v 生日模块:普通用户不能保存 + tab 不可见(2026-09-25) ====== | ||
| + | |||
| + | **现象**:点「+ 新增生日」→ 保存不了(普通用户)。 | ||
| + | |||
| + | **根因(两处,都在权限层)** | ||
| + | 1. 后端全局守卫 `@bp.before_request _guard()` 的**普通用户白名单**里没有 `/ | ||
| + | 2. 前端 `USER_TABS` 只有 `[" | ||
| + | |||
| + | **修复** | ||
| + | | 位置 | 改动 | | ||
| + | |---|---| | ||
| + | | `family_api.py` `_guard()` | 白名单加 `if path.startswith("/ | ||
| + | | `family.html` `USER_TABS` | 改为 `[" | ||
| + | |||
| + | **验证** | ||
| + | - 管理员保存 ✅(本来正常) | ||
| + | - 普通用户(果果 13780562913)保存 → **HTTP 200 ok** ✅(修复前 403) | ||
| + | - 浏览器实测(果果身份):可见 tab 含「🎂 生日」✅ → 新增 → 弹窗关闭 + 列表出现新记录 ✅|无 JS 错误 ✅ | ||
| + | |||
| + | **同时补充的数据** | ||
| + | - 杨创伟(堂弟)→ 农历**八月十八** ✅ | ||
| + | - 果果(家庭老师)→ 生日仍缺 ❌(待用户提供) | ||
| + | |||
| + | ====== 4.51 家务定期任务:启用/ | ||
| + | |||
| + | **需求**:家务模块的**定期任务**增加开关按钮 —— | ||
| + | - **启用**:该任务按设置的定期时间**自动列入未完成家务** | ||
| + | - **禁用**:**不**按定期时间自动列入 | ||
| + | - 按钮点一次切换一次(启用 → 显示「禁用」;禁用 → 显示「启用」) | ||
| + | |||
| + | ===== 后端(`family_api.py` + `family.db`) ===== | ||
| + | | 位置 | 改动 | | ||
| + | |---|---| | ||
| + | | `tasks` 表 | 新增字段 **`enabled INTEGER DEFAULT 1`**(1=启用 / 0=禁用)| | ||
| + | | `/ | ||
| + | | `/ | ||
| + | | 重复生成**查重**查询 | 加 `AND COALESCE(enabled, | ||
| + | | `PATCH / | ||
| + | |||
| + | ===== 前端(`family.html`) ===== | ||
| + | - **状态标记**:定期任务的标题行显示 `▶ 启用中`(绿底)或 `⏸ 已禁用`(灰底) | ||
| + | - **切换按钮**:定期任务的按钮行新增 `⏸ 禁用` / `▶ 启用`(**临时任务不显示**) | ||
| + | - 新增 `toggleTaskEnabled(id, | ||
| + | |||
| + | ===== 验证 ===== | ||
| + | | 项 | 结果 | | ||
| + | |---|---| | ||
| + | | SQL 逻辑 | 定期重启查询 & 自动生成查询:**启用入选 / 禁用排除** ✅;对照旧查询(无条件)两者都命中,证明过滤生效 ✅ | | ||
| + | | 前端渲染 | 34 个任务(定期 16 / 临时 18);**16 个定期任务全部有按钮与标记** ✅;**临时任务 0 个误加** ✅ | | ||
| + | | 页面截图 | 定期任务显示「定期 · 每1天 · ▶ 启用中」+「⏸ 禁用」按钮;临时任务无该按钮 ✅ | | ||
| + | | 数据 | 现有 16 个定期任务默认全部 `enabled=1`(启用中);测试任务已清理 ✅ | | ||
| + | | 回归 | 其他模块未受影响 ✅;无 JS 错误 ✅ | | ||
| + | |||
| + | > 说明:禁用仅停止**自动列入/ | ||
| + | |||
| + | ====== 4.52 家务启用/ | ||
| + | |||
| + | **需求**:家务的启用/ | ||
| + | |||
| + | **前端(`family.html`)** | ||
| + | - 管理员判定改为**运行时函数**(原用加载时常量 → USER 是异步设置,导致管理员也判为 false 的坑): | ||
| + | < | ||
| + | function isAdminNow(){ try{ return !!(USER && USER.role===' | ||
| + | </ | ||
| + | - 定期任务的 **`⏸ 禁用` / `▶ 启用` 按钮** 与 **`▶ 启用中 / ⏸ 已禁用` 状态标记** 均加 `&& isAdminNow()` 条件 → 普通用户完全看不到 | ||
| + | |||
| + | **后端(`family_api.py`)** | ||
| + | - `PATCH / | ||
| + | |||
| + | **验证**(★关键:管理员与普通用户分别实测) | ||
| + | | 身份 | 结果 | | ||
| + | |---|---| | ||
| + | | **管理员 武燕青**(role=admin)| 页面出现「⏸ 禁用」按钮 + 「▶ 启用中」标记 ✅(定期任务有,临时任务没有)| | ||
| + | | **普通用户 果果**(role=user)| 「⏸ 禁用」按钮 **0 个**、启用/ | ||
| + | |||
| + | > ★ 踩坑记录:管理员判定**不能**用页面加载时常量。`USER` 由异步请求设置,加载瞬间为空 → `IS_ADMIN` 恒为 false → 管理员也看不到按钮。改为每次渲染时调用 `isAdminNow()` 后正常。 | ||
| + | |||
| + | ====== 4.53 家务:操作已完成任务后不自动折叠(2026-10-10) ====== | ||
| + | |||
| + | **需求**:在操作/ | ||
| + | |||
| + | **实现**(`family.html`) | ||
| + | - 新增全局标志 `window.__keepOpen` | ||
| + | - **置位点(4 个操作入口)**: | ||
| + | | 函数 | 场景 | | ||
| + | |---|---| | ||
| + | | `setTask(id, | ||
| + | | `saveTaskEdit(id)` | 编辑并保存任务 | | ||
| + | | `saveTask()` | 新增/ | ||
| + | | `toggleTaskEnabled(id, | ||
| + | - **消费点**:`renderHouse()` 渲染「📦 已完成」区时 | ||
| + | < | ||
| + | var _doneDisp=(window.__keepOpen?'':' | ||
| + | h+=' | ||
| + | </ | ||
| + | → 刚操作过则**展开**,随后立即重置标志(下次进入恢复默认折叠) | ||
| + | |||
| + | **验证** | ||
| + | | 场景 | 结果 | | ||
| + | |---|---| | ||
| + | | 进入页面(未操作)| 已完成区 `display: | ||
| + | | 置位后触发渲染 | 已完成区 `display:"" | ||
| + | | 渲染后 | `__keepOpen` 自动重置为 false ✅ | | ||
| + | |||
| + | ====== 4.54 家务:棕色按钮「启用」文案改为「安排」(2026-10-10) ====== | ||
| + | |||
| + | **需求**:家务中把**棕色的启用按钮**的" | ||
| + | |||
| + | **定位**:`family.html` 任务卡片按钮行中,已完成任务显示的那个棕色按钮(`background:# | ||
| + | < | ||
| + | <button class=" | ||
| + | </ | ||
| + | (原为 `🔄 启用` —— 点它把已完成任务重新排回「未开始」) | ||
| + | |||
| + | **改动** | ||
| + | | 位置 | 改动 | | ||
| + | |---|---| | ||
| + | | 棕色按钮文案 | `🔄 启用` → **`🔄 安排`** | | ||
| + | | 灰色切换按钮(定期任务启用/ | ||
| + | |||
| + | > ⚠️ **踩坑**:改代码时把 `// 注释` 写在了**拼接表达式的续行 `+` 之前**,导致续行加号被注释掉 → 表达式断裂 → **页面卡在「加载中…」**(接口全 200 但渲染中断)。 | ||
| + | > ★ 教训:JS 字符串拼接中的行尾注释**必须写在 `+` 之后**(或直接不加注释)。 | ||
| + | |||
| + | **验证** | ||
| + | | 项 | 结果 | | ||
| + | |---|---| | ||
| + | | 「🔄 安排」按钮 | **29 个**(= 已完成任务数)✅ | | ||
| + | | 「🔄 启用」残留 | **0 个** ✅ | | ||
| + | | 灰色切换按钮 | `▶ 启用` 3 个 / `⏸ 禁用` 14 个(不受影响)✅ | | ||
| + | | 页面加载 | ✅ 正常(不再卡「加载中」)| | ||
| + | |||
| + | ====== 4.55 家庭管理:登录态永久保持(localStorage + cookie 双写)(2026-10-10) ====== | ||
| + | |||
| + | **需求**:家庭管理 18932573927 的**登录状态永久保持**(不用反复登录)。 | ||
| + | |||
| + | **背景**:原登录态只存 `localStorage.family_user`(本身无过期),但**微信内置浏览器会不定期清理 localStorage** → 用户被迫重新登录。 | ||
| + | |||
| + | **实现**(`family.html`) | ||
| + | 新增统一登录态管理(cookie 有效期 **10 年**,`SameSite=Lax`,`path=/ | ||
| + | |||
| + | | 函数 | 作用 | | ||
| + | |---|---| | ||
| + | | `saveUser(u)` | 写入:`localStorage` + **cookie** 双份 | | ||
| + | | `loadUser()` | 启动恢复:**localStorage 优先 → cookie 兜底**(若从 cookie 恢复,顺带回写 localStorage)| | ||
| + | | `clearUser()` | 退出登录:**双清**(两处都要清,防残留)| | ||
| + | | `_ckSet/ | ||
| + | |||
| + | **接入点** | ||
| + | - 登录写入:3 处(验证码登录 / 密码登录 / 切换账号)→ 统一改 `saveUser(d.user)` | ||
| + | - 启动恢复:`(function(){ USER=loadUser(); | ||
| + | - 退出登录:`logout()` → `clearUser()` | ||
| + | |||
| + | **验证** | ||
| + | | 场景 | 结果 | | ||
| + | |---|---| | ||
| + | | 登录后 | localStorage ✅ + cookie ✅(cookie 含 10 年过期)| | ||
| + | | **清除 localStorage**(模拟微信清理)| cookie 仍在 ✅,`loadUser()` **成功恢复**为「武燕青」✅ | | ||
| + | | 退出登录(含 cookie 清除)| `loadUser()` 返回 null ✅(需重新登录,符合预期)| | ||
| + | |||
| + | > 说明:cookie 与 localStorage 同域,属于**同一浏览器**范围内持久化;只要不手动「退出登录」、不清除浏览器数据,即可长期免登录。 | ||
| + | |||
| + | ====== 4.56 登录态持久化增强:三重存储(覆盖全部账号)(2026-10-10) ====== | ||
| + | |||
| + | **需求**:18932573927(武燕青)与 **16603395188(倾心)** 的登录状态永久保持。 | ||
| + | |||
| + | **说明**:登录态持久化是**通用机制**(与手机号无关),任何账号登录都会写入三处,因此**所有账号同时生效**: | ||
| + | | 账号 | 姓名 | 角色 | | ||
| + | |---|---|---| | ||
| + | | 18932573927 | 武燕青 | admin | | ||
| + | | 16603395188 | 倾心 | user | | ||
| + | | 13780562913 | 果果 | user | | ||
| + | |||
| + | **三重存储(按可靠性递进)** | ||
| + | | 层 | 介质 | 说明 | | ||
| + | |---|---|---| | ||
| + | | ① | `localStorage.family_user` | 常规读写,最快 | | ||
| + | | ② | **cookie** `family_user`(10 年有效,SameSite=Lax)| ★ 微信清理 localStorage 后仍可恢复(**已实测有效**)| | ||
| + | | ③ | **IndexedDB** `family_auth/ | ||
| + | |||
| + | **恢复顺序**:`localStorage → cookie(同步)`,都无则 `IndexedDB(异步兜底)` → 任一成功即自动登录并回写其它层。 | ||
| + | |||
| + | **验证** | ||
| + | | 场景 | 结果 | | ||
| + | |---|---| | ||
| + | | 登录(如 16603395188)| localStorage ✅ + cookie ✅ | | ||
| + | | **清除 localStorage**(模拟微信清理)| cookie 仍在 → `loadUser()` **成功恢复**为「倾心」✅ | | ||
| + | | 同时清除 localStorage + cookie | 交由 IndexedDB 兜底(★ 本测试浏览器沙箱限制 IndexedDB 未生效;真实手机浏览器一般可用;**前两重已足够**)| | ||
| + | | 手动「退出登录」| 三层全清 ✅(需重新登录,符合预期)| | ||
| + | |||
| + | **给用户的使用建议**:微信里把家庭管理页面**加入浮窗/ | ||
| + | |||
| + | ====== 4.57 果果工资对普通用户开放(只读)(2026-10-10) ====== | ||
| + | |||
| + | **需求**:果果工资模块**对普通用户可见**,可查看每月工资详情,但**只读、不能编辑**。 | ||
| + | |||
| + | **前端(`family.html`)** | ||
| + | | 位置 | 改动 | | ||
| + | |---|---| | ||
| + | | `USER_TABS` | 增加 `" | ||
| + | | 新增按钮 | `+ 新增月份工资` 仅 `isAdminNow()` 显示;普通用户改为提示「👀 仅可查看(如需修改请联系管理员)」| | ||
| + | | 操作列 | 「编辑 / 删」仅管理员显示,普通用户显示 `—` | | ||
| + | | `salEdit()` | 增加 `isAdminNow()` 保护(防绕过前端直接调用)| | ||
| + | |||
| + | **后端(`family_api.py`)** | ||
| + | - 权限白名单新增: | ||
| + | < | ||
| + | if path.startswith("/ | ||
| + | if path.startswith("/ | ||
| + | </ | ||
| + | → 普通用户**只能读**;`POST/ | ||
| + | - 403 提示文案更新为「无权限(普通用户仅可使用家务/ | ||
| + | |||
| + | **验证(普通用户用 16603395188 倾心实测)** | ||
| + | | 项 | 结果 | | ||
| + | |---|---| | ||
| + | | 可见 tab | 🏠家务 / ⭐积分 / 🎂生日 / ⚠️预警 / **💰果果工资** / 👤我的 ✅ | | ||
| + | | 数据 | 正常显示 **8 个月**,累计实发 ¥37719.23 ✅ | | ||
| + | | 新增按钮 | ✅ 已隐藏(显示只读提示)| | ||
| + | | 编辑 / 删 链接 | ✅ 已隐藏(操作列 `—`)| | ||
| + | | 后端 GET | **200** ✅(返回 8 个月)| | ||
| + | | 后端 POST | **403 无权限** ✅ | | ||
| + | | 管理员 | 增删改一切正常 ✅(验证用测试记录已清理)| | ||
| + | |||
| + | ====== 4.58 新增「成长记录」模块(身高/ | ||
| + | |||
| + | **需求**:家庭管理增加模块,记录 **姓名 / 时间 / 身高 / 体重 / 脚长**;每个人按**固定时间间隔**记录一次。 | ||
| + | |||
| + | ===== 数据表(family.db) ===== | ||
| + | < | ||
| + | CREATE TABLE growth(id INTEGER PK, name TEXT, date TEXT, | ||
| + | height REAL, weight REAL, foot REAL, | ||
| + | note TEXT DEFAULT '', | ||
| + | CREATE TABLE growth_cfg(name TEXT PRIMARY KEY, days INTEGER DEFAULT 30, created TEXT DEFAULT '' | ||
| + | </ | ||
| + | |||
| + | ===== 接口(family_api.py) ===== | ||
| + | | 接口 | 方法 | 说明 | | ||
| + | |---|---|---| | ||
| + | | `/ | ||
| + | | `/ | ||
| + | | `/ | ||
| + | | `/ | ||
| + | |||
| + | **权限**:普通用户 **GET 放行(只读)**,POST/ | ||
| + | |||
| + | ===== 前端(family.html) ===== | ||
| + | - 新增 tab **「📏 成长」**(`ALL_TABS` 管理员 / `USER_TABS` 家人只读) | ||
| + | - 每人一张卡片:`每 N 天` + 状态(⏳ 还没有记录 / ✅ 下次 YYYY-MM-DD / ⚠️ 已超期 N 天)+ 上次数据(身高/ | ||
| + | - 管理员卡片右侧:`⚙️ 间隔`(prompt 设置天数)、`+ 记录`;右下 FAB 也可新增 | ||
| + | - 「历史数据」区:日期 + 姓名 + 身高/ | ||
| + | - 新增表单(底部弹出 sheet):姓名下拉(来自 members)、日期(默认今天)、身高/ | ||
| + | |||
| + | ===== 验证 ===== | ||
| + | | 项 | 结果 | | ||
| + | |---|---| | ||
| + | | 建表 | ✅ growth / growth_cfg 自动创建 | | ||
| + | | GET(空库)| ✅ people 自动从 members 生成(席子初、席子恩),间隔默认 30 | | ||
| + | | POST 录入 | ✅ 返回 id;同人同日重复提交覆盖 | | ||
| + | | 状态计算 | ✅ 录入 2026-10-16 → 「2 天前」、下次 2026-11-15(30 天档)| | ||
| + | | 改间隔 | ✅ 席子恩设为 90 天 → 下次变 2027-01-14 | | ||
| + | | 权限 | 普通用户 GET **200** / POST **403** / DELETE **403** ✅ | | ||
| + | | 管理员视图 | ✅ 标题/ | ||
| + | | 普通用户视图 | ✅ tab 可见、数据可见、**无 新增/ | ||
| + | | 收尾 | 测试数据已清理(growth 0 条、cfg 空,回到默认 30 天)| | ||
| + | |||
| + | ⚠️ 注意:`family_api.py` 是 Blueprint,新增路由必须用 `@bp.route`。 | ||
| ====== 5. 排障速查 ====== | ====== 5. 排障速查 ====== | ||
家庭管理系统h5/冷启动文件.1789563997.txt.gz · Last modified: by 172.17.0.1 · Currently locked by: 216.73.216.247
