Commit Graph

66 Commits

Author SHA1 Message Date
mediabot-pt
a45650f480 feat: 新增异常日志收集功能,mediabot 可提交运行时异常,管理端可查看 2026-07-01 00:14:07 +08:00
mediabot-pt
2d8fce78ea feat: 合并配置审核到适配验证页,支持版本切换、编辑、审批/拒绝 2026-06-30 23:14:16 +08:00
mediabot-pt
bf9ad010a1 refactor: 适配校验改为站点汇总+适配器页面批量校验模式 2026-06-30 23:01:49 +08:00
mediabot-pt
0568923ce9 refactor: 访问结果内容改用七牛云/本地存储,与 config 文件存储方式一致 2026-06-30 22:41:15 +08:00
mediabot-pt
83e150b8c9 feat: 新增适配验证接口,mediabot 可提交站点访问结果,管理员可校验适配是否正确 2026-06-30 22:36:45 +08:00
mediabot-pt
7a53bdecb9 feat: 接收并保存提交的siteType,审核通过时使用 2026-06-30 14:22:18 +08:00
mediabot-pt
9be2d0313a fix: 审核通过时发送 names[]/urls[] 数组,列表正确显示多名称多地址 2026-06-30 14:09:40 +08:00
mediabot-pt
9231b90a30 fix: Manifest 接口也返回 names[]/urls[] 数组 + 文档同步 2026-06-30 13:50:06 +08:00
mediabot-pt
04f4af1f2c feat: 站点提交/返回统一支持多名称多地址数组
- POST /sites/{id}/submit: names[]/urls[] 数组,兼容旧 name/baseUrl 单值
- 已有站点合并新名称/地址(去重+前置)
- 站点列表返回 names[]/urls[]
- API 文档和代码示例同步更新
2026-06-30 13:47:56 +08:00
mediabot-pt
08b5040c74 feat: 站点名称/地址支持多值编辑,动态增删
- Sites.vue: 名称和地址改为动态列表 + 增删按钮
- SiteController: updateSite 接受 names[]/urls[] 数组
- SiteServiceImpl: 更新时直接覆盖整个名称/地址列表
2026-06-30 13:17:06 +08:00
mediabot-pt
e009d53cad feat: 站点审核通过时弹出编辑框,支持审核者修改数据后再通过
- SiteReview.vue: 「通过」打开编辑弹窗,可改名称/地址/类型/状态/备注
- AdminController: approveChange 接受 request body(编辑数据)
- SiteService.approveChange: 优先用审核者编辑数据,否则用原始提交
- 拒绝保持原逻辑直接拒绝
2026-06-30 13:00:05 +08:00
mediabot-pt
9b5ad7cc03 feat: 站点编辑增加状态字段 active/deprecated 切换 2026-06-30 12:30:06 +08:00
mediabot-pt
88728ce2c2 feat: API 访问日志系统(拦截器 + 统计分析 + 管理页面)
- V6: api_access_logs 表(method/path/email/IP/status/耗时/错误)
- ApiLogInterceptor: 记录所有 /api/v1/** 请求,order(0) 最优先
- ApiLogController: 分页查询 + 按邮箱/路径统计(24h 窗口)
- 前端 ApiLogs.vue: 筛选/统计面板/日志列表/分页
- 导航新增「访问日志」菜单项
2026-06-30 11:32:50 +08:00
mediabot-pt
8d8e066e6d feat: Flyway 启动自动 repair → migrate,应用自愈失败迁移记录
- FlywayConfig: 自定义 FlywayMigrationStrategy
- 启动时先 flyway.repair() 清理残留失败记录
- 再 flyway.migrate() 执行待迁移
- 全程应用内完成,无需外部操作
2026-06-30 10:44:41 +08:00
mediabot-pt
da79a2dd70 fix: 使用 Flyway repair-on-migrate 清理残留失败迁移记录 2026-06-30 10:02:31 +08:00
mediabot-pt
56e2615624 feat: 待审核变更支持手动搜索匹配已有站点 2026-06-30 09:09:24 +08:00
mediabot-pt
d504649100 fix: SiteController.submitSiteInfo 返回类型改为 Map(不再返回SiteDTO) 2026-06-30 09:05:15 +08:00
mediabot-pt
a7eb63ce1b refactor: site_change_log 重命名为 site_changes,更准确表达待审核+已变更 2026-06-30 09:03:58 +08:00
mediabot-pt
39af3dc034 refactor: site_submissions 重命名为 site_change_log,更通用的变更记录表 2026-06-30 09:02:09 +08:00
mediabot-pt
a6bfc69000 feat: 站点管理支持按站点查看变更(审核)记录 2026-06-30 08:58:39 +08:00
mediabot-pt
657e0c1a78 feat: 新增 site_submissions 审核表, 提交先进审核再写入sites 2026-06-30 08:57:10 +08:00
mediabot-pt
aa1e3e9b28 feat: sites表支持多名称/多地址(names/urls JSON列), DTO/Service/前端全部适配 2026-06-30 08:53:22 +08:00
mediabot-pt
b37b5cc5de fix: 站点管理改用admin全量接口, 显示待审核站点并提供通过/拒绝 2026-06-30 08:44:46 +08:00
mediabot-pt
550535f882 fix: 站点编辑实现编辑弹窗+PUT端点, 配置查看修复(加载失败)改用/content端点+DTO加submitterId 2026-06-30 00:32:14 +08:00
mediabot-pt
48d0e6a247 feat: 新增 /api/v1/sites/{siteId}/info 站点信息反馈接口, 支持多名称/多地址/状态/备注 2026-06-30 00:16:05 +08:00
mediabot-pt
7c7fe0405a fix: manifest 只返回 ACTIVE 状态的站点 2026-06-29 23:35:48 +08:00
mediabot-pt
b829fc68fe feat: 站点提交改为待审核(pending),管理员审核通过/拒绝
- submitSite: 新站点 status=PENDING
- AdminController: GET /admin/sites/pending, POST /admin/sites/{id}/approve|reject
- reject 物理删除站点记录
2026-06-29 23:34:14 +08:00
mediabot-pt
d1445d3920 fix: 下载配置接口加null检查,前端去掉responseType:text让axios自动解析 2026-06-29 23:25:26 +08:00
mediabot-pt
b806a01f13 feat: 审核通过移动文件到approved,拒绝删除pending文件
- StorageService 新增 delete()
- approve: 文件 pending → approved
- reject: 删除 pending 文件
2026-06-29 23:21:44 +08:00
mediabot-pt
7d7de75bbd refactor: 文件路径按pending/approved区分,去掉版本号
- submit: configs/{siteId}/pending/{hash}.json
- approve: 文件移到 configs/{siteId}/approved/{hash}.json
2026-06-29 23:20:14 +08:00
mediabot-pt
d093c5eb28 refactor: 存储模式动态检查环境变量,改PAR_STORAGE_TYPE无需重启
- CachedStorageService 每次调用读 PAR_STORAGE_TYPE 环境变量
- QiniuStorageService 首次调用懒初始化,读 QINIU_* 环境变量
- 去掉 @ConditionalOnProperty/@ConditionalOnMissingBean
2026-06-29 23:13:38 +08:00
mediabot-pt
cd78cfbf88 fix: 七牛读取改用公开URL HTTP GET,不依赖SDK私有API 2026-06-29 23:05:07 +08:00
mediabot-pt
41f3a15ddd refactor: 版本号由PAR审核通过时自动分配
- submitConfig: 不再比较版本号,相同hash跳过,不同hash都插入pending
- approveConfig: 自动取最大版本号+1 分配(如 1, 2, 3...)
- 存储路径含hash前缀避免同名冲突
2026-06-29 23:02:30 +08:00
mediabot-pt
f351d71d18 feat: 七牛云存储支持(本地缓存/备份)
- StorageService 抽象层(store/read/exists)
- QiniuStorageService: 七牛云主存储(@ConditionalOnProperty)
- LocalStorageService: 本地文件存储(默认/@ConditionalOnMissingBean)
- CachedStorageService: 七牛主+本地缓存(写:七牛→本地, 读:本地→七牛)
- 配置: PAR_STORAGE_TYPE=qiniu + QINIU_AK/SK/BUCKET/REGION
- 不配七牛时自动降级到纯本地存储
2026-06-29 22:58:32 +08:00
mediabot-pt
377aa90c96 fix: 配置文件路径改为 ./data/static(容器内可写) 2026-06-29 22:50:14 +08:00
mediabot-pt
64c2ec7700 fix: 配置提交500 — 修正静态文件路径 + 启动时创建目录
- par.static.path 默认 ./static(不再重复 configs/)
- @PostConstruct 确保 static/configs 目录存在
- submitConfig 异常时详细日志
2026-06-29 22:49:48 +08:00
mediabot-pt
6412026c69 fix: @PathVariable 显式指定参数名,兼容无 -parameters 编译 2026-06-29 22:43:56 +08:00
mediabot-pt
8565629a80 fix: 恢复 V1 原样,site_type 改动迁移到 V5
- V1: 恢复到原始 DEFAULT 'private' + 原始注释
- V5: ALTER TABLE sites MODIFY site_type DEFAULT 'unknown'
- 彻底解决 Flyway checksum 冲突,不改 flyway_schema_history
2026-06-29 21:33:34 +08:00
mediabot-pt
23fc6375fd fix: Flyway 关闭 validate-on-migrate 避免 V1 checksum 冲突 2026-06-29 21:22:44 +08:00
mediabot-pt
cbf5684abc feat: Manifest 接口支持 ETag 条件请求
- ETag = SHA256(所有 siteId + configHash 拼接)
- 客户端传 If-None-Match 命中返回 304 无数据
- 替代新增 /latest 接口,同一端点高效轮询
2026-06-29 17:21:22 +08:00
mediabot-pt
4ba9ade790 feat: 添加 GET /api/v1/time 基准时间接口
- 返回服务端 Unix 时间戳(秒)
- 客户端签名前调用此接口获取 timestamp
- 避免跨服务器时钟偏差导致 PSK 签名过期
2026-06-29 17:07:29 +08:00
mediabot-pt
bb96062b7c fix: 安全加固 — HMAC_SECRET 启动检查 + 登录锁定 + PSK 窗口配置
- SecurityCheck: 启动时 HMAC_SECRET 为空输出 ERROR 日志
- AccountServiceImpl: Caffeine 缓存实现登录失败计数/锁定
  (par.security.login-max-failures=5, login-lock-minutes=30)
- PskService: pskWindowSeconds 从 application.yml 读取
- AdminController: 清理重复 import
2026-06-29 17:05:43 +08:00
mediabot-pt
ae8d0ed7d2 refactor: PSK 签名改为 METHOD:path:timestamp 格式
- 签名内容不再包含 email,email 仅作审计
- 改用 METHOD:path:timestamp 防重放到不同端点
- X-Email 头改为可选
- medibot 签名: HMAC(PSK, 'POST:/api/v1/sites/x/submit:1234567890')
2026-06-29 16:58:56 +08:00
mediabot-pt
311ead0e89 refactor: 彻底移除 apiSecret 认证方式,仅保留 Bearer + PSK
删除:
- HmacUtil: deriveApiKey/deriveApiSecret/verifyMediabotPsk
- HmacAuthInterceptor: apiSecret 验签/自动创建账户/readBody
- AccountService: generateApiCredentials/registerByInterceptor
- AccountDTO: apiKey 字段
- AuthController: register 返回 apiSecret
- AdminController: generateApiKey 端点
- Users.vue: API Key 列/生成密钥弹窗
- api/index.js: genApiKey

认证方式简化为两种:
  Bearer Token → Web 管理后台
  PSK 签名    → 外部集成客户端
2026-06-29 16:56:00 +08:00
mediabot-pt
5304449de6 feat: PSK 版本化管理 + DB 表 + 管理后台增删启禁
- V4 迁移: psks 表 (version, secret, description, is_active)
- PskService: 启动导入 PAR_MEDIABOT_PSK → v1, verify 遍历所有活跃 PSK
- HmacAuthInterceptor: PSK 签名优先验签,精简为 Bearer/PSK 双路径
- AdminController: GET/POST /psks + toggle 启禁
- AuthController: register/recover 改用 PskService 验证
- docker-compose.yml 新增 PAR_MEDIABOT_PSK 环境变量

mediabot 端只需: X-Signature = HMAC(PSK, 'email:ts')
2026-06-29 16:52:20 +08:00
mediabot-pt
11d0840e42 feat: Mediabot PSK 签名恢复 + 注册自动提权
- par.mediabot.psk 配置项(环境变量 PAR_MEDIABOT_PSK)
- HmacUtil.verifyMediabotPsk() PSK 签名验证
- POST /auth/recover: PSK 签名 → 返回/重建 apiKey/apiSecret → 自动 TRUSTED
- POST /auth/register: 携带 PSK 头 → 自动提升为 TRUSTED
- AccountService 新增 updateAccount

mediabot 端只需:
  const PSK = '内置密钥'
  sig = HMAC('email:timestamp', PSK)
  POST /auth/recover {email} + X-Medibot-* 头 → 拿回凭据
2026-06-29 16:44:59 +08:00
mediabot-pt
26c686fa69 feat: 注册时自动生成 API Key,mediabot 自注册即可获得凭据
- AccountService.register() 自动生成 api_key + api_secret
- POST /auth/register 返回 apiKey + apiSecret(一次性)
- POST /auth/login 返回 apiKey(不含 secret)
- V3 迁移自动为已有管理员生成 key

mediabot 集成流程:
  1. POST /auth/register → 得到 apiKey + apiSecret → 保存
  2. 管理员在后台提升 trustLevel 为 TRUSTED
  3. 用 apiKey/apiSecret 做 HMAC 签名调用写入接口
2026-06-29 16:34:39 +08:00
mediabot-pt
2d91552ea4 feat: API Key 静默认证 + 多邮箱支持
核心改动:
- V3 迁移: accounts 加 api_key/api_secret + account_emails 多邮箱关联表
- HMAC 验签改用 api_secret 替代密码哈希(改密码不影响集成)
- findByAnyEmail 支持主邮箱 + 关联邮箱查找
- AdminController: API Key 生成/重置 + 邮箱绑定/解绑/列表
- 前端 Users.vue: API Key 列 + 生成按钮 + Secret 复制弹窗
- 现有邮箱自动迁移到 account_emails 表

认证流程:
  旧: X-Email → account.email → passwordHash 作 HMAC key
  新: X-Email → account_emails ∪ account.email → api_secret 作 HMAC key
2026-06-29 16:30:53 +08:00
mediabot-pt
c4877f983a feat: 添加站点收录提交接口 POST /api/v1/sites/{siteId}/submit
- 支持创建新站点或更新已有站点
- HMAC 签名鉴权保护
- Swagger 文档同步可见
2026-06-29 15:09:40 +08:00
mediabot-pt
20a8983afb chore: Swagger 文档隐藏管理后台接口,仅暴露集成端点 2026-06-29 14:54:06 +08:00