🐛 fix(review): 弹窗内切换排序加载失败,评论页固定顶栏

- 评论页注入绝对 API_BASE:弹窗 WebView(loadDataWithBaseURL) 中相对路径
  fetch 解析不可靠,切换排序/懒加载/回复全部改走绝对地址
- externalBaseURL 识别 X-Forwarded-Proto:正文气泡 ident 与评论页地址
  不再硬编码 http://,避免反代 301
- 布局改造:顶栏固定(含拖拽把手视觉)+评论区独立滚动容器,滚动/回顶
  逻辑迁移至容器;switchSort 显式传参替代隐式 event
This commit is contained in:
chenxin committed 2026-10-10 12:49:00 +08:00
1 parent 99826c6d25
commit af9004adaf
3 files changed
+70 -37

No files matched your search

+14 -2
View File
@@ -12,6 +12,16 @@ import (
"time"
)
// externalBaseURL 取外部可访问的基础 URL(nginx 反代下识别 X-Forwarded-Proto,
// 避免生成 http:// 链接被 301,弹窗 WebView 内 fetch 对 301 处理不稳)
func externalBaseURL(r *http.Request) string {
scheme := "http"
if p := r.Header.Get("X-Forwarded-Proto"); p != "" {
scheme = p
}
return scheme + "://" + r.Host
}
// validateParams 验证必需参数
func validateParams(r *http.Request, required ...string) (map[string]string, error) {
params := make(map[string]string)
@@ -207,7 +217,7 @@ func HandleReviewHTML(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusOK)
html := generateReviewHTML(data, params["item_id"], bookID, para, page, pageSize, sort)
html := generateReviewHTML(r, data, params["item_id"], bookID, para, page, pageSize, sort)
fmt.Fprint(w, html)
}
@@ -318,6 +328,7 @@ var reviewTmpl = template.Must(template.New("review").Parse(reviewHTML))
// reviewPageData 评论页模板数据
type reviewPageData struct {
ItemID, BookID string
BaseURL string
ParaPlus1, Para, Sort int
Total, NextOffset int
PageSize, CommentCount int
@@ -327,7 +338,7 @@ type reviewPageData struct {
}
// generateReviewHTML 生成评论 HTML 页面
func generateReviewHTML(data map[string]interface{}, itemID, bookID string, para, page, pageSize, sort int) string {
func generateReviewHTML(r *http.Request, data map[string]interface{}, itemID, bookID string, para, page, pageSize, sort int) string {
total := 0
hasMore := false
nextOffset := 0
@@ -383,6 +394,7 @@ func generateReviewHTML(data map[string]interface{}, itemID, bookID string, para
var b strings.Builder
if err := reviewTmpl.Execute(&b, reviewPageData{
ItemID: itemID, BookID: bookID,
BaseURL: externalBaseURL(r),
ParaPlus1: para + 1, Para: para, Sort: sort,
Total: total, NextOffset: nextOffset,
PageSize: pageSize, CommentCount: len(pageComments),