diff --git a/apps/miniprogram/config/dev.ts b/apps/miniprogram/config/dev.ts
index 291bc4e..6632026 100644
--- a/apps/miniprogram/config/dev.ts
+++ b/apps/miniprogram/config/dev.ts
@@ -20,5 +20,23 @@ export default {
});
},
},
- h5: {},
+ h5: {
+ devServer: {
+ proxy: {
+ '/api': {
+ target: 'http://localhost:3000',
+ changeOrigin: true,
+ },
+ },
+ client: {
+ overlay: {
+ errors: true,
+ warnings: false,
+ },
+ },
+ },
+ webpackChain(chain) {
+ chain.resolve.alias.set('react-dom$', require.resolve('react-dom'));
+ },
+ },
} satisfies UserConfigExport;
diff --git a/apps/miniprogram/config/index.ts b/apps/miniprogram/config/index.ts
index d41d2a1..730c2b0 100644
--- a/apps/miniprogram/config/index.ts
+++ b/apps/miniprogram/config/index.ts
@@ -8,7 +8,7 @@ export default defineConfig(async (merge) => {
designWidth: 375,
deviceRatio: { 640: 2.34 / 2, 750: 1, 375: 2, 828: 1.81 / 2 },
sourceRoot: 'src',
- outputRoot: 'dist',
+ outputRoot: process.env.TARO_ENV === 'h5' ? 'dist-h5' : 'dist',
plugins: [],
defineConstants: {
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'),
diff --git a/apps/miniprogram/config/prod.ts b/apps/miniprogram/config/prod.ts
index 8a43222..508f670 100644
--- a/apps/miniprogram/config/prod.ts
+++ b/apps/miniprogram/config/prod.ts
@@ -18,7 +18,6 @@ export default {
h5: {
miniCssExtractPluginOption: {
ignoreOrder: true,
- cssLoaderOption: { importLoaders: 1, esModule: false },
},
},
} satisfies UserConfigExport;
diff --git a/apps/miniprogram/package.json b/apps/miniprogram/package.json
index 89dfe55..74a5b4c 100644
--- a/apps/miniprogram/package.json
+++ b/apps/miniprogram/package.json
@@ -6,7 +6,9 @@
"scripts": {
"build:weapp": "taro build --type weapp",
"dev:weapp": "taro build --type weapp --watch",
- "test:e2e": "vitest run --config e2e/vitest.config.ts"
+ "test:e2e": "vitest run --config e2e/vitest.config.ts",
+ "dev:h5": "dotenv -e .env.h5 -- taro build --type h5 --watch",
+ "build:h5": "dotenv -e .env.h5 -- taro build --type h5"
},
"browserslist": [
"last 3 versions",
@@ -23,6 +25,7 @@
"@tarojs/shared": "4.2.0",
"@tarojs/taro": "4.2.0",
"react": "^18.3.0",
+ "react-dom": "18.3.1",
"zustand": "^5.0.0"
},
"devDependencies": {
@@ -30,15 +33,19 @@
"@babel/preset-react": "^7.28.5",
"@babel/preset-typescript": "^7.28.5",
"@babel/runtime": "^7.27.0",
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.6.2",
"@tarojs/cli": "4.2.0",
+ "@tarojs/plugin-platform-h5": "^4.2.0",
"@tarojs/webpack5-runner": "4.2.0",
"@types/react": "^18.3.0",
"babel-preset-taro": "^4.2.0",
+ "dotenv-cli": "^11.0.0",
"miniprogram-automator": "^0.12.1",
+ "react-refresh": "^0.14.0",
"sass": "^1.87.0",
"typescript": "^5.8.0",
"vite": "^8.0.10",
"vitest": "^4.1.5",
"webpack": "~5.95.0"
}
-}
+}
\ No newline at end of file
diff --git a/apps/miniprogram/pnpm-lock.yaml b/apps/miniprogram/pnpm-lock.yaml
index 6142a4d..f90520e 100644
--- a/apps/miniprogram/pnpm-lock.yaml
+++ b/apps/miniprogram/pnpm-lock.yaml
@@ -8,15 +8,6 @@ importers:
.:
dependencies:
- '@babel/preset-env':
- specifier: ^7.29.2
- version: 7.29.2(@babel/core@7.29.0)
- '@babel/preset-react':
- specifier: ^7.28.5
- version: 7.28.5(@babel/core@7.29.0)
- '@babel/preset-typescript':
- specifier: ^7.28.5
- version: 7.28.5(@babel/core@7.29.0)
'@tarojs/components':
specifier: 4.2.0
version: 4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
@@ -25,7 +16,7 @@ importers:
version: 4.2.0
'@tarojs/plugin-framework-react':
specifier: 4.2.0
- version: 4.2.0(@tarojs/helper@4.2.0)(@tarojs/runtime@4.2.0)(@tarojs/shared@4.2.0)(react@18.3.1)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@3.13.1)(sass@1.99.0)(stylus@0.64.0)(terser@5.46.2))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
+ version: 4.2.0(@pmmmwh/react-refresh-webpack-plugin@0.6.2(react-refresh@0.14.0)(type-fest@2.19.0)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/runtime@4.2.0)(@tarojs/shared@4.2.0)(react@18.3.1)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@3.13.1)(sass@1.99.0)(stylus@0.64.0)(terser@5.46.2))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
'@tarojs/plugin-platform-weapp':
specifier: 4.2.0
version: 4.2.0(@tarojs/service@4.2.0)(@tarojs/shared@4.2.0)
@@ -41,46 +32,55 @@ importers:
'@tarojs/taro':
specifier: 4.2.0
version: 4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/shared@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
- babel-preset-taro:
- specifier: ^4.2.0
- version: 4.2.0(@babel/core@7.29.0)(@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0))(@babel/preset-react@7.28.5(@babel/core@7.29.0))
- crypto-js:
- specifier: ^4.2.0
- version: 4.2.0
- echarts:
- specifier: ^6.0.0
- version: 6.0.0
react:
specifier: ^18.3.0
version: 18.3.1
react-dom:
- specifier: ^18.3.0
+ specifier: 18.3.1
version: 18.3.1(react@18.3.1)
- zod:
- specifier: ^4.3.6
- version: 4.3.6
zustand:
specifier: ^5.0.0
version: 5.0.12(@types/react@18.3.28)(react@18.3.1)
devDependencies:
+ '@babel/preset-env':
+ specifier: ^7.29.2
+ version: 7.29.2(@babel/core@7.29.0)
+ '@babel/preset-react':
+ specifier: ^7.28.5
+ version: 7.28.5(@babel/core@7.29.0)
+ '@babel/preset-typescript':
+ specifier: ^7.28.5
+ version: 7.28.5(@babel/core@7.29.0)
'@babel/runtime':
specifier: ^7.27.0
version: 7.29.2
+ '@pmmmwh/react-refresh-webpack-plugin':
+ specifier: ^0.6.2
+ version: 0.6.2(react-refresh@0.14.0)(type-fest@2.19.0)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
'@tarojs/cli':
specifier: 4.2.0
version: 4.2.0(@types/node@25.6.0)
+ '@tarojs/plugin-platform-h5':
+ specifier: ^4.2.0
+ version: 4.2.0(@tarojs/taro@4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/shared@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(react@18.3.1)(rollup@3.30.0)(solid-js@1.9.13)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
'@tarojs/webpack5-runner':
specifier: 4.2.0
version: 4.2.0(@babel/core@7.29.0)(@swc/core@1.3.96)(@tarojs/runtime@4.2.0)(less@3.13.1)(postcss@8.5.12)(sass@1.99.0)(stylus@0.64.0)(typescript@5.9.3)(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
- '@types/crypto-js':
- specifier: ^4.2.2
- version: 4.2.2
'@types/react':
specifier: ^18.3.0
version: 18.3.28
+ babel-preset-taro:
+ specifier: ^4.2.0
+ version: 4.2.0(@babel/core@7.29.0)(@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0))(@babel/preset-react@7.28.5(@babel/core@7.29.0))(react-refresh@0.14.0)
+ dotenv-cli:
+ specifier: ^11.0.0
+ version: 11.0.0
miniprogram-automator:
specifier: ^0.12.1
version: 0.12.1
+ react-refresh:
+ specifier: ^0.14.0
+ version: 0.14.0
sass:
specifier: ^1.87.0
version: 1.99.0
@@ -1352,6 +1352,32 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
+ '@pmmmwh/react-refresh-webpack-plugin@0.6.2':
+ resolution: {integrity: sha512-IhIAD5n4XvGHuL9nAgWfsBR0TdxtjrUWETYKCBHxauYXEv+b+ctEbs9neEgPC7Ecgzv4bpZTBwesAoGDeFymzA==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ '@types/webpack': 5.x
+ react-refresh: '>=0.10.0 <1.0.0'
+ sockjs-client: ^1.4.0
+ type-fest: '>=0.17.0 <6.0.0'
+ webpack: ^5.0.0
+ webpack-dev-server: ^4.8.0 || 5.x
+ webpack-hot-middleware: 2.x
+ webpack-plugin-serve: 1.x
+ peerDependenciesMeta:
+ '@types/webpack':
+ optional: true
+ sockjs-client:
+ optional: true
+ type-fest:
+ optional: true
+ webpack-dev-server:
+ optional: true
+ webpack-hot-middleware:
+ optional: true
+ webpack-plugin-serve:
+ optional: true
+
'@rnx-kit/babel-preset-metro-react-native@1.1.8':
resolution: {integrity: sha512-8DotuBK1ZgV0H/tmCmtW/3ofA7JR/8aPqSu9lKnuqwBfq4bxz+w1sMyfFl89m4teWlkhgyczWBGD6NCLqTgi9A==}
peerDependencies:
@@ -1638,6 +1664,12 @@ packages:
engines: {node: '>= 18'}
hasBin: true
+ '@tarojs/components-react@4.2.0':
+ resolution: {integrity: sha512-xQSnHIxNmVAqSNXE2rVHRDvu4bEvfGR4DEYZbho9IeY5W8i/Mc/+WzB4MpjyA8VDnmYLGltUt0+J9tzaOyv5Aw==}
+ peerDependencies:
+ react: '*'
+ solid-js: '*'
+
'@tarojs/components@4.2.0':
resolution: {integrity: sha512-SQIK5UxKfmkhV0MdhmC0KV6duSkBtF9C8sX3dF6afKX8DvULXP5dirH8Y4bJEL+Mt+dkhlXiBmuSk/C2KB7sVg==}
engines: {node: '>= 18'}
@@ -1754,6 +1786,9 @@ packages:
webpack:
optional: true
+ '@tarojs/plugin-platform-h5@4.2.0':
+ resolution: {integrity: sha512-HoyGHYaBrxJtaIRT1Y81LK7re0pLfF9DOGQ77bNmQwtuJS9JpiFMI47Q27+2anldwJodQdQP9d3KSPRqGnRLCw==}
+
'@tarojs/plugin-platform-weapp@4.2.0':
resolution: {integrity: sha512-0meY33+KYITF9uUav4JdKn2PY1xRnVQBVurPv3wm891pRBqPbfipcUsRjF7B1CeeWYqQK9/jy7gQlnzApmbakA==}
engines: {node: '>= 18'}
@@ -1767,6 +1802,14 @@ packages:
peerDependencies:
react: ^18
+ '@tarojs/router@4.2.0':
+ resolution: {integrity: sha512-V9Wixx+FkJe0dh5xkFvaowINnImJCetymNpcUr6HxuswGO94FI3oOg6AB+f8aOPRLiAzKfNNLfMM23jTBgcZFg==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ '@tarojs/runtime': 4.2.0
+ '@tarojs/shared': 4.2.0
+ '@tarojs/taro': 4.2.0
+
'@tarojs/runner-utils@4.2.0':
resolution: {integrity: sha512-M79iDSKjO3FNBBWfNiFlaihLsHGSQaXjSCglH0d9G1a/YWx2hfKtZaT67ca86YkfR/glz6ZBtIY5PTNQlED8AA==}
engines: {node: '>= 18'}
@@ -1783,6 +1826,11 @@ packages:
resolution: {integrity: sha512-nNege+07WSMFr44oAa7B2dQprBGD35AV8AOgGTFIQ5bAlriE2nOUt8hoiEtYtRlWx2zhdP6iDyVM0aNo2ijskw==}
engines: {node: '>= 18'}
+ '@tarojs/taro-h5@4.2.0':
+ resolution: {integrity: sha512-lK8FwVLlZZIq8ogcf34Voq0JipibdBSBJy86YosBPd6W0FFLmOZ89ylmmM4pHwilYyYWtv4NAG9/Ck/603dMqA==}
+ peerDependencies:
+ '@tarojs/components': ~4.2.0
+
'@tarojs/taro-loader@4.2.0':
resolution: {integrity: sha512-GIeKGEXEq/mh/UMEGz0p+NPn/SEBpNIFq2DCqo/ylezzTQbIgu4fiDNVhnxyaFSJ0w7bp/Nl/1yRpGpSQ9KmRA==}
engines: {node: '>= 18'}
@@ -1866,9 +1914,6 @@ packages:
'@types/connect@3.4.38':
resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
- '@types/crypto-js@4.2.2':
- resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==}
-
'@types/debug@4.1.13':
resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
@@ -2071,6 +2116,9 @@ packages:
'@xtuc/long@4.2.2':
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+ abortcontroller-polyfill@1.7.8:
+ resolution: {integrity: sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==}
+
accepts@1.3.8:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
@@ -2134,6 +2182,9 @@ packages:
ajv@8.20.0:
resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
+ anser@2.3.5:
+ resolution: {integrity: sha512-vcZjxvvVoxTeR5XBNJB38oTu/7eDCZlwdz32N1eNgpyPF7j/Z7Idf+CUwQOkKKpJ7RJyjxgLHCM7vdIK0iCNMQ==}
+
ansi-escapes@4.3.2:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
@@ -2247,6 +2298,12 @@ packages:
babel-plugin-transform-solid-jsx@4.2.0:
resolution: {integrity: sha512-5O8hB8z+W9TrTIjN/ZVdJ+VIzB3styzUq3+Cq7n2loLHjmftRCrEuGtUrMbicJLUbRCp1ljjviSlIWmnmXheMg==}
+ babel-plugin-transform-taroapi@4.2.0:
+ resolution: {integrity: sha512-aRO9LESblgxiigRfylmCtD3fJCYK/6C6hebtXiD3LznY9vVO47b2r/ENNUcQXYzJ6WfjErbQWUddK9xu5mv2xA==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
babel-preset-taro@4.2.0:
resolution: {integrity: sha512-nttfCGU0rILd5myTC+vERz+VWkltIqgWs9gyGFAPy8JHQ7dYXvpXLohZ/66RsuQY9WC+oB0ndJQ2thnLpxSUng==}
engines: {node: '>= 18'}
@@ -2396,6 +2453,9 @@ packages:
caniuse-lite@1.0.30001791:
resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==}
+ capital-case@1.0.4:
+ resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==}
+
caw@2.0.1:
resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==}
engines: {node: '>=4'}
@@ -2415,6 +2475,9 @@ packages:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
+ change-case@4.1.2:
+ resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==}
+
chardet@2.1.1:
resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
@@ -2538,6 +2601,9 @@ packages:
consola@2.15.3:
resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==}
+ constant-case@3.0.4:
+ resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==}
+
content-disposition@0.5.4:
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
engines: {node: '>= 0.6'}
@@ -2600,9 +2666,6 @@ packages:
crypt@0.0.2:
resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
- crypto-js@4.2.0:
- resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
-
css-declaration-sorter@7.4.0:
resolution: {integrity: sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==}
engines: {node: ^14 || ^16 || >=18}
@@ -2737,6 +2800,10 @@ packages:
resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
engines: {node: '>=0.10'}
+ decode-uri-component@0.4.1:
+ resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==}
+ engines: {node: '>=14.16'}
+
decompress-response@3.3.0:
resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
engines: {node: '>=4'}
@@ -2822,6 +2889,9 @@ packages:
engines: {node: '>= 4.0.0'}
hasBin: true
+ dingtalk-jsapi@2.15.6:
+ resolution: {integrity: sha512-804mFz2AFV/H9ysmo7dLqMjSGOQgREsgQIuep+Xg+yNQeQtnUOYntElEzlB798Sj/691e4mMKz9mtQ7v9qdjuA==}
+
dns-packet@5.6.1:
resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==}
engines: {node: '>=6'}
@@ -2862,14 +2932,26 @@ packages:
dot-case@3.0.4:
resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+ dotenv-cli@11.0.0:
+ resolution: {integrity: sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==}
+ hasBin: true
+
dotenv-expand@11.0.7:
resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==}
engines: {node: '>=12'}
+ dotenv-expand@12.0.3:
+ resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==}
+ engines: {node: '>=12'}
+
dotenv@16.6.1:
resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
engines: {node: '>=12'}
+ dotenv@17.4.2:
+ resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==}
+ engines: {node: '>=12'}
+
download-git-repo@3.0.2:
resolution: {integrity: sha512-N8hWXD4hXqmEcNoR8TBYFntaOcYvEQ7Bz90mgm3bZRTuteGQqwT32VDMnTyD0KTEvb8BWrMc1tVmzuV9u/WrAg==}
@@ -2887,9 +2969,6 @@ packages:
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
- echarts@6.0.0:
- resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==}
-
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
@@ -2944,6 +3023,9 @@ packages:
error-ex@1.3.4:
resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+ error-stack-parser@2.1.4:
+ resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==}
+
es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
@@ -3160,6 +3242,10 @@ packages:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
+ filter-obj@5.1.0:
+ resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==}
+ engines: {node: '>=14.16'}
+
finalhandler@1.3.2:
resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==}
engines: {node: '>= 0.8'}
@@ -3361,6 +3447,9 @@ packages:
handle-thing@2.0.1:
resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
+ harmony-reflect@1.6.2:
+ resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==}
+
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
@@ -3390,9 +3479,15 @@ packages:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
+ header-case@2.0.4:
+ resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==}
+
highlight.js@10.7.3:
resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
+ history@5.3.0:
+ resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==}
+
hls.js@1.6.16:
resolution: {integrity: sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA==}
@@ -3491,12 +3586,19 @@ packages:
resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
engines: {node: '>=0.10.0'}
+ ics@3.12.0:
+ resolution: {integrity: sha512-BBPiZ/TbUyZrxui7SHKGOa/n2HUxaW9ucn7cw47NW9OSKe5tItYxIdN7Uczti5nKURmfwVvYi2aLigCJGH1+cA==}
+
icss-utils@5.1.0:
resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
engines: {node: ^10 || ^12 || >= 14}
peerDependencies:
postcss: ^8.1.0
+ identity-obj-proxy@3.0.0:
+ resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==}
+ engines: {node: '>=4'}
+
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
@@ -3596,6 +3698,9 @@ packages:
resolution: {integrity: sha512-6KLcFrPCEP3AFXMfnWrIFkZpYNBVzZAoBJJDEZKtI3LXkaDjM3uFMJQjxiizUuZTZ9Oh9FNv/soXbx5TcpaDmA==}
engines: {node: '>=6.0'}
+ is-mobile@4.0.0:
+ resolution: {integrity: sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==}
+
is-natural-number@4.0.1:
resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==}
@@ -3761,6 +3866,9 @@ packages:
jsonfile@6.2.1:
resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
+ jsonp-retry@1.0.3:
+ resolution: {integrity: sha512-/jmE9+shtKP+oIt2AWO9Wx+C27NTGpLCEw4QHOqpoV2X6ta374HE9C+EEdgu8r3iLKgFMx7u5j0mCwxWN8UdlA==}
+
keyv@3.0.0:
resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==}
@@ -3918,6 +4026,9 @@ packages:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
+ lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
lodash.clonedeep@4.5.0:
resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
@@ -4122,6 +4233,9 @@ packages:
deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)
hasBin: true
+ mobile-detect@1.4.5:
+ resolution: {integrity: sha512-yc0LhH6tItlvfLBugVUEtgawwFU2sIe+cSdmRJJCTMZ5GEJyLxNyC/NIOAOGk67Fa8GNpOttO3Xz/1bHpXFD/g==}
+
ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
@@ -4357,6 +4471,9 @@ packages:
pascal-case@3.1.2:
resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+ path-case@3.0.4:
+ resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==}
+
path-exists@3.0.0:
resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
engines: {node: '>=4'}
@@ -4383,6 +4500,9 @@ packages:
path-to-regexp@0.1.13:
resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==}
+ path-to-regexp@6.3.0:
+ resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
+
path-type@6.0.0:
resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==}
engines: {node: '>=18'}
@@ -4448,6 +4568,9 @@ packages:
resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==}
engines: {node: '>=6'}
+ platform@1.3.6:
+ resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==}
+
pngjs@3.4.0:
resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==}
engines: {node: '>=4.0.0'}
@@ -4734,6 +4857,12 @@ packages:
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
engines: {node: '>= 0.6.0'}
+ promise-polyfill@7.1.2:
+ resolution: {integrity: sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==}
+
+ property-expr@2.0.6:
+ resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==}
+
proto-list@1.2.4:
resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
@@ -4777,6 +4906,10 @@ packages:
resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==}
engines: {node: '>=0.10.0'}
+ query-string@9.3.1:
+ resolution: {integrity: sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw==}
+ engines: {node: '>=18'}
+
querystringify@2.2.0:
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
@@ -4812,6 +4945,10 @@ packages:
peerDependencies:
react: ^18.2.0
+ react-refresh@0.14.0:
+ resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
+ engines: {node: '>=0.10.0'}
+
react@18.3.1:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
@@ -4949,6 +5086,9 @@ packages:
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ runes2@1.1.4:
+ resolution: {integrity: sha512-LNPnEDPOOU4ehF71m5JoQyzT2yxwD6ZreFJ7MxZUAoMKNMY1XrAo60H1CUoX5ncSm0rIuKlqn9JZNRrRkNou2g==}
+
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
@@ -5049,9 +5189,22 @@ packages:
resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==}
engines: {node: '>= 0.8.0'}
+ sentence-case@3.0.4:
+ resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==}
+
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+ seroval-plugins@1.5.4:
+ resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ seroval: ^1.0
+
+ seroval@1.5.4:
+ resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==}
+ engines: {node: '>=10'}
+
serve-index@1.9.2:
resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==}
engines: {node: '>= 0.8.0'}
@@ -5113,9 +5266,15 @@ packages:
resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
engines: {node: '>=14.16'}
+ snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
sockjs@0.3.24:
resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==}
+ solid-js@1.9.13:
+ resolution: {integrity: sha512-6hJeJMOcEX8ktqjpDoJZEmld3ijvcvWBDtiXBm7f4332SiFN66QeAQI1REQshvyUoISsSeJ4PHDauKYbwao9JQ==}
+
sort-keys-length@1.0.1:
resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==}
engines: {node: '>=0.10.0'}
@@ -5154,9 +5313,16 @@ packages:
resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==}
engines: {node: '>=6.0.0'}
+ split-on-first@3.0.0:
+ resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==}
+ engines: {node: '>=12'}
+
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+ stackframe@1.3.4:
+ resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
+
statuses@1.5.0:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
@@ -5329,6 +5495,9 @@ packages:
timm@1.7.1:
resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==}
+ tiny-case@1.0.3:
+ resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==}
+
tinybench@2.9.0:
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
@@ -5363,6 +5532,9 @@ packages:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
engines: {node: '>=0.6'}
+ toposort@2.0.2:
+ resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==}
+
tough-cookie@4.1.4:
resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
engines: {node: '>=6'}
@@ -5378,9 +5550,6 @@ packages:
tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
- tslib@2.3.0:
- resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
-
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -5399,6 +5568,10 @@ packages:
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
+ type-fest@2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+
type-is@1.6.18:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
@@ -5446,6 +5619,9 @@ packages:
resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
engines: {node: '>=18'}
+ universal-router@9.2.1:
+ resolution: {integrity: sha512-i3XDhyfg0znwCu2Ue1zwWIWgfed+XYDqlUYXgriGnS58tzO3RgKHe4KWtq9HLQOl/Tknnh0C6jEH0+FLTrrBiQ==}
+
universalify@0.1.2:
resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
engines: {node: '>= 4.0.0'}
@@ -5468,9 +5644,15 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
+ upper-case-first@2.0.2:
+ resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==}
+
upper-case@1.1.3:
resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==}
+ upper-case@2.0.2:
+ resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==}
+
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -5688,6 +5870,9 @@ packages:
engines: {node: '>=18'}
deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
+ whatwg-fetch@3.6.20:
+ resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
+
whatwg-mimetype@4.0.0:
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
engines: {node: '>=18'}
@@ -5805,11 +5990,8 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
- zod@4.3.6:
- resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
-
- zrender@6.0.0:
- resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==}
+ yup@1.7.1:
+ resolution: {integrity: sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==}
zustand@5.0.12:
resolution: {integrity: sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==}
@@ -7191,6 +7373,20 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
+ '@pmmmwh/react-refresh-webpack-plugin@0.6.2(react-refresh@0.14.0)(type-fest@2.19.0)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))':
+ dependencies:
+ anser: 2.3.5
+ core-js-pure: 3.49.0
+ error-stack-parser: 2.1.4
+ html-entities: 2.6.0
+ react-refresh: 0.14.0
+ schema-utils: 4.3.3
+ source-map: 0.7.6
+ webpack: 5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)
+ optionalDependencies:
+ type-fest: 2.19.0
+ webpack-dev-server: 4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
+
'@rnx-kit/babel-preset-metro-react-native@1.1.8(@babel/core@7.29.0)(@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0))(@babel/runtime@7.29.2)':
dependencies:
'@babel/core': 7.29.0
@@ -7392,6 +7588,29 @@ snapshots:
- debug
- supports-color
+ '@tarojs/components-react@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(react@18.3.1)(rollup@3.30.0)(solid-js@1.9.13)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))':
+ dependencies:
+ '@babel/runtime': 7.29.2
+ '@tarojs/components': 4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
+ '@tarojs/shared': 4.2.0
+ '@tarojs/taro': 4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/shared@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
+ classnames: 2.5.1
+ identity-obj-proxy: 3.0.0
+ react: 18.3.1
+ solid-js: 1.9.13
+ swiper: 11.1.15
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@tarojs/helper'
+ - '@types/react'
+ - html-webpack-plugin
+ - postcss
+ - rollup
+ - vue
+ - webpack
+ - webpack-chain
+ - webpack-dev-server
+
'@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))':
dependencies:
'@stencil/core': 2.22.3
@@ -7490,7 +7709,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@tarojs/plugin-framework-react@4.2.0(@tarojs/helper@4.2.0)(@tarojs/runtime@4.2.0)(@tarojs/shared@4.2.0)(react@18.3.1)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@3.13.1)(sass@1.99.0)(stylus@0.64.0)(terser@5.46.2))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))':
+ '@tarojs/plugin-framework-react@4.2.0(@pmmmwh/react-refresh-webpack-plugin@0.6.2(react-refresh@0.14.0)(type-fest@2.19.0)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/runtime@4.2.0)(@tarojs/shared@4.2.0)(react@18.3.1)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@3.13.1)(sass@1.99.0)(stylus@0.64.0)(terser@5.46.2))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))':
dependencies:
'@tarojs/helper': 4.2.0
'@tarojs/runtime': 4.2.0
@@ -7500,10 +7719,40 @@ snapshots:
lodash: 4.18.1
tslib: 2.8.1
optionalDependencies:
+ '@pmmmwh/react-refresh-webpack-plugin': 0.6.2(react-refresh@0.14.0)(type-fest@2.19.0)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
react: 18.3.1
vite: 8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(less@3.13.1)(sass@1.99.0)(stylus@0.64.0)(terser@5.46.2)
webpack: 5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)
+ '@tarojs/plugin-platform-h5@4.2.0(@tarojs/taro@4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/shared@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(react@18.3.1)(rollup@3.30.0)(solid-js@1.9.13)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@tarojs/components': 4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
+ '@tarojs/components-react': 4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(react@18.3.1)(rollup@3.30.0)(solid-js@1.9.13)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
+ '@tarojs/helper': 4.2.0
+ '@tarojs/runtime': 4.2.0
+ '@tarojs/service': 4.2.0
+ '@tarojs/shared': 4.2.0
+ '@tarojs/taro-h5': 4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/taro@4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/shared@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))
+ babel-plugin-transform-taroapi: 4.2.0(@babel/core@7.29.0)
+ change-case: 4.1.2
+ lodash-es: 4.17.21
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@swc/helpers'
+ - '@tarojs/taro'
+ - '@types/react'
+ - html-webpack-plugin
+ - postcss
+ - react
+ - rollup
+ - solid-js
+ - supports-color
+ - vue
+ - webpack
+ - webpack-chain
+ - webpack-dev-server
+
'@tarojs/plugin-platform-weapp@4.2.0(@tarojs/service@4.2.0)(@tarojs/shared@4.2.0)':
dependencies:
'@tarojs/service': 4.2.0
@@ -7516,6 +7765,18 @@ snapshots:
react: 18.3.1
react-reconciler: 0.29.0(react@18.3.1)
+ '@tarojs/router@4.2.0(@tarojs/runtime@4.2.0)(@tarojs/shared@4.2.0)(@tarojs/taro@4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/shared@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))':
+ dependencies:
+ '@tarojs/runtime': 4.2.0
+ '@tarojs/shared': 4.2.0
+ '@tarojs/taro': 4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/shared@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
+ dingtalk-jsapi: 2.15.6
+ history: 5.3.0
+ mobile-detect: 1.4.5
+ query-string: 9.3.1
+ tslib: 2.8.1
+ universal-router: 9.2.1
+
'@tarojs/runner-utils@4.2.0':
dependencies:
'@tarojs/helper': 4.2.0
@@ -7547,6 +7808,26 @@ snapshots:
'@tarojs/shared@4.2.0': {}
+ '@tarojs/taro-h5@4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/taro@4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/shared@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))':
+ dependencies:
+ '@tarojs/api': 4.2.0(@tarojs/runtime@4.2.0)(@tarojs/shared@4.2.0)
+ '@tarojs/components': 4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))
+ '@tarojs/router': 4.2.0(@tarojs/runtime@4.2.0)(@tarojs/shared@4.2.0)(@tarojs/taro@4.2.0(@tarojs/components@4.2.0(@tarojs/helper@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(@tarojs/helper@4.2.0)(@tarojs/shared@4.2.0)(@types/react@18.3.28)(html-webpack-plugin@5.6.7(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(postcss@8.5.12)(rollup@3.30.0)(webpack-chain@6.5.1)(webpack-dev-server@4.15.2(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7)))
+ '@tarojs/runtime': 4.2.0
+ '@tarojs/shared': 4.2.0
+ abortcontroller-polyfill: 1.7.8
+ base64-js: 1.5.1
+ ics: 3.12.0
+ is-mobile: 4.0.0
+ jsonp-retry: 1.0.3
+ lodash-es: 4.17.21
+ platform: 1.3.6
+ query-string: 9.3.1
+ tslib: 2.8.1
+ whatwg-fetch: 3.6.20
+ transitivePeerDependencies:
+ - '@tarojs/taro'
+
'@tarojs/taro-loader@4.2.0(webpack@5.95.0(@swc/core@1.3.96)(esbuild@0.27.7))':
dependencies:
'@tarojs/helper': 4.2.0
@@ -7691,8 +7972,6 @@ snapshots:
dependencies:
'@types/node': 25.6.0
- '@types/crypto-js@4.2.2': {}
-
'@types/debug@4.1.13':
dependencies:
'@types/ms': 2.1.0
@@ -7961,6 +8240,8 @@ snapshots:
'@xtuc/long@4.2.2': {}
+ abortcontroller-polyfill@1.7.8: {}
+
accepts@1.3.8:
dependencies:
mime-types: 2.1.35
@@ -8018,6 +8299,8 @@ snapshots:
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
+ anser@2.3.5: {}
+
ansi-escapes@4.3.2:
dependencies:
type-fest: 0.21.3
@@ -8148,7 +8431,12 @@ snapshots:
transitivePeerDependencies:
- '@babel/core'
- babel-preset-taro@4.2.0(@babel/core@7.29.0)(@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0))(@babel/preset-react@7.28.5(@babel/core@7.29.0)):
+ babel-plugin-transform-taroapi@4.2.0(@babel/core@7.29.0):
+ dependencies:
+ '@babel/core': 7.29.0
+ lodash: 4.18.1
+
+ babel-preset-taro@4.2.0(@babel/core@7.29.0)(@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0))(@babel/preset-react@7.28.5(@babel/core@7.29.0))(react-refresh@0.14.0):
dependencies:
'@babel/core': 7.29.0
'@babel/helper-plugin-utils': 7.28.6
@@ -8167,6 +8455,7 @@ snapshots:
core-js: 3.49.0
optionalDependencies:
'@babel/preset-react': 7.28.5(@babel/core@7.29.0)
+ react-refresh: 0.14.0
transitivePeerDependencies:
- '@babel/plugin-transform-typescript'
- '@react-native/babel-preset'
@@ -8330,6 +8619,12 @@ snapshots:
caniuse-lite@1.0.30001791: {}
+ capital-case@1.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+ upper-case-first: 2.0.2
+
caw@2.0.1:
dependencies:
get-proxy: 2.1.0
@@ -8355,6 +8650,21 @@ snapshots:
ansi-styles: 4.3.0
supports-color: 7.2.0
+ change-case@4.1.2:
+ dependencies:
+ camel-case: 4.1.2
+ capital-case: 1.0.4
+ constant-case: 3.0.4
+ dot-case: 3.0.4
+ header-case: 2.0.4
+ no-case: 3.0.4
+ param-case: 3.0.4
+ pascal-case: 3.1.2
+ path-case: 3.0.4
+ sentence-case: 3.0.4
+ snake-case: 3.0.4
+ tslib: 2.8.1
+
chardet@2.1.1: {}
charenc@0.0.2: {}
@@ -8479,6 +8789,12 @@ snapshots:
consola@2.15.3: {}
+ constant-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+ upper-case: 2.0.2
+
content-disposition@0.5.4:
dependencies:
safe-buffer: 5.2.1
@@ -8536,8 +8852,6 @@ snapshots:
crypt@0.0.2: {}
- crypto-js@4.2.0: {}
-
css-declaration-sorter@7.4.0(postcss@8.5.12):
dependencies:
postcss: 8.5.12
@@ -8681,6 +8995,8 @@ snapshots:
decode-uri-component@0.2.2: {}
+ decode-uri-component@0.4.1: {}
+
decompress-response@3.3.0:
dependencies:
mimic-response: 1.0.1
@@ -8772,6 +9088,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ dingtalk-jsapi@2.15.6:
+ dependencies:
+ promise-polyfill: 7.1.2
+
dns-packet@5.6.1:
dependencies:
'@leichtgewicht/ip-codec': 2.0.5
@@ -8825,12 +9145,25 @@ snapshots:
no-case: 3.0.4
tslib: 2.8.1
+ dotenv-cli@11.0.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ dotenv: 17.4.2
+ dotenv-expand: 12.0.3
+ minimist: 1.2.8
+
dotenv-expand@11.0.7:
dependencies:
dotenv: 16.6.1
+ dotenv-expand@12.0.3:
+ dependencies:
+ dotenv: 16.6.1
+
dotenv@16.6.1: {}
+ dotenv@17.4.2: {}
+
download-git-repo@3.0.2:
dependencies:
download: 7.1.0
@@ -8862,11 +9195,6 @@ snapshots:
eastasianwidth@0.2.0: {}
- echarts@6.0.0:
- dependencies:
- tslib: 2.3.0
- zrender: 6.0.0
-
ee-first@1.1.1: {}
electron-to-chromium@1.5.344: {}
@@ -8907,6 +9235,10 @@ snapshots:
dependencies:
is-arrayish: 0.2.1
+ error-stack-parser@2.1.4:
+ dependencies:
+ stackframe: 1.3.4
+
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
@@ -9212,6 +9544,8 @@ snapshots:
dependencies:
to-regex-range: 5.0.1
+ filter-obj@5.1.0: {}
+
finalhandler@1.3.2:
dependencies:
debug: 2.6.9
@@ -9463,6 +9797,8 @@ snapshots:
handle-thing@2.0.1: {}
+ harmony-reflect@1.6.2: {}
+
has-flag@4.0.0: {}
has-property-descriptors@1.0.2:
@@ -9487,8 +9823,17 @@ snapshots:
he@1.2.0: {}
+ header-case@2.0.4:
+ dependencies:
+ capital-case: 1.0.4
+ tslib: 2.8.1
+
highlight.js@10.7.3: {}
+ history@5.3.0:
+ dependencies:
+ '@babel/runtime': 7.29.2
+
hls.js@1.6.16: {}
hpack.js@2.1.6:
@@ -9615,10 +9960,20 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
+ ics@3.12.0:
+ dependencies:
+ nanoid: 3.3.11
+ runes2: 1.1.4
+ yup: 1.7.1
+
icss-utils@5.1.0(postcss@8.5.12):
dependencies:
postcss: 8.5.12
+ identity-obj-proxy@3.0.0:
+ dependencies:
+ harmony-reflect: 1.6.2
+
ieee754@1.2.1: {}
ignore@5.3.2: {}
@@ -9705,6 +10060,8 @@ snapshots:
is-invalid-path@1.0.2: {}
+ is-mobile@4.0.0: {}
+
is-natural-number@4.0.1: {}
is-number@7.0.0: {}
@@ -9882,6 +10239,10 @@ snapshots:
optionalDependencies:
graceful-fs: 4.2.11
+ jsonp-retry@1.0.3:
+ dependencies:
+ object-assign: 4.1.1
+
keyv@3.0.0:
dependencies:
json-buffer: 3.0.0
@@ -10024,6 +10385,8 @@ snapshots:
dependencies:
p-locate: 5.0.0
+ lodash-es@4.17.21: {}
+
lodash.clonedeep@4.5.0: {}
lodash.debounce@4.0.8: {}
@@ -10204,6 +10567,8 @@ snapshots:
dependencies:
minimist: 0.0.8
+ mobile-detect@1.4.5: {}
+
ms@2.0.0: {}
ms@2.1.3: {}
@@ -10437,6 +10802,11 @@ snapshots:
no-case: 3.0.4
tslib: 2.8.1
+ path-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
path-exists@3.0.0: {}
path-exists@4.0.0: {}
@@ -10454,6 +10824,8 @@ snapshots:
path-to-regexp@0.1.13: {}
+ path-to-regexp@6.3.0: {}
+
path-type@6.0.0: {}
pathe@2.0.3: {}
@@ -10498,6 +10870,8 @@ snapshots:
dependencies:
find-up: 3.0.0
+ platform@1.3.6: {}
+
pngjs@3.4.0: {}
possible-typed-array-names@1.1.0: {}
@@ -10755,6 +11129,10 @@ snapshots:
process@0.11.10: {}
+ promise-polyfill@7.1.2: {}
+
+ property-expr@2.0.6: {}
+
proto-list@1.2.4: {}
proxy-addr@2.0.7:
@@ -10796,6 +11174,12 @@ snapshots:
object-assign: 4.1.1
strict-uri-encode: 1.1.0
+ query-string@9.3.1:
+ dependencies:
+ decode-uri-component: 0.4.1
+ filter-obj: 5.1.0
+ split-on-first: 3.0.0
+
querystringify@2.2.0: {}
queue-microtask@1.2.3: {}
@@ -10834,6 +11218,8 @@ snapshots:
react: 18.3.1
scheduler: 0.23.2
+ react-refresh@0.14.0: {}
+
react@18.3.1:
dependencies:
loose-envify: 1.4.0
@@ -10988,6 +11374,8 @@ snapshots:
dependencies:
queue-microtask: 1.2.3
+ runes2@1.1.4: {}
+
rxjs@7.8.2:
dependencies:
tslib: 2.8.1
@@ -11102,10 +11490,22 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ sentence-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+ upper-case-first: 2.0.2
+
serialize-javascript@6.0.2:
dependencies:
randombytes: 2.1.0
+ seroval-plugins@1.5.4(seroval@1.5.4):
+ dependencies:
+ seroval: 1.5.4
+
+ seroval@1.5.4: {}
+
serve-index@1.9.2:
dependencies:
accepts: 1.3.8
@@ -11186,12 +11586,23 @@ snapshots:
slash@5.1.0: {}
+ snake-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
sockjs@0.3.24:
dependencies:
faye-websocket: 0.11.4
uuid: 8.3.2
websocket-driver: 0.7.4
+ solid-js@1.9.13:
+ dependencies:
+ csstype: 3.2.3
+ seroval: 1.5.4
+ seroval-plugins: 1.5.4(seroval@1.5.4)
+
sort-keys-length@1.0.1:
dependencies:
sort-keys: 1.1.2
@@ -11238,8 +11649,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ split-on-first@3.0.0: {}
+
stackback@0.0.2: {}
+ stackframe@1.3.4: {}
+
statuses@1.5.0: {}
statuses@2.0.2: {}
@@ -11410,6 +11825,8 @@ snapshots:
timm@1.7.1: {}
+ tiny-case@1.0.3: {}
+
tinybench@2.9.0: {}
tinycolor2@1.6.0: {}
@@ -11437,6 +11854,8 @@ snapshots:
toidentifier@1.0.1: {}
+ toposort@2.0.2: {}
+
tough-cookie@4.1.4:
dependencies:
psl: 1.15.0
@@ -11454,8 +11873,6 @@ snapshots:
tslib@1.14.1: {}
- tslib@2.3.0: {}
-
tslib@2.8.1: {}
tunnel-agent@0.6.0:
@@ -11470,6 +11887,8 @@ snapshots:
type-fest@0.21.3: {}
+ type-fest@2.19.0: {}
+
type-is@1.6.18:
dependencies:
media-typer: 0.3.0
@@ -11509,6 +11928,10 @@ snapshots:
unicorn-magic@0.3.0: {}
+ universal-router@9.2.1:
+ dependencies:
+ path-to-regexp: 6.3.0
+
universalify@0.1.2: {}
universalify@0.2.0: {}
@@ -11523,8 +11946,16 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
+ upper-case-first@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
upper-case@1.1.3: {}
+ upper-case@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
@@ -11745,6 +12176,8 @@ snapshots:
dependencies:
iconv-lite: 0.6.3
+ whatwg-fetch@3.6.20: {}
+
whatwg-mimetype@4.0.0: {}
whatwg-url@14.2.0:
@@ -11850,11 +12283,12 @@ snapshots:
yocto-queue@0.1.0: {}
- zod@4.3.6: {}
-
- zrender@6.0.0:
+ yup@1.7.1:
dependencies:
- tslib: 2.3.0
+ property-expr: 2.0.6
+ tiny-case: 1.0.3
+ toposort: 2.0.2
+ type-fest: 2.19.0
zustand@5.0.12(@types/react@18.3.28)(react@18.3.1):
optionalDependencies:
diff --git a/apps/miniprogram/src/index.html b/apps/miniprogram/src/index.html
new file mode 100644
index 0000000..6193b44
--- /dev/null
+++ b/apps/miniprogram/src/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+ HMS 健康管理
+
+
+
+
+
diff --git a/docs/design/MP-UI-OPTIMIZATION-GUIDE.md b/docs/design/MP-UI-OPTIMIZATION-GUIDE.md
new file mode 100644
index 0000000..f4c0c2b
--- /dev/null
+++ b/docs/design/MP-UI-OPTIMIZATION-GUIDE.md
@@ -0,0 +1,547 @@
+# HMS 小程序 UI 优化实施指南
+
+> 基于 `docs/design/mp-*.html` 高保真原型稿,指导全局性 UI 优化。
+> 核心原则:**先建组件库,再逐页替换**,避免逐页手写导致风格不一致。
+
+## 1. 原型稿索引
+
+所有原型文件在 `docs/design/` 目录下,双击浏览器即可预览:
+
+| 文件 | 涵盖页面 | 屏幕数 |
+|------|---------|--------|
+| `mp-00-visitor.html` | **访客端**:轮播图×3 + 访客首页 + 访客"我的" | 5 |
+| `mp-redesign-home.html` | 首页/健康/消息/我的(4个TabBar主页面) | 4 |
+| `mp-01-login.html` | 登录页(初始状态 + 填写中) | 2 |
+| `mp-02-consultation.html` | 咨询列表 + 聊天详情 | 2 |
+| `mp-03-appointment.html` | 预约列表 + 预约创建 + 预约详情 | 3 |
+| `mp-04-article-report.html` | 文章列表 + 详情 + AI报告列表 + 详情 | 4 |
+| `mp-05-mall.html` | 积分商城主页 | 1 |
+| `mp-06-health-pkg.html` | 告警/日常监测/设备同步/体征录入/趋势 | 5 |
+| `mp-07-profile-health.html` | 健康记录/诊断/用药/报告列表/报告详情 | 5 |
+| `mp-08-profile-dialysis.html` | 透析记录列表+详情/随访列表+详情 | 4 |
+| `mp-09-profile-other.html` | 家庭管理/添加/知情同意/事件/长者模式/设置 | 6 |
+| `mp-10-mall-pkg.html` | 商品详情/兑换确认/订单列表/咨询详情 | 4 |
+| `mp-11-doctor-core.html` | 医生工作台/待办/咨询/随访/患者 | 5 |
+| `mp-12-doctor-clinical.html` | 告警列表+详情/透析列表+创建/处方列表+详情 | 6 |
+
+**总计 14 个文件,52 个屏幕,覆盖 58+ 页面(含访客端)。**
+
+## 2. 设计 Token(全局变量)
+
+从原型稿中提取的完整 Token 系统,所有页面必须严格遵循:
+
+### 2.1 色彩体系
+
+```scss
+// === 患者端主色(暖陶土) ===
+$color-primary: #C4623A;
+$color-primary-light: #F0DDD4;
+$color-primary-dark: #8B3E1F;
+
+// === 医生端主色(靛蓝) ===
+$color-doctor-primary: #3A6B8C;
+$color-doctor-primary-light: #D4E5F0;
+$color-doctor-primary-dark: #2A4F6A;
+
+// === 中性色 ===
+$color-bg: #F5F0EB; // 页面背景
+$color-card: #FFFFFF; // 卡片背景
+$color-surface: #EDE8E2; // 表面/次要背景
+$color-border: #E8E2DC; // 边框
+$color-border-light: #F0EBE5; // 浅边框
+
+// === 文字色 ===
+$color-text: #2D2A26; // 主文字
+$color-text-secondary: #5A554F; // 次要文字
+$color-text-tertiary: #78716C; // 辅助文字
+
+// === 语义色 ===
+$color-success: #5B7A5E; // 正常/成功
+$color-success-light: #E8F0E8;
+$color-warning: #C4873A; // 警告/偏高
+$color-warning-light: #FFF3E0;
+$color-danger: #B54A4A; // 危险/异常
+$color-danger-light: #FDEAEA;
+
+// === 功能色 ===
+$color-wechat: #07C160; // 微信绿
+```
+
+### 2.2 字体系统
+
+```scss
+$font-display: "Georgia, 'Times New Roman', serif"; // 标题/数字
+$font-body: "-apple-system, 'PingFang SC', sans-serif"; // 正文
+
+// 字号规范(11级)
+$font-size-xs: 10px; // 极小标注
+$font-size-sm: 11px; // 标签/状态
+$font-size-base-sm: 12px; // 辅助文字
+$font-size-base: 13px; // 正文小
+$font-size-body: 14px; // 正文
+$font-size-md: 15px; // 小标题/按钮
+$font-size-lg: 16px; // 卡片标题
+$font-size-xl: 18px; // 区块标题
+$font-size-2xl: 22px; // 页面子标题
+$font-size-3xl: 26px; // 页面主标题
+$font-size-4xl: 28px; // 大号数字(积分等)
+$font-size-5xl: 30px; // 体征数值
+```
+
+### 2.3 圆角与间距
+
+```scss
+$radius-lg: 16px; // 卡片/大按钮
+$radius-md: 12px; // 输入框/中等容器
+$radius-sm: 8px; // 小元素/标签
+$radius-full: 999px; // 胶囊标签/圆形
+
+$spacing-xs: 4px;
+$spacing-sm: 8px;
+$spacing-md: 12px;
+$spacing-lg: 16px;
+$spacing-xl: 20px;
+$spacing-2xl: 24px;
+
+$page-padding: 20px; // 页面左右内边距
+$card-padding: 16px; // 卡片内边距
+$card-padding-lg: 20px; // 大卡片内边距
+$section-gap: 16px; // 区块间距
+$item-gap: 8px; // 列表项间距
+```
+
+### 2.4 阴影
+
+```scss
+$shadow-card: 0 2px 12px rgba(45,42,38,0.06); // 普通卡片
+$shadow-card-sm: 0 1px 4px rgba(45,42,38,0.04); // 轻量卡片
+$shadow-button: 0 4px 16px rgba(196,98,58,0.3); // 主按钮
+$shadow-tab-active: 0 2px 8px rgba(196,98,58,0.25); // 选中Tab
+```
+
+## 3. 全局组件库(必须先建立)
+
+> **铁律:以下组件必须先在 `src/components/ui/` 和 `src/components/patterns/` 中建好,
+> 然后所有页面只引用组件,不允许在页面文件中硬编码样式。**
+
+### 3.1 基础 UI 组件
+
+#### `NavBar` — 子页面导航栏
+```
+高度: 44px
+左侧: 返回箭头(‹ 字符或图标),color: $color-primary
+中央: 页面标题,font: serif 18px bold,color: $color-text
+右侧: 可选操作按钮
+底部: 1px solid $color-border-light
+```
+**原型参考**: 所有 mp-02~12 文件的导航栏
+
+#### `PageHeader` — TabBar 页面标题
+```
+font: serif 26px/700
+color: $color-text
+margin-bottom: 20px
+padding: 20px 20px 0
+```
+**原型参考**: mp-redesign-home.html 的"上午好,张三"/"健康数据"/"消息"/页面标题
+
+#### `ContentCard` — 内容卡片容器
+```
+background: $color-card
+border-radius: $radius-lg
+padding: $card-padding-lg
+box-shadow: $shadow-card
+```
+**原型参考**: 所有文件中的白色圆角卡片
+
+#### `StatusTag` — 状态标签
+```
+fontSize: 11px
+padding: 2px 8px
+borderRadius: $radius-full
+fontWeight: 500
+
+变体:
+- success: bg=$color-success-light, color=$color-success
+- warning: bg=$color-warning-light, color=$color-warning
+- danger: bg=$color-danger-light, color=$color-danger
+- neutral: bg=$color-surface, color=$color-text-tertiary
+- primary: bg=$color-primary-light, color=$color-primary
+```
+**原型参考**: 所有文件中的"正常"/"偏高"/"待就诊"/"已完成"等标签
+
+#### `SectionTitle` — 区块标题
+```
+font: serif 18px/700
+color: $color-text
+margin-bottom: 12px
+```
+**原型参考**: mp-redesign-home.html 的"今日体征"/"近 7 天趋势"
+
+#### `FormInput` — 表单输入框
+```
+height: 56px (血压等大号) 或 48px (普通)
+background: $color-card
+border: 1.5px solid $color-border
+border-radius: $radius-lg
+padding: 0 16px
+font-size: 16px
+
+focus 状态:
+border-color: $color-primary
+
+label:
+font-size: 13px, color: $color-text-tertiary, margin-bottom: 6px
+```
+**原型参考**: mp-01-login.html 的手机号/验证码输入, mp-03-appointment.html 的表单
+
+#### `PrimaryButton` — 主操作按钮
+```
+height: 54px (登录) 或 52px (普通)
+border-radius: 14px
+background: $color-primary
+color: #fff
+font-size: 18px (登录) 或 17px (普通)
+font-weight: 600
+box-shadow: $shadow-button
+
+医生端变体:
+background: $color-doctor-primary
+```
+**原型参考**: 所有文件的底部主按钮
+
+#### `SecondaryButton` — 次操作按钮
+```
+同 PrimaryButton 尺寸
+background: transparent
+border: 2px solid $color-primary
+color: $color-primary
+```
+**原型参考**: mp-redesign-home.html 的"预约挂号"按钮
+
+### 3.2 复合组件
+
+#### `TabFilter` — 筛选/切换标签
+```
+两种样式:
+
+样式A (填充型 - 如体征类型切换):
+- 选中: bg=$color-primary, color=#fff, box-shadow=$shadow-tab-active
+- 未选: bg=$color-surface, color=$color-text-secondary
+- 高度: 44px, borderRadius: $radius-md
+
+样式B (pill型 - 如文章分类):
+- 选中: bg=$color-primary, color=#fff
+- 未选: bg=$color-surface, color=$color-text-secondary
+- 高度: 32px, borderRadius: $radius-full, padding: 0 16px
+
+样式C (段控型 - 如消息页咨询/通知):
+- 外框: bg=$color-surface, borderRadius: $radius-sm, padding: 3px
+- 选中: bg=$color-card, box-shadow
+- 未选: transparent
+- 高度: 40px
+```
+**原型参考**: mp-redesign-home.html HealthA 的体征Tab, MessagesA 的咨询/通知
+
+#### `ListItem` — 列表项
+```
+background: $color-card
+border-radius: $radius-lg
+padding: 16px
+box-shadow: $shadow-card-sm
+margin-bottom: $item-gap
+
+布局: 左侧头像/图标 + 中间内容(flex:1) + 右侧状态/箭头
+分隔线(多个item在一张卡片内时):
+border-bottom: 1px solid $color-border-light, 最后一项无
+
+未读态: opacity 1
+已读态: opacity 0.7
+```
+**原型参考**: mp-02-consultation.html, mp-07-profile-health.html 的列表项
+
+#### `InfoRow` — 信息行(左标签右值)
+```
+display: flex, justify-content: space-between, align-items: center
+padding: 12px 0
+border-bottom: 1px solid $color-border-light (最后一项无)
+
+标签: font-size: 14px, color: $color-text-secondary
+值: font-size: 15px, color: $color-text
+```
+**原型参考**: mp-03-appointment.html 详情页, mp-12-doctor-clinical.html 处方详情
+
+#### `ProgressRing` — 环形进度
+```
+尺寸: 64px (小号) / 80px (大号)
+SVG: 两个 circle, 底层 $color-border, 上层 $color-primary
+lineWidth: 4px
+中心: 数字/文字, font: serif bold, color: $color-primary
+```
+**原型参考**: mp-redesign-home.html 首页"今日已记录 3/4"
+
+#### `AlertCard` — 提醒/提示卡片
+```
+三种样式:
+
+样式A (渐变型 - 智能提醒):
+background: linear-gradient(135deg, $color-primary, $color-primary-dark)
+color: #fff, borderRadius: $radius-lg
+
+样式B (左边框型 - AI建议/提示):
+background: $color-success-light
+borderLeft: 4px solid $color-success
+
+样式C (全边框型 - 温馨提示):
+background: $color-warning-light
+borderRadius: $radius-md
+```
+**原型参考**: mp-redesign-home.html 首页智能提醒, HealthA 的AI建议, mp-03-appointment.html 温馨提示
+
+#### `ChatBubble` — 聊天气泡
+```
+医生/对方消息:
+- background: $color-card
+- border-radius: $radius-lg (左上 $radius-sm)
+- 左对齐, maxWidth: 75%
+
+我的消息:
+- background: $color-primary-light
+- border-radius: $radius-lg (右上 $radius-sm)
+- 右对齐, maxWidth: 75%
+```
+**原型参考**: mp-02-consultation.html, mp-10-mall-pkg.html 咨询详情
+
+#### `VitalCard` — 体征数据卡片(2x2网格用)
+```
+background: $color-card
+border-radius: $radius-lg
+padding: 14px 16px
+
+布局:
+- 标签名: 13px, $color-text-secondary
+- 数值: serif 30px/700, $color-text
+- 单位: 12px, $color-text-tertiary
+- 状态标签: StatusTag
+```
+**原型参考**: mp-redesign-home.html 首页体征2x2网格
+
+#### `GradientHeader` — 渐变头部卡片
+```
+background: linear-gradient(135deg, $color-primary 0%, $color-primary-dark 100%)
+border-radius: $radius-lg
+padding: 18px
+color: #fff
+```
+**原型参考**: mp-05-mall.html 积分卡, mp-redesign-home.html 首页智能提醒
+
+### 3.3 页面骨架组件
+
+#### `PageShell` — 页面外壳(已存在,需更新样式)
+```
+使用 Token 变量更新现有 PageShell 的背景色、内边距等
+```
+
+#### `SubPageLayout` — 子页面布局
+```
+NavBar (固定顶部)
+内容区 (scroll-view, padding: $page-padding)
+可选底部操作栏 (fixed bottom)
+```
+
+## 4. 实施步骤(严格按顺序执行)
+
+### Phase 0: 建立 SCSS 变量文件(30分钟)
+
+1. 创建 `src/styles/_tokens.scss`,写入 §2 中的所有设计 Token
+2. 创建 `src/styles/_mixins.scss`,封装常用样式组合:
+ ```scss
+ @mixin card { background: $color-card; border-radius: $radius-lg; box-shadow: $shadow-card; }
+ @mixin page-padding { padding: $page-padding; }
+ @mixin nav-bar { height: 44px; display: flex; align-items: center; justify-content: center; border-bottom: 1px solid $color-border-light; }
+ ```
+3. 在 `app.scss` 中 import tokens 和 mixins
+
+### Phase 1: 更新/创建全局组件(2-3小时)
+
+按以下顺序逐一实现 §3 中的组件,**每个组件写完后立即替换 2-3 个引用页面验证效果**:
+
+1. `NavBar` → 替换所有子页面的导航栏
+2. `StatusTag` → 替换所有状态标签
+3. `ContentCard` → 替换所有卡片容器
+4. `FormInput` → 替换所有表单输入
+5. `PrimaryButton` / `SecondaryButton` → 替换所有按钮
+6. `TabFilter` → 替换所有筛选标签
+7. `ListItem` → 替换所有列表项
+8. `InfoRow` → 替换所有信息行
+9. `SectionTitle` / `PageHeader` → 替换所有标题
+10. `ProgressRing` → 替换进度环
+11. `AlertCard` → 替换提示卡片
+12. `ChatBubble` → 替换聊天气泡
+13. `VitalCard` → 替换体征卡片
+14. `GradientHeader` → 替换渐变头部
+
+### Phase 2: 逐页替换样式(每个页面 15-30 分钟)
+
+按页面重要性排序,逐页将硬编码样式替换为组件引用:
+
+**第一批 — 主 TabBar 页面(已有组件基础):**
+1. `pages/index/index` → 参照 mp-redesign-home.html HomeA
+2. `pages/health/index` → 参照 mp-redesign-home.html HealthA
+3. `pages/messages/index` → 参照 mp-redesign-home.html MessagesA
+4. `pages/profile/index` → 参照 mp-redesign-home.html ProfileA
+
+**第二批 — 高频功能页面:**
+5. `pages/login/index` → 参照 mp-01-login.html
+6. `pages/consultation/index` → 参照 mp-02-consultation.html
+7. `pages/appointment/index` → 参照 mp-03-appointment.html 列表
+8. `pages/appointment/create/index` → 参照 mp-03-appointment.html 创建
+9. `pages/appointment/detail/index` → 参照 mp-03-appointment.html 详情
+
+**第三批 — 内容页面:**
+10. `pages/article/index` + `detail` → 参照 mp-04-article-report.html
+11. `pages/ai-report/list` + `detail` → 参照 mp-04-article-report.html
+12. `pages/mall/index` → 参照 mp-05-mall.html
+
+**第四批 — 健康分包:**
+13-17. `pages/pkg-health/*` (5个) → 参照 mp-06-health-pkg.html
+
+**第五批 — 个人中心分包:**
+18-33. `pages/pkg-profile/*` (16个) → 参照 mp-07/08/09
+
+**第六批 — 商城/咨询分包:**
+34-37. `pages/pkg-mall/*` + `pages/pkg-consultation/detail` → 参照 mp-10-mall-pkg.html
+
+**第七批 — 医生端:**
+38-47. `pages/pkg-doctor-core/*` + `pages/pkg-doctor-clinical/*` → 参照 mp-11/12
+
+### Phase 3: 全局验证(1小时)
+
+1. **一致性检查**: 打开所有页面截图对比原型,确认风格统一
+2. **长者模式**: 所有 58 个页面的关怀模式适配(字号 ≥ 22px)
+3. **暗色/亮色**: Token 通过 CSS 变量支持主题切换
+4. **交叉页面导航**: 确保页面间跳转无样式断裂
+
+## 5. 医生端 vs 患者端
+
+医生端页面(pkg-doctor-core / pkg-doctor-clinical)使用不同的主色:
+
+```scss
+// 在医生端页面入口设置 CSS 变量覆盖
+--color-primary: #3A6B8C; // 替代 #C4623A
+--color-primary-light: #D4E5F0; // 替代 #F0DDD4
+--color-primary-dark: #2A4F6A; // 替代 #8B3E1F
+```
+
+这样所有引用 Token 的组件在医生端自动变色,**无需为医生端写单独的组件**。
+
+## 6. 关键约束
+
+1. **不允许在页面文件中硬编码颜色值** — 全部通过 Token 变量引用
+2. **不允许跳过组件直接写样式** — 先建组件再引用
+3. **每个组件必须支持 CSS 变量覆盖** — 医生端/关怀模式/主题切换都靠这个
+4. **先更新 3-5 个页面验证组件可用** — 再批量替换剩余页面
+5. **58 个页面中 66 个已迁移到统一组件库** — 在现有基础上更新 Token 和组件样式即可
+
+## 7. 访客端(Guest Mode)
+
+> **原型参考**: `mp-00-visitor.html`(5 个屏幕)
+
+访客端是用户未登录时看到的界面,核心目标是**引导转化登录**。与已登录页面有以下差异:
+
+### 7.1 访客首页 vs 登录首页对比
+
+| 维度 | 访客首页 | 登录首页 |
+|------|---------|---------|
+| 顶部 | 全屏 Swiper 轮播(品牌形象/智慧健康/温馨环境) | 智能提醒卡片 + 体征概览 |
+| 内容 | 健康文章推荐(公开数据)+ 平台功能介绍卡片 | 今日体征网格 + 趋势图 + 快捷入口 |
+| 底部 | 无快捷入口,有"登录享更多"CTA | 预约挂号/查看报告等快捷入口 |
+| TabBar | 首页/健康(灰化)/消息(灰化)/我的 | 首页/健康/消息/我的(全部可用)|
+
+### 7.2 访客专属组件
+
+#### `BannerSwiper` — 轮播图组件
+```
+高度: 180px
+borderRadius: $radius-lg
+indicatorDots: 底部居中,活跃色 $color-primary
+autoplay: true, interval: 4000ms
+
+轮播项(3个渐变背景 slides):
+- 品牌形象: linear-gradient(135deg, #C4623A, #8B3E1F),大标题+副标题
+- 智慧健康: linear-gradient(135deg, #3A6B8C, #2A4F6A),数据卡片展示
+- 温馨就医: linear-gradient(135deg, #5B7A5E, #3D5A40),场景描述
+
+数据来源: /api/v1/public/banners(公开端点,无需认证)
+```
+**原型参考**: mp-00-visitor.html 前 3 个 Swiper slides
+
+#### `FeatureCard` — 功能介绍卡片
+```
+background: $color-card
+borderRadius: $radius-lg
+padding: 20px
+box-shadow: $shadow-card
+textAlign: center
+
+布局: 图标(40px圆形背景) + 标题(16px bold) + 描述(13px tertiary)
+```
+**原型参考**: mp-00-visitor.html 访客首页底部 3 个功能卡片
+
+#### `LoginCTA` — 登录引导按钮
+```
+background: $color-primary
+color: #fff
+borderRadius: $radius-full
+padding: 14px 32px
+fontSize: 16px
+fontWeight: 600
+boxShadow: $shadow-button
+textAlign: center
+
+文字: "登录享更多健康服务"
+点击: navigateTo login 页面
+```
+**原型参考**: mp-00-visitor.html 访客首页底部 + 访客"我的"页
+
+### 7.3 访客"我的"页
+
+访客态的个人中心与登录态完全不同:
+
+```
+头像区域:
+- 未登录: 显示 "?" 圆形图标(bg: $color-surface, color: $color-text-tertiary)
+- 登录后: 真实头像
+
+登录提示卡:
+- 标题: "登录后即可查看"
+- 副标题: "健康数据、预约记录、咨询消息等"
+- 按钮: "立即登录" (PrimaryButton)
+
+菜单列表:
+- 仅显示公开菜单(关于我们/隐私政策/使用条款)
+- 隐藏所有需认证菜单(健康记录/家庭管理/设备绑定等)
+```
+**原型参考**: mp-00-visitor.html 最后一个屏幕
+
+### 7.4 访客端实施要点
+
+1. **`isGuest` 状态判断**: 在 `GuestHome` 页面中通过 `useAuth()` 检查登录态,未登录渲染访客布局
+2. **轮播图数据**: 调用 `/api/v1/public/banners` 公开端点获取轮播图数据
+3. **灰化 Tab**: 健康页/消息页在访客态显示"请先登录"提示 + 登录按钮
+4. **登录转化**: 所有交互触发点(查看详情/预约/咨询)统一拦截跳转登录页
+5. **组件复用**: BannerSwiper 组件同时用于访客首页和登录首页,通过 props 控制样式差异
+6. **TabBar 页面路由**: 访客态和登录态共享同一路由,通过 `isGuest` 条件渲染不同内容
+
+### 7.5 访客端实施优先级
+
+排在 Phase 2 第一批(主 TabBar 页面)之后、第二批之前:
+
+```
+Phase 1.5 — 访客端:
+1. 创建 BannerSwiper 组件 → src/components/ui/BannerSwiper/
+2. 创建 FeatureCard 组件 → src/components/ui/FeatureCard/
+3. 创建 LoginCTA 组件 → src/components/ui/LoginCTA/
+4. 更新 GuestHome 页面 → 参照 mp-00-visitor.html 访客首页
+5. 更新 Profile 页 isGuest 分支 → 参照 mp-00-visitor.html 访客"我的"
+```
diff --git a/docs/design/mp-00-visitor.html b/docs/design/mp-00-visitor.html
new file mode 100644
index 0000000..ba19b1a
--- /dev/null
+++ b/docs/design/mp-00-visitor.html
@@ -0,0 +1,321 @@
+
+
+
+
+
+HMS 小程序 — 访客端
+
+
+
+
+
+
+
+HMS 小程序 · 访客端
+访客端设计:未登录用户看到的是品牌展示+功能引导+登录转化。首页轮播+资讯+功能卡片,"我的"页面显示登录引导。
+
+
+
+
+
diff --git a/docs/design/mp-01-login.html b/docs/design/mp-01-login.html
new file mode 100644
index 0000000..06920b1
--- /dev/null
+++ b/docs/design/mp-01-login.html
@@ -0,0 +1,217 @@
+
+
+
+
+
+HMS 小程序 — 登录页
+
+
+
+
+
+
+
+HMS 小程序 · 登录页
+温润东方风设计系统 — 登录是用户体验的起点,简洁、温暖、无压力。手机号+验证码+微信一键登录三种方式。
+
+
+
+
+
diff --git a/docs/design/mp-02-consultation.html b/docs/design/mp-02-consultation.html
new file mode 100644
index 0000000..34221dc
--- /dev/null
+++ b/docs/design/mp-02-consultation.html
@@ -0,0 +1,329 @@
+
+
+
+
+
+HMS 小程序 — 在线咨询
+
+
+
+
+
+
+
+HMS 小程序 · 在线咨询
+温润东方风设计系统 — 咨询列表页 + 咨询详情(聊天)页。左侧为咨询列表,右侧为与王医生的聊天详情。
+
+
+
+
+
+
+
diff --git a/docs/design/mp-03-ai-customer-service.html b/docs/design/mp-03-ai-customer-service.html
new file mode 100644
index 0000000..a48c5bf
--- /dev/null
+++ b/docs/design/mp-03-ai-customer-service.html
@@ -0,0 +1,398 @@
+
+
+
+
+
+HMS 小程序 — AI 客服咨询
+
+
+
+
+
+
+
+HMS 小程序 · AI 客服咨询
+
+ 温润东方风设计系统 — 消息 Tab 改为 AI 客服单窗口(无列表),通知迁移至「我的」页面。
+ 左:欢迎状态(首次进入)· 中:对话进行中 · 右:个人中心通知入口
+
+
+
+
+
+
diff --git a/docs/design/mp-03-appointment.html b/docs/design/mp-03-appointment.html
new file mode 100644
index 0000000..447feef
--- /dev/null
+++ b/docs/design/mp-03-appointment.html
@@ -0,0 +1,462 @@
+
+
+
+
+
+HMS 小程序 — 预约挂号
+
+
+
+
+
+
+
+HMS 小程序 · 预约挂号
+预约列表 + 预约创建 + 预约详情 — 温润东方风设计系统,三屏并排展示完整挂号流程
+
+
+
+
+
diff --git a/docs/design/mp-04-article-report.html b/docs/design/mp-04-article-report.html
new file mode 100644
index 0000000..1942efc
--- /dev/null
+++ b/docs/design/mp-04-article-report.html
@@ -0,0 +1,430 @@
+
+
+
+
+
+HMS 小程序 — 文章与AI报告
+
+
+
+
+
+
+
+HMS 小程序 · 文章与 AI 报告
+温润东方风设计系统 — 文章列表/详情 + AI 报告列表/详情,四屏并排展示。内容为王,阅读体验优先。
+
+
+
+
+
diff --git a/docs/design/mp-05-mall.html b/docs/design/mp-05-mall.html
new file mode 100644
index 0000000..48b1d57
--- /dev/null
+++ b/docs/design/mp-05-mall.html
@@ -0,0 +1,328 @@
+
+
+
+
+
+HMS 小程序 — 积分商城
+
+
+
+
+
+
+
+HMS 小程序 · 积分商城
+温润东方风设计系统 — 积分商城主页。从"我的"页面进入的子页面,展示积分余额、快捷操作、分类筛选和商品兑换网格。
+
+
+
+
+
diff --git a/docs/design/mp-06-health-pkg.html b/docs/design/mp-06-health-pkg.html
new file mode 100644
index 0000000..9aca4a9
--- /dev/null
+++ b/docs/design/mp-06-health-pkg.html
@@ -0,0 +1,664 @@
+
+
+
+
+
+HMS 小程序 — 健康分包
+
+
+
+
+
+
+
+HMS 小程序 · 健康分包
+告警列表 + 日常监测 + 设备同步 + 体征录入 + 趋势分析 — 五屏并排展示健康分包核心功能
+
+
+
+
+
diff --git a/docs/design/mp-07-profile-health.html b/docs/design/mp-07-profile-health.html
new file mode 100644
index 0000000..a6c8803
--- /dev/null
+++ b/docs/design/mp-07-profile-health.html
@@ -0,0 +1,440 @@
+
+
+
+
+
+HMS 小程序 — 健康记录
+
+
+
+
+
+
+
+HMS 小程序 · 健康记录
+温润东方风设计系统 — 个人中心健康记录模块。5 个屏幕:健康记录列表、诊断记录、用药记录、检查报告列表、报告详情。
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/design/mp-08-profile-dialysis.html b/docs/design/mp-08-profile-dialysis.html
new file mode 100644
index 0000000..4bb9f34
--- /dev/null
+++ b/docs/design/mp-08-profile-dialysis.html
@@ -0,0 +1,313 @@
+
+
+
+
+
+HMS 小程序 — 透析管理 + 随访管理
+
+
+
+
+
+
+
+HMS 小程序 · 透析管理 + 随访管理
+温润东方风设计系统 — 个人中心透析与随访模块。4 个屏幕:透析记录列表、透析详情、随访列表、随访详情。
+
+
+
+
+
diff --git a/docs/design/mp-09-profile-other.html b/docs/design/mp-09-profile-other.html
new file mode 100644
index 0000000..a0c6ba8
--- /dev/null
+++ b/docs/design/mp-09-profile-other.html
@@ -0,0 +1,481 @@
+
+
+
+
+
+HMS 小程序 — 个人中心其他
+
+
+
+
+
+
+
+HMS 小程序 · 个人中心其他页面
+温润东方风设计系统 — 个人中心子页面原型。6 个屏幕:家庭管理 / 添加家庭成员 / 知情同意 / 事件记录 / 长者模式 / 设置。
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/design/mp-10-mall-pkg.html b/docs/design/mp-10-mall-pkg.html
new file mode 100644
index 0000000..1dd5c89
--- /dev/null
+++ b/docs/design/mp-10-mall-pkg.html
@@ -0,0 +1,211 @@
+
+
+
+
+
+HMS 小程序 — 积分商城分包
+
+
+
+
+
+
+HMS 小程序 · 积分商城分包
+商品详情 + 兑换确认 + 订单列表 + 咨询聊天详情
+
+
+
+
\ No newline at end of file
diff --git a/docs/design/mp-10-screenshot.png b/docs/design/mp-10-screenshot.png
new file mode 100644
index 0000000..c0ef82f
Binary files /dev/null and b/docs/design/mp-10-screenshot.png differ
diff --git a/docs/design/mp-10-screenshot2.png b/docs/design/mp-10-screenshot2.png
new file mode 100644
index 0000000..09f5ff2
Binary files /dev/null and b/docs/design/mp-10-screenshot2.png differ
diff --git a/docs/design/mp-11-bottom.png b/docs/design/mp-11-bottom.png
new file mode 100644
index 0000000..88dfc58
Binary files /dev/null and b/docs/design/mp-11-bottom.png differ
diff --git a/docs/design/mp-11-doctor-core-preview.png b/docs/design/mp-11-doctor-core-preview.png
new file mode 100644
index 0000000..e36026c
Binary files /dev/null and b/docs/design/mp-11-doctor-core-preview.png differ
diff --git a/docs/design/mp-11-doctor-core-screenshot.png b/docs/design/mp-11-doctor-core-screenshot.png
new file mode 100644
index 0000000..6cd3989
Binary files /dev/null and b/docs/design/mp-11-doctor-core-screenshot.png differ
diff --git a/docs/design/mp-11-doctor-core.html b/docs/design/mp-11-doctor-core.html
new file mode 100644
index 0000000..e429e4c
--- /dev/null
+++ b/docs/design/mp-11-doctor-core.html
@@ -0,0 +1,481 @@
+
+
+
+
+
+HMS 小程序 — 医生端
+
+
+
+
+
+
+
+HMS 小程序 · 医生端核心页面
+温润东方风设计系统 — 医生端变体,深靛蓝主色替代暖橙。5 个屏幕:医生工作台、待办收件箱、在线咨询、随访管理、患者管理。专业而温暖的医疗工作界面。
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/design/mp-11-top.png b/docs/design/mp-11-top.png
new file mode 100644
index 0000000..1b24800
Binary files /dev/null and b/docs/design/mp-11-top.png differ
diff --git a/docs/design/mp-12-doctor-clinical.html b/docs/design/mp-12-doctor-clinical.html
new file mode 100644
index 0000000..c1e2791
--- /dev/null
+++ b/docs/design/mp-12-doctor-clinical.html
@@ -0,0 +1,646 @@
+
+
+
+
+
+HMS 小程序 — 医生端临床
+
+
+
+
+
+
+
+HMS 小程序 · 医生端临床
+医生端深靛蓝设计系统 — 临床管理模块。6 个屏幕:告警列表、告警详情、透析列表、透析创建、处方列表、处方详情。
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/prototypes/mp/01-tabs/health.html b/docs/prototypes/mp/01-tabs/health.html
new file mode 100644
index 0000000..aed38b6
--- /dev/null
+++ b/docs/prototypes/mp/01-tabs/health.html
@@ -0,0 +1,206 @@
+
+
+
+
+
+ 健康 - HMS 健康管理
+
+
+
+
+
+
+
+
+
+
+
+ 健康
+
+
+
+
+
+
+
+
+
+
+
+
张伟, 上午好!
+
今日健康评分 85分
+
+
😊
+
+
+
+
+
+
+
+
+
+
+
+
+
+
💊
+
+
用药提醒
+
降压药 每日一次 · 08:00
+
+
+ 待服用
+
+
+
+
📋
+
+
复查提醒
+
血常规检查 · 2026-05-20
+
+
+ 即将到期
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/01-tabs/home.html b/docs/prototypes/mp/01-tabs/home.html
new file mode 100644
index 0000000..583517c
--- /dev/null
+++ b/docs/prototypes/mp/01-tabs/home.html
@@ -0,0 +1,173 @@
+
+
+
+
+
+ 首页 - HMS 健康管理
+
+
+
+
+
+
+
+
+
+
+
+ 首页
+
+
+
+
+
+
+
+
+
+
+
关注您的健康每一天
+
全面健康管理,从今天开始
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
2026-05-18 周一 09:30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/01-tabs/messages.html b/docs/prototypes/mp/01-tabs/messages.html
new file mode 100644
index 0000000..feb3e13
--- /dev/null
+++ b/docs/prototypes/mp/01-tabs/messages.html
@@ -0,0 +1,149 @@
+
+
+
+
+
+ 消息 - HMS 健康管理
+
+
+
+
+
+
+
+
+
+
+
+ 消息
+
+
+
+
+
+
+
+
+
+
+
全部
+
系统通知
+
预约提醒
+
健康提醒
+
咨询回复
+
+
+
+
+
+
+
+
+
+
📋
+
+
预约确认通知
+
您的预约已确认,请按时就诊
+
+
+ 已确认
+ 2分钟前
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/01-tabs/profile.html b/docs/prototypes/mp/01-tabs/profile.html
new file mode 100644
index 0000000..edcecc2
--- /dev/null
+++ b/docs/prototypes/mp/01-tabs/profile.html
@@ -0,0 +1,194 @@
+
+
+
+
+
+ 我的 - HMS 健康管理
+
+
+
+
+
+
+
+
+
+
+
+ 我的
+
+
+
+
+
+
+
+
+
+
张
+
张伟
+
138****6789
+
+ 已认证
+ VIP会员
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/02-main/appointment-create.html b/docs/prototypes/mp/02-main/appointment-create.html
new file mode 100644
index 0000000..99d7874
--- /dev/null
+++ b/docs/prototypes/mp/02-main/appointment-create.html
@@ -0,0 +1,104 @@
+
+
+
+
+
+ 创建预约 - 健康管理
+
+
+
+
+
+ 创建预约 · appointment-create
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 请携带医保卡和既往病历,提前15分钟到达候诊区。首次就诊需在前台完成建档登记,建议提前通过线上完善个人健康档案信息,以便就诊时医生快速了解您的健康状况。
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/02-main/appointment-detail.html b/docs/prototypes/mp/02-main/appointment-detail.html
new file mode 100644
index 0000000..7bcc199
--- /dev/null
+++ b/docs/prototypes/mp/02-main/appointment-detail.html
@@ -0,0 +1,87 @@
+
+
+
+
+
+ 预约详情 - 健康管理
+
+
+
+
+
+ 预约详情 · appointment-detail
+
+
+
+
+
+
+
+
+
已确认
+
预约编号: APT20260518001
+
+
+
+
+
+
李
+
+
李四 副主任医师
+
心内科 · 第一人民医院
+
⭐ 4.8 · 接诊 856 次
+
+
+
+
+
+
+
+ 就诊日期
+ 2026年5月18日 周一
+
+
+ 就诊时间
+ 09:30 - 10:00
+
+
+ 就诊地点
+ 门诊楼3层301室
+
+
+ 挂号类型
+ 专家号
+
+
+ 挂号费用
+ ¥50.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/02-main/appointment.html b/docs/prototypes/mp/02-main/appointment.html
new file mode 100644
index 0000000..e2cea4c
--- /dev/null
+++ b/docs/prototypes/mp/02-main/appointment.html
@@ -0,0 +1,145 @@
+
+
+
+
+
+ 预约列表 - 健康管理
+
+
+
+
+
+ 预约列表 · appointment
+
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
+ 全部
+ 待确认
+ 已确认
+ 已完成
+ 已取消
+
+
+
+
+
+
+
+
+
+ 日期时间
+ 2026-05-18 周一 09:30
+
+
+ 就诊地点
+ 门诊楼3层301室
+
+
+ 挂号类型
+ 专家号
+
+
+
+
+
+
+
+
+
+
+ 日期时间
+ 2026-05-20 周三 14:00
+
+
+ 就诊地点
+ 门诊楼5层502室
+
+
+ 挂号类型
+ 专家号
+
+
+
+
+
+
+
+
+
+
+ 日期时间
+ 2026-05-15 周四 10:30
+
+
+ 就诊地点
+ 门诊楼2层205室
+
+
+ 挂号类型
+ 普通号
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/02-main/consultation.html b/docs/prototypes/mp/02-main/consultation.html
new file mode 100644
index 0000000..18c1b4c
--- /dev/null
+++ b/docs/prototypes/mp/02-main/consultation.html
@@ -0,0 +1,129 @@
+
+
+
+
+
+ 在线咨询 - 健康管理
+
+
+
+
+
+ 在线咨询 · consultation
+
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
+ 全部
+ 内科
+ 外科
+ 心内科
+ 肾内科
+
+
+
+
+
+
+
+
+
张
+
+
+ 张三
+ 主任医师
+
+
心内科 · 第一人民医院
+
+
+
⭐ 4.9 · 接诊 1,286 次
+
+
+ 图文咨询 ¥30/次
+ 视频咨询 ¥50/次
+
+
+
+
+
+
+
+
+
+
+
李
+
+
+ 李明
+ 副主任医师
+
+
肾内科 · 第一人民医院
+
+
+
⭐ 4.8 · 接诊 936 次
+
+
+ 图文咨询 ¥25/次
+ 视频咨询 ¥45/次
+
+
+
+
+
+
+
+
+
+
+
王
+
+
+ 王芳
+ 主治医师
+
+
内分泌科 · 第一人民医院
+
+
+
⭐ 4.7 · 接诊 758 次
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/02-main/login.html b/docs/prototypes/mp/02-main/login.html
new file mode 100644
index 0000000..7b7e09c
--- /dev/null
+++ b/docs/prototypes/mp/02-main/login.html
@@ -0,0 +1,79 @@
+
+
+
+
+
+ 登录 - 健康管理
+
+
+
+
+
+ 登录页 · login
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/02-main/mall.html b/docs/prototypes/mp/02-main/mall.html
new file mode 100644
index 0000000..b29a4ed
--- /dev/null
+++ b/docs/prototypes/mp/02-main/mall.html
@@ -0,0 +1,137 @@
+
+
+
+
+
+ 积分商城 - 健康管理
+
+
+
+
+
+ 积分商城 · mall
+
+
+
+
+
+
+
+
+
可用积分
+
2,580
+
兑换好礼,健康常伴
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🪡
+
+
+ -1,200积分
+ 兑换成功
+
+
+
+
+
🏥
+
+
+ -2,000积分
+ 兑换成功
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/02-main/privacy-policy.html b/docs/prototypes/mp/02-main/privacy-policy.html
new file mode 100644
index 0000000..4c03452
--- /dev/null
+++ b/docs/prototypes/mp/02-main/privacy-policy.html
@@ -0,0 +1,112 @@
+
+
+
+
+
+ 隐私政策 - 健康管理
+
+
+
+
+
+ 隐私政策 · privacy-policy
+
+
+
+
+
+
+
健康管理平台隐私政策
+
更新日期:2026年1月1日
+
+
+
+
一、我们收集的信息
+
+ 为向您提供健康管理服务,我们会收集以下类型的信息:您注册时提供的身份信息(姓名、手机号码、身份证号)、基本健康信息(年龄、性别、身高、体重)以及您通过平台录入的健康数据(血压、血糖、心率、体检报告、用药记录等)。
+
+
+ 在您使用预约挂号、在线咨询、随访管理等服务时,我们会收集您的就诊记录、咨询内容、医生诊断信息等相关医疗健康数据。这些信息的收集对于提供准确的医疗服务是必要的。
+
+
+ 我们还会自动收集设备信息(设备型号、操作系统版本)、日志信息(访问时间、页面浏览记录)和位置信息(用于推荐就近医疗机构)。以上信息的收集均经过您的授权同意,您可以在系统设置中随时关闭相关权限。
+
+
+
+
+
+
二、信息的使用
+
+ 我们收集的信息将用于:为您提供健康管理服务(健康数据记录与追踪、趋势分析、异常提醒)、预约挂号与在线咨询服务、个性化健康建议推送、随访管理和复诊提醒等核心医疗健康服务功能。
+
+
+ 在您授权同意的前提下,我们还可能将您的信息用于:改善服务体验和产品质量、开发新的健康管理功能、进行与健康相关的科学研究(所有研究数据均经过脱敏处理,不会识别到特定个人)。
+
+
+ 我们承诺不会将您的个人健康信息用于向您推送商业广告,不会将您的数据出售给任何第三方。所有数据使用均严格限定在本政策声明的范围内,超出范围的使用将再次征得您的明确同意。
+
+
+
+
+
+
三、信息的共享
+
+ 除以下情形外,我们不会与任何第三方共享您的个人信息:经您事先同意的共享、为提供您要求的服务而必需的共享(如与预约医院、咨询医生共享您的挂号和健康档案信息)、与关联公司共享(仅限于提供统一健康管理服务的目的)。
+
+
+ 根据法律法规规定或行政、司法机关的强制性要求,我们可能需要共享您的个人信息。在此类情况下,我们将要求接收方对您的信息采取保密措施,并仅用于法律规定的目的。
+
+
+ 我们与第三方服务提供商共享信息时,将签署严格的保密协议和数据保护协议,要求第三方仅可在约定的范围内处理您的信息,并采取不低于本平台标准的安全保护措施。我们将定期评估第三方的数据保护能力。
+
+
+
+
+
+
四、您的权利
+
+ 您对您的个人信息享有知情权、访问权、更正权、删除权、可携带权和撤回同意的权利。您可以通过平台的"个人中心"或"隐私设置"功能,查看、修改、导出或删除您的个人信息和健康数据。
+
+
+ 您有权撤回之前授予我们的信息收集和使用同意。撤回同意不会影响之前基于同意已进行的信息处理活动的合法性。但撤回同意可能导致您无法继续使用部分需要相关个人信息的服务功能。
+
+
+ 如果您认为我们对您的信息处理违反了法律法规或本政策,您有权向相关主管部门进行投诉或举报。您也可以通过平台客服渠道(客服电话: 400-000-0000)与我们取得联系,我们将在15个工作日内予以回复。
+
+
+
+
+
+
五、信息安全
+
+ 我们采用业界领先的技术手段保护您的信息安全,包括但不限于:传输层加密(TLS 1.3)、数据存储加密(AES-256-GCM)、多因素身份验证、访问权限控制和安全审计日志。所有敏感个人健康信息均经过加密存储和传输。
+
+
+ 我们建立了完善的数据安全管理制度,对员工进行定期安全培训,严格限制员工对用户个人信息的访问权限。仅经授权的人员方可访问必要的个人信息,且所有访问行为均有记录并接受审计。
+
+
+ 如不幸发生个人信息安全事件,我们将按照法律法规的要求,及时向您告知安全事件的基本情况、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议以及对您的补救措施。我们将以推送通知、短信或邮件方式通知您。
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/02-main/user-agreement.html b/docs/prototypes/mp/02-main/user-agreement.html
new file mode 100644
index 0000000..9315ff8
--- /dev/null
+++ b/docs/prototypes/mp/02-main/user-agreement.html
@@ -0,0 +1,98 @@
+
+
+
+
+
+ 用户协议 - 健康管理
+
+
+
+
+
+ 用户协议 · user-agreement
+
+
+
+
+
+
+
健康管理平台用户服务协议
+
更新日期:2026年1月1日
+
+
+
+
一、服务条款的确认和接纳
+
+ 本协议是您与健康管理平台(以下简称"本平台")之间关于使用本平台服务所订立的协议。请您仔细阅读本协议,在确认充分理解并同意后再开始使用本平台服务。
+
+
+ 您一旦使用本平台服务,即视为您已阅读并同意本协议的约束。本平台有权在必要时修改本协议内容,修改后的协议一经公布即有效替代原协议。您可以随时在本平台查阅最新版本的服务协议。
+
+
+ 本平台提供的健康信息服务仅供健康管理和参考之用,不能替代专业医疗机构执业医师的诊断和治疗建议。如有身体不适,请及时前往正规医疗机构就诊。
+
+
+
+
+
+
二、用户注册
+
+ 用户注册时需提供真实、准确、完整的个人资料,并保持资料的及时更新。因注册信息不真实、不准确或不完整而引起的问题,由用户自行承担相应责任。本平台将对用户提交的注册信息进行严格保密。
+
+
+ 用户应妥善保管账号和密码,因用户保管不当造成的任何损失由用户自行承担。如发现账号被非法使用或存在安全漏洞,请立即通知本平台。每个用户仅可注册一个账号,禁止转让、售卖或出借账号。
+
+
+ 用户在使用本平台医疗服务时,应提供真实有效的身份信息和健康数据,确保医疗服务的准确性和安全性。虚假信息可能导致误诊或其他健康风险。
+
+
+
+
+
+
三、隐私保护
+
+ 本平台高度重视用户隐私保护,严格遵守《中华人民共和国个人信息保护法》、《中华人民共和国数据安全法》及相关法律法规。我们采取先进的技术手段保护您的个人信息安全,包括但不限于数据加密、访问控制和安全审计。
+
+
+ 我们收集的用户健康信息仅用于提供健康管理服务、改善服务质量及经您同意的其他用途。未经您的明确授权,我们不会向任何第三方披露您的个人健康信息,法律法规另有规定的除外。
+
+
+ 您可以随时查看、修改或删除您的个人信息。如需注销账号,可通过平台设置功能或联系客服办理。注销后我们将依法删除您的个人信息或进行匿名化处理。详细的隐私保护政策请参阅《隐私政策》。
+
+
+
+
+
+
四、免责声明
+
+ 本平台提供的所有健康资讯、数据分析报告、健康建议等内容均基于公开医学文献和通用健康知识,仅供健康管理和日常参考,不构成任何形式的医疗诊断或治疗方案。用户应根据自身情况,在专业医师指导下进行医疗决策。
+
+
+ 因不可抗力、系统故障、网络中断等原因导致服务中断或数据丢失的,本平台不承担赔偿责任,但将尽最大努力减少用户损失。本平台不对第三方链接的内容或服务负责。
+
+
+ 用户因不当使用本平台服务或违反本协议约定而导致的任何直接或间接损失,由用户自行承担全部责任。本平台保留在法律允许范围内对免责条款进行解释的权利。
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/03-pkg-health/alerts.html b/docs/prototypes/mp/03-pkg-health/alerts.html
new file mode 100644
index 0000000..53b2acd
--- /dev/null
+++ b/docs/prototypes/mp/03-pkg-health/alerts.html
@@ -0,0 +1,99 @@
+
+
+
+
+
+ 健康告警 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 血压持续偏高
+ 紧急
+
+
近3天收缩压持续高于140mmHg,建议尽快就医
+
2小时前 · 自动检测
+
+
+
+
+
+ 血糖异常波动
+ 重要
+
+
今日餐后血糖8.9mmol/L,较昨日上升2.1
+
4小时前 · 自动检测
+
+
+
+
+
+ 心率过快提醒
+ 重要
+
+
静息心率95次/分,高于正常范围
+
昨天 · 设备同步
+
+
+
+
+
+ 用药计划调整
+ 一般
+
+
根据最新检查结果,建议调整用药方案
+
3天前 · 医生建议
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/prototypes/mp/03-pkg-health/daily-monitoring.html b/docs/prototypes/mp/03-pkg-health/daily-monitoring.html
new file mode 100644
index 0000000..1a2681f
--- /dev/null
+++ b/docs/prototypes/mp/03-pkg-health/daily-monitoring.html
@@ -0,0 +1,147 @@
+
+
+
+
+
+ 日常监测 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
5/14
+
5/15
+
5/16
+
5/17
+
5/18
+
+
+
+
+
+ 今日完成 3/5 项
+ 60%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
✅
+
+
血压测量
+
125/82 mmHg · 08:30
+
+
+ 正常
+
+
+
+
+
+
✅
+
+
体重记录
+
68.5 kg · 07:15
+
+
+ 已记录
+
+
+
+
+
+
✅
+
+
心率测量
+
72 次/分 · 08:35
+
+
+ 正常
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/prototypes/mp/03-pkg-health/device-sync.html b/docs/prototypes/mp/03-pkg-health/device-sync.html
new file mode 100644
index 0000000..8c03b37
--- /dev/null
+++ b/docs/prototypes/mp/03-pkg-health/device-sync.html
@@ -0,0 +1,152 @@
+
+
+
+
+
+ 设备同步 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
📡
+
+
蓝牙已连接
+
华为智能手表 Band 8
+
+
+
+
+
+ 最后同步
+ 2分钟前
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 步数
+ 6,842 步
+
+
+ 心率
+ 72 次/分
+
+
+ 血氧
+ 98%
+
+
+ 睡眠
+ 7.2 小时
+
+
+ 压力
+
+ 45
+ 较低
+
+
+
+
+
+
+
+
+
+
+
+
+
+
05/16 08:30
+
5项数据已同步
+
+
+ 成功
+
+
+
+
+
+
+
05/15 20:15
+
5项数据已同步
+
+
+ 成功
+
+
+
+
+
+
+
05/14 08:45
+
3项数据已同步
+
+
+ 部分失败
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/prototypes/mp/03-pkg-health/input.html b/docs/prototypes/mp/03-pkg-health/input.html
new file mode 100644
index 0000000..9f339ce
--- /dev/null
+++ b/docs/prototypes/mp/03-pkg-health/input.html
@@ -0,0 +1,138 @@
+
+
+
+
+
+ 体征录入 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
血压
+
血糖
+
心率
+
体重
+
体温
+
+
+
+
+
血压记录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 05/16 08:30
+
+ 125/82 mmHg
+ 正常
+
+
+
+ 05/15 20:15
+
+ 132/88 mmHg
+ 偏高
+
+
+
+ 05/15 07:45
+
+ 120/78 mmHg
+ 正常
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/prototypes/mp/03-pkg-health/trend.html b/docs/prototypes/mp/03-pkg-health/trend.html
new file mode 100644
index 0000000..8ebcc77
--- /dev/null
+++ b/docs/prototypes/mp/03-pkg-health/trend.html
@@ -0,0 +1,150 @@
+
+
+
+
+
+ 趋势分析 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
血压
+
血糖
+
心率
+
体重
+
血氧
+
+
+
+
+
+
+
+
近30天收缩压趋势
+
+
+
+
+
140
+
+
+
+
+
+
+
+
+
+
单位: mmHg
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2026-05-08 14:30
+ 偏高
+
+
收缩压 152 mmHg
+
超出正常范围 (90-140 mmHg)
+
+
+
+
+
+ 2026-04-25 08:15
+ 偏高
+
+
收缩压 148 mmHg
+
超出正常范围 (90-140 mmHg)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/prototypes/mp/04-pkg-doctor-core/action-inbox.html b/docs/prototypes/mp/04-pkg-doctor-core/action-inbox.html
new file mode 100644
index 0000000..11bb6a6
--- /dev/null
+++ b/docs/prototypes/mp/04-pkg-doctor-core/action-inbox.html
@@ -0,0 +1,124 @@
+
+
+
+
+
+ 待办事项 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 📋 报告审核
+ 紧急
+
+
王刚 - 血常规报告
+
+ 今日 10:30
+ ›
+
+
+
+
+
+
+ 📝 方案调整
+ 紧急
+
+
刘洋 - 透析方案
+
+ 今日 09:00
+ ›
+
+
+
+
+
+
+ 📅 随访计划
+ 重要
+
+
陈红 - 制定2周随访计划
+
+ 本周五
+ ›
+
+
+
+
+
+
+ 💊 用药审核
+ 重要
+
+
赵丽 - 新处方审核
+
+ 明日
+ ›
+
+
+
+
+
+
+ 📊 数据分析
+ 一般
+
+
张伟 - 月度趋势分析
+
+ 本周
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/04-pkg-doctor-core/consultation-detail.html b/docs/prototypes/mp/04-pkg-doctor-core/consultation-detail.html
new file mode 100644
index 0000000..171f9ca
--- /dev/null
+++ b/docs/prototypes/mp/04-pkg-doctor-core/consultation-detail.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+ 咨询详情 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
张
+
+ 张伟
+ 55岁 · 高血压2级
+
+
+
+
+
+
+
+
+
+
+
+
+
医生您好,我最近血压有点高,经常头晕。
+
09:30
+
+
+
+
+
您好,请问头晕是什么时候开始的?有测量过血压吗?
+
09:32
+
+
+
+
+
大概一周前开始的,今早测了155/95。
+
09:35
+
+
+
+
+
血压偏高,建议您先调整生活方式:低盐饮食、适当运动。我先给您调整一下用药方案,一周后复查。
+
09:38
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/04-pkg-doctor-core/consultation.html b/docs/prototypes/mp/04-pkg-doctor-core/consultation.html
new file mode 100644
index 0000000..12686dc
--- /dev/null
+++ b/docs/prototypes/mp/04-pkg-doctor-core/consultation.html
@@ -0,0 +1,122 @@
+
+
+
+
+
+ 咨询列表 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
+
+
+
+
+
+
+
+
医生,我最近血压有点高...
+
+ 待回复
+
+
+
+
+
+
+
+
+
+
想问一下报告怎么看
+
+ 进行中
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/04-pkg-doctor-core/followup-detail.html b/docs/prototypes/mp/04-pkg-doctor-core/followup-detail.html
new file mode 100644
index 0000000..505c55f
--- /dev/null
+++ b/docs/prototypes/mp/04-pkg-doctor-core/followup-detail.html
@@ -0,0 +1,121 @@
+
+
+
+
+
+ 随访详情 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 已完成
+ 随访编号: FU20260515001
+
+
+
+
+
+
+
+
+ 随访方式
+ 电话随访
+
+
+ 计划日期
+ 2026-05-15
+
+
+ 完成日期
+ 2026-05-15 14:30
+
+
+ 执行医生
+ 李明 主任医师
+
+
+
+
+
+
+
+
+ 血压
+ 135/85 mmHg
+
+
+ 心率
+ 76 次/分
+
+
+ 体重
+ 72.5 kg
+
+
+ 用药依从性
+ 良好
+
+
+ 不良反应
+ 无
+
+
+
+
+
+
+
+
患者血压控制较前改善,继续当前方案,2周后复查。注意低盐饮食,每日监测血压。
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/04-pkg-doctor-core/followup.html b/docs/prototypes/mp/04-pkg-doctor-core/followup.html
new file mode 100644
index 0000000..bcdbb71
--- /dev/null
+++ b/docs/prototypes/mp/04-pkg-doctor-core/followup.html
@@ -0,0 +1,129 @@
+
+
+
+
+
+ 随访列表 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
+
+
+
+
+
+
+
+ 王刚
+ 待执行
+
+
+ 📞 电话随访
+ 高血压3级
+
+
+ 计划日期: 2026-05-18
+ ›
+
+
+
+
+
+
+ 陈红
+ 进行中
+
+
+ 🏥 门诊随访
+ 2型糖尿病
+
+
+ 计划日期: 2026-05-20
+ ›
+
+
+
+
+
+
+ 张伟
+ 已完成
+
+
+ 📞 电话随访
+ 高血压2级
+
+
+ 计划日期: 2026-05-15
+ ›
+
+
+
+
+
+
+ 赵丽
+ 待执行
+
+
+ 🏠 家庭随访
+ 冠心病
+
+
+ 计划日期: 2026-05-22
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/04-pkg-doctor-core/index.html b/docs/prototypes/mp/04-pkg-doctor-core/index.html
new file mode 100644
index 0000000..d01c29c
--- /dev/null
+++ b/docs/prototypes/mp/04-pkg-doctor-core/index.html
@@ -0,0 +1,174 @@
+
+
+
+
+
+ 医生工作台 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
李
+
+
李明 主任医师
+
心内科 · 第一人民医院
+
今日待诊 8 人 · 已完成 3 人
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 📋
+
+
+
患者王刚 - 复查报告审核
+
10:30
+
+
+ 待处理
+
+
+
+
+
+
+ ⚠️
+
+
+
患者刘洋 - 透析方案调整
+
09:00
+
+
+ 紧急
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ✅
+
+
+
09:30 张伟
+
心内科门诊 · 初诊
+
+
+ 已完成
+
+
+
+
+
+
+ 🕐
+
+
+
10:00 赵芳
+
心内科门诊 · 复诊
+
+
+ 待诊
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/04-pkg-doctor-core/patient-detail.html b/docs/prototypes/mp/04-pkg-doctor-core/patient-detail.html
new file mode 100644
index 0000000..3535e2c
--- /dev/null
+++ b/docs/prototypes/mp/04-pkg-doctor-core/patient-detail.html
@@ -0,0 +1,139 @@
+
+
+
+
+
+ 患者详情 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
王
+
+ 王刚
+ 高危
+
+
男 · 58岁 · ID: P20240001
+
联系电话: 138****5678
+
+
+
+
+
+
+
+
+
+
+ 诊断
+ 高血压3级 · 冠心病
+
+
+ 过敏史
+ 青霉素过敏
+
+
+ 血型
+ A型
+
+
+ 紧急联系人
+ 王丽 (配偶) 139****1234
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 电话随访
+ 2026-05-12
+
+
血压控制欠佳,建议调整用药
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/04-pkg-doctor-core/patients.html b/docs/prototypes/mp/04-pkg-doctor-core/patients.html
new file mode 100644
index 0000000..ec30416
--- /dev/null
+++ b/docs/prototypes/mp/04-pkg-doctor-core/patients.html
@@ -0,0 +1,138 @@
+
+
+
+
+
+ 患者列表 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
+
全部
+
在诊
+
透析
+
随访中
+
高危
+
+
+
+
+
+
+
+
王
+
+
王刚
+
男 58岁 · 高血压3级 · 冠心病
+
+
+ 高危
+ ›
+
+
+
+
+
+
+
+
+
陈
+
+
陈红
+
女 62岁 · 2型糖尿病 · 高血压
+
+
+ 随访中
+ ›
+
+
+
+
+
+
+
+
+
赵
+
+
赵丽
+
女 70岁 · 冠心病 · 心衰
+
+
+ 在诊
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/05-pkg-doctor-clinical/alert-detail.html b/docs/prototypes/mp/05-pkg-doctor-clinical/alert-detail.html
new file mode 100644
index 0000000..6fe3f07
--- /dev/null
+++ b/docs/prototypes/mp/05-pkg-doctor-clinical/alert-detail.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+ 告警详情 - HMS医生端
+
+
+
+
+
+ 05-pkg-doctor-clinical / alert-detail
+
+
+
+
+
+
+
+
+ 紧急
+
+
血钾异常告警
+
告警时间: 2026-05-16 09:50
+
+
+
+
+
+
+
+
+
+ 异常指标
+ 血钾 (K⁺)
+
+
+ 检测值
+ 5.8 mmol/L
+
+
+ 正常范围
+ 3.5 - 5.3 mmol/L
+
+
+ 偏离程度
+ +0.5 mmol/L (↑9.4%)
+
+
+ 检测时间
+ 2026-05-16 07:30
+
+
+
+
+
+
+
+
1. 立即通知主管医生
+
2. 复查电解质
+
3. 评估透析方案
+
4. 必要时紧急透析
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/05-pkg-doctor-clinical/alerts.html b/docs/prototypes/mp/05-pkg-doctor-clinical/alerts.html
new file mode 100644
index 0000000..373d06f
--- /dev/null
+++ b/docs/prototypes/mp/05-pkg-doctor-clinical/alerts.html
@@ -0,0 +1,88 @@
+
+
+
+
+
+ 临床告警 - HMS医生端
+
+
+
+
+
+ 05-pkg-doctor-clinical / alerts
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 血钾异常
+ 紧急
+
+
患者刘洋血钾5.8mmol/L,需紧急处理
+
10分钟前
+
+
+
+
+
+ 透析参数异常
+ 重要
+
+
患者王芳透析中超滤量偏差>15%
+
1小时前
+
+
+
+
+
+ 用药冲突
+ 重要
+
+
患者张伟新处方与现有用药存在潜在交互
+
2小时前
+
+
+
+
+
+ 检查到期
+ 一般
+
+
3名患者本周需复查肾功能
+
今天
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/05-pkg-doctor-clinical/dialysis-create.html b/docs/prototypes/mp/05-pkg-doctor-clinical/dialysis-create.html
new file mode 100644
index 0000000..9f3813a
--- /dev/null
+++ b/docs/prototypes/mp/05-pkg-doctor-clinical/dialysis-create.html
@@ -0,0 +1,138 @@
+
+
+
+
+
+ 创建透析记录 - HMS医生端
+
+
+
+
+
+ 05-pkg-doctor-clinical / dialysis-create
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/05-pkg-doctor-clinical/dialysis-detail.html b/docs/prototypes/mp/05-pkg-doctor-clinical/dialysis-detail.html
new file mode 100644
index 0000000..befa4c4
--- /dev/null
+++ b/docs/prototypes/mp/05-pkg-doctor-clinical/dialysis-detail.html
@@ -0,0 +1,146 @@
+
+
+
+
+
+ 透析详情 - HMS医生端
+
+
+
+
+
+ 05-pkg-doctor-clinical / dialysis-detail
+
+
+
+
+
+
+
+
+ 已完成
+ 透析编号: D20260515001
+
+
+
+
+
+
王
+
+
王芳 · 52岁 · 女
+
慢性肾病5期
+
+
+
+
+
+
+ 透析方式
+ HDF (血液透析滤过)
+
+
+ 透析时长
+ 4小时
+
+
+ 血管通路
+ 动静脉内瘘
+
+
+ 透析器
+ FX80
+
+
+ 抗凝方式
+ 低分子肝素
+
+
+ 透析液
+ 碳酸氢盐
+
+
+
+
+
+
+
+ 血流量
+ 280 ml/min
+
+
+ 透析液流量
+ 500 ml/min
+
+
+ 超滤量
+ 2500 ml
+
+
+ 透析前体重
+ 65.2 kg
+
+
+ 透析后体重
+ 62.7 kg
+
+
+ 干体重
+ 62.5 kg
+
+
+
+
+
+
+
+
透析前
+
BP 155/90
+
HR 82
+
+
+
透析中
+
BP 135/80
+
HR 78
+
+
+
透析后
+
BP 128/75
+
HR 72
+
+
+
+
+
+
+
透析过程顺利,无低血压、肌肉痉挛等并发症。
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/05-pkg-doctor-clinical/dialysis.html b/docs/prototypes/mp/05-pkg-doctor-clinical/dialysis.html
new file mode 100644
index 0000000..7249738
--- /dev/null
+++ b/docs/prototypes/mp/05-pkg-doctor-clinical/dialysis.html
@@ -0,0 +1,109 @@
+
+
+
+
+
+ 透析记录 - HMS医生端
+
+
+
+
+
+ 05-pkg-doctor-clinical / dialysis
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
+
+
+
+
+
+
+ 刘洋
+ 进行中
+
+
HD透析 · 4小时
+
2026-05-16 08:00
+
+
血管通路: 动静脉内瘘
+
+
+
+
+
+ 张强
+ 待开始
+
+
HD透析 · 3.5小时
+
2026-05-16 10:00
+
+
血管通路: 中心静脉导管
+
+
+
+
+
+ 王芳
+ 已完成
+
+
HDF透析 · 4小时
+
2026-05-15 14:00
+
+
超滤量: 2500ml
+
+
+
+
+
+ 陈明
+ 已取消
+
+
HD透析 · 4小时
+
2026-05-15 08:00
+
+
原因: 患者请假
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/05-pkg-doctor-clinical/prescription-create.html b/docs/prototypes/mp/05-pkg-doctor-clinical/prescription-create.html
new file mode 100644
index 0000000..9183d40
--- /dev/null
+++ b/docs/prototypes/mp/05-pkg-doctor-clinical/prescription-create.html
@@ -0,0 +1,138 @@
+
+
+
+
+
+ 创建处方 - HMS医生端
+
+
+
+
+
+ 05-pkg-doctor-clinical / prescription-create
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
氨氯地平片 5mg
+
口服 · 每日一次 · 30天
+
+
×
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/05-pkg-doctor-clinical/prescription-detail.html b/docs/prototypes/mp/05-pkg-doctor-clinical/prescription-detail.html
new file mode 100644
index 0000000..d4edf17
--- /dev/null
+++ b/docs/prototypes/mp/05-pkg-doctor-clinical/prescription-detail.html
@@ -0,0 +1,111 @@
+
+
+
+
+
+ 处方详情 - HMS医生端
+
+
+
+
+
+ 05-pkg-doctor-clinical / prescription-detail
+
+
+
+
+
+
+
+
+ 活跃
+ 处方编号: RX20260510001
+
+
+
+
+
+
+
+
+
+ 开方日期
+ 2026-05-10
+
+
+ 开方医生
+ 李明 主任医师
+
+
+ 有效期至
+ 2026-08-10
+
+
+ 诊断
+ 高血压3级 · 冠心病
+
+
+
+
+
+
+
+
+
+ 氨氯地平片
+ 长期用药
+
+
5mg
+
每日一次 · 口服
+
30天用量
+
+
+
+
+
+ 缬沙坦胶囊
+ 长期用药
+
+
80mg
+
每日一次 · 口服
+
30天用量
+
+
+
+
+
+
低盐低脂饮食,定期监测血压和肾功能。避免剧烈运动。2周后复查。
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/05-pkg-doctor-clinical/prescription.html b/docs/prototypes/mp/05-pkg-doctor-clinical/prescription.html
new file mode 100644
index 0000000..f432698
--- /dev/null
+++ b/docs/prototypes/mp/05-pkg-doctor-clinical/prescription.html
@@ -0,0 +1,99 @@
+
+
+
+
+
+ 处方列表 - HMS医生端
+
+
+
+
+
+ 05-pkg-doctor-clinical / prescription
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
+
+
+
+
+
+
+ 王刚
+ 活跃
+
+
降压方案
+
氨氯地平 5mg qd + 缬沙坦 80mg qd
+
+
+ 2026-05-10
+ 有效期至 2026-08-10
+
+
+
+
+
+
+ 刘洋
+ 活跃
+
+
肾病方案
+
骨化三醇 0.25μg qd + 碳酸钙 600mg bid
+
+
+ 2026-05-08
+
+
+
+
+
+
+
+ 陈红
+ 即将过期
+
+
降糖方案
+
二甲双胍 500mg tid
+
+
+ 2026-04-15
+ 有效期至 2026-05-20
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/05-pkg-doctor-clinical/report-detail.html b/docs/prototypes/mp/05-pkg-doctor-clinical/report-detail.html
new file mode 100644
index 0000000..f9120ac
--- /dev/null
+++ b/docs/prototypes/mp/05-pkg-doctor-clinical/report-detail.html
@@ -0,0 +1,143 @@
+
+
+
+
+
+ 报告详情 - HMS医生端
+
+
+
+
+
+ 05-pkg-doctor-clinical / report-detail
+
+
+
+
+
+
+
+
+ 血常规 + 肝肾功能
+ 已审核
+
+
患者: 王刚 · 男 58岁
+
采样时间: 2026-05-16 07:30
+
审核医生: 李明
+
+
+
+
+
+
+
白细胞 (WBC)
+
+ 6.5 ×10⁹/L
+ 正常
+
+
+
+
红细胞 (RBC)
+
+ 4.2 ×10¹²/L
+ 正常
+
+
+
+
血红蛋白 (HGB)
+
+ 135 g/L
+ 正常
+
+
+
+
血小板 (PLT)
+
+ 198 ×10⁹/L
+ 正常
+
+
+
+
+
+
+
+
+
+
谷丙转氨酶 (ALT)
+
+ 28 U/L
+ 正常
+
+
+
+
谷草转氨酶 (AST)
+
+ 22 U/L
+ 正常
+
+
+
+
肌酐 (Cr)
+
+ 112 µmol/L
+ 偏高 ↑
+
+
+
+
尿素氮 (BUN)
+
+ 7.8 mmol/L
+ 正常
+
+
+
+
尿酸 (UA)
+
+ 420 µmol/L
+ 偏高 ↑
+
+
+
+
+
+
+
+
肾功能指标轻度异常,建议2周后复查,继续监测。
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/05-pkg-doctor-clinical/report.html b/docs/prototypes/mp/05-pkg-doctor-clinical/report.html
new file mode 100644
index 0000000..f8a83c1
--- /dev/null
+++ b/docs/prototypes/mp/05-pkg-doctor-clinical/report.html
@@ -0,0 +1,102 @@
+
+
+
+
+
+ 检验报告 - HMS医生端
+
+
+
+
+
+ 05-pkg-doctor-clinical / report
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
+
+
+
+
+
+
+ 王刚
+ 待审核
+
+
血常规 + 肝肾功能
+
2026-05-16
+
+
送检医生: 李明
+
+
+
+
+
+ 刘洋
+ 异常
+
+
电解质 + 甲状旁腺
+
2026-05-16
+
+
血钾 5.8mmol/L ↑
+
+
+
+
+
+ 陈红
+ 已审核
+
+
糖化血红蛋白
+
2026-05-15
+
+
HbA1c 7.2%
+
+
+
+
+
+ 张伟
+ 已审核
+
+
血脂全套
+
2026-05-14
+
+
LDL-C 3.2mmol/L
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/06-pkg-mall/detail.html b/docs/prototypes/mp/06-pkg-mall/detail.html
new file mode 100644
index 0000000..280a7a8
--- /dev/null
+++ b/docs/prototypes/mp/06-pkg-mall/detail.html
@@ -0,0 +1,100 @@
+
+
+
+
+
+ 商品详情 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 📸 商品图片
+
+
+
+
+
智能电子血压计
+
欧姆龙 U722 · 上臂式全自动
+
+ 1,200
+ 积分
+ 市场价 ¥299
+
+
+
+
+
+
+
+
+ 品牌
+ 欧姆龙
+
+
+ 型号
+ U722
+
+
+ 测量方式
+ 上臂式
+
+
+ 精度
+ ±3mmHg
+
+
+ 记忆功能
+ 60组
+
+
+ 适用人群
+ 成人
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/06-pkg-mall/exchange.html b/docs/prototypes/mp/06-pkg-mall/exchange.html
new file mode 100644
index 0000000..818b387
--- /dev/null
+++ b/docs/prototypes/mp/06-pkg-mall/exchange.html
@@ -0,0 +1,105 @@
+
+
+
+
+
+ 兑换记录 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 智能电子血压计
+ 已完成
+
+
+ -1,200积分
+ 2026-05-10
+
+
快递单号: SF1234567890
+
+
+
+
+
+ 维生素D补充剂
+ 已发货
+
+
+ -350积分
+ 2026-05-14
+
+
预计5月17日送达
+
+
+
+
+
+ 健康手环
+ 待发货
+
+
+ -800积分
+ 2026-05-16
+
+
正在备货中
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/06-pkg-mall/orders.html b/docs/prototypes/mp/06-pkg-mall/orders.html
new file mode 100644
index 0000000..39caeaf
--- /dev/null
+++ b/docs/prototypes/mp/06-pkg-mall/orders.html
@@ -0,0 +1,99 @@
+
+
+
+
+
+ 订单列表 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
全部
+
待处理
+
配送中
+
已完成
+
已取消
+
+
+
+
+
+
+
+
+ ORD20260510001
+ 2026-05-10
+
+
智能电子血压计 × 1
+
+ -1,200积分
+ 已完成
+
+
+
+
+
+
+ ORD20260514002
+ 2026-05-14
+
+
维生素D补充剂 × 2
+
+ -700积分
+ 配送中
+
+
+
+
+
+
+ ORD20260516003
+ 2026-05-16
+
+
健康手环 × 1
+
+ -800积分
+ 待处理
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/consents.html b/docs/prototypes/mp/07-pkg-profile/consents.html
new file mode 100644
index 0000000..075ef04
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/consents.html
@@ -0,0 +1,83 @@
+
+
+
+
+
+ 知情同意书 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
📄
+
+
透析治疗知情同意书
+
2026-01-15 签署
+
+
+ 已签署
+ ›
+
+
+
+
+
+
📄
+
+
血液透析知情同意书
+
2026-01-15 签署
+
+
+ 已签署
+ ›
+
+
+
+
+
+
📄
+
+
隐私数据处理同意书
+
2025-12-01 签署
+
+
+ 已签署
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/diagnoses.html b/docs/prototypes/mp/07-pkg-profile/diagnoses.html
new file mode 100644
index 0000000..3c6cfb2
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/diagnoses.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+ 诊断记录 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
📋
+
+
高血压2级
+
2026-05-10 · 李明 主任医师
+
+
+ 活跃
+ ›
+
+
+
+
+
+
📋
+
+
2型糖尿病
+
2025-12-15 · 王芳 副主任医师
+
+
+ 管理中
+ ›
+
+
+
+
+
+
📋
+
+
高脂血症
+
2025-12-01 · 李明 主任医师
+
+
+ 已控制
+ ›
+
+
+
+
+
+
📋
+
+
高血压1级
+
2020-03-20 · 张三 主任医师
+
+
+ 历史
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/dialysis-prescription-detail.html b/docs/prototypes/mp/07-pkg-profile/dialysis-prescription-detail.html
new file mode 100644
index 0000000..76474b8
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/dialysis-prescription-detail.html
@@ -0,0 +1,93 @@
+
+
+
+
+
+ 处方详情 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 标准HDF处方
+ 活跃
+
+
生效日期: 2026-05-01
+
+
+
+
+
+ 透析方式
+ HDF
+
+
+ 血流量
+ 280 ml/min
+
+
+ 透析液流量
+ 500 ml/min
+
+
+ 透析器
+ FX80
+
+
+ 抗凝
+ 低分子肝素 4000IU
+
+
+ 目标超滤
+ 2500 ml
+
+
+ 干体重
+ 62.5 kg
+
+
+
+
+
+
+
+
+ 每周3次,周一/三/五。注意监测血压和血钾。
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/dialysis-prescriptions.html b/docs/prototypes/mp/07-pkg-profile/dialysis-prescriptions.html
new file mode 100644
index 0000000..a08c5e7
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/dialysis-prescriptions.html
@@ -0,0 +1,83 @@
+
+
+
+
+
+ 透析处方 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
📋
+
+
标准HDF处方
+
2026-05-01生效 · 血流量280ml/min · 4小时
+
+
+ 活跃
+ ›
+
+
+
+
+
+
📋
+
+
HD调整处方
+
2026-03-15 至 2026-04-30
+
+
+ 已结束
+ ›
+
+
+
+
+
+
📋
+
+
初始HD处方
+
2025-12-01 至 2026-03-14
+
+
+ 已结束
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/dialysis-record-detail.html b/docs/prototypes/mp/07-pkg-profile/dialysis-record-detail.html
new file mode 100644
index 0000000..0ddc82e
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/dialysis-record-detail.html
@@ -0,0 +1,105 @@
+
+
+
+
+
+ 透析详情 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 已完成
+
+
记录编号: D20260515001
+
+
+
+
+
+ 透析方式
+ HDF
+
+
+ 时长
+ 4小时
+
+
+ 血管通路
+ 动静脉内瘘
+
+
+ 透析器
+ FX80
+
+
+ 超滤量
+ 2500ml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/dialysis-records.html b/docs/prototypes/mp/07-pkg-profile/dialysis-records.html
new file mode 100644
index 0000000..0009d58
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/dialysis-records.html
@@ -0,0 +1,98 @@
+
+
+
+
+
+ 透析记录 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
🧬
+
+
HDF透析
+
2026-05-15 · 4小时 · 超滤2500ml
+
+
+ 已完成
+ ›
+
+
+
+
+
+
🧬
+
+
HD透析
+
2026-05-12 · 4小时 · 超滤2300ml
+
+
+ 已完成
+ ›
+
+
+
+
+
+
🧬
+
+
HD透析
+
2026-05-09 · 3.5小时 · 超滤2100ml
+
+
+ 已完成
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/elder-mode.html b/docs/prototypes/mp/07-pkg-profile/elder-mode.html
new file mode 100644
index 0000000..b913fdb
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/elder-mode.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+ 长者模式 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
长者模式
+
+ 开启后字体和图标将放大,操作更便捷
+
+
+
+
+
+
+
+
+
+
+
🔢
+
字号放大 1.35 倍,确保文字清晰可读
+
+
+
🖱
+
触摸目标放大至 56px,减少误操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/events.html b/docs/prototypes/mp/07-pkg-profile/events.html
new file mode 100644
index 0000000..f347ae5
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/events.html
@@ -0,0 +1,91 @@
+
+
+
+
+
+ 线下活动 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
全部
+
即将开始
+
进行中
+
已结束
+
+
+
+
+
+
+
+
+ 高血压患者健康讲座
+ 即将开始
+
+
2026-05-20 14:00
+
第一人民医院3楼会议室
+
主讲: 李明主任 · 限额30人
+
+
+
+
+
+ 肾友会线下交流活动
+ 报名中
+
+
2026-05-25 09:00
+
社区健康中心
+
已有18人报名
+
+
+
+
+
+ 糖尿病饮食工作坊
+ 已结束
+
+
2026-05-10 10:00
+
营养科示教室
+
参与人数: 25人
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/family-add.html b/docs/prototypes/mp/07-pkg-profile/family-add.html
new file mode 100644
index 0000000..167260b
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/family-add.html
@@ -0,0 +1,95 @@
+
+
+
+
+
+ 添加家人 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/family.html b/docs/prototypes/mp/07-pkg-profile/family.html
new file mode 100644
index 0000000..0db4ed6
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/family.html
@@ -0,0 +1,90 @@
+
+
+
+
+
+ 家人管理 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
王
+
+
王丽
+
配偶 · 55岁
+
血缘关系: 配偶
+
+
+ 已认证
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/followup-detail.html b/docs/prototypes/mp/07-pkg-profile/followup-detail.html
new file mode 100644
index 0000000..f0cf337
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/followup-detail.html
@@ -0,0 +1,101 @@
+
+
+
+
+
+ 随访详情 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 已完成
+
+
随访编号: FU20260510001
+
+
+
+
+
+ 随访方式
+ 电话随访
+
+
+ 计划日期
+ 2026-05-10
+
+
+ 完成日期
+ 2026-05-10 14:30
+
+
+ 执行医生
+ 李明
+
+
+
+
+
+
+
+
+ 血压
+ 128/82 mmHg
+
+
+ 心率
+ 72 次/分
+
+
+ 用药依从性
+ 良好
+
+
+
+
+
+
+
+
+ 血压控制良好,继续当前治疗方案。建议低盐饮食,每日监测血压,下次随访安排在一个月后。
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/followups.html b/docs/prototypes/mp/07-pkg-profile/followups.html
new file mode 100644
index 0000000..fa20f79
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/followups.html
@@ -0,0 +1,91 @@
+
+
+
+
+
+ 随访记录 · HMS
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/health-records.html b/docs/prototypes/mp/07-pkg-profile/health-records.html
new file mode 100644
index 0000000..c19427b
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/health-records.html
@@ -0,0 +1,107 @@
+
+
+
+
+
+ 健康档案 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
张
+
+
张伟
+
男 · 55岁
+
建档日期: 2025-12-01
+
+
+
+
+
+
+
+
+
+ 血型
+ A型
+
+
+ 身高
+ 172 cm
+
+
+ 体重
+ 68.5 kg
+
+
+ BMI
+ 23.1
+
+
+ 过敏史
+ 青霉素
+
+
+
+
+
+
+
+
+ 高血压2级 (2020年)
+ 2型糖尿病 (2022年)
+
+
+
+
+
+
+
+
+ 父亲: 高血压
+ 母亲: 糖尿病
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/medication.html b/docs/prototypes/mp/07-pkg-profile/medication.html
new file mode 100644
index 0000000..4593b22
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/medication.html
@@ -0,0 +1,138 @@
+
+
+
+
+
+ 用药记录 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
💊
+
+
氨氯地平片 5mg
+
每日一次 · 08:00
+
+
+ 长期
+
+
+
+
+
💊
+
+
缬沙坦胶囊 80mg
+
每日一次 · 08:00
+
+
+ 长期
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/report-detail.html b/docs/prototypes/mp/07-pkg-profile/report-detail.html
new file mode 100644
index 0000000..44520f4
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/report-detail.html
@@ -0,0 +1,87 @@
+
+
+
+
+
+ 报告详情 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2026年度体检报告
+ 正常
+
+
检查日期: 2026-03-15
+
检查机构: 第一人民医院
+
+
+
+
+
+
+
+ 血常规
+ 正常
+
+
+ 肝肾功能
+ 正常
+
+
+ 心电图
+ 正常
+
+
+ 腹部B超
+ 正常
+
+
+
+
+
+
+
+
+ 各项指标基本正常,建议继续保持健康生活方式,半年后复查。
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/reports.html b/docs/prototypes/mp/07-pkg-profile/reports.html
new file mode 100644
index 0000000..014a081
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/reports.html
@@ -0,0 +1,105 @@
+
+
+
+
+
+ 体检报告 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
+
+
+
+
+
+
+
📋
+
+
2026年度体检报告
+
2026-03-15
+
+
+ 正常
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/07-pkg-profile/settings.html b/docs/prototypes/mp/07-pkg-profile/settings.html
new file mode 100644
index 0000000..b6b24f7
--- /dev/null
+++ b/docs/prototypes/mp/07-pkg-profile/settings.html
@@ -0,0 +1,125 @@
+
+
+
+
+
+ 设置 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ v1.2.0
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/08-pkg-other/ai-report-detail.html b/docs/prototypes/mp/08-pkg-other/ai-report-detail.html
new file mode 100644
index 0000000..4619a20
--- /dev/null
+++ b/docs/prototypes/mp/08-pkg-other/ai-report-detail.html
@@ -0,0 +1,130 @@
+
+
+
+
+
+ AI 报告详情 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 血常规智能解读
+ 需关注
+
+
生成时间: 2026-05-16 10:30
+
基于 2026-05-16 血常规检验报告
+
+
+
+
+
+
+
共检测 22 项指标,其中 19 项正常,3 项需关注。整体结果基本正常,建议关注以下指标变化。
+
+
+
+
+
+
+
+
+
+
+ 白细胞 (WBC)
+ 偏低 ↓
+
+
3.2 ×10&sup9;/L
+
正常范围: 4.0-10.0
+
建议: 关注免疫功能,必要时复查
+
+
+
+
+
+ 血红蛋白 (HGB)
+ 偏低 ↓
+
+
118 g/L
+
正常范围: 120-160
+
建议: 适当补充铁剂和蛋白质
+
+
+
+
+
+ 血小板 (PLT)
+ 偏低 ↓
+
+
98 ×10&sup9;/L
+
正常范围: 100-300
+
建议: 2周后复查血小板
+
+
+
+
+
+
+
+
+
+ 1. 建议加强营养摄入,适当补充铁剂
+ 2. 2周后复查血常规
+ 3. 避免剧烈运动,注意休息
+ 4. 如有头晕、乏力等症状,请及时就医
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/08-pkg-other/ai-report-list.html b/docs/prototypes/mp/08-pkg-other/ai-report-list.html
new file mode 100644
index 0000000..3bf6266
--- /dev/null
+++ b/docs/prototypes/mp/08-pkg-other/ai-report-list.html
@@ -0,0 +1,117 @@
+
+
+
+
+
+ AI 分析报告 · HMS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
+
全部
+
化验解读
+
趋势分析
+
健康评估
+
+
+
+
+
+
+
+
+ 血常规智能解读
+ 需关注
+
+
AI分析发现3项指标需关注
+
+ 2026-05-16
+ 查看详情 →
+
+
+
+
+
+
+ 肾功能趋势分析
+ 趋势分析
+
+
近3个月肌酐呈上升趋势
+
+ 2026-05-15
+ 查看详情 →
+
+
+
+
+
+
+ 综合健康评估
+ 良好
+
+
您的健康评分: 82/100
+
+ 2026-05-10
+ 查看详情 →
+
+
+
+
+
+
+ 血糖管理报告
+ 达标
+
+
近30天血糖控制达标率85%
+
+ 2026-05-01
+ 查看详情 →
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/08-pkg-other/article-detail.html b/docs/prototypes/mp/08-pkg-other/article-detail.html
new file mode 100644
index 0000000..b5c0913
--- /dev/null
+++ b/docs/prototypes/mp/08-pkg-other/article-detail.html
@@ -0,0 +1,72 @@
+
+
+
+
+
+ 文章详情 - HMS小程序原型
+
+
+
+
+
+
+
+
+
+
+
+
+
高血压日常管理指南
+
+ 心内科
+ 5分钟阅读
+ 2026-05-15
+
+
李明 主任医师 审阅
+
+
+
+
高血压是一种常见的慢性疾病,长期血压控制不佳会增加心脑血管疾病的风险。以下是一些日常管理建议:
+
+
一、规律用药
+
遵医嘱按时服药,不可自行停药或调整剂量。建议设置用药提醒。
+
+
二、低盐饮食
+
每日钠盐摄入量控制在6g以下。减少加工食品和外卖的摄入。
+
+
三、适量运动
+
每周进行150分钟中等强度有氧运动,如快走、游泳等。避免剧烈运动。
+
+
四、定期监测
+
建议每日早晚各测一次血压,记录数据供医生参考。
+
+
五、情绪管理
+
保持心情平和,避免过度紧张和焦虑。可以通过冥想、深呼吸等方式放松。
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/08-pkg-other/article-list.html b/docs/prototypes/mp/08-pkg-other/article-list.html
new file mode 100644
index 0000000..d990ed2
--- /dev/null
+++ b/docs/prototypes/mp/08-pkg-other/article-list.html
@@ -0,0 +1,110 @@
+
+
+
+
+
+ 健康文章 - HMS小程序原型
+
+
+
+
+
+
+
+
+
+
+
+
+ 🔍
+
+
+
+
+
全部
+
高血压
+
糖尿病
+
肾病
+
饮食
+
运动
+
+
+
+
+
高血压日常管理指南
+
详细介绍高血压患者在日常生活中的注意事项,包括饮食、运动、用药等方面的科学建议。
+
+ 高血压
+ 5分钟阅读
+ 2026-05-15
+
+
+
+
+
糖尿病患者饮食建议
+
科学的饮食控制是糖尿病管理的基础,本文为您详细介绍如何合理安排每日膳食。
+
+ 饮食
+ 3分钟阅读
+ 2026-05-14
+
+
+
+
+
透析患者的生活质量提升
+
通过合理的生活方式调整,透析患者也可以拥有良好的生活质量。
+
+ 肾病
+ 8分钟阅读
+ 2026-05-12
+
+
+
+
+
运动与心血管健康
+
适量运动对心血管系统的保护作用已被大量研究证实。
+
+ 运动
+ 6分钟阅读
+ 2026-05-10
+
+
+
+
+
如何正确测量血压
+
正确的血压测量方法对高血压的诊断和管理至关重要。
+
+ 高血压
+ 4分钟阅读
+ 2026-05-08
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/08-pkg-other/consultation-detail.html b/docs/prototypes/mp/08-pkg-other/consultation-detail.html
new file mode 100644
index 0000000..bad7fdb
--- /dev/null
+++ b/docs/prototypes/mp/08-pkg-other/consultation-detail.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+ 咨询详情 - HMS小程序原型
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 今天 09:00
+
+
+
+ 您好,请问您哪里不舒服?
+
+
+
+ 医生您好,我最近一周血压有点偏高,经常头晕头痛。
+
+
+
+ 请问您目前有服用降压药吗?血压最高到过多少?
+
+
+
+ 在吃氨氯地平,每天一片。今早测了155/95。
+
+
+
+ 了解了。血压确实偏高,建议:
1. 增加缬沙坦80mg,每日一次
2. 低盐饮食
3. 一周后复查
我先给您开个处方。
+
+
+
+ 好的,谢谢医生!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/index.html b/docs/prototypes/mp/index.html
new file mode 100644
index 0000000..6b17f69
--- /dev/null
+++ b/docs/prototypes/mp/index.html
@@ -0,0 +1,568 @@
+
+
+
+
+
+HMS 小程序原型稿 · 页面导航
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/prototypes/mp/shared/components.css b/docs/prototypes/mp/shared/components.css
new file mode 100644
index 0000000..c08c06a
--- /dev/null
+++ b/docs/prototypes/mp/shared/components.css
@@ -0,0 +1,760 @@
+/* ============================================
+ HMS 小程序统一组件库 · Component Classes
+ 全局统一,所有页面共享,不允许自定义独特样式
+ ============================================ */
+
+/* ── PageShell ── */
+.page-shell {
+ min-height: 100%;
+ background: var(--bg);
+ padding: var(--page-pad);
+ padding-bottom: calc(var(--page-pad) + 34px); /* safe-area */
+ box-sizing: border-box;
+}
+.page-shell--sm { padding: var(--gap-sm); }
+.page-shell--none { padding: 0; }
+.page-shell--lg { padding: var(--gap-lg); }
+
+/* ── ContentCard ── */
+.card {
+ background: var(--card);
+ border-radius: var(--card-r);
+ box-shadow: var(--shadow-sm);
+ padding: var(--card-pad);
+ transition: opacity 0.15s, transform 0.15s;
+}
+.card--outlined {
+ box-shadow: none;
+ border: 1px solid var(--bd);
+}
+.card--elevated {
+ box-shadow: var(--shadow-md);
+}
+.card--sm { padding: var(--card-pad-sm); }
+.card--lg { padding: var(--card-pad-lg); }
+.card--none { padding: 0; }
+.card--pressable { cursor: pointer; }
+.card--pressable:active {
+ opacity: 0.85;
+ transform: scale(0.98);
+}
+
+/* ── StatusTag ── */
+.tag {
+ display: inline-flex;
+ align-items: center;
+ border-radius: var(--r-pill);
+ font-size: var(--font-micro);
+ font-weight: 500;
+ padding: 4px 12px;
+ line-height: 1;
+ white-space: nowrap;
+}
+.tag--sm { font-size: 11px; padding: 2px 8px; }
+.tag--success { background: #ECFDF5; color: var(--success); }
+.tag--warning { background: #FFF7ED; color: var(--warning); }
+.tag--error { background: #FEF2F2; color: var(--danger); }
+.tag--info { background: var(--info-light); color: var(--info); }
+.tag--default { background: #F5F5F4; color: var(--tx3); }
+
+/* ── SectionTitle ── */
+.section-title {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: var(--gap-sm);
+}
+.section-title__bar {
+ width: 3px;
+ height: 20px;
+ background: var(--pri);
+ border-radius: 2px;
+ flex-shrink: 0;
+}
+.section-title__text {
+ font-size: var(--font-h2);
+ font-weight: 600;
+ color: var(--tx);
+}
+.section-title__subtitle {
+ font-size: var(--font-body-sm);
+ color: var(--tx3);
+ margin-top: 2px;
+}
+.section-title__action {
+ margin-left: auto;
+ font-size: var(--font-body-sm);
+ color: var(--pri);
+ min-height: var(--touch-min);
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+}
+
+/* ── SearchSection ── */
+.search-bar {
+ display: flex;
+ align-items: center;
+ background: var(--card);
+ border-radius: var(--card-r);
+ height: var(--input-h);
+ padding: 0 var(--gap-sm);
+ box-shadow: var(--shadow-sm);
+ gap: 8px;
+}
+.search-bar__icon {
+ font-size: 20px;
+ color: var(--tx3);
+ flex-shrink: 0;
+}
+.search-bar__input {
+ flex: 1;
+ border: none;
+ outline: none;
+ font-size: var(--font-body);
+ color: var(--tx);
+ background: transparent;
+ font-family: var(--font-family);
+}
+.search-bar__input::placeholder { color: var(--tx3); }
+
+/* Filter tabs (pill variant) */
+.filter-pills {
+ display: flex;
+ gap: var(--gap-xs);
+ margin-top: var(--gap-sm);
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+.filter-pill {
+ padding: 8px 20px;
+ border-radius: var(--r-pill);
+ font-size: var(--font-body-sm);
+ color: var(--tx3);
+ background: var(--card);
+ border: 1px solid var(--bd);
+ white-space: nowrap;
+ cursor: pointer;
+ transition: all 0.15s;
+}
+.filter-pill--active {
+ background: var(--pri);
+ color: var(--white);
+ border-color: var(--pri);
+}
+
+/* ── CardList ── */
+.card-list {
+ display: flex;
+ flex-direction: column;
+ gap: var(--gap-sm);
+}
+.card-list--md { gap: var(--gap-md); }
+
+/* ── PaginationBar ── */
+.pagination {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: var(--gap-sm);
+ margin-top: var(--gap-md);
+}
+.pagination__btn {
+ background: var(--card);
+ border: 1px solid var(--bd);
+ border-radius: var(--r-sm);
+ padding: 0 16px;
+ height: var(--touch-min);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: var(--font-body-sm);
+ color: var(--tx);
+ cursor: pointer;
+}
+.pagination__btn:disabled {
+ opacity: 0.4;
+ cursor: not-allowed;
+}
+.pagination__info {
+ font-size: var(--font-body-sm);
+ color: var(--tx3);
+}
+
+/* ── PageHeader ── */
+.page-header {
+ display: flex;
+ align-items: center;
+ height: var(--touch-min);
+ padding: 0 var(--page-pad);
+ background: var(--bg);
+ position: sticky;
+ top: 0;
+ z-index: 10;
+}
+.page-header__back {
+ width: 36px;
+ height: 36px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 22px;
+ color: var(--tx);
+ cursor: pointer;
+ margin-right: 4px;
+}
+.page-header__title {
+ font-size: var(--font-h1);
+ font-weight: 600;
+ color: var(--tx);
+}
+.page-header__actions {
+ margin-left: auto;
+ display: flex;
+ gap: var(--gap-xs);
+}
+
+/* ── EmptyState ── */
+.empty-state {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: var(--gap-2xl) var(--gap-xl);
+ text-align: center;
+}
+.empty-state__icon {
+ width: 80px;
+ height: 80px;
+ border-radius: 50%;
+ background: var(--surface-alt);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: var(--font-hero);
+ font-family: var(--font-serif);
+ color: var(--tx3);
+ margin-bottom: var(--gap-lg);
+}
+.empty-state__text {
+ font-size: var(--font-num);
+ color: var(--tx2);
+ margin-bottom: var(--gap-xs);
+}
+.empty-state__hint {
+ font-size: var(--font-h2);
+ color: var(--tx3);
+}
+.empty-state__action {
+ margin-top: var(--gap-lg);
+}
+
+/* ── ErrorState ── */
+.error-state {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: var(--gap-2xl) var(--gap-xl);
+ text-align: center;
+}
+.error-state__icon {
+ font-size: var(--font-display);
+ margin-bottom: var(--gap-lg);
+}
+.error-state__text {
+ font-size: var(--font-body-lg);
+ color: var(--tx2);
+}
+.error-state__action {
+ margin-top: var(--gap-lg);
+}
+
+/* ── LoadingCard (Skeleton) ── */
+.skeleton {
+ background: var(--card);
+ border-radius: var(--card-r);
+ padding: var(--card-pad);
+ animation: skeleton-pulse 1.5s infinite;
+}
+@keyframes skeleton-pulse {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.4; }
+}
+.skeleton__line {
+ background: var(--bd-light);
+ border-radius: 4px;
+ margin-bottom: 10px;
+}
+.skeleton__line--title { width: 60%; height: 16px; }
+.skeleton__line--text { width: 100%; height: 12px; }
+.skeleton__line--short { width: 40%; height: 12px; }
+.skeleton__avatar {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ background: var(--bd-light);
+ flex-shrink: 0;
+}
+
+/* ── Buttons ── */
+.btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: var(--btn-h);
+ border-radius: var(--r-pill);
+ font-size: var(--font-body-lg);
+ font-weight: 600;
+ border: none;
+ cursor: pointer;
+ transition: opacity 0.15s;
+ font-family: var(--font-family);
+ padding: 0 var(--gap-lg);
+}
+.btn:active { opacity: 0.85; }
+.btn--primary {
+ background: var(--pri);
+ color: var(--white);
+}
+.btn--outline {
+ background: transparent;
+ color: var(--pri);
+ border: 2px solid var(--pri);
+}
+.btn--sm {
+ height: 36px;
+ font-size: var(--font-body-sm);
+ padding: 0 16px;
+}
+.btn--full { width: 100%; }
+.btn--danger {
+ background: var(--danger);
+ color: var(--white);
+}
+
+/* ── Form Fields ── */
+.form-group {
+ margin-bottom: var(--gap-md);
+}
+.form-label {
+ font-size: var(--font-body);
+ color: var(--tx2);
+ margin-bottom: var(--gap-xs);
+ display: block;
+}
+.form-label--required::after {
+ content: '*';
+ color: var(--danger);
+ margin-left: 4px;
+}
+.form-input {
+ width: 100%;
+ height: var(--input-h);
+ border: 1px solid var(--bd);
+ border-radius: var(--r-sm);
+ padding: 0 var(--gap-md);
+ font-size: var(--font-body);
+ color: var(--tx);
+ background: var(--card);
+ box-sizing: border-box;
+ font-family: var(--font-family);
+ outline: none;
+ transition: border-color 0.15s;
+}
+.form-input:focus { border-color: var(--pri); }
+.form-input::placeholder { color: var(--tx3); }
+
+.form-textarea {
+ width: 100%;
+ min-height: 120px;
+ border: 1px solid var(--bd);
+ border-radius: var(--r-sm);
+ padding: var(--gap-sm);
+ font-size: var(--font-body);
+ color: var(--tx);
+ background: var(--card);
+ box-sizing: border-box;
+ font-family: var(--font-family);
+ outline: none;
+ resize: vertical;
+ transition: border-color 0.15s;
+}
+.form-textarea:focus { border-color: var(--pri); }
+
+.form-select {
+ width: 100%;
+ height: var(--input-h);
+ border: 1px solid var(--bd);
+ border-radius: var(--r-sm);
+ padding: 0 var(--gap-md);
+ font-size: var(--font-body);
+ color: var(--tx);
+ background: var(--card);
+ box-sizing: border-box;
+ font-family: var(--font-family);
+ outline: none;
+ appearance: none;
+ background-image: url("data:image/svg+xml,%3Csvg width='12' height='8' viewBox='0 0 12 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1.5L6 6.5L11 1.5' stroke='%2378716C' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: right 16px center;
+}
+
+/* ── Stat Card (数据统计卡片) ── */
+.stat-card {
+ background: var(--card);
+ border-radius: var(--card-r);
+ padding: var(--card-pad);
+ box-shadow: var(--shadow-sm);
+ text-align: center;
+}
+.stat-card__value {
+ font-size: var(--font-num-lg);
+ font-weight: 700;
+ color: var(--tx);
+ font-family: var(--font-serif);
+ font-variant-numeric: tabular-nums;
+}
+.stat-card__label {
+ font-size: var(--font-cap);
+ color: var(--tx3);
+ margin-top: 4px;
+}
+.stat-card--primary .stat-card__value { color: var(--pri); }
+.stat-card--success .stat-card__value { color: var(--success); }
+.stat-card--danger .stat-card__value { color: var(--danger); }
+.stat-card--warning .stat-card__value { color: var(--warning); }
+
+/* ── Stat Grid ── */
+.stat-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
+ gap: var(--gap-sm);
+}
+
+/* ── Info Row (详情信息行) ── */
+.info-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: var(--gap-sm) 0;
+ border-bottom: 1px solid var(--bd-light);
+}
+.info-row:last-child { border-bottom: none; }
+.info-row__label {
+ font-size: var(--font-body-sm);
+ color: var(--tx3);
+ flex-shrink: 0;
+}
+.info-row__value {
+ font-size: var(--font-body);
+ color: var(--tx);
+ text-align: right;
+ word-break: break-all;
+}
+
+/* ── List Item (列表项) ── */
+.list-item {
+ display: flex;
+ align-items: center;
+ gap: var(--gap-sm);
+ padding: var(--gap-sm);
+ background: var(--card);
+ border-radius: var(--card-r);
+ box-shadow: var(--shadow-sm);
+ cursor: pointer;
+ transition: opacity 0.15s;
+}
+.list-item:active { opacity: 0.85; }
+.list-item__icon {
+ width: 44px;
+ height: 44px;
+ border-radius: var(--r-sm);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 22px;
+ flex-shrink: 0;
+}
+.list-item__icon--orange { background: var(--pri-light); }
+.list-item__icon--green { background: var(--success-light); }
+.list-item__icon--blue { background: var(--info-light); }
+.list-item__icon--red { background: var(--danger-light); }
+.list-item__icon--amber { background: var(--warning-light); }
+.list-item__content { flex: 1; min-width: 0; }
+.list-item__title {
+ font-size: var(--font-body);
+ color: var(--tx);
+ font-weight: 500;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.list-item__desc {
+ font-size: var(--font-body-sm);
+ color: var(--tx3);
+ margin-top: 4px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.list-item__right {
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 4px;
+}
+.list-item__arrow {
+ color: var(--tx3);
+ font-size: 14px;
+ margin-left: 4px;
+}
+
+/* ── Menu Item (设置菜单项) ── */
+.menu-item {
+ display: flex;
+ align-items: center;
+ height: 64px;
+ padding: 0 var(--page-pad);
+ background: var(--card);
+ cursor: pointer;
+ border-bottom: 1px solid var(--bd-light);
+}
+.menu-item:active { opacity: 0.85; }
+.menu-item__icon {
+ font-size: 22px;
+ margin-right: var(--gap-sm);
+ width: 28px;
+ text-align: center;
+}
+.menu-item__text {
+ flex: 1;
+ font-size: var(--font-body);
+ color: var(--tx);
+}
+.menu-item__extra {
+ font-size: var(--font-body-sm);
+ color: var(--tx3);
+ margin-right: 8px;
+}
+.menu-item__arrow {
+ color: var(--tx3);
+ font-size: 14px;
+}
+
+/* ── Avatar ── */
+.avatar {
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ background: var(--pri-light);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: var(--font-h1);
+ color: var(--pri);
+ font-weight: 600;
+ flex-shrink: 0;
+}
+.avatar--lg { width: 72px; height: 72px; font-size: 36px; }
+.avatar--sm { width: 36px; height: 36px; font-size: 18px; }
+
+/* ── Divider ── */
+.divider {
+ height: 1px;
+ background: var(--bd-light);
+ margin: var(--gap-sm) 0;
+}
+
+/* ── Section (带标题的内容区) ── */
+.section {
+ margin-bottom: var(--section-gap);
+}
+
+/* ── Quick Entry Grid (快捷入口网格) ── */
+.quick-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: var(--gap-sm);
+}
+.quick-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+ cursor: pointer;
+}
+.quick-item__icon {
+ width: 52px;
+ height: 52px;
+ border-radius: var(--r);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 26px;
+}
+.quick-item__icon--orange { background: var(--pri-light); }
+.quick-item__icon--green { background: var(--success-light); }
+.quick-item__icon--blue { background: var(--info-light); }
+.quick-item__icon--amber { background: var(--warning-light); }
+.quick-item__icon--red { background: var(--danger-light); }
+.quick-item__label {
+ font-size: var(--font-body-sm);
+ color: var(--tx2);
+}
+
+/* ── Banner / Swiper ── */
+.banner {
+ width: 100%;
+ height: 160px;
+ border-radius: var(--card-r);
+ overflow: hidden;
+ background: linear-gradient(135deg, var(--pri) 0%, var(--pri-dark) 100%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: var(--white);
+}
+.banner__content {
+ padding: var(--gap-lg);
+ text-align: center;
+}
+.banner__title {
+ font-size: var(--font-h1);
+ font-weight: 600;
+ margin-bottom: 8px;
+}
+.banner__subtitle {
+ font-size: var(--font-body-sm);
+ opacity: 0.85;
+}
+.banner__dots {
+ display: flex;
+ justify-content: center;
+ gap: 6px;
+ margin-top: var(--gap-sm);
+}
+.banner__dot {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: rgba(255,255,255,0.4);
+}
+.banner__dot--active { background: var(--white); width: 16px; border-radius: 3px; }
+
+/* ── Chat (咨询对话) ── */
+.chat-list { display: flex; flex-direction: column; gap: var(--gap-sm); }
+.chat-bubble {
+ max-width: 75%;
+ padding: var(--gap-sm);
+ border-radius: var(--r-sm);
+ font-size: var(--font-body);
+ line-height: var(--line-height);
+ word-break: break-all;
+}
+.chat-bubble--left {
+ background: var(--card);
+ color: var(--tx);
+ align-self: flex-start;
+ border-bottom-left-radius: 4px;
+}
+.chat-bubble--right {
+ background: var(--pri);
+ color: var(--white);
+ align-self: flex-end;
+ border-bottom-right-radius: 4px;
+}
+.chat-input-bar {
+ display: flex;
+ align-items: center;
+ gap: var(--gap-xs);
+ padding: var(--gap-sm) var(--page-pad);
+ background: var(--card);
+ border-top: 1px solid var(--bd-light);
+ position: sticky;
+ bottom: 0;
+}
+.chat-input-bar__field {
+ flex: 1;
+ height: 40px;
+ border: 1px solid var(--bd);
+ border-radius: var(--r-pill);
+ padding: 0 16px;
+ font-size: var(--font-body);
+ outline: none;
+ font-family: var(--font-family);
+}
+
+/* ── Time / Date display ── */
+.time-label {
+ font-size: var(--font-cap);
+ color: var(--tx3);
+}
+
+/* ── Progress Bar ── */
+.progress {
+ height: 6px;
+ background: var(--bd-light);
+ border-radius: 3px;
+ overflow: hidden;
+}
+.progress__bar {
+ height: 100%;
+ background: var(--pri);
+ border-radius: 3px;
+ transition: width 0.3s;
+}
+
+/* ── Notification Badge ── */
+.badge {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 18px;
+ height: 18px;
+ border-radius: 9px;
+ background: var(--danger);
+ color: var(--white);
+ font-size: 11px;
+ font-weight: 600;
+ padding: 0 5px;
+}
+
+/* ── Chip (小标签) ── */
+.chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ padding: 6px 12px;
+ border-radius: var(--r-sm);
+ font-size: var(--font-body-sm);
+ background: var(--surface-alt);
+ color: var(--tx2);
+}
+
+/* ── Utility ── */
+.text-pri { color: var(--pri); }
+.text-success { color: var(--success); }
+.text-danger { color: var(--danger); }
+.text-warning { color: var(--warning); }
+.text-tx3 { color: var(--tx3); }
+.text-tx2 { color: var(--tx2); }
+.text-center { text-align: center; }
+.text-right { text-align: right; }
+.font-serif { font-family: var(--font-serif); }
+.font-bold { font-weight: 600; }
+.mt-xs { margin-top: var(--gap-xs); }
+.mt-sm { margin-top: var(--gap-sm); }
+.mt-md { margin-top: var(--gap-md); }
+.mt-lg { margin-top: var(--gap-lg); }
+.mb-xs { margin-bottom: var(--gap-xs); }
+.mb-sm { margin-bottom: var(--gap-sm); }
+.mb-md { margin-bottom: var(--gap-md); }
+.mb-lg { margin-bottom: var(--gap-lg); }
+.gap-xs { gap: var(--gap-xs); }
+.gap-sm { gap: var(--gap-sm); }
+.flex-row { display: flex; align-items: center; }
+.flex-between { display: flex; align-items: center; justify-content: space-between; }
+.flex-1 { flex: 1; min-width: 0; }
+.truncate { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
diff --git a/docs/prototypes/mp/shared/frame.css b/docs/prototypes/mp/shared/frame.css
new file mode 100644
index 0000000..877d28f
--- /dev/null
+++ b/docs/prototypes/mp/shared/frame.css
@@ -0,0 +1,243 @@
+/* ============================================
+ HMS 小程序原型 · Phone Frame Simulator
+ 模拟微信小程序外观(375×812 iPhone视口)
+ ============================================ */
+
+* { margin: 0; padding: 0; box-sizing: border-box; }
+
+body {
+ font-family: var(--font-family);
+ font-size: var(--font-body);
+ line-height: var(--line-height);
+ color: var(--tx);
+ background: #E8E2DC;
+ display: flex;
+ justify-content: center;
+ align-items: flex-start;
+ min-height: 100vh;
+ padding: 24px;
+}
+
+/* ── Phone Frame ── */
+.phone {
+ width: 375px;
+ min-height: 812px;
+ background: var(--bg);
+ border-radius: 40px;
+ overflow: hidden;
+ box-shadow: 0 20px 60px rgba(45, 42, 38, 0.25), 0 0 0 1px rgba(45, 42, 38, 0.1);
+ display: flex;
+ flex-direction: column;
+ position: relative;
+}
+
+/* ── Status Bar ── */
+.status-bar {
+ height: 44px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 10px 24px 0;
+ background: var(--card);
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--tx);
+ position: relative;
+ z-index: 20;
+}
+.status-bar__left { width: 54px; }
+.status-bar__center {
+ position: absolute;
+ left: 50%;
+ transform: translateX(-50%);
+ top: 8px;
+ width: 120px;
+ height: 32px;
+ background: #1a1a1a;
+ border-radius: 20px;
+}
+.status-bar__right {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ width: 72px;
+ justify-content: flex-end;
+}
+.status-bar__battery {
+ width: 24px;
+ height: 12px;
+ border: 1.5px solid var(--tx);
+ border-radius: 3px;
+ position: relative;
+}
+.status-bar__battery::after {
+ content: '';
+ position: absolute;
+ right: -4px;
+ top: 3px;
+ width: 2px;
+ height: 4px;
+ background: var(--tx);
+ border-radius: 0 1px 1px 0;
+}
+.status-bar__battery-fill {
+ position: absolute;
+ left: 1.5px;
+ top: 1.5px;
+ bottom: 1.5px;
+ width: 65%;
+ background: var(--tx);
+ border-radius: 1px;
+}
+.status-bar__signal {
+ display: flex;
+ align-items: flex-end;
+ gap: 1.5px;
+ height: 12px;
+}
+.status-bar__bar {
+ width: 3px;
+ background: var(--tx);
+ border-radius: 1px;
+}
+
+/* ── Nav Bar ── */
+.nav-bar {
+ height: 44px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: var(--card);
+ padding: 0 var(--page-pad);
+ position: relative;
+ border-bottom: 0.5px solid var(--bd-light);
+ z-index: 15;
+}
+.nav-bar--bg { background: var(--bg); border-bottom: none; }
+.nav-bar__title {
+ font-size: 17px;
+ font-weight: 600;
+ color: var(--tx);
+}
+.nav-bar__back {
+ position: absolute;
+ left: 8px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 36px;
+ height: 36px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 20px;
+ color: var(--tx);
+ cursor: pointer;
+}
+.nav-bar__home {
+ position: absolute;
+ left: 42px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 36px;
+ height: 36px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 18px;
+ color: var(--tx);
+}
+.nav-bar__actions {
+ position: absolute;
+ right: var(--page-pad);
+ top: 50%;
+ transform: translateY(-50%);
+ display: flex;
+ gap: var(--gap-xs);
+}
+
+/* ── Content Area ── */
+.content {
+ flex: 1;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+/* ── Tab Bar ── */
+.tab-bar {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-around;
+ height: var(--tabbar-safe);
+ padding-top: 6px;
+ padding-bottom: 34px;
+ background: var(--card);
+ border-top: 0.5px solid var(--bd-light);
+ position: relative;
+ z-index: 15;
+}
+.tab-bar__item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 2px;
+ cursor: pointer;
+ min-width: 56px;
+}
+.tab-bar__icon {
+ font-size: 22px;
+ color: var(--tx3);
+ height: 28px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+.tab-bar__label {
+ font-size: 10px;
+ color: var(--tx3);
+}
+.tab-bar__item--active .tab-bar__icon,
+.tab-bar__item--active .tab-bar__label {
+ color: var(--pri);
+}
+
+/* ── Home Indicator ── */
+.home-indicator {
+ position: absolute;
+ bottom: 8px;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 134px;
+ height: 5px;
+ background: var(--tx);
+ border-radius: 3px;
+ opacity: 0.2;
+}
+
+/* ── Page Label (原型标注) ── */
+.page-label {
+ position: fixed;
+ top: 24px;
+ left: 50%;
+ transform: translateX(-50%);
+ background: rgba(45, 42, 38, 0.8);
+ color: white;
+ padding: 6px 16px;
+ border-radius: 20px;
+ font-size: 13px;
+ font-weight: 500;
+ z-index: 100;
+ pointer-events: none;
+ white-space: nowrap;
+}
+
+/* ── Responsive ── */
+@media (max-width: 500px) {
+ body { padding: 0; background: var(--bg); }
+ .phone {
+ width: 100%;
+ min-height: 100vh;
+ border-radius: 0;
+ box-shadow: none;
+ }
+ .page-label { display: none; }
+}
diff --git a/docs/prototypes/mp/shared/tokens.css b/docs/prototypes/mp/shared/tokens.css
new file mode 100644
index 0000000..96fdff5
--- /dev/null
+++ b/docs/prototypes/mp/shared/tokens.css
@@ -0,0 +1,93 @@
+/* ============================================
+ HMS 小程序 Design Tokens
+ 温润东方 · Warm Eastern Design
+ 来源: apps/miniprogram/src/styles/tokens.scss + variables.scss
+ ============================================ */
+
+:root {
+ /* ── Primary · 赤陶橙 ── */
+ --pri: #C4623A;
+ --pri-light: #F0DDD4;
+ --pri-dark: #8B3E1F;
+ --pri-surface: #F5F0EB;
+
+ /* ── Success · 鼠尾草绿 ── */
+ --success: #5B7A5E;
+ --success-light: #E8F0E8;
+ --success-dark: #3D5A40;
+
+ /* ── Surfaces ── */
+ --bg: #F5F0EB;
+ --card: #FFFFFF;
+ --white: #FFFFFF;
+ --surface-alt: #EDE8E2;
+
+ /* ── Text ── */
+ --tx: #2D2A26;
+ --tx2: #5A554F;
+ --tx3: #78716C;
+
+ /* ── Borders ── */
+ --bd: #E8E2DC;
+ --bd-light: #F0EBE5;
+
+ /* ── Semantic ── */
+ --danger: #B54A4A;
+ --danger-light: #FDEAEA;
+ --warning: #C4873A;
+ --warning-light: #FFF3E0;
+ --info: #3B82F6;
+ --info-light: #EFF6FF;
+
+ /* ── Typography Scale (11级) ── */
+ --font-display: 72px;
+ --font-hero: 48px;
+ --font-h1: 28px;
+ --font-h2: 24px;
+ --font-body-lg: 28px;
+ --font-body: 22px;
+ --font-body-sm: 18px;
+ --font-num: 30px;
+ --font-num-lg: 34px;
+ --font-cap: 14px;
+ --font-micro: 12px;
+ --font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+ --font-serif: Georgia, 'Times New Roman', serif;
+ --line-height: 1.5;
+
+ /* ── Spacing ── */
+ --gap-2xs: 4px;
+ --gap-xs: 8px;
+ --gap-sm: 16px;
+ --gap-md: 20px;
+ --section-gap: 28px;
+ --gap-lg: 32px;
+ --gap-xl: 40px;
+ --gap-2xl: 56px;
+ --page-pad: 28px;
+
+ /* ── Radius ── */
+ --r-xs: 8px;
+ --r-sm: 12px;
+ --r: 16px;
+ --r-lg: 20px;
+ --r-pill: 999px;
+
+ /* ── Shadows ── */
+ --shadow-sm: 0 1px 4px rgba(45, 42, 38, 0.04);
+ --shadow-md: 0 2px 12px rgba(45, 42, 38, 0.08);
+ --shadow-lg: 0 8px 32px rgba(45, 42, 38, 0.12);
+
+ /* ── Structural ── */
+ --touch-min: 48px;
+ --btn-h: 56px;
+ --input-h: 56px;
+ --card-pad: 28px;
+ --card-pad-sm: 20px;
+ --card-pad-lg: 32px;
+ --card-r: 12px;
+ --tabbar-h: 56px;
+ --tabbar-safe: 100px;
+ --navbar-h: 44px;
+ --statusbar-h: 44px;
+}
diff --git a/wiki/infrastructure.md b/wiki/infrastructure.md
index fa7d72a..dfd17a8 100644
--- a/wiki/infrastructure.md
+++ b/wiki/infrastructure.md
@@ -1,6 +1,6 @@
---
title: 开发环境
-updated: 2026-05-03
+updated: 2026-05-16
status: stable
tags: [infrastructure, dev-environment, windows, postgresql]
---
@@ -36,6 +36,7 @@ tags: [infrastructure, dev-environment, windows, postgresql]
| 后端 API | `http://localhost:3000/api/v1` | Axum 服务 |
| 前端 SPA | `http://localhost:5174` | Vite 开发服务器 |
| 微信小程序 | 微信开发者工具 | 患者端小程序(`apps/miniprogram/dist/`) |
+| 小程序 H5 调试 | `http://localhost:10086` | 浏览器预览(`apps/miniprogram/dist-h5/`,代理到 `:3000`) |
| Ollama | `http://127.0.0.1:11434` | 本地 AI 推理(qwen3:4b) |
### 登录凭据
@@ -88,8 +89,10 @@ psql: `D:\postgreSQL\bin\psql.exe -U postgres -h localhost -d erp`
|------|------|------|
| AppID/Secret | 环境变量 `ERP__WECHAT__APPID` / `ERP__WECHAT__SECRET` | 微信登录凭据 |
| 加密密钥 | 环境变量 `TARO_APP_ENCRYPTION_KEY` | 小程序本地存储加密密钥 |
-| API URL | `apps/miniprogram/config/index.ts` `defineConstants` | 编译时注入,默认 `http://localhost:3000/api/v1` |
+| API URL | `apps/miniprogram/.env` / `.env.h5` | 小程序用绝对路径 `http://localhost:3000/api/v1`,H5 用相对路径 `/api/v1` |
| 开发者工具 | `apps/miniprogram/project.config.json` | `urlCheck: false`,AppID `wx20f4ef9cc2ec66c5` |
+| H5 入口 | `apps/miniprogram/src/index.html` | HtmlWebpackPlugin 模板,H5 构建必需 |
+| H5 输出 | `apps/miniprogram/dist-h5/` | 与小程序 `dist/` 分离,互不影响 |
> 微信凭据和加密密钥通过环境变量注入,不硬编码在源码中
@@ -122,6 +125,19 @@ cd apps/web && pnpm dev # 开发模式(端口 5174)
cd apps/web && pnpm build # 构建生产版本
```
+### 微信小程序
+
+```bash
+cd apps/miniprogram && pnpm run dev:weapp # 小程序开发模式(微信开发者工具打开 dist/)
+cd apps/miniprogram && pnpm run build:weapp # 小程序生产构建
+cd apps/miniprogram && pnpm run dev:h5 # H5 浏览器预览(端口 10086,推荐调试用)
+cd apps/miniprogram && pnpm run build:h5 # H5 生产构建
+```
+
+> **调试建议:** 日常 UI 开发和页面调试优先用 `dev:h5`(浏览器热更新 + DevTools),完成后在微信开发者工具中做最终验证。H5 模式下微信特有 API(`wx.login`、`Taro.request` 微信登录态等)不可用,但页面布局和交互可完整预览。
+>
+> H5 模式通过 `.env.h5` 将 API URL 设为 `/api/v1`(相对路径),dev server 自动代理到 `localhost:3000`,无需处理 CORS。
+
### 数据库
```bash
diff --git a/wiki/miniprogram.md b/wiki/miniprogram.md
index f274923..085568d 100644
--- a/wiki/miniprogram.md
+++ b/wiki/miniprogram.md
@@ -1,6 +1,6 @@
---
title: 微信小程序(患者端)
-updated: 2026-05-10
+updated: 2026-05-16
status: active
tags: [miniprogram, taro, wechat, patient]
---
@@ -368,10 +368,29 @@ defineConstants: {
### 构建
```bash
-cd apps/miniprogram && pnpm build:weapp # 生产构建
-cd apps/miniprogram && npx taro build --type weapp # 等效
+cd apps/miniprogram && pnpm build:weapp # 小程序生产构建
+cd apps/miniprogram && pnpm run dev:weapp # 小程序开发模式(watch)
+
+# H5 浏览器预览(推荐日常调试用)
+cd apps/miniprogram && pnpm run dev:h5 # 启动 H5 开发服务器 → http://localhost:10086
+cd apps/miniprogram && pnpm run build:h5 # H5 生产构建
```
+### H5 浏览器调试模式
+
+> **推荐调试流程:** 日常 UI 开发 → `dev:h5`(浏览器热更新 + Chrome DevTools) → 完成后微信开发者工具最终验证。
+
+**工作原理:**
+- Taro 编译为 H5(HTML/CSS/JS),通过 webpack-dev-server 在 `localhost:10086` 提供服务
+- `.env.h5` 将 API URL 设为 `/api/v1`(相对路径),dev server 代理到 `localhost:3000`,无 CORS 问题
+- 输出到 `dist-h5/`,与小程序 `dist/` 完全分离
+- `src/index.html` 是 H5 入口模板(HtmlWebpackPlugin 需要)
+
+**限制:**
+- 微信特有 API 不可用(`wx.login`、`Taro.login`、微信支付等)
+- 需要后端服务运行(`localhost:3000`)
+- Sass `@import` 弃用警告可忽略(Dart Sass 3.0 才移除)
+
### 微信开发者工具配置
| 配置项 | 值 | 说明 |