From 5aeb8c60920f72382b57c81b3789b127a941f46a Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Sat, 08 Nov 2025 17:48:20 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/static/images/tabbar/icon_list.png           |    0 
 src/pages.json                                   |   16 
 src/pages/login/index.vue                        |  416 ++++++++++++++-----------
 src/static/images/tabbar/icon_home1.png          |    0 
 src/static/images/tabbar/icon_order_selected.png |    0 
 src/components/WebViewPlus.vue                   |    2 
 src/subPackages/inProgress/index.vue             |    6 
 src/static/images/tabbar/icon_me_selected.png    |    0 
 src/static/images/tabbar/icon_order.png          |    0 
 src/subPackages/droneConsole/index.vue           |   32 +-
 src/subPackages/userDetail/password/index.vue    |  137 ++++++-
 src/subPackages/userDetail/infos/index.vue       |  199 +++++++-----
 src/utils/common/index.js                        |   14 
 /dev/null                                        |    0 
 src/pages/user/index.vue                         |   94 +++--
 src/utils/request/interceptors.js                |    2 
 src/static/images/app-logo.png                   |    0 
 src/static/images/tabbar/icon_me.png             |    0 
 src/manifest.json                                |   10 
 src/static/images/tabbar/icon_home2.png          |    0 
 src/static/images/tabbar/icon_list_selected.png  |    0 
 src/pages/inspectionTask/index.vue               |    2 
 src/static/images/tabbar/icon_home_selected.png  |    0 
 23 files changed, 560 insertions(+), 370 deletions(-)

