Commit Graph
35 Commits
Author SHA1 Message Date
chun_qiu 82017f6b5d ci(v1.11.5-L): lite 分支纳入构建流水线
build / build-and-test (push) Successful in 3m15s
- .gitea/workflows/build.yml 的 on.push.branches 增加 lite
- 推送到 lite 会触发 vet → test → 交叉编译 windows/linux → 上传产物
- 其余触发条件不变(main/master、v* 标签、PR、手动执行)
2026-10-21 03:42:48 +08:00
chun_qiu cde1c84c9a feat(v1.11.5-L): lite 精简版——移除大屏/客户自查/多用户/小键盘,套餐仅保留按日
需求与确认(用户逐项确认):
- 老数据「按次 / 通行证 / 深渊」统一迁移成按日,代码里彻底删除三种模式
- 打手归属一并移除(只剩一个人,颜色与指派没有区分意义)
- 盲水印做成完全不可见:只存在于 DOM / 源码,肉眼与截图都看不到
- 拼写采用更正后的 Powered by Baka春秋
- 版本号与品牌全站统一带 -L
- screen_public / portal_public 保留解析但不起作用,保证旧 ini 能直接启动
- README 同步更新

品牌与版本(全站统一):
- const version = "1.11.5-L":<title>、启动横幅、日志前缀 [代打台-L]、
  设置页版本号、页脚版本号全部带 -L
- 左上角导航品牌 代打台 → 代打台-L(登录页、初始化页同步)
- 页脚新增可见署名 Powered by Baka春秋

盲水印:
- _layout.html 在 <body> 起始处注入 .wm-blind 容器(含注释与 data-wm 双标记),
  覆盖包括登录/初始化在内的所有页面
- app.css 用零尺寸 + 透明 + opacity:0 + clip-path:inset(50%) 四重隐藏,
  同时留同名注释;不占位、不上色、不进无障碍树、不影响打印

功能移除:
- 大屏:删除 handlers_screen.go、pages/screen.html、_screen_layout.html、
  static/screen.css、static/screen.js、store.Stats/ScreenStats;
  导航「大屏 ↗」、页脚「大屏」、设置页「大屏刷新/大屏」行、启动横幅大屏行一并删除
- 客户自查:删除 handlers_portal.go、pages/portal.html 与 .portal-*/.pcal-* 样式,
  设置页「客户自助」行删除
- 多管理员:删除 handleUserCreate/Toggle/Color/UserEditPage/UserEditSave、
  pages/user_form.html、store 侧 ActiveUsers/SetUserColor/SetUserActive/
  UpdateUserByAdmin/NormalizeColor/AssigneePalette;设置页「管理员」整块移除,
  只保留首次启动创建的那一个账户与「修改我的密码」
- 打手归属:删除 customers.assignee_id 相关读写与 UI(客户详情指派下拉、
  客户表单「归属打手」、日历格左侧打手色竖条、任务卡打手标签、套餐详情客户列)
- 登录页与初始化页的说明文案同步改为单账户口径(「只有一个管理员账户」
  「创建后不能再添加其他管理员」),字数与 main 对齐,卡片不换行、高度不变
- 触摸小键盘:删除 3×4 键盘、⌨/触控开关、localStorage 记忆、.keypad* 样式
- 套餐计费方式:只保留按日。删除按次/通行证/深渊的 Package 与 Subscription 字段、
  domain 里的 UnitCount/StateUsedUp/CycleIndex、package_form 计费方式单选与
  通行证/深渊/有效期字段、日历整段色块(has-block/cell-block/season-band)、
  追加次数分支、SeasonComplete/AddCount、CountActiveSubs 的次数条件

数据库迁移(幂等,Migrate 内自动执行):
- normalizeLegacyData:套餐一律 unit='day' 并清 season/abyss/cycle_days/
  default_validity_days/season_*;订阅清 season/abyss/cycle_days/season_done
- 通行证、深渊当年就是 unit='day' 且起止日完整,仅清标记,服务区间原样保留
- 按次按「1 次 = 1 天」折算:结束日 = 开始日 + 总次数 − 1;仍缺结束日退回开始日
- 只动数据,不删表不删列:老库的 season/abyss/cycle_days/total_count/used_count
  保留但不再使用,升级可逆、不会因为 DDL 失败卡住
- 新库 schema 干净:不再创建上述列,users.color / customers.assignee_id 也不创建
- 老库 ensureColumn 保留 calendar_separate / tag / archived 三项(真增量列)

兼容:
- config 仍解析 screen_public / portal_public(结构体字段注明已废弃),
  默认 ini 模板里改为「已废弃,写了不报错、不生效」

测试:
- go vet ./... 通过;go test ./... 全部通过
  (新增 TestNormalizeLegacyTypeData 验证三模式折算成按日;
   TestSingleUserAccount / TestSessionLifecycle 覆盖单用户与会话;
   删除按次、深渊、打手颜色、多用户等已不存在的能力的用例)
- 新增 scripts/smoke-lite.ps1:起隔离实例,19 个页面级请求全部 200,
  已移除的 /screen、/customer、/api/screen/day 均 404,
  水印/品牌/v1.11.5-L/无残留词 12 项断言通过,
  真实数据下日历出现待打任务、「剩 30 天」、今天到期徽标 4 项断言通过,
  本次 0 失败

README:改为 lite 版说明,删除大屏/客户自查/通行证/深渊/按次/小键盘/多用户章节,
新增「盲水印」与「与 main 分支的差异」两节(含老数据折算规则与列保留说明)。
2026-10-21 03:33:27 +08:00
chun_qiu 0392f44cf1 fix(v1.11.5): 深渊日历按单周期显示 1/1 或 0/1,工作台与大屏同步
build / build-and-test (push) Successful in 3m26s
- 整段色块计数改为按当前格所在周期:cycleDone → 1/1,否则 0/1;
  不再把全局 used/total 重复到每一格。
