From a611c225b17219e873b60888e03c330fbe0c57a4 Mon Sep 17 00:00:00 2001
From: wangrong <wangrong@shsening.com>
Date: 星期一, 19 十月 2026 11:39:56 +0800
Subject: [PATCH] 修改了首页手机号授权

---
 pages/recycle/record.vue                       |   21 +
 uni_modules/cool-ui/static/css/form.scss       |    2 
 pnpm-workspace.yaml                            |    3 
 pages.json                                     |   52 +-
 README.md                                      |    4 
 pages/recycle/appointment.vue                  |   28 +
 pages/recycle/banner.vue                       |    5 
 pnpm-lock.yaml                                 |  179 ++++++++++
 vite.config.ts                                 |   28 +
 pages/recycle/home.vue                         |    7 
 uni_modules/cool-ui/static/css/col.scss        |    6 
 uni_modules/cool-ui/static/iconfont/index.scss |  124 +++++++
 manifest.json                                  |  253 +++++++--------
 static/css/iconfont/index.scss                 |   36 +
 package.json                                   |    1 
 components/phone-auth.vue                      |  193 ++++++++++++
 pages/index/components/tabbar.vue              |    2 
 17 files changed, 748 insertions(+), 196 deletions(-)

diff --git a/README.md b/README.md
index 8df518d..b952bc6 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,10 @@
 #### 鍚姩蹇�
 
 鍩轰簬 `vite`锛屽揩閫熺殑鍐峰惎鍔紝涓嶉渶瑕佺瓑寰呮墦鍖咃紝鍗虫椂鐨勭儹妯″潡鏇存柊锛岀湡姝g殑鎸夐渶缂栬瘧銆�
+pnpm install
+pnpm approve-builds
+绌烘牸閫変腑 esbuild 鍜� vue-demi锛屽洖杞︾‘璁ゃ��
+pnpm add dijkstrajs
 
 #### 寮�鍙戝揩
 
