diff --git a/admin/handler/web/others.go b/admin/handler/web/others.go index 6f32b97..8e32c95 100644 --- a/admin/handler/web/others.go +++ b/admin/handler/web/others.go @@ -32,6 +32,21 @@ func (h *Handler) renderSybList(c *gin.Context, keyword, pageRaw, msg string) { h.renderSybListWithLoginReason(c, keyword, pageRaw, msg, c.Query("login_reason")) } +// sybLoginHint 是会话无效时顶部那行提示。 +// +// `[必须]` 配了 OCR 和没配 OCR 的文案要分开(工单 #48): +// 配了却提示"需要手工输入"会让人以为配置没生效;没配却提示"会自动登录", +// 点下去弹出验证码框会让人莫名其妙。 +// +// `[必须]` 这不是错误,是状态说明,用 .hint 不用 .missing—— +// 红色留给「PDD 链接未填写」那种需要立刻处理的。 +func sybLoginHint(ocrURL string) string { + if strings.TrimSpace(ocrURL) != "" { + return "顺运宝未登录。点「同步」时会自动识别验证码并登录。" + } + return "顺运宝未登录。点「同步」时需要手工输入验证码。" +} + // renderSybListWithLoginReason 同 renderSybList,额外带一条"登录弹窗里要 // 显示的原因"——工单 #47:自动识别验证码失败或降级时,操作员需要知道 // 是配置错了还是服务挂了,不能弹一个空的手工输入框了事。 @@ -61,7 +76,18 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw, // 这里只取 username(只读展示)和 base_url 是否配置正确。 username := "" configProblem := "" - needLogin := false + loginHint := "" + + // `[必须]` 登录弹窗**只在自动登录失败后跳回来时才弹**(工单 #48)。 + // + // 改之前是"本地会话过期就弹",导致配了 ocr_url 也会在**进入页面**时 + // 被拦一次——因为 OCR 自动登录只接在「点同步」那条路径上。 + // + // 现在「打开页面」纯粹是看数据,不触发任何对外部系统的动作; + // 真正会登录的只有「同步」这一个按钮。这与 Client 侧 + // 「『获取任务』是唯一会产生外部后果的命令」是同一条原则。 + needLogin := loginReason != "" + cfg, cfgErr := config.Load() switch { case cfgErr != nil: @@ -72,8 +98,13 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw, if err != nil { configProblem = "顺运宝 base_url 配置有误: " + err.Error() } else { + // 这里仍然要判会话,但结果只用来决定"要不要给一行提示", + // 不再用来决定"弹不弹窗"。EnsureSybSession 只读本地缓存、 + // 本地判过期,不发外部请求,页面渲染不会因此变慢。 sessErr := service.EnsureSybSession(h.db, client, cfg.Syb.Username, time.Now()) - needLogin = errors.Is(sessErr, service.ErrSybLoginRequired) + if errors.Is(sessErr, service.ErrSybLoginRequired) { + loginHint = sybLoginHint(cfg.Syb.OcrURL) + } } } @@ -85,6 +116,7 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw, "IsFiltered": result.IsFiltered, "NeedLogin": needLogin, "NeedLoginReason": loginReason, + "LoginHint": loginHint, "Username": username, "ConfigProblem": configProblem, "Pagination": service.NewPaginationView(result.Page, result.TotalPages, values.Encode()), diff --git a/admin/templates/syb/list.html b/admin/templates/syb/list.html index 09756e5..616b56b 100644 --- a/admin/templates/syb/list.html +++ b/admin/templates/syb/list.html @@ -34,6 +34,15 @@
{{end}} +{{/* 未登录只给一行提示,**不弹窗**(工单 #48)。 + 打开页面纯粹是看数据,不该触发任何对外部系统的动作; + 真正会登录的只有「同步」那一个按钮。 + 用 .hint 不用 .missing——这是状态说明不是错误, + 红色留给「PDD 链接未填写」那种要立刻处理的。 */}} +{{if .LoginHint}} +{{.LoginHint}}
+{{end}} +