- 抽出 blockCellText / blockCellPercent,工作台、大屏、客户自助页共用同一口径;
  通行证保持 0/1 / 1/1,深渊按所在周期 1/1 / 0/1。
- 大屏恢复通行证 / 深渊页签;screenCalSubs 补上缺失的 start(之前为零值,
  导致大屏周期判定和色阶都算错),大屏格子现在显示与工作台一致的 1/1、0/1
  以及 34%→4% 的周期色阶。
- 大屏色块样式:has-block / scr-block,亮暗两套都可读。
- 版本 1.11.5;README 的深渊说明同步,「工作台、大屏、客户自助页同一口径」。

验证:测试数据第一周期完成、第二周期未完成,工作台、 大屏、客户自助页均显示
20–26 为 1/1、27–31 为 0/1;周期浓度 34%/24%/14%/4%;gofmt / go vet /
go test 全绿。
2026-10-20 04:06:39 +08:00
chun_qiu 2e2d7d4bdd fix(v1.11.4): 深渊周期色块深浅跨度拉大
build / build-and-test (push) Successful in 3m19s
- abyssBlockPercent 从 22%→10% 改为 34%→4%;4 个周期为 34/24/14/4,
  相邻周期约差 10 个百分点,周期边界一眼可辨。
- 第一个周期明显更深,最后一个周期接近底色;主日历与客户自助页共用该函数,
  两处同步生效。
- 版本 1.11.4;README 的深渊说明同步为 34%→4%。
2026-10-20 03:51:15 +08:00
chun_qiu ddc7988f34 fix(v1.11.3): 客户自助查询 /customer 全量修复
build / build-and-test (push) Successful in 3m18s
- 路由:从 screen_public 拆出 portal_public(默认 true),关掉大屏不再连带 404;
  设置页显示客户自助状态;/customer 与 /screen 各自独立。
- 查询:尾号只接受 4–8 位数字,服务端精确匹配,去掉 LIKE 模糊回退;按 IP
  40 次/分钟限流;页面 noindex。
- 语义:修正「今日待完成」把已完成数当待完成数的问题;0/0 改为「今日无排单」;
  无订阅走空态;删掉进度条和重复的今日文案,只留一个状态。
- 订阅:复用管理端 SubView / calSub;通行证 1/1、深渊 x/y 周期;过期、暂停、
  按次用尽、跳过都有独立口径;「最近到期」只取未来日期。
- 日历:与主日历一致,只在本月格显示任务;通行证/深渊整段色块(深渊按周期
  减淡),日常任务用空心/实心点;每格带读屏描述;today 加「今天」文字标记。
- 错误:只渲染一次并放回内容容器,字段加 aria-invalid;删掉顶部重复横幅。
- 多客户:显示掩码姓名 + 卡内补姓名表单;姓名回填;翻月用 url.Values 编码;
  1 位尾号不触发查询;只有空态/补姓名时 autofocus。
- UI:品牌头、可折叠「查询其他尾号」、订阅全宽列表、状态统一用现有 chip、
  月份按钮 44px、去掉卡中卡 / opacity / 满屏 0/1。
- 版本 1.11.3;README 增加 4.4 与 portal_public 配置说明。

验证:gofmt / go vet / go test 全绿;portal_public=true 时 /customer 200、
false 时 404;screen_public=false + portal_public=true 时 /customer 200、
/screen 302;尾号 2 与 % 被拒;2222 多客户掩码;9900 日常点、3321 通行证
1/1、6677 深渊 1/4 + 已到期订阅;明暗 1440 与 390 截图无对比度/溢出问题。
2026-10-20 03:39:41 +08:00
subtrack 7371b86a97 fix(v1.11.2): 自助查询页对齐新主题变量并修正版本号
问题:
- 仓库后续提交已到 v1.11.1 并重建了 Bootstrap 主题层(--app-* 变量、淡蓝配色),自助查询页仍引用旧的 --ink-* 变量
- 结果:页面标题透明看不见、按钮回落成默认蓝、月历边框与底色失效
- 上一个提交把版本写成 1.10.0,实际版本号未变(仍是 1.11.1),版本号与功能对不上

修复:
- portal 相关样式全部迁移到 --app-* 变量(背景/边框/文字/强调色/柔和色)
- 标题改为实色文字,不再用渐变裁切,避免主题切换时不可见
- tagchip 补一套基于 --app-accent-soft 的样式
- 版本号 1.11.1 → 1.11.2(main.go 与 README 同步)

验证:
- 本地起服务实测 /customer 三种查询均 200
- 无头浏览器实拍 shots/portal-v1112b.png:标题、查询按钮、进度条、月历、今日高亮均正常
2026-10-20 03:17:40 +08:00
subtrack c84175b723 feat(v1.10.0): 新增客户自助查询页 /customer
需求与确认:
- 完全公开、不加入口链接(用户确认)
- 输入手机尾号查询;同一尾号命中多个客户时必须补姓名,模糊匹配(用户确认)
- 只展示排单与完成情况:月历每日 已完成/总数、订阅套餐名与类型、到期时间、今日是否清完;不显示备注、打手、价格(用户确认)

实现:
- 新增 internal/web/handlers_portal.go:handleCustomerPortal + buildPortal
  - 尾号查客户(CustomersByTail,已过滤归档客户)
  - 多命中时返回候选家数并要求补姓名,姓名模糊匹配(不区分大小写)
  - 月度网格:按订阅覆盖日期统计每日应打/已完成,打卡数据复用 CheckinsBetween
  - 今日汇总、最近到期日、活跃订阅数
- 新增模板 pages/portal.html(Bootstrap 卡片 + 自定义 .pcal 月历)
- 路由 GET /customer(公开,无需登录)
- app.css 增加门户与 pcal 样式
- 数据库零改动,未新增表或列