diff --git a/components/phone-auth.vue b/components/phone-auth.vue
new file mode 100644
index 0000000..9747ff1
--- /dev/null
+++ b/components/phone-auth.vue
@@ -0,0 +1,193 @@
+<template>
+	<!-- #ifdef MP-WEIXIN -->
+	<view class="phone-auth" v-if="visible">
+		<view class="phone-auth__mask" @tap="later"></view>
+		<view class="phone-auth__panel">
+			<text class="phone-auth__title">鎺堟潈鎵嬫満鍙�</text>
+			<text class="phone-auth__desc">
+				鍥炴敹銆侀绾︾瓑鍔熻兘闇�瑕佷娇鐢ㄦ偍鐨勬墜鏈哄彿銆傝鎺堟潈鍚庡啀缁х画浣跨敤銆�
+			</text>
+			<button
+				class="phone-auth__btn"
+				open-type="getPhoneNumber"
+				@getphonenumber="onGetPhone"
+			>
+				鐧诲綍骞舵巿鏉冩墜鏈哄彿
+			</button>
+			<view class="phone-auth__later" @tap="later">鏆備笉鎺堟潈</view>
+		</view>
+	</view>
+	<!-- #endif -->
+</template>
+
+<script lang="ts" setup>
+import { computed, ref } from "vue";
+import { onShow } from "@dcloudio/uni-app";
+import { useCool, useStore, useWx } from "/@/cool";
+import { useUi } from "/$/cool-ui";
+
+const authState = ((globalThis as any).__phoneAuthState ||= { dismissed: false });
+
+const { service, router } = useCool();
+const { user } = useStore();
+const wx = useWx();
+const ui = useUi();
+const tick = ref(0);
+const submitting = ref(false);
+
+const visible = computed(() => {
+	tick.value;
+	return !authState.dismissed && !user.info?.phone;
+});
+
+function later() {
+	authState.dismissed = true;
+	tick.value++;
+}
+
+function phonePayload(detail: { code?: string; encryptedData?: string; iv?: string }) {
+	// 鏂扮増鎵嬫満鍙锋寜閽彧杩斿洖鍔ㄦ�佷护鐗岋紝蹇呴』鍘熸牱鎻愪氦锛屼笉鑳芥崲鎴� wx.login 鐨� code
+	if (detail.code && !detail.encryptedData) {
+		return { code: detail.code };
+	}
+	return {
+		encryptedData: detail.encryptedData,
+		iv: detail.iv,
+		code: wx.code.value,
+	};
+}
+
+function enterHome(phone: string) {
+	user.set({
+		...(user.info || {}),
+		phone,
+	});
+	authState.dismissed = true;
+	tick.value++;
+	router.home();
+}
+
+function onGetPhone(e: {
+	detail: { errMsg?: string; code?: string; encryptedData?: string; iv?: string };
+}) {
+	const detail = e.detail || {};
+	const errMsg = detail.errMsg || "";
+	if (errMsg.indexOf("ok") < 0) {
+		ui.showToast("鏈巿鏉冩墜鏈哄彿");
+		return;
+	}
+	if (!detail.code && !detail.encryptedData) {
+		ui.showToast("鏈幏鍙栧埌鎵嬫満鍙�");
+		return;
+	}
+	if (submitting.value) {
+		return;
+	}
+
+	submitting.value = true;
+	ui.showLoading();
+
+	const payload = phonePayload(detail);
+	const task = user.token
+		? service.user.info.miniPhone(payload).then(async (phone: string) => {
+				const info = user.info || (await service.user.info.person());
+				if (info) {
+					user.set({ ...info, phone });
+				}
+				return phone;
+			})
+		: service.user.login.miniPhone(payload).then(async (res) => {
+				user.setToken(res);
+				const info = await service.user.info.person();
+				if (info) {
+					user.set(info);
+				}
+				return info?.phone as string | undefined;
+			});
+
+	task
+		.then((phone) => {
+			ui.hideLoading();
+			submitting.value = false;
+			if (!phone) {
+				ui.showToast("鏈幏鍙栧埌鎵嬫満鍙�");
+				return;
+			}
+			enterHome(phone);
+		})
+		.catch((err) => {
+			ui.hideLoading();
+			submitting.value = false;
+			ui.showToast(err?.message || "鎵嬫満鍙锋巿鏉冨け璐�");
+		});
+}
+
+onShow(() => {
+	tick.value++;
+});
+</script>
+
+<style lang="scss" scoped>
+.phone-auth {
+	position: fixed;
+	top: 0;
+	right: 0;
+	bottom: 0;
+	left: 0;
+	z-index: 10000;
+
+	&__mask {
+		position: absolute;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		background: rgba(0, 0, 0, 0.45);
+	}
+
+	&__panel {
+		position: absolute;
+		left: 48rpx;
+		right: 48rpx;
+		top: 30%;
+		background: #fff;
+		border-radius: 24rpx;
+		padding: 48rpx 40rpx 36rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+	}
+
+	&__title {
+		font-size: 34rpx;
+		font-weight: 600;
+		color: #222;
+	}
+
+	&__desc {
+		margin-top: 20rpx;
+		font-size: 26rpx;
+		line-height: 1.6;
+		color: #666;
+		text-align: center;
+	}
+
+	&__btn {
+		margin-top: 36rpx;
+		width: 100%;
+		height: 84rpx;
+		line-height: 84rpx;
+		border-radius: 42rpx;
+		background: #2ecc71;
+		color: #fff;
+		font-size: 30rpx;
+		border: 0;
+	}
+
+	&__later {
+		margin-top: 24rpx;
+		font-size: 26rpx;
+		color: #999;
+	}
+}
+</style>
diff --git a/manifest.json b/manifest.json
index c5fc6d2..86962f6 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,30 +1,30 @@
 {
-    "name": "鍐嶇敓璧勬簮",
-    "appid": "__UNI__75A96B5",
-    "description": "",
-    "versionName": "1.0.0",
-    "versionCode": 100,
-    "transformPx": false,
-    "app-plus": {
-        "usingComponents": true,
-        "splashscreen": {
-            "alwaysShowBeforeRender": true,
-            "waiting": true,
-            "autoclose": true,
-            "delay": 0
+    "name" : "鍐嶇敓璧勬簮",
+    "appid" : "__UNI__75A96B5",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : 100,
+    "transformPx" : false,
+    "app-plus" : {
+        "usingComponents" : true,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
         },
-        "modules": {
-            "VideoPlayer": {},
-            "Share": {},
-            "Payment": {},
-            "OAuth": {},
-            "Geolocation": {},
-            "Camera": {},
-            "Push": {}
+        "modules" : {
+            "VideoPlayer" : {},
+            "Share" : {},
+            "Payment" : {},
+            "OAuth" : {},
+            "Geolocation" : {},
+            "Camera" : {},
+            "Push" : {}
         },
-        "distribute": {
-            "android": {
-                "permissions": [
+        "distribute" : {
+            "android" : {
+                "permissions" : [
                     "<uses-feature android:name=\"android.hardware.camera\"/>",
                     "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                     "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
@@ -47,151 +47,138 @@
                     "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
                     "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                 ],
-                "abiFilters": [
-                    "armeabi-v7a",
-                    "arm64-v8a",
-                    "x86"
-                ]
+                "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ]
             },
-            "ios": {
-                "capabilities": {
-                    "entitlements": {
-                        "com.apple.developer.associated-domains": []
+            "ios" : {
+                "capabilities" : {
+                    "entitlements" : {
+                        "com.apple.developer.associated-domains" : []
                     }
                 },
-                "idfa": true,
-                "privacyDescription": {
-                    "NSUserTrackingUsageDescription": "璇锋斁蹇冿紝寮�鍚潈闄愪笉浼氳幏鍙栨偍鍦ㄥ叾浠栫珯鐐圭殑闅愮淇℃伅锛岃鏉冮檺浠呯敤浜庢爣璇嗚澶囧苟淇濋殰鏈嶅姟瀹夊叏涓庢彁绀烘祻瑙堜綋楠�"
+                "idfa" : true,
+                "privacyDescription" : {
+                    "NSUserTrackingUsageDescription" : "璇锋斁蹇冿紝寮�鍚潈闄愪笉浼氳幏鍙栨偍鍦ㄥ叾浠栫珯鐐圭殑闅愮淇℃伅锛岃鏉冮檺浠呯敤浜庢爣璇嗚澶囧苟淇濋殰鏈嶅姟瀹夊叏涓庢彁绀烘祻瑙堜綋楠�"
                 },
-                "dSYMs": false
+                "dSYMs" : false
             },
-            "sdkConfigs": {
-                "payment": {
-                    "alipay": {
-                        "__platform__": [
-                            "ios",
-                            "android"
-                        ]
+            "sdkConfigs" : {
+                "payment" : {
+                    "alipay" : {
+                        "__platform__" : [ "ios", "android" ]
                     },
-                    "weixin": {
-                        "__platform__": [
-                            "ios",
-                            "android"
-                        ],
-                        "appid": "wx348f72db1512fa2e",
-                        "UniversalLinks": ""
+                    "weixin" : {
+                        "__platform__" : [ "ios", "android" ],
+                        "appid" : "wx348f72db1512fa2e",
+                        "UniversalLinks" : ""
                     }
                 },
-                "ad": {},
-                "share": {
-                    "weixin": {
-                        "appid": "wx348f72db1512fa2e",
-                        "UniversalLinks": ""
+                "ad" : {},
+                "share" : {
+                    "weixin" : {
+                        "appid" : "wx348f72db1512fa2e",
+                        "UniversalLinks" : ""
                     }
                 },
-                "oauth": {
-                    "weixin": {
-                        "appid": "wx348f72db1512fa2e",
-                        "appsecret": "test",
-                        "UniversalLinks": ""
+                "oauth" : {
+                    "weixin" : {
+                        "appid" : "wx348f72db1512fa2e",
+                        "appsecret" : "test",
+                        "UniversalLinks" : ""
                     },
-                    "apple": {}
+                    "apple" : {}
                 },
-                "geolocation": {
-                    "system": {
-                        "__platform__": [
-                            "ios",
-                            "android"
-                        ]
+                "geolocation" : {
+                    "system" : {
+                        "__platform__" : [ "ios", "android" ]
                     }
                 },
-                "push": {
-                    "unipush": {
-                        "offline": false,
-                        "icons": {
-                            "small": {
-                                "ldpi": ""
+                "push" : {
+                    "unipush" : {
+                        "offline" : false,
+                        "icons" : {
+                            "small" : {
+                                "ldpi" : ""
                             }
                         }
                     }
                 },
-                "maps": {}
+                "maps" : {}
             },
-            "icons": {
-                "android": {
-                    "hdpi": "unpackage/res/icons/72x72.png",
-                    "xhdpi": "unpackage/res/icons/96x96.png",
-                    "xxhdpi": "unpackage/res/icons/144x144.png",
-                    "xxxhdpi": "unpackage/res/icons/192x192.png"
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
                 },
-                "ios": {
-                    "appstore": "unpackage/res/icons/1024x1024.png",
-                    "ipad": {
-                        "app": "unpackage/res/icons/76x76.png",
-                        "app@2x": "unpackage/res/icons/152x152.png",
-                        "notification": "unpackage/res/icons/20x20.png",
-                        "notification@2x": "unpackage/res/icons/40x40.png",
-                        "proapp@2x": "unpackage/res/icons/167x167.png",
-                        "settings": "unpackage/res/icons/29x29.png",
-                        "settings@2x": "unpackage/res/icons/58x58.png",
-                        "spotlight": "unpackage/res/icons/40x40.png",
-                        "spotlight@2x": "unpackage/res/icons/80x80.png"
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
                     },
-                    "iphone": {
-                        "app@2x": "unpackage/res/icons/120x120.png",
-                        "app@3x": "unpackage/res/icons/180x180.png",
-                        "notification@2x": "unpackage/res/icons/40x40.png",
-                        "notification@3x": "unpackage/res/icons/60x60.png",
-                        "settings@2x": "unpackage/res/icons/58x58.png",
-                        "settings@3x": "unpackage/res/icons/87x87.png",
-                        "spotlight@2x": "unpackage/res/icons/80x80.png",
-                        "spotlight@3x": "unpackage/res/icons/120x120.png"
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
                     }
                 }
             },
-            "splashscreen": {
-                "useOriginalMsgbox": true
+            "splashscreen" : {
+                "useOriginalMsgbox" : true
             }
         },
-        "safearea": {
-            "bottom": {
-                "offset": "none"
+        "safearea" : {
+            "bottom" : {
+                "offset" : "none"
             }
         },
-        "uniStatistics": {
-            "enable": true
+        "uniStatistics" : {
+            "enable" : true
         }
     },
-    "quickapp": {},
-    "mp-weixin": {
-        "appid": "wxdebc4de0b5584ca4",
-        "setting": {
-            "urlCheck": true,
-            "es6": false
+    "quickapp" : {},
+    "mp-weixin" : {
+        "appid" : "wx88c344d1b0db243a",
+        "setting" : {
+            "urlCheck" : true,
+            "es6" : false
         },
-        "usingComponents": true
+        "usingComponents" : true
     },
-    "mp-alipay": {
-        "usingComponents": true
+    "mp-alipay" : {
+        "usingComponents" : true
     },
-    "mp-baidu": {
-        "usingComponents": true
+    "mp-baidu" : {
+        "usingComponents" : true
     },
-    "mp-toutiao": {
-        "usingComponents": true
+    "mp-toutiao" : {
+        "usingComponents" : true
     },
-    "uniStatistics": {
-        "enable": false
+    "uniStatistics" : {
+        "enable" : false
     },
-    "vueVersion": "3",
-    "h5": {
-        "router": {
-            "base": "./",
-            "mode": "hash"
+    "vueVersion" : "3",
+    "h5" : {
+        "router" : {
+            "base" : "./",
+            "mode" : "hash"
         },
-        "devServer": {
-            "https": false
+        "devServer" : {
+            "https" : false
         }
     },
-    "locale": "zh-Hans"
-}
\ No newline at end of file
+    "locale" : "zh-Hans"
+}
diff --git a/package.json b/package.json
index c6ff4aa..650a0cd 100644
--- a/package.json
+++ b/package.json
@@ -6,6 +6,7 @@
 		"@dcloudio/uni-app": "3.0.0-3081220230817001",
 		"@hyoga/uni-socket.io": "^3.0.4",
 		"dayjs": "^1.11.13",
+		"dijkstrajs": "^1.0.3",
 		"js-pinyin": "^0.2.5",
 		"lodash-es": "^4.17.21",
 		"md5": "^2.3.0",
diff --git a/pages.json b/pages.json
index aa4c510..e61ec65 100644
--- a/pages.json
+++ b/pages.json
@@ -34,6 +34,27 @@
                 "navigationBarTitleText": "鎴戠殑",
                 "navigationBarTextStyle": "white"
             }
+        },
+        {
+            "path": "pages/recycle/record",
+            "style": {
+                "navigationBarTitleText": "鍥炴敹璁板綍",
+                "enablePullDownRefresh": true
+            }
+        },
+        {
+            "path": "pages/recycle/appointment",
+            "style": {
+                "navigationBarTitleText": "棰勭害鍥炴敹",
+                "enablePullDownRefresh": true
+            }
+        },
+        {
+            "path": "pages/recycle/transfer",
+            "style": {
+                "navigationBarTitleText": "杞禒璁板綍",
+                "enablePullDownRefresh": true
+            }
         }
     ],
     "subPackages": [
@@ -109,32 +130,6 @@
                 }
             ]
         },
-		{
-		    "root": "pages/recycle",
-		    "pages": [
-				{
-				    "path": "record",
-				    "style": {
-				        "navigationBarTitleText": "鍥炴敹璁板綍",
-				        "enablePullDownRefresh": true
-				    }
-				},
-				{
-				    "path": "appointment",
-				    "style": {
-				        "navigationBarTitleText": "棰勭害鍥炴敹",
-				        "enablePullDownRefresh": true
-				    }
-				},
-				{
-				    "path": "transfer",
-				    "style": {
-				        "navigationBarTitleText": "杞禒璁板綍",
-				        "enablePullDownRefresh": true
-				    }
-				}
-		    ]
-		},
         {
             "root": "pages/order",
             "pages": [
@@ -278,26 +273,31 @@
         "list": [
             {
                 "pagePath": "pages/index/home",
+                "text": "棣栭〉",
                 "iconPath": "static/icon/tabbar/home.png",
                 "selectedIconPath": "static/icon/tabbar/home2.png"
             },
 			{
 			    "pagePath": "pages/recycle/home",
+			    "text": "鍥炴敹",
 			    "iconPath": "static/icon/tabbar/recycle.png",
 			    "selectedIconPath": "static/icon/tabbar/recycle2.png"
 			},
             {
                 "pagePath": "pages/index/category",
+                "text": "鍒嗙被",
                 "iconPath": "static/icon/tabbar/category.png",
                 "selectedIconPath": "static/icon/tabbar/category2.png"
             },
             {
                 "pagePath": "pages/index/shopping-cart",
+                "text": "璐墿杞�",
                 "iconPath": "static/icon/tabbar/shopping-cart.png",
                 "selectedIconPath": "static/icon/tabbar/shopping-cart2.png"
             },
             {
                 "pagePath": "pages/index/my",
+                "text": "鎴戠殑",
                 "iconPath": "static/icon/tabbar/my.png",
                 "selectedIconPath": "static/icon/tabbar/my2.png"
             }
diff --git a/pages/index/components/tabbar.vue b/pages/index/components/tabbar.vue
index d290764..a8037d4 100644
--- a/pages/index/components/tabbar.vue
+++ b/pages/index/components/tabbar.vue
@@ -26,12 +26,14 @@
 			</view>
 		</view>
 	</cl-footer>
+	<phone-auth />
 </template>
 
 <script lang="ts" setup>
 import { computed, onMounted, ref } from "vue";
 import { useCool } from "/@/cool";
 import { useShoppingCart } from "/@/hooks";
+import PhoneAuth from "/@/components/phone-auth.vue";
 
 const { router } = useCool();
 const spCart = useShoppingCart();
diff --git a/pages/recycle/appointment.vue b/pages/recycle/appointment.vue
index 0c757f8..ba891c2 100644
--- a/pages/recycle/appointment.vue
+++ b/pages/recycle/appointment.vue
@@ -38,7 +38,7 @@
 					>
 						<view class="card-header">
 							<text class="order-no">鍗曞彿锛歿{ item.appointmentNo }}</text>
-							<text class="status" :class="`status-${item.status}`">
+							<text class="status" :class="statusClass(item.status)">
 								{{ item.status }}
 							</text>
 						</view>
@@ -278,6 +278,20 @@
 ] as const;
 
 type TabValue = (typeof tabs)[number]["value"];
+
+const statusClassMap: Record<string, string> = {
+	寰呭鏍�: "is-review",
+	寰呮帴鍗�: "is-wait",
+	宸叉帴鍗�: "is-accepted",
+	涓婇棬涓�: "is-visiting",
+	宸插畬鎴�: "is-done",
+	宸插彇娑�: "is-cancel",
+	宸查绾�: "is-booked",
+};
+
+function statusClass(status?: string) {
+	return statusClassMap[status || ""] || "";
+}
 
 const activeTab = ref<TabValue>("booked");
 const list = ref<Eps.RecycleAppointmentEntity[]>([]);
@@ -675,21 +689,21 @@
 		background: #f5f5f5;
 		color: #999;
 
-		&.status-寰呭鏍�,
-		&.status-寰呮帴鍗� {
+		&.is-review,
+		&.is-wait {
 			background: #fef5e7;
 			color: #e67e22;
 		}
-		&.status-宸叉帴鍗�,
-		&.status-涓婇棬涓� {
+		&.is-accepted,
+		&.is-visiting {
 			background: #eaf4fc;
 			color: #2980b9;
 		}
-		&.status-宸插畬鎴� {
+		&.is-done {
 			background: #e8f8f0;
 			color: #27ae60;
 		}
-		&.status-宸插彇娑� {
+		&.is-cancel {
 			background: #fef0f0;
 			color: #e74c3c;
 		}
diff --git a/pages/recycle/banner.vue b/pages/recycle/banner.vue
index a3372a8..24b0018 100644
--- a/pages/recycle/banner.vue
+++ b/pages/recycle/banner.vue
@@ -191,7 +191,10 @@
 
 			.dashboard-bg {
 				position: absolute;
-				inset: 0;
+				top: 0;
+				right: 0;
+				bottom: 0;
+				left: 0;
 				background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%);
 				z-index: 0;
 			}
diff --git a/pages/recycle/home.vue b/pages/recycle/home.vue
index e39acee..cded755 100644
--- a/pages/recycle/home.vue
+++ b/pages/recycle/home.vue
@@ -87,6 +87,7 @@
 			</view>
 		</cl-popup>
 	</view>
+	<phone-auth />
 </template>
 
 <script lang="ts" setup>
@@ -95,6 +96,7 @@
 	import { onReady, onShareAppMessage } from "@dcloudio/uni-app";
 
 	import { generateRecycleQrcode } from "/@/cool/utils/qrcode";
+	import PhoneAuth from "/@/components/phone-auth.vue";
 
 
 	const { user } = useStore();
@@ -196,7 +198,10 @@
 
 			.dashboard-bg {
 				position: absolute;
-				inset: 0;
+				top: 0;
+				right: 0;
+				bottom: 0;
+				left: 0;
 				background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%);
 				z-index: 0;
 			}
diff --git a/pages/recycle/record.vue b/pages/recycle/record.vue
index 69b8c26..38b00a8 100644
--- a/pages/recycle/record.vue
+++ b/pages/recycle/record.vue
@@ -36,7 +36,7 @@
 					>
 						<view class="card-header">
 							<text class="order-no">鍗曞彿锛歿{ item.orderNo }}</text>
-							<text class="status" :class="`status-${item.status}`">
+							<text class="status" :class="statusClass(item.status)">
 								{{ item.status }}
 							</text>
 						</view>
@@ -204,6 +204,17 @@
 	}
 }
 
+const statusClassMap: Record<string, string> = {
+	寰呭鐞�: "is-pending",
+	杩涜涓�: "is-doing",
+	宸插畬鎴�: "is-done",
+	宸插彇娑�: "is-cancel",
+};
+
+function statusClass(status?: string) {
+	return statusClassMap[status || ""] || "";
+}
+
 function isExpanded(item: Eps.RecycleOrderEntity) {
 	return !!item.orderNo && expandedOrderNo.value === item.orderNo;
 }
@@ -349,19 +360,19 @@
 			background: #f5f5f5;
 			color: #999;
 
-			&.status-寰呭鐞� {
+			&.is-pending {
 				background: #fef5e7;
 				color: #e67e22;
 			}
-			&.status-杩涜涓� {
+			&.is-doing {
 				background: #eaf4fc;
 				color: #2980b9;
 			}
-			&.status-宸插畬鎴� {
+			&.is-done {
 				background: #e8f8f0;
 				color: #27ae60;
 			}
-			&.status-宸插彇娑� {
+			&.is-cancel {
 				background: #fef0f0;
 				color: #e74c3c;
 			}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8d1bd99..32215c4 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -17,6 +17,9 @@
       dayjs:
         specifier: ^1.11.13
         version: 1.11.13
+      dijkstrajs:
+        specifier: ^1.0.3
+        version: 1.0.3
       js-pinyin:
         specifier: ^0.2.5
         version: 0.2.7
@@ -29,6 +32,9 @@
       pinia:
         specifier: ^2.1.7
         version: 2.3.1(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4))
+      qrcode:
+        specifier: ^1.5.4
+        version: 1.5.4
       vue:
         specifier: ^3.5.13
         version: 3.5.13(typescript@5.5.4)
@@ -41,7 +47,7 @@
     devDependencies:
       '@cool-vue/vite-plugin':
         specifier: ^8.0.3
-        version: 8.0.3
+        version: 8.0.3(debug@4.4.0)
       '@dcloudio/types':
         specifier: ^3.4.14
         version: 3.4.14
@@ -762,6 +768,10 @@
     engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
     hasBin: true
 
+  camelcase@5.3.1:
+    resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+    engines: {node: '>=6'}
+
   caniuse-lite@1.0.30001698:
     resolution: {integrity: sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw==}
 
@@ -771,6 +781,9 @@
   chokidar@3.6.0:
     resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
     engines: {node: '>= 8.10.0'}
+
+  cliui@6.0.0:
+    resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
 
   color-convert@2.0.1:
     resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
@@ -839,9 +852,16 @@
       supports-color:
         optional: true
 
+  decamelize@1.2.0:
+    resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+    engines: {node: '>=0.10.0'}
+
   delayed-stream@1.0.0:
     resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
     engines: {node: '>=0.4.0'}
+
+  dijkstrajs@1.0.3:
+    resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
 
   dom-serializer@2.0.0:
     resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
@@ -903,6 +923,10 @@
     resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
     engines: {node: '>=8'}
 
+  find-up@4.1.0:
+    resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+    engines: {node: '>=8'}
+
   follow-redirects@1.15.9:
     resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
     engines: {node: '>=4.0'}
@@ -942,12 +966,17 @@
     resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
     engines: {node: '>=6.9.0'}
 
+  get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+
   glob-parent@5.1.2:
     resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
     engines: {node: '>= 6'}
 
   glob@10.4.5:
     resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+    deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
     hasBin: true
 
   globals@11.12.0:
@@ -1048,6 +1077,10 @@
     resolution: {integrity: sha512-m4iHVZxFH5734oQcPKU08025gIz2+4bjWR9lulP8ZYxEJR0BpA0w32oJmkzh8y3UI9ci7xCBehQDc3oA1X+VHw==}
     engines: {node: '>=6'}
 
+  locate-path@5.0.0:
+    resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+    engines: {node: '>=8'}
+
   lodash-es@4.17.21:
     resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
 
@@ -1139,8 +1172,24 @@
     resolution: {integrity: sha512-Sv0OvhPiMutICiwORAUefv02DCPb62IelBmo8ZsSrRHyI3FStqIWZvjqDkvtjU+lcujo7UNir+dCwKSqlEQ/5w==}
     engines: {node: '>=10', yarn: ^1.22.4}
 
+  p-limit@2.3.0:
+    resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+    engines: {node: '>=6'}
+
+  p-locate@4.1.0:
+    resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+    engines: {node: '>=8'}
+
+  p-try@2.2.0:
+    resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+    engines: {node: '>=6'}
+
   package-json-from-dist@1.0.1:
     resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+  path-exists@4.0.0:
+    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+    engines: {node: '>=8'}
 
   path-key@3.1.1:
     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
@@ -1172,6 +1221,10 @@
     peerDependenciesMeta:
       typescript:
         optional: true
+
+  pngjs@5.0.0:
+    resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
+    engines: {node: '>=10.13.0'}
 
   postcss-import@14.1.0:
     resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
@@ -1243,6 +1296,11 @@
   proxy-from-env@1.1.0:
     resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
 
+  qrcode@1.5.4:
+    resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+
   queue-microtask@1.2.3:
     resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
 
@@ -1252,6 +1310,13 @@
   readdirp@3.6.0:
     resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
     engines: {node: '>=8.10.0'}
+
+  require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+
+  require-main-filename@2.0.0:
+    resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
 
   resolve@1.22.10:
     resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
@@ -1276,6 +1341,9 @@
   semver@6.3.1:
     resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
     hasBin: true
+
+  set-blocking@2.0.0:
+    resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
 
   shebang-command@2.0.0:
     resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
@@ -1403,6 +1471,7 @@
   vue-i18n@9.1.9:
     resolution: {integrity: sha512-JeRdNVxS2OGp1E+pye5XB6+M6BBkHwAv9C80Q7+kzoMdUDGRna06tjC0vCB/jDX9aWrl5swxOMFcyAr7or8XTA==}
     engines: {node: '>= 10'}
+    deprecated: v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html
     peerDependencies:
       vue: ^3.0.0
 
@@ -1422,10 +1491,17 @@
   weixin-js-sdk@1.6.5:
     resolution: {integrity: sha512-Gph1WAWB2YN/lMOFB/ymb+hbU/wYazzJgu6PMMktCy9cSCeW5wA6Zwt0dpahJbJ+RJEwtTv2x9iIu0U4enuVSQ==}
 
+  which-module@2.0.1:
+    resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
+
   which@2.0.2:
     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
     engines: {node: '>= 8'}
     hasBin: true
+
+  wrap-ansi@6.2.0:
+    resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+    engines: {node: '>=8'}
 
   wrap-ansi@7.0.0:
     resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
@@ -1442,12 +1518,23 @@
   xregexp@3.1.0:
     resolution: {integrity: sha512-4Y1x6DyB8xRoxosooa6PlGWqmmSKatbzhrftZ7Purmm4B8R4qIEJG1A2hZsdz5DhmIqS0msC0I7KEq93GphEVg==}
 
+  y18n@4.0.3:
+    resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
+
   yallist@3.1.1:
     resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
 
   yaml@1.10.2:
     resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
     engines: {node: '>= 6'}
+
+  yargs-parser@18.1.3:
+    resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
+    engines: {node: '>=6'}
+
+  yargs@15.4.1:
+    resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
+    engines: {node: '>=8'}
 
 snapshots:
 
@@ -1555,10 +1642,10 @@
       '@babel/helper-string-parser': 7.25.9
       '@babel/helper-validator-identifier': 7.25.9
 
-  '@cool-vue/vite-plugin@8.0.3':
+  '@cool-vue/vite-plugin@8.0.3(debug@4.4.0)':
     dependencies:
       '@vue/compiler-sfc': 3.5.13
-      axios: 1.7.9
+      axios: 1.7.9(debug@4.4.0)
       glob: 10.4.5
       lodash: 4.17.21
       magic-string: 0.30.17
@@ -2153,9 +2240,9 @@
       postcss: 8.5.1
       postcss-value-parser: 4.2.0
 
-  axios@1.7.9:
+  axios@1.7.9(debug@4.4.0):
     dependencies:
-      follow-redirects: 1.15.9
+      follow-redirects: 1.15.9(debug@4.4.0)
       form-data: 4.0.1
       proxy-from-env: 1.1.0
     transitivePeerDependencies:
@@ -2184,6 +2271,8 @@
       node-releases: 2.0.19
       update-browserslist-db: 1.1.2(browserslist@4.24.4)
 
+  camelcase@5.3.1: {}
+
   caniuse-lite@1.0.30001698: {}
 
   charenc@0.0.2: {}
@@ -2199,6 +2288,12 @@
       readdirp: 3.6.0
     optionalDependencies:
       fsevents: 2.3.3
+
+  cliui@6.0.0:
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 6.2.0
 
   color-convert@2.0.1:
     dependencies:
@@ -2258,7 +2353,11 @@
     dependencies:
       ms: 2.1.3
 
+  decamelize@1.2.0: {}
+
   delayed-stream@1.0.0: {}
+
+  dijkstrajs@1.0.3: {}
 
   dom-serializer@2.0.0:
     dependencies:
@@ -2361,7 +2460,14 @@
     dependencies:
       to-regex-range: 5.0.1
 
-  follow-redirects@1.15.9: {}
+  find-up@4.1.0:
+    dependencies:
+      locate-path: 5.0.0
+      path-exists: 4.0.0
+
+  follow-redirects@1.15.9(debug@4.4.0):
+    optionalDependencies:
+      debug: 4.4.0
 
   foreground-child@3.3.0:
     dependencies:
@@ -2392,6 +2498,8 @@
       loader-utils: 3.3.1
 
   gensync@1.0.0-beta.2: {}
+
+  get-caller-file@2.0.5: {}
 
   glob-parent@5.1.2:
     dependencies:
@@ -2478,6 +2586,10 @@
 
   localstorage-polyfill@1.0.1: {}
 
+  locate-path@5.0.0:
+    dependencies:
+      p-locate: 4.1.0
+
   lodash-es@4.17.21: {}
 
   lodash.camelcase@4.3.0: {}
@@ -2551,7 +2663,19 @@
     dependencies:
       lcid: 3.1.1
 
+  p-limit@2.3.0:
+    dependencies:
+      p-try: 2.2.0
+
+  p-locate@4.1.0:
+    dependencies:
+      p-limit: 2.3.0
+
+  p-try@2.2.0: {}
+
   package-json-from-dist@1.0.1: {}
+
+  path-exists@4.0.0: {}
 
   path-key@3.1.1: {}
 
@@ -2577,6 +2701,8 @@
       typescript: 5.5.4
     transitivePeerDependencies:
       - '@vue/composition-api'
+
+  pngjs@5.0.0: {}
 
   postcss-import@14.1.0(postcss@8.5.1):
     dependencies:
@@ -2647,6 +2773,12 @@
 
   proxy-from-env@1.1.0: {}
 
+  qrcode@1.5.4:
+    dependencies:
+      dijkstrajs: 1.0.3
+      pngjs: 5.0.0
+      yargs: 15.4.1
+
   queue-microtask@1.2.3: {}
 
   read-cache@1.0.0:
@@ -2656,6 +2788,10 @@
   readdirp@3.6.0:
     dependencies:
       picomatch: 2.3.1
+
+  require-directory@2.1.1: {}
+
+  require-main-filename@2.0.0: {}
 
   resolve@1.22.10:
     dependencies:
@@ -2697,6 +2833,8 @@
   safe-area-insets@1.4.1: {}
 
   semver@6.3.1: {}
+
+  set-blocking@2.0.0: {}
 
   shebang-command@2.0.0:
     dependencies:
@@ -2804,9 +2942,17 @@
 
   weixin-js-sdk@1.6.5: {}
 
+  which-module@2.0.1: {}
+
   which@2.0.2:
     dependencies:
       isexe: 2.0.0
+
+  wrap-ansi@6.2.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
 
   wrap-ansi@7.0.0:
     dependencies:
@@ -2824,6 +2970,27 @@
 
   xregexp@3.1.0: {}
 
+  y18n@4.0.3: {}
+
   yallist@3.1.1: {}
 
   yaml@1.10.2: {}
+
+  yargs-parser@18.1.3:
+    dependencies:
+      camelcase: 5.3.1
+      decamelize: 1.2.0
+
+  yargs@15.4.1:
+    dependencies:
+      cliui: 6.0.0
+      decamelize: 1.2.0
+      find-up: 4.1.0
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      require-main-filename: 2.0.0
+      set-blocking: 2.0.0
+      string-width: 4.2.3
+      which-module: 2.0.1
+      y18n: 4.0.3
+      yargs-parser: 18.1.3
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 0000000..a23eae0
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,3 @@
+allowBuilds:
+  esbuild: true
+  vue-demi: true
diff --git a/static/css/iconfont/index.scss b/static/css/iconfont/index.scss
index dc00689..70205ab 100644
--- a/static/css/iconfont/index.scss
+++ b/static/css/iconfont/index.scss
@@ -1,12 +1,38 @@
 @font-face {
 	font-family: "shop-iconfont"; /* Project id 1805670 */
-	src:
-		url("font.woff2") format("woff2"),
-		url("font.woff") format("woff"),
-		url("font.ttf") format("truetype");
+	src: url("font.woff2") format("woff2");
 }
 
-[class*="shop-icon-"] {
+.shop-icon-list:before,
+.shop-icon-list2:before,
+.shop-icon-order-close:before,
+.shop-icon-order-success:before,
+.shop-icon-order-comment:before,
+.shop-icon-order-received:before,
+.shop-icon-order-paid:before,
+.shop-icon-order-not-shipped:before,
+.shop-icon-order-refund:before,
+.shop-icon-order-received2:before,
+.shop-icon-zoom:before,
+.shop-icon-sku:before,
+.shop-icon-set:before,
+.shop-icon-home:before,
+.shop-icon-shopping-cart:before,
+.shop-icon-more:before,
+.shop-icon-q-order:before,
+.shop-icon-q-pay:before,
+.shop-icon-q-refund:before,
+.shop-icon-q-logistics:before,
+.shop-icon-setting:before,
+.shop-icon-coupon:before,
+.shop-icon-order:before,
+.shop-icon-location:before,
+.shop-icon-filter:before,
+.shop-icon-message:before,
+.shop-icon-delete:before,
+.shop-icon-sort:before,
+.shop-icon-search:before,
+.shop-icon-custom:before {
 	font-family: "shop-iconfont";
 	font-size: inherit;
 	font-style: normal;
diff --git a/uni_modules/cool-ui/static/css/col.scss b/uni_modules/cool-ui/static/css/col.scss
index d07c421..743b1c0 100644
--- a/uni_modules/cool-ui/static/css/col.scss
+++ b/uni_modules/cool-ui/static/css/col.scss
@@ -2,17 +2,13 @@
 
 .cl-col {
 	width: 100%;
+	float: left;
 	box-sizing: border-box;
 
 	&::before {
 		content: "";
 		display: block;
 	}
-}
-
-[class*="cl-col-"] {
-	float: left;
-	box-sizing: border-box;
 }
 
 .cl-col-0 {
diff --git a/uni_modules/cool-ui/static/css/form.scss b/uni_modules/cool-ui/static/css/form.scss
index ec1418b..a2ff115 100644
--- a/uni_modules/cool-ui/static/css/form.scss
+++ b/uni_modules/cool-ui/static/css/form.scss
@@ -7,7 +7,7 @@
 
 		&.is-required {
 			.cl-form-item__label::after {
-				content: "*";
+				content: "\\002a";
 				color: $cl-color-error;
 				margin-left: 6rpx;
 			}
diff --git a/uni_modules/cool-ui/static/iconfont/index.scss b/uni_modules/cool-ui/static/iconfont/index.scss
index d46115f..fc769db 100644
--- a/uni_modules/cool-ui/static/iconfont/index.scss
+++ b/uni_modules/cool-ui/static/iconfont/index.scss
@@ -1,17 +1,129 @@
 @import "./iconfont.scss";
 
-@font-face {
+.cl-icon-tab-home:before,
+.cl-icon-tab-my:before,
+.cl-icon-image:before,
+.cl-icon-map:before,
+.cl-icon-sound:before,
+.cl-icon-mute:before,
+.cl-icon-set:before,
+.cl-icon-calendar:before,
+.cl-icon-delete:before,
+.cl-icon-order-refund:before,
+.cl-icon-order-paid:before,
+.cl-icon-exit:before,
+.cl-icon-folder:before,
+.cl-icon-qrcode:before,
+.cl-icon-msg:before,
+.cl-icon-order-received:before,
+.cl-icon-order-not-shipped:before,
+.cl-icon-app:before,
+.cl-icon-payment:before,
+.cl-icon-face-auth:before,
+.cl-icon-bill:before,
+.cl-icon-phone:before,
+.cl-icon-loading:before,
+.cl-icon-home:before,
+.cl-icon-pause:before,
+.cl-icon-amount-fill:before,
+.cl-icon-wallet-fill:before,
+.cl-icon-doc-fill:before,
+.cl-icon-good-fill:before,
+.cl-icon-camera-fill:before,
+.cl-icon-mail-fill:before,
+.cl-icon-bank-card-fill:before,
+.cl-icon-relay-fill:before,
+.cl-icon-comment-fill:before,
+.cl-icon-share:before,
+.cl-icon-link:before,
+.cl-icon-back:before,
+.cl-icon-enter:before,
+.cl-icon-top:before,
+.cl-icon-upgrade:before,
+.cl-icon-rise:before,
+.cl-icon-decline:before,
+.cl-icon-active:before,
+.cl-icon-shrink:before,
+.cl-icon-cropper:before,
+.cl-icon-fullscreen:before,
+.cl-icon-enlarge:before,
+.cl-icon-chart-pie:before,
+.cl-icon-warning:before,
+.cl-icon-arrow-double-left:before,
+.cl-icon-arrow-double-right:before,
+.cl-icon-like-fill:before,
+.cl-icon-like:before,
+.cl-icon-my:before,
+.cl-icon-eye-open:before,
+.cl-icon-friend:before,
+.cl-icon-eye-close:before,
+.cl-icon-cloud-download:before,
+.cl-icon-cloud-upload:before,
+.cl-icon-chart-bar:before,
+.cl-icon-clock-fill:before,
+.cl-icon-favor-fill:before,
+.cl-icon-help-fill:before,
+.cl-icon-history-fill:before,
+.cl-icon-smile-fill:before,
+.cl-icon-success-fill:before,
+.cl-icon-location-fill:before,
+.cl-icon-prompt-fill:before,
+.cl-icon-meh-fill:before,
+.cl-icon-cry-fill:before,
+.cl-icon-delete-fill:before,
+.cl-icon-stop:before,
+.cl-icon-play:before,
+.cl-icon-more:before,
+.cl-icon-back-top:before,
+.cl-icon-location:before,
+.cl-icon-keyboard-9:before,
+.cl-icon-keyboard-26:before,
+.cl-icon-customer-service:before,
+.cl-icon-edit:before,
+.cl-icon-scan:before,
+.cl-icon-pay:before,
+.cl-icon-warning-border:before,
+.cl-icon-time:before,
+.cl-icon-meh:before,
+.cl-icon-cry:before,
+.cl-icon-smile:before,
+.cl-icon-refresh:before,
+.cl-icon-plus-border:before,
+.cl-icon-minus-border:before,
+.cl-icon-check-border:before,
+.cl-icon-close-border:before,
+.cl-icon-help-border:before,
+.cl-icon-caret-bottom:before,
+.cl-icon-caret-top:before,
+.cl-icon-toast-warning:before,
+.cl-icon-notification:before,
+.cl-icon-notification-fill:before,
+.cl-icon-arrow-bottom:before,
+.cl-icon-arrow-top:before,
+.cl-icon-toast-waiting:before,
+.cl-icon-toast-success:before,
+.cl-icon-toast-error:before,
+.cl-icon-arrow-left:before,
+.cl-icon-arrow-right:before,
+.cl-icon-plus:before,
+.cl-icon-minus:before,
+.cl-icon-check:before,
+.cl-icon-close:before,
+.cl-icon-search:before {
 	font-family: "cl-iconfont";
-	src: url("uni_modules/cool-ui/static/iconfont/iconfont.woff2") format("woff2"),
-		url("uni_modules/cool-ui/static/iconfont/iconfont.woff") format("woff"),
-		url("uni_modules/cool-ui/static/iconfont/iconfont.ttf") format("truetype");
+	font-style: normal;
+	line-height: 1;
 }
 
-[class*="cl-icon-"] {
+@font-face {
+	font-family: "cl-iconfont";
+	src: url("uni_modules/cool-ui/static/iconfont/iconfont.woff2") format("woff2");
+}
+
+.cl-icon {
 	font-family: "cl-iconfont" !important;
 	font-size: inherit;
 	font-style: normal;
 	-webkit-font-smoothing: antialiased;
-	-moz-osx-font-smoothing: grayscale;
 	line-height: 1;
 }
diff --git a/vite.config.ts b/vite.config.ts
index 0570ab8..a2577a9 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,8 +1,35 @@
 import uni from "@dcloudio/vite-plugin-uni"; // 锛佹渚濊禆涓嶈兘瀹夎
+import fs from "fs";
 import path from "path";
 import { defineConfig } from "vite";
 import { cool } from "@cool-vue/vite-plugin";
 import { proxy } from "./config/proxy";
+
+// 寰俊 WXSS 鍗曡杩囬暱浼氱紪璇戝け璐ャ�傚浘鏍囧瓧浣撹嫢鍚屾椂鍐呰仈 woff2/woff/ttf锛屼細瓒呰繃闄愬埗銆�
+function shortenMpWeixinFonts() {
+	return {
+		name: "mp-weixin-shorten-fonts",
+		enforce: "post" as const,
+		closeBundle() {
+			const dirs = ["unpackage/dist/dev/mp-weixin", "unpackage/dist/build/mp-weixin"];
+			for (const dir of dirs) {
+				const file = path.resolve(__dirname, dir, "app.wxss");
+				if (!fs.existsSync(file)) continue;
+				const css = fs.readFileSync(file, "utf8");
+				const next = css.replace(
+					/src:\s*url\("data:font\/woff2;base64,[^"]+"\)\s*format\("woff2"\)\s*,\s*url\("data:font\/woff;base64,[^"]+"\)\s*format\("woff"\)\s*,\s*url\("data:font\/ttf;base64,[^"]+"\)\s*format\("truetype"\)/g,
+					(block) => {
+						const woff2 = block.match(
+							/url\("data:font\/woff2;base64,[^"]+"\)\s*format\("woff2"\)/
+						);
+						return woff2 ? `src: ${woff2[0]}` : block;
+					}
+				);
+				if (next !== css) fs.writeFileSync(file, next);
+			}
+		},
+	};
+}
 
 function resolve(dir: string) {
 	return path.resolve(__dirname, dir);
@@ -18,6 +45,7 @@
 				type: "app",
 				proxy,
 			}),
+			shortenMpWeixinFonts(),
 		],
 		server: {
 			port: 9900,

--
Gitblit v1.9.1