92 Commits

Author SHA1 Message Date
小鱼开发 c6a40331d4 chore(release): bump version to 1.9.1 and apply pending changes 2026-06-16 15:17:30 +08:00
小鱼开发 923ff63a3d feat: 密码登录功能(验证码/密码双模式 + 忘记密码 + 设置密码)
后端:
- security.py: 新增 bcrypt 密码哈希/校验工具
- auth_service.py: 新增 login_with_password、reset_password_with_sms
- auth.py: 新增 /login-password、/has-password、/set-password、/reset-password 接口
- schemas/auth.py: 新增 PasswordLoginRequest、SetPasswordRequest、ResetPasswordRequest、CheckPasswordResponse
- crud/user.py: 新增 update_password

前端:
- Login.tsx: 支持验证码/密码切换登录,密码模式下显示忘记密码入口
- Login.css: 新增登录方式切换标签、密码输入框样式
- authStore.ts: 新增 loginWithPassword
- Settings.tsx: 新增账号安全区块,显示密码状态,打开设置/修改密码弹窗
- SetPasswordModal.tsx: 设置/修改密码弹窗(旧密码校验、密码显示切换、表单验证)
- ResetPasswordModal.tsx: 忘记密码弹窗(手机号+验证码+新密码重置)

兼容:
- 零数据库迁移,password_hash 字段已存在(nullable)
- 现有接口不变,完全向后兼容旧版本
2026-06-09 23:26:50 +08:00
小鱼开发 aa818b75a8 refactor: 脚本提示词体系重构 — 子类从目录改为单个文件
- 删除 system/bk/ 下所有旧提示词,平铺替换为 23 个新文件
- 文件名格式统一为: 文案——描述.txt
- 后端: _meta.json 扁平化,loader.py 新增 list_prompt_files() + load_prompt_file()
- 后端: API 从 subcategory 改为 filename,按指定文件读取
- 后端: categories 接口返回文件列表(label/desc/filename)供前端展示
- 前端: ScriptCreation 分类选择改为卡片网格,展示文案+描述
- 前端: 清理 subcategoryCode,统一改为 filename
- 前端: 字幕字号调整为 64/96/80px
2026-06-01 13:44:59 +08:00
小鱼开发 63e0ffeaea fix(vidu): 回调签名使用 APP_BASE_URL 构建 URL,添加调试日志
- vidu_callback 改用 APP_BASE_URL 构建 callback_url,避免 Nginx 代理导致 scheme 不一致
- verify_signature 增加详细调试日志,打印 signing_string 和签名对比
2026-05-27 09:34:59 +08:00
小鱼开发 6c64189c70 fix(update): check_update 兼容同平台多包,优先返回 updater 包
- scalar_one_or_none() 在 release_id+platform+architecture 多行时抛异常
- 改为查询全部后取第一个,按 signature desc 排序优先 updater 包
2026-05-26 23:28:09 +08:00
小鱼开发 06ec0ee202 feat: BGM 云端化 + 步骤页面 UI 统一重构
后端:
- 新增 BGM 数据库模型、Schema、CRUD、API 路由
- BgmMusic 增加 url 字段存储七牛云地址
- Alembic 迁移: 创建 BGM 表 + 添加 url 字段
- import_bgm.py 导入时自动上传七牛云 (meijiaka-zy/bgm/...)

前端:
- VideoCompose BGM 选择改为卡片弹窗 (系统BGM + 本地上传)
- 去掉 BGM 硬编码本地路径, 直接使用云端 URL
- CoverDesign 视觉重构: 绿色边框卡片、角标、hover 遮罩
- CoverDesign 去掉预选背景, 默认空白需手动选择
- 所有步骤按钮规范统一: 左=重新生成(主色), 右=导出/预览(次色)
- 预览按钮状态统一: 文字变为'视频预览中...', 保持 btn-secondary
- 去掉所有步骤按钮的 svg/emoji 图标