测试:
- HTTP 验证 6 条路径全部 200:落地页、仅尾号(提示补姓名)、尾号+姓名模糊、姓名不匹配、尾号不存在、翻月
- 无头浏览器实拍 shots/portal-v110.png(公开页)
- 已知待办:门户标题与主按钮的品牌色内联覆盖未生效,需下一版修正(Bootstrap 后加载覆盖了主题色)
2026-10-20 03:11:36 +08:00
chun_qiu 8d9cf658a3 fix(v1.11.1): 深渊周期色块逐周期减淡,方便一眼区分周期
build / build-and-test (push) Successful in 3m17s
- 深渊模式的整段色块增加按周期递减的底色浓度:第一个周期 22%,之后线性
  减淡,最后一个周期 10%(X 个周期时按 X 等分);同一周期内所有格子保持
  同一浓度,跨周期边界会出现一档明显的深浅变化。
- 通行证仍保持固定 18% 的自定义色淡化,不受影响。
- DayCell 新增 BlockPercent,日历格子通过 --block-pct 传给 color-mix;
  旧缓存页面没有该变量时回落到 18%。
- 版本号 1.11.0 → 1.11.1。

验证:4 周期深渊在日历上的浓度为 22/18/14/10%;截图实测第 1 周期底色
rgb(212,223,235)、第 2 周期 rgb(220,229,239),同周期内一致;gofmt / go vet /
go test 全绿。
2026-10-20 02:42:52 +08:00
chun_qiu bc5076ee41 feat(v1.11.0): 通行证/深渊模式、淡蓝配色与触控小键盘修复
- 触控小键盘补回 3×4 网格样式:上一版重写 CSS 时漏掉了 .keypad/.key,
  按钮退化成行内小方块;现在恢复 46px 圆角键、⌫/✓ 功能键和「触控」开关态。
- 通行证(原「包赛季」):整段有效期在独立日历上按套餐色连续着色(18% 透明度),
  每一格显示同一个「已完成 / 总单数」(0/1 或 1/1);完成后色块保留并显示 1/1。
  沿用 season_done 记录完成日期,交互动线不变。
- 新增深渊模式:套餐设置周期天数 N 与周期数 X;开通时从开始日排出 X 个 N 天周期,
  结束日 = 开始日 + N×X − 1。周期内任意一天完成即算该周期完成;同一周期重复完成
  不重复计数;撤销该周期最后一条完成打卡会回退计数。独立日历连续着色,每格显示
  同一个「已完成周期 / 总周期数」。
- 全量把「包赛季」改名为「通行证」;套餐表单新增通行证 / 深渊选项,深渊显示 N/X 字段;
  客户开通表单、套餐批量开通、订阅列表、客户订阅卡片、日历待办行同步适配,
  通行证 / 深渊不再显示「追加时长」(提交也会被服务端拒绝)。
- 快速完成 / 批量完成对通行证改为整段完成,对深渊走周期打卡,不再错误地按日写打卡。
- 配色改为淡蓝 / 暗蓝:亮色用暗蓝主色 + 淡蓝纸底,暗色用海军蓝底 + 淡蓝强调;
  默认套餐色改为 #3B6EA5;大屏同步蓝调并修正热力图例与今日数字的对比度。
- 大屏页签排除通行证 / 深渊(它们不计每日热力,避免点开是空日历);「今日待打」
  仍会列出待处理的通行证 / 深渊。
- 数据迁移:packages.abyss / packages.cycle_days / subscriptions.abyss /
  subscriptions.cycle_days,老库启动自动补列。
- 修复手机端整段色块把 7 列日历撑出屏幕:日历改成 minmax(0,1fr),小屏色块缩小。
- 版本号 1.10.0 → 1.11.0。

验证:gofmt / go vet / go test 全绿;亮暗两套、1440 与 390 两档截图走查;
通行证 0/1 → 1/1、深渊 1/4 → 2/4、同周期重复完成不重复计数、撤销回退均实测通过。
2026-10-20 02:33:57 +08:00
chun_qiu 8b9c347649 feat(v1.10.0): 重建 Bootstrap 主题层,修复迁移遗留的明暗/缓存/布局问题
build / build-and-test (push) Successful in 3m38s
背景:v1.9.0 把界面迁到 Bootstrap 5 时保留了旧自研 CSS,v1.9.2 又叠加了一层
「墨绿渐变」覆盖层,形成三套令牌(--paper/--ink、prefers-color-scheme、
data-bs-theme)并存。系统偏好与 Cookie 不一致时,页面会出现半亮半暗、表单
标签/抽屉标题/订阅页签不可见、输入框变黑块等问题。

本次改动:
- 样式加载顺序改为 bootstrap → app.css;删除旧纸墨令牌与 v1.9.2 覆盖层,
  app.css 重写为单一主题层(:root/[data-bs-theme=light] 与 [data-bs-theme=dark]
  两套语义令牌)。组件只读 --app-*,解决 --ink-2 同时被当作「次级文字色」和
  「卡片底色」的语义冲突。
- 主题只认 <html data-bs-theme>:服务端按 Cookie 直出;没有 Cookie 时由 <head>
  内联脚本在首屏按系统偏好补齐,修好「跟随系统」并避免闪白。大屏同理。
- 修复 Bootstrap 覆盖自研设计的问题:正文 14px + 中文字体栈、22/16/14px 标题、
  按钮/输入框/焦点环/卡片回到设计值;普通按钮新增 .btn-soft,不再变透明文字。
- 布局修复:客户/套餐表单的 .grid-2 不再塞 3 个字段;包详情页把筛选独立成
  GET 表单(在搜索框回车不再误触批量开通);客户详情操作区与 meta 重排;
  抽屉时钟改为固定 46px 并用它对齐抽屉头的 sticky 偏移;追加面板在抽屉里
  两列月历、不再 1100px 竖排;手机端日历数字不再换行溢出,移动端表格隐藏
  低优先级列,不再被裁切。
