/~learn/s/c0c47c86
把首页从「14 张自由高度卡片平铺」改成「左侧分组导航 + 右侧等高工作台」,并加入模块点击埋点与个性化入口,使桌面端对齐、移动端可用、后续加模块只改一处配置。
adata/aohan/quant/portal/registry.py:模块注册表,唯一元数据源(id / 名称 / 图标 / 分组 / 路由 / 关键词 / 子链接 / 栅格跨度)。adata/aohan/quant/portal/module_events.py:module_events 表 + 点击写入 + 最近使用 / 常用排行查询。adata/aohan/quant/portal/home_page.py:新首页渲染器(侧边栏 + 工作台 + 搜索 + 最近/常用 + 分组全部模块)。unified_server.py:
- GET / 改用 render_home(...),继续复用原有动态片段(截面、推送、余额、系统状态、择时链接);
- 新增 POST /api/track/module-click;
- 原有 /api/module-order 保持不变。
--bg/--text/--accent... 变量名,避免动态片段样式失效。
Python 3.12 · 原生 http.server · SQLite(WAL) · 无前端框架(内联 HTML/CSS/JS)
portal/registry.py:Module dataclass、MODULES、GROUPS、DEFAULT_ORDER、get_module()、grouped_modules()、search_modules()。user_config.DEFAULT_MODULE_ORDER 对齐。
portal/module_events.py:module_events(id, ts, day, username, module_id, source) + 索引。record_event() / top_modules(days, username, limit) / recent_modules(username, limit) / cleanup_old()。
portal/home_page.py:render_home(...)。overflow:auto,行与行严格对齐。cs / stock / timing / push / balance / stat / clip。__PLACEHOLDER__ 残留、每张卡有 data-module-id。
unified_server.py 导入 render_home / record_event / top_modules / recent_modules。GET /:组装 stats / blocks,调用 render_home。POST /api/track/module-click:校验 module_id,记录事件,返回 {"ok": true}。_edge_cache = True。
[data-module-id] → sendBeacon 上报。/ 聚焦。
env -u PYTHONHOME -u PYTHONPATH .venv/bin/python -m pytest adata/aohan/quant/portal/test_portal.py -qenv -u PYTHONHOME -u PYTHONPATH bash restart.shcurl -s http://127.0.0.1:8765/ | head 验证 200 且包含新布局curl -s -X POST http://127.0.0.1:8765/api/track/module-click -d '{"module_id":"cs"}'