用户在 admin/config.yaml 里配好了 ocr_url,一进顺运宝模块还是弹验证码输入框。
admin/config.yaml
ocr_url
OCR 自动登录只接在「点同步」这条路径上,没接在「进入页面」上:
点「同步」 SybSync 会话过期 → attemptSybAutoLogin → OCR → 成功就直接同步 ✅ 进入页面 SybList 会话过期 → needLogin = true → 模板直接弹手工输入框 ❌
renderSybListWithLoginReason 里:
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。
{{if not .NeedLogin}}hidden{{end}}
NeedLogin
[注意] 这是 #47 工单写漏的:流程图只画了「点同步 → 会话过期 → OCR」, 没考虑进入页面时也会判会话。实现按工单做的,接在 SybSync 上没错。
[注意]
SybSync
[必须] EnsureSybSession 不发任何外部请求——它只读 SQLite 缓存、 本地判 expires_at、把 Cookie 装进客户端。所以本工单不涉及性能优化, 不要顺手去改它。
[必须]
EnsureSybSession
expires_at
做:
不做:
// 改前:本地缓存过期就弹窗 needLogin = errors.Is(sessErr, service.ErrSybLoginRequired) // 改后:只有从"自动登录失败"跳回来时才弹 needLogin = loginReason != ""
[必须] 弹窗只在 login_reason 非空时打开。那个参数由 sybRedirectLogin 在自动登录失败时带上——也就是操作员主动点过同步、 且自动登录确实失败了,这时弹框才是他预期的。
login_reason
sybRedirectLogin
[必须] 不要删 EnsureSybSession 的调用,它的结果还要用来算下面那行提示。
会话有效时不显示任何提示。会话无效(本地缓存过期或没有)时:
[必须] 两种文案要分开。配了 OCR 却提示"需要手工输入"会让人以为配置没生效; 没配 OCR 却提示"会自动登录",点下去弹出验证码框会让人莫名其妙。
[建议] 用已有的 .hint 样式,不要新造。这不是错误,是状态说明, 不要用 .missing(红色)——红色是留给「PDD 链接未填写」那种需要立刻处理的。
[建议]
.hint
.missing
[必须] #47 加的 NeedLoginReason 保持不变——弹窗打开时仍要说明是 「已尝试 N 次」还是「服务不可用」。本工单只改什么时候弹,不改弹出来说什么。
NeedLoginReason
admin/handler/web/others.go
needLogin
loginReason
admin/templates/syb/list.html
admin/handler/web/others_test.go
admin/service/syb_test.go
docs/admin/05-ui-specification.md
/syb
?login_reason=xxx
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 .
DELETE FROM syb_session;
/syb?login_reason=测试原因
回退:git revert。纯交互改动,不影响数据。
git revert
提交: 6e6e99a fix: 进入顺运宝页面不再自动弹验证码框 (#48)
6e6e99a
go vet / gofmt -l . 无输出;go test ./... -count=1 5 个包全过。
go test ./... -count=1
用真实二进制 + 假配置(不可达的 base_url 和 ocr_url)实测:
五个页面均 200。service/syb.go 未改动(EnsureSybSession 保持原样)。
service/syb.go
我在分析时说过「SybList 每次渲染都发一次 /am/user/get 探测请求,刷新一次就打一次顺运宝」——这是错的。EnsureSybSession 只读 SQLite 缓存、本地判 expires_at、把 Cookie 装进客户端,不发任何外部请求。#46 的实现报告里就声明过这个设计,我当时认可了,后来却说反了。
SybList
/am/user/get
所以本工单不涉及性能问题,纯粹是「弹窗什么时候弹」的交互修正。工单正文里已写明「不做:不改 EnsureSybSession」。
hidden
用户已于 2026-08-09 明确通过 Admin 待验收工单。本工单验收通过;缺失的本地归档已补齐:docs/task/48-进入顺运宝页面不自动弹验证码框.md,归档提交 453dcf7。现关闭工单,并同步父级 #15、#14 的任务清单。
docs/task/48-进入顺运宝页面不自动弹验证码框.md
453dcf7
No dependencies set.
The note is not visible to the blocked user.
基本信息
要解决什么
用户在
admin/config.yaml里配好了ocr_url,一进顺运宝模块还是弹验证码输入框。根因
OCR 自动登录只接在「点同步」这条路径上,没接在「进入页面」上:
renderSybListWithLoginReason里:模板里
{{if not .NeedLogin}}hidden{{end}}——NeedLogin为真,弹窗就自动打开。配了
ocr_url也没用,因为这条路径压根不调 OCR。[注意]这是 #47 工单写漏的:流程图只画了「点同步 → 会话过期 → OCR」,没考虑进入页面时也会判会话。实现按工单做的,接在
SybSync上没错。不是性能问题
[必须]EnsureSybSession不发任何外部请求——它只读 SQLite 缓存、本地判
expires_at、把 Cookie 装进客户端。所以本工单不涉及性能优化,不要顺手去改它。
做什么 / 不做什么
做:
ocr_url配没配分两种不做:
EnsureSybSession(它没问题,见上)有副作用的动作,而且要等好几秒。这与 Client 侧「『获取任务』是唯一会产生
外部后果的命令」是同一条原则:只看数据的动作不该触发外部调用
怎么做
NeedLogin改成只由「降级重定向」驱动[必须]弹窗只在login_reason非空时打开。那个参数由sybRedirectLogin在自动登录失败时带上——也就是操作员主动点过同步、且自动登录确实失败了,这时弹框才是他预期的。
[必须]不要删EnsureSybSession的调用,它的结果还要用来算下面那行提示。顶部提示分两种
会话有效时不显示任何提示。会话无效(本地缓存过期或没有)时:
ocr_url[必须]两种文案要分开。配了 OCR 却提示"需要手工输入"会让人以为配置没生效;没配 OCR 却提示"会自动登录",点下去弹出验证码框会让人莫名其妙。
[建议]用已有的.hint样式,不要新造。这不是错误,是状态说明,不要用
.missing(红色)——红色是留给「PDD 链接未填写」那种需要立刻处理的。弹窗里的原因照旧
[必须]#47 加的NeedLoginReason保持不变——弹窗打开时仍要说明是「已尝试 N 次」还是「服务不可用」。本工单只改什么时候弹,不改弹出来说什么。
预计修改文件
admin/handler/web/others.goneedLogin改为由loginReason驱动;新增提示文案字段admin/templates/syb/list.htmlNeedLogin)admin/handler/web/others_test.go或admin/service/syb_test.godocs/admin/05-ui-specification.md验收标准
/syb不弹登录框,页面正常显示列表ocr_url已配置 → 顶部提示"点同步时会自动识别验证码并登录"ocr_url留空 → 顶部提示"点同步时需要手工输入验证码"?login_reason=xxx访问/syb→ 弹登录框,并显示该原因EnsureSybSession未被改动.hint不用.missingGOTOOLCHAIN=go1.23.0下go vet/gofmt -l ./go test ./...全过怎么验证
DELETE FROM syb_session;)→ 打开/syb→ 不该弹框,顶部有提示
/syb?login_reason=测试原因→ 应该弹框并显示"测试原因"ocr_url改成不可达地址 → 点「同步」→ 应跳回并弹框,说明服务不可用
风险和回退
login_reason那条)EnsureSybSession回退:
git revert。纯交互改动,不影响数据。实施完成,待验收
提交:
6e6e99afix: 进入顺运宝页面不再自动弹验证码框 (#48)验证结果(
GOTOOLCHAIN=go1.23.0)go vet/gofmt -l .无输出;go test ./... -count=15 个包全过。用真实二进制 + 假配置(不可达的 base_url 和 ocr_url)实测:
ocr_url已配置,进入/syb/syb?login_reason=测试原因ocr_url留空,进入/syb五个页面均 200。
service/syb.go未改动(EnsureSybSession保持原样)。一处对我自己判断的更正
我在分析时说过「
SybList每次渲染都发一次/am/user/get探测请求,刷新一次就打一次顺运宝」——这是错的。EnsureSybSession只读 SQLite 缓存、本地判expires_at、把 Cookie 装进客户端,不发任何外部请求。#46 的实现报告里就声明过这个设计,我当时认可了,后来却说反了。所以本工单不涉及性能问题,纯粹是「弹窗什么时候弹」的交互修正。工单正文里已写明「不做:不改
EnsureSybSession」。未验证到的部分
hidden属性和.hint段落用户已于 2026-08-09 明确通过 Admin 待验收工单。本工单验收通过;缺失的本地归档已补齐:
docs/task/48-进入顺运宝页面不自动弹验证码框.md,归档提交453dcf7。现关闭工单,并同步父级 #15、#14 的任务清单。