- 大屏:KPI/面板去掉 Bootstrap utility,统一由 screen.css 控制;TOP/今日待打
  改为固定列宽 + grid-column 对齐;浅色主题的链接、热力、图例对比度补齐;
  热力格不再整体降透明度;当日浮层可滚动并支持点击/键盘打开。
- 配色与可读性:普通文本对比度全部达标(截图 lint 由 65 处降到 0);日历
  外月日期改为浅底深字,不再整格 opacity;archived 行改为中性底色而非降透明。
- 缓存:新增内嵌静态资源内容指纹 AssetVersion(12 位 sha256),所有 /static
  链接带 ?v=;带指纹的响应 public, max-age=31536000, immutable,不带指纹的
  回源 no-cache;HTML 继续 no-store。改样式重新编译即自动破缓存,不再依赖
  手改版本号(仍保留 v1.10.0 作为产品版本)。
- 认证页重做:登录/初始化页改用 .auth 卡片(品牌、主题切换、绿色焦点环),
  去掉 min-height:100vh 叠加 main padding 造成的 40px 纵向滚动。
- JS:修 toISOString 计算自然日差一天的时区 bug;主题切换读 data-bs-theme
  并同步 aria-pressed;全选支持半选;大屏切主题同时更新 data-bs-theme;
  提示条改为固定定位、淡出不再顶动页面。
- README 更新主题与缓存说明;版本号 1.9.5 → 1.10.0。

验证:gofmt / go vet / go test 全绿;1440、1100、390 三档,明暗两套,工作台/
客户/套餐/订阅/设置/日志/大屏/登录全部截图走查,无横向溢出与控制台错误。
2026-10-20 01:46:11 +08:00
subtrack d76c5e3a54 fix(v1.9.5): 大屏浅色主题配色修复(标签/KPI/热力/TOP/待打)
build / build-and-test (push) Successful in 3m53s
- 大屏原为纯深色设计,浅色主题下沿用深色文字变量导致浅字贴白底
- 为浅色主题补齐 .scr 的 --bg/--surface/--line/--muted/--ink 变量,并显式覆盖:标签页、热力格日期与计数、KPI 标签与单位、TOP 榜与今日待打、页脚与说明
- 选中标签保持墨绿渐变白字,其它标签白底深字带描边
- 仍为 v1.9.5,仅前端样式
2026-10-20 01:08:14 +08:00
subtrack 3eb7d32fa9 fix(v1.9.5): 大屏热力日历格子错位与数字反色
- 根因:重构时 --ink-2 由「文字色」变成「背景色」,热力格数字取到深色背景色;同时 aspect-ratio + 内容宽度导致列宽不均、右侧被裁
- 热力网格强制 repeat(7, minmax(0,1fr)),单元格 width:100%、min-width:0、min-height:34px,去掉 aspect-ratio
- 格子内日期/计数/说明统一高对比文字,计数用亮绿加粗
- 非本月日期透明度从 .28 提到 .45,历史日期 .66→.75,避免整格发黑
- 仍为 v1.9.5,仅前端样式
2026-10-20 01:03:40 +08:00
subtrack a89018c19b fix(v1.9.5): 表格操作列不再撑高行、去掉行间空隙
- .actions 改 inline-flex、去换行、垂直居中,按钮统一内边距与行高
- 表格单元格统一上下内边距,操作列 nowrap,避免按钮撑出多余高度
- 仍为 v1.9.5,仅前端样式
2026-10-20 01:01:15 +08:00
subtrack 36e702977f fix(v1.9.5): 修复 asg/ticket/summary 文字在暗色变深、亮色变浅
- 根因:v1.9.2 重构时新增的 --ink-2 等色板变量与旧样式里的同名文字变量冲突,导致打手条、票签、订阅摘要继承到背景色当作文字色
- 为 .asg / .ticket / .summary 及其子元素显式指定文字色:亮色用 --ink-ink,暗色用 #dff5ea
- 到期状态单独取值:正常绿、临期橙、逾期红,暗色下同步提亮
- 版本 1.9.4 → 1.9.5;仅前端样式
2026-10-20 00:58:57 +08:00
subtrack 47b93b85c1 fix(v1.9.4): 大屏弱化文字提亮,可读性对比度达标
build / build-and-test (push) Successful in 3m58s
- 大屏弱化文字(控制台/日期/链接/说明/表头/TOP 副标题/热力日期)统一提亮到 4.5:1 以上
- KPI 数值改用高亮近白色,热力低档文字提亮
- 非本月日期单独提亮一档,保留层级但仍可读
- 无头浏览器检查:对比度告警从 113 处降到 14 处,剩余仅非本月日期的 4.27:1(刻意弱化,已提亮)
- 版本 1.9.3 → 1.9.4;仅前端样式
2026-10-20 00:12:40 +08:00
subtrack e0fcec2293 fix(v1.9.3): 修复任务卡按钮错位、日历头部对齐、标签深底深字
- 任务卡改为「正文 + 右侧操作」两列布局,按钮横排不换行;标题/副标题/备注分别用主文字色与弱化色
- 套餐/订阅行内操作按钮(详情、编辑、归档、完成、⋯)统一 flex 横排,不再竖排堆叠
- tagchip/chip 改浅底深字并区分明暗主题,修复深色背景配深色字体
- 日历头部(月份、‹ ›、回到今天、右侧统计)统一 align-items:center
- 徽标 text-bg-success 与表格表头、任务副标题对比度不足的问题按明暗主题分别补色
- 版本 1.9.3;仅前端样式

