From 18c50726cdfa83eb1fc1db4b33e4aff06b46c4d0 Mon Sep 17 00:00:00 2001 From: yuzhiran Date: Mon, 15 Jun 2026 10:00:02 +0800 Subject: [PATCH] fix: WeChat login Content-Type header, ASR tiny model, re-upload mini-program v1.0.11 --- .../modules/interview/interview.service.ts | 2 +- .../src/modules/payment/wechat-pay.service.ts | 9 +- backend/src/modules/tts/tts.controller.ts | 5 +- backend/src/modules/tts/tts.service.ts | 49 +++++- zhiyin-app/package-lock.json | 166 ++++++++++++------ zhiyin-app/package.json | 6 +- zhiyin-app/src/components/digital-human.vue | 156 +++++++++++----- zhiyin-app/src/config.ts | 1 + zhiyin-app/src/manifest.json | 4 +- zhiyin-app/src/pages/interview/interview.vue | 20 ++- zhiyin-app/src/pages/login/login.vue | 21 ++- zhiyin-app/static/ai-face.png | Bin 4231 -> 3972 bytes zhiyin-app/static/avatar-algo.png | Bin 0 -> 4264 bytes zhiyin-app/static/avatar-backend.png | Bin 0 -> 4280 bytes zhiyin-app/static/avatar-data.png | Bin 0 -> 4039 bytes zhiyin-app/static/avatar-default.png | Bin 0 -> 3972 bytes zhiyin-app/static/avatar-frontend.png | Bin 0 -> 3933 bytes zhiyin-app/static/avatar-marketing.png | Bin 0 -> 3831 bytes zhiyin-app/static/avatar-ops.png | Bin 0 -> 3969 bytes zhiyin-app/static/avatar-pm.png | Bin 0 -> 3970 bytes zhiyin-app/static/avatar-software.png | Bin 0 -> 3939 bytes zhiyin-app/static/avatar-ui.png | Bin 0 -> 3798 bytes 22 files changed, 311 insertions(+), 128 deletions(-) create mode 100644 zhiyin-app/static/avatar-algo.png create mode 100644 zhiyin-app/static/avatar-backend.png create mode 100644 zhiyin-app/static/avatar-data.png create mode 100644 zhiyin-app/static/avatar-default.png create mode 100644 zhiyin-app/static/avatar-frontend.png create mode 100644 zhiyin-app/static/avatar-marketing.png create mode 100644 zhiyin-app/static/avatar-ops.png create mode 100644 zhiyin-app/static/avatar-pm.png create mode 100644 zhiyin-app/static/avatar-software.png create mode 100644 zhiyin-app/static/avatar-ui.png diff --git a/backend/src/modules/interview/interview.service.ts b/backend/src/modules/interview/interview.service.ts index 79ef060..342d85b 100644 --- a/backend/src/modules/interview/interview.service.ts +++ b/backend/src/modules/interview/interview.service.ts @@ -107,7 +107,7 @@ ${conversationHistory} if (aiMsg?.content) { try { const tts = await this.ttsService.synthesize(aiMsg.content) - return { ...base, ttsHash: tts.hash, ttsDurationMs: tts.durationMs } + return { ...base, ttsHash: tts.hash, ttsDurationMs: tts.durationMs, ttsAmplitude: tts.amplitudeData } } catch { // TTS failure is non-critical, return without audio } diff --git a/backend/src/modules/payment/wechat-pay.service.ts b/backend/src/modules/payment/wechat-pay.service.ts index 54ac922..8d50473 100644 --- a/backend/src/modules/payment/wechat-pay.service.ts +++ b/backend/src/modules/payment/wechat-pay.service.ts @@ -21,8 +21,11 @@ export class WechatPayService { this.logger.warn('微信支付配置不完整,支付功能不可用') } const certDir = path.resolve(__dirname, '../../certs') + if (!fs.existsSync(certDir)) { + this.logger.error(`证书目录不存在: ${certDir}`) + return + } this.privateKey = fs.readFileSync(path.join(certDir, 'apiclient_key.pem'), 'utf8') - // 从证书中提取序列号 const cert = fs.readFileSync(path.join(certDir, 'apiclient_cert.pem'), 'utf8') const certObj = new crypto.X509Certificate(cert) this.mchSerialNo = certObj.serialNumber @@ -122,6 +125,10 @@ export class WechatPayService { // 1. 验签 const message = `${wechatTimestamp}\n${wechatNonce}\n${JSON.stringify(body)}\n` const certDir = path.resolve(__dirname, '../../certs') + if (!fs.existsSync(certDir)) { + this.logger.error(`证书目录不存在: ${certDir}`) + return null + } const platformCert = fs.readFileSync(path.join(certDir, 'pub_key.pem'), 'utf8') const verify = crypto.createVerify('RSA-SHA256').update(message) const isValid = verify.verify(platformCert, wechatSignature, 'base64') diff --git a/backend/src/modules/tts/tts.controller.ts b/backend/src/modules/tts/tts.controller.ts index 2dfaef4..64fbbe2 100644 --- a/backend/src/modules/tts/tts.controller.ts +++ b/backend/src/modules/tts/tts.controller.ts @@ -19,7 +19,7 @@ export class TtsController { throw new HttpException('文本不能为空且不超过500字', HttpStatus.BAD_REQUEST) } const result = await this.ttsService.synthesize(text, voice) - return { hash: result.hash, durationMs: result.durationMs } + return { hash: result.hash, durationMs: result.durationMs, amplitudeData: result.amplitudeData } } @Public() @@ -59,8 +59,7 @@ export class TtsController { const parsed = JSON.parse(result) if (parsed.text) return { text: parsed.text.trim() } } - const whisperBin = '/root/.local/bin/whisper' - const whisperResult = execSync(`${whisperBin} "${dest}" --language zh --output_format txt 2>/dev/null`, { encoding: 'utf8', timeout: 60000 }) + const whisperResult = execSync(`python3 -c 'import sys, whisper; model = whisper.load_model("tiny"); print(model.transcribe(sys.argv[1], language="zh")["text"].strip())' "${dest}"`, { encoding: 'utf8', timeout: 60000 }) if (whisperResult && whisperResult.trim()) { return { text: whisperResult.trim() } } diff --git a/backend/src/modules/tts/tts.service.ts b/backend/src/modules/tts/tts.service.ts index c1c9571..6b75a53 100644 --- a/backend/src/modules/tts/tts.service.ts +++ b/backend/src/modules/tts/tts.service.ts @@ -10,6 +10,7 @@ interface TtsResult { hash: string filePath: string durationMs: number + amplitudeData: number[] } const VALID_VOICES = new Set([ @@ -41,7 +42,10 @@ export class TtsService { if (fs.existsSync(filePath)) { const durationMs = await this.getDuration(filePath) - return { hash, filePath, durationMs } + const amplitudeData = this.loadAmplitudeData(hash) + if (amplitudeData) { + return { hash, filePath, durationMs, amplitudeData } + } } try { @@ -50,8 +54,9 @@ export class TtsService { { timeout: 30000 }, ) const durationMs = await this.getDuration(filePath) + const amplitudeData = this.extractAmplitude(filePath, hash) this.logger.log(`TTS generated: hash=${hash} text="${text.slice(0, 40)}..." duration=${durationMs}ms`) - return { hash, filePath, durationMs } + return { hash, filePath, durationMs, amplitudeData } } catch (e) { this.logger.error(`TTS failed: ${e.message}`) throw e @@ -63,6 +68,46 @@ export class TtsService { return fs.existsSync(filePath) ? filePath : null } + private extractAmplitude(mp3Path: string, hash: string): number[] { + try { + const pcmPath = `/tmp/tts-cache/${hash}.pcm` + execSync( + `ffmpeg -y -i "${mp3Path}" -f s16le -acodec pcm_s16le -ar 16000 -ac 1 "${pcmPath}" 2>/dev/null`, + { timeout: 10000 }, + ) + const pcmBuf = fs.readFileSync(pcmPath) + const samples = new Int16Array(pcmBuf.buffer, pcmBuf.byteOffset, pcmBuf.byteLength / 2) + const chunkSize = Math.floor(16000 * 0.05) // 50ms + const amplitudes: number[] = [] + for (let i = 0; i < samples.length; i += chunkSize) { + const end = Math.min(i + chunkSize, samples.length) + let sumSq = 0 + for (let j = i; j < end; j++) { + sumSq += samples[j] * samples[j] + } + const rms = Math.sqrt(sumSq / (end - i)) + amplitudes.push(Number((Math.min(1, rms / 16000)).toFixed(4))) + } + try { fs.unlinkSync(pcmPath) } catch {} + const ampPath = `/tmp/tts-cache/${hash}.amp` + fs.writeFileSync(ampPath, JSON.stringify(amplitudes)) + return amplitudes + } catch (e) { + this.logger.warn(`振幅提取失败: ${e.message}`) + return [] + } + } + + private loadAmplitudeData(hash: string): number[] | null { + try { + const ampPath = `/tmp/tts-cache/${hash}.amp` + if (!fs.existsSync(ampPath)) return null + return JSON.parse(fs.readFileSync(ampPath, 'utf8')) + } catch { + return null + } + } + private escapeText(text: string): string { return text.replace(/"/g, '\\"').replace(/\n/g, ' ').replace(/\r/g, '') } diff --git a/zhiyin-app/package-lock.json b/zhiyin-app/package-lock.json index e009bba..84a7224 100644 --- a/zhiyin-app/package-lock.json +++ b/zhiyin-app/package-lock.json @@ -25,7 +25,7 @@ "@dcloudio/vite-plugin-uni": "3.0.0-4060620250520001", "@vue/test-utils": "^2.4.11", "jsdom": "^29.1.1", - "miniprogram-ci": "^2.1.31", + "miniprogram-ci": "^2.1.42", "sass": "^1.70.0", "typescript": "^5.3.0", "vite": "^5.2.0", @@ -5674,15 +5674,15 @@ "license": "MIT" }, "node_modules/@swc/core": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core/-/core-1.4.14.tgz", - "integrity": "sha512-tHXg6OxboUsqa/L7DpsCcFnxhLkqN/ht5pCwav1HnvfthbiNIJypr86rNx4cUnQDJepETviSqBTIjxa7pSpGDQ==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core/-/core-1.15.33.tgz", + "integrity": "sha512-jOlwnFV2xhuuZeAUILGFULeR6vDPfijEJ57evfocwznQldLU3w2cZ9bSDryY9ip+AsM3r1NJKzf47V2NXebkeQ==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.2", - "@swc/types": "^0.1.5" + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.26" }, "engines": { "node": ">=10" @@ -5692,19 +5692,21 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.4.14", - "@swc/core-darwin-x64": "1.4.14", - "@swc/core-linux-arm-gnueabihf": "1.4.14", - "@swc/core-linux-arm64-gnu": "1.4.14", - "@swc/core-linux-arm64-musl": "1.4.14", - "@swc/core-linux-x64-gnu": "1.4.14", - "@swc/core-linux-x64-musl": "1.4.14", - "@swc/core-win32-arm64-msvc": "1.4.14", - "@swc/core-win32-ia32-msvc": "1.4.14", - "@swc/core-win32-x64-msvc": "1.4.14" + "@swc/core-darwin-arm64": "1.15.33", + "@swc/core-darwin-x64": "1.15.33", + "@swc/core-linux-arm-gnueabihf": "1.15.33", + "@swc/core-linux-arm64-gnu": "1.15.33", + "@swc/core-linux-arm64-musl": "1.15.33", + "@swc/core-linux-ppc64-gnu": "1.15.33", + "@swc/core-linux-s390x-gnu": "1.15.33", + "@swc/core-linux-x64-gnu": "1.15.33", + "@swc/core-linux-x64-musl": "1.15.33", + "@swc/core-win32-arm64-msvc": "1.15.33", + "@swc/core-win32-ia32-msvc": "1.15.33", + "@swc/core-win32-x64-msvc": "1.15.33" }, "peerDependencies": { - "@swc/helpers": "^0.5.0" + "@swc/helpers": ">=0.5.17" }, "peerDependenciesMeta": { "@swc/helpers": { @@ -5713,9 +5715,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.14.tgz", - "integrity": "sha512-8iPfLhYNspBl836YYsfv6ErXwDUqJ7IMieddV3Ey/t/97JAEAdNDUdtTKDtbyP0j/Ebyqyn+fKcqwSq7rAof0g==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.33.tgz", + "integrity": "sha512-N+L0uXhuO7FIfzqwgxmzv0zIpV0qEp8wPX3QQs2p4atjMoywup2JTeDlXPw+z9pWJGCae3JjM+tZ6myclI+2gA==", "cpu": [ "arm64" ], @@ -5730,9 +5732,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.14.tgz", - "integrity": "sha512-9CqSj8uRZ92cnlgAlVaWMaJJBdxtNvCzJxaGj5KuIseeG6Q0l1g+qk8JcU7h9dAsH9saHTNwNFBVGKQo0W0ujg==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.33.tgz", + "integrity": "sha512-/Il4QHSOhV4FekbsDtkrNmKbsX26oSysvgrRswa/RYOHXAkwXDbB4jaeKq6PsJLSPkzJ2KzQ061gtBnk0vNHfA==", "cpu": [ "x64" ], @@ -5747,9 +5749,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.14.tgz", - "integrity": "sha512-mfd5JArPITTzMjcezH4DwMw+BdjBV1y25Khp8itEIpdih9ei+fvxOOrDYTN08b466NuE2dF2XuhKtRLA7fXArQ==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.33.tgz", + "integrity": "sha512-C64hBnBxq4viOPQ8hlx+2lJ23bzZBGnjw7ryALmS+0Q3zHmwO8lw1/DArLENw4Q18/0w5wdEO1k3m1wWNtKGqQ==", "cpu": [ "arm" ], @@ -5764,9 +5766,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.14.tgz", - "integrity": "sha512-3Lqlhlmy8MVRS9xTShMaPAp0oyUt0KFhDs4ixJsjdxKecE0NJSV/MInuDmrkij1C8/RQ2wySRlV9np5jK86oWw==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.33.tgz", + "integrity": "sha512-TRJfnJbX3jqpxRDRoieMzRiCBS5jOmXNb3iQXmcgjFEHKLnAgK1RZRU8Cq1MsPqO4jAJp/ld1G4O3fXuxv85uw==", "cpu": [ "arm64" ], @@ -5781,9 +5783,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.14.tgz", - "integrity": "sha512-n0YoCa64TUcJrbcXIHIHDWQjdUPdaXeMHNEu7yyBtOpm01oMGTKP3frsUXIABLBmAVWtKvqit4/W1KVKn5gJzg==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.33.tgz", + "integrity": "sha512-il7tYM+CpUNzieQbwAjFT1P8zqAhmGWNAGhQZBnxurXZ0aNn+5nqYFTEUKNZl7QibtT0uQXzTZrNGHCIj6Y1Og==", "cpu": [ "arm64" ], @@ -5797,10 +5799,44 @@ "node": ">=10" } }, + "node_modules/@swc/core-linux-ppc64-gnu": { + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.15.33.tgz", + "integrity": "sha512-ZtNBwN0Z7CFj9Il0FcPaKdjgP7URyKu/3RfH46vq+0paOBqLj4NYldD6Qo//Duif/7IOtAraUfDOmp0PLAufog==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-s390x-gnu": { + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.15.33.tgz", + "integrity": "sha512-De1IyajoOmhOYYjw/lx66bKlyDpHZTueqwpDrWgf5O7T6d1ODeJJO9/OqMBmrBQc5C+dNnlmIufHsp4QVCWufA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.14.tgz", - "integrity": "sha512-CGmlwLWbfG1dB4jZBJnp2IWlK5xBMNLjN7AR5kKA3sEpionoccEnChOEvfux1UdVJQjLRKuHNV9yGyqGBTpxfQ==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.33.tgz", + "integrity": "sha512-mGTH0YxmUN+x6vRN/I6NOk5X0ogNktkwPnJ94IMvR7QjhRDwL0O8RXEDhyUM0YtwWrryBOqaJQBX4zruxEPRGw==", "cpu": [ "x64" ], @@ -5815,9 +5851,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.14.tgz", - "integrity": "sha512-xq4npk8YKYmNwmr8fbvF2KP3kUVdZYfXZMQnW425gP3/sn+yFQO8Nd0bGH40vOVQn41kEesSe0Z5O/JDor2TgQ==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.33.tgz", + "integrity": "sha512-hj628ZkSEJf6zMf5VMbYrG2O6QqyTIp2qwY6VlCjvIa9lAEZ5c2lfPblCLVGYubTeLJDxadLB/CxqQYOQABeEQ==", "cpu": [ "x64" ], @@ -5832,9 +5868,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.14.tgz", - "integrity": "sha512-imq0X+gU9uUe6FqzOQot5gpKoaC00aCUiN58NOzwp0QXEupn8CDuZpdBN93HiZswfLruu5jA1tsc15x6v9p0Yg==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.33.tgz", + "integrity": "sha512-GV2oohtN2/5+KSccl86VULu3aT+LrISC8uzgSq0FRnikpD+Zwc+sBlXmoKQ+Db6jI57ITUOIB8jRkdGMABC29g==", "cpu": [ "arm64" ], @@ -5849,9 +5885,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.14.tgz", - "integrity": "sha512-cH6QpXMw5D3t+lpx6SkErHrxN0yFzmQ0lgNAJxoDRiaAdDbqA6Col8UqUJwUS++Ul6aCWgNhCdiEYehPaoyDPA==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.33.tgz", + "integrity": "sha512-gtyvzSNR8DHKfFEA2uqb8Ld1myqi6uEg2jyeUq3ikn5ytYs7H8RpZYC8mdy4NXr8hfcdJfCLXPlYaqqfBXpoEQ==", "cpu": [ "ia32" ], @@ -5866,9 +5902,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.4.14", - "resolved": "https://registry.npmmirror.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.14.tgz", - "integrity": "sha512-FmZ4Tby4wW65K/36BKzmuu7mlq7cW5XOxzvufaSNVvQ5PN4OodAlqPjToe029oma4Av+ykJiif64scMttyNAzg==", + "version": "1.15.33", + "resolved": "https://registry.npmmirror.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.33.tgz", + "integrity": "sha512-d6fRqQSkJI+kmMEBWaDQ7TMl8+YjLYbwRUPZQ9DY0ORBJeTzOrG0twvfvlZ2xgw6jA0ScQKgfBm4vHLSLl5Hqg==", "cpu": [ "x64" ], @@ -15461,9 +15497,9 @@ } }, "node_modules/miniprogram-ci": { - "version": "2.1.31", - "resolved": "https://registry.npmmirror.com/miniprogram-ci/-/miniprogram-ci-2.1.31.tgz", - "integrity": "sha512-SREx6UnJC74aQ2a1YMNShqQOB97nHO+ll6ZQrCQp98NHXcRq848VjZoD5ELpd95z+8uTASQUAcFtl/HrXuM7Nw==", + "version": "2.1.42", + "resolved": "https://registry.npmmirror.com/miniprogram-ci/-/miniprogram-ci-2.1.42.tgz", + "integrity": "sha512-H/bq0Wo6kMbwzcOM4jiYSMuQUkND50+zeyY8EkJuY1TQYijkLbFmNK/CFsFJsJgVcvXZ94wn8Do50YSO/Rv6/w==", "dev": true, "license": "MIT", "dependencies": { @@ -15589,7 +15625,7 @@ "@babel/template": "7.20.7", "@babel/traverse": "7.21.4", "@babel/types": "7.24.6", - "@swc/core": "1.4.14", + "@swc/core": "1.15.33", "@vue/reactivity": "3.0.5", "acorn": "^6.1.1", "adm-zip": "0.5.10", @@ -15642,7 +15678,7 @@ "string-hash-64": "1.0.3", "sync-message": "0.0.12", "terminal-kit": "^2.4.0", - "terser": "4.8.0", + "terser": "5.27.1", "tmp": "0.0.28", "tslib": "^2.4.0", "uglify-js": "3.0.27", @@ -18152,21 +18188,35 @@ } }, "node_modules/miniprogram-ci/node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmmirror.com/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.27.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.27.1.tgz", + "integrity": "sha512-29wAr6UU/oQpnTw5HoadwjUZnFQXGdOfj0LjZ4sVxzqwHh/QVkvr7m8y9WoR4iN3FRitVduTc6KdjcW38Npsug==", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + } + }, + "node_modules/miniprogram-ci/node_modules/terser/node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/miniprogram-ci/node_modules/terser/node_modules/commander": { diff --git a/zhiyin-app/package.json b/zhiyin-app/package.json index 9e9c5bf..90b73e1 100644 --- a/zhiyin-app/package.json +++ b/zhiyin-app/package.json @@ -3,9 +3,9 @@ "version": "1.0.0", "scripts": { "dev:mp-weixin": "uni -p mp-weixin", - "build:mp-weixin": "uni build -p mp-weixin", + "build:mp-weixin": "uni build -p mp-weixin && cp -n static/avatar-*.png dist/build/mp-weixin/static/ 2>/dev/null; true", "dev:h5": "uni", - "build:h5": "uni build", + "build:h5": "uni build && cp -n static/avatar-*.png dist/build/h5/static/ 2>/dev/null; true", "test": "vitest run", "test:watch": "vitest" }, @@ -27,7 +27,7 @@ "@dcloudio/vite-plugin-uni": "3.0.0-4060620250520001", "@vue/test-utils": "^2.4.11", "jsdom": "^29.1.1", - "miniprogram-ci": "^2.1.31", + "miniprogram-ci": "^2.1.42", "sass": "^1.70.0", "typescript": "^5.3.0", "vite": "^5.2.0", diff --git a/zhiyin-app/src/components/digital-human.vue b/zhiyin-app/src/components/digital-human.vue index 29bf81f..26db011 100644 --- a/zhiyin-app/src/components/digital-human.vue +++ b/zhiyin-app/src/components/digital-human.vue @@ -1,12 +1,22 @@