Admin:进入顺运宝页面不应自动弹验证码框 #48

Closed
opened 2026-08-09 12:46:07 +08:00 by ila · 2 comments
Owner

基本信息

  • 状态:已完成
  • 类型:缺陷(交互)
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 / MVP
  • 关联:#46(顺运宝同步)、#47(验证码自动识别)

要解决什么

用户在 admin/config.yaml 里配好了 ocr_url,一进顺运宝模块还是弹验证码输入框。

根因

OCR 自动登录只接在「点同步」这条路径上,没接在「进入页面」上:

点「同步」 SybSync   会话过期 → attemptSybAutoLogin → OCR → 成功就直接同步   ✅
进入页面   SybList   会话过期 → needLogin = true → 模板直接弹手工输入框      ❌

renderSybListWithLoginReason 里:

sessErr := service.EnsureSybSession(h.db, client, cfg.Syb.Username, time.Now())
needLogin = errors.Is(sessErr, service.ErrSybLoginRequired)

模板里 {{if not .NeedLogin}}hidden{{end}}——NeedLogin 为真,弹窗就自动打开。
配了 ocr_url 也没用,因为这条路径压根不调 OCR。

[注意] 这是 #47 工单写漏的:流程图只画了「点同步 → 会话过期 → OCR」,
没考虑进入页面时也会判会话。实现按工单做的,接在 SybSync 上没错。

不是性能问题

[必须] EnsureSybSession 不发任何外部请求——它只读 SQLite 缓存、
本地判 expires_at、把 Cookie 装进客户端。所以本工单不涉及性能优化,
不要顺手去改它。

做什么 / 不做什么

做:

  1. 进入页面不自动弹登录框,改成顶部一行提示
  2. 登录框只在「点同步后自动登录失败」时才弹
  3. 提示文案按 ocr_url 配没配分两种

不做:

  • 不改 EnsureSybSession(它没问题,见上)
  • 不做「进入页面就自动 OCR 登录」——那会让「打开页面」变成一个对外部系统
    有副作用的动作,而且要等好几秒。这与 Client 侧「『获取任务』是唯一会产生
    外部后果的命令」是同一条原则:只看数据的动作不该触发外部调用
  • 不加独立的「登录」按钮(同步会自动登录,不需要单独入口)
  • 不改 OCR 逻辑、同步逻辑、字段映射

怎么做

NeedLogin 改成只由「降级重定向」驱动

// 改前:本地缓存过期就弹窗
needLogin = errors.Is(sessErr, service.ErrSybLoginRequired)

// 改后:只有从"自动登录失败"跳回来时才弹
needLogin = loginReason != ""

[必须] 弹窗只在 login_reason 非空时打开。那个参数由
sybRedirectLogin 在自动登录失败时带上——也就是操作员主动点过同步、
且自动登录确实失败了
,这时弹框才是他预期的。

[必须] 不要删 EnsureSybSession 的调用,它的结果还要用来算下面那行提示。

顶部提示分两种

会话有效时不显示任何提示。会话无效(本地缓存过期或没有)时:

ocr_url 提示
已配置 顺运宝未登录。点「同步」时会自动识别验证码并登录。
留空 顺运宝未登录。点「同步」时需要手工输入验证码。

[必须] 两种文案要分开。配了 OCR 却提示"需要手工输入"会让人以为配置没生效;
没配 OCR 却提示"会自动登录",点下去弹出验证码框会让人莫名其妙。

[建议] 用已有的 .hint 样式,不要新造。这不是错误,是状态说明,
不要用 .missing(红色)——红色是留给「PDD 链接未填写」那种需要立刻处理的。

弹窗里的原因照旧

[必须] #47 加的 NeedLoginReason 保持不变——弹窗打开时仍要说明是
「已尝试 N 次」还是「服务不可用」。本工单只改什么时候弹,不改弹出来说什么。

预计修改文件

文件 改什么
admin/handler/web/others.go needLogin 改为由 loginReason 驱动;新增提示文案字段
admin/templates/syb/list.html 顶部提示;弹窗打开条件不变(仍看 NeedLogin)
admin/handler/web/others_test.go 或 admin/service/syb_test.go 新增用例
docs/admin/05-ui-specification.md §6 顺运宝页的登录交互说明