验证:无头浏览器两态截图(shots/ink193b/sheet.png),亮色主题已能正确切换
2026-10-19 23:42:40 +08:00
subtrack 2ca22043a7 feat(v1.9.2): 墨绿渐变 UI 重构(全站覆盖层),修复明暗主题切换
- 重做设计变量:墨绿主色 #16543F→#2FA37A 三段渐变,亮/暗两套 token 同时挂 data-theme 与 data-bs-theme
- 顶栏、导航选中态、按钮、卡片、表格、表单、日历格与热力、抽屉、小键盘、标签页、下拉、提示、滚动条全部改为墨绿渐变体系
- 修复暗色切换后部分控件仍用亮色变量:所有组件色值改为引用 --ink-* 变量,切换即时生效
- 大屏同步墨绿渐变背景与标签页
- 版本号 1.9.1 → 1.9.2;仅前端样式,数据库与业务逻辑零改动

注:本次截图脚本在无头 Chrome 启动阶段挂起,未取得实际运行截图,视觉验收待补。
2026-10-19 23:13:08 +08:00
subtrack fb6a84cb7e feat(v1.9.1): 自绘组件对齐 Bootstrap(键盘/日历格/热力),版本号 1.9.1
build / build-and-test (push) Successful in 5m18s
2026-10-19 22:34:16 +08:00
subtrack 621adfa4a8 feat(v1.9.0): Bootstrap 5 迁移第 3/4、4/4 轮(抽屉、表单、大屏内部)
版本号保持 1.9.0,仍为纯前端改动:
- 日历抽屉:快速输入改 form-control,任务/到期列表改 Bootstrap list-group,加急标签改 badge
- 客户详情:套餐下拉、开始日、天数/次数、终止日统一 form-select / form-control
- 大屏内部:KPI 改 card,TOP 榜与今日列表改 list-group,加急改 badge;热力网格保留自绘
- app.css 增加 Bootstrap 收敛规则(list-group 透明背景、任务分隔线)

验证:无头 Chrome 实拍日历、客户详情、大屏三页(shots/bs3-*.png),页面正常渲染
数据库与业务逻辑零改动
2026-10-19 22:17:01 +08:00
subtrack a83bfbb2b3 feat(v1.9.0): Bootstrap 5 迁移第 2/4 轮(登录/初始化页 + 基础组件)
本轮全部为前端改动,版本号保持 1.9.0:
- CSS 加载顺序调整为 app.css → bootstrap,让 Bootstrap 覆盖表格/按钮/表单/卡片等基础组件,日历/热屏等自定义组件类不受影响
- 主题切换同时写 data-theme 与 data-bs-theme,Bootstrap 组件跟随亮/暗
- 登录页、初始化页重写为 Bootstrap card + form-control + btn-primary,垂直居中
- 客户列表搜索框加 form-control

验证:
- 无头 Chrome 实拍登录、客户列表、套餐、设置四页(shots/bs2-*.png)
- 数据库与业务逻辑零改动

后续:第 3 轮日历抽屉/追加面板/客户月历,第 4 轮大屏内部与收尾
2026-10-19 22:15:39 +08:00
subtrack d955d0d7d2 feat(v1.9.0): 引入 Bootstrap 5(第 1/4 轮:框架与大屏头部)
本次开始把界面全量迁移到 Bootstrap 5 默认风格,分 4 轮:
- 第 1 轮(本次):Bootstrap 资源本地化 + 后台框架(导航/搜索/徽标/用户菜单/提示) + 大屏头部与面板容器
- 第 2 轮:登录/初始化页 + 客户/订阅/套餐/日志/设置页的表单与列表
- 第 3 轮:日历抽屉、快速完成、追加面板、客户月历、弹窗/下拉
- 第 4 轮:大屏内部(KPI/热力/TOP/今日列表/浮层)与收尾打磨

本轮改动(纯前端,无业务逻辑与数据库变更):
- 新增 internal/web/static/vendor/bootstrap.min.css、bootstrap.bundle.min.js(本地内嵌,离线可用)
- _layout.html 重写为 Bootstrap navbar + container-fluid:导航、搜索框、到期徽标、主题开关、用户下拉菜单、alert 提示
- 大屏布局引入 Bootstrap,html 使用 data-bs-theme 跟随亮/暗主题;头部改为 navbar,面板改为 card
- 版本号 1.8.2 → 1.9.0

验证:
- 无头 Chrome 实拍日历、大屏、登录三页(shots/bs1-*.png),Bootstrap 深色主题生效,导航与徽标样式正常
- 业务逻辑与数据库结构未改动
2026-10-19 22:14:19 +08:00
subtrack bb923aab4d fix(v1.8.2): 套餐计费方式切换时的显示/隐藏与默认值修复
build / build-and-test (push) Successful in 3m41s
按「any → 包时 / 按次 / 包赛季」规则检查后修复 3 处问题:

1) 包赛季套餐编辑时「按日」也被勾中
   - 赛季套餐在库里 unit='day' + season=1,模板只判断了 unit,导致按日/赛季两个 radio 都带 checked
   - 修正为「unit=day 且非赛季」才勾中按日

2) 客户开通表单:选中包赛季时仍显示且必填「开始日」
   - 赛季起止由套餐决定,开始日应隐藏
   - 表单加 data-start-wrap,JS 在赛季模式隐藏并取消 required,切回其它模式恢复

3) 按次开通时没有带出套餐默认有效期
   - 套餐选项新增 data-validity,选中按次且终止日为空时,自动按「开始日 + 默认有效期 - 1」带出到期日,仍可手改

现状(已逐项验证):
- 包时:默认量单位「天」,无有效期/赛季字段
- 按次:默认量单位「次」,显示「按次默认有效期(天)」,开单自动带出到期日
- 包赛季:显示赛季开始日/结束日(必填),隐藏默认量有效期与开始日;过期套餐下拉置灰

