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