diff --git a/src/components/WebViewPlus.vue b/src/components/WebViewPlus.vue
index 6e7da46..1d54046 100644
--- a/src/components/WebViewPlus.vue
+++ b/src/components/WebViewPlus.vue
@@ -22,7 +22,7 @@
 function messageFun(e) {
   if (e.data.type === "WEB_INVOKE_APPSERVICE") {
     if (e.data.data.arg.type === "tokenExpired") {
-      return uni.redirectTo({
+      return uni.reLaunch({
         url: "/pages/login/index",
       });
     }
diff --git a/src/manifest.json b/src/manifest.json
index 2aa2971..4788f55 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -58,7 +58,15 @@
                 "dSYMs" : false
             },
             /* SDK配置 */
-            "sdkConfigs" : {}
+            "sdkConfigs" : {},
+            "icons" : {
+                "android" : {
+                    "hdpi" : "src/static/images/app-logo.png",
+                    "xhdpi" : "src/static/images/app-logo.png",
+                    "xxhdpi" : "src/static/images/app-logo.png",
+                    "xxxhdpi" : "src/static/images/app-logo.png"
+                }
+            }
         }
     },
     /* 快应用特有相关 */
diff --git a/src/pages.json b/src/pages.json
index 84e3cd9..49e545b 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -158,14 +158,14 @@
     "backgroundColor": "#ffffff",
     "list": [
       {
-        "iconPath": "static/images/tabbar/icon_home.svg",
-        "selectedIconPath": "static/images/tabbar/icon_home_selected.svg",
+        "iconPath": "static/images/tabbar/icon_home1.png",
+        "selectedIconPath": "static/images/tabbar/icon_home_selected.png",
         "pagePath": "pages/map/index",
         "text": "地图"
       },
       {
-        "iconPath": "static/images/tabbar/icon_list.svg",
-        "selectedIconPath": "static/images/tabbar/icon_list_selected.svg",
+        "iconPath": "static/images/tabbar/icon_list.png",
+        "selectedIconPath": "static/images/tabbar/icon_list_selected.png",
         "pagePath": "pages/inspectionTask/index",
         "text": "任务"
       },
@@ -178,14 +178,14 @@
         "visible": "true"
       },
       {
-        "iconPath": "static/images/tabbar/icon_order.svg",
-        "selectedIconPath": "static/images/tabbar/icon_order_selected.svg",
+        "iconPath": "static/images/tabbar/icon_order.png",
+        "selectedIconPath": "static/images/tabbar/icon_order_selected.png",
         "pagePath": "pages/work/index",
         "text": "工单"
       },
       {
-        "iconPath": "static/images/tabbar/icon_me.svg",
-        "selectedIconPath": "static/images/tabbar/icon_me_selected.svg",
+        "iconPath": "static/images/tabbar/icon_me.png",
+        "selectedIconPath": "static/images/tabbar/icon_me_selected.png",
         "pagePath": "pages/user/index",
         "text": "我的"
       }
diff --git a/src/pages/inspectionTask/index.vue b/src/pages/inspectionTask/index.vue
index 36805e3..10e1007 100644
--- a/src/pages/inspectionTask/index.vue
+++ b/src/pages/inspectionTask/index.vue
@@ -28,7 +28,7 @@
 onShow(() => {
   isApp.value = true
   // 清除数据
-  const encodedData = encodeURIComponent(JSON.stringify({ device_sn: '', latitude: '25.9922904974658', longitude: '114.82299452904442' }))
+  const encodedData = encodeURIComponent(JSON.stringify({ device_sn: '' }))
   uni.setStorageSync('webview_params', encodedData);
   uni.setTabBarItem({
     index: 2, // Tab 的索引(从0开始)
diff --git a/src/pages/login/index.vue b/src/pages/login/index.vue
index 1756d32..4495aca 100644
--- a/src/pages/login/index.vue
+++ b/src/pages/login/index.vue
@@ -1,208 +1,264 @@
 <!-- 登录页 -->
 <template>
-  <view class="login-form-wrap">
-    <img class="logo" src="@/static/images/login/logo.svg" alt=""/>
-    <div class="title">掌控智飞</div>
-    <div class="user-name">
-      <img :src="usernameSvg" alt="">
-      <input
-        v-model="loginForm.username"
-        placeholder="请输入用户名"
-      />
+	<view class="login-form-wrap">
+		<image class="logo" :src="logoSvg" />
+		<div class="title">掌控智飞</div>
+		<div class="user-name">
+			<image :src="usernameSvg" />
+			<input v-model="loginForm.username" placeholder="请输入用户名" />
+		</div>
+		<div class="pass-word">
+			<image :src="passwordSvg" />
+			<input v-model="loginForm.password" type="password" placeholder="请输入密码" />
+		</div>
+		<div class="remember-password">
+			<label>
+				<checkbox-group @change="toggleRemember">
+					<checkbox :checked="rememberPassword" color="#1D6FE9" style="transform:scale(0.7)" />
+				</checkbox-group>
+				记住密码
+			</label>
+		</div>
 
-    </div>
-    <div class="pass-word">
-      <img :src="passwordSvg" alt="">
-      <input
-        v-model="loginForm.password"
-        type="password"
-        placeholder="请输入密码"
-      />
-    </div>
-
-    <button class="login-btn" :style="[inputStyle]" @tap="submit">
-      登录
-    </button>
-
-    <img class="lowerRightCorner" :src="droneSvg" alt=""/>
-  </view>
+		<button class="login-btn" :style="[inputStyle]" @tap="submit">
+			登录
+		</button>
+		
+		<image class="lowerRightCorner" :src="droneSvg" />
+	</view>
 </template>
 
 <script setup>
-import md5 from "js-md5";
-import {loginByUsername} from "@/api/user/index.js";
-import {useUserStore} from "@/store/index.js";
-import droneSvg from '@/static/images/login/droneSvg.svg'
-import usernameSvg from '@/static/images/login/username.svg'
-import passwordSvg from '@/static/images/login/password.svg'
-import {HOME_PATH, LOGIN_PATH, removeQueryString} from "@/router";
+	import md5 from "js-md5";
+	import {
+		loginByUsername
+	} from "@/api/user/index.js";
+	import {
+		useUserStore
+	} from "@/store/index.js";
+	import droneSvg from '@/static/images/login/droneSvg.svg'
+	import usernameSvg from '@/static/images/login/username.svg'
+	import passwordSvg from '@/static/images/login/password.svg'
+	import logoSvg from '@/static/images/login/logo.svg'
+	import {
+		HOME_PATH,
+		LOGIN_PATH,
+		removeQueryString
+	} from "@/router";
+	import { onMounted } from 'vue';
 
-const userStore = useUserStore();
-const loginForm = ref({
-  username: "",
-  password: "",
-});
-const inputStyle = computed(() => {
-  const style = {};
-  if (loginForm.value.username && loginForm.value.password) {
-    style.color = "#fff";
-    style.backgroundColor = '#1D6FE9';
-  }
-  return style;
-});
-let redirect = HOME_PATH;
+	const userStore = useUserStore();
+	const loginForm = ref({
+		username: "",
+		password: "",
+	});
+	const rememberPassword = ref(false);
+	const inputStyle = computed(() => {
+		const style = {};
+		if (loginForm.value.username && loginForm.value.password) {
+			style.color = "#fff";
+			style.backgroundColor = '#1D6FE9';
+		}
+		return style;
+	});
+	let redirect = HOME_PATH;
+	function toggleRemember(e) {
+		rememberPassword.value = e.detail.value.length > 0;
+	}
 
-async function submit() {
-  let userInfo = {
-    tenantId: "000000",
-    deptId: "",
-    roleId: "",
-    username: loginForm.value.username,
-    password: loginForm.value.password,
-    type: "account",
-    code: "",
-    key: "",
-  };
-  loginByUsername(
-    userInfo.tenantId,
-    userInfo.deptId,
-    userInfo.roleId,
-    userInfo.username,
-    md5(userInfo.password),
-    userInfo.type,
-    userInfo.key,
-    userInfo.code
-  ).then((res) => {
-    userStore.setUserInfo(res.data);
-    uni.reLaunch({
-      url: "/pages/user/index",
-    });
-  });
-}
+	async function submit() {
+		let userInfo = {
+			tenantId: "000000",
+			deptId: "",
+			roleId: "",
+			username: loginForm.value.username,
+			password: loginForm.value.password,
+			type: "account",
+			code: "",
+			key: "",
+		};
 
-onLoad((options) => {
-  if (options.redirect && removeQueryString(options.redirect) !== LOGIN_PATH) {
-    redirect = decodeURIComponent(options.redirect);
-  }
-});
+		if (rememberPassword.value) {
+			uni.setStorageSync('rememberedUser', {
+				username: loginForm.value.username,
+				password: loginForm.value.password
+			});
+		} else {
+			uni.removeStorageSync('rememberedUser');
+		}
+		
+		try {
+			const res = await loginByUsername(
+				userInfo.tenantId,
+				userInfo.deptId,
+				userInfo.roleId,
+				userInfo.username,
+				md5(userInfo.password),
+				userInfo.type,
+				userInfo.key,
+				userInfo.code
+			);
+			userStore.setUserInfo(res.data);
+			uni.reLaunch({
+				url: "/pages/user/index",
+			});
+		} catch (error) {
+			const errorMsg =error.data?.error_description !=="Bad credentials" ? error.data?.error_description:  "登录失败,请重试";
+			uni.showToast({
+				title: errorMsg,
+				icon: "none",
+				duration: 2000
+			});
+		}
+	}
+	// 从本地存储加载记住的密码
+	onMounted(() => {
+		const savedUserInfo = uni.getStorageSync('rememberedUser');
+		console.log('记住密码',savedUserInfo)
+		if (savedUserInfo) {
+			loginForm.value.username = savedUserInfo.username;
+			loginForm.value.password = savedUserInfo.password;
+			rememberPassword.value = true;
+		}
+	});
+	onLoad((options) => {
+		if (options.redirect && removeQueryString(options.redirect) !== LOGIN_PATH) {
+			redirect = decodeURIComponent(options.redirect);
+		}
+	});
+	
 </script>
 
 <style lang="scss" scoped>
-.login-form-wrap {
-  position: relative;
-  text-align: center;
-  height: 100%;
-  width: 100%;
+	.login-form-wrap {
+		position: relative;
+		text-align: center;
+		height: 100%;
+		width: 100%;
 
-  .logo {
-    width: 127px;
-    height: 51px;
-    margin: 0 auto;
-    margin-top: 104px;
-    margin-bottom: 16px;
-  }
+		.logo {
+			width: 127px;
+			height: 51px;
+			margin: 0 auto;
+			margin-top: 104px;
+			margin-bottom: 16px;
+		}
 
-  .lowerRightCorner {
-    position: absolute;
-    right: 0;
-    bottom: 0;
-    width: 425.61rpx;
-    height: 316.46rpx;
-  }
+		.lowerRightCorner {
+			position: absolute;
+			right: 0;
+			bottom: 0;
+			width: 425.61rpx;
+			height: 316.46rpx;
+		}
 
-  .title {
-    font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
-    font-weight: 400;
-    font-size: 84rpx;
-    line-height: 82rpx;
-    letter-spacing: 1px;
-    text-shadow: 0px 8px 8px rgba(0, 0, 0, 0.18);
-    text-align: center;
-    font-style: normal;
-    text-transform: none;
-    color: #1452D3;
-    text-align: center;
-    margin-bottom: 168rpx;
-  }
-  .user-name,.pass-word {
-    display: flex;
-    //justify-content: center;
-    align-items: center;
-    margin-left: 62rpx;
-    margin-right: 58rpx;
-    height: 118rpx;
-    border-bottom: 2rpx solid #E3E3E3;
-    img {
-      width: 40rpx;
-      height: 40rpx;
-      margin-right: 12rpx;
-    }
-    :deep(uni-input) {
-      height: 40rpx;
-      line-height: 40rpx;
-      width: 80%;
-      margin-top: 20rpx;
-    }
-    :deep(.uni-input-placeholder) {
-      font-size: 32rpx;
-      color: #E3E3E3;
-      font-weight: 500;
-    }
-    //:deep(.uni-input-input) {
-    //  top: 10px !important;
-    //}
-  }
-  .pass-word {
-  }
+		.title {
+			font-family: YouSheBiaoTiHei, YouSheBiaoTiHei;
+			font-weight: 400;
+			font-size: 84rpx;
+			line-height: 82rpx;
+			letter-spacing: 1px;
+			text-shadow: 0px 8px 8px rgba(0, 0, 0, 0.18);
+			text-align: center;
+			font-style: normal;
+			text-transform: none;
+			color: #1452D3;
+			text-align: center;
+			margin-bottom: 168rpx;
+		}
 
-  input {
-    @apply pb-6rpx mb-10rpx text-left;
-  }
+		.user-name,
+		.pass-word {
+			display: flex;
+			//justify-content: center;
+			align-items: center;
+			margin-left: 62rpx;
+			margin-right: 58rpx;
+			height: 118rpx;
+			border-bottom: 2rpx solid #E3E3E3;
 
-  .tips {
-    @apply mt-8rpx mb-60rpx;
+			image {
+				width: 40rpx;
+				height: 40rpx;
+				margin-right: 12rpx;
+			}
 
-    color: $u-info;
-  }
+			:deep(uni-input) {
+				height: 40rpx;
+				line-height: 40rpx;
+				width: 80%;
+				margin-top: 20rpx;
+			}
 
-  .login-btn {
-    @apply flex items-center justify-center py-12rpx px-0 text-30rpx  border-none;
-    background: #5a93e6;
-    color: white;
-    width: 590rpx;
-    height: 76rpx;
-    border-radius: 40rpx 40rpx 40rpx 40rpx;
-    margin-top: 100rpx;
+			:deep(.uni-input-placeholder) {
+				font-size: 32rpx;
+				color: #E3E3E3;
+				font-weight: 500;
+			}
+		}
 
-    &::after {
-      @apply border-none;
-    }
-  }
+		.remember-password {
+			display: flex;
+			justify-content: flex-end;
+			align-items: center;
+			margin-left: 62rpx;
+			margin-right: 58rpx;
+			margin-top: 20rpx;
+	
+			color: #666;
+			font-size: 28rpx;
+			
+			label {
+				display: flex;
+				align-items: center;
+			}
+		}
 
-  .alternative {
-    @apply flex justify-between mt-30rpx;
+		input {
+			@apply pb-6rpx mb-10rpx text-left;
+		}
 
-    color: $u-tips-color;
-  }
-}
+		.tips {
+			@apply mt-8rpx mb-60rpx;
+			color: $u-info;
+		}
 
-.login-type-wrap {
-  @apply flex justify-between pt-350rpx px-150rpx pb-150rpx;
+		.login-btn {
+			z-index: 1;
+			@apply flex items-center justify-center py-12rpx px-0 text-30rpx border-none;
+			background: #5a93e6;
+			color: white;
+			width: 590rpx;
+			height: 76rpx;
+			border-radius: 40rpx 40rpx 40rpx 40rpx;
+			margin-top: 100rpx;
 
-  .item {
-    @apply flex items-center flex-col text-28rpx;
+			&::after {
+				@apply border-none;
+			}
+		}
 
-    color: $u-content-color;
-  }
-}
+		.alternative {
+			@apply flex justify-between mt-30rpx;
+			color: $u-tips-color;
+		}
+	}
 
-.hint {
-  @apply px-40rpx py-20rpx text-24rpx;
+	.login-type-wrap {
+		@apply flex justify-between pt-350rpx px-150rpx pb-150rpx;
 
-  color: $u-tips-color;
+		.item {
+			@apply flex items-center flex-col text-28rpx;
+			color: $u-content-color;
+		}
+	}
 
-  .link {
-    color: $u-warning;
-  }
-}
-</style>
+	.hint {
+		@apply px-40rpx py-20rpx text-24rpx;
+		color: $u-tips-color;
+
+		.link {
+			color: $u-warning;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/src/pages/user/index.vue b/src/pages/user/index.vue
index 07a9282..74cdcf8 100644
--- a/src/pages/user/index.vue
+++ b/src/pages/user/index.vue
@@ -1,48 +1,48 @@
 <!-- 我的 -->
 <template>
   <view class="page-wrap">
+  <view class="userBox">
+  	<view class="flex items-center pb-30rpx pl-30rpx pr-20rpx">
+  	  <view class="mr-20rpx">
+  	    <u-avatar :src="user.avatar" size="70" />
+  	  </view>
+  	  <view class="flex-1">
+  	    <view class="userName">{{ userStore?.userInfo?.nick_name }}</view>
+  	    <view class="departs">
+  	      <image src="@/static/images/user/mobile.svg" alt="" />
+  	      <span>{{user.deptName}}</span>
+  	    </view>
+  	  </view>
+  	  <view class="rightLogo">
+  	    <image src="@/static/images/user/logo2.png" alt="" />
+  	  </view>
+  	</view>
+  	<view class="personalInformation">
+  	  <div class="message">
+  	    <div class="messagebox">个人信息</div>
+  	    <div class="editInfo" @click="handelEdit(1)">点击编辑
+  	      <image src="@/static/images/user/rightBtn.svg" alt="" />
+  	    </div>
+  	  </div>
+  	  <div class="passwordBox">
+  	    <div class="messagebox">修改密码</div>
+  	    <div class="editInfo" @click="handelEdit(2)">点击编辑 <image src="@/static/images/user/rightBtn.svg" alt="" />
+  	    </div>
+  	  </div>
+  	</view>
 
-    <view class="flex items-center pb-30rpx pl-30rpx pr-20rpx">
-      <view class="mr-20rpx">
-        <u-avatar :src="user.avatar" size="70" />
-      </view>
-      <view class="flex-1">
-        <view class="userName">{{ userStore?.userInfo?.nick_name }}</view>
-        <view class="departs">
-          <img src="/src/static/images/user/mobile.svg" alt="" />
-          <span>{{user.deptName}}</span>
-        </view>
-      </view>
-      <view class="rightLogo">
-        <img src="/src/static/images/user/logo2.png" alt="" />
-      </view>
-    </view>
-    <view class="personalInformation">
-      <div class="message">
-        <div class="messagebox">个人信息</div>
-        <div class="editInfo" @click="handelEdit(1)">点击编辑
-          <img src="/src/static/images/user/rightBtn.svg" alt="" />
-        </div>
-      </div>
-      <div class="passwordBox">
-        <div class="messagebox">修改密码</div>
-        <div class="editInfo" @click="handelEdit(2)">点击编辑 <img src="/src/static/images/user/rightBtn.svg" alt="" />
-        </div>
-      </div>
-    </view>
-
-    <view class="mt-20rpx">
-      <div class="goOutStyle" @click="logOut">退出登录</div>
-    </view>
-    <div class="bottomLogo"><img src="/src/static/images/user/logo1.png" alt="" /></div>
+  	<view class="mt-20rpx">
+  	  <div class="goOutStyle" @click="logOut">退出登录</div>
+  	</view>
+  	<div class="bottomLogo"><image src="@/static/images/user/logo1.png" alt="" /></div>
+  </view>
   </view>
 </template>
 
 <script setup>
   import {
     getUserInfo,
-    updateInfo,
-    updatePassword
+
   } from '@/api/user/index.js';
   import {
     useClipboard
@@ -71,14 +71,14 @@
 
   function logOut() {
     userStore.setUserInfo(null)
-    uni.redirectTo({
+    uni.reLaunch({
       url: '/pages/login/index'
     })
   }
 
   function getDeviceRegion() {
     getDeviceRegionApi().then(res => {
-      // console.log(res.data.data, '用户设备')
+
     })
   }
   const handelEdit = (val) => {
@@ -113,9 +113,10 @@
     width: 100%;
     height: 100%;
 
-    padding-top: 88rpx;
   }
-
+.userBox {
+	 padding-top: 88rpx;
+}
   .userName {
     font-weight: 700;
     font-size: 36rpx;
@@ -127,6 +128,11 @@
     display: flex;
     align-items: center;
     margin-top: 22rpx;
+
+    image {
+      width: 28rpx;
+      height: 28rpx;
+    }
 
     span {
       font-family: "Source Han Sans CN";
@@ -141,7 +147,7 @@
     width: 200rpx;
     height: 80rpx;
 
-    img {
+    image {
       width: 100%;
       height: 100%;
     }
@@ -155,7 +161,7 @@
     margin: 0 auto;
     text-align: center;
 
-    img {
+    image {
       width: 128rpx;
       height: 52rpx;
     }
@@ -203,7 +209,7 @@
         display: flex;
         align-items: center;
 
-        img {
+        image {
           width: 28rpx;
           height: 28rpx;
         }
@@ -211,13 +217,13 @@
     }
 
     .message {
-      background: url('/src/static/images/user/info.png') no-repeat center;
+      background: url(@/static/images/user/info.png) no-repeat center;
       background-size: 100% 100%;
 
     }
 
     .passwordBox {
-      background: url('/src/static/images/user/password.png') no-repeat center;
+      background: url(@/static/images/user/password.png) no-repeat center;
       background-size: 100% 100%;
 
     }
diff --git a/src/static/images/app-logo.png b/src/static/images/app-logo.png
new file mode 100644
index 0000000..13aba38
--- /dev/null
+++ b/src/static/images/app-logo.png
Binary files differ
diff --git a/src/static/images/tabbar/icon_home.png b/src/static/images/tabbar/icon_home.png
deleted file mode 100644
index 2b58239..0000000
--- a/src/static/images/tabbar/icon_home.png
+++ /dev/null
Binary files differ
diff --git a/src/static/images/tabbar/icon_home1.png b/src/static/images/tabbar/icon_home1.png
new file mode 100644
index 0000000..790d1c4
--- /dev/null
+++ b/src/static/images/tabbar/icon_home1.png
Binary files differ
diff --git a/src/static/images/tabbar/icon_home2.png b/src/static/images/tabbar/icon_home2.png
new file mode 100644
index 0000000..ba24413
--- /dev/null
+++ b/src/static/images/tabbar/icon_home2.png
Binary files differ
diff --git a/src/static/images/tabbar/icon_home_selected.png b/src/static/images/tabbar/icon_home_selected.png
index 7533dde..19ecf37 100644
--- a/src/static/images/tabbar/icon_home_selected.png
+++ b/src/static/images/tabbar/icon_home_selected.png
Binary files differ
diff --git a/src/static/images/tabbar/icon_list.png b/src/static/images/tabbar/icon_list.png
index bb5ee04..34c1947 100644
--- a/src/static/images/tabbar/icon_list.png
+++ b/src/static/images/tabbar/icon_list.png
Binary files differ
diff --git a/src/static/images/tabbar/icon_list_selected.png b/src/static/images/tabbar/icon_list_selected.png
index 5cd864c..b98f189 100644
--- a/src/static/images/tabbar/icon_list_selected.png
+++ b/src/static/images/tabbar/icon_list_selected.png
Binary files differ
diff --git a/src/static/images/tabbar/icon_me.png b/src/static/images/tabbar/icon_me.png
index 9b76318..1b2ca05 100644
--- a/src/static/images/tabbar/icon_me.png
+++ b/src/static/images/tabbar/icon_me.png
Binary files differ
diff --git a/src/static/images/tabbar/icon_me_selected.png b/src/static/images/tabbar/icon_me_selected.png
index e4bd23a..6e3ee71 100644
--- a/src/static/images/tabbar/icon_me_selected.png
+++ b/src/static/images/tabbar/icon_me_selected.png
Binary files differ
diff --git a/src/static/images/tabbar/icon_order.png b/src/static/images/tabbar/icon_order.png
new file mode 100644
index 0000000..f3cc671
--- /dev/null
+++ b/src/static/images/tabbar/icon_order.png
Binary files differ
diff --git a/src/static/images/tabbar/icon_order_selected.png b/src/static/images/tabbar/icon_order_selected.png
new file mode 100644
index 0000000..10f4d74
--- /dev/null
+++ b/src/static/images/tabbar/icon_order_selected.png
Binary files differ
diff --git a/src/subPackages/droneConsole/index.vue b/src/subPackages/droneConsole/index.vue
index c357ebc..a745229 100644
--- a/src/subPackages/droneConsole/index.vue
+++ b/src/subPackages/droneConsole/index.vue
@@ -10,12 +10,10 @@
 import dayjs from "dayjs";
 import {useUserStore} from "@/store/index.js";
 
-const wayLineJodInfoId = ref(null)
+const queryParams = ref({})
 
 const viewUrl = computed(() => {
-  return getWebViewUrl('/DroneConsole', {
-    wayLineJodInfoId: wayLineJodInfoId.value,
-  })
+  return getWebViewUrl('/DroneConsole', queryParams.value)
 })
 
 function onPostMessage(data) {
@@ -81,21 +79,23 @@
 }
 
 onLoad((options) => {
-  wayLineJodInfoId.value = options.wayLineJodInfoId
+  queryParams.value = options
 })
 
 
-// onShow(() => {
-//   // #ifdef APP-PLUS
-//   plus.screen.lockOrientation("landscape-primary");
-//   // #endif
-// });
-//
-// onHide(() => {
-//   // #ifdef APP-PLUS
-//   plus.screen.lockOrientation("portrait-primary");
-//   // #endif
-// });
+onShow(() => {
+  // #ifdef APP-PLUS
+  plus.navigator.setFullscreen(true); // 加入全屏
+  plus.screen.lockOrientation("landscape-primary");//横屏
+  // #endif
+});
+
+onHide(() => {
+  // #ifdef APP-PLUS
+  plus.navigator.setFullscreen(false);
+  plus.screen.lockOrientation("portrait-primary");
+  // #endif
+});
 </script>
 <style scoped lang="scss">
 
diff --git a/src/subPackages/inProgress/index.vue b/src/subPackages/inProgress/index.vue
index 93c1705..8de6b29 100644
--- a/src/subPackages/inProgress/index.vue
+++ b/src/subPackages/inProgress/index.vue
@@ -17,7 +17,7 @@
     });
   } else if (data.type === 'control') {
     uni.navigateTo({
-      url: `/subPackages/droneConsole/index?wayLineJodInfoId=${wayLineJodInfoId.value}`
+      url: `/subPackages/droneConsole/index?wayLineJodInfoId=${wayLineJodInfoId.value}&dockSn=${data.dockSn}`
     });
   }
 }
@@ -29,6 +29,10 @@
 
 onShow(function () {
   showComponent.value = true
+  // #ifdef APP-PLUS
+  plus.navigator.setFullscreen(false);
+  plus.screen.lockOrientation("portrait-primary");
+  // #endif
 })
 
 onHide(() =>{
diff --git a/src/subPackages/userDetail/infos/index.vue b/src/subPackages/userDetail/infos/index.vue
index 59eb9ce..39bac58 100644
--- a/src/subPackages/userDetail/infos/index.vue
+++ b/src/subPackages/userDetail/infos/index.vue
@@ -17,7 +17,7 @@
 					<div class="rowTitle">手机号</div>
 					<u-input input-align="right" v-model="userInfo.phone" type="number" placeholder="请输入手机号"
 						class="input-item" />
-				
+
 				</div>
 				<div class="orderRow">
 					<div class="rowTitle">邮箱</div>
@@ -34,13 +34,18 @@
 </template>
 
 <script setup>
-	import {getEnvObj, getWebViewUrl} from "@/utils/index.js";
+	import {
+		getEnvObj,
+		getWebViewUrl
+	} from "@/utils/index.js";
 	import {
 		getUserInfo,
 		updateInfo,
 		updatePassword
 	} from '@/api/user/index.js';
-	import {useUserStore} from "@/store/index.js";
+	import {
+		useUserStore
+	} from "@/store/index.js";
 	const userInfo = ref({
 		id: '',
 		avatar: '',
@@ -56,7 +61,7 @@
 		if (!phone) return true
 		const phoneRegex = /^1[3-9]\d{9}$/
 		if (!phoneRegex.test(phone)) {
-			
+
 			uni.showToast({
 				title: '请输入正确的手机号码',
 				icon: 'none',
@@ -68,10 +73,10 @@
 	}
 	// 校验邮箱
 	const validateEmail = () => {
-		if (!userInfo.value.email) return true 
+		if (!userInfo.value.email) return true
 		const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
 		if (!emailRegex.test(userInfo.value.email)) {
-		
+
 			uni.showToast({
 				title: '请输入正确的邮箱地址',
 				icon: 'none',
@@ -100,76 +105,99 @@
 		getUserInfoData();
 	};
 
-	const {VITE_API_BASE_URL} = getEnvObj()
+	const {
+		VITE_API_BASE_URL
+	} = getEnvObj()
+
 	function uploadUtil(options) {
-	  const {formData, file, url} = options
-	 
-	  return new Promise((resolve, reject) => {
-	    let accessToken = useUserStore()?.$state?.userInfo?.access_token;
-	   
-	    uni.uploadFile({
-	      url: `${VITE_API_BASE_URL}${url}`,
-	      name: 'file',
-	      header: {'Blade-Auth': 'bearer ' + accessToken},
-	      file,
-	      formData,
-	      success: (res) => {
-	        const resData = JSON.parse(res.data)
-	        if (resData.code === 200 || resData.code === 0) {
-	          resolve(res)
-	        } else {
-	          showToast(resData.message)
-			   
-	          reject(res)
-	        }
-	      },
-	      fail: (err) => {
-	        reject(err)
-	      }
-	    });
-	  })
+		const {
+			formData,
+			filePath,
+			url
+		} = options;
+
+		return new Promise((resolve, reject) => {
+			let accessToken = useUserStore()?.$state?.userInfo?.access_token;
+
+			uni.uploadFile({
+				url: `${VITE_API_BASE_URL}${url}`,
+				name: 'file',
+				header: {
+					'Blade-Auth': 'bearer ' + accessToken
+				},
+				filePath: filePath,
+				formData,
+				success: (res) => {
+					const resData = JSON.parse(res.data)
+					if (resData.code === 200 || resData.code === 0) {
+						resolve(res)
+					} else {
+						showToast(resData.message)
+
+						reject(res)
+					}
+				},
+				fail: (err) => {
+					reject(err)
+				}
+			});
+		})
 	}
 	const uploadAvatar = () => {
-	  uni.chooseImage({
-	    count: 1, 
-	    success: (res) => {
-	      const tempFilePaths = res.tempFiles[0];
-	      // 显示加载中
-	      uni.showLoading({
-	        title: '上传中...'
-	      });
-	     
-	      // 上传文件
-	      uploadUtil({
-	        file: tempFilePaths,
-	        formData: {
-	          fileName: tempFilePaths.name, 
-	          sn: 'avatar_upload' 
-	        },
-	        url: '/blade-resource/oss/endpoint/put-file'
-	      }).then(res => {
-	        const resData = JSON.parse(res.data);
-	        if (resData.code === 200 || resData.code === 0) {
-	          // 更新头像显示
-	          userInfo.value.avatar = resData.data.link || resData.data.url;
-	          uni.hideLoading();
-	          uni.showToast({
-	            title: '头像上传成功',
-	            icon: 'success'
-	          });
-	        } else {
-	          throw new Error(resData.message || '上传失败');
-			  
-	        }
-	      }).catch(err => {
-	        uni.hideLoading();
-	        uni.showToast({
-	          title: err.message || '上传失败',
-	          icon: 'none'
-	        });
-	      });
-	    }
-	  });
+		uni.chooseImage({
+			count: 1,
+			success: (res) => {
+				const tempFile = res.tempFiles[0]; // 获取文件对象
+				const filePath = tempFile.path || tempFile.tempFilePath;
+				if (!filePath) {
+					uni.showToast({
+						title: '获取文件路径失败',
+						icon: 'none'
+					});
+					return;
+				}
+				let fileName = tempFile.name;
+				if (!fileName) {
+					const pathWithoutProtocol = filePath.replace(/^file:\/\//, '');
+					fileName = pathWithoutProtocol.split('/').pop() || 'unknown.png';
+				}
+			
+				// 显示加载中
+				uni.showLoading({
+					title: '上传中...'
+				});
+
+				// 上传文件
+				uploadUtil({
+					filePath: filePath, 
+					formData: {
+						fileName: fileName, 
+						sn: 'avatar_upload'
+					},
+					url: '/blade-resource/oss/endpoint/put-file'
+				}).then(res => {
+					const resData = JSON.parse(res.data);
+					if (resData.code === 200 || resData.code === 0) {
+						// 更新头像显示
+						userInfo.value.avatar = resData.data.link || resData.data.url;
+						uni.hideLoading();
+						uni.showToast({
+							title: '头像上传成功',
+							icon: 'success'
+						});
+					} else {
+						throw new Error(resData.message || '上传失败');
+
+					}
+				}).catch(err => {
+					uni.hideLoading();
+					uni.showToast({
+						title: err.message || '上传失败',
+						icon: 'none'
+					});
+				});
+			}
+		});
 	}
 	const submit = () => {
 		if (!validatePhone() || !validateEmail()) return
@@ -181,6 +209,7 @@
 					icon: 'none',
 					duration: 2000
 				});
+					getUserInfoData()
 
 			} else {
 				uni.showToast({
@@ -188,10 +217,11 @@
 					icon: 'none',
 					duration: 2000
 				});
+					getUserInfoData()
 			}
-			
+
 		});
-		getUserInfoData()
+	
 	};
 	onShow(async () => {
 		getUserInfoData()
@@ -200,19 +230,16 @@
 
 <style lang="scss" scoped>
 	.container {
-		width: 100%;	
+		width: 100%;
 		height: 100%;
 		display: flex;
 		flex-direction: column;
 		align-items: center;
-		
-
 	}
-
 	.avatarBox {
 		width: 228rpx;
 		height: 228rpx;
-		margin:76rpx 0;
+		margin: 76rpx 0;
 	}
 
 	.detailBox {
@@ -221,9 +248,11 @@
 		background: #FFFFFF;
 		border-radius: 12rpx;
 		box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
+
 		.detailCon {
 			padding: 0 24rpx;
 		}
+
 		.orderRow {
 			display: flex;
 			justify-content: space-between;
@@ -231,7 +260,7 @@
 			height: 96rpx;
 			border-bottom: 2rpx solid #f5f5f5;
 			color: #7b7b7b;
-			
+
 			.rowTitle {
 				font-family: Source Han Sans CN, Source Han Sans CN;
 				font-weight: 400;
@@ -239,6 +268,7 @@
 				color: #222324;
 				white-space: nowrap;
 			}
+
 			::v-deep .u-input {
 				border: none !important;
 				background: transparent !important;
@@ -259,12 +289,13 @@
 	.btngroup {
 		display: flex;
 		position: absolute;
-		bottom:150rpx;
+		bottom: 150rpx;
 	}
-	.u-button:first-child{
+
+	.u-button:first-child {
 		margin-right: 30rpx;
 	}
-	
+
 	.custom-style {
 		width: 276rpx;
 		height: 76rpx;
diff --git a/src/subPackages/userDetail/password/index.vue b/src/subPackages/userDetail/password/index.vue
index cb72c4b..d8b2c52 100644
--- a/src/subPackages/userDetail/password/index.vue
+++ b/src/subPackages/userDetail/password/index.vue
@@ -6,19 +6,16 @@
 				<div class="orderRow">
 					<!-- type="password" :password-icon="passwordIcon" -->
 					<div class="rowTitle">原始密码</div>
-					<u-input input-align="right" v-model="passwordForm.oldPassword"   placeholder="请输入"
-						class="input-item" />
+					<input type="password" v-model="passwordForm.oldPassword" placeholder="请输入" class="input-item" />
 				</div>
 				<div class="orderRow">
 					<div class="rowTitle">新密码</div>
-					<u-input input-align="right" v-model="passwordForm.newPassword" placeholder="请输入"
-						class="input-item" />
-				
+					<input type="password" v-model="passwordForm.newPassword" placeholder="请输入" class="input-item" />
+
 				</div>
 				<div class="orderRow">
 					<div class="rowTitle">确认密码</div>
-					<u-input input-align="right" v-model="passwordForm.newPassword1"  placeholder="请输入"
-						class="input-item" />
+					<input type="password" v-model="passwordForm.newPassword1" placeholder="请输入" class="input-item" />
 				</div>
 			</div>
 		</view>
@@ -39,16 +36,49 @@
 		updateInfo,
 		updatePassword
 	} from '@/api/user/index.js';
- const passwordIcon={
-      show: 'fas fa-eye',     // 显示密码时的图标
-      hide: 'fas fa-eye-slash' // 隐藏密码时的图标
-    }
+	const passwordIcon = {
+		show: 'fas fa-eye', // 显示密码时的图标
+		hide: 'fas fa-eye-slash' // 隐藏密码时的图标
+	}
 	const userStore = useUserStore();
 	const passwordForm = ref({
 		oldPassword: '',
 		newPassword: '',
 		newPassword1: '',
 	});
+	// 校验密码不能包含中文
+	const validatePasswordNoChinese = (password) => {
+		const chineseRegex = /[\u4e00-\u9fa5]/;
+		if (chineseRegex.test(password)) {
+
+			uni.showToast({
+				title: '密码不能包含中文字符',
+				icon: 'none',
+				duration: 2000
+			});
+			return false;
+		}
+		return true;
+	};
+	// 校验密码复杂度(长度≥6位,包含字母和数字)
+	const validatePasswordStrength = (password) => {
+		if (password.length < 6) {
+
+			uni.showToast({
+				title: '密码长度不能少于6位',
+				icon: 'none',
+				duration: 2000
+			});
+			return false;
+		}
+		// const hasLetter = /[a-zA-Z]/.test(password);
+		// const hasNumber = /\d/.test(password);
+		// if (!hasLetter || !hasNumber) {
+		//   ElMessage.error('密码需同时包含字母和数字');
+		//   return false;
+		// }
+		return true;
+	};
 	const clearForm = () => {
 		passwordForm.value = {
 			oldPassword: '',
@@ -60,7 +90,41 @@
 		clearForm();
 	};
 	const submit = () => {
+		// 原始密码校验
+		if (!passwordForm.value.oldPassword) {
 
+			uni.showToast({
+				title: '请输入原始密码',
+				icon: 'none',
+				duration: 2000
+			});
+			return;
+		}
+		// 中文校验
+		if (!validatePasswordNoChinese(passwordForm.value.newPassword)) return;
+		// 新密码校验
+		if (!passwordForm.value.newPassword) {
+
+			uni.showToast({
+				title: '请输入新密码',
+				icon: 'none',
+				duration: 2000
+			});
+			return;
+		}
+		// 确认密码校验
+		if (passwordForm.value.newPassword !== passwordForm.value.newPassword1) {
+
+			uni.showToast({
+				title: '两次输入的新密码不一致',
+				icon: 'none',
+				duration: 2000
+			});
+			return;
+		}
+
+		// 复杂度校验
+		if (!validatePasswordStrength(passwordForm.value.newPassword)) return;
 		updatePassword(md5(passwordForm.value.oldPassword),
 			md5(passwordForm.value.newPassword),
 			md5(passwordForm.value.newPassword1)).then(res => {
@@ -72,7 +136,8 @@
 				});
 				clearForm();
 				userStore.setUserInfo(null)
-				uni.redirectTo({
+				uni.removeStorageSync('rememberedUser');
+				uni.reLaunch({
 					url: '/pages/login/index'
 				})
 
@@ -103,23 +168,25 @@
 
 	.detailBox {
 		margin-top: 40rpx;
-	width: 702rpx;
+		width: 702rpx;
 
 		min-height: 326rpx;
 		background: #FFFFFF;
 		border-radius: 12rpx;
 		box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
-.detailCon {
+
+		.detailCon {
 			padding: 0 24rpx;
 		}
+
 		.orderRow {
-		display: flex;
-		justify-content: space-between;
-		align-items: center;
-		height: 96rpx;
-		border-bottom: 2rpx solid #f5f5f5;
-		color: #7b7b7b;
-		
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			height: 96rpx;
+			border-bottom: 2rpx solid #f5f5f5;
+			color: #7b7b7b;
+
 
 			.rowTitle {
 				font-family: Source Han Sans CN, Source Han Sans CN;
@@ -128,31 +195,39 @@
 				color: #222324;
 				white-space: nowrap;
 			}
-			::v-deep .u-input {
-				border: none !important;
-				background: transparent !important;
-			}
 
-			::v-deep .u-input__input {
+			input.input-item {
+				text-align: right;
 				border: none !important;
-				box-shadow: none !important;
 				background: transparent !important;
+				box-shadow: none !important;
 				padding: 0 !important;
 				margin: 0 !important;
 				height: auto !important;
+
+				outline: none;
+				font-size: 30rpx;
+				color: #222324;
+				font-family: Source Han Sans CN, Source Han Sans CN;
+			}
+
+			input.input-item::placeholder {
+				color: #c9c9c9;
+				font-size: 30rpx;
 			}
 		}
 	}
 
-.btngroup {
+	.btngroup {
 		display: flex;
 		position: absolute;
-		bottom:150rpx;
+		bottom: 150rpx;
 	}
-	.u-button:first-child{
+
+	.u-button:first-child {
 		margin-right: 30rpx;
 	}
-	
+
 	.custom-style {
 		width: 276rpx;
 		height: 76rpx;
diff --git a/src/utils/common/index.js b/src/utils/common/index.js
index 0cb72d1..c796b03 100644
--- a/src/utils/common/index.js
+++ b/src/utils/common/index.js
@@ -40,7 +40,14 @@
     })
   })
 }
-
+export function getStatusBarHeight() {
+  try {
+    const systemInfo = uni.getSystemInfoSync();
+    return systemInfo.statusBarHeight || 0;
+  } catch (error) {
+    return 0;
+  }
+}
 export function getEnvObj() {
   const envName = JSON.parse(__APP_ENV__?.UNI_CUSTOM_DEFINE||null)?.ENV_NAME
   return configEnv[envName || import.meta.env.VITE_APP_ENV] || {}
@@ -48,10 +55,13 @@
 export function getWebViewUrl (targetUrl, otherParams) {
   const userStore = useUserStore()
   const url = getEnvObj().VITE_APP_WEBVIEW_URL
+  const uniPlatform = __APP_ENV__.UNI_PLATFORM
+  const statusBarHeight = getStatusBarHeight();
   // 1. 处理用户参数
   const userParams = userStore?.userInfo ? JSON.stringify(userStore.userInfo) : '{}'
   // 2. 构建查询参数字符串
-  let queryString = `params=${encodeURIComponent(userParams)}`
+let queryString = `params=${encodeURIComponent(userParams)}&topMargin=${statusBarHeight}&uniPlatform=${uniPlatform}`
+
   // 3. 处理 otherParams 对象
   if (otherParams && typeof otherParams === 'object') {
     Object.keys(otherParams).forEach(key => {
diff --git a/src/utils/request/interceptors.js b/src/utils/request/interceptors.js
index 3c906f0..3c889ae 100644
--- a/src/utils/request/interceptors.js
+++ b/src/utils/request/interceptors.js
@@ -82,7 +82,7 @@
     if (response.statusCode === 401) {
       const pages = getCurrentPages()
       const currentPage = pages[pages.length - 1]
-      uni.redirectTo({
+      uni.reLaunch({
         url: `/pages/login/index?redirect=/${currentPage.route}`
       })
     }

--
Gitblit v1.9.3