Rust:
- mix_bgm_to_video 支持临时文件保护 (输入输出同路径时自动中转)
- FFmpeg BGM 混合使用 aloop 循环 + amix 滤镜
2026-05-24 15:39:54 +08:00
小鱼开发 53371aabcd feat(image): 封面形象抠图增加积分消耗(每次 10 积分)
- config/points-config.yaml: 添加 cover_avatar: 10 固定积分
- point_service.py: _CATEGORY_MAP 添加 cover_avatar → 封面形象
- image.py: remove_background 接口前置余额检查 + 后置扣费
- CoverAvatarLibrary.tsx: 上传弹窗显示积分提示,余额不足友好提示
2026-05-23 10:59:47 +08:00
小鱼开发 d18e705a99 feat(image): 抠图增加人物白色描边(need_contour + contour_color + contour_size + need_crop_background)
- provider: 增加 need_contour/contour_color/contour_size/need_crop_background 参数
- service: 默认 scene=human,human/product 场景自动启用白色描边 + 裁剪背景
- adapter: 透传新参数到 provider
- API: scene 默认值改为 human
- 前端: removeBackground 默认 scene 改为 human
2026-05-23 10:04:34 +08:00
小鱼开发 6011225eec fix(image): 抠图结果下载后转存七牛云,解决前端 CORS 跨域加载失败 2026-05-23 09:50:40 +08:00
小鱼开发 430aea4aa8 fix(image): 增强抠图失败时的诊断日志,记录原始响应内容 2026-05-23 09:39:38 +08:00
小鱼开发 8a5f0ace34 fix(update): 204 响应不通过 HTTPException 抛出,避免 Content-Length 校验失败 2026-05-23 09:24:53 +08:00
小鱼开发 f01f2c366a feat(cover-avatar): 封面形象功能
后端:
- 新增 POST /upload/image 图片上传(七牛云 image bucket)
- 新增 POST /image/remove-background AI 抠图(火山引擎 MediaKit)
- 提取 file_validation.py 共享模块

Rust:
- 新增 cover_avatar.rs 存储层(cover_avatars.json + 图片本地存储)
- 新增 4 个 IPC 命令:load/save/delete/save_image

前端:
- 新增 CoverAvatarLibrary 页面(内容管理 → 封面形象)
- 新增 coverAvatar API 模块和 coverAvatarStore
- 封面设计集成:背景图/封面形象弹窗选择 + Fabric.js 叠加
- 优化左侧布局:视觉素材横向卡片(9:16)+ 文案配置分组
2026-05-22 18:38:18 +08:00
小鱼开发 74fd855d33 feat(points): 充值档位添加积分有效期字段
- config/points-config.yaml: 每个档位添加 validity_days(7/30/90/180/365/0)
- points.py: 支付回调和主动查询补单时根据档位配置设置 batch_expired_at
- RechargeModal: 卡片展示有效期(永久有效 / N 天内有效)
2026-05-18 15:26:54 +08:00
小鱼开发 43e736c32d fix(wxpay): 修复微信下单重入错误
out_trade_no 原格式 MJZ{order.id:012d} 在数据库重建后 ID 从 1 重新开始,
导致与微信支付缓存中的历史订单号冲突,触发 INVALID_REQUEST 重入错误。

新格式加入时间戳:MJZ{timestamp}{order.id:08d},确保全局唯一。
2026-05-17 19:39:43 +08:00
小鱼开发 83b10945c8 feat(points): 新增今日消耗接口 + 个人中心字体调整
后端:
- CRUD 新增 sum_consumed_today() 方法,统计用户今日消费积分总和
- API 新增 GET /points/today-consumed 路由

前端:
- 个人中心积分数字从 40px 改为 32px
- 今日消耗从本地计算改为调用后端接口
2026-05-16 09:46:41 +08:00
小鱼开发 95fa5b6fab fix: 将 /health 路由从根路径移到 /api/v1/system/health
- 原 /health 注册在 FastAPI 根应用上,Nginx 代理 /api/v1/ 前缀无法访问
- 移到 system router 下,外部通过 /api/v1/system/health 访问
- 同步更新 docker-compose.test.yml 和 docker-compose.prod.yml 的 healthcheck 路径
2026-05-15 16:56:28 +08:00
小鱼开发 cb56698836 feat: 应用自动更新系统 + 草稿箱删除 + 分类缓存优化
- 新增 Tauri 自动更新(updater 插件)
  - Rust: 集成 tauri-plugin-updater + tauri-plugin-process
  - 后端: app_releases / release_packages 表 + /update/check API
  - 前端: UpdateDialog 组件 + useUpdater hook + SystemUpdate 手动检查
  - 发版脚本: scripts/publish_release.py(扫描 .sig → 上传七牛云 → 写入数据库)
  - 配置 test 环境域名 dev.tapi.meijiaka.cn

