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

@@ -12,7 +12,7 @@
- 🖼️ 多图对比、base64 直传(无需图床/公网 URL)
- 🔁 指数退避自动重试(429/5xx:2s → 5s → 8s → 11s)
- 🔧 配置:命令行 > 环境变量 > config.yaml > 内置默认
- 🔒 JWT 登录 + 管理员初始化(脚手架模板能力)
- 🔑 固定进入密钥(默认 `19735500`),密钥初始化到数据库,页面解锁后使用
## 🚀 快速开始
@@ -32,7 +32,7 @@ go run . # 或 ./vision-tool.exe
# 打开 http://localhost:8080
```
1. 首次访问:初始化管理员账号(右上角)
1. 输入进入密钥(默认 `19735500`,存于数据库,可改库更新)解锁页面
2. 拖拽或点击选择图片(可多张)
3. (可选)输入自定义提问
4. 点击「开始识别」→ 得到识别结果,可一键复制
@@ -57,14 +57,21 @@ Claude Code 在线调用方式:粘贴图片后执行
统一响应格式:`{code, message, data}`(`code=0` 为成功)
### 在线图片识别(免鉴权 + 限流)
### 在线图片识别(免鉴权或带密钥,限流防刷)
```bash
# 免鉴权调用
curl -F "images=@a.png" -F "images=@b.png" \
-F "prompt=比较这两张图的异同" \
http://localhost:8080/api/v1/vision/analyze
# 带密钥调用(可选,密钥错误返回 401)
curl -H "X-Access-Key: 19735500" -F "images=@photo.png" \
http://localhost:8080/api/v1/vision/analyze
```
鉴权规则:请求头 `X-Access-Key`(或表单字段 `access_key`)提供密钥时强制校验,不提供则放行。
响应:
```json
@@ -84,11 +91,8 @@ curl -F "images=@a.png" -F "images=@b.png" \
| 接口 | 方法 | 说明 |
|---|---|---|
| `/api/health` | GET | 健康检查 |
| `/api/v1/admin/check` | GET | 管理员是否已初始化 |
| `/api/v1/admin/init` | POST | 初始化管理员 `{username, password}` |
| `/api/v1/auth/login` | POST | 登录 `{username, password}` → `{token}` |
| `/api/v1/user/profile` | GET | 当前用户信息(需 `Authorization: Bearer <token>`) |
| `/api/v1/vision/analyze` | POST | 图片识别(multipart:`images` × 1-N + 可选 `prompt`) |
| `/api/v1/auth/verify` | POST | 校验进入密钥 `{key}` → `{ok}`(密钥存于数据库) |
| `/api/v1/vision/analyze` | POST | 图片识别(multipart:`images` × 1-N + 可选 `prompt`;可选 `X-Access-Key` 密钥鉴权) |
| `/uploads/*` | GET | 上传图片静态访问 |
## ⚙️ 配置(config.yaml)
@@ -100,9 +104,8 @@ database:
driver: sqlite # 当前仅 sqlite(pure-go,无需 CGO)
path: ./data/app.db
auto_migrate: true
jwt:
secret: "change-me-in-production"
expire_hours: 720
auth:
access_key: "19735500" # 进入密钥,首次启动初始化到数据库(可改库更新)
upload:
path: uploads
max_size: 10485760 # 10MB
@@ -125,12 +128,11 @@ vision-tool/
│ └── vision-cli/ # 独立 CLI 工具(打包为单个二进制)
├── internal/
│ ├── config/ # 配置加载(yaml + 环境变量覆盖)
│ ├── database/ # GORM + SQLite 初始化 + AutoMigrate
│ ├── database/ # GORM + SQLite 初始化 + AutoMigrate + 密钥种子数据
│ ├── model/ # 数据模型 + 统一响应格式
│ ├── repository/ # 数据访问层
│ ├── service/ # 业务逻辑(auth / vision 免费模型调用)
│ ├── service/ # 业务逻辑(密钥校验 / vision 免费模型调用)
│ ├── handler/ # HTTP 处理器
│ ├── middleware/ # CORS / JWT / 令牌桶限流
│ ├── middleware/ # CORS / 令牌桶限流
│ └── router/ # 路由注册 + 前端内嵌 + SPA 回退
└── web/ # 原生单页(在线图片识别,内嵌进二进制)
├── index.html