feat: 保存并展示 PDD 店铺与价格采样信息 (#31)

This commit is contained in:
chengma
2026-08-07 17:13:25 +08:00
parent a2fc1501c4
commit 93beef8b36
17 changed files with 492 additions and 73 deletions
+31 -18
View File
@@ -8,8 +8,10 @@
package main
import (
"database/sql"
"embed"
"flag"
"fmt"
"html/template"
"io/fs"
"log"
@@ -60,29 +62,40 @@ func main() {
log.Printf("数据库已就绪")
// 3. Web 引擎
r := gin.Default()
// 模板:每个文件用 {{define "目录/名字"}} 声明自己的名字,
// 所以一次全部解析进来不会冲突。
tmpl, err := template.ParseFS(templateFS, "templates/*/*.html")
r, err := newRouter(db)
if err != nil {
log.Fatalf("解析模板失败: %v", err)
log.Fatalf("准备 Web 页面失败: %v", err)
}
r.SetHTMLTemplate(tmpl)
// 静态文件
staticSub, err := fs.Sub(staticFS, "static")
if err != nil {
log.Fatalf("准备静态文件失败: %v", err)
}
r.StaticFS("/static", http.FS(staticSub))
// 4. 路由
web.Register(r, db, config.OnlineThreshold) // 给浏览器的页面
api.Register(r, db) // 给 Client 的接口
log.Printf("Admin 已启动: http://%s", *addr)
if err := r.Run(*addr); err != nil {
log.Fatalf("启动失败: %v", err)
}
}
// newRouter 组装 Admin 的模板、静态文件和路由。
// 单独提成函数是为了让页面冒烟测试无需真的占用 TCP 端口。
func newRouter(db *sql.DB) (*gin.Engine, error) {
r := gin.New()
r.Use(gin.Logger(), gin.Recovery())
// 模板:每个文件用 {{define "目录/名字"}} 声明自己的名字,
// 所以一次全部解析进来不会冲突。
tmpl, err := template.ParseFS(templateFS, "templates/*/*.html")
if err != nil {
return nil, fmt.Errorf("解析模板失败: %w", err)
}
r.SetHTMLTemplate(tmpl)
// 静态文件
staticSub, err := fs.Sub(staticFS, "static")
if err != nil {
return nil, fmt.Errorf("准备静态文件失败: %w", err)
}
r.StaticFS("/static", http.FS(staticSub))
// 4. 路由
web.Register(r, db, config.OnlineThreshold) // 给浏览器的页面
api.Register(r, db) // 给 Client 的接口
return r, nil
}