- 草稿箱删除功能
  - DraftListItem 添加删除按钮
  - MyWorks 添加删除确认弹窗 + localProjectApi.deleteProject 调用

- 创作主题分类本地缓存
  - scriptApi.getCategoriesCached() 先读 localStorage 再静默刷新

- TermsModal tab 居中

- 更新应用图标(Big Sur 风格圆角矩形)

- 清理: 删除未使用文件 create_user.py / video-replace-mvp.py / DEPS_*.md
2026-05-15 16:41:57 +08:00
小鱼开发 7330fdd401 fix: 生产安全检查 — 鉴权 + 资金安全 + Slot TTL
1. upload.py: /video /audio 端点添加 get_current_user 鉴权
2. caption.py: /ata/align 端点添加 get_current_user 鉴权
3. points.py: allow_negative 硬编码 False,禁止客户端控制欠费
4. slot_manager.py: TTL 1800s → 1200s,减少异常崩溃后的槽位泄漏时间
5. points.py: 顺手修复 ruff UP017(timezone.utc → UTC)
2026-05-14 23:02:40 +08:00
小鱼开发 d4a13ece17 chore: 清理后端未使用 import(9 处)
ruff --select F401 --fix 自动修复:
- deps.py: user_crud
- caption.py: ApiResponse, VolcengineCaptionService
- points.py: UTC
- tasks.py: json
- voice.py: asyncio
- main.py: init_db
- broll_category.py: Text, ARRAY
2026-05-14 22:40:01 +08:00
小鱼开发 689aef0946 refactor: 统一 sourceId 格式规范
规范: <source_type>_<user_id>_<timestamp_ms>

前端 4 处(projectId → userId):
- VideoGeneration: video_${userId}_${Date.now()}
- SubtitleBurning: subtitle_burn_${userId}_${Date.now()}
- VideoCompose: compose_${userId}_${Date.now()}
- CoverDesign: cover_design_${userId}_${Date.now()}

后端 4 处(浮点秒 → 毫秒整数):
- script.py polish: polish_${userId}_${int(time.time()*1000)}
- script.py title: title_${userId}_${int(time.time()*1000)}
- voice.py TTS: tts_${userId}_${int(time.time()*1000)}
- voice.py voice_clone: voice_clone_${userId}_${ts}_${voice_id}
  (原裸传第三方 voice_id,现包装为规范格式)

Refs: P2-1
2026-05-14 21:18:59 +08:00
小鱼开发 7550559aa0 refactor: 清理未使用IPC命令、修正point_service注释与扣费逻辑、修复camelToSnake正则、优化vidu import
- 删除8个未使用IPC命令,保留validate_media_path
- file.rs返回类型优化为ApiResponse<()>
- point_service.consume()注释与签名一致
- VideoGeneration改为拼接成功后扣费
- 添加漏扣费风险注释
- 删除过时测试文件
- 修复camelToSnake连续大写字母问题
- vidu.py import移至模块顶层

Refs: P1-1~P1-6 技术债务清理
2026-05-14 17:45:28 +08:00
小鱼开发 cf1352ed41 fix: TTS合成成功弹窗显示后端实际扣费积分 2026-05-13 17:28:15 +08:00
小鱼开发 6728f9b012 fix: TTS去掉前置积分检查、扣费允许欠费,避免402打断流程 2026-05-13 16:52:57 +08:00
小鱼开发 4579fa78d4 feat: 操作按钮展示积分消耗提示
后端:
- 新增 GET /points/rules 返回积分计费规则列表

前端:
- 各操作按钮添加积分消耗提示:
  - 固定积分: 生成脚本(5)/润色(1)/标题生成(1)/字幕烧录(2)/封面设计(2)/压制成片(5)
  - 按秒计费: 配音合成/视频生成 显示'按秒计费'
