项目名调整,功能优化

This commit is contained in:
2026-01-26 22:20:27 +08:00
parent c6e5e655f9
commit 50275265ac
25 changed files with 413 additions and 66 deletions

View File

@@ -6,16 +6,16 @@ import (
"log"
"os"
"BingDailyImage/internal/config"
"BingDailyImage/internal/cron"
"BingDailyImage/internal/http"
"BingDailyImage/internal/repo"
"BingDailyImage/internal/service/fetcher"
"BingDailyImage/internal/storage"
"BingDailyImage/internal/storage/local"
"BingDailyImage/internal/storage/s3"
"BingDailyImage/internal/storage/webdav"
"BingDailyImage/internal/util"
"BingPaper/internal/config"
"BingPaper/internal/cron"
"BingPaper/internal/http"
"BingPaper/internal/repo"
"BingPaper/internal/service/fetcher"
"BingPaper/internal/storage"
"BingPaper/internal/storage/local"
"BingPaper/internal/storage/s3"
"BingPaper/internal/storage/webdav"
"BingPaper/internal/util"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
@@ -93,7 +93,7 @@ func LogWelcomeInfo() {
}
fmt.Println("\n---------------------------------------------------------")
fmt.Println(" BingDailyImage 服务已启动!")
fmt.Println(" BingPaper 服务已启动!")
fmt.Printf(" - 首页地址: %s/\n", baseURL)
fmt.Printf(" - 管理后台: %s/admin\n", baseURL)
fmt.Printf(" - API 文档: %s/swagger/index.html\n", baseURL)

View File

@@ -120,7 +120,7 @@ func Init(configPath string) error {
v.SetDefault("cron.daily_spec", "0 10 * * *")
v.SetDefault("retention.days", 30)
v.SetDefault("db.type", "sqlite")
v.SetDefault("db.dsn", "data/bing_daily_image.db")
v.SetDefault("db.dsn", "data/bing_paper.db")
v.SetDefault("storage.type", "local")
v.SetDefault("storage.local.root", "data/picture")
v.SetDefault("token.default_ttl", "168h")

View File

@@ -3,10 +3,10 @@ package cron
import (
"context"
"BingDailyImage/internal/config"
"BingDailyImage/internal/service/fetcher"
"BingDailyImage/internal/service/image"
"BingDailyImage/internal/util"
"BingPaper/internal/config"
"BingPaper/internal/service/fetcher"
"BingPaper/internal/service/image"
"BingPaper/internal/util"
"github.com/robfig/cron/v3"
"go.uber.org/zap"

View File

@@ -6,12 +6,13 @@ import (
"strconv"
"time"
"BingDailyImage/internal/config"
"BingDailyImage/internal/service/fetcher"
"BingDailyImage/internal/service/image"
"BingDailyImage/internal/service/token"
"BingPaper/internal/config"
"BingPaper/internal/service/fetcher"
"BingPaper/internal/service/image"
"BingPaper/internal/service/token"
"github.com/gin-gonic/gin"
"golang.org/x/crypto/bcrypt"
)
type LoginRequest struct {
@@ -109,6 +110,55 @@ type UpdateTokenRequest struct {
Disabled bool `json:"disabled"`
}
type ChangePasswordRequest struct {
OldPassword string `json:"old_password" binding:"required"`
NewPassword string `json:"new_password" binding:"required"`
}
// ChangePassword 修改管理员密码
// @Summary 修改管理员密码
// @Description 验证旧密码并设置新密码,自动更新配置文件
// @Tags admin
// @Security BearerAuth
// @Accept json
// @Produce json
// @Param request body ChangePasswordRequest true "修改密码请求"
// @Success 200 {object} map[string]string
// @Failure 400 {object} map[string]string
// @Failure 401 {object} map[string]string
// @Router /admin/password [post]
func ChangePassword(c *gin.Context) {
var req ChangePasswordRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request"})
return
}
cfg := config.GetConfig()
// 验证旧密码
err := bcrypt.CompareHashAndPassword([]byte(cfg.Admin.PasswordBcrypt), []byte(req.OldPassword))
if err != nil {
c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid old password"})
return
}
// 生成新密码 Hash
hash, err := bcrypt.GenerateFromPassword([]byte(req.NewPassword), bcrypt.DefaultCost)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to hash password"})
return
}
// 更新配置
cfg.Admin.PasswordBcrypt = string(hash)
if err := config.SaveConfig(cfg); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to save config"})
return
}
c.JSON(http.StatusOK, gin.H{"status": "ok", "message": "password updated successfully"})
}
// UpdateToken 更新 Token 状态
// @Summary 更新 Token 状态
// @Description 启用或禁用指定的 API Token

View File

@@ -6,10 +6,10 @@ import (
"io"
"net/http"
"BingDailyImage/internal/config"
"BingDailyImage/internal/model"
"BingDailyImage/internal/service/image"
"BingDailyImage/internal/storage"
"BingPaper/internal/config"
"BingPaper/internal/model"
"BingPaper/internal/service/image"
"BingPaper/internal/storage"
"github.com/gin-gonic/gin"
)

View File

@@ -4,7 +4,7 @@ import (
"net/http"
"strings"
"BingDailyImage/internal/service/token"
"BingPaper/internal/service/token"
"github.com/gin-gonic/gin"
)

View File

@@ -1,9 +1,9 @@
package http
import (
_ "BingDailyImage/docs"
"BingDailyImage/internal/http/handlers"
"BingDailyImage/internal/http/middleware"
_ "BingPaper/docs"
"BingPaper/internal/http/handlers"
"BingPaper/internal/http/middleware"
"github.com/gin-gonic/gin"
swaggerFiles "github.com/swaggo/files"
@@ -50,6 +50,8 @@ func SetupRouter() *gin.Engine {
authorized.PATCH("/tokens/:id", handlers.UpdateToken)
authorized.DELETE("/tokens/:id", handlers.DeleteToken)
authorized.POST("/password", handlers.ChangePassword)
authorized.GET("/config", handlers.GetConfig)
authorized.PUT("/config", handlers.UpdateConfig)

View File

@@ -1,9 +1,9 @@
package repo
import (
"BingDailyImage/internal/config"
"BingDailyImage/internal/model"
"BingDailyImage/internal/util"
"BingPaper/internal/config"
"BingPaper/internal/model"
"BingPaper/internal/util"
"fmt"
"go.uber.org/zap"

View File

@@ -13,11 +13,11 @@ import (
"path/filepath"
"time"
"BingDailyImage/internal/config"
"BingDailyImage/internal/model"
"BingDailyImage/internal/repo"
"BingDailyImage/internal/storage"
"BingDailyImage/internal/util"
"BingPaper/internal/config"
"BingPaper/internal/model"
"BingPaper/internal/repo"
"BingPaper/internal/storage"
"BingPaper/internal/util"
"github.com/chai2010/webp"
"github.com/disintegration/imaging"

View File

@@ -5,11 +5,11 @@ import (
"fmt"
"time"
"BingDailyImage/internal/config"
"BingDailyImage/internal/model"
"BingDailyImage/internal/repo"
"BingDailyImage/internal/storage"
"BingDailyImage/internal/util"
"BingPaper/internal/config"
"BingPaper/internal/model"
"BingPaper/internal/repo"
"BingPaper/internal/storage"
"BingPaper/internal/util"
"go.uber.org/zap"
)

View File

@@ -6,9 +6,9 @@ import (
"errors"
"time"
"BingDailyImage/internal/config"
"BingDailyImage/internal/model"
"BingDailyImage/internal/repo"
"BingPaper/internal/config"
"BingPaper/internal/model"
"BingPaper/internal/repo"
"golang.org/x/crypto/bcrypt"
)
@@ -51,7 +51,21 @@ func Login(password string) (*model.Token, error) {
}
ttl := config.GetTokenTTL()
return CreateToken("login-token", time.Now().Add(ttl))
expiresAt := time.Now().Add(ttl)
name := "login-token"
// 如果已存在同名 token则刷新时间并返回
var t model.Token
if err := repo.DB.Where("name = ?", name).First(&t).Error; err == nil {
t.ExpiresAt = expiresAt
t.Disabled = false
if err := repo.DB.Save(&t).Error; err != nil {
return nil, err
}
return &t, nil
}
return CreateToken(name, expiresAt)
}
func ListTokens() ([]model.Token, error) {

View File

@@ -6,7 +6,7 @@ import (
"os"
"path/filepath"
"BingDailyImage/internal/storage"
"BingPaper/internal/storage"
)
type LocalStorage struct {

View File

@@ -6,7 +6,7 @@ import (
"io"
"strings"
"BingDailyImage/internal/storage"
"BingPaper/internal/storage"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"

View File

@@ -7,7 +7,7 @@ import (
"path"
"strings"
"BingDailyImage/internal/storage"
"BingPaper/internal/storage"
"github.com/studio-b12/gowebdav"
)