Commit Graph

187 Commits

Author SHA1 Message Date
小鱼开发 83b10945c8 feat(points): 新增今日消耗接口 + 个人中心字体调整
后端:
- CRUD 新增 sum_consumed_today() 方法,统计用户今日消费积分总和
- API 新增 GET /points/today-consumed 路由

前端:
- 个人中心积分数字从 40px 改为 32px
- 今日消耗从本地计算改为调用后端接口
2026-05-16 09:46:41 +08:00
小鱼开发 f8fd241d58 chore(prompts): 移除水电材料(sc)分类 2026-05-16 09:22:12 +08:00
小鱼开发 cbd4068776 fix(db): unify table name prefix to mjk_ for update tables
- Rename app_releases → mjk_app_releases
- Rename release_packages → mjk_release_packages
- Update ForeignKey reference and migration file
- Add pre-commit hook: check_table_prefix.py to prevent future violations
2026-05-15 18:28:07 +08:00
小鱼开发 5abd9fdeee fix(seed): correct CDN domain for cover backgrounds
media.liche.cn -> img.liche.cn
2026-05-15 18:08:55 +08:00
小鱼开发 04b9b92241 feat(seed): add cover backgrounds seed data for bk category
- 72 cover background images for script_code='bk' (装修避坑)
- CDN path: https://media.liche.cn/meijiaka-zy/cover_templete/
- Generated from /Users/0fun/Downloads/bk/
2026-05-15 18:08:03 +08:00
小鱼开发 60b4178cff fix(material): _normalize_scene 去除所有 Unicode 空白字符
之前只处理了半角空格和全角空格,换行、tab 等字符会导致
scene 与三级分类 name 匹配失败。改用 re.sub(r'\s+', '', scene)
统一清理所有 Unicode 空白字符。
2026-05-15 17:40:41 +08:00
小鱼开发 542bc1f070 refactor(alembic): squash all migrations into clean initial_schema
- Replace 8 messy migration files (~2000+ lines) with single clean initial_schema (215 lines)
- All table comments defined inline at CREATE TABLE time (no more alter_column spam)
- Final table names used directly (mjk_broll_categories, etc. — no rename chain)
- Includes diagnosis report at docs/alembic-diagnosis-report.md
2026-05-15 17:35:54 +08:00
小鱼开发 ffcbb5105d fix(api): 恢复 /health 根路径健康检查端点
Docker/Nginx 健康检查请求 /health 返回 404,
在 main.py 中重新添加轻量级 /health 端点供负载均衡使用。
2026-05-15 17:08:34 +08:00
小鱼开发 4fa8bd7c65 fix(alembic): 修复迁移历史分支,合并双 head
将 rename_mjk_to_mjk_broll 的 down_revision 从 e02c96e264d9 改为 d0a7c5a375c6,
解决 alembic upgrade head 时的 Multiple head revisions 错误。
2026-05-15 17:03:17 +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
小鱼开发 50e8b7cda3 feat(seed): 更新素材 seed 数据(2771条,含木作阶段验收镜)
- 基于最新本地素材目录重新扫描(2771个MP4)
- 新增二级分类:木作阶段验收镜(2个文件)
- 全部 ffprobe 探测时长,无0值异常
- 生成 scripts/seed_materials.sql 入库脚本
- 保留 generate_seed_materials.py 供后续复用
2026-05-15 16:55:08 +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
小鱼开发 3bfaea018c chore: 更新分类 seed,同步目录结构调整
- 二级分类: 木作阶段验收-木作阶段验收镜 -> 木作阶段验收镜
- 三级场景: 木作阶段验收-木作阶段验收镜 -> 木作阶段验收-木作验收
- 总分类数: 220 (9+28+183)
2026-05-15 16:33:46 +08:00
小鱼开发 ada29a48a8 feat: 空镜素材分类&数据入库
- 素材表统一为 mjk_broll_ 前缀(mjk_broll_categories/materials/tags)
- 新增 218 条分类 seed + 2495 条素材 seed(含 ffprobe 时长)
- 新增 Alembic 迁移: rename mjk_* to mjk_broll_*
2026-05-15 15:49:29 +08:00
小鱼开发 17455b405c Revert "feat: 空镜素材分类&数据入库"
This reverts commit 91e5cdefbb.
2026-05-15 15:45:55 +08:00
小鱼开发 91e5cdefbb feat: 空镜素材分类&数据入库
- 重命名素材表 mjk_* -> broll_*,与模型命名保持一致
- 新增 182 个三级场景分类 seed 数据
- 新增 2495 条素材 INSERT SQL(含 ffprobe 时长探测)
- 新增 Alembic 迁移: rename mjk_categories/materials/tags to broll_*
2026-05-15 15:41:23 +08:00
小鱼开发 d67bd9c067 chore: 删除废弃的 materials.json 2026-05-15 11:59:58 +08:00
小鱼开发 f20de12fa2 feat: macOS Big Sur 风格图标 + Docker 日志轮转 + 后台运维 SQL
图标:
- 添加白色圆角矩形底板,占画布 80%(四周留透明呼吸边距)
- M 内容占底板 65%,裁剪透明边距后居中
- 底板微妙渐变(#FAFAFA → #F0F0F0)
- 清理原始图标幽灵半透明像素
- 全平台图标重新生成(PNG / ICNS / ICO / Android / iOS)

运维:
- docker-compose.prod.yml & test.yml 添加 json-file 日志轮转
  max-size: 100m, max-file: 5
- scripts/admin-ops.sql: 新增用户、积分赠送、积分补偿、批量补偿
- scripts/generate-rounded-icon.py: 可复用的图标生成脚本

其他:
- prompts 文件重命名为语义化文件名
- .gitignore 移除 binaries/ 忽略(FFmpeg sidecar 需提交)
2026-05-15 11:33:51 +08:00
小鱼开发 de7a6b734f chore(release): bump to v1.5.15
- 统一版本号管理(VERSION + scripts/bump-version.py)
- 添加 GitLab CI/CD 前端多平台构建配置
- 替换应用图标为品牌 logo
- 清理无效文件(tauri.svg, vite.svg, bg-config.json, audio/presets, .DS_Store)
- 修复 ESLint 错误和全部 warnings
- 清理 console.warn,保留 console.error
- 更新 Cargo.toml 元数据(description + authors)
- 更新 .gitignore(dist/, src-tauri/target/, binaries/)
- authStore appVersion 改为动态获取(getVersion)
- 修复 login 错误处理
- 将 FFmpeg sidecar 二进制移出 Git 跟踪(CI 构建时准备)
2026-05-14 23:32:45 +08:00
小鱼开发 8f99d0166b chore: 清理后端未使用文件(307 行)
- 删除 core/health_checker.py(完全未使用)
- 删除 crud/point_batch.py(CRUD 封装未被引用,service 直接用 SQLAlchemy)
- 删除 crud/user_point.py(同上)
- 顺手修复 point_service.py 缺失 logger 定义(ruff F821)
2026-05-14 23:10:46 +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
小鱼开发 28d75c84e1 chore: 删除死代码 caption.ts
该文件无任何外部引用,autoAlignCaption 未被使用。
实际字幕打轴业务走 Async Engine(VoiceSynthesis.tsx 内自行定义类型)。

Refs: P2-3
2026-05-14 20:46:47 +08:00
小鱼开发 8046e408d6 refactor(VideoGeneration): 拆分 1385 行单体组件
按审查后的方案拆分为 8 个文件,单文件最大行数从 1385 降至 483:

utils/(纯函数,无 React 依赖)
- videoTimeline.ts: computeAssignedIntervals(57 行)
- videoValidation.ts: validateLocalVideo(85 行)

hooks/(独立领域逻辑)
- useEmptyShotMaterials.ts: 空镜素材匹配/切换/上传(210 行)
- useVideoGeneration.ts: 视频生成 4-Step 核心流程(425 行)

_components/(展示组件,接收 props)
- AvatarMaterialSelector.tsx: 人物素材卡片(99 行)
- ShotTimeline.tsx: 分镜列表 + 素材操作(182 行)
- GenerationControls.tsx: 底部控制栏(112 行)

index.tsx: 容器组件,组合子组件 + 管理人物素材/预览/activeScene(483 行)

目录采用 _components/ 下划线前缀(页面私有组件惯例)。
TypeScript 编译和 Vite 生产构建均通过。

Refs: P1-6
2026-05-14 18:28:21 +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
小鱼开发 86486fa4d5 chore: 添加装修避坑脚本prompt(sq/3、wt/2) 2026-05-13 13:51:16 +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
小鱼开发 353890df29 chore: 更新 prompt 配置与分类 2026-05-12 17:36:26 +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
小鱼开发 355c69a7bc config: 从 .env.example 中移除业务规则配置
业务规则配置(Token过期时间、连接池大小、上传限制等)
已回归 config.py 默认值,.env 只保留环境相关配置。
2026-05-11 00:09:03 +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
小鱼开发 fe3b378117 fix(cors): 后端 CORS 允许 Tauri 桌面应用 origin
添加 tauri://localhost 到 CORS_ORIGINS 默认值,
解决 Tauri WebView 请求被跨域拦截的问题
2026-05-10 21:10:11 +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
小鱼开发 63599a5b9e chore: 短信签名改为【厦门美家卡科技】,验证码扩展码设置为 11 2026-05-09 11:20:17 +08:00
小鱼开发 6e79791694 refactor: 短信扩展码改为在 sms_service.py 中配置,不再从 .env 读取
- 移除 __init__ 中 settings.SMS_EXTENDED_CODE 的读取
- send_single_sms 增加 extended_code 参数,由调用方指定
- send_verification_code 通过类常量 EXT_CODE_VERIFICATION 配置扩展码
- 支持不同短信内容搭配不同扩展码
2026-05-09 10:35:20 +08:00