测试:
- 转换专项 10 项全过:三种模式的勾选状态、字段显示、按日→按次→赛季→按日 往返保存均正常
- 数据库未改动结构,往返保存后 unit/season/season_start/season_end 值正确
- 版本号 1.8.2
2026-10-19 19:57:12 +08:00
subtrack bcce6bb830 fix(v1.8.1): 按次显示已完成/总次数、隐藏已开通套餐、已结束订阅置灰置底
1) 按次计费显示口径
- 订阅卡片、列表、大屏 TOP 都从「剩 x / y 次」改为「已完成 x / y 次」
- 进度条改为按已用次数计算

2) 开通订阅下拉过滤
- 客户详情「开通订阅」下拉自动隐藏该客户已开通的套餐,延期只能走「追加」入口,避免新开叠加
- 若客户已开通全部套餐,下拉只剩占位项

3) 已结束订阅置灰置底
- 客户详情的订阅卡片按「进行中 → 已结束」排序,已结束排到最后
- 已结束卡片降低透明度、降低饱和度,鼠标悬停恢复部分可见

数据库:无变更
测试:
- 功能验证 5 项:按次文案、已开通套餐不在下拉、未开通仍可选、已结束卡片置灰、已结束排在最后
- 119 项验收回归全绿(8 条按次断言随之更新为新口径)
- 无头 Chrome 实拍客户详情页;版本号 1.8.1
2026-10-19 19:53:50 +08:00
subtrack a3fd817edc feat(v1.8): 包赛季模式、按次默认有效期、订阅删除
1) 包赛季(第三种计费方式)
- 套餐表单新增「包赛季」,套餐上直接填赛季开始日/结束日(必填,结束日不能早于开始日)
- 客户开通时自动带出赛季起止,不用再手填日期
- 日历上用横向色带标出整段赛季;赛季内任意一天点「完成」即整段完成
- 完成后不再进日历/待打,客户详情显示「赛季已完成 + 完成日期」
- 已过赛季结束日的套餐在客户开通下拉里置灰标「赛季已结束」,服务端同样拒绝开通

2) 按次默认有效期
- 套餐新增「按次默认有效期(天)」,开单时自动算出到期日(开始日 + 天数 − 1),仍可改

3) 订阅删除
- 已结束的订阅卡片在「重新启用」旁新增「删除」,二次确认后彻底删除该订阅及其打卡/追加/加急记录

4) 客户月历、日历与大屏同步识别赛季(色带、完成状态)

数据库兼容性:
- 仅新增列:packages.season / default_validity_days / season_start / season_end,subscriptions.season / season_done
- 没有改动原有 unit 的 CHECK 约束、没有重建表;老库启动自动 ALTER,可重复迁移

测试:
- 功能验证 13 项:赛季套餐创建、过期套餐不可选、开通带出日期、日历色带、完成整段后隐藏、按次自动到期、删除订阅
- 119 项验收回归全绿;go test ./... 通过;无头 Chrome 实拍 3 张(日历色带 / 客户赛季卡片 / 套餐表单)
- 版本号 1.7.0 → 1.8.0
2026-10-19 19:26:47 +08:00
subtrack a2542e1135 feat(v1.7): 计数改已完成/总数、客户月历、套餐标签合并、批量开通、触控模式、按次到期
build / build-and-test (push) Successful in 3m36s
1) 日历计数口径
- 工作台与大屏的格子统一改为「已完成 / 总数」(如 2/5 = 共 5 单、做完 2 单)

2) 客户详情·当月排单
- 新增客户专属月历:每天显示 已完成/总数,可翻月,点某天跳转到日历对应日期
- 没有排单的日期淡化显示

3) 套餐标签与页签合并
- packages 新增 tag 列(可空),套餐编辑页可填
- 日历/大屏页签按标签合并:同标签套餐合成一个页签;勾了「独立显示」的套餐额外再开一个自己的页签
- 大屏同样支持标签筛选,链接参数为 tag=xxx

4) 批量开通
- 新增套餐详情页 /packages/{id}:显示套餐信息 + 客户列表
- 表头「全选」置顶,已订阅该套餐的客户置灰不可选;开始日期默认今天、天数/次数默认取套餐设置,均可改
- POST /packages/{id}/subscribe 批量开通,重复的自动跳过并汇总提示
- 修复 r.PostForm 未 ParseForm 导致拿不到勾选项的问题(批量打卡同源问题一并修正)

5) 触控 / PC 模式
- 尾号输入框右侧新增切换按钮,触控模式展开 3×4 键盘、输入框只读 + inputmode=none(不唤起系统输入法),按键直接写值
- 偏好记在 localStorage,默认 PC 模式(键盘收起)

6) 按次到期
- 按次订阅的到期日保持选填;填了到期后状态显示「已到期」且不再进日历待排(复用既有 end_date,无新列)

数据库兼容性:
- 只新增 packages.tag 一列,老库启动时自动 ALTER,可重复迁移;原有表结构与接口不变

测试:
- 无头 Chrome 实拍 5 张页面(日历/触控模式/客户月历/套餐批量/大屏)
- 功能验证 18 项全过(计数口径、标签页签、标签筛选、批量开通与重复跳过、月历翻月、触控开关、按次过期不上日历)
- 119 项验收回归全绿;go vet / go test ./... 通过;版本号 1.7.0
2026-10-19 16:23:01 +08:00
subtrack fb771bc013 fix(v1.6.1): 小键盘点击不再抢走手机尾号输入框焦点
build / build-and-test (push) Successful in 3m17s
根因有两处:
1) 小键盘在 HTML 里是 <form> 的兄弟节点(不在表单内部),JS 用 pad.closest('form') 拿不到表单,
   于是整个按键逻辑直接 return —— 按键既不写入输入框,也没有任何反馈;
2) 原生按钮在 mousedown 时会获得焦点,把输入框的焦点顶掉。

