「增加账号管理、权限配置的功能」—— 之前系统完全没有身份认证, 同一局域网任何人打开网址都能看全部数据、还能改阈值。
| 角色 | 查看 | 导出 | 导入 | 同步 | 改阈值/文案 | 账号管理 |
|---|---|---|---|---|---|---|
| 管理员 admin | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 运营 editor | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| 查看 viewer | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
backend/auth.pyhash_password():PBKDF2-HMAC-SHA256,12 万次迭代,每账号独立 16 字节盐verify_password():hmac.compare_digest 防时序攻击check_strength():至少 6 位、不能全是数字ROLES / PERMS / GRANTS / can())secrets.token_urlsafe(32),库里只存 SHA-256 哈希db.py 新增两张表users:用户名、密码哈希、盐、角色、启用状态、是否需改密、最近登录sessions:令牌哈希、用户、过期时间、IP;过期自动清理server.pysid Cookie → 还原当前用户PERM_RULES,未列出的 /api/* 默认只要登录need_login;权限不足 → 403 并说明当前角色/api/login、/api/logout、/api/me(GET/PUT)、/api/users(GET/POST/PUT/DELETE)、/api/auth/state/ 直接给 login.htmlensure_admin() 创建 admin / admin123,标记 must_change=1login.html(首次使用会显示初始账号提示)must_change 弹出不可关闭的改密框/ → 登录页;/api/dashboard → 401must_change 改密框弹出,全部 6 个入口可见import auth 没加进 server.py,登录报 name 'auth' is not defined/api/users 把 GRANTS 里的 set 直接序列化,_json 的 default=str 把集合转成了
"['view']" 这样的字符串,前端拿到的是字符数组 —— 改为 sorted(v)POST /api/sync 返回 200 = 真跑了),
随后重启服务把同步打断,留下一个孤儿 ego 进程,已清理;数据未受影响用户问:左侧栏【导出原始数据】跟【导入数据】里的导出是不是重复了。
有重叠但不完全等价:
2026-11-02 就有两个批次(01:04 和 21:32),左侧栏只能拿到最新那份。
合并入口,左侧栏去掉【导出原始数据】(6 项 → 5 项),导入面板里新增:
能力没有减少,只是入口收敛到「导入/导出是一对」的地方。
btnExportCur,查看角色看不到这个按钮「新建账号时,把所有要填的字段一次性列出,不要填完再跳下一个。角色用选择的,不要输入」
原来用三次 prompt() 依次问:用户名 → 密码 → 角色(还得手打 admin/editor/viewer,很容易打错)。
新增通用表单弹窗 formModal({title, fields, validate, onSubmit}),新建账号一次列出 5 个字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| 登录账号 | 文本 | 必填,限字母数字 _ . -,2~32 位 |
| 显示名称 | 文本 | 选填,不填用账号名 |
| 初始密码 | 密码 | 必填,≥6 位、不能全数字 |
| 确认密码 | 密码 | 必填,两次必须一致 |
| 角色 | 下拉选择 | 查看 / 运营 / 管理员,每项带一句说明 |
其他细节:
closePanels() 里只写了 ['thPanel', 'imPanel', 'txPanel'],漏了 usPanel。
现在补上,同时左侧栏按钮的高亮状态也一并复位。
原来「改密码 / 退出」是标题下方的一行小链接,藏在 hsub 里。
改成右上角一个账号区:
[ 近30天 · 截至 11-03(1416店)▾ ] [ 临 临时验证/管理员 改密码 退出登录 ]
flex-wrap:nowrap + .hleft{flex:1},保证账号区始终在右上角
(窄屏 <1100px 时才折行)classList.contains('on') false)rightTop=0, rightRight=0,与标题同一行「admin 账号的删除按钮要去掉,admin 账号是必须有的」
admin 这一行不再显示【停用】【删除】,改为一个灰底说明「内置账号,不可停用/删除」_user_delete / _user_update 直接拦截,返回
「admin 是内置账号,不能删除」/「不能停用」用另一个管理员账号调用接口:
DELETE /api/users/1 → admin 是内置账号,不能删除PUT {"active":false} → admin 是内置账号,不能停用
账号列表不变,admin 仍启用。分别模拟了两种情况:
data/ 目录data/app.db)admin123 已失效)data/processed/),导出功能可用一次迁移请连同 data/ 一起拷;只要代码的话是干净的空白系统。
data/ 里包含:app.db(账号+指标)、processed/(原始文件)、inbox/、factory_thresholds.json。
「只拷代码,不带 data 目录」—— 服务器上是一个全新的空白系统。
| 文件 | 用途 |
|---|---|
start.sh |
Linux/服务器启动脚本,非交互、支持 PORT 环境变量和 --local |
deploy/store-ops.service |
systemd 服务模板(自动重启、日志进 journal) |
DEPLOY.md |
完整部署说明:环境要求、上传、启动、systemd、端口放行、备份、排错 |
第一次打包时中文文件名在 zip 里是乱码(unzip -l 显示 store-ops/�?��?�工�?�?�.bat),
和最早那个迁移包是同一个坑。服务器上乱码文件名会很难用,所以:
门店检测工作台.service → store-ops.service部署说明.md → DEPLOY.md启动工作台.bat、开放局域网访问.bat、启动工作台.command(服务器用不上)zipfile 校验:中文文件名 0 个自动同步依赖 ego-browser,服务器通常没有。原来会每天 01:00 报一次错。 现在启动时先检测:
数据同步: 未启用(这台机器上没有 ego-browser)
请用【导入数据】上传从生意经导出的 Excel
并且不再启动 daily_sync_loop 线程。实测(模拟 HOME/PATH 里没有 ego)通过。
admin / admin123,强制改密服务器上没有自动同步,三种替代方案:手动导入 / 本机同步后上传 / 服务器装无头浏览器(不推荐)。