feat: 认证简化为固定进入密钥 + 页面增强(API 文档/主题切换/版权署名)

- 移除管理员初始化/登录/JWT 流程,改为固定进入密钥(19735500),
  首次启动自动初始化到数据库 settings 表(可改库更新)
- analyze 接口支持可选密钥鉴权:X-Access-Key 请求头或 access_key 字段,
  带密钥强制校验(错误 401),不带密钥保持免鉴权
- 解锁后顶栏"复制 API 文档"按钮:以当前访问 URL 为基础地址动态生成
  Markdown 文档(免鉴权/带密钥两种 curl 示例,供智能体直接调用)
- 白昼/黑夜主题切换:CSS 变量驱动,localStorage 持久化,默认跟随系统
- 修复 hidden 属性被 display:flex 覆盖导致解锁层无法隐藏的问题
- 页面去除"免费/Agnes"文案,页脚署名青梧映星软件开发工作室
- build.bat/build.sh 简化为 Linux 交叉编译(CGO_ENABLED=0)
- 依赖精简:移除 golang-jwt/bcrypt,直接依赖仅 gin/sqlite/gorm/yaml

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-08-13 01:21:18 +08:00
parent a3bbf33358
commit f9cdeb5d64
20 changed files with 341 additions and 465 deletions

View File

@@ -5,7 +5,6 @@ import (
"net/http"
"path/filepath"
"strings"
"time"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
@@ -14,23 +13,20 @@ import (
"vision-tool/internal/handler"
"vision-tool/internal/middleware"
"vision-tool/internal/model"
"vision-tool/internal/repository"
"vision-tool/internal/service"
)
// Setup 构建路由,并完成分层依赖注入:
// db → repository → service → handler → router。
// Setup 构建路由,并完成分层依赖注入。
// webFS 为 //go:embed web 的嵌入文件系统,用于内嵌前端。
func Setup(cfg *config.Config, db *gorm.DB, webFS fs.FS) *gin.Engine {
r := gin.New()
r.Use(gin.Logger(), gin.Recovery(), middleware.CORS())
// ---------- 分层依赖注入 ----------
userRepo := repository.NewUserRepository(db)
authSvc := service.NewAuthService(userRepo, cfg.JWT.Secret, time.Duration(cfg.JWT.ExpireHours)*time.Hour)
accessSvc := service.NewAccessService(db)
visionSvc := service.NewVisionService(&cfg.AI)
authH := handler.NewAuthHandler(authSvc)
visionH := handler.NewVisionHandler(visionSvc, cfg.Upload)
authH := handler.NewAuthHandler(accessSvc)
visionH := handler.NewVisionHandler(visionSvc, accessSvc, cfg.Upload)
// 识别接口免鉴权,用令牌桶限流防刷
analyzeLimiter := middleware.NewRateLimiter(10, 20)
@@ -43,13 +39,8 @@ func Setup(cfg *config.Config, db *gorm.DB, webFS fs.FS) *gin.Engine {
v1 := api.Group("/v1")
{
// 管理员初始化(方式 A:check + init)
v1.GET("/admin/check", authH.Check)
v1.POST("/admin/init", authH.Init)
// 认证
v1.POST("/auth/login", authH.Login)
v1.GET("/user/profile", middleware.JWTAuth(cfg.JWT.Secret), authH.Profile)
// 进入密钥校验(固定密钥,初始化在数据库)
v1.POST("/auth/verify", authH.Verify)
// 在线图片识别(免鉴权 + 限流)
v1.POST("/vision/analyze", analyzeLimiter.Middleware(), visionH.Analyze)