feat(mobile): expand TTS voices and align App SDK
This commit is contained in:
+17
-1
@@ -6,6 +6,22 @@
|
|||||||
|
|
||||||
- 2026-07-25 23:56–2026-07-26 02:40 的 App-Plus 批次已提交但**尚未发布**:未构建云打包 App、未发布 H5、未发布后端 JAR、未重启服务。见下两节。
|
- 2026-07-25 23:56–2026-07-26 02:40 的 App-Plus 批次已提交但**尚未发布**:未构建云打包 App、未发布 H5、未发布后端 JAR、未重启服务。见下两节。
|
||||||
|
|
||||||
|
## 2026-07-26 16:41–16:57|播报音色扩充、时长恢复与 HBuilderX 5.15 对齐
|
||||||
|
|
||||||
|
### 功能与修复
|
||||||
|
|
||||||
|
- 问模块快捷问题改为完整问句,减少短关键词被 Agent 当成不完整表达后再次澄清。
|
||||||
|
- “我”模块的 AI 播报音色在原有 4 个基础音色上新增 8 个 Qwen TTS 音色;服务端白名单同步放行,非法音色仍回落默认值。方言继续复用既有 21 项选择,并按租户与账号隔离保存。
|
||||||
|
- App-Plus 逻辑层没有浏览器 `Audio` 构造器;语音条时长改为直接解析 TTS `data:` URI 内的 MPEG Layer III 帧,支持 ID3v2、MPEG1/2/2.5、VBR 和 padding,远端 URL 仍使用宿主音频 API 兜底。
|
||||||
|
- App 编译链从 5.21 系列回退到本机 HBuilderX `5.15.2026070915` 内置版本:`@dcloudio/uni-app`、`@dcloudio/uni-app-plus`、`@dcloudio/vite-plugin-uni` 固定为 `3.0.0-alpha-5010220260604001`。`@dcloudio/uni-h5` 保留 5.21 系列,因为 5.15 H5 包缺少项目使用的 `Audio` 导出。
|
||||||
|
|
||||||
|
### 发布与验证
|
||||||
|
|
||||||
|
- **2026-07-26 16:41**:基于生产后端基线隔离构建并原子发布语音白名单 JAR,发布提交为 `bd196de6`,备份目录为 `/opt/wygj/backups/tts-voices-20260726164118-bd196de6`。服务恢复 `active`,健康检查 `200`,错误级别日志为空;生产 schema 仍为 `64/64`。本次只发布后端,没有覆盖更新中的生产 H5。
|
||||||
|
- **2026-07-26 16:46**:Android 真机发起新的“催费话术怎么说”请求,后端日志确认实际收到 `qwen-audio-3.0-tts-flash-longluxiaohui`、`dialect=shanghai`,3.503 秒生成 14 秒语音;这证明新音色参数已通过客户端、服务端白名单和模型链路,主观音色是否符合预期仍以人工试听为准。
|
||||||
|
- **2026-07-26 16:45–16:57**:真机实际复现“编译版本 5.21、手机端 SDK 5.15”弹窗。依赖与 HBuilderX 5.15 标准基座对齐后,App 与 H5 构建均通过,重新下发到同一 Android 设备后弹窗消失。该版本号是 uni-app 编译链/调试基座版本,不是 Android `minSdkVersion`。
|
||||||
|
- 本节完成层级为:音色后端已部署并完成生产请求链路验证;App 依赖对齐、时长解析和快捷问句已实现并完成本地构建/标准基座真机验证。**未重新云打包签名 APK/IPA,未发布 H5,未完成 Android/iOS 自定义基座全清单或人工音色验收。**
|
||||||
|
|
||||||
## 2026-07-26 02:35–02:40|恢复 App 端回复语音优先
|
## 2026-07-26 02:35–02:40|恢复 App 端回复语音优先
|
||||||
|
|
||||||
### 功能与修复
|
### 功能与修复
|
||||||
@@ -25,7 +41,7 @@
|
|||||||
- **2026-07-26 02:40**:真机取样(包推 `__UNI__B36D8BE` 后重启基座):3 秒为 `…` 合成中加红点、文字可读、`收起全文 ▲`;12 秒语音就绪而文字仍在;点播放后文字收起、红点清除;26 秒回到空闲,未复现挂死。
|
- **2026-07-26 02:40**:真机取样(包推 `__UNI__B36D8BE` 后重启基座):3 秒为 `…` 合成中加红点、文字可读、`收起全文 ▲`;12 秒语音就绪而文字仍在;点播放后文字收起、红点清除;26 秒回到空闲,未复现挂死。
|
||||||
- **2026-07-26 02:40**:**未验证**音频是否真实出声——状态机走完整链路,但设备音频输出无法取证,需人工试听。
|
- **2026-07-26 02:40**:**未验证**音频是否真实出声——状态机走完整链路,但设备音频输出无法取证,需人工试听。
|
||||||
- **2026-07-26 02:40**:本节完成层级为「已实现、已本地验证、已提交」。**未构建云打包 App、未发布 H5、未发布后端 JAR、未重启服务**。
|
- **2026-07-26 02:40**:本节完成层级为「已实现、已本地验证、已提交」。**未构建云打包 App、未发布 H5、未发布后端 JAR、未重启服务**。
|
||||||
- **2026-07-26 02:40**:排障口径修正。`adb exec-out screencap -p` 的 PNG 直接读取会静默返回空内容,若据此描述界面会得出凭空结论;本批已改为先 `sips` 转换/裁剪再读。据此撤回两条本轮口头结论:「App 端 TTS 挂死」(实测本次 2–6 秒合成成功)与「设备弹出 SDK 版本不匹配窗口并吞掉点击」(界面无该弹窗,点击落空系启动时序)。
|
- **2026-07-26 02:40**:排障口径修正。`adb exec-out screencap -p` 的 PNG 直接读取会静默返回空内容,若据此描述界面会得出凭空结论;本批已改为先 `sips` 转换/裁剪再读。据此撤回两条当时证据不支持的口头结论:「App 端 TTS 挂死」(实测本次 2–6 秒合成成功)与「该次失败点击由 SDK 弹窗吞掉」(该轮取证画面未显示弹窗,点击落空系启动时序)。16:45 的后续冷启动已独立复现版本弹窗并完成修复,见上文。
|
||||||
|
|
||||||
## 2026-07-25 23:56–2026-07-26 00:02|App-Plus 实时对练与构建链修复
|
## 2026-07-25 23:56–2026-07-26 00:02|App-Plus 实时对练与构建链修复
|
||||||
|
|
||||||
|
|||||||
+12
-1
@@ -81,7 +81,18 @@ public class AihrSpeechService {
|
|||||||
"neutral", QWEN_TTS_DEFAULT_VOICE
|
"neutral", QWEN_TTS_DEFAULT_VOICE
|
||||||
);
|
);
|
||||||
private static final java.util.Set<String> QWEN_TTS_VOICES = java.util.Set.of(
|
private static final java.util.Set<String> QWEN_TTS_VOICES = java.util.Set.of(
|
||||||
"longanhuan_v3.6", "longjielidou_v3.6", "loongeva_v3.6", "loongjohn"
|
"longanhuan_v3.6",
|
||||||
|
"longjielidou_v3.6",
|
||||||
|
"loongeva_v3.6",
|
||||||
|
"loongjohn",
|
||||||
|
"qwen-audio-3.0-tts-flash-longyingmuyu",
|
||||||
|
"qwen-audio-3.0-tts-flash-longyingshiyu",
|
||||||
|
"qwen-audio-3.0-tts-flash-longchezhuyu",
|
||||||
|
"qwen-audio-3.0-tts-flash-longyingyueyue",
|
||||||
|
"qwen-audio-3.0-tts-flash-longluxiaohui",
|
||||||
|
"qwen-audio-3.0-tts-flash-longlanqinluan",
|
||||||
|
"qwen-audio-3.0-tts-flash-longluliuche",
|
||||||
|
"qwen-audio-3.0-tts-flash-longliuxulan"
|
||||||
);
|
);
|
||||||
|
|
||||||
private final AihrModelSeedService modelService;
|
private final AihrModelSeedService modelService;
|
||||||
|
|||||||
+8
@@ -90,6 +90,14 @@ class AihrSpeechServiceTest {
|
|||||||
"https://ws-example.cn-beijing.maas.aliyuncs.com/api/v1/services/audio/tts/SpeechSynthesizer",
|
"https://ws-example.cn-beijing.maas.aliyuncs.com/api/v1/services/audio/tts/SpeechSynthesizer",
|
||||||
AihrSpeechService.dashScopeSynthesisUri("https://ws-example.cn-beijing.maas.aliyuncs.com/compatible-mode/v1").toString()
|
AihrSpeechService.dashScopeSynthesisUri("https://ws-example.cn-beijing.maas.aliyuncs.com/compatible-mode/v1").toString()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
var extendedVoiceBody = AihrSpeechService.buildDashScopeRequestBody(
|
||||||
|
mapper, runtime, "请确认本次服务已经完成。",
|
||||||
|
new VoiceProfile("neutral", "qwen-audio-3.0-tts-flash-longyingmuyu", null, null, null));
|
||||||
|
assertEquals(
|
||||||
|
"qwen-audio-3.0-tts-flash-longyingmuyu",
|
||||||
|
extendedVoiceBody.path("input").path("voice").asText()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
> 生成时间:2026-07-08
|
> 生成时间:2026-07-08
|
||||||
> 来源口径:基于已入库正式资料生成,不使用本地 smoke 题作为验收依据。
|
> 来源口径:基于已入库正式资料生成,不使用本地 smoke 题作为验收依据。
|
||||||
> 状态说明:本文件是开发方候选题单,最终题单需业务方确认后锁定。
|
> 状态说明:本文件是开发方候选题单,最终题单需业务方确认后锁定。
|
||||||
> 最近复核:2026-07-10 运行 `node scripts/verify-demo-questions.mjs --prefix=Q`,Q01-Q12 结果 `12/12`、来源告警 `0`、向量 `450/450`。
|
> 2026-07-10 复核:运行 `node scripts/verify-demo-questions.mjs --prefix=Q`,Q01-Q12 结果 `12/12`、来源告警 `0`、向量 `450/450`。
|
||||||
|
|
||||||
## 生成依据
|
## 生成依据
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
2. Android 首次上机前,复制 `mobile-uni/androidPrivacy.json.example` 为 `mobile-uni/androidPrivacy.json`,替换两个法务确认的 HTTPS 链接;再执行 `npm --prefix mobile-uni run verify:app-release`。
|
2. Android 首次上机前,复制 `mobile-uni/androidPrivacy.json.example` 为 `mobile-uni/androidPrivacy.json`,替换两个法务确认的 HTTPS 链接;再执行 `npm --prefix mobile-uni run verify:app-release`。
|
||||||
3. 使用有效的移动端测试账号;不得把管理员 Web 登录态当作 App 登录验证。
|
3. 使用有效的移动端测试账号;不得把管理员 Web 登录态当作 App 登录验证。
|
||||||
4. 每台设备保留系统版本、App `versionName/versionCode`、基座/包哈希、录屏或截图和失败日志。
|
4. 每台设备保留系统版本、App `versionName/versionCode`、基座/包哈希、录屏或截图和失败日志。
|
||||||
|
5. HBuilderX/CLI 编译链必须与手机调试基座兼容;启动时出现版本不匹配弹窗即视为未通过。当前版本组合和排障命令见 `MOBILE_APP_PACKAGING.md`。
|
||||||
|
|
||||||
## Android(最低 Android 10 + 一台当前主流机型)
|
## Android(最低 Android 10 + 一台当前主流机型)
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
- App 直接请求 `https://peilian.njzhmj.top/dev-api`。不依赖 H5 开发服务器的 `/dev-api` proxy;地址是公开配置,不得在 App 包中放入短信、模型、签名或任何服务端密钥。
|
- App 直接请求 `https://peilian.njzhmj.top/dev-api`。不依赖 H5 开发服务器的 `/dev-api` proxy;地址是公开配置,不得在 App 包中放入短信、模型、签名或任何服务端密钥。
|
||||||
- `manifest.json` 只保留不含秘密的发布配置。`.keystore`、`.p12`、`.mobileprovision` 与证书密码只能由发布负责人在 HBuilderX 云打包界面或受控 CI 秘密变量中提供,绝不能提交 Git。
|
- `manifest.json` 只保留不含秘密的发布配置。`.keystore`、`.p12`、`.mobileprovision` 与证书密码只能由发布负责人在 HBuilderX 云打包界面或受控 CI 秘密变量中提供,绝不能提交 Git。
|
||||||
- Android 最低试点设备为 Android 10,iOS 最低试点设备为 iOS 15;每次发版提升 `versionCode`,再更新 `versionName`。
|
- Android 最低试点设备为 Android 10,iOS 最低试点设备为 iOS 15;每次发版提升 `versionCode`,再更新 `versionName`。
|
||||||
|
- 当前 App 编译链与本机 HBuilderX `5.15.2026070915` 标准基座对齐:`@dcloudio/uni-app`、`@dcloudio/uni-app-plus`、`@dcloudio/vite-plugin-uni` 固定为 `3.0.0-alpha-5010220260604001`。这是 HBuilderX/uni-app 编译器版本,不是 Android `minSdkVersion`。
|
||||||
|
- `@dcloudio/uni-h5` 有意保留 `3.0.0-alpha-5020120260710001`;5.15 内置的 H5 包没有导出项目仍在使用的 `Audio` 组件,会使 `build:h5` 失败。不要为了“版本整齐”把 H5 包一并降级。
|
||||||
|
|
||||||
## 本地验证与出包
|
## 本地验证与出包
|
||||||
|
|
||||||
@@ -23,6 +25,8 @@ npm --prefix mobile-uni run build:app
|
|||||||
2. 在真实 Android 与 iPhone 上验证手机号登录、录音并转写、TTS 播放、图片/视频/文件上传、附件下载、拒绝权限、前后台切换、刘海和底部安全区。
|
2. 在真实 Android 与 iPhone 上验证手机号登录、录音并转写、TTS 播放、图片/视频/文件上传、附件下载、拒绝权限、前后台切换、刘海和底部安全区。
|
||||||
3. Android 试点使用企业签名的正式 APK;上架渠道按渠道要求导出相应制品。iOS 使用企业 Apple Developer 账号的 Distribution 证书和 provisioning profile,先走 TestFlight。
|
3. Android 试点使用企业签名的正式 APK;上架渠道按渠道要求导出相应制品。iOS 使用企业 Apple Developer 账号的 Distribution 证书和 provisioning profile,先走 TestFlight。
|
||||||
|
|
||||||
|
标准基座可用于日常 JavaScript/WebView 兼容性调试,但不能替代自定义基座或签名包的权限、图标、启动图和原生配置验收。
|
||||||
|
|
||||||
## 发布前尚需提供的资产
|
## 发布前尚需提供的资产
|
||||||
|
|
||||||
- 经法务确认并已可公开访问的《服务协议》《隐私政策》;Android 必须用该实际链接配置原生 template 隐私弹窗,iOS 需提供相应的麦克风、相机、相册/文件用途说明。
|
- 经法务确认并已可公开访问的《服务协议》《隐私政策》;Android 必须用该实际链接配置原生 template 隐私弹窗,iOS 需提供相应的麦克风、相机、相册/文件用途说明。
|
||||||
@@ -35,10 +39,24 @@ npm --prefix mobile-uni run build:app
|
|||||||
- 现有品牌源图仅为 64×64,因此这里生成的是**可用于自定义基座和测试包的派生资产**。正式提交商店前应替换为品牌方提供的高分辨率母版,再重新执行生成和预检。
|
- 现有品牌源图仅为 64×64,因此这里生成的是**可用于自定义基座和测试包的派生资产**。正式提交商店前应替换为品牌方提供的高分辨率母版,再重新执行生成和预检。
|
||||||
- `androidPrivacy.json.example` 是**未启用的法务模板**,其中 `__TERMS_URL__` 与 `__PRIVACY_URL__` 必须替换为法务确认的 HTTPS 地址。复制为被 Git 忽略的 `androidPrivacy.json` 后,`npm --prefix mobile-uni run verify:app-release` 才会通过。
|
- `androidPrivacy.json.example` 是**未启用的法务模板**,其中 `__TERMS_URL__` 与 `__PRIVACY_URL__` 必须替换为法务确认的 HTTPS 地址。复制为被 Git 忽略的 `androidPrivacy.json` 后,`npm --prefix mobile-uni run verify:app-release` 才会通过。
|
||||||
- iOS 已按实际功能填写麦克风和照片库用途说明;不申请相机、定位、通讯录、蓝牙或广告追踪权限。
|
- iOS 已按实际功能填写麦克风和照片库用途说明;不申请相机、定位、通讯录、蓝牙或广告追踪权限。
|
||||||
- `build:app` 依赖 `@dcloudio/uni-app-plus`(须与其他 `@dcloudio` 包同版本)。缺少该编译器时命令**不报错**,只静默产出带 `/h5/` 基路径的 H5 空壳,产物里没有 `app-service.js` 与 `app-renderjs.js`,App 平台代码等于从未编译。判定 `build:app` 是否真的成功要看产物中是否存在 `app-service.js`、`app-renderjs.js`、`manifest.json`,不能只看 `DONE Build complete.`。
|
- `build:app` 依赖 `@dcloudio/uni-app-plus`,它必须与 `@dcloudio/uni-app`、`@dcloudio/vite-plugin-uni` 同版本;H5 包是上文说明的平台例外。缺少 App 编译器时命令**不报错**,只静默产出带 `/h5/` 基路径的 H5 空壳,产物里没有 `app-service.js` 与 `app-renderjs.js`,App 平台代码等于从未编译。判定 `build:app` 是否真的成功要看产物中是否存在 `app-service.js`、`app-renderjs.js`、`manifest.json`,不能只看 `DONE Build complete.`。
|
||||||
- App-Plus 实时对练通过 `renderjs` 在系统 WebView 中执行媒体/WebRTC;认证 SDP 与工具请求仍由逻辑层代理。发布前必须在 Android/iOS 真机验证麦克风授权、实时转写、远端语音播放、前后台切换和断线降级。
|
- App-Plus 实时对练通过 `renderjs` 在系统 WebView 中执行媒体/WebRTC;认证 SDP 与工具请求仍由逻辑层代理。发布前必须在 Android/iOS 真机验证麦克风授权、实时转写、远端语音播放、前后台切换和断线降级。
|
||||||
- 真机步骤和证据口径见 `docs/MOBILE_APP_DEVICE_ACCEPTANCE.md`。资源预检通过不等于 Android/iOS 真机或应用商店验收通过。
|
- 真机步骤和证据口径见 `docs/MOBILE_APP_DEVICE_ACCEPTANCE.md`。资源预检通过不等于 Android/iOS 真机或应用商店验收通过。
|
||||||
|
|
||||||
|
## 调试基座版本不匹配
|
||||||
|
|
||||||
|
若真机提示“本应用使用 HBuilderX X 或对应 CLI 版本编译,而手机端 SDK 版本是 Y”,先核对编译依赖与基座,不要修改 Android `minSdkVersion`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/Applications/HBuilderX.app/Contents/MacOS/cli --version
|
||||||
|
node -e "for (const n of ['@dcloudio/uni-app','@dcloudio/uni-app-plus','@dcloudio/vite-plugin-uni']) console.log(n, require('./mobile-uni/node_modules/'+n+'/package.json').version)"
|
||||||
|
/Applications/HBuilderX.app/Contents/MacOS/cli launch app-android \
|
||||||
|
--project "$PWD/mobile-uni" --deviceId <adb-serial> \
|
||||||
|
--playground standard --compile true
|
||||||
|
```
|
||||||
|
|
||||||
|
当前 5.15 内置包在 `build:app` 输出中显示 `Compiler version: 5.12(vue3)`,属于 DCloud 自身的版本映射;依赖、HBuilderX 和手机标准基座按上述固定版本组合后,真机不再弹出 5.21/5.15 不匹配提示。
|
||||||
|
|
||||||
## 更新策略
|
## 更新策略
|
||||||
|
|
||||||
涉及原生权限、插件、证书或 App 壳的改动必须重新云打包并通过应用商店/TestFlight 发布。仅 JavaScript/CSS/静态资源的热更新(WGT)不作为首个试点版本的发布方式;如后续启用,须有版本兼容、完整性校验、灰度与回滚方案。
|
涉及原生权限、插件、证书或 App 壳的改动必须重新云打包并通过应用商店/TestFlight 发布。仅 JavaScript/CSS/静态资源的热更新(WGT)不作为首个试点版本的发布方式;如后续启用,须有版本兼容、完整性校验、灰度与回滚方案。
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. 主线 B:外部输入催办清单(今天发出,B3 为最大阻塞)
|
## 2. 主线 B:外部输入催办清单(2026-07-16 发出,B3 为最大阻塞)
|
||||||
|
|
||||||
每项需在发出时填负责人与回复期限;到兜底触发日仍无答复即升级 HR 负责人(BRD 第 13 章"集成负责人指派"至今未闭合)。
|
每项需在发出时填负责人与回复期限;到兜底触发日仍无答复即升级 HR 负责人(BRD 第 13 章"集成负责人指派"至今未闭合)。
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
| 层级 | 主要证据 | 能证明什么 |
|
| 层级 | 主要证据 | 能证明什么 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 历史可运行版 | `mobile/src/App.vue`、`mobile/src/data/*` | 旧源码实际存在过的交互,不代表今天仍在线 |
|
| 历史可运行版 | `mobile/src/App.vue`、`mobile/src/data/*` | 旧源码实际存在过的交互,不代表当前仍在线 |
|
||||||
| 历史需求/设计 | BRD、阶段总纲、会议纪要、Figma | 功能被提出、规划或设计过,不单独证明已交付 |
|
| 历史需求/设计 | BRD、阶段总纲、会议纪要、Figma | 功能被提出、规划或设计过,不单独证明已交付 |
|
||||||
| 当前实现 | `mobile-uni/`、`frontend/`、`backend/ruoyi-modules/ruoyi-aihr/` | 当前代码和接口能力 |
|
| 当前实现 | `mobile-uni/`、`frontend/`、`backend/ruoyi-modules/ruoyi-aihr/` | 当前代码和接口能力 |
|
||||||
| 本地验证 | 自动化测试、真实本地 API、浏览器操作和截图 | 当前构建在验证环境可运行 |
|
| 本地验证 | 自动化测试、真实本地 API、浏览器操作和截图 | 当前构建在验证环境可运行 |
|
||||||
|
|||||||
Generated
+465
-137
@@ -8,8 +8,8 @@
|
|||||||
"name": "aihr-mobile-uni",
|
"name": "aihr-mobile-uni",
|
||||||
"version": "0.1.5",
|
"version": "0.1.5",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dcloudio/uni-app": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-app": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-app-plus": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-app-plus": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-h5": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-h5": "3.0.0-alpha-5020120260710001",
|
||||||
"@dcloudio/uni-ui": "^1.5.12",
|
"@dcloudio/uni-ui": "^1.5.12",
|
||||||
"lxgw-wenkai-tc-webfont": "^1.0.0",
|
"lxgw-wenkai-tc-webfont": "^1.0.0",
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@dcloudio/types": "3.4.31",
|
"@dcloudio/types": "3.4.31",
|
||||||
"@dcloudio/vite-plugin-uni": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/vite-plugin-uni": "3.0.0-alpha-5010220260604001",
|
||||||
"sass": "^1.101.0",
|
"sass": "^1.101.0",
|
||||||
"typescript": "~5.9.3",
|
"typescript": "~5.9.3",
|
||||||
"vite": "5.2.8",
|
"vite": "5.2.8",
|
||||||
@@ -1916,18 +1916,18 @@
|
|||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-app": {
|
"node_modules/@dcloudio/uni-app": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-app/-/uni-app-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-app/-/uni-app-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-z4k1D2+vSthqcEm6biyo4TzbpcgvSJdQteoD3uI3DyrleeNBAfx+ywmnmXwjNFYf/qKOLIjeW0pd6lgkA+T6PA==",
|
"integrity": "sha512-B4OsM0IaQzIBU9IGFJQwKuXnLC8wIUkkVEH4BdEAj6oVdcVpvQs5crNdfdEF2l5BX9tptlVxEdy2ZohIGqytxw==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dcloudio/uni-cloud": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-cloud": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-components": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-components": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-console": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-console": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-i18n": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-push": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-push": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-stat": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-stat": "3.0.0-alpha-5010220260604001",
|
||||||
"@vue/shared": "3.4.21"
|
"@vue/shared": "3.4.21"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
@@ -1935,14 +1935,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-app-plus": {
|
"node_modules/@dcloudio/uni-app-plus": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-plus/-/uni-app-plus-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-plus/-/uni-app-plus-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-bYAMi9YqUH6/xGIf/KMlOPQAtLgYmXGCFtw9ZIUGKF4FMrYC/oeSYVJ/WhutgqVuvJau4BoSg/HGIWcqoz1QRA==",
|
"integrity": "sha512-QOYT/U3jXpQ5VAXGcjVHfUMS7uMtzMJeMTmrmVdXT7QUN7Tr//9QJG82z8vMkXD5lvnrDqt80DXixy9kNzz2dg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dcloudio/uni-app-uts": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-app-uts": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-app-vite": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-app-vite": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-app-vue": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-app-vue": "3.0.0-alpha-5010220260604001",
|
||||||
"debug": "4.3.7",
|
"debug": "4.3.7",
|
||||||
"fs-extra": "10.1.0",
|
"fs-extra": "10.1.0",
|
||||||
"licia": "1.41.1",
|
"licia": "1.41.1",
|
||||||
@@ -1950,18 +1950,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-app-uts": {
|
"node_modules/@dcloudio/uni-app-uts": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-uts/-/uni-app-uts-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-uts/-/uni-app-uts-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-ajHJurf9oaVtMb7W31ACia96QDp87X2HO+V+XRzW9bnI8Oci6UkzJVoFGXTFWQ8J6ecSbdMkz2dtiHdLgqv22g==",
|
"integrity": "sha512-BcdeJlPinUmF2iUX3UFdpzSPMAk5iIlj80H+mqTd23taha7YI6Xh1u/fMYXgKyBDsLi3hNQAY2sRnI0H4dViVQ==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/parser": "7.25.6",
|
"@babel/parser": "7.25.6",
|
||||||
"@babel/types": "7.25.6",
|
"@babel/types": "7.25.6",
|
||||||
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-console": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-console": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-i18n": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-nvue-styler": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-nvue-styler": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@jridgewell/gen-mapping": "^0.3.3",
|
"@jridgewell/gen-mapping": "^0.3.3",
|
||||||
"@jridgewell/trace-mapping": "^0.3.19",
|
"@jridgewell/trace-mapping": "^0.3.19",
|
||||||
"@rollup/pluginutils": "5.1.0",
|
"@rollup/pluginutils": "5.1.0",
|
||||||
@@ -2007,15 +2007,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-app-vite": {
|
"node_modules/@dcloudio/uni-app-vite": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-vite/-/uni-app-vite-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-vite/-/uni-app-vite-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-GBAUNnfhz0ln0KYGx87NcNHGULMr25ZTOBz0YdXl5q3Jggy6YkYe+C0w2P/4xxz3Q2pUVJ4kC0j/twotgfk6Ew==",
|
"integrity": "sha512-AnPDZUw8/YAQVOTm54K0g545d+jmKzzsQ/Vd2J+alm3LUyVjsWDJlyKLxsMbzdPClZ9bdfi+F/+lKJB0W0QAGw==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-i18n": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-nvue-styler": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-nvue-styler": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@rollup/pluginutils": "5.1.0",
|
"@rollup/pluginutils": "5.1.0",
|
||||||
"@vitejs/plugin-vue": "5.2.4",
|
"@vitejs/plugin-vue": "5.2.4",
|
||||||
"@vue/compiler-dom": "3.4.21",
|
"@vue/compiler-dom": "3.4.21",
|
||||||
@@ -2026,15 +2026,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-app-vue": {
|
"node_modules/@dcloudio/uni-app-vue": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-vue/-/uni-app-vue-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-vue/-/uni-app-vue-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-xOHqxnQ9yJfDIkY0pSQ3bYZBT55HkUVwCfsx8ZhnEVEtcw4FF2GiIo6xk+Ft/sOtmxj9wChOA7mYkIafbN2Qow==",
|
"integrity": "sha512-5rxJhgRS6ZHWKIoz5uy/VKuk/RSwf2IVH1TzUyr8RyMnF5ACF0xrLxSXbWeNLJwx62WjwJ00J/RMdLo5nSmGOw==",
|
||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-cli-shared": {
|
"node_modules/@dcloudio/uni-cli-shared": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-ZBs1zw83RHh+4Ecsvl/+ML+yGCUVo+oYb9gDaB/Z1leHDQ76kHvNtLNubf/Np9X5pzcXEx/Xe+PhqRvjdeuXbA==",
|
"integrity": "sha512-12M5X8/jH/9kYBQQFl0qtniP5GtGxEBO/+h73zN/w8Z0qXfmXgHXxEly8IwDrCqXI4yL008PF+3PMY17krZ7LQ==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ampproject/remapping": "^2.1.2",
|
"@ampproject/remapping": "^2.1.2",
|
||||||
@@ -2042,9 +2042,9 @@
|
|||||||
"@babel/core": "7.25.2",
|
"@babel/core": "7.25.2",
|
||||||
"@babel/parser": "7.25.6",
|
"@babel/parser": "7.25.6",
|
||||||
"@babel/types": "7.25.6",
|
"@babel/types": "7.25.6",
|
||||||
"@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-i18n": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-nvue-styler": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-nvue-styler": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@intlify/core-base": "9.1.9",
|
"@intlify/core-base": "9.1.9",
|
||||||
"@intlify/shared": "9.1.9",
|
"@intlify/shared": "9.1.9",
|
||||||
"@intlify/vue-devtools": "9.1.9",
|
"@intlify/vue-devtools": "9.1.9",
|
||||||
@@ -2118,37 +2118,140 @@
|
|||||||
"url": "https://github.com/fb55/entities?sponsor=1"
|
"url": "https://github.com/fb55/entities?sponsor=1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@dcloudio/uni-cli-shared/node_modules/picomatch": {
|
||||||
|
"version": "4.0.5",
|
||||||
|
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz",
|
||||||
|
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/jonschlinkert"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-cli-shared/node_modules/unplugin-auto-import": {
|
||||||
|
"version": "19.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz",
|
||||||
|
"integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"local-pkg": "^1.0.0",
|
||||||
|
"magic-string": "^0.30.17",
|
||||||
|
"picomatch": "^4.0.2",
|
||||||
|
"unimport": "^4.1.1",
|
||||||
|
"unplugin": "^2.2.0",
|
||||||
|
"unplugin-utils": "^0.2.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/antfu"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@nuxt/kit": "^3.2.2",
|
||||||
|
"@vueuse/core": "*"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@nuxt/kit": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"@vueuse/core": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-cli-shared/node_modules/unplugin-auto-import/node_modules/magic-string": {
|
||||||
|
"version": "0.30.21",
|
||||||
|
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
|
||||||
|
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/sourcemap-codec": "^1.5.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@dcloudio/uni-cloud": {
|
"node_modules/@dcloudio/uni-cloud": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-cloud/-/uni-cloud-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-cloud/-/uni-cloud-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-aKsPXFSN8W//QbJYoICfyXAUPuXujxv8Azfh0mJvSRW1OQnbnn1NNV9cMDoLbuQMIN6dZ6ulivbQB4HbaxObvw==",
|
"integrity": "sha512-gDldYdV6i1S5aJe+PHp3DQh1YD92GWBhwf9VVG1U0ncpVZ3I84Yd6Q+ndz5tpjGlJ9GQ3xGObaOopgdYSAoEkg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-i18n": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@vue/shared": "3.4.21",
|
"@vue/shared": "3.4.21",
|
||||||
"fast-glob": "3.3.3"
|
"fast-glob": "3.3.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-components": {
|
"node_modules/@dcloudio/uni-components": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-components/-/uni-components-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-components/-/uni-components-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-StYutCSkyrDL7BU5vwmFGrwYRorfRTQnAjrzB+R0O3lQn5UJmzelJ5vablIc4PRhJF8euMcoGoytSo0oGtZZLw==",
|
"integrity": "sha512-CoE+bAVk8OSt0FoFRsiWm2WflMfYqcsqcJXIak/7rdsS7HJWMuT5NAaHAp7/6G/XMmHfCRAGQNsiiRGcEwTB6Q==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dcloudio/uni-cloud": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-cloud": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-h5": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-h5": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001"
|
"@dcloudio/uni-i18n": "3.0.0-alpha-5010220260604001"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-components/node_modules/@dcloudio/uni-h5": {
|
||||||
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5/-/uni-h5-3.0.0-alpha-5010220260604001.tgz",
|
||||||
|
"integrity": "sha512-pAz7B6zJqSbmuZsnu95+Dkh3N717lo3XBO5qJzp55BrVJiA7ZBTPiqR8G7TU/6IMy6S12kze/liUvkfLtlaA+g==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@dcloudio/uni-h5-vite": "3.0.0-alpha-5010220260604001",
|
||||||
|
"@dcloudio/uni-h5-vue": "3.0.0-alpha-5010220260604001",
|
||||||
|
"@dcloudio/uni-i18n": "3.0.0-alpha-5010220260604001",
|
||||||
|
"@dcloudio/uni-shared": "3.0.0-alpha-5010220260604001",
|
||||||
|
"@vue/server-renderer": "3.4.21",
|
||||||
|
"@vue/shared": "3.4.21",
|
||||||
|
"debug": "4.3.7",
|
||||||
|
"localstorage-polyfill": "^1.0.1",
|
||||||
|
"postcss-selector-parser": "6.1.2",
|
||||||
|
"safe-area-insets": "1.4.1",
|
||||||
|
"vue-router": "4.4.4",
|
||||||
|
"xmlhttprequest": "^1.8.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-components/node_modules/@dcloudio/uni-h5-vite": {
|
||||||
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vite/-/uni-h5-vite-3.0.0-alpha-5010220260604001.tgz",
|
||||||
|
"integrity": "sha512-mJOYPZKTsSyVDMpVK0QYiRCCbJvtEwEav9X398gXHL4HoCS7a/Dtjt6PVbQRsMmQ9GoxddtC1RNd7gUpAYZpsg==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5010220260604001",
|
||||||
|
"@dcloudio/uni-shared": "3.0.0-alpha-5010220260604001",
|
||||||
|
"@rollup/pluginutils": "5.1.0",
|
||||||
|
"@vitejs/plugin-basic-ssl": "1.2.0",
|
||||||
|
"@vue/compiler-dom": "3.4.21",
|
||||||
|
"@vue/compiler-sfc": "3.4.21",
|
||||||
|
"@vue/server-renderer": "3.4.21",
|
||||||
|
"@vue/shared": "3.4.21",
|
||||||
|
"debug": "4.3.7",
|
||||||
|
"fs-extra": "10.1.0",
|
||||||
|
"mime": "3.0.0",
|
||||||
|
"module-alias": "2.2.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-components/node_modules/@dcloudio/uni-h5-vue": {
|
||||||
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vue/-/uni-h5-vue-3.0.0-alpha-5010220260604001.tgz",
|
||||||
|
"integrity": "sha512-T+KDmJTRSlhiBAVXFkxwBpUhpYVtimamP9225h+PmkSCCYRePzSSdwUUOgZHObPl/7dNjf3ocGq1EKvv7oatCg==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@dcloudio/uni-shared": "3.0.0-alpha-5010220260604001",
|
||||||
|
"@vue/server-renderer": "3.4.21"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-console": {
|
"node_modules/@dcloudio/uni-console": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-console/-/uni-console-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-console/-/uni-console-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-323YWL0nIBGnybKNP1U7Y3PYYT1bJo/7Z+44aZ9X9e5506bjnmTRkWvXhT9qIS1QxFD1dHG68CCuKtevjINdRQ==",
|
"integrity": "sha512-EFoWqXSV1sgj66sy4k7R7lbqbXyNx8Bxfy02MRALxDwXoMQf7bKCuH0mMyjvpy6np1o0XoV5WhaAAsH30XisJA==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"fs-extra": "10.1.0"
|
"fs-extra": "10.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2192,6 +2295,207 @@
|
|||||||
"module-alias": "2.2.3"
|
"module-alias": "2.2.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/@dcloudio/uni-cli-shared": {
|
||||||
|
"version": "3.0.0-alpha-5020120260710001",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-alpha-5020120260710001.tgz",
|
||||||
|
"integrity": "sha512-ZBs1zw83RHh+4Ecsvl/+ML+yGCUVo+oYb9gDaB/Z1leHDQ76kHvNtLNubf/Np9X5pzcXEx/Xe+PhqRvjdeuXbA==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@ampproject/remapping": "^2.1.2",
|
||||||
|
"@babel/code-frame": "7.24.7",
|
||||||
|
"@babel/core": "7.25.2",
|
||||||
|
"@babel/parser": "7.25.6",
|
||||||
|
"@babel/types": "7.25.6",
|
||||||
|
"@dcloudio/uni-i18n": "3.0.0-alpha-5020120260710001",
|
||||||
|
"@dcloudio/uni-nvue-styler": "3.0.0-alpha-5020120260710001",
|
||||||
|
"@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001",
|
||||||
|
"@intlify/core-base": "9.1.9",
|
||||||
|
"@intlify/shared": "9.1.9",
|
||||||
|
"@intlify/vue-devtools": "9.1.9",
|
||||||
|
"@rollup/pluginutils": "5.1.0",
|
||||||
|
"@vue/compiler-core": "3.4.21",
|
||||||
|
"@vue/compiler-dom": "3.4.21",
|
||||||
|
"@vue/compiler-sfc": "3.4.21",
|
||||||
|
"@vue/compiler-ssr": "3.4.21",
|
||||||
|
"@vue/server-renderer": "3.4.21",
|
||||||
|
"@vue/shared": "3.4.21",
|
||||||
|
"adm-zip": "0.5.16",
|
||||||
|
"autoprefixer": "10.4.20",
|
||||||
|
"base64url": "^3.0.1",
|
||||||
|
"chokidar": "3.6.0",
|
||||||
|
"compare-versions": "^3.6.0",
|
||||||
|
"debug": "4.3.7",
|
||||||
|
"entities": "^7.0.0",
|
||||||
|
"es-module-lexer": "1.5.4",
|
||||||
|
"esbuild": "0.20.2",
|
||||||
|
"estree-walker": "2.0.2",
|
||||||
|
"fast-glob": "3.3.3",
|
||||||
|
"fs-extra": "10.1.0",
|
||||||
|
"hash-sum": "2.0.0",
|
||||||
|
"isbinaryfile": "5.0.2",
|
||||||
|
"jsonc-parser": "3.3.1",
|
||||||
|
"lines-and-columns": "^2.0.4",
|
||||||
|
"magic-string": "0.30.11",
|
||||||
|
"merge": "2.1.1",
|
||||||
|
"mime": "3.0.0",
|
||||||
|
"module-alias": "2.2.3",
|
||||||
|
"os-locale-s-fix": "^1.0.8-fix-1",
|
||||||
|
"picocolors": "1.1.0",
|
||||||
|
"postcss-import": "^14.0.2",
|
||||||
|
"postcss-load-config": "^3.1.1",
|
||||||
|
"postcss-modules": "^4.3.0",
|
||||||
|
"postcss-selector-parser": "6.1.2",
|
||||||
|
"resolve": "1.22.8",
|
||||||
|
"source-map-js": "1.2.1",
|
||||||
|
"tapable": "^2.2.0",
|
||||||
|
"tinycolor2": "1.6.0",
|
||||||
|
"unimport": "4.1.1",
|
||||||
|
"unplugin-auto-import": "19.1.0",
|
||||||
|
"xregexp": "5.1.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^14.18.0 || >=16.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/@dcloudio/uni-i18n": {
|
||||||
|
"version": "3.0.0-alpha-5020120260710001",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-alpha-5020120260710001.tgz",
|
||||||
|
"integrity": "sha512-B4PFuzRdFi9PIX6rvuJGvAJUlfKZPT9gjGogozWl7eToJbzX+vNjG5kPT0uaSBzI9qlbS6L2ObCkYkudZAPCBQ==",
|
||||||
|
"license": "Apache-2.0"
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/@dcloudio/uni-nvue-styler": {
|
||||||
|
"version": "3.0.0-alpha-5020120260710001",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-nvue-styler/-/uni-nvue-styler-3.0.0-alpha-5020120260710001.tgz",
|
||||||
|
"integrity": "sha512-ahXTw9RyQb1EmaRYA/PFqyeUBAu41YyC4sdyXscpY5UAQUqC6EGu8IEIdrczj8pxYMitE7tGseGoWQdMEUtDGg==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@vue/shared": "3.4.21",
|
||||||
|
"parse-css-font": "^4.0.0",
|
||||||
|
"postcss": "8.5.6",
|
||||||
|
"tinycolor2": "1.6.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/@dcloudio/uni-shared": {
|
||||||
|
"version": "3.0.0-alpha-5020120260710001",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-alpha-5020120260710001.tgz",
|
||||||
|
"integrity": "sha512-9awppRC9Mj9rpCLVNA5tR5qvyj3cui7CKzMhdn32haDA5MQb3JzWJvoUA1byjvbsaVahDrkCy9+68ltf9QLnyA==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@vue/shared": "3.4.21"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/compiler-core": {
|
||||||
|
"version": "3.4.21",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz",
|
||||||
|
"integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/parser": "^7.23.9",
|
||||||
|
"@vue/shared": "3.4.21",
|
||||||
|
"entities": "^4.5.0",
|
||||||
|
"estree-walker": "^2.0.2",
|
||||||
|
"source-map-js": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/@vue/compiler-core/node_modules/entities": {
|
||||||
|
"version": "4.5.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
|
||||||
|
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
|
||||||
|
"license": "BSD-2-Clause",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/fb55/entities?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/picomatch": {
|
||||||
|
"version": "4.0.5",
|
||||||
|
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz",
|
||||||
|
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/jonschlinkert"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/postcss": {
|
||||||
|
"version": "8.5.6",
|
||||||
|
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
|
||||||
|
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/postcss/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "tidelift",
|
||||||
|
"url": "https://tidelift.com/funding/github/npm/postcss"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/ai"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"nanoid": "^3.3.11",
|
||||||
|
"picocolors": "^1.1.1",
|
||||||
|
"source-map-js": "^1.2.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^10 || ^12 || >=14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/postcss/node_modules/picocolors": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
|
||||||
|
"license": "ISC"
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/unplugin-auto-import": {
|
||||||
|
"version": "19.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz",
|
||||||
|
"integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"local-pkg": "^1.0.0",
|
||||||
|
"magic-string": "^0.30.17",
|
||||||
|
"picomatch": "^4.0.2",
|
||||||
|
"unimport": "^4.1.1",
|
||||||
|
"unplugin": "^2.2.0",
|
||||||
|
"unplugin-utils": "^0.2.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/antfu"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@nuxt/kit": "^3.2.2",
|
||||||
|
"@vueuse/core": "*"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@nuxt/kit": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"@vueuse/core": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5-vite/node_modules/unplugin-auto-import/node_modules/magic-string": {
|
||||||
|
"version": "0.30.21",
|
||||||
|
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
|
||||||
|
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/sourcemap-codec": "^1.5.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@dcloudio/uni-h5-vue": {
|
"node_modules/@dcloudio/uni-h5-vue": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5020120260710001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vue/-/uni-h5-vue-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-h5-vue/-/uni-h5-vue-3.0.0-alpha-5020120260710001.tgz",
|
||||||
@@ -2202,16 +2506,40 @@
|
|||||||
"@vue/server-renderer": "3.4.21"
|
"@vue/server-renderer": "3.4.21"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-i18n": {
|
"node_modules/@dcloudio/uni-h5-vue/node_modules/@dcloudio/uni-shared": {
|
||||||
|
"version": "3.0.0-alpha-5020120260710001",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-alpha-5020120260710001.tgz",
|
||||||
|
"integrity": "sha512-9awppRC9Mj9rpCLVNA5tR5qvyj3cui7CKzMhdn32haDA5MQb3JzWJvoUA1byjvbsaVahDrkCy9+68ltf9QLnyA==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@vue/shared": "3.4.21"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-h5/node_modules/@dcloudio/uni-i18n": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5020120260710001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-alpha-5020120260710001.tgz",
|
||||||
"integrity": "sha512-B4PFuzRdFi9PIX6rvuJGvAJUlfKZPT9gjGogozWl7eToJbzX+vNjG5kPT0uaSBzI9qlbS6L2ObCkYkudZAPCBQ==",
|
"integrity": "sha512-B4PFuzRdFi9PIX6rvuJGvAJUlfKZPT9gjGogozWl7eToJbzX+vNjG5kPT0uaSBzI9qlbS6L2ObCkYkudZAPCBQ==",
|
||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-nvue-styler": {
|
"node_modules/@dcloudio/uni-h5/node_modules/@dcloudio/uni-shared": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5020120260710001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-nvue-styler/-/uni-nvue-styler-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-alpha-5020120260710001.tgz",
|
||||||
"integrity": "sha512-ahXTw9RyQb1EmaRYA/PFqyeUBAu41YyC4sdyXscpY5UAQUqC6EGu8IEIdrczj8pxYMitE7tGseGoWQdMEUtDGg==",
|
"integrity": "sha512-9awppRC9Mj9rpCLVNA5tR5qvyj3cui7CKzMhdn32haDA5MQb3JzWJvoUA1byjvbsaVahDrkCy9+68ltf9QLnyA==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@vue/shared": "3.4.21"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-i18n": {
|
||||||
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-alpha-5010220260604001.tgz",
|
||||||
|
"integrity": "sha512-IFIJnf1dpG96RLbDkQd7+2sPpedlIotuBk4Kldl2X0Dogeh2rRe1G3/DBlqVDNo97AvABF4nYChPQj6KFsV40A==",
|
||||||
|
"license": "Apache-2.0"
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/uni-nvue-styler": {
|
||||||
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-nvue-styler/-/uni-nvue-styler-3.0.0-alpha-5010220260604001.tgz",
|
||||||
|
"integrity": "sha512-u+R+k2MXXPzMSdyoNJ+qwKhuuRfbfH8tGRtAVvbPWLqVUQMGnHBMEeK87zCkXfBQNUYFrs0JtOXtHU8DiG9JFg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/shared": "3.4.21",
|
"@vue/shared": "3.4.21",
|
||||||
@@ -2255,31 +2583,31 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-push": {
|
"node_modules/@dcloudio/uni-push": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-push/-/uni-push-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-push/-/uni-push-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-aRqZdjHu9A0XWT4h4OMl6bs0O+GrnuUPTTrQ/6rWuTC08Vx3ZhDxoB9emhf4JyKGfHbIBqHdSIt/rtNITTtjlg==",
|
"integrity": "sha512-tuflI92CaC8k4KptGIyxVD+utTtp36bO4myNeZOtYH2pE0jArx0H+CNpuCtMWBhZWtkw2x1pX9/lYONbnH8oSg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001"
|
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5010220260604001"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-shared": {
|
"node_modules/@dcloudio/uni-shared": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-shared/-/uni-shared-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-9awppRC9Mj9rpCLVNA5tR5qvyj3cui7CKzMhdn32haDA5MQb3JzWJvoUA1byjvbsaVahDrkCy9+68ltf9QLnyA==",
|
"integrity": "sha512-bzhGjGZZ/H3dvIeoDXAQXw6o0eZYJB5ET0JKQZaV1yw4fAsmB11W/Wt7mizfLe+NYJ/NdjlnLAq4mUskWZrRbg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/shared": "3.4.21"
|
"@vue/shared": "3.4.21"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/uni-stat": {
|
"node_modules/@dcloudio/uni-stat": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-stat/-/uni-stat-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/uni-stat/-/uni-stat-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-bXMWdKBAsPWahhaD3RDc6AlnIh/mvfhXipfTwZreknp+0y5Z5cSoKmfOTG6HGBXfMyp4/r1DXo71bgZTWtZUOw==",
|
"integrity": "sha512-DrnysOch1gOA8WZYLJA3OXMcdAT+h0vIP9hvWM7k1hjDUngb1DgWNo2N4E/Pc+3FFnQNnfORGTN+M4ti3edDkQ==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"debug": "4.3.7"
|
"debug": "4.3.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2290,19 +2618,18 @@
|
|||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/@dcloudio/vite-plugin-uni": {
|
"node_modules/@dcloudio/vite-plugin-uni": {
|
||||||
"version": "3.0.0-alpha-5020120260710001",
|
"version": "3.0.0-alpha-5010220260604001",
|
||||||
"resolved": "https://registry.npmmirror.com/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-alpha-5020120260710001.tgz",
|
"resolved": "https://registry.npmmirror.com/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-alpha-5010220260604001.tgz",
|
||||||
"integrity": "sha512-nns/haZStdxXDUehSRiKjlOGquKl9aoV7hKN/CeJBR80mO4iNvHUAJwZLlXNA4vZbvdCfb/WxGljxG3fN5+UTQ==",
|
"integrity": "sha512-CTCiWuXID6eRSzX+XHK0ZfsO9XjK9EQRr0tfisbfiPv1+HABZsGaxOaLOKzRxrDhdqBTBr5L8ahEtcPJ2HWdVQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "7.25.2",
|
"@babel/core": "7.25.2",
|
||||||
"@babel/plugin-syntax-import-meta": "^7.10.4",
|
"@babel/plugin-syntax-import-meta": "^7.10.4",
|
||||||
"@babel/plugin-transform-typescript": "^7.23.3",
|
"@babel/plugin-transform-typescript": "^7.23.3",
|
||||||
"@babel/types": "7.25.6",
|
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-nvue-styler": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-nvue-styler": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-shared": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-shared": "3.0.0-alpha-5020120260710001",
|
|
||||||
"@rollup/pluginutils": "5.1.0",
|
"@rollup/pluginutils": "5.1.0",
|
||||||
"@vitejs/plugin-legacy": "5.3.2",
|
"@vitejs/plugin-legacy": "5.3.2",
|
||||||
"@vitejs/plugin-vue": "5.2.4",
|
"@vitejs/plugin-vue": "5.2.4",
|
||||||
@@ -2313,7 +2640,6 @@
|
|||||||
"@vue/shared": "3.4.21",
|
"@vue/shared": "3.4.21",
|
||||||
"cac": "6.7.9",
|
"cac": "6.7.9",
|
||||||
"debug": "4.3.7",
|
"debug": "4.3.7",
|
||||||
"es-module-lexer": "1.5.4",
|
|
||||||
"estree-walker": "2.0.2",
|
"estree-walker": "2.0.2",
|
||||||
"express": "4.20.0",
|
"express": "4.20.0",
|
||||||
"fast-glob": "3.3.3",
|
"fast-glob": "3.3.3",
|
||||||
@@ -2322,7 +2648,6 @@
|
|||||||
"jsonc-parser": "3.3.1",
|
"jsonc-parser": "3.3.1",
|
||||||
"magic-string": "0.30.11",
|
"magic-string": "0.30.11",
|
||||||
"picocolors": "1.1.0",
|
"picocolors": "1.1.0",
|
||||||
"source-map-js": "1.2.1",
|
|
||||||
"terser": "^5.4.0",
|
"terser": "^5.4.0",
|
||||||
"unplugin-auto-import": "19.1.0"
|
"unplugin-auto-import": "19.1.0"
|
||||||
},
|
},
|
||||||
@@ -2363,6 +2688,62 @@
|
|||||||
"url": "https://github.com/fb55/entities?sponsor=1"
|
"url": "https://github.com/fb55/entities?sponsor=1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@dcloudio/vite-plugin-uni/node_modules/picomatch": {
|
||||||
|
"version": "4.0.5",
|
||||||
|
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz",
|
||||||
|
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/jonschlinkert"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/vite-plugin-uni/node_modules/unplugin-auto-import": {
|
||||||
|
"version": "19.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz",
|
||||||
|
"integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"local-pkg": "^1.0.0",
|
||||||
|
"magic-string": "^0.30.17",
|
||||||
|
"picomatch": "^4.0.2",
|
||||||
|
"unimport": "^4.1.1",
|
||||||
|
"unplugin": "^2.2.0",
|
||||||
|
"unplugin-utils": "^0.2.4"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/antfu"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@nuxt/kit": "^3.2.2",
|
||||||
|
"@vueuse/core": "*"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@nuxt/kit": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"@vueuse/core": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@dcloudio/vite-plugin-uni/node_modules/unplugin-auto-import/node_modules/magic-string": {
|
||||||
|
"version": "0.30.21",
|
||||||
|
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
|
||||||
|
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/sourcemap-codec": "^1.5.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@esbuild/aix-ppc64": {
|
"node_modules/@esbuild/aix-ppc64": {
|
||||||
"version": "0.20.2",
|
"version": "0.20.2",
|
||||||
"resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
|
"resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
|
||||||
@@ -7139,59 +7520,6 @@
|
|||||||
"node": ">=18.12.0"
|
"node": ">=18.12.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/unplugin-auto-import": {
|
|
||||||
"version": "19.1.0",
|
|
||||||
"resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz",
|
|
||||||
"integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"local-pkg": "^1.0.0",
|
|
||||||
"magic-string": "^0.30.17",
|
|
||||||
"picomatch": "^4.0.2",
|
|
||||||
"unimport": "^4.1.1",
|
|
||||||
"unplugin": "^2.2.0",
|
|
||||||
"unplugin-utils": "^0.2.4"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=14"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/antfu"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@nuxt/kit": "^3.2.2",
|
|
||||||
"@vueuse/core": "*"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"@nuxt/kit": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"@vueuse/core": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/unplugin-auto-import/node_modules/magic-string": {
|
|
||||||
"version": "0.30.21",
|
|
||||||
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
|
|
||||||
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@jridgewell/sourcemap-codec": "^1.5.5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/unplugin-auto-import/node_modules/picomatch": {
|
|
||||||
"version": "4.0.5",
|
|
||||||
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz",
|
|
||||||
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/jonschlinkert"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/unplugin-utils": {
|
"node_modules/unplugin-utils": {
|
||||||
"version": "0.2.5",
|
"version": "0.2.5",
|
||||||
"resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.5.tgz",
|
"resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.5.tgz",
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
"typecheck": "vue-tsc --noEmit"
|
"typecheck": "vue-tsc --noEmit"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dcloudio/uni-app": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-app": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-app-plus": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-app-plus": "3.0.0-alpha-5010220260604001",
|
||||||
"@dcloudio/uni-h5": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/uni-h5": "3.0.0-alpha-5020120260710001",
|
||||||
"@dcloudio/uni-ui": "^1.5.12",
|
"@dcloudio/uni-ui": "^1.5.12",
|
||||||
"lxgw-wenkai-tc-webfont": "^1.0.0",
|
"lxgw-wenkai-tc-webfont": "^1.0.0",
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@dcloudio/types": "3.4.31",
|
"@dcloudio/types": "3.4.31",
|
||||||
"@dcloudio/vite-plugin-uni": "3.0.0-alpha-5020120260710001",
|
"@dcloudio/vite-plugin-uni": "3.0.0-alpha-5010220260604001",
|
||||||
"sass": "^1.101.0",
|
"sass": "^1.101.0",
|
||||||
"typescript": "~5.9.3",
|
"typescript": "~5.9.3",
|
||||||
"vite": "5.2.8",
|
"vite": "5.2.8",
|
||||||
|
|||||||
Generated
+397
-263
File diff suppressed because it is too large
Load Diff
@@ -34,37 +34,37 @@ const positionProfiles: Record<UserPosition, UserPositionProfile> = {
|
|||||||
生活顾问: {
|
生活顾问: {
|
||||||
value: '生活顾问',
|
value: '生活顾问',
|
||||||
heroTitle: '客服管家',
|
heroTitle: '客服管家',
|
||||||
quickQuestions: ['催费话术', '投诉应对', '收费标准'],
|
quickQuestions: ['催费话术怎么说', '投诉怎么应对', '收费标准是什么'],
|
||||||
tip: '接待客户三步法:听清诉求 → 共情理解 → 解决闭环'
|
tip: '接待客户三步法:听清诉求 → 共情理解 → 解决闭环'
|
||||||
},
|
},
|
||||||
保安: {
|
保安: {
|
||||||
value: '保安',
|
value: '保安',
|
||||||
heroTitle: '秩序岗',
|
heroTitle: '秩序岗',
|
||||||
quickQuestions: ['门岗核验', '巡逻异常', '车辆指引'],
|
quickQuestions: ['门岗怎么核验', '巡逻发现异常怎么办', '车辆怎么指引'],
|
||||||
tip: '今日小贴士:异常先确认人车物,再登记,再同步主管。'
|
tip: '今日小贴士:异常先确认人车物,再登记,再同步主管。'
|
||||||
},
|
},
|
||||||
保洁: {
|
保洁: {
|
||||||
value: '保洁',
|
value: '保洁',
|
||||||
heroTitle: '环境岗',
|
heroTitle: '环境岗',
|
||||||
quickQuestions: ['公区清洁', '垃圾分类', '消杀标准'],
|
quickQuestions: ['公区清洁怎么做', '垃圾怎么分类', '消杀标准是什么'],
|
||||||
tip: '今日小贴士:高频区域先看地面、扶手、电梯按钮。'
|
tip: '今日小贴士:高频区域先看地面、扶手、电梯按钮。'
|
||||||
},
|
},
|
||||||
保修: {
|
保修: {
|
||||||
value: '保修',
|
value: '保修',
|
||||||
heroTitle: '工程维修',
|
heroTitle: '工程维修',
|
||||||
quickQuestions: ['报修接单', '上门话术', '安全检查'],
|
quickQuestions: ['报修怎么接单', '上门话术怎么说', '安全检查怎么做'],
|
||||||
tip: '今日小贴士:上门前确认故障、工具、预约时间。'
|
tip: '今日小贴士:上门前确认故障、工具、预约时间。'
|
||||||
},
|
},
|
||||||
客服: {
|
客服: {
|
||||||
value: '客服',
|
value: '客服',
|
||||||
heroTitle: '服务前台',
|
heroTitle: '服务前台',
|
||||||
quickQuestions: ['来访接待', '投诉登记', '工单跟进'],
|
quickQuestions: ['来访怎么接待', '投诉怎么登记', '工单怎么跟进'],
|
||||||
tip: '今日小贴士:复杂诉求先复述确认,再记录责任人与时限。'
|
tip: '今日小贴士:复杂诉求先复述确认,再记录责任人与时限。'
|
||||||
},
|
},
|
||||||
主管: {
|
主管: {
|
||||||
value: '主管',
|
value: '主管',
|
||||||
heroTitle: '项目管理',
|
heroTitle: '项目管理',
|
||||||
quickQuestions: ['团队沟通', '现场协调', '投诉复盘'],
|
quickQuestions: ['团队怎么沟通', '现场怎么协调', '投诉怎么复盘'],
|
||||||
tip: '今日小贴士:先确认事实与责任人,再明确动作、时限和复盘节点。'
|
tip: '今日小贴士:先确认事实与责任人,再明确动作、时限和复盘节点。'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
/**
|
||||||
|
* 从 MP3 字节流数出时长,不依赖任何宿主音频 API。
|
||||||
|
*
|
||||||
|
* 起因:`measureAudioDuration` 用浏览器的 `Audio` 构造器探测元数据,而
|
||||||
|
* App-Plus 的逻辑层是 JsCore 而非 webview,`typeof Audio === 'undefined'`
|
||||||
|
* 直接成立,于是 App 上语音条永远拿不到秒数,退化成「语音」二字。
|
||||||
|
*
|
||||||
|
* 逐帧累加而不是用 `字节数 / 比特率` 估算:后者只在 CBR 下准确,VBR 会偏。
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** kbps。索引 [是否 MPEG1][bitrateIndex],Layer III 专用。 */
|
||||||
|
const LAYER3_BITRATES = {
|
||||||
|
mpeg1: [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0],
|
||||||
|
mpeg2: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0]
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
/** Hz。索引 [versionBits][sampleRateIndex]。 */
|
||||||
|
const SAMPLE_RATES: Record<number, readonly number[]> = {
|
||||||
|
3: [44100, 48000, 32000], // MPEG1
|
||||||
|
2: [22050, 24000, 16000], // MPEG2
|
||||||
|
0: [11025, 12000, 8000] // MPEG2.5
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Layer III 每帧采样数:MPEG1 为 1152,MPEG2/2.5 减半。 */
|
||||||
|
const samplesPerFrame = (isMpeg1: boolean) => (isMpeg1 ? 1152 : 576);
|
||||||
|
|
||||||
|
/** ID3v2 头长 10 字节,尺寸是 4 个 synchsafe 字节(每字节仅低 7 位有效)。 */
|
||||||
|
const id3v2Length = (bytes: Uint8Array): number => {
|
||||||
|
if (bytes.length < 10) return 0;
|
||||||
|
if (bytes[0] !== 0x49 || bytes[1] !== 0x44 || bytes[2] !== 0x33) return 0;
|
||||||
|
const size = ((bytes[6] & 0x7f) << 21) | ((bytes[7] & 0x7f) << 14) | ((bytes[8] & 0x7f) << 7) | (bytes[9] & 0x7f);
|
||||||
|
const footer = (bytes[5] & 0x10) !== 0 ? 10 : 0;
|
||||||
|
return 10 + size + footer;
|
||||||
|
};
|
||||||
|
|
||||||
|
interface Frame {
|
||||||
|
length: number;
|
||||||
|
seconds: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 解析一个帧头;不是合法 Layer III 帧头时返回 null。 */
|
||||||
|
const readFrame = (bytes: Uint8Array, at: number): Frame | null => {
|
||||||
|
if (at + 4 > bytes.length) return null;
|
||||||
|
// 11 位帧同步
|
||||||
|
if (bytes[at] !== 0xff || (bytes[at + 1] & 0xe0) !== 0xe0) return null;
|
||||||
|
|
||||||
|
const versionBits = (bytes[at + 1] >> 3) & 0x03;
|
||||||
|
if (versionBits === 1) return null; // 保留值
|
||||||
|
const layerBits = (bytes[at + 1] >> 1) & 0x03;
|
||||||
|
if (layerBits !== 1) return null; // 只处理 Layer III
|
||||||
|
|
||||||
|
const bitrateIndex = (bytes[at + 2] >> 4) & 0x0f;
|
||||||
|
const sampleRateIndex = (bytes[at + 2] >> 2) & 0x03;
|
||||||
|
if (sampleRateIndex === 3) return null;
|
||||||
|
|
||||||
|
const isMpeg1 = versionBits === 3;
|
||||||
|
const bitrate = (isMpeg1 ? LAYER3_BITRATES.mpeg1 : LAYER3_BITRATES.mpeg2)[bitrateIndex];
|
||||||
|
const sampleRate = SAMPLE_RATES[versionBits]?.[sampleRateIndex];
|
||||||
|
if (!bitrate || !sampleRate) return null; // free-format / 保留值
|
||||||
|
|
||||||
|
const samples = samplesPerFrame(isMpeg1);
|
||||||
|
const padding = (bytes[at + 2] >> 1) & 0x01;
|
||||||
|
const length = Math.floor((samples / 8) * bitrate * 1000 / sampleRate) + padding;
|
||||||
|
if (length <= 4) return null;
|
||||||
|
return { length, seconds: samples / sampleRate };
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 累加所有帧得到秒数;一个合法帧都找不到时返回 null。
|
||||||
|
*
|
||||||
|
* 首帧通常是 Xing/LAME 信息帧,它本身也是合法音频帧,计入只多约 24ms,
|
||||||
|
* 不足以影响向上取整后的展示值,因此不做特殊剔除。
|
||||||
|
*/
|
||||||
|
export const estimateMpegAudioDuration = (bytes: Uint8Array): number | null => {
|
||||||
|
let at = id3v2Length(bytes);
|
||||||
|
let seconds = 0;
|
||||||
|
let frames = 0;
|
||||||
|
|
||||||
|
while (at < bytes.length) {
|
||||||
|
const frame = readFrame(bytes, at);
|
||||||
|
if (frame) {
|
||||||
|
seconds += frame.seconds;
|
||||||
|
frames += 1;
|
||||||
|
at += frame.length;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 遇到 ID3v1 尾标或其它非帧数据就停,不再向后重新找同步字,
|
||||||
|
// 免得把任意 0xff 字节误判成帧头而虚增时长。
|
||||||
|
if (frames > 0) break;
|
||||||
|
at += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return frames > 0 && seconds > 0 ? seconds : null;
|
||||||
|
};
|
||||||
@@ -2,7 +2,8 @@ import type { AsrResponse, PracticeTtsContext, SpeechPlaybackStatus, SpeechSelec
|
|||||||
import { apiRequest, apiUrl, authHeaders, readTextPayload } from './api';
|
import { apiRequest, apiUrl, authHeaders, readTextPayload } from './api';
|
||||||
import { getAuth } from './auth';
|
import { getAuth } from './auth';
|
||||||
import type { SpeechCapture } from './speech-capture';
|
import type { SpeechCapture } from './speech-capture';
|
||||||
import { dataUriToBlobUrl, hasNativeAudioFileSupport, isDataAudioUri, removeNativeTempAudio, writeNativeTempAudio } from './speech-audio-source';
|
import { estimateMpegAudioDuration } from './mpeg-audio-duration';
|
||||||
|
import { dataUriToBlobUrl, decodeDataAudioUri, hasNativeAudioFileSupport, isDataAudioUri, removeNativeTempAudio, writeNativeTempAudio } from './speech-audio-source';
|
||||||
import { applyTtsVoicePreference, getTtsDialectPreference, getTtsVoicePreference } from './tts-voice-preference';
|
import { applyTtsVoicePreference, getTtsDialectPreference, getTtsVoicePreference } from './tts-voice-preference';
|
||||||
|
|
||||||
const audioExtensions = ['.mp3', '.wav', '.m4a', '.webm', '.aac', '.ogg'];
|
const audioExtensions = ['.mp3', '.wav', '.m4a', '.webm', '.aac', '.ogg'];
|
||||||
@@ -344,8 +345,28 @@ export const createSpeechPlaybackController = (
|
|||||||
return { toggle, stop, destroy, preload };
|
return { toggle, stop, destroy, preload };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* data: URI 直接数帧,不经宿主音频 API。
|
||||||
|
*
|
||||||
|
* App-Plus 的逻辑层是 JsCore,没有 `Audio`,原先在这里直接返回 null,
|
||||||
|
* 导致语音条只显示「语音」而没有秒数。字节解析在 H5 上同样可用且更快,
|
||||||
|
* 所以两端都优先走它,`Audio` 只作为远端 URL 的兜底。
|
||||||
|
*/
|
||||||
|
const measureFromBytes = (source: string): number | null => {
|
||||||
|
if (!isDataAudioUri(source)) return null;
|
||||||
|
const decoded = decodeDataAudioUri(source);
|
||||||
|
if (!decoded) return null;
|
||||||
|
const seconds = estimateMpegAudioDuration(decoded.bytes);
|
||||||
|
return seconds ? Math.max(1, Math.round(seconds)) : null;
|
||||||
|
};
|
||||||
|
|
||||||
export const measureAudioDuration = (source: string): Promise<number | null> =>
|
export const measureAudioDuration = (source: string): Promise<number | null> =>
|
||||||
new Promise((resolve) => {
|
new Promise((resolve) => {
|
||||||
|
const fromBytes = measureFromBytes(source);
|
||||||
|
if (fromBytes !== null) {
|
||||||
|
resolve(fromBytes);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (typeof Audio === 'undefined') {
|
if (typeof Audio === 'undefined') {
|
||||||
resolve(null);
|
resolve(null);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -5,7 +5,15 @@ export const qwenTtsVoiceOptions = [
|
|||||||
{ value: 'longanhuan_v3.6', label: '龙安欢 · 中文女声' },
|
{ value: 'longanhuan_v3.6', label: '龙安欢 · 中文女声' },
|
||||||
{ value: 'longjielidou_v3.6', label: '龙杰力豆 · 童声' },
|
{ value: 'longjielidou_v3.6', label: '龙杰力豆 · 童声' },
|
||||||
{ value: 'loongeva_v3.6', label: 'Loongeva · 英文女声' },
|
{ value: 'loongeva_v3.6', label: 'Loongeva · 英文女声' },
|
||||||
{ value: 'loongjohn', label: 'loongJohn · 英文男声' }
|
{ value: 'loongjohn', label: 'loongJohn · 英文男声' },
|
||||||
|
{ value: 'qwen-audio-3.0-tts-flash-longyingmuyu', label: '龙应沐语 · 温柔客服女声' },
|
||||||
|
{ value: 'qwen-audio-3.0-tts-flash-longyingshiyu', label: '龙应时渝 · 干练客服女声' },
|
||||||
|
{ value: 'qwen-audio-3.0-tts-flash-longchezhuyu', label: '龙澈竹雨 · 自然助手女声' },
|
||||||
|
{ value: 'qwen-audio-3.0-tts-flash-longyingyueyue', label: '龙应越越 · 耐心讲解女声' },
|
||||||
|
{ value: 'qwen-audio-3.0-tts-flash-longluxiaohui', label: '龙露潇晖 · 亲切客服男声' },
|
||||||
|
{ value: 'qwen-audio-3.0-tts-flash-longlanqinluan', label: '龙兰琴鸾 · 沉稳知性女声' },
|
||||||
|
{ value: 'qwen-audio-3.0-tts-flash-longluliuche', label: '龙露柳澈 · 新闻播报男声' },
|
||||||
|
{ value: 'qwen-audio-3.0-tts-flash-longliuxulan', label: '龙柳旭澜 · 新闻播报女声' }
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export const qwenTtsDialectOptions = [
|
export const qwenTtsDialectOptions = [
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { dirname, resolve } from 'node:path';
|
|||||||
|
|
||||||
const mobileRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
const mobileRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
||||||
const readJson = async (path) => JSON.parse(await readFile(new URL(path, import.meta.url), 'utf8'));
|
const readJson = async (path) => JSON.parse(await readFile(new URL(path, import.meta.url), 'utf8'));
|
||||||
|
const hbuilderx515AppCompiler = '3.0.0-alpha-5010220260604001';
|
||||||
|
|
||||||
test('App 图标与启动图映射均可由预检脚本验证', () => {
|
test('App 图标与启动图映射均可由预检脚本验证', () => {
|
||||||
const output = execFileSync(process.execPath, ['scripts/verify-app-assets.mjs'], {
|
const output = execFileSync(process.execPath, ['scripts/verify-app-assets.mjs'], {
|
||||||
@@ -24,6 +25,7 @@ test('App 平台编译器已声明且与其他 uni 包同版本,避免 build:a
|
|||||||
const appPlus = pkg.dependencies?.['@dcloudio/uni-app-plus'];
|
const appPlus = pkg.dependencies?.['@dcloudio/uni-app-plus'];
|
||||||
|
|
||||||
assert.ok(appPlus, '缺少 @dcloudio/uni-app-plus,build:app 会静默产出 H5 空壳');
|
assert.ok(appPlus, '缺少 @dcloudio/uni-app-plus,build:app 会静默产出 H5 空壳');
|
||||||
|
assert.equal(appPlus, hbuilderx515AppCompiler, 'App 编译链必须与当前 HBuilderX 5.15 调试基座匹配');
|
||||||
assert.equal(appPlus, pkg.dependencies['@dcloudio/uni-app']);
|
assert.equal(appPlus, pkg.dependencies['@dcloudio/uni-app']);
|
||||||
assert.equal(appPlus, pkg.devDependencies['@dcloudio/vite-plugin-uni']);
|
assert.equal(appPlus, pkg.devDependencies['@dcloudio/vite-plugin-uni']);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,110 @@
|
|||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import { readFile } from 'node:fs/promises';
|
||||||
|
import test from 'node:test';
|
||||||
|
import vm from 'node:vm';
|
||||||
|
import ts from 'typescript';
|
||||||
|
|
||||||
|
const loadModule = async () => {
|
||||||
|
const source = await readFile(new URL('../src/services/mpeg-audio-duration.ts', import.meta.url), 'utf8');
|
||||||
|
const compiled = ts.transpileModule(source, {
|
||||||
|
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 }
|
||||||
|
});
|
||||||
|
const runtimeModule = { exports: {} };
|
||||||
|
vm.runInNewContext(compiled.outputText, { exports: runtimeModule.exports, module: runtimeModule });
|
||||||
|
return runtimeModule.exports;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 造一个 Layer III 帧头。默认参数对应后端 TTS 实际产物:
|
||||||
|
* MPEG2 / 24 kHz / 160 kbps / 单声道,帧长 480 字节、每帧 576 采样 = 24ms。
|
||||||
|
*/
|
||||||
|
const frame = ({ mpeg1 = false, bitrateIndex = 14, sampleRateIndex = 1, padding = 0 } = {}) => {
|
||||||
|
const versionBits = mpeg1 ? 3 : 2;
|
||||||
|
const header = Uint8Array.from([
|
||||||
|
0xff,
|
||||||
|
0xe0 | (versionBits << 3) | (1 << 1), // layer III, 无 CRC
|
||||||
|
(bitrateIndex << 4) | (sampleRateIndex << 2) | (padding << 1),
|
||||||
|
0xc0 // 单声道
|
||||||
|
]);
|
||||||
|
const samples = mpeg1 ? 1152 : 576;
|
||||||
|
const bitrate = mpeg1
|
||||||
|
? [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0][bitrateIndex]
|
||||||
|
: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0][bitrateIndex];
|
||||||
|
const sampleRate = (mpeg1 ? [44100, 48000, 32000] : [22050, 24000, 16000])[sampleRateIndex];
|
||||||
|
const length = Math.floor((samples / 8) * bitrate * 1000 / sampleRate) + padding;
|
||||||
|
// free-format(bitrate 0)算出的帧长为 0,仍要放得下 4 字节帧头供解析器判定。
|
||||||
|
const body = new Uint8Array(Math.max(4, length));
|
||||||
|
body.set(header);
|
||||||
|
return body;
|
||||||
|
};
|
||||||
|
|
||||||
|
const concat = (...chunks) => {
|
||||||
|
const total = chunks.reduce((sum, c) => sum + c.length, 0);
|
||||||
|
const out = new Uint8Array(total);
|
||||||
|
let at = 0;
|
||||||
|
for (const c of chunks) {
|
||||||
|
out.set(c, at);
|
||||||
|
at += c.length;
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** ID3v2 头:尺寸为 4 个 synchsafe 字节,必须被跳过才能对上首帧。 */
|
||||||
|
const id3v2 = (payloadSize) => {
|
||||||
|
const head = new Uint8Array(10 + payloadSize);
|
||||||
|
head.set([0x49, 0x44, 0x33, 0x03, 0x00, 0x00]);
|
||||||
|
head[6] = (payloadSize >> 21) & 0x7f;
|
||||||
|
head[7] = (payloadSize >> 14) & 0x7f;
|
||||||
|
head[8] = (payloadSize >> 7) & 0x7f;
|
||||||
|
head[9] = payloadSize & 0x7f;
|
||||||
|
return head;
|
||||||
|
};
|
||||||
|
|
||||||
|
test('累加帧数得出时长', async () => {
|
||||||
|
const { estimateMpegAudioDuration } = await loadModule();
|
||||||
|
const bytes = concat(...Array.from({ length: 10 }, () => frame()));
|
||||||
|
assert.equal(Number(estimateMpegAudioDuration(bytes).toFixed(3)), 0.24);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('跳过 ID3v2 标签,不把标签字节当帧', async () => {
|
||||||
|
const { estimateMpegAudioDuration } = await loadModule();
|
||||||
|
// 标签内塞入 0xff,若未按尺寸跳过就会被误判成帧头。
|
||||||
|
const tag = id3v2(81);
|
||||||
|
tag.fill(0xff, 10);
|
||||||
|
const bytes = concat(tag, ...Array.from({ length: 171 }, () => frame()));
|
||||||
|
assert.equal(Number(estimateMpegAudioDuration(bytes).toFixed(3)), 4.104);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('VBR:逐帧累加而非按首帧比特率外推', async () => {
|
||||||
|
const { estimateMpegAudioDuration } = await loadModule();
|
||||||
|
// 帧长不同但每帧采样数相同,时长只取决于帧数。
|
||||||
|
const bytes = concat(frame({ bitrateIndex: 14 }), frame({ bitrateIndex: 6 }), frame({ bitrateIndex: 1 }));
|
||||||
|
assert.equal(Number(estimateMpegAudioDuration(bytes).toFixed(3)), 0.072);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('MPEG1 每帧 1152 采样', async () => {
|
||||||
|
const { estimateMpegAudioDuration } = await loadModule();
|
||||||
|
const bytes = concat(...Array.from({ length: 5 }, () => frame({ mpeg1: true, bitrateIndex: 10, sampleRateIndex: 0 })));
|
||||||
|
assert.equal(Number(estimateMpegAudioDuration(bytes).toFixed(4)), 0.1306);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('padding 位计入帧长,否则后续帧全部错位', async () => {
|
||||||
|
const { estimateMpegAudioDuration } = await loadModule();
|
||||||
|
const bytes = concat(frame({ padding: 1 }), frame(), frame());
|
||||||
|
assert.equal(Number(estimateMpegAudioDuration(bytes).toFixed(3)), 0.072);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('尾部非帧数据(如 ID3v1)不虚增时长', async () => {
|
||||||
|
const { estimateMpegAudioDuration } = await loadModule();
|
||||||
|
const tail = new Uint8Array(128).fill(0xff);
|
||||||
|
const bytes = concat(frame(), frame(), tail);
|
||||||
|
assert.equal(Number(estimateMpegAudioDuration(bytes).toFixed(3)), 0.048);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('没有任何合法帧时返回 null', async () => {
|
||||||
|
const { estimateMpegAudioDuration } = await loadModule();
|
||||||
|
assert.equal(estimateMpegAudioDuration(new Uint8Array(0)), null);
|
||||||
|
assert.equal(estimateMpegAudioDuration(Uint8Array.from([0x00, 0x01, 0x02])), null);
|
||||||
|
// free-format(bitrateIndex 0)无法据此算帧长,应判为不可解析。
|
||||||
|
assert.equal(estimateMpegAudioDuration(frame({ bitrateIndex: 0 })), null);
|
||||||
|
});
|
||||||
@@ -26,10 +26,11 @@ const preferenceRuntime = async (storage = new Map()) => {
|
|||||||
test('播报音色按租户和账号隔离保存,非法值回退跟随场景', async () => {
|
test('播报音色按租户和账号隔离保存,非法值回退跟随场景', async () => {
|
||||||
const storage = new Map();
|
const storage = new Map();
|
||||||
const runtime = await preferenceRuntime(storage);
|
const runtime = await preferenceRuntime(storage);
|
||||||
|
const extendedVoice = 'qwen-audio-3.0-tts-flash-longyingmuyu';
|
||||||
|
|
||||||
assert.equal(runtime.getTtsVoicePreference('000000', '13800000000'), '');
|
assert.equal(runtime.getTtsVoicePreference('000000', '13800000000'), '');
|
||||||
assert.equal(runtime.setTtsVoicePreference('000000', '13800000000', 'longanhuan_v3.6'), 'longanhuan_v3.6');
|
assert.equal(runtime.setTtsVoicePreference('000000', '13800000000', extendedVoice), extendedVoice);
|
||||||
assert.equal(runtime.getTtsVoicePreference('000000', '13800000000'), 'longanhuan_v3.6');
|
assert.equal(runtime.getTtsVoicePreference('000000', '13800000000'), extendedVoice);
|
||||||
assert.equal(runtime.getTtsVoicePreference('000000', '13900000000'), '');
|
assert.equal(runtime.getTtsVoicePreference('000000', '13900000000'), '');
|
||||||
assert.equal(runtime.setTtsVoicePreference('000000', '13800000000', 'untrusted-voice'), '');
|
assert.equal(runtime.setTtsVoicePreference('000000', '13800000000', 'untrusted-voice'), '');
|
||||||
assert.equal(runtime.setTtsDialectPreference('000000', '13800000000', 'shanghai'), 'shanghai');
|
assert.equal(runtime.setTtsDialectPreference('000000', '13800000000', 'shanghai'), 'shanghai');
|
||||||
|
|||||||
Reference in New Issue
Block a user