2026-05-13 14:52:09 +08:00
小鱼开发 fc4ebb7de0 feat: 封面背景图迁移到数据库,按script_code分类获取
后端:
- 新建 mjk_cover_backgrounds 表(Alembic e02c96e264d9)
- CoverBackground模型/CRUD/Schema/API(GET /cover-backgrounds?script_code=)

前端:
- ScriptCreation保存categoryCode到store和meta.json
- CoverDesign从API获取背景图,替换bg-config.json
- 修复useEffect不响应categoryCode变化的bug

其他:
- 删除Rust遗留的generate_cover_image命令和burn_ass_subtitle_to_image函数
2026-05-13 11:07:11 +08:00
小鱼开发 4cba598b17 feat: 视频生成积分按总时长一次性扣费 + 错误文案友好化 + 弹窗样式修复
- 视频生成积分规则:从按对口型实际时长计费改为按脚本规划总时长计费
- 前端 VideoGeneration:提交 lipSync 时传 plannedDuration + totalPlannedDuration + batchId
- 后端 video_handler:tick 预检用 planned_duration,扣费改为总时长一次性扣 + batch_id 幂等
- 后端 tasks.py:VideoParams 替换字段,余额检查用 planned_duration
- 前端按钮旁显示预计消耗积分
- 新增 errorMessage.ts:统一错误信息友好化转换
- ScriptCreation/VideoGeneration/VoiceSynthesis/SubtitleBurning/CoverDesign:弹窗错误文案改用友好提示
- ProgressModal.css:错误/成功文案添加折行样式
- ContentManagement.css:补全缺失的 settings-row 样式
- ScriptCreation:删除过时空状态文案和多余 Slider.css import
2026-05-12 12:36:39 +08:00
小鱼开发 dc5d0d4959 fix: TTS/润色/标题/克隆 API 前置积分检查 + 402 异常透传
- voice.py: synthesize/synthesize-batch/synthesize-file/clone/submit 添加前置积分检查

- script.py: polish/generate_title 添加前置积分检查

- 修复 HTTPException(402) 被外层 except Exception 吞掉变成 500 的问题

- 所有端点在执行业务前先检查余额,不足直接返回 402
2026-05-11 22:55:47 +08:00
小鱼开发 367c3d352c fix: 任务创建 API 和 Scheduler 前置积分检查
- tasks.py: create_task 在写入 Redis 前检查积分余额,不足返回 402

- script_handler.py: tick 执行 AI 调用前预检积分

- video_handler.py: 提交 Vidu 任务前预检积分

- 避免余额不足的任务入队,即时反馈给用户
2026-05-11 22:06:01 +08:00
小鱼开发 873db1a26f fix: 禁止积分余额变为负数
- point_service.consume 默认 allow_negative=False
- script.py / voice.py 捕获 ValueError(积分不足) 返回 402
- Scheduler 后置扣费余额不足时静默失败并记录日志
2026-05-11 21:47:26 +08:00
小鱼开发 447f3c2ffe feat: 空镜素材系统数据库化 + 修复积分不足弹窗叠加
后端:
- 新增 BrollCategory/BrollMaterial/BrollTag 模型及表(mjk_categories/materials/tags)
- 新增 Alembic 迁移 69274ce979a5
- 新增 broll_category/broll_material CRUD 层
- 重构 material_service:删除 JSON 配置,改用 PostgreSQL + Redis 去重
- 新增 /materials/batch-match 接口,删除 /materials/reload
- usage_count 原子递增,Redis 失败自动降级

前端:
- materials API 改为 projectId 去重,新增 batchMatch
- VideoGeneration 批量匹配改用 batchMatch,删除 usedUrls 手动维护
- 修复积分不足时进度弹窗与充值弹窗叠加的 bug
- 操作前预检积分,不足时显示提示条+立即充值按钮
2026-05-11 17:40:38 +08:00
小鱼开发 95e55293c6 security: 全面生产安全加固与部署修复
后端安全:
- DEBUG 默认 True → False
- 彻底移除 AUTH_BYPASS 认证绕过
- 验证码不再明文打印到日志
- 上传接口增加大小限制(500MB/20MB/100MB)与魔数校验
- python-jose → PyJWT, 更新 requirements.lock/uv.lock
- Bandit 恢复关键规则(B104/B301/B305/B314/B324/B603/B607)
- 修复 5 处 try_except_pass, 15 处加 nosec 注释
- 启用 Bandit pre-commit 钩子