修复:
- 改为先定位输入框,再用 input.form 反查表单,不再依赖 DOM 嵌套关系
- mousedown 阻止默认行为,按钮不再抢焦点;pointerdown / click 后统一把焦点与光标送回输入框末尾
- 未聚焦时点键盘会自动聚焦输入框;退格、确认逻辑不变

验证(真实 Chrome + CDP 真鼠标点击,不是单元模拟):
- F-01/02 点 1 后焦点仍在、值为 1
- F-03/04 连点 1/2/3 得到 123,焦点保持
- F-05/06 退格得到 12,焦点保持
- F-07/08 输入框失焦后点键盘,自动聚焦并写入
- 截图 shots/v161-keypad-focus.png
- 119 项验收回归全绿;版本号 1.6.1
2026-10-19 02:52:22 +08:00
subtrack 79a308b1b5 feat(v1.6): 键盘 3×4、格子计数排版、时钟修复、已完成折叠、静态资源破缓存
build / build-and-test (push) Successful in 3m28s
1) 触摸小键盘
- 改为 3 列 × 4 行,底行 ⌫ / 0 / ✓(数字 1-9 按 123/456/789 排列)
- 自定义按键样式:52px 高、圆角、按下位移反馈,确认键为主题绿,不再使用原生按钮外观

2) 日历格子
- 「待完成 / 总数」改为 34px 粗体、主题绿、靠左、垂直居中;左侧打手色竖条保留
- 仍不显示排单缩略信息

3) 抽屉时钟
- 修复不显示:根因是浏览器缓存了旧的 app.js(静态资源 max-age=300)
- 所有 CSS/JS 链接改为 /static/app.css?v=<版本号>,升级后自动取新文件
- 字号放大到 30px、水平垂直居中、24 小时制精确到秒,日期小字放在下方

4) 已完成排单折叠
- 当日清单里已完成/已跳过的单子折叠成一行:尾号 + 姓名 + 套餐 + 状态
- 点这一行展开,显示剩余、打手、撤销打卡与⋯菜单(加急/追加);未完成的行不变
- 折叠箭头改为 CSS 三角,展开/收起有过渡动画

5) 背景
- 管理端背景横线彻底移除(已用浏览器截图确认),大屏网格背景保留

验证:
- 无头 Chrome 实拍暗色/亮色两套日历页(shots/v16-dark.png、shots/v16-light.png)
- 界面断言 14 项全部通过;原有 119 项验收回归全绿;go vet / go test ./... 通过
- 版本号 1.6.0
2026-10-19 02:33:37 +08:00
subtrack 1f7d0f0cc4 feat(v1.5): 触摸键盘、格子大字计数、客户停用/删除、按钮收纳、7 天徽标、抽屉时钟
build / build-and-test (push) Successful in 3m19s
1) 工作台速录
- 手机尾号输入框下方新增 3×4 触摸小键盘(1-9、0、⌫、✓),点 ✓ 直接提交;实体键盘仍可输入
- 抽屉顶部新增秒级时钟(HH:MM:SS),位于日期标题上方

2) 日历格子
- 移除排单缩略信息(客户名/套餐色签/“x/y 单”小字)
- 保留左侧打手颜色竖条,中间改为大字「待完成 / 总数」,例如 1/2 = 还剩 1 单、共 2 单
- 大屏格子按此前约定保持原样

3) 客户停用 / 恢复 / 彻底删除
- customers 新增 archived 列(0/1);停用后默认从客户列表、日历、待办、大屏、到期提醒、徽标中隐藏,订阅与打卡记录原样保留
- 恢复后立即回到日历;列表右上角可切换「显示已停用」,已停用行带标记
- 彻底删除为二次确认操作,依赖外键级联清理订阅、打卡、暂停、追加记录与加急标记
- 停用/恢复/删除都会写入操作日志

4) 按钮收纳
- 任务行只露出「完成」,跳过 / 加急(取消加急)/ 追加收进「⋯」菜单;已完成行只露「撤销打卡」等,点空白处自动收起
- 加急、跳过等原有能力不变,仅入口折叠

5) 顶栏
- 在「今日到期」「3 天内到期」右侧新增「7 天内到期」徽标,固定统计未来 7 天

6) 视觉
- 移除管理端背景的横线装饰,改为纯底色;大屏网格背景保留

数据库兼容性:
- 只新增 customers.archived 一列,老库启动时自动 ALTER,可重复迁移;原有表结构与接口不变

测试:
- 新增单测 TestCustomerArchiveFilters:停用后日历/到期/徽标/搜索/列表全部过滤、恢复回日历、彻底删除级联清理订阅与打卡
- 功能验证 20 项(键盘、格子计数、折叠菜单、7 天徽标、时钟、停用/恢复/删除、背景)全部通过
- 原有 119 项验收回归全绿;go vet / go test ./... 通过;版本号 1.5.0
2026-10-19 02:12:25 +08:00
subtrack 95fa4fd6fd feat(v1.4): 初始管理员(id=1)可修改其他管理员的用户名、昵称和密码
build / build-and-test (push) Successful in 3m25s
- 设置 → 管理员:仅 id=1 的账户在“其他人”那一行看到「编辑」入口,自己那行不显示
- 新增编辑页 /settings/users/{id}/edit:可改用户名、显示名称,密码留空则不修改
- 重置密码后立即清除该账户的所有登录会话,强制对方用新密码重新登录;只改昵称/用户名不影响会话
- 服务端三重校验:非 id=1 拒绝、不能编辑自己、用户名 3-32 字符且唯一、密码 ≥6 位且两次一致
- 所有修改写入操作日志(旧用户名/昵称 → 新值,是否重置密码)
- 设置页根据当前账户显示不同提示:超管看到可编辑说明,其他人只看到“只有初始管理员可以修改”

