支持内嵌前端页面,新增配置项 web.path

This commit is contained in:
2026-01-26 23:03:04 +08:00
parent 950a9aef9d
commit ca67914cb5
5 changed files with 46 additions and 4 deletions

View File

@@ -20,6 +20,7 @@ type Config struct {
Admin AdminConfig `mapstructure:"admin"`
Token TokenConfig `mapstructure:"token"`
Feature FeatureConfig `mapstructure:"feature"`
Web WebConfig `mapstructure:"web"`
}
type ServerConfig struct {
@@ -89,6 +90,10 @@ type FeatureConfig struct {
WriteDailyFiles bool `mapstructure:"write_daily_files"`
}
type WebConfig struct {
Path string `mapstructure:"path"`
}
// Bing 默认配置 (内置)
const (
BingMkt = "zh-CN"
@@ -125,6 +130,7 @@ func Init(configPath string) error {
v.SetDefault("storage.local.root", "data/picture")
v.SetDefault("token.default_ttl", "168h")
v.SetDefault("feature.write_daily_files", true)
v.SetDefault("web.path", "web")
v.SetDefault("admin.password_bcrypt", "$2a$10$fYHPeWHmwObephJvtlyH1O8DIgaLk5TINbi9BOezo2M8cSjmJchka") // 默认密码: admin123
if err := v.ReadInConfig(); err != nil {
@@ -176,6 +182,7 @@ func SaveConfig(cfg *Config) error {
v.Set("admin", cfg.Admin)
v.Set("token", cfg.Token)
v.Set("feature", cfg.Feature)
v.Set("web", cfg.Web)
return v.WriteConfig()
}

View File

@@ -1,9 +1,15 @@
package http
import (
"net/http"
"os"
"path/filepath"
_ "BingPaper/docs"
"BingPaper/internal/config"
"BingPaper/internal/http/handlers"
"BingPaper/internal/http/middleware"
"BingPaper/web"
"github.com/gin-gonic/gin"
swaggerFiles "github.com/swaggo/files"
@@ -18,9 +24,28 @@ func SetupRouter() *gin.Engine {
// 静态文件
r.Static("/static", "./static")
r.StaticFile("/", "./web/index.html")
r.StaticFile("/admin", "./web/index.html")
r.StaticFile("/login", "./web/index.html")
webPath := config.GetConfig().Web.Path
indexPath := filepath.Join(webPath, "index.html")
serveIndex := func(c *gin.Context) {
// 1. 优先尝试从配置的路径读取
if _, err := os.Stat(indexPath); err == nil {
c.File(indexPath)
return
}
// 2. 如果外部文件不存在,则使用内置嵌入的文件
data, err := web.FS.ReadFile("index.html")
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "web files not found"})
return
}
c.Data(http.StatusOK, "text/html; charset=utf-8", data)
}
r.GET("/", serveIndex)
r.GET("/admin", serveIndex)
r.GET("/login", serveIndex)
api := r.Group("/api/v1")
{