验收标准

  • 会话无效时进入 /syb 不弹登录框,页面正常显示列表
  • 会话无效且 ocr_url 已配置 → 顶部提示"点同步时会自动识别验证码并登录"
  • 会话无效且 ocr_url 留空 → 顶部提示"点同步时需要手工输入验证码"
  • 会话有效 → 不显示任何登录提示
  • 带 ?login_reason=xxx 访问 /syb → 弹登录框,并显示该原因
  • 点「同步」→ 自动登录失败 → 跳回列表页并弹登录框(#47 的路径未破坏)
  • 手工输入登录仍然可用(#46 的路径未破坏)
  • EnsureSybSession 未被改动
  • 提示用 .hint 不用 .missing
  • 五个页面均 200
  • GOTOOLCHAIN=go1.23.0 下 go vet / gofmt -l . / go test ./... 全过

怎么验证

cd D:\chengma\cmautobuy\admin
$env:GOTOOLCHAIN="go1.23.0"
go vet ./...; gofmt -l .; go test ./... -count=1
Remove-Item Env:GOTOOLCHAIN
go run .
  1. 清掉会话(DELETE FROM syb_session;)→ 打开 /syb → 不该弹框,
    顶部有提示
  2. 直接访问 /syb?login_reason=测试原因 → 应该弹框并显示"测试原因"
  3. 把 ocr_url 改成不可达地址 → 点「同步」→ 应跳回并弹框,
    说明服务不可用

风险和回退

风险 应对
改完之后自动登录失败也不弹框了,操作员无路可走 已列为验收项(login_reason 那条)
顺手去"优化" EnsureSybSession 已在「不做」里写明它没问题

回退:git revert。纯交互改动,不影响数据。

## 基本信息 - 状态:已完成 - 类型:缺陷(交互) - 父级大工单:#14 - 所属 MVP / 版本:#15 / MVP - 关联:#46(顺运宝同步)、#47(验证码自动识别) ## 要解决什么 用户在 `admin/config.yaml` 里配好了 `ocr_url`,**一进顺运宝模块还是弹验证码输入框**。 ### 根因 OCR 自动登录**只接在「点同步」这条路径上**,没接在「进入页面」上: ```text 点「同步」 SybSync 会话过期 → attemptSybAutoLogin → OCR → 成功就直接同步 ✅ 进入页面 SybList 会话过期 → needLogin = true → 模板直接弹手工输入框 ❌ ``` `renderSybListWithLoginReason` 里: ```go sessErr := service.EnsureSybSession(h.db, client, cfg.Syb.Username, time.Now()) needLogin = errors.Is(sessErr, service.ErrSybLoginRequired) ``` 模板里 `{{if not .NeedLogin}}hidden{{end}}`——`NeedLogin` 为真,弹窗就自动打开。 配了 `ocr_url` 也没用,因为这条路径压根不调 OCR。 `[注意]` 这是 **#47 工单写漏的**:流程图只画了「点同步 → 会话过期 → OCR」, 没考虑进入页面时也会判会话。实现按工单做的,接在 `SybSync` 上没错。 ### 不是性能问题 `[必须]` `EnsureSybSession` **不发任何外部请求**——它只读 SQLite 缓存、 本地判 `expires_at`、把 Cookie 装进客户端。所以本工单**不涉及性能优化**, 不要顺手去改它。 ## 做什么 / 不做什么 做: 1. 进入页面**不自动弹登录框**,改成顶部一行提示 2. 登录框**只在「点同步后自动登录失败」时才弹** 3. 提示文案按 `ocr_url` 配没配分两种 不做: - **不改 `EnsureSybSession`**(它没问题,见上) - 不做「进入页面就自动 OCR 登录」——那会让「打开页面」变成一个对外部系统 有副作用的动作,而且要等好几秒。这与 Client 侧「『获取任务』是唯一会产生 外部后果的命令」是同一条原则:**只看数据的动作不该触发外部调用** - 不加独立的「登录」按钮(同步会自动登录,不需要单独入口) - 不改 OCR 逻辑、同步逻辑、字段映射 ## 怎么做 ### `NeedLogin` 改成只由「降级重定向」驱动 ```go // 改前:本地缓存过期就弹窗 needLogin = errors.Is(sessErr, service.ErrSybLoginRequired) // 改后:只有从"自动登录失败"跳回来时才弹 needLogin = loginReason != "" ``` `[必须]` 弹窗只在 `login_reason` 非空时打开。那个参数由 `sybRedirectLogin` 在自动登录失败时带上——也就是**操作员主动点过同步、 且自动登录确实失败了**,这时弹框才是他预期的。 `[必须]` **不要删 `EnsureSybSession` 的调用**,它的结果还要用来算下面那行提示。 ### 顶部提示分两种 会话有效时不显示任何提示。会话无效(本地缓存过期或没有)时: | `ocr_url` | 提示 | |---|---| | 已配置 | 顺运宝未登录。点「同步」时会自动识别验证码并登录。 | | 留空 | 顺运宝未登录。点「同步」时需要手工输入验证码。 | `[必须]` 两种文案要分开。配了 OCR 却提示"需要手工输入"会让人以为配置没生效; 没配 OCR 却提示"会自动登录",点下去弹出验证码框会让人莫名其妙。 `[建议]` 用已有的 `.hint` 样式,不要新造。这不是错误,是状态说明, **不要用 `.missing`(红色)**——红色是留给「PDD 链接未填写」那种需要立刻处理的。 ### 弹窗里的原因照旧 `[必须]` #47 加的 `NeedLoginReason` 保持不变——弹窗打开时仍要说明是 「已尝试 N 次」还是「服务不可用」。本工单只改**什么时候弹**,不改**弹出来说什么**。 ## 预计修改文件 | 文件 | 改什么 | |---|---| | `admin/handler/web/others.go` | `needLogin` 改为由 `loginReason` 驱动;新增提示文案字段 | | `admin/templates/syb/list.html` | 顶部提示;弹窗打开条件不变(仍看 `NeedLogin`) | | `admin/handler/web/others_test.go` 或 `admin/service/syb_test.go` | 新增用例 | | `docs/admin/05-ui-specification.md` | §6 顺运宝页的登录交互说明 | ## 验收标准 - [x] 会话无效时**进入 `/syb` 不弹登录框**,页面正常显示列表 - [x] 会话无效且 `ocr_url` 已配置 → 顶部提示"点同步时会自动识别验证码并登录" - [x] 会话无效且 `ocr_url` 留空 → 顶部提示"点同步时需要手工输入验证码" - [x] 会话有效 → **不显示任何登录提示** - [x] 带 `?login_reason=xxx` 访问 `/syb` → **弹登录框**,并显示该原因 - [x] 点「同步」→ 自动登录失败 → 跳回列表页并弹登录框(#47 的路径未破坏) - [x] 手工输入登录仍然可用(#46 的路径未破坏) - [x] **`EnsureSybSession` 未被改动** - [x] 提示用 `.hint` 不用 `.missing` - [x] 五个页面均 200 - [x] `GOTOOLCHAIN=go1.23.0` 下 `go vet` / `gofmt -l .` / `go test ./...` 全过 ## 怎么验证 ```powershell cd D:\chengma\cmautobuy\admin $env:GOTOOLCHAIN="go1.23.0" go vet ./...; gofmt -l .; go test ./... -count=1 Remove-Item Env:GOTOOLCHAIN go run . ``` 1. 清掉会话(`DELETE FROM syb_session;`)→ 打开 `/syb` → **不该弹框**, 顶部有提示 2. 直接访问 `/syb?login_reason=测试原因` → **应该弹框**并显示"测试原因" 3. 把 `ocr_url` 改成不可达地址 → 点「同步」→ 应跳回并弹框, 说明服务不可用 ## 风险和回退 | 风险 | 应对 | |---|---| | 改完之后自动登录失败也不弹框了,操作员无路可走 | 已列为验收项(`login_reason` 那条) | | 顺手去"优化" `EnsureSybSession` | 已在「不做」里写明它没问题 | 回退:`git revert`。纯交互改动,不影响数据。
Author
Owner

实施完成,待验收

提交: 6e6e99a fix: 进入顺运宝页面不再自动弹验证码框 (#48)

验证结果(GOTOOLCHAIN=go1.23.0)

go vet / gofmt -l . 无输出;go test ./... -count=1 5 个包全过。

用真实二进制 + 假配置(不可达的 base_url 和 ocr_url)实测:

场景 弹窗 顶部提示
会话无效 + ocr_url 已配置,进入 /syb hidden=true(不弹)✅ 顺运宝未登录。点「同步」时会自动识别验证码并登录。
/syb?login_reason=测试原因 hidden=false(弹出)✅ 同上
会话无效 + ocr_url 留空,进入 /syb hidden=true ✅ 顺运宝未登录。点「同步」时需要手工输入验证码。

五个页面均 200。service/syb.go 未改动(EnsureSybSession 保持原样)。

一处对我自己判断的更正

我在分析时说过「SybList 每次渲染都发一次 /am/user/get 探测请求,刷新一次就打一次顺运宝」——这是错的。EnsureSybSession 只读 SQLite 缓存、本地判 expires_at、把 Cookie 装进客户端,不发任何外部请求。#46 的实现报告里就声明过这个设计,我当时认可了,后来却说反了。

所以本工单不涉及性能问题,纯粹是「弹窗什么时候弹」的交互修正。工单正文里已写明「不做:不改 EnsureSybSession」。

未验证到的部分

  • 浏览器实机:弹窗的实际显示/隐藏、提示文字的视觉位置,只验证了服务端 HTML 的 hidden 属性和 .hint 段落
  • 真实顺运宝账号下的完整流程(进页面不弹 → 点同步自动登录 → 同步)需要真实网络和账号
## 实施完成,待验收 **提交:** `6e6e99a` fix: 进入顺运宝页面不再自动弹验证码框 (#48) ### 验证结果(`GOTOOLCHAIN=go1.23.0`) `go vet` / `gofmt -l .` 无输出;`go test ./... -count=1` 5 个包全过。 用真实二进制 + 假配置(不可达的 base_url 和 ocr_url)实测: | 场景 | 弹窗 | 顶部提示 | |---|---|---| | 会话无效 + `ocr_url` 已配置,进入 `/syb` | **hidden=true**(不弹)✅ | 顺运宝未登录。点「同步」时会自动识别验证码并登录。 | | `/syb?login_reason=测试原因` | **hidden=false**(弹出)✅ | 同上 | | 会话无效 + `ocr_url` 留空,进入 `/syb` | hidden=true ✅ | 顺运宝未登录。点「同步」时**需要手工输入验证码**。 | 五个页面均 200。`service/syb.go` 未改动(`EnsureSybSession` 保持原样)。 ### 一处对我自己判断的更正 我在分析时说过「`SybList` 每次渲染都发一次 `/am/user/get` 探测请求,刷新一次就打一次顺运宝」——**这是错的**。`EnsureSybSession` 只读 SQLite 缓存、本地判 `expires_at`、把 Cookie 装进客户端,**不发任何外部请求**。#46 的实现报告里就声明过这个设计,我当时认可了,后来却说反了。 所以本工单**不涉及性能问题**,纯粹是「弹窗什么时候弹」的交互修正。工单正文里已写明「不做:不改 `EnsureSybSession`」。 ### 未验证到的部分 - **浏览器实机**:弹窗的实际显示/隐藏、提示文字的视觉位置,只验证了服务端 HTML 的 `hidden` 属性和 `.hint` 段落 - 真实顺运宝账号下的完整流程(进页面不弹 → 点同步自动登录 → 同步)需要真实网络和账号
Author
Owner

用户已于 2026-08-09 明确通过 Admin 待验收工单。本工单验收通过;缺失的本地归档已补齐:docs/task/48-进入顺运宝页面不自动弹验证码框.md,归档提交 453dcf7。现关闭工单,并同步父级 #15、#14 的任务清单。

用户已于 2026-08-09 明确通过 Admin 待验收工单。本工单验收通过;缺失的本地归档已补齐:`docs/task/48-进入顺运宝页面不自动弹验证码框.md`,归档提交 `453dcf7`。现关闭工单,并同步父级 #15、#14 的任务清单。
ila closed this issue 2026-08-09 21:15:34 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#48