前端安全:
- 配置完整 CSP 策略
- 收紧 Capabilities(fs:allow-read-file → $RESOURCE/**)
- 移除硬编码 devToken
- 清理前端 TODO(美家卡智影命名统一)

部署修复:
- docker-compose.prod 增加 alembic 迁移步骤
- api + scheduler 增加 Redis 心跳健康检查
- Nginx 添加安全响应头
- Nginx client_max_body_size 100M → 500M
- .env.example 补充 UPLOAD_MAX_* 配置与安全注释

其他:
- /voice/upload 合并到 /upload/audio
- Rust 上传增加文件大小检查
- 清理 Rust 19 处 println! + 前端 21 处 console.info
- 修复 VideoCompose.tsx toast 未导入(已有bug)
2026-05-10 23:31:34 +08:00
小鱼开发 82108fd13c fix(auth): PATCH /auth/me 会话隔离导致修改失败
current_user 来自 get_current_user 的数据库会话,和 update_me
的 db 不是同一个会话。直接修改对象后 commit 找不到变更。
修复:先用当前会话重新查询用户再修改。
2026-05-10 21:13:37 +08:00
小鱼开发 ea1b607aca feat(profile): 拆分个人中心与账户设置,支持昵称编辑
后端:
- 新增 UpdateNicknameRequest schema
- 新增 PATCH /auth/me 修改昵称接口

前端:
- Profile.tsx 精简为纯资产中心(积分统计+最近记录+充值)
- 新建 Account.tsx 账户设置页(昵称编辑、手机号、退出登录)
- App.tsx + Sidebar.tsx 新增 account 路由和导航菜单
- 昵称修改后同步更新 authStore
2026-05-10 08:32:45 +08:00
小鱼开发 edc782b15b fix(points): 积分明细首次加载、自定义Select、名词口径统一
- 修复首次进入积分明细无数据(日期就绪后才触发查询)
- 新增 CustomSelect 组件替换原生 select,绿色主题
- 下拉选项根据后端配置动态过滤(只展示有扣费的业务)
- 后端新增 /points/chargeable-types 接口
- 统一名词口径:消耗→消费、声音克隆→复刻、封面制作→设计、润色→文案润色
- 后端接口支持 source_type 查询参数(修复类型筛选不生效)
2026-05-10 07:39:08 +08:00
小鱼开发 a28a16921d feat(recharge): 过期时间改2分钟 + 刷新图标 + 间距统一 + 骨架屏占位 2026-05-09 22:00:05 +08:00
小鱼开发 04e467e433 feat(points): 积分系统收尾 + 充值弹窗改造 + 命名统一
后端:
- 微信回调 db.commit 失败仍返回 SUCCESS,避免无限重试
- recharge() 加 order_id 幂等保护,防重复充值
- time_expire 使用北京时间(UTC+8),修复时区 bug
- 充值档位后端配置化(points-config.yaml + /recharge-options API)
- 代码审查 20 项修复(认证加固、扣费顺序、错误响应、状态同步等)

前端:
- 充值弹窗:自动轮询 + 【我已支付】手动兜底
- 二维码倒计时显示,过期后遮罩 + 刷新按钮
- 充值档位从后端动态加载
- 去掉 select/qrcode 弹窗标题,金额红色突出显示
- 全项目命名统一(视频生成/压制成片/配音合成/声音复刻等)
- Modal 关闭按钮独立于 title 显示
2026-05-09 21:29:35 +08:00
小鱼开发 0722225c62 feat(points): 积分流水表支持时长显示,说明字段简化
后端:
- PointTransaction 模型添加 duration 字段(float, nullable)
- PointTransactionItem schema 添加 duration
- consume() 新增 duration 参数,写入流水记录
- 各业务 description 统一简化为【脚本生成】【配音合成】等格式
- duration 类业务(tts/video)传入实际秒数
- Alembic 迁移: 95eb1a1c0af9_add_duration_to_point_transaction

前端:
- PointTransaction 类型添加 duration
- UsageDetail: 来源列 → 时长列(有值显示 xs,无值显示 -)
- 说明列直接显示后端返回的简化描述
2026-05-09 17:08:50 +08:00
小鱼开发 368fdfa094 fix(points): 修复积分系统联调 bugs
致命级(扣费不落库):
- /points/consume、/admin/recharge、/recharge/query/{id} 补单路径添加缺失的 db.commit()
- voice.py 三个端点(synthesize/synthesize-batch/clone/submit)consume 后添加 db.commit()
- script.py 两个端点(polish/generate-title)consume 后添加 db.commit()

严重级(运行时错误):
- 清理 points.py 对已删除 schema(ConsumeFreezeRequest 等)的导入
- 修复 schemas.ConsumeRequest 引用为直接导入 ConsumeRequest
- video_handler.py: duration 字符串类型安全转换 float()
- tasks.py VideoParams 添加 duration 字段并写入 Redis params

中等级(体验):
- CoverDesign: consumePoints 移到 exportPng() 成功后
- 三个消费页面 RechargeModal 添加 onRechargeSuccess 刷新余额
2026-05-09 16:00:28 +08:00
小鱼开发 c6eba97b43 feat(points): 积分消耗系统全链路集成
后端:
- 简化积分服务: 删除 freeze/settle/refund, 保留 consume/recharge/expire
- 计费配置化: config/points-config.yaml 驱动 fixed/duration/free 三种模式
- TTS 时长探测: app/utils/audio_utils.py (httpx + mutagen 纯 Python)
- Python 层扣费: script(5)/polish(1)/title(1)/voice_clone(200)/tts(按秒)/video(按秒)
- 字幕 free_services: caption/auto_align 不扣费
- 新增 POST /points/consume 端点(402余额预检)
- 新增 check_balance + /points/cost 返回 sufficient/balance/required
- 新增 expire_batches 定时回收, 接入 scheduler main(每5分钟)
- 删除废弃 tts_handler.py
- Alembic 迁移: 删除 frozen/total_refunded 字段
- 同步 requirements.lock 添加 mutagen

前端:
- Rust/IPC 层扣费: compose(5)/subtitle_burn(2)/cover_design(2)
- 字幕打轴改异步: 走 scheduler subtitle handler
- 对口型传 duration: VideoGeneration 传 actualDuration
- 创建 pointStore: 全局余额 + fetchBalance + 充值弹窗控制
- 402 欠费弹 RechargeModal: VideoGeneration/SubtitleBurning/CoverDesign
- 修复 VoiceDubbing.tsx 类型错误 (alignResult never)
- 同步 PointBalance 类型(删除 frozen/available/totalRefunded)

Refs: 积分消耗集成收尾
2026-05-09 15:42:54 +08:00
小鱼开发 54b3d2b3e7 fix: 创建充值订单后缺少 db.commit() 导致订单未持久化
- create_recharge_order 成功/失败路径均添加 await db.commit()
- 修复轮询 404 和微信支付回调找不到订单的问题
2026-05-08 22:05:45 +08:00
小鱼开发 8e5174c58c fix: 修复轮询接口 CORS 头丢失 + CRUD 类型不匹配
- main.py: 自定义 exception_handler 手动添加 CORS 头,避免 500 响应被浏览器拦截
- crud/base.py: CRUDBase.get 的 id 参数改为 Any,兼容 int/BigInt 主键
- api/v1/points.py: query_recharge_status 去掉 str() 转换,直接传 int order_id
2026-05-08 21:56:56 +08:00
小鱼开发 8fd68fc25e feat: 发送验证码时校验用户是否存在
- /send-code 接口增加用户存在性校验
- 手机号未注册时返回 404 '用户不存在'
- 验证码校验仍 bypass(测试期间)
2026-05-08 18:13:20 +08:00
小鱼开发 caa0327d87 fix(auth): 登录接口优先读取 X-Forwarded-For 头获取真实公网 IP
- 原来 http_request.client.host 获取的是 Nginx 内网 IP
- 现在优先读 X-Forwarded-For → X-Real-IP → client.host 兜底
2026-05-08 16:47:19 +08:00
小鱼开发 43bbb4ea22 fix: FastAPI Request 参数类型回退,修复 Docker 启动失败
FastAPI 0.135.3 无法正确识别 Request | None Union 类型作为注入参数,
回退为 Request = None(运行时 FastAPI 会自动注入 Request 对象)。
2026-05-08 11:34:47 +08:00
小鱼开发 b597d715c8 fix: 认证流程修复 + alembic 迁移补全 + 前端僵尸代码清理
后端:
- 修复 get_current_user 未校验 is_active,被封禁用户仍可用旧 Token
- auth.py 捕获 ValueError 转 HTTPException(验证码错误、账号被封、Token 无效等不再返回 500)
- 修正 SMS 每日上限注释(3次 → 10次)
- 修复迁移脚本外键引用错误:users.id → mjk_users.id
- 新建积分系统 4 张表的迁移(mjk_user_points/batches/transactions/recharge_orders)
- pyproject.toml 补充 alembic + psycopg2-binary 依赖
- ruff 格式修复(import 排序等)

前端:
- 修复 doRefreshToken 成功后不持久化新 Token 的严重 bug
- 修复应用重启后 SSE 不自动重连(收不到踢人通知)
- 修复 App.tsx handleLogout 未 await
- client.ts 统一从 utils/env 导入 isTauri,默认 base URL 兜底 localhost:8000
- 清理 ~20 个未使用的 hooks/utils/api 模块/组件导出
- 修复所有 ESLint 警告(206 → 0)和 TSC 错误
- 测试通过(5/5)

其他:
- 更新 requirements.lock 和 uv.lock
2026-05-08 11:10:48 +08:00
小鱼开发 51521fc0dd feat(payment): 微信支付 APIv2 + 积分充值 + SMS 短信 + 双 Token 认证
- 微信支付从 APIv3 降级为 APIv2(MD5/XML)
- 积分系统:充值下单、微信回调、消费冻结/结算/退款
- SMS B2M 短信验证码服务
- 双 Token 认证(Access 30min + Refresh 30days)
- SSE 单设备踢人
- 用户设备管理、积分账户模型
- Alembic 迁移脚本
2026-05-07 18:43:02 +08:00
小鱼开发 755ecc9abe refactor(config): 统一配置体系,禁用热重载,清理兼容层
- 删除 .gitlab-ci.yml
- 删除 runtime_config.py 兼容层
- Pydantic Settings + YAML 三层配置分离
- 统一 PlatformConfigLoader 加载器
- docker-compose 移除重复 environment 覆盖
- volcengine base_url 从 YAML 读取
- 微信支付/SMS 空值启动时拦截
- 日志仅输出控制台,不写文件
- 更新 model_router 注释
2026-05-07 18:42:47 +08:00
小鱼开发 c45cb02385 fix: 七牛云 SDK 同步 I/O 阻塞事件循环
- QiniuService 新增 async 包装方法(upload_stream_async 等)
- upload.py / voice.py 上传路由改为 await async 版本
- voice.py 改用 get_qiniu_service() 单例
2026-05-06 22:56:23 +08:00
小鱼开发 c79b2323f4 refactor: 删除脚本生成未使用的 duration/style/scriptType/scriptDuration 参数
前端:
- 删除 scriptType 字段及相关 store action、持久化、API 类型
- 删除 scriptDuration 字段及相关 store action、持久化、加载逻辑
- ScriptCreation 不再传 duration/style 参数给后端

后端:
- ScriptParams 删除 duration/style 字段
- ScriptHandler 删除 duration/style 参数读取和传递
- ScriptService.generate_script 签名删除 duration/script_type
- load_script_user_prompt 删除 duration 参数

影响:无,duration/style 在 prompt 模板中未被实际使用
2026-05-06 13:30:40 +08:00
小鱼开发 8f8256ddfb fix: 声音克隆暴露原始错误 + 脚本生成去掉中间进度提示
- voice.py: 异常处理不再吞掉原始错误,直接暴露具体原因
- vidu_service.py: clone_voice 错误消息包含 Vidu 返回的 error_message
- ScriptCreation.tsx: 去掉一闪而过的'任务已创建,等待执行...'中间状态
2026-05-06 11:04:26 +08:00