Files
portal_page/handlers/settings.go
T
kevin c16a8dfbc4 feat: 门户网站初始提交
- Go + Gin + html/template 服务端渲染
- 主页:Google 风格搜索框 + 导航卡片
- 后台:卡片 CRUD、搜索引擎配置、主页背景/标题配置
- 图片上传:支持 jpg/jpeg/png/gif,自动压缩,缩略图参数 ?thumb=1
- 安全:登录日志、修改密码、IP 自动封禁、IP 白名单
- 访问统计:主页访问/卡片点击/搜索追踪、实时流量、IP 统计
- SQLite 存储(modernc.org/sqlite,纯 Go)
- 内存 Session + bcrypt 密码哈希
2026-05-28 13:54:07 +08:00

142 lines
4.2 KiB
Go

package handlers
import (
"net/http"
"strings"
"simple_portal/models"
"github.com/gin-gonic/gin"
)
// SettingsGet renders the admin settings page.
func SettingsGet(c *gin.Context) {
username, _ := c.Get("username")
searchEngine, err := models.GetSetting(models.SettingKeySearchEngine)
if err != nil {
searchEngine = models.SearchEngineGoogle
}
if searchEngine == "" {
searchEngine = models.SearchEngineGoogle
}
engines := map[string]string{
"Google": models.SearchEngineGoogle,
"Bing": models.SearchEngineBing,
"百度": models.SearchEngineBaidu,
}
// Fetch homepage configuration
homepageTitle, _ := models.GetSetting(models.SettingKeyHomepageTitle)
if homepageTitle == "" {
homepageTitle = models.DefaultHomepageTitle
}
homepageSubtitle, _ := models.GetSetting(models.SettingKeyHomepageSubtitle)
homepageBackground, _ := models.GetSetting(models.SettingKeyHomepageBackground)
c.HTML(http.StatusOK, "admin/settings.html", gin.H{
"Title": "设置",
"Username": username,
"SearchEngine": searchEngine,
"Engines": engines,
"HomepageTitle": homepageTitle,
"HomepageSubtitle": homepageSubtitle,
"HomepageBackground": homepageBackground,
})
}
// SettingsPost handles the settings form submission.
func SettingsPost(c *gin.Context) {
username, _ := c.Get("username")
searchEngine := c.PostForm("search_engine")
customURL := c.PostForm("custom_url")
// 如果用户填写了自定义URL,优先使用
if customURL != "" {
if !strings.Contains(customURL, "%s") {
engines := map[string]string{
"Google": models.SearchEngineGoogle,
"Bing": models.SearchEngineBing,
"百度": models.SearchEngineBaidu,
}
homepageTitle := c.PostForm("homepage_title")
if homepageTitle == "" {
homepageTitle = models.DefaultHomepageTitle
}
homepageSubtitle := c.PostForm("homepage_subtitle")
homepageBackground := c.PostForm("homepage_background")
c.HTML(http.StatusOK, "admin/settings.html", gin.H{
"Title": "设置",
"Username": username,
"SearchEngine": searchEngine,
"Engines": engines,
"HomepageTitle": homepageTitle,
"HomepageSubtitle": homepageSubtitle,
"HomepageBackground": homepageBackground,
"Error": "自定义 URL 必须包含 %s 作为搜索词占位符",
})
return
}
searchEngine = customURL
}
if searchEngine == "" {
searchEngine = models.SearchEngineGoogle
}
// Save search engine setting
if err := models.SetSetting(models.SettingKeySearchEngine, searchEngine); err != nil {
engines := map[string]string{
"Google": models.SearchEngineGoogle,
"Bing": models.SearchEngineBing,
"百度": models.SearchEngineBaidu,
}
homepageTitle := c.PostForm("homepage_title")
if homepageTitle == "" {
homepageTitle = models.DefaultHomepageTitle
}
homepageSubtitle := c.PostForm("homepage_subtitle")
homepageBackground := c.PostForm("homepage_background")
c.HTML(http.StatusOK, "admin/settings.html", gin.H{
"Title": "设置",
"Username": username,
"SearchEngine": searchEngine,
"Engines": engines,
"HomepageTitle": homepageTitle,
"HomepageSubtitle": homepageSubtitle,
"HomepageBackground": homepageBackground,
"Error": "保存失败,请重试",
})
return
}
// Save homepage settings
homepageTitle := c.PostForm("homepage_title")
if homepageTitle == "" {
homepageTitle = models.DefaultHomepageTitle
}
homepageSubtitle := c.PostForm("homepage_subtitle")
homepageBackground := c.PostForm("homepage_background")
if err := models.SetSetting(models.SettingKeyHomepageTitle, homepageTitle); err != nil {
c.Redirect(http.StatusFound, "/admin/settings")
return
}
if err := models.SetSetting(models.SettingKeyHomepageSubtitle, homepageSubtitle); err != nil {
c.Redirect(http.StatusFound, "/admin/settings")
return
}
if err := models.SetSetting(models.SettingKeyHomepageBackground, homepageBackground); err != nil {
c.Redirect(http.StatusFound, "/admin/settings")
return
}
// 保存成功后重定向,利用 PRG 模式
c.Redirect(http.StatusFound, "/admin/settings")
}