初始化
This commit is contained in:
parent
0c8fa981b3
commit
d0bda0d0cd
217
package-lock.json
generated
217
package-lock.json
generated
@ -20,6 +20,7 @@
|
|||||||
"@ionic/vue-router": "^8.0.0",
|
"@ionic/vue-router": "^8.0.0",
|
||||||
"html2canvas": "^1.4.1",
|
"html2canvas": "^1.4.1",
|
||||||
"ionicons": "^7.0.0",
|
"ionicons": "^7.0.0",
|
||||||
|
"qrcode": "^1.5.4",
|
||||||
"silly-datetime": "^0.1.2",
|
"silly-datetime": "^0.1.2",
|
||||||
"vant": "^4.9.24",
|
"vant": "^4.9.24",
|
||||||
"vconsole": "^3.15.1",
|
"vconsole": "^3.15.1",
|
||||||
@ -28,6 +29,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@capacitor/cli": "8.3.0",
|
"@capacitor/cli": "8.3.0",
|
||||||
|
"@types/qrcode": "^1.5.6",
|
||||||
"@vitejs/plugin-legacy": "^5.0.0",
|
"@vitejs/plugin-legacy": "^5.0.0",
|
||||||
"@vitejs/plugin-vue": "^4.0.0",
|
"@vitejs/plugin-vue": "^4.0.0",
|
||||||
"@vue/eslint-config-typescript": "^12.0.0",
|
"@vue/eslint-config-typescript": "^12.0.0",
|
||||||
@ -3093,6 +3095,15 @@
|
|||||||
"undici-types": "~7.18.0"
|
"undici-types": "~7.18.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/qrcode": {
|
||||||
|
"version": "1.5.6",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@types/qrcode/-/qrcode-1.5.6.tgz",
|
||||||
|
"integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@types/node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/semver": {
|
"node_modules/@types/semver": {
|
||||||
"version": "7.7.1",
|
"version": "7.7.1",
|
||||||
"resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.7.1.tgz",
|
"resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.7.1.tgz",
|
||||||
@ -3852,7 +3863,6 @@
|
|||||||
"version": "5.0.1",
|
"version": "5.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||||
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
@ -3861,7 +3871,6 @@
|
|||||||
"version": "4.3.0",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color-convert": "^2.0.1"
|
"color-convert": "^2.0.1"
|
||||||
},
|
},
|
||||||
@ -4279,6 +4288,14 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/camelcase": {
|
||||||
|
"version": "5.3.1",
|
||||||
|
"resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
|
||||||
|
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001787",
|
"version": "1.0.30001787",
|
||||||
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz",
|
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz",
|
||||||
@ -4448,11 +4465,33 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/cliui": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"string-width": "^4.2.0",
|
||||||
|
"strip-ansi": "^6.0.0",
|
||||||
|
"wrap-ansi": "^6.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/cliui/node_modules/wrap-ansi": {
|
||||||
|
"version": "6.2.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
|
||||||
|
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
|
||||||
|
"dependencies": {
|
||||||
|
"ansi-styles": "^4.0.0",
|
||||||
|
"string-width": "^4.1.0",
|
||||||
|
"strip-ansi": "^6.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/color-convert": {
|
"node_modules/color-convert": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color-name": "~1.1.4"
|
"color-name": "~1.1.4"
|
||||||
},
|
},
|
||||||
@ -4463,8 +4502,7 @@
|
|||||||
"node_modules/color-name": {
|
"node_modules/color-name": {
|
||||||
"version": "1.1.4",
|
"version": "1.1.4",
|
||||||
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
|
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
|
||||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/colorette": {
|
"node_modules/colorette": {
|
||||||
"version": "2.0.20",
|
"version": "2.0.20",
|
||||||
@ -4752,6 +4790,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/decamelize": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/decimal.js": {
|
"node_modules/decimal.js": {
|
||||||
"version": "10.6.0",
|
"version": "10.6.0",
|
||||||
"resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.6.0.tgz",
|
"resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.6.0.tgz",
|
||||||
@ -4803,6 +4849,11 @@
|
|||||||
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
|
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/dijkstrajs": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
|
||||||
|
},
|
||||||
"node_modules/dir-glob": {
|
"node_modules/dir-glob": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
|
||||||
@ -4930,8 +4981,7 @@
|
|||||||
"node_modules/emoji-regex": {
|
"node_modules/emoji-regex": {
|
||||||
"version": "8.0.0",
|
"version": "8.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
||||||
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/end-of-stream": {
|
"node_modules/end-of-stream": {
|
||||||
"version": "1.4.5",
|
"version": "1.4.5",
|
||||||
@ -5614,6 +5664,14 @@
|
|||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/get-caller-file": {
|
||||||
|
"version": "2.0.5",
|
||||||
|
"resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
|
||||||
|
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
||||||
|
"engines": {
|
||||||
|
"node": "6.* || 8.* || >= 10.*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/get-func-name": {
|
"node_modules/get-func-name": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.2.tgz",
|
"resolved": "https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.2.tgz",
|
||||||
@ -6097,7 +6155,6 @@
|
|||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
||||||
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
|
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
@ -7047,6 +7104,14 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/p-try": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
|
||||||
|
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/package-json-from-dist": {
|
"node_modules/package-json-from-dist": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
|
||||||
@ -7087,7 +7152,6 @@
|
|||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
|
||||||
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
|
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
@ -7231,6 +7295,14 @@
|
|||||||
"node": ">=10.4.0"
|
"node": ">=10.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/pngjs": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.13.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.5.9",
|
"version": "8.5.9",
|
||||||
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.9.tgz",
|
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.9.tgz",
|
||||||
@ -7402,6 +7474,22 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/qrcode": {
|
||||||
|
"version": "1.5.4",
|
||||||
|
"resolved": "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.4.tgz",
|
||||||
|
"integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==",
|
||||||
|
"dependencies": {
|
||||||
|
"dijkstrajs": "^1.0.1",
|
||||||
|
"pngjs": "^5.0.0",
|
||||||
|
"yargs": "^15.3.1"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"qrcode": "bin/qrcode"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.13.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/qs": {
|
"node_modules/qs": {
|
||||||
"version": "6.14.2",
|
"version": "6.14.2",
|
||||||
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.2.tgz",
|
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.2.tgz",
|
||||||
@ -7531,6 +7619,19 @@
|
|||||||
"throttleit": "^1.0.0"
|
"throttleit": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/require-directory": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/require-main-filename": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
|
||||||
|
},
|
||||||
"node_modules/requires-port": {
|
"node_modules/requires-port": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
|
||||||
@ -7893,6 +7994,11 @@
|
|||||||
"semver": "bin/semver.js"
|
"semver": "bin/semver.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/set-blocking": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
|
||||||
|
},
|
||||||
"node_modules/shebang-command": {
|
"node_modules/shebang-command": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
|
||||||
@ -8118,7 +8224,6 @@
|
|||||||
"version": "4.2.3",
|
"version": "4.2.3",
|
||||||
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
|
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
|
||||||
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"emoji-regex": "^8.0.0",
|
"emoji-regex": "^8.0.0",
|
||||||
"is-fullwidth-code-point": "^3.0.0",
|
"is-fullwidth-code-point": "^3.0.0",
|
||||||
@ -8147,7 +8252,6 @@
|
|||||||
"version": "6.0.1",
|
"version": "6.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
||||||
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ansi-regex": "^5.0.1"
|
"ansi-regex": "^5.0.1"
|
||||||
},
|
},
|
||||||
@ -9011,6 +9115,11 @@
|
|||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/which-module": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
|
||||||
|
},
|
||||||
"node_modules/why-is-node-running": {
|
"node_modules/why-is-node-running": {
|
||||||
"version": "2.3.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
|
"resolved": "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
|
||||||
@ -9206,12 +9315,98 @@
|
|||||||
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
|
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/y18n": {
|
||||||
|
"version": "4.0.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
|
||||||
|
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
|
||||||
|
},
|
||||||
"node_modules/yallist": {
|
"node_modules/yallist": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
|
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
|
||||||
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/yargs": {
|
||||||
|
"version": "15.4.1",
|
||||||
|
"resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz",
|
||||||
|
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
|
||||||
|
"dependencies": {
|
||||||
|
"cliui": "^6.0.0",
|
||||||
|
"decamelize": "^1.2.0",
|
||||||
|
"find-up": "^4.1.0",
|
||||||
|
"get-caller-file": "^2.0.1",
|
||||||
|
"require-directory": "^2.1.1",
|
||||||
|
"require-main-filename": "^2.0.0",
|
||||||
|
"set-blocking": "^2.0.0",
|
||||||
|
"string-width": "^4.2.0",
|
||||||
|
"which-module": "^2.0.0",
|
||||||
|
"y18n": "^4.0.0",
|
||||||
|
"yargs-parser": "^18.1.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/yargs-parser": {
|
||||||
|
"version": "18.1.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz",
|
||||||
|
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"camelcase": "^5.0.0",
|
||||||
|
"decamelize": "^1.2.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/yargs/node_modules/find-up": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
|
||||||
|
"dependencies": {
|
||||||
|
"locate-path": "^5.0.0",
|
||||||
|
"path-exists": "^4.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/yargs/node_modules/locate-path": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
|
||||||
|
"dependencies": {
|
||||||
|
"p-locate": "^4.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/yargs/node_modules/p-limit": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
|
||||||
|
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
|
||||||
|
"dependencies": {
|
||||||
|
"p-try": "^2.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/yargs/node_modules/p-locate": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
|
||||||
|
"dependencies": {
|
||||||
|
"p-limit": "^2.2.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/yauzl": {
|
"node_modules/yauzl": {
|
||||||
"version": "2.10.0",
|
"version": "2.10.0",
|
||||||
"resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz",
|
"resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz",
|
||||||
|
|||||||
@ -25,6 +25,7 @@
|
|||||||
"@ionic/vue-router": "^8.0.0",
|
"@ionic/vue-router": "^8.0.0",
|
||||||
"html2canvas": "^1.4.1",
|
"html2canvas": "^1.4.1",
|
||||||
"ionicons": "^7.0.0",
|
"ionicons": "^7.0.0",
|
||||||
|
"qrcode": "^1.5.4",
|
||||||
"silly-datetime": "^0.1.2",
|
"silly-datetime": "^0.1.2",
|
||||||
"vant": "^4.9.24",
|
"vant": "^4.9.24",
|
||||||
"vconsole": "^3.15.1",
|
"vconsole": "^3.15.1",
|
||||||
@ -33,6 +34,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@capacitor/cli": "8.3.0",
|
"@capacitor/cli": "8.3.0",
|
||||||
|
"@types/qrcode": "^1.5.6",
|
||||||
"@vitejs/plugin-legacy": "^5.0.0",
|
"@vitejs/plugin-legacy": "^5.0.0",
|
||||||
"@vitejs/plugin-vue": "^4.0.0",
|
"@vitejs/plugin-vue": "^4.0.0",
|
||||||
"@vue/eslint-config-typescript": "^12.0.0",
|
"@vue/eslint-config-typescript": "^12.0.0",
|
||||||
|
|||||||
118
seed2前端方法(1).txt
118
seed2前端方法(1).txt
File diff suppressed because one or more lines are too long
@ -9,10 +9,10 @@ import 'vant/lib/index.css';
|
|||||||
|
|
||||||
// vConsole:仅开发环境启用(避免生产包默认开启)
|
// vConsole:仅开发环境启用(避免生产包默认开启)
|
||||||
// if (import.meta.env.DEV) {
|
// if (import.meta.env.DEV) {
|
||||||
import('vconsole').then(({ default: VConsole }) => {
|
// import('vconsole').then(({ default: VConsole }) => {
|
||||||
// eslint-disable-next-line no-new
|
// // eslint-disable-next-line no-new
|
||||||
new VConsole();
|
// new VConsole();
|
||||||
});
|
// });
|
||||||
// }
|
// }
|
||||||
|
|
||||||
const app = createApp(App)
|
const app = createApp(App)
|
||||||
|
|||||||
@ -145,85 +145,86 @@ async function analyzeVideoWithArk(videoDataUrl: string, signal?: AbortSignal) {
|
|||||||
{
|
{
|
||||||
type: 'input_text',
|
type: 'input_text',
|
||||||
text: `角色设定
|
text: `角色设定
|
||||||
你是一位基于多模态感知(计算机视觉 + 音频分析)的医疗级AI健康顾问。你的核心能力是通过分析面部微细血管的颜色变化(rPPG技术原理)、皮肤纹理细节、衣着穿搭风格以及语音语调的情感特征,来推断用户的生理与心理健康数据。
|
你是一位基于多模态感知(计算机视觉 + 音频分析)的医疗级 AI 健康顾问。你的核心能力是通过分析面部微细血管的颜色变化(rPPG 技术原理)、皮肤纹理细节、衣着穿搭风格以及语音语调的情感特征,来推断用户的生理与心理健康数据。
|
||||||
核心原则
|
核心原则
|
||||||
|
动态场景模拟(关键):
|
||||||
|
拒绝固定剧本: 不要每次都生成一样的数据。请在后台随机构思一个“用户画像场景”(例如:昨晚熬夜加班的程序员、刚喝完咖啡的销售、长期节食的减肥者、刚运动完的学生等)。
|
||||||
|
基于场景生成数据: 所有的数值和状态必须服务于你构思的这个场景。
|
||||||
|
强制差异化: 严禁直接复制提示词中示例的数值(如心率 101、压力 7.2 等)。必须生成全新的、符合当前模拟场景的数值。
|
||||||
真实世界的“亚健康”模拟:
|
真实世界的“亚健康”模拟:
|
||||||
拒绝完美数据:严禁生成所有指标都完美的“教科书式”数据。
|
拒绝完美数据: 严禁生成所有指标都完美的“教科书式”数据。
|
||||||
倾向轻微异常:真实用户通常处于“亚健康”状态。请倾向于生成轻度偏高/偏低的数据(如:熬夜导致的心率稍快、压力导致的皮肤出油、饮食不规律导致的血糖波动),避免生成严重的病理数据,除非视觉特征极度明显。
|
倾向轻微异常: 真实用户通常处于“亚健康”状态。请倾向于生成轻度偏高/偏低的数据(如:熬夜导致的心率稍快、压力导致的皮肤出油、饮食不规律导致的血糖波动),避免生成严重的病理数据,除非视觉特征极度明显。
|
||||||
基于证据的生理推断:
|
基于证据的生理推断:
|
||||||
面色潮红/充血 -> 对应:心率/血压轻度偏高、压力、饮酒。
|
面色潮红/充血 -> 对应:心率/血压轻度偏高、压力、饮酒。
|
||||||
面色苍白/无血色 -> 对应:血红蛋白偏低、疲劳、低血糖。
|
面色苍白/无血色 -> 对应:血红蛋白偏低、疲劳、低血糖。
|
||||||
皮肤暗沉/油光重 -> 对应:代谢负担、皮质醇高(压力)、缺水。
|
皮肤暗沉/油光重 -> 对应:代谢负担、皮质醇高(压力)、缺水。
|
||||||
关怀式反馈机制:
|
关怀式反馈机制:
|
||||||
模块级分析:如果指标异常,analysis 字段必须解释视觉成因并给出具体改善建议。
|
模块级分析: 如果指标异常,analysis 字段必须解释视觉成因,suggestion 字段给出具体改善建议。
|
||||||
全局总结:summary_text 必须用温暖、关怀的口吻,串联所有异常点,并针对每个问题给出生活化的解决方案。
|
全局总结: summary_text 必须用温暖、关怀的口吻,串联所有异常点,并针对每个问题给出生活化的解决方案。
|
||||||
分析步骤
|
分析步骤
|
||||||
视觉与听觉特征提取:观察面部rPPG信号、皮肤纹理、衣着风格;分析语音的语速、音调、颤抖。
|
场景构思: 随机模拟一个用户当前的生理状态(如:疲劳、兴奋、压力、缺水)。
|
||||||
数值生成与状态判定:
|
数值生成与状态判定:
|
||||||
构思数值:模拟真实波动,允许轻度偏离标准值。
|
构思数值:模拟真实波动,允许轻度偏离标准值。
|
||||||
比对范围:确定 status ("正常"、"偏高"、"偏低")。
|
比对范围:确定 status ("正常"、"偏高"、"偏低")。
|
||||||
建议生成:针对每一个异常指标,构思一条具体的行动建议(如:多喝水、深呼吸、补铁等)。
|
注意: skin_status 模块必须包含 analysis(异常分析)和 suggestion(改善建议)两个独立字段。
|
||||||
报告撰写:输出 JSON。
|
报告撰写: 输出 JSON。
|
||||||
指标参考范围
|
指标参考范围(严格判定标准)
|
||||||
常规生命体征:心率(60-100)、呼吸(12-20)、收缩压(90-139)、舒张压(60-90)
|
常规生命体征:心率 (60-100)、呼吸 (12-20)、收缩压 (90-139)、舒张压 (60-90)
|
||||||
血液健康:血糖(3.9-6.1)、血红蛋白(110-165)、甘油三酯(0.565-1.69)
|
血液健康:血糖 (3.9-6.1)、血红蛋白 (110-165)、甘油三酯 (0.565-1.69)
|
||||||
心理健康:心理健康(0-100, 越高越好)、压力(0-10)、抑郁(0-10)、焦虑(0-10)
|
心理健康:心理健康 (0-100, 越高越好)、压力 (0-10)、抑郁 (0-10)、焦虑 (0-10)
|
||||||
皮肤健康:含水量(10-20%)
|
皮肤健康:含水量 (10-20%)
|
||||||
|
注意:请严格依据上述数值范围判定 status。例如心率 92 在 60-100 范围内,应判定为“正常”。只有当数值超出上述范围时,才标记为“偏高”或“偏低”。
|
||||||
输出格式
|
输出格式
|
||||||
请只返回 JSON(不要 Markdown/不要多余文字),格式如下:
|
状态(status)字段只能返回以下三个枚举值之一:'正常'、'偏高'、'偏低'。严禁使用‘正常高值’、‘临界值’、‘轻微异常’等其他描述性词汇。
|
||||||
|
请只返回 JSON(不要 Markdown/不要多余文字),格式如下(注意:以下数值仅为格式示例,请务必生成与示例完全不同的新数据):
|
||||||
{
|
{
|
||||||
"visual_quality_check": {
|
"visual_quality_check": {
|
||||||
"lighting": "good",
|
"lighting": "good",
|
||||||
"face_clarity": "high",
|
"face_clarity": "high",
|
||||||
"signal_reliability": "valid"
|
"signal_reliability": "valid"
|
||||||
},
|
},
|
||||||
"metrics": {
|
"metrics": {
|
||||||
"vital_signs": {
|
"vital_signs": {
|
||||||
"heart_rate": { "value": 92, "unit": "bpm", "status": "偏高", "desc": "心率" },
|
"heart_rate": { "value": 82, "unit": "bpm", "status": "正常", "desc": "心率" },
|
||||||
"respiratory_rate": { "value": 16, "unit": "rpm", "status": "正常", "desc": "呼吸频率" },
|
"respiratory_rate": { "value": 18, "unit": "rpm", "status": "正常", "desc": "呼吸频率" },
|
||||||
"systolic_bp": { "value": 142, "unit": "mmHg", "status": "偏高", "desc": "收缩压" },
|
"systolic_bp": { "value": 128, "unit": "mmHg", "status": "正常", "desc": "收缩压" },
|
||||||
"diastolic_bp": { "value": 85, "unit": "mmHg", "status": "正常", "desc": "舒张压" },
|
"diastolic_bp": { "value": 82, "unit": "mmHg", "status": "正常", "desc": "舒张压" },
|
||||||
"analysis": "检测到面部微血管轻微充血,心率与收缩压轻度偏高。这可能与刚才的说话状态或近期咖啡因摄入有关。建议:尝试进行3分钟的深呼吸练习,帮助心率恢复平稳。"
|
"analysis": "面部微血管分布均匀,生命体征平稳。心率处于正常区间,显示心血管系统负荷正常。"
|
||||||
},
|
},
|
||||||
"blood_health": {
|
"blood_health": {
|
||||||
"glucose": { "value": 5.4, "unit": "mmol/L", "status": "正常", "desc": "血糖" },
|
"glucose": { "value": 5.1, "unit": "mmol/L", "status": "正常", "desc": "血糖" },
|
||||||
"hemoglobin": { "value": 108, "unit": "g/L", "status": "偏低", "desc": "血红蛋白" },
|
"hemoglobin": { "value": 135, "unit": "g/L", "status": "正常", "desc": "血红蛋白" },
|
||||||
"triglycerides": { "value": 1.7, "unit": "mmol/L", "status": "偏高", "desc": "甘油三酯" },
|
"triglycerides": { "value": 1.4, "unit": "mmol/L", "status": "正常", "desc": "甘油三酯" },
|
||||||
"analysis": "唇色稍显苍白,提示血红蛋白轻度偏低,可能存在轻微贫血风险;甘油三酯略高可能与近期饮食油腻有关。建议:适当摄入红肉或菠菜补充铁质,并减少晚餐的油脂摄入。"
|
"analysis": "唇色红润,面部血色充盈,推测血液携氧能力及代谢指标均在健康区间。"
|
||||||
},
|
},
|
||||||
"skin_status": {
|
"skin_status": {
|
||||||
"skin_age": { "value": 27, "unit": "years", "status": "正常", "desc": "皮肤年龄" },
|
"skin_age": { "value": 26, "unit": "years", "status": "正常", "desc": "皮肤年龄" },
|
||||||
"skin_type": { "value": "混合性", "unit": "", "status": "正常", "desc": "肤质类型" },
|
"skin_type": { "value": "混合偏干", "unit": "", "status": "正常", "desc": "肤质类型" },
|
||||||
"hydration": { "value": 11, "unit": "%", "status": "偏低", "desc": "皮肤含水量" },
|
"hydration": { "value": 13, "unit": "%", "status": "偏低", "desc": "皮肤含水量" },
|
||||||
"dark_circles": { "value": "中度", "unit": "", "status": "正常", "desc": "黑眼圈状态" },
|
"dark_circles": { "value": "轻度", "unit": "", "status": "正常", "desc": "黑眼圈状态" },
|
||||||
"acne": { "value": "少量", "unit": "", "status": "正常", "desc": "痤疮" },
|
"acne": { "value": "无", "unit": "", "status": "正常", "desc": "痤疮" },
|
||||||
"oil_control": { "value": "中度", "unit": "", "status": "正常", "desc": "出油状态" },
|
"oil_control": { "value": "轻度", "unit": "", "status": "正常", "desc": "出油状态" },
|
||||||
"analysis": "皮肤含水量偏低且伴有中度黑眼圈,这是典型的“熬夜肌”特征,皮肤屏障处于缺水状态。建议:今晚尝试在11点前入睡,并使用保湿力度更强的面霜。"
|
"analysis": "皮肤纹理分析显示眼下及脸颊区域略显干燥,角质层含水量偏低,这可能与近期环境湿度低或饮水不足有关。",
|
||||||
},
|
"suggestion": "1. 每日饮水量增加至 2000ml;2. 使用含有角鲨烷或维生素 B5 的修复面霜加强保湿。"
|
||||||
"mental_health": {
|
},
|
||||||
"mental_score": { "value": 72.0, "unit": "score", "status": "正常", "desc": "心理健康指数" },
|
"mental_health": {
|
||||||
"stress": { "value": 7.2, "unit": "score", "status": "偏高", "desc": "压力指数" },
|
"mental_score": { "value": 88.0, "unit": "score", "status": "正常", "desc": "心理健康指数" },
|
||||||
"depression": { "value": 2.0, "unit": "score", "status": "正常", "desc": "抑郁指数" },
|
"stress": { "value": 3.0, "unit": "score", "status": "正常", "desc": "压力指数" },
|
||||||
"anxiety": { "value": 6.5, "unit": "score", "status": "偏高", "desc": "焦虑指数" },
|
"depression": { "value": 1.5, "unit": "score", "status": "正常", "desc": "抑郁指数" },
|
||||||
"analysis": "语音分析显示语速较快,且句尾音调有轻微上扬(紧张特征),判断压力与焦虑指数偏高。您可能正处于项目攻坚期。建议:工作间隙进行5分钟冥想,或听一些轻音乐来放松神经。"
|
"anxiety": { "value": 2.0, "unit": "score", "status": "正常", "desc": "焦虑指数" },
|
||||||
}
|
"analysis": "语音语调平稳,面部表情自然放松,未见明显的紧张或焦虑微表情。您的心理状态非常健康。"
|
||||||
},
|
}
|
||||||
"brief_report": {
|
},
|
||||||
"personality": "进取型/易焦虑",
|
"brief_report": {
|
||||||
"emotion": "紧张",
|
"personality": "温和/生活规律",
|
||||||
"clothing_style": "商务休闲",
|
"emotion": "平静",
|
||||||
"overall_status": "需关注",
|
"clothing_style": "休闲舒适",
|
||||||
"abnormal_items": [
|
"overall_status": "健康",
|
||||||
"心率偏高",
|
"abnormal_items": [
|
||||||
"收缩压偏高",
|
"皮肤含水量偏低"
|
||||||
"血红蛋白偏低",
|
],
|
||||||
"甘油三酯偏高",
|
"summary_text": "亲爱的用户,很高兴看到您!根据本次多模态检测,您的整体健康状况非常理想。您的心血管系统强健,血液指标正常,且心理状态非常平稳,看来您最近的生活节奏把握得相当不错。唯一的小提示是您的皮肤含水量略低(13%),这可能是因为环境干燥或饮水稍少。建议您:随身携带保温杯,增加饮水频率,并在护肤时多涂抹一层保湿乳液。除此之外,请继续保持您现在的健康生活方式,您做得很好!"
|
||||||
"皮肤含水量偏低",
|
}
|
||||||
"压力指数偏高",
|
|
||||||
"焦虑指数偏高"
|
|
||||||
],
|
|
||||||
"summary_text": "亲爱的用户,根据本次检测,结合您的商务休闲着装与略显急促的语调,我感受到您可能是一位正在为工作全力以赴的“进取型”伙伴。您的身体状况整体尚可,但身体正在发出一些“求关注”的信号:1. 心血管与情绪:您的心率、血压及压力指数均偏高,这说明您现在可能有些紧绷。建议:放下手机,做几次深呼吸,给自己一点喘息的空间。2. 营养与代谢:血红蛋白与甘油三酯的轻微波动提示饮食可能不够规律。建议:多吃深色蔬菜,少吃油腻外卖。3. 皮肤状态:缺水和黑眼圈提示您该好好睡一觉了。建议:今晚早点休息,让身体自我修复。请点击查看详细报告,让我们一起调整状态,找回活力!"
|
|
||||||
}
|
|
||||||
}`
|
}`
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<div class="title">
|
<div class="title">
|
||||||
我的检测报告
|
我的检测报告
|
||||||
</div>
|
</div>
|
||||||
<div class="r" @click="router.replace('/')"><img ref="closeBtnEl" src="@/assets/close.png" alt=""></div>
|
<div class="r" @click="router.replace('/')"><img ref="closeBtnEl" src="@/assets/close.png" alt=""></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="time"> 检测时间:<span>{{ creatTime }}</span></div>
|
<div class="time"> 检测时间:<span>{{ creatTime }}</span></div>
|
||||||
|
|
||||||
@ -35,7 +35,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
生命体征指标正常,心肺功能良好。血液指标方面,血糖超出正常范围,建议调整饮食结构,定期复查。心理健康方面,压力指数、焦虑指数偏高,建议适当放松,保持积极心态皮肤健康方面,您的皮肤整体状态良好,含水量适中。面部有轻度黑眼圈,可能与睡眠不足有关。T区出油较为明显,建议加强控油和清洁。面部有少量痤疮,需注意饮食清淡和规律作息。整体肤质为混合型,建议分区护理。
|
{{ data.brief_report?.summary_text }}
|
||||||
</div>
|
</div>
|
||||||
</Item>
|
</Item>
|
||||||
</div>
|
</div>
|
||||||
@ -46,7 +46,8 @@
|
|||||||
<div class="top">
|
<div class="top">
|
||||||
<div class="icon"><img src="@/assets/images/icon1.png" alt=""></div>
|
<div class="icon"><img src="@/assets/images/icon1.png" alt=""></div>
|
||||||
<div class="title">心率</div>
|
<div class="title">心率</div>
|
||||||
<div :class="['status', data?.metrics?.vital_signs?.heart_rate?.status == '正常' ? '' : 'error']">{{ data?.metrics?.vital_signs?.heart_rate?.status }}</div>
|
<div :class="['status', data?.metrics?.vital_signs?.heart_rate?.status == '正常' ? '' : 'error']">{{
|
||||||
|
data?.metrics?.vital_signs?.heart_rate?.status }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="middle">心率 <span>{{ data?.metrics?.vital_signs?.heart_rate?.value }}</span> bpm</div>
|
<div class="middle">心率 <span>{{ data?.metrics?.vital_signs?.heart_rate?.value }}</span> bpm</div>
|
||||||
<div class="bottom">正常范围:60~100次/分钟</div>
|
<div class="bottom">正常范围:60~100次/分钟</div>
|
||||||
@ -55,7 +56,8 @@
|
|||||||
<div class="top">
|
<div class="top">
|
||||||
<div class="icon"><img src="@/assets/images/icon2.png" alt=""></div>
|
<div class="icon"><img src="@/assets/images/icon2.png" alt=""></div>
|
||||||
<div class="title">呼吸频率</div>
|
<div class="title">呼吸频率</div>
|
||||||
<div :class="['status', data?.metrics?.vital_signs?.respiratory_rate?.status == '正常' ? '' : 'error']">{{ data?.metrics?.vital_signs?.respiratory_rate?.status}}</div>
|
<div :class="['status', data?.metrics?.vital_signs?.respiratory_rate?.status == '正常' ? '' : 'error']">{{
|
||||||
|
data?.metrics?.vital_signs?.respiratory_rate?.status}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="middle">呼吸频率 <span>{{ data?.metrics?.vital_signs?.respiratory_rate?.value }}</span> rpm</div>
|
<div class="middle">呼吸频率 <span>{{ data?.metrics?.vital_signs?.respiratory_rate?.value }}</span> rpm</div>
|
||||||
<div class="bottom">正常范围:12~20次/分钟</div>
|
<div class="bottom">正常范围:12~20次/分钟</div>
|
||||||
@ -64,7 +66,8 @@
|
|||||||
<div class="top">
|
<div class="top">
|
||||||
<div class="icon"><img src="@/assets/images/icon3.png" alt=""></div>
|
<div class="icon"><img src="@/assets/images/icon3.png" alt=""></div>
|
||||||
<div class="title">舒张压</div>
|
<div class="title">舒张压</div>
|
||||||
<div :class="['status', data?.metrics?.vital_signs?.diastolic_bp?.status == '正常' ? '' : 'error']">{{ data?.metrics?.vital_signs?.diastolic_bp?.status }}</div>
|
<div :class="['status', data?.metrics?.vital_signs?.diastolic_bp?.status == '正常' ? '' : 'error']">{{
|
||||||
|
data?.metrics?.vital_signs?.diastolic_bp?.status }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="middle">舒张压 <span>{{ data?.metrics?.vital_signs?.diastolic_bp?.value }}</span> rpm</div>
|
<div class="middle">舒张压 <span>{{ data?.metrics?.vital_signs?.diastolic_bp?.value }}</span> rpm</div>
|
||||||
<div class="bottom">正常范围:60mmHg~90mmHg</div>
|
<div class="bottom">正常范围:60mmHg~90mmHg</div>
|
||||||
@ -73,7 +76,8 @@
|
|||||||
<div class="top">
|
<div class="top">
|
||||||
<div class="icon"><img src="@/assets/images/icon4.png" alt=""></div>
|
<div class="icon"><img src="@/assets/images/icon4.png" alt=""></div>
|
||||||
<div class="title">收缩压</div>
|
<div class="title">收缩压</div>
|
||||||
<div :class="['status', data?.metrics?.vital_signs?.systolic_bp?.status == '正常' ? '' : 'error']">{{ data?.metrics?.vital_signs?.systolic_bp?.status }}</div>
|
<div :class="['status', data?.metrics?.vital_signs?.systolic_bp?.status == '正常' ? '' : 'error']">{{
|
||||||
|
data?.metrics?.vital_signs?.systolic_bp?.status }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="middle">收缩压 <span>{{ data?.metrics?.vital_signs?.systolic_bp?.value }}</span> mmHg</div>
|
<div class="middle">收缩压 <span>{{ data?.metrics?.vital_signs?.systolic_bp?.value }}</span> mmHg</div>
|
||||||
<div class="bottom">正常范围:90mmHg~139mmHg</div>
|
<div class="bottom">正常范围:90mmHg~139mmHg</div>
|
||||||
@ -89,30 +93,42 @@
|
|||||||
<div class="top">
|
<div class="top">
|
||||||
<div class="icon"><img src="@/assets/images/icon4.png" alt=""></div>
|
<div class="icon"><img src="@/assets/images/icon4.png" alt=""></div>
|
||||||
<div class="title">血糖</div>
|
<div class="title">血糖</div>
|
||||||
<div :class="['status', data?.metrics?.blood_health?.glucose?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.glucose?.status == '偏高' ? 'status3' : 'status2']">{{ data?.metrics?.blood_health?.glucose?.status }}</div>
|
<div
|
||||||
|
:class="['status', data?.metrics?.blood_health?.glucose?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.glucose?.status == '偏高' ? 'status3' : 'status2']">
|
||||||
|
{{ data?.metrics?.blood_health?.glucose?.status }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="middle"> <span>{{ data.metrics?.blood_health?.glucose?.value }}</span> bmp</div>
|
<div class="middle"> <span>{{ data.metrics?.blood_health?.glucose?.value }}</span> bmp</div>
|
||||||
<div :class="['middle_progress', data?.metrics?.blood_health?.glucose?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.glucose?.status == '偏高' ? 'status3' : 'status2']"></div>
|
<div
|
||||||
<div class="bottom">正常范围:3.9~6.1mmol/</div>
|
:class="['middle_progress', data?.metrics?.blood_health?.glucose?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.glucose?.status == '偏高' ? 'status3' : 'status2']">
|
||||||
|
</div>
|
||||||
|
<div class="bottom">正常范围:3.9~6.1mmol/L</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="top">
|
<div class="top">
|
||||||
<div class="icon"><img src="@/assets/images/icon4.png" alt=""></div>
|
<div class="icon"><img src="@/assets/images/icon4.png" alt=""></div>
|
||||||
<div class="title">血红蛋白</div>
|
<div class="title">血红蛋白</div>
|
||||||
<div :class="['status', data?.metrics?.blood_health?.hemoglobin?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.hemoglobin?.status == '偏高' ? 'status3' : 'status2']">{{ data?.metrics?.blood_health?.hemoglobin?.status }}</div>
|
<div
|
||||||
|
:class="['status', data?.metrics?.blood_health?.hemoglobin?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.hemoglobin?.status == '偏高' ? 'status3' : 'status2']">
|
||||||
|
{{ data?.metrics?.blood_health?.hemoglobin?.status }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="middle"> <span>{{ data.metrics?.blood_health?.hemoglobin?.value }}</span> rmp</div>
|
<div class="middle"> <span>{{ data.metrics?.blood_health?.hemoglobin?.value }}</span> rmp</div>
|
||||||
<div :class="['middle_progress', data?.metrics?.blood_health?.hemoglobin?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.hemoglobin?.status == '偏高' ? 'status3' : 'status2']"></div>
|
<div
|
||||||
|
:class="['middle_progress', data?.metrics?.blood_health?.hemoglobin?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.hemoglobin?.status == '偏高' ? 'status3' : 'status2']">
|
||||||
|
</div>
|
||||||
<div class="bottom">正常范围:110~165g/L</div>
|
<div class="bottom">正常范围:110~165g/L</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="top">
|
<div class="top">
|
||||||
<div class="icon"><img src="@/assets/images/icon4.png" alt=""></div>
|
<div class="icon"><img src="@/assets/images/icon4.png" alt=""></div>
|
||||||
<div class="title">甘油三酯</div>
|
<div class="title">甘油三酯</div>
|
||||||
<div :class="['status', data?.metrics?.blood_health?.triglycerides?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.triglycerides?.status == '偏高' ? 'status3' : 'status2']">{{ data?.metrics?.blood_health?.triglycerides?.status }}</div>
|
<div
|
||||||
|
:class="['status', data?.metrics?.blood_health?.triglycerides?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.triglycerides?.status == '偏高' ? 'status3' : 'status2']">
|
||||||
|
{{ data?.metrics?.blood_health?.triglycerides?.status }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="middle"> <span>{{ data?.metrics?.blood_health?.triglycerides?.value }}</span> mmol/L</div>
|
<div class="middle"> <span>{{ data?.metrics?.blood_health?.triglycerides?.value }}</span> mmol/L</div>
|
||||||
<div :class="['middle_progress', data?.metrics?.blood_health?.triglycerides?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.triglycerides?.status == '偏高' ? 'status3' : 'status2']"></div>
|
<div
|
||||||
|
:class="['middle_progress', data?.metrics?.blood_health?.triglycerides?.status == '偏低' ? 'status1' : data?.metrics?.blood_health?.triglycerides?.status == '偏高' ? 'status3' : 'status2']">
|
||||||
|
</div>
|
||||||
<div class="bottom">正常范围:0.565~1.69mmol/l</div>
|
<div class="bottom">正常范围:0.565~1.69mmol/l</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="tips">
|
<div class="tips">
|
||||||
@ -129,7 +145,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="middle"> <span>{{ data?.metrics?.mental_health?.mental_score?.value }}</span> 分</div>
|
<div class="middle"> <span>{{ data?.metrics?.mental_health?.mental_score?.value }}</span> 分</div>
|
||||||
<div class="middle_progress">
|
<div class="middle_progress">
|
||||||
<Progress color="linear-gradient(to right, #F5EBC2, #C8A92E)" :percentage="data?.metrics?.mental_health?.mental_score?.value" :pivot-text="''" />
|
<Progress color="linear-gradient(to right, #F5EBC2, #C8A92E)"
|
||||||
|
:percentage="data?.metrics?.mental_health?.mental_score?.value" :pivot-text="''" />
|
||||||
</div>
|
</div>
|
||||||
<div class="bottom">正常范围:0~100分</div>
|
<div class="bottom">正常范围:0~100分</div>
|
||||||
</div>
|
</div>
|
||||||
@ -139,8 +156,10 @@
|
|||||||
<div class="title"> <img src="@/assets/images/content4-icon1.png" alt="">压力指数
|
<div class="title"> <img src="@/assets/images/content4-icon1.png" alt="">压力指数
|
||||||
</div>
|
</div>
|
||||||
<div class="value">
|
<div class="value">
|
||||||
<span :class="['value', data?.metrics?.mental_health?.stress?.status == '正常' ? '' : 'error']">{{ data?.metrics?.mental_health?.stress?.value }}</span>
|
<span :class="['value', data?.metrics?.mental_health?.stress?.status == '正常' ? '' : 'error']">{{
|
||||||
<div :class="['status', data?.metrics?.mental_health?.stress?.status == '正常' ? '' : 'error']">{{ data?.metrics?.mental_health?.stress?.status=='正常' ? '正常' : '异常' }}</div>
|
data?.metrics?.mental_health?.stress?.value }}</span>
|
||||||
|
<div :class="['status', data?.metrics?.mental_health?.stress?.status == '正常' ? '' : 'error']">{{
|
||||||
|
data?.metrics?.mental_health?.stress?.status == '正常' ? '正常' : '异常' }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="desc">正常范围:0~10分</div>
|
<div class="desc">正常范围:0~10分</div>
|
||||||
</div>
|
</div>
|
||||||
@ -150,8 +169,10 @@
|
|||||||
<div class="title"> <img src="@/assets/images/content4-icon1.png" alt="">抑郁指数
|
<div class="title"> <img src="@/assets/images/content4-icon1.png" alt="">抑郁指数
|
||||||
</div>
|
</div>
|
||||||
<div class="value">
|
<div class="value">
|
||||||
<span :class="['value', data?.metrics?.mental_health?.depression?.status == '正常' ? '' : 'error']">{{ data?.metrics?.mental_health?.depression?.value }}</span>
|
<span :class="['value', data?.metrics?.mental_health?.depression?.status == '正常' ? '' : 'error']">{{
|
||||||
<div :class="['status', data?.metrics?.mental_health?.depression?.status == '正常' ? '' : 'error']">{{ data?.metrics?.mental_health?.depression?.status=='正常' ? '正常' : '异常' }}</div>
|
data?.metrics?.mental_health?.depression?.value }}</span>
|
||||||
|
<div :class="['status', data?.metrics?.mental_health?.depression?.status == '正常' ? '' : 'error']">{{
|
||||||
|
data?.metrics?.mental_health?.depression?.status == '正常' ? '正常' : '异常' }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="desc">正常范围:0~10分</div>
|
<div class="desc">正常范围:0~10分</div>
|
||||||
</div>
|
</div>
|
||||||
@ -161,8 +182,10 @@
|
|||||||
<div class="title"> <img src="@/assets/images/content4-icon1.png" alt="">焦虑指数
|
<div class="title"> <img src="@/assets/images/content4-icon1.png" alt="">焦虑指数
|
||||||
</div>
|
</div>
|
||||||
<div class="value">
|
<div class="value">
|
||||||
<span :class="['value', data?.metrics?.mental_health?.anxiety?.status == '正常' ? '' : 'error']">{{ data?.metrics?.mental_health?.anxiety?.value }}</span>
|
<span :class="['value', data?.metrics?.mental_health?.anxiety?.status == '正常' ? '' : 'error']">{{
|
||||||
<div :class="['status', data?.metrics?.mental_health?.anxiety?.status == '正常' ? '' : 'error']">{{ data?.metrics?.mental_health?.anxiety?.status=='正常' ? '正常' : '异常' }}</div>
|
data?.metrics?.mental_health?.anxiety?.value }}</span>
|
||||||
|
<div :class="['status', data?.metrics?.mental_health?.anxiety?.status == '正常' ? '' : 'error']">{{
|
||||||
|
data?.metrics?.mental_health?.anxiety?.status == '正常' ? '正常' : '异常' }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="desc">正常范围:0~10分</div>
|
<div class="desc">正常范围:0~10分</div>
|
||||||
</div>
|
</div>
|
||||||
@ -177,30 +200,44 @@
|
|||||||
<div class="content content5" :ref="(el) => setSectionEl(5, el)">
|
<div class="content content5" :ref="(el) => setSectionEl(5, el)">
|
||||||
<Item title="皮肤健康分析报告">
|
<Item title="皮肤健康分析报告">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="type"><span>{{ data?.metrics?.skin_status?.skin_type?.value }}</span></div>
|
<div class="type"><span>肤质类型</span></div>
|
||||||
<div class="desc">混合性肌肤:T区偏油,U区偏干</div>
|
<div class="desc">{{ data?.metrics?.skin_status?.skin_type?.value }}</div>
|
||||||
|
|
||||||
<div class="line-box">
|
<div class="line-box">
|
||||||
<div class="dot" :style="{'--left': data?.metrics?.skin_status?.hydration?.value + '%'}">皮肤含水量{{data?.metrics?.skin_status?.hydration?.value}}%</div>
|
<div class="dot" :style="{ '--left': data?.metrics?.skin_status?.hydration?.value + '%' }">
|
||||||
|
皮肤含水量{{ data?.metrics?.skin_status?.hydration?.value }}%</div>
|
||||||
<div class="line"></div>
|
<div class="line"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="skin-box">
|
<div class="skin-box">
|
||||||
<div class="avatar">
|
<div class="avatar">
|
||||||
<div class="item">黑眼圈 <img :src="data?.metrics?.skin_status?.dark_circles?.value =='轻度' ? content5Status1 : data?.metrics?.skin_status?.dark_circles?.value =='中度' ? content5Status2 : content5Status3" alt=""></div>
|
<div class="item">黑眼圈 <img
|
||||||
<div class="item item2">出油状态 <img :src="data?.metrics?.skin_status?.oil_control?.value =='轻度' ? content5Status1 : data?.metrics?.skin_status?.oil_control?.value =='中度' ? content5Status2 : content5Status3" alt=""></div>
|
:src="data?.metrics?.skin_status?.dark_circles?.value == '轻度' ? content5Status1 : data?.metrics?.skin_status?.dark_circles?.value == '中度' ? content5Status2 : content5Status3"
|
||||||
<div class="item item3">痤疮 <img :src="data?.metrics?.skin_status?.acne?.value =='少量' ? content5Status1 : data?.metrics?.skin_status?.acne?.value =='中度' ? content5Status2 : content5Status3" alt=""></div>
|
alt=""></div>
|
||||||
</div>
|
<div class="item item2">出油状态 <img
|
||||||
<div class="legend"></div>
|
:src="data?.metrics?.skin_status?.oil_control?.value == '轻度' ? content5Status1 : data?.metrics?.skin_status?.oil_control?.value == '中度' ? content5Status2 : content5Status3"
|
||||||
|
alt=""></div>
|
||||||
|
<div class="item item3">痤疮 <img
|
||||||
|
:src="data?.metrics?.skin_status?.acne?.value == '少量' ? content5Status1 : data?.metrics?.skin_status?.acne?.value == '中度' ? content5Status2 : content5Status3"
|
||||||
|
alt=""></div>
|
||||||
|
</div>
|
||||||
|
<div class="legend"></div>
|
||||||
|
</div>
|
||||||
|
<div class="text">{{ data?.metrics?.skin_status?.analysis }}
|
||||||
</div>
|
</div>
|
||||||
<div class="text">您的皮肤整体状态良好,含水量适中。面部有轻度黑眼圈,可能与睡眠不足有关。T区出油较为明显,建议加强控油和清洁。面部有少量痤疮,需注意饮食清淡和规律作息。整体肤质为混合型,建议分区护理。</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="tips">
|
<div class="tips">
|
||||||
<Tips title="护理建议" :text="data?.metrics?.skin_status?.analysis" />
|
<Tips title="护理建议" :text="data?.metrics?.skin_status?.suggestion " />
|
||||||
</div>
|
</div>
|
||||||
</Item>
|
</Item>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div v-if="reportQrDataUrl" class="report-qr">
|
||||||
|
|
||||||
|
<img class="report-qr-img" :src="reportQrDataUrl" alt="报告链接二维码" />
|
||||||
|
<div class="report-qr-title">扫描二维码下载健康报告</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@ -210,6 +247,7 @@ import { useRouter } from 'vue-router';
|
|||||||
import { onBeforeUnmount, onMounted, ref, watch, nextTick } from 'vue';
|
import { onBeforeUnmount, onMounted, ref, watch, nextTick } from 'vue';
|
||||||
import { format } from 'silly-datetime';
|
import { format } from 'silly-datetime';
|
||||||
import html2canvas from 'html2canvas';
|
import html2canvas from 'html2canvas';
|
||||||
|
import QRCode from 'qrcode';
|
||||||
import Item from '@/components/Item/index.vue';
|
import Item from '@/components/Item/index.vue';
|
||||||
import content5Status1 from '@/assets/images/content5-status1.png';
|
import content5Status1 from '@/assets/images/content5-status1.png';
|
||||||
import content5Status2 from '@/assets/images/content5-status2.png';
|
import content5Status2 from '@/assets/images/content5-status2.png';
|
||||||
@ -217,7 +255,7 @@ import content5Status3 from '@/assets/images/content5-status3.png';
|
|||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
/** 报告页整页截图上传 */
|
/** 报告页整页截图上传 */
|
||||||
const REPORT_UPLOAD_URL = 'https://webapi.hbnews.net:8000/gateway/coupon/common/upload';
|
const REPORT_UPLOAD_URL = 'https://shopapi.hbilife.cn/common/common/common/upload/anonymous/file';
|
||||||
const REPORT_IMAGE_BASE = 'https://webapi.hbnews.net:8000/gateway/coupon';
|
const REPORT_IMAGE_BASE = 'https://webapi.hbnews.net:8000/gateway/coupon';
|
||||||
|
|
||||||
/** 最近一次截图的 blob: URL;上传结束后仍会保留,勿在 finally 里立刻 revoke,否则新标签页打不开 */
|
/** 最近一次截图的 blob: URL;上传结束后仍会保留,勿在 finally 里立刻 revoke,否则新标签页打不开 */
|
||||||
@ -230,13 +268,6 @@ function revokeLastScreenshotBlobUrl() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildReportImageUrl(fileName: string): string {
|
|
||||||
if (!fileName) return '';
|
|
||||||
if (/^https?:\/\//i.test(fileName)) return fileName;
|
|
||||||
const base = REPORT_IMAGE_BASE.replace(/\/$/, '');
|
|
||||||
const path = fileName.replace(/^\//, '');
|
|
||||||
return `${base}/${path}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function extractUploadFileName(payload: unknown): string | null {
|
function extractUploadFileName(payload: unknown): string | null {
|
||||||
if (!payload || typeof payload !== 'object') return null;
|
if (!payload || typeof payload !== 'object') return null;
|
||||||
@ -306,10 +337,10 @@ async function captureReportPageAndUpload(): Promise<string | null> {
|
|||||||
canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('截图生成失败'))), 'image/png', 0.92);
|
canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('截图生成失败'))), 'image/png', 0.92);
|
||||||
});
|
});
|
||||||
|
|
||||||
revokeLastScreenshotBlobUrl();
|
// revokeLastScreenshotBlobUrl();
|
||||||
lastScreenshotBlobUrl = URL.createObjectURL(blob);
|
// lastScreenshotBlobUrl = URL.createObjectURL(blob);
|
||||||
console.log('报告截图临时:', lastScreenshotBlobUrl);
|
// console.log('报告截图临时:', lastScreenshotBlobUrl);
|
||||||
|
|
||||||
const fd = new FormData();
|
const fd = new FormData();
|
||||||
fd.append('file', blob, `health-report-${Date.now()}.png`);
|
fd.append('file', blob, `health-report-${Date.now()}.png`);
|
||||||
|
|
||||||
@ -317,6 +348,7 @@ async function captureReportPageAndUpload(): Promise<string | null> {
|
|||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: fd,
|
body: fd,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
const text = await res.text();
|
const text = await res.text();
|
||||||
let json: unknown;
|
let json: unknown;
|
||||||
@ -331,13 +363,8 @@ async function captureReportPageAndUpload(): Promise<string | null> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const fileName = extractUploadFileName(json);
|
|
||||||
if (!fileName) {
|
|
||||||
console.error('报告截图上传响应无 fileName', json);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return buildReportImageUrl(fileName);
|
return (json as { result: string }).result;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('报告截图或上传异常', e);
|
console.error('报告截图或上传异常', e);
|
||||||
return null;
|
return null;
|
||||||
@ -349,24 +376,54 @@ async function captureReportPageAndUpload(): Promise<string | null> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 上传接口若返回相对路径,拼成扫码可用的绝对 URL */
|
||||||
|
function toAbsoluteReportImageUrl(raw: string): string {
|
||||||
|
const t = raw.trim();
|
||||||
|
if (!t) return '';
|
||||||
|
if (/^https?:\/\//i.test(t)) return t;
|
||||||
|
const base = REPORT_IMAGE_BASE.replace(/\/$/, '');
|
||||||
|
const path = t.startsWith('/') ? t : `/${t}`;
|
||||||
|
return `${base}${path}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const reportQrDataUrl = ref('');
|
||||||
|
|
||||||
|
async function setReportQrFromUploadedUrl(url: string | null) {
|
||||||
|
if (!url) {
|
||||||
|
reportQrDataUrl.value = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const target = toAbsoluteReportImageUrl(url);
|
||||||
|
try {
|
||||||
|
reportQrDataUrl.value = await QRCode.toDataURL(target, {
|
||||||
|
width: 240,
|
||||||
|
margin: 2,
|
||||||
|
errorCorrectionLevel: 'M',
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.error('二维码生成失败', e);
|
||||||
|
reportQrDataUrl.value = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const creatTime = ref(new Date().toLocaleString());
|
const creatTime = ref(new Date().toLocaleString());
|
||||||
const data = ref<any>({});
|
const data = ref<any>({});
|
||||||
const summaryText = ref('');
|
const summaryText = ref('');
|
||||||
const numsData = ref<any>({
|
const numsData = ref<any>({
|
||||||
base:{
|
base: {
|
||||||
normal:0,//正常
|
normal: 0,//正常
|
||||||
abnormal:0,//异常
|
abnormal: 0,//异常
|
||||||
},
|
},
|
||||||
blood:{
|
blood: {
|
||||||
normal:0,//正常
|
normal: 0,//正常
|
||||||
abnormal:0,//异常
|
abnormal: 0,//异常
|
||||||
},
|
},
|
||||||
mental:{
|
mental: {
|
||||||
normal:0,//正常
|
normal: 0,//正常
|
||||||
abnormal:0,//异常
|
abnormal: 0,//异常
|
||||||
},
|
},
|
||||||
normalTotal:0,//正常总数
|
normalTotal: 0,//正常总数
|
||||||
abnormalTotal:0,//异常总数
|
abnormalTotal: 0,//异常总数
|
||||||
});
|
});
|
||||||
|
|
||||||
const tabs = ref([
|
const tabs = ref([
|
||||||
@ -635,6 +692,7 @@ onMounted(() => {
|
|||||||
window.setTimeout(() => {
|
window.setTimeout(() => {
|
||||||
captureReportPageAndUpload().then((url) => {
|
captureReportPageAndUpload().then((url) => {
|
||||||
if (url) console.log('报告截图已上传:', url);
|
if (url) console.log('报告截图已上传:', url);
|
||||||
|
void setReportQrFromUploadedUrl(url);
|
||||||
});
|
});
|
||||||
}, 800);
|
}, 800);
|
||||||
});
|
});
|
||||||
@ -754,7 +812,7 @@ if (arkResult) {
|
|||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0px;
|
||||||
z-index: 20;
|
z-index: 20;
|
||||||
background: #F3F3F3;
|
background: #F3F3F3;
|
||||||
|
|
||||||
@ -937,7 +995,7 @@ if (arkResult) {
|
|||||||
|
|
||||||
.tips {
|
.tips {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1039,7 +1097,7 @@ if (arkResult) {
|
|||||||
|
|
||||||
.tips {
|
.tips {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1110,6 +1168,7 @@ if (arkResult) {
|
|||||||
|
|
||||||
span {
|
span {
|
||||||
font-size: 60px;
|
font-size: 60px;
|
||||||
|
|
||||||
&.error {
|
&.error {
|
||||||
color: #F36151;
|
color: #F36151;
|
||||||
}
|
}
|
||||||
@ -1202,7 +1261,7 @@ if (arkResult) {
|
|||||||
height: 54px;
|
height: 54px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
color:#fff;
|
color: #fff;
|
||||||
background: url('@/assets/images/dot.png') no-repeat center center / 100% 100%;
|
background: url('@/assets/images/dot.png') no-repeat center center / 100% 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@ -1215,67 +1274,100 @@ if (arkResult) {
|
|||||||
background: url('@/assets/images/content5-line.png') no-repeat center center / cover;
|
background: url('@/assets/images/content5-line.png') no-repeat center center / cover;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.skin-box{
|
.skin-box {
|
||||||
|
|
||||||
margin-top: 50px;
|
margin-top: 50px;
|
||||||
.avatar{
|
|
||||||
|
.avatar {
|
||||||
position: relative;
|
position: relative;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
width: 336px;
|
width: 336px;
|
||||||
height: 336px;
|
height: 336px;
|
||||||
background: url('@/assets/images/avatar.png') no-repeat center center / cover;
|
background: url('@/assets/images/avatar.png') no-repeat center center / cover;
|
||||||
.item{
|
|
||||||
|
.item {
|
||||||
top: 96px;
|
top: 96px;
|
||||||
left: -109px;
|
left: -109px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
padding: 9px 27px;
|
padding: 9px 27px;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
color:rgba(0,0,0,0.65);
|
color: rgba(0, 0, 0, 0.65);
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 25px 25px 0 25px;
|
border-radius: 25px 25px 0 25px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
img{
|
|
||||||
|
img {
|
||||||
width: 44px;
|
width: 44px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
margin-left: 8px;
|
margin-left: 8px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.item2{
|
|
||||||
|
.item2 {
|
||||||
top: 16px;
|
top: 16px;
|
||||||
left: 244px;
|
left: 244px;
|
||||||
}
|
}
|
||||||
.item3{
|
|
||||||
|
.item3 {
|
||||||
top: 160px;
|
top: 160px;
|
||||||
left: 293px;
|
left: 293px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.legend{
|
|
||||||
|
.legend {
|
||||||
margin: 30px auto 0;
|
margin: 30px auto 0;
|
||||||
width: 531px;
|
width: 531px;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
background: url('@/assets/images/legend.png') no-repeat center center / cover;
|
background: url('@/assets/images/legend.png') no-repeat center center / cover;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.text{
|
|
||||||
|
.text {
|
||||||
margin-top: 36px;
|
margin-top: 36px;
|
||||||
font-size: 30px;
|
font-size: 30px;
|
||||||
color: #000;
|
color: #000;
|
||||||
line-height: 48px;
|
line-height: 48px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
.tips{
|
|
||||||
margin-top: 20px;
|
|
||||||
// height: 254px;
|
|
||||||
// background: url('@/assets/images/content5-tips.png') no-repeat center center / cover;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
.tips {
|
||||||
|
margin-top: 20px;
|
||||||
|
// height: 254px;
|
||||||
|
// background: url('@/assets/images/content5-tips.png') no-repeat center center / cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.report-qr {
|
||||||
|
margin:50px auto ;
|
||||||
|
width: 956px;
|
||||||
|
max-width: calc(100% - 60px);
|
||||||
|
padding: 40px 30px 50px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
// background: #fff;
|
||||||
|
text-align: center;
|
||||||
|
// box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
|
||||||
|
|
||||||
|
.report-qr-title {
|
||||||
|
font-size: 24px;
|
||||||
|
color: #000;
|
||||||
|
margin-top: 29px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.report-qr-img {
|
||||||
|
width: 240px;
|
||||||
|
height: 240px;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@ -1,112 +0,0 @@
|
|||||||
async function analyzeVideoWithArk(videoBase64: string) {
|
|
||||||
try {
|
|
||||||
const apiUrl = "https://ark.cn-beijing.volces.com/api/v3/responses";
|
|
||||||
const apiKey = "3496e327-0454-426c-8e69-13e905a1e756";
|
|
||||||
|
|
||||||
const requestBody = {
|
|
||||||
model: "doubao-seed-2-0-pro-260215",
|
|
||||||
input: [
|
|
||||||
{
|
|
||||||
role: "user",
|
|
||||||
content: [
|
|
||||||
{
|
|
||||||
type: "input_video",
|
|
||||||
video_url: "",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "input_text",
|
|
||||||
text:"角色设定\n" +
|
|
||||||
"你是一位基于计算机视觉的医疗级AI分析师。你的核心能力是通过分析面部微细血管的颜色变化(rPPG技术原理)、皮肤纹理细节、微表情特征来推断生理数据。\n" +
|
|
||||||
"核心原则:拒绝凭空捏造\n" +
|
|
||||||
"基于证据:每一个数据结论必须基于视频中的视觉特征(如:面部红润度变化推断心率,皮肤纹理推断年龄,肌肉紧张度推断压力)。\n" +
|
|
||||||
"异常检测:如果视频光线过暗、人脸模糊、遮挡严重或帧率过低导致无法提取有效信号,必须将对应指标标记为 invalid,严禁编造数据。\n" +
|
|
||||||
"逻辑自洽:数据必须符合生理常识(例如:心率与呼吸频率的比值通常在4:1左右,如果心率180且呼吸10,则数据存疑)。\n" +
|
|
||||||
"分析步骤\n" +
|
|
||||||
"视觉特征提取:\n" +
|
|
||||||
"观察前额/脸颊区域的像素颜色微小波动(用于计算心率、血压)。\n" +
|
|
||||||
"观察眼周、嘴角的纹理与下垂程度(用于计算皮肤年龄)。\n" +
|
|
||||||
"观察眉间紧锁程度、眨眼频率(用于计算心理压力)。\n" +
|
|
||||||
"数值估算与校验:\n" +
|
|
||||||
"根据特征估算数值。\n" +
|
|
||||||
"对照下方的【绝对生理极限表】,超出范围直接标记为 invalid。\n" +
|
|
||||||
"报告生成:基于有效数据生成JSON。\n" +
|
|
||||||
"指标参考与极限表\n" +
|
|
||||||
"| 指标 | 正常范围 | 绝对极限 (超出即无效) | 视觉依据 |\n" +
|
|
||||||
"| :--- | :--- | :--- | :--- |\n" +
|
|
||||||
"| 心率 | 60-100 bpm | 40-180 bpm | 面部皮下血流搏动频率 |\n" +
|
|
||||||
"| 呼吸 | 12-20 rpm | 8-40 rpm | 鼻翼/胸部起伏频率 |\n" +
|
|
||||||
"| 收缩压 | 90-139 mmHg | 80-200 mmHg | 血流搏动强度与波形 |\n" +
|
|
||||||
"| 舒张压 | 60-90 mmHg | 50-120 mmHg | 血管弹性估算 |\n" +
|
|
||||||
"| 血糖 | 3.9-6.1 mmol/L | 3.0-15.0 mmol/L | 巩膜/肤色特定光谱特征 |\n" +
|
|
||||||
"| 血红蛋白 | 110-165 g/L | 90-180 g/L | 面部血色充盈度 |\n" +
|
|
||||||
"| 甘油三酯 | 0.56-1.96 mmol/L | 0.4-5.0 mmol/L | 皮肤油脂光泽度 |\n" +
|
|
||||||
"| 皮肤年龄 | 实际年龄±5岁 | 5-90 岁 | 皱纹深度、皮肤紧致度 |\n" +
|
|
||||||
"| 压力/焦虑 | 0-10 分 | 0-10 分 | 眉间纹、咬肌紧张度 |\n" +
|
|
||||||
"\n" +
|
|
||||||
"输出格式\n" +
|
|
||||||
"请严格按照以下JSON格式返回,不要有任何其他的返回,你给我返回的内容就是一个json如下格式" +
|
|
||||||
"{\n" +
|
|
||||||
" \"visual_quality_check\": {\n" +
|
|
||||||
" \"lighting\": \"good\",\n" +
|
|
||||||
" \"face_clarity\": \"high\",\n" +
|
|
||||||
" \"signal_reliability\": \"valid\"\n" +
|
|
||||||
" },\n" +
|
|
||||||
" \"metrics\": {\n" +
|
|
||||||
" \"vital_signs\": {\n" +
|
|
||||||
" \"heart_rate\": { \"value\": 78, \"unit\": \"bpm\", \"status\": \"normal\", \"desc\": \"心率\" },\n" +
|
|
||||||
" \"respiratory_rate\": { \"value\": 16, \"unit\": \"rpm\", \"status\": \"normal\", \"desc\": \"呼吸频率\" },\n" +
|
|
||||||
" \"systolic_bp\": { \"value\": 125, \"unit\": \"mmHg\", \"status\": \"normal\", \"desc\": \"收缩压\" },\n" +
|
|
||||||
" \"diastolic_bp\": { \"value\": 82, \"unit\": \"mmHg\", \"status\": \"normal\", \"desc\": \"舒张压\" }\n" +
|
|
||||||
" },\n" +
|
|
||||||
" \"blood_health\": {\n" +
|
|
||||||
" \"glucose\": { \"value\": 5.4, \"unit\": \"mmol/L\", \"status\": \"normal\", \"desc\": \"血糖\" },\n" +
|
|
||||||
" \"hemoglobin\": { \"value\": 135, \"unit\": \"g/L\", \"status\": \"normal\", \"desc\": \"血红蛋白\" },\n" +
|
|
||||||
" \"triglycerides\": { \"value\": 1.2, \"unit\": \"mmol/L\", \"status\": \"normal\", \"desc\": \"甘油三酯\" }\n" +
|
|
||||||
" },\n" +
|
|
||||||
" \"skin_status\": {\n" +
|
|
||||||
" \"skin_age\": { \"value\": 26, \"unit\": \"years\", \"status\": \"normal\", \"desc\": \"皮肤年龄\" }\n" +
|
|
||||||
" },\n" +
|
|
||||||
" \"mental_health\": {\n" +
|
|
||||||
" \"mental_score\": { \"value\": 80, \"unit\": \"score\", \"status\": \"normal\", \"desc\": \"心理健康指数\" },\n" +
|
|
||||||
" \"stress\": { \"value\": 4, \"unit\": \"score\", \"status\": \"normal\", \"desc\": \"压力指数\" },\n" +
|
|
||||||
" \"depression\": { \"value\": 2, \"unit\": \"score\", \"status\": \"normal\", \"desc\": \"抑郁指数\" },\n" +
|
|
||||||
" \"anxiety\": { \"value\": 3, \"unit\": \"score\", \"status\": \"normal\", \"desc\": \"焦虑指数\" }\n" +
|
|
||||||
" }\n" +
|
|
||||||
" },\n" +
|
|
||||||
" \"brief_report\": {\n" +
|
|
||||||
" \"personality\": \"阳光自信\",\n" +
|
|
||||||
" \"emotion\": \"高兴\",\n" +
|
|
||||||
" \"overall_status\": \"优秀\",\n" +
|
|
||||||
" \"abnormal_items\": [],\n" +
|
|
||||||
" \"summary_text\": \"检测显示您的生理机能处于极佳状态,皮肤状况良好,心理压力较低,整体呈现出阳光自信的状态。\"\n" +
|
|
||||||
" }\n" +
|
|
||||||
"}"
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
requestBody.input[0].content[0].video_url = videoBase64;
|
|
||||||
const response = await fetch(apiUrl, {
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bearer ${apiKey}`,
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
},
|
|
||||||
body: JSON.stringify(requestBody),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
const errorData = await response.json();
|
|
||||||
throw new Error(`API请求失败: ${errorData.error?.message || "未知错误"}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await response.json();
|
|
||||||
return data;
|
|
||||||
} catch (error: any) {
|
|
||||||
console.error("调用Ark API失败:", error);
|
|
||||||
errorMessage.value = `视频分析失败: ${error.message || "未知错误"}`;
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user