- 移除管理员初始化/登录/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>
65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
package database
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"path/filepath"
|
||
|
||
"github.com/glebarez/sqlite"
|
||
"gorm.io/gorm"
|
||
"gorm.io/gorm/logger"
|
||
|
||
"vision-tool/internal/config"
|
||
"vision-tool/internal/model"
|
||
)
|
||
|
||
// Init 初始化数据库连接,执行 AutoMigrate,并写入初始化数据(进入密钥)。
|
||
// 使用 pure-go 的 glebarez/sqlite 驱动,CGO_ENABLED=0 下可编译运行。
|
||
// seedAccessKey 为空时跳过密钥初始化。
|
||
func Init(cfg *config.DatabaseConfig, seedAccessKey string) (*gorm.DB, error) {
|
||
var db *gorm.DB
|
||
var err error
|
||
|
||
switch cfg.Driver {
|
||
case "sqlite":
|
||
fallthrough
|
||
default:
|
||
if dir := filepath.Dir(cfg.Path); dir != "" {
|
||
if err := os.MkdirAll(dir, 0755); err != nil {
|
||
return nil, fmt.Errorf("创建数据目录: %w", err)
|
||
}
|
||
}
|
||
db, err = gorm.Open(sqlite.Open(cfg.Path), &gorm.Config{
|
||
Logger: logger.Default.LogMode(logger.Warn),
|
||
})
|
||
}
|
||
|
||
if err != nil {
|
||
return nil, fmt.Errorf("连接数据库(%s): %w", cfg.Driver, err)
|
||
}
|
||
|
||
// auto_migrate:自动建表/更新表结构,生产环境建议手动管理
|
||
if cfg.AutoMigrate {
|
||
if err := db.AutoMigrate(&model.Setting{}); err != nil {
|
||
return nil, fmt.Errorf("自动建表: %w", err)
|
||
}
|
||
}
|
||
|
||
// init_data:首次启动写入默认进入密钥(仅当记录不存在时)
|
||
if seedAccessKey != "" {
|
||
var count int64
|
||
if err := db.Model(&model.Setting{}).
|
||
Where("key = ?", model.KeyAccessKey).
|
||
Count(&count).Error; err != nil {
|
||
return nil, fmt.Errorf("检查配置: %w", err)
|
||
}
|
||
if count == 0 {
|
||
if err := db.Create(&model.Setting{Key: model.KeyAccessKey, Value: seedAccessKey}).Error; err != nil {
|
||
return nil, fmt.Errorf("初始化进入密钥: %w", err)
|
||
}
|
||
}
|
||
}
|
||
|
||
return db, nil
|
||
}
|