- Go + Gin + html/template 服务端渲染 - 主页:Google 风格搜索框 + 导航卡片 - 后台:卡片 CRUD、搜索引擎配置、主页背景/标题配置 - 图片上传:支持 jpg/jpeg/png/gif,自动压缩,缩略图参数 ?thumb=1 - 安全:登录日志、修改密码、IP 自动封禁、IP 白名单 - 访问统计:主页访问/卡片点击/搜索追踪、实时流量、IP 统计 - SQLite 存储(modernc.org/sqlite,纯 Go) - 内存 Session + bcrypt 密码哈希
142 lines
4.2 KiB
Go
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")
|
|
}
|