fix: 同步记录弹窗改为局部刷新 (#62)
This commit is contained in:
@@ -156,14 +156,39 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
|
||||
"SyncRunning": syncStatus.Running,
|
||||
"SyncHistory": history,
|
||||
"NeedSyncHistory": c.Query("history") == "1",
|
||||
"HistoryRefreshURL": sybHistoryURL(history.Page,
|
||||
"HistoryFetchURL": sybHistoryPartialURL(history.Page,
|
||||
keyword, dateFrom, dateTo),
|
||||
"HistoryPagination": sybHistoryPagination(history.Page, history.TotalPages,
|
||||
keyword, dateFrom, dateTo),
|
||||
"HistoryFetchPagination": sybHistoryPartialPagination(history.Page, history.TotalPages,
|
||||
keyword, dateFrom, dateTo),
|
||||
"Pagination": service.NewPaginationView(result.Page, result.TotalPages, values.Encode()),
|
||||
}))
|
||||
}
|
||||
|
||||
// SybSyncHistory 只返回同步记录弹窗内部的 HTML。它只读本地数据库,不调用
|
||||
// 顺运宝;完整页面和局部刷新共用同一份模板,避免字段或分页标记漂移。
|
||||
func (h *Handler) SybSyncHistory(c *gin.Context) {
|
||||
c.Header("Cache-Control", "no-store")
|
||||
keyword := c.Query("order_no")
|
||||
dateFrom := c.Query("date_from")
|
||||
dateTo := c.Query("date_to")
|
||||
history, err := service.ListSybSyncHistory(h.db, service.ParsePage(c.Query("history_page")))
|
||||
if err != nil {
|
||||
c.String(http.StatusInternalServerError, "读取同步记录失败,请稍后重试")
|
||||
return
|
||||
}
|
||||
c.HTML(http.StatusOK, "syb/history_partial", gin.H{
|
||||
"SyncHistory": history,
|
||||
"HistoryFetchURL": sybHistoryPartialURL(history.Page,
|
||||
keyword, dateFrom, dateTo),
|
||||
"HistoryPagination": sybHistoryPagination(history.Page, history.TotalPages,
|
||||
keyword, dateFrom, dateTo),
|
||||
"HistoryFetchPagination": sybHistoryPartialPagination(history.Page, history.TotalPages,
|
||||
keyword, dateFrom, dateTo),
|
||||
})
|
||||
}
|
||||
|
||||
func sybHistoryPagination(pageNum, totalPages int, keyword, dateFrom, dateTo string) service.PaginationView {
|
||||
link := func(target int) string { return sybHistoryURL(target, keyword, dateFrom, dateTo) }
|
||||
view := service.PaginationView{
|
||||
@@ -189,6 +214,31 @@ func sybHistoryURL(pageNum int, keyword, dateFrom, dateTo string) string {
|
||||
return "/syb?" + values.Encode()
|
||||
}
|
||||
|
||||
func sybHistoryPartialPagination(pageNum, totalPages int, keyword, dateFrom, dateTo string) service.PaginationView {
|
||||
link := func(target int) string { return sybHistoryPartialURL(target, keyword, dateFrom, dateTo) }
|
||||
view := service.PaginationView{
|
||||
Page: pageNum, TotalPages: totalPages, HasPrev: pageNum > 1, HasNext: pageNum < totalPages,
|
||||
FirstURL: link(1), LastURL: link(totalPages),
|
||||
}
|
||||
if view.HasPrev {
|
||||
view.PrevURL = link(pageNum - 1)
|
||||
}
|
||||
if view.HasNext {
|
||||
view.NextURL = link(pageNum + 1)
|
||||
}
|
||||
return view
|
||||
}
|
||||
|
||||
func sybHistoryPartialURL(pageNum int, keyword, dateFrom, dateTo string) string {
|
||||
values := url.Values{"history_page": {strconv.Itoa(pageNum)}}
|
||||
if keyword != "" {
|
||||
values.Set("order_no", keyword)
|
||||
}
|
||||
values.Set("date_from", dateFrom)
|
||||
values.Set("date_to", dateTo)
|
||||
return "/syb/sync-history?" + values.Encode()
|
||||
}
|
||||
|
||||
// sybStatusLine 组装底部状态条的默认文案(没有 msg 覆盖时)。
|
||||
// `[必须]` 显示筛选后的**全量**总数,不是本页行数,见工单 #43 定下的规则。
|
||||
func sybStatusLine(result *service.SybListResult) string {
|
||||
|
||||
@@ -115,3 +115,35 @@ func TestSybHistoryURL_刷新时保留当前页和筛选(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSybHistoryPartialURL_只读片段保留当前页和筛选(t *testing.T) {
|
||||
location, err := url.Parse(sybHistoryPartialURL(3, "ORDER-1", "2026-08-01", "2026-08-09"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if location.Path != "/syb/sync-history" {
|
||||
t.Fatalf("局部刷新应使用独立只读路由,实际 %s", location.Path)
|
||||
}
|
||||
query := location.Query()
|
||||
for name, want := range map[string]string{
|
||||
"history_page": "3", "order_no": "ORDER-1",
|
||||
"date_from": "2026-08-01", "date_to": "2026-08-09",
|
||||
} {
|
||||
if got := query.Get(name); got != want {
|
||||
t.Fatalf("局部刷新链接 %s=%q,期望 %q;URL=%s", name, got, want, location.String())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSybHistoryPartialPagination_翻页继续使用片段路由(t *testing.T) {
|
||||
view := sybHistoryPartialPagination(2, 3, "ORDER-1", "2026-08-01", "2026-08-09")
|
||||
for _, raw := range []string{view.FirstURL, view.PrevURL, view.NextURL, view.LastURL} {
|
||||
location, err := url.Parse(raw)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if location.Path != "/syb/sync-history" {
|
||||
t.Fatalf("弹窗局部翻页不应请求完整 SYB 页面:%s", raw)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,8 @@ func Register(r *gin.Engine, db *sql.DB, onlineThreshold time.Duration) {
|
||||
|
||||
// 3. 顺运宝数据
|
||||
pages.GET("/syb", h.SybList)
|
||||
pages.GET("/syb/captcha", h.SybCaptcha) // 登录弹窗里的验证码图片
|
||||
pages.GET("/syb/sync-history", h.SybSyncHistory) // 弹窗局部刷新,只读本地同步记录
|
||||
pages.GET("/syb/captcha", h.SybCaptcha) // 登录弹窗里的验证码图片
|
||||
pages.POST("/syb/sync", h.SybSync)
|
||||
pages.POST("/syb/login-and-sync", h.SybLoginAndSync)
|
||||
pages.POST("/syb/match", h.SybMatch)
|
||||
|
||||
Reference in New Issue
Block a user