数据库:无需变更(复用 users 表与 sessions 表)
测试:
- 新增单测 TestUpdateUserByAdmin:昵称更新、会话保留、改密后旧会话失效、新密码可登录旧密码失效、重名返回 ErrDuplicate、空用户名拒绝
- 功能验证 20 项:入口显示/隐藏、普通管理员与自我编辑被拒、改密踢下线、新旧密码、长度/一致性/重名校验、留空密码、日志记录
- 原有 119 项验收回归全绿;go vet / go test ./... 通过;版本号 1.4.0
2026-10-19 00:21:47 +08:00
subtrack 8cfc9f5891 feat(v1.3): 管理员(打手)颜色,客户归属打手,日历/待办按颜色标识
1) 管理员颜色
- users 表新增 color;设置 → 管理员 每行一个颜色选择器,保存即生效
- 新建管理员自动从 8 色调色板分配,尽量不重复;支持 #RRGGBB 校验,非法值拒绝

2) 客户归属打手
- customers 表新增 assignee_id(可空,指向 users)
- 新建/编辑客户时可选择「归属打手」,客户详情页也能直接改派
- 语义:一个客户一个打手,该客户之后的所有单子都归这个打手
- 停用的账户不出现在打手候选里;未指派显示灰色「未指派」

3) 日历
- 每个日期格左侧新增 5px 竖条,按当天涉及的打手颜色等分显示(几种颜色几段)
- 竖条按“当天全部任务”去重计算,不受格内色签 3 条上限影响
- 未指派的任务用中性灰段落

4) 待办与大屏
- 「当日待完成」每条任务左侧 3px 打手色条 + 圆点色标 + 打手名字,未指派灰字
- 大屏:今日待打列表、热力格竖条、悬停浮层(新增 who / who_color 字段)统一使用同一套颜色
- 加急样式改为红底,避免与打手色左边框冲突

数据库兼容性:
- 只做加法:users.color、customers.assignee_id 两列;老库打开时自动 ALTER,可重复迁移
- 原有表结构、字段、页面接口不变;未指派的存量数据照常工作

测试:
- 新增单测:颜色自动分配/规范化/非法值拒绝、客户指派与取消、订阅联表带出打手、停用账户不进候选
- 旧库迁移测试扩展:老 users / customers 表自动补列并可写
- 功能验证 16 项(颜色保存、指派、详情展示、日历多色竖条分段、大屏列表与浮层接口)全部通过
- 原有 119 项验收回归全绿;go vet / go test ./... 通过;版本号 1.3.0
2026-10-19 00:16:34 +08:00
subtrack 85f98dff5c feat(v1.2): 亮暗主题、按尾号快速完成、加急置顶、按套餐分日历、大屏升级
1) 全站亮色 / 暗色
- 管理端与大屏都提供切换按钮(顶栏 ☾/☀、大屏右上角),偏好写 cookie,服务端首屏直出,不闪
- 未选择时跟随系统(prefers-color-scheme);两套配色都改成 CSS 变量,色签、热力、表格、抽屉全部适配
- 大屏默认仍是深色记分板,浅色为纸感背景

2) 工作台 → 当日待完成:按手机尾号快速完成
- 输入尾号回车:唯一匹配直接完成并提示
- 同尾号多客户 / 一单多服务:跳到选择面板,默认全选,可多选后一次完成
- 新增 POST /checkins/quick 与 POST /checkins/batch;抽屉标题改为「未完成数 / 总单数」

3) 加急
- 每条任务右侧可勾选/取消加急;加急任务红 tag + 置顶(抽屉与大屏「今日待打」)
- 日历格子出现红点,单据色签加红边;大屏热力格也带红点
- 新增表 task_flags(sub_id, service_date, urgent),按 订阅+日期 存,避免和打卡状态耦合

4) 套餐「在日历中独立显示」
- 套餐表单新增勾选项,列表页显示「独立日历」标记
- 勾选后工作台与大屏顶部出现套餐标签页(全部 / 每日任务 / …),可只看某类委托的排单、热量与待办
- 新增列 packages.calendar_separate;老库打开时自动 ALTER,无需手工迁移

5) 大屏
- 热力默认改为「每日待完成单量」,右上角可切回「到期热力」
- 鼠标悬停任意日期格,浮出当日待办明细(客户、套餐、剩余、加急),数据来自 GET /api/screen/day
- 底部面板改为「今日到期」(左)+「今日待打」(右,加急置顶),最近追加改为最底部细条

数据库兼容性:
- 只做加法:新增 task_flags 表与 packages.calendar_separate 列,原有表结构、字段、接口与已有数据均不变
- 迁移可重复执行(CREATE TABLE IF NOT EXISTS + PRAGMA 检查后 ALTER)

测试:
- 新增单元测试:套餐独立日历标记、加急增删查、旧库自动加列与重复迁移
- 新增功能冒烟 33 项(主题 cookie、套餐标签、快速完成单/多匹配、加急排序、大屏接口)全部通过
- 原有 119 项验收回归全绿(3 条断言按新 UI 更新:抽屉标题、热力默认口径、今日待打数取值方式)
- go vet / go test ./... 通过;版本号 1.2.0
2026-10-18 22:07:25 +08:00
subtrack 099385e3d9 test: 配置用例改用临时目录绝对路径,兼容 Linux runner
build / build-and-test (push) Successful in 3m33s
2026-10-18 19:49:49 +08:00
subtrack 082c1f5778 fix(ci): 补齐 go.sum 中 Linux 专属依赖,修复 go vet missing go.sum entry 2026-10-18 19:49:22 +08:00
subtrack e0741832d3 fix(test): 测试脚本改为位置无关,去除本地绝对路径 2026-10-18 19:46:50 +08:00
chun_qiu f047662129 首次推送
build / build-and-test (push) Failing after 1m24s
2026-10-18 19:44:38 +08:00