From e3c2cd23253f3501be7d31e03955fbb6f4aa3556 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Fri, 15 May 2026 16:30:04 +0800
Subject: [PATCH] Merge branch 'refs/heads/feature/v9.0/9.0.4' into prod

---
 src/pages/map/index.vue                         |   18 
 src/subPackages/downloadPage/index.vue          |   13 
 src/pages.json                                  |    8 
 src/pages/login/index.vue                       |   65 ++
 src/subPackages/taskDetail/execution/index.vue  |   13 
 src/subPackages/inspectionTask/taskDetails.vue  |    3 
 src/components/WebViewPlus.vue                  |   78 +++
 src/subPackages/droneConsole/index.vue          |   17 
 src/subPackages/taskDetail/addTask/index.vue    |   11 
 src/subPackages/userDetail/password/index.vue   |   35 +
 README.md                                       |  111 +++++
 src/subPackages/userDetail/infos/index.vue      |  577 ++++++++++++++-------------
 src/config/env.js                               |   15 
 src/pages/user/index.vue                        |    2 
 src/subPackages/taskDetail/inProgress/index.vue |    2 
 src/subPackages/workDetail/mapWork/index.vue    |   16 
 src/subPackages/workDetail/addWork/index.vue    |   14 
 src/manifest.json                               |   14 
 src/subPackages/qrCode/index.vue                |   14 
 src/pages/work/index.vue                        |   15 
 src/components/GetPrivacy.vue                   |  199 +++++++++
 21 files changed, 822 insertions(+), 418 deletions(-)

diff --git a/README.md b/README.md
index 5adcafd..6e203f8 100644
--- a/README.md
+++ b/README.md
@@ -19,10 +19,121 @@
 /software/service/drone/web/drone-app
 正式
 /app/service/drone/web/drone-app
+
 # app更新步骤
 
 修改 /src/config 里面的development的参数,改为对应环境的对应变量
 
+# 小程序app更新步骤
+
+1. 修改 /src/config 里面的development的参数,改为对应环境的对应变量
+2. hbuild里面点击运行 =》到小程序 =》自动打开了小程序 =》 
+3. 调试好=》上传 =》[微信公众号](https://mp.weixin.qq.com/) =》 提交审核
+
+# 开发者文档
+
+
+
+- 本项目大量采用webview方式开发,只有登录页是原生的uniapp,其他的都是webview
+- 登录了之后在userStore里面存了用户信息(包括token)
+- 每个页面都会走WebViewPlus组件
+- WebViewPlus里面有个属性src都会走getWebViewUrl方法
+- WebViewPlus会监听webview发送给app的消息,统一处理
+- getWebViewUrl方法里面 会把 路径自动拼接上userInfo(包括token)和一些其他参数
+
+- 然后到webview这里的 permission.js会去自动接收这些参数并存储到stroe里面
+
+webview跟app通信
+
+h5或app的webview
+
+```
+webview
+const transmitData = { data: { type: 'submitSuccess', fun: 'add' } }
+uni.postMessage(transmitData)
+
+app 接收到了 然后再跳页面
+
+uni.switchTab({
+      url: `/pages/work/index?addLog=111`,
+});
+```
+
+微信小程序的webview 只能在微信里面直接跳,postMessage无效
+
+```
+webview
+
+// 跳转到小程序页面
+wx.miniProgram.navigateTo({ url: '/pages/xxx/xxx' })
+ 
+// 重定向到小程序页面
+wx.miniProgram.redirectTo({ url: '/pages/xxx/xxx' })
+ 
+// 切换Tab页
+wx.miniProgram.switchTab({ url: '/pages/xxx/xxx' })
+ 
+// 返回上一页
+wx.miniProgram.navigateBack({ delta: 1 })
+ 
+// 退出小程序
+wx.miniProgram.exit()
+ 
+// 获取小程序环境信息
+wx.miniProgram.getEnv(function(res) {
+  console.log(res.miniprogram) // true
+})
+
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 
 
 
diff --git a/src/components/GetPrivacy.vue b/src/components/GetPrivacy.vue
new file mode 100644
index 0000000..8ab4609
--- /dev/null
+++ b/src/components/GetPrivacy.vue
@@ -0,0 +1,199 @@
+<template>
+  <view v-if="showPrivacy" :class="privacyClass">
+    <view :class="contentClass">
+      <view class="title">用户隐私保护指引</view>
+      <view class="des">
+        感谢您选择使用掌控智飞小程序,我们非常重视您的个人信息安全和隐私保护。使用我们的产品前,请您仔细阅读“
+        <text class="link" @tap="openPrivacyContract">{{privacyContractName}} </text>”,
+        如您同意此隐私保护指引,请点击同意按钮,开始使用此小程序,我们将尽全力保护您的个人信息及合法权益,感谢您的信任!<br />
+      </view>
+      <view class="btns">
+        <button class="item reject" @click="exitMiniProgram">拒绝</button>
+        <button id="agree-btn" class="item agree" open-type="agreePrivacyAuthorization"
+                @agreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref, computed, onMounted } from 'vue';
+
+const props = defineProps({
+  position: {
+    type: String,
+    default: 'center'
+  }
+});
+
+const emit = defineEmits(['allowPrivacy']);
+
+const isRead = ref(false);
+const showPrivacy = ref(false);
+const privacyContractName = ref('');
+const resolvePrivacyAuthorization = ref(null);
+
+const privacyClass = computed(() => {
+  return props.position === 'bottom' ? 'privacy privacy-bottom' : 'privacy';
+});
+
+const contentClass = computed(() => {
+  return props.position === 'bottom' ? 'content content-bottom' : 'content';
+});
+
+onMounted(() => {
+  if (uni.onNeedPrivacyAuthorization) {
+    uni.onNeedPrivacyAuthorization((resolve) => {
+      resolvePrivacyAuthorization.value = resolve;
+    });
+  }
+
+  if (uni.getPrivacySetting) {
+    uni.getPrivacySetting({
+      success: (res) => {
+        if (res.needAuthorization) {
+          privacyContractName.value = res.privacyContractName;
+          showPrivacy.value = true;
+        } else {
+          console.log('已经同意隐私授权,不需要再次授权')
+          showPrivacy.value = false;
+        }
+      },
+    });
+  }
+});
+
+const openPrivacyContract = () => {
+  uni.openPrivacyContract({
+    success: () => {
+      isRead.value = true;
+    },
+    fail: () => {
+      uni.showToast({
+        title: '遇到错误',
+        icon: 'error',
+      });
+    },
+  });
+};
+
+const exitMiniProgram = () => {
+  wx.exitMiniProgram();
+};
+
+const handleAgreePrivacyAuthorization = () => {
+  showPrivacy.value = false;
+  emit('allowPrivacy');
+  if (typeof resolvePrivacyAuthorization.value === 'function') {
+    resolvePrivacyAuthorization.value({
+      buttonId: 'agree-btn',
+      event: 'agree',
+    });
+  }
+};
+
+const closePrivacy = () => {
+  showPrivacy.value = false;
+};
+
+// 暴露给父组件使用
+defineExpose({
+  closePrivacy
+});
+</script>
+
+<style scoped>
+.privacy {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  background: rgba(0, 0, 0, .5);
+  z-index: 9999999;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.privacy-bottom {
+  align-items: flex-end;
+}
+
+.content {
+  width: 632rpx;
+  padding: 48rpx;
+  box-sizing: border-box;
+  background: #fff;
+  border-radius: 16rpx;
+}
+
+.content-bottom {
+  position: absolute;
+  bottom: 0;
+  width: 96%;
+  padding: 36rpx;
+  border-radius: 16rpx 16rpx 0 0;
+}
+
+.content .title {
+  text-align: center;
+  color: #333;
+  font-weight: bold;
+  font-size: 32rpx;
+}
+
+.content .des {
+  font-size: 26rpx;
+  color: #666;
+  margin-top: 40rpx;
+  text-align: justify;
+  line-height: 1.6;
+}
+
+.content .des .link {
+  color: #1989ff;
+  text-decoration: underline;
+}
+
+.btns {
+  margin-top: 48rpx;
+  margin-bottom: 12rpx;
+  display: flex;
+}
+
+.btns .item {
+  width: 200rpx;
+  height: 72rpx;
+  overflow: visible;
+  display: flex;
+  align-items: center;
+
+  justify-content: center;
+  /* border-radius: 16rpx; */
+  box-sizing: border-box;
+  border: none !important;
+}
+
+.btns .reject {
+  background: #f4f4f5;
+  color: #1989ff;
+  font-size: 14px;
+  background: #edf5fe;
+  font-weight: 300;
+  margin-right: 16rpx;
+}
+
+.btns .agree {
+  width: 200rpx;
+  background: #1989ff;
+  color: #fff;
+  font-size: 16px;
+
+}
+
+.privacy-bottom .btns .agree {
+  width: 440rpx;
+
+}
+</style>
diff --git a/src/components/WebViewPlus.vue b/src/components/WebViewPlus.vue
index a6ca687..d7506f0 100644
--- a/src/components/WebViewPlus.vue
+++ b/src/components/WebViewPlus.vue
@@ -22,14 +22,82 @@
 }
 
 // WEB_INVOKE_APPSERVICE
+
+
+// 下载图片一次
+function oneImageDownload(url) {
+  return new Promise((resolve, reject) => {
+    wx.downloadFile({
+      url,
+      success: (res) => {
+        wx.saveImageToPhotosAlbum({
+          filePath: res.tempFilePath,
+          success: function (res) {
+            resolve()
+          },
+        });
+      },
+    });
+  })
+}
+
+// 多次图片下载
+function multipleImageDownloads(all){
+  // const downloadUrlList = [
+  //   // 'https://wrj.shuixiongit.com/aiskyminioTwo/cloud-bucket//089a4039-9c98-4441-abb7-1f9ac56caa8c/DJI_202604270944_002_089a4039-9c98-4441-abb7-1f9ac56caa8c/%E8%BD%A6AI20260427100047007.jpeg',
+  //    // 'https://aisky.org.cn/command-center-dashboard/assets/zhddpt-BgsJ8s7S.png',
+  //   'https://wrj.shuixiongit.com/aiskyminioTwo/cloud-bucket/8d9ba6b4-d255-4f49-b3f8-bdeaf99773b4/DJI_202602121039_002_8d9ba6b4-d255-4f49-b3f8-bdeaf99773b4-flyto/DJI_20260212104641_0003_V.mp4'
+  // ]
+  const downloadUrlList  = all.map(item => {
+    return item.replace('aiskyminio', 'aiskyminioTwo')
+  })
+  const async = ['https://aisky.org.cn/command-center-dashboard/assets/zhddpt-BgsJ8s7S.png'].map(item => oneImageDownload(item))
+  return Promise.all(async)
+}
+
+// 公共图片下载
+function publicImageDownloads(data) {
+  wx.getSetting({
+    success(res) {
+      if (res?.authSetting?.['scope.writePhotosAlbum']) {
+        multipleImageDownloads(data.urlList)
+      }else{
+        wx.authorize({
+          scope: 'scope.writePhotosAlbum',
+          success() {
+            multipleImageDownloads(data.urlList)
+          }
+        })
+      }
+    }
+  })
+}
+
+
+// 公共定位
+function publicPosit(data) {
+  wx.openLocation({
+    latitude: data.latitude,
+    longitude: data.longitude,
+    name: data.name,
+    address: data.name,
+    scale: 18
+  })
+}
+
+
 function messageFun(e) {
   if (e.data.type === "WEB_INVOKE_APPSERVICE") {
-    if (e.data.data.arg.type === "tokenExpired") {
-      return uni.reLaunch({
-        url: "/pages/login/index",
-      });
+    const {type,data} = e.data.data.arg
+    if (type === "tokenExpired") {
+      uni.reLaunch({url: "/pages/login/index"});
+    }else if(type === "wxImageDownload"){
+      publicImageDownloads(data)
+    }else if(type === "wxOpenLocation"){
+      publicPosit(data)
+    }else{
+      emit("webMessage", e.data.data.arg);
     }
-    emit("webMessage", e.data.data.arg);
   }
 }
 
diff --git a/src/config/env.js b/src/config/env.js
index 36ad8ff..4dfb595 100644
--- a/src/config/env.js
+++ b/src/config/env.js
@@ -11,13 +11,20 @@
 // 如果是打包app,需要改这里,h5不需要改这里
 const development = {
   VITE_APP_ENV:'development',
-  // 开发环境这里改为自己的
+
+  // 本地webview
+  // VITE_APP_WEBVIEW_URL: 'http://localhost:5175/drone-app-web-view/#/webViewWrapper',
+
+  // 测试环境
   VITE_APP_WEBVIEW_URL: 'https://wrj.shuixiongit.com/drone-app-web-view/#/webViewWrapper',
-  // VITE_APP_WEBVIEW_URL: 'http://localhost:5173/drone-app-web-view/#/webViewWrapper',
   VITE_API_BASE_URL: 'https://wrj.shuixiongit.com/api',
-  // VITE_API_BASE_URL: 'https://aisky.org.cn/api',
   VITE_APP_WS_API_URL:'wss://wrj.shuixiongit.com/drone-wss/api/v1/ws',
-  
+
+  // 生产环境
+  // VITE_APP_WEBVIEW_URL: 'https://aisky.org.cn/drone-app-web-view/#/webViewWrapper',
+  // VITE_API_BASE_URL: 'https://aisky.org.cn/api',
+  // VITE_APP_WS_API_URL: 'wss://aisky.org.cn/drone-wss/api/v1/ws',
+
   // 静态资源存放地址'
   VITE_APP_ASSETS_URL: 'https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_app_assets'
 }
diff --git a/src/manifest.json b/src/manifest.json
index 8e1964b..53d6dee 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -50,7 +50,13 @@
                     "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                     "<uses-feature android:name=\"android.hardware.camera\"/>",
                     "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
-                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />"
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" />",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
+                    "<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />",
+                    "<uses-permission android:name=\"android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS\" />",
+                    "<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\" />",
+                    "<uses-permission android:name=\"android.permission.USE_FULL_SCREEN_INTENT\" />"
                 ]
             },
             /* ios打包配置 */
@@ -68,8 +74,7 @@
                 }
             }
         },
-        "nativePlugins" : {
-        }
+        "nativePlugins" : {}
     },
     /* 快应用特有相关 */
     "quickapp" : {},
@@ -79,7 +84,8 @@
         "setting" : {
             "urlCheck" : false
         },
-        "usingComponents" : true
+        "usingComponents" : true,
+        "__usePrivacyCheck__" : true
     },
     "mp-alipay" : {
         "usingComponents" : true
diff --git a/src/pages.json b/src/pages.json
index 9cd978c..f007342 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -113,6 +113,12 @@
           }
         },
         {
+          "path": "downloadPage/index",
+          "style": {
+            "navigationBarTitleText": "下载"
+          }
+        },
+        {
           "path": "userDetail/password/index",
           "style": {
             "navigationBarTitleText": "修改密码"
@@ -182,4 +188,4 @@
     "navigationBarBackgroundColor": "#F8F8F8",
     "backgroundColor": "#F8F8F8"
   }
-}
\ No newline at end of file
+}
diff --git a/src/pages/login/index.vue b/src/pages/login/index.vue
index 318b8a6..57ad7e0 100644
--- a/src/pages/login/index.vue
+++ b/src/pages/login/index.vue
@@ -11,8 +11,14 @@
       <image :src="passwordSvg" />
       <input
         v-model="loginForm.password"
-        type="password"
+        type="text"
+        :password="showPassword"
         placeholder="请输入密码"
+      />
+      <image
+        class="pass-word-icon"
+        :src="passwordTriggerIcon"
+        @click="showPassWord"
       />
     </div>
     <div class="remember-password">
@@ -30,6 +36,14 @@
 
     <button class="login-btn" :style="[inputStyle]" @tap="submit">登录</button>
     <image class="lowerRightCorner" :src="droneSvg" />
+
+    <!-- #ifdef MP-WEIXIN -->
+    <GetPrivacy
+      ref="privacyComponent"
+      position="center"
+      @allowPrivacy="allowPrivacy"
+    />
+    <!-- #endif -->
   </view>
 </template>
 
@@ -38,7 +52,9 @@
 import md5 from "js-md5";
 import { loginByUsername } from "@/api/user/index.js";
 import { useUserStore } from "@/store/index.js";
-
+// #ifdef MP-WEIXIN
+import GetPrivacy from "@/components/GetPrivacy.vue";
+// #endif
 import { HOME_PATH, LOGIN_PATH, removeQueryString } from "@/router";
 import { onMounted } from "vue";
 
@@ -46,6 +62,8 @@
 const usernameSvg = getAssetsImage("/images/login/username.png");
 const passwordSvg = getAssetsImage("/images/login/password.png");
 const logoSvg = getAssetsImage("/images/login/logo.png");
+const passwordShow = getAssetsImage("/images/password-show.png");
+const passwordHide = getAssetsImage("/images/password-hide.png");
 
 const userStore = useUserStore();
 const loginForm = ref({
@@ -132,6 +150,16 @@
   }
 }
 
+const showPassword = ref(true);
+
+const showPassWord = () => {
+  showPassword.value = !showPassword.value;
+};
+
+const passwordTriggerIcon = computed(() => {
+  return showPassword.value ? passwordHide : passwordShow;
+});
+
 // 从本地存储加载记住的密码
 onMounted(() => {
   const savedUserInfo = uni.getStorageSync("rememberedUser");
@@ -147,6 +175,28 @@
     redirect = decodeURIComponent(options.redirect);
   }
 });
+
+// #ifdef MP-WEIXIN
+const allowPrivacy = () => {
+  // 同意隐私协议触发事件,有些接口需要同意授权后才能执行,比如获取手机号授权接口,可以在同意隐私协议后,再执行授权获取手机号接口,如果不需要可以不添加该方法
+  console.log("同意隐私授权");
+};
+const privacyComponent = ref(null);
+// onShow(() =>{
+//   wx.getPrivacySetting({
+//     success: res => {
+//       console.log(res)
+//       if (!res.needAuthorization) {
+//         privacyComponent?.value?.closePrivacy()
+//         // 查询授权,针对有tab切换的页面,可以在onshow中查询隐私授权状态,判断在tab切换后是否需要关闭授权弹框
+//         console.log('已经同意隐私授权,不需要再次授权')
+//       }
+//     },
+//     fail: () => {},
+//     complete: () => {}
+//   })
+// })
+// #endif
 </script>
 
 <style lang="scss" scoped>
@@ -203,10 +253,16 @@
       margin-right: 12rpx;
     }
 
+    .pass-word-icon {
+      margin-left: 12rpx;
+      margin-right: 0;
+    }
+
     :deep(uni-input) {
       height: 40rpx;
       line-height: 40rpx;
-      width: 80%;
+      width: 0;
+      flex: 1;
       margin-top: 20rpx;
       padding: 0 !important;
     }
@@ -214,7 +270,8 @@
     :deep(input) {
       height: 40rpx;
       line-height: 40rpx;
-      width: 80%;
+      width: 0;
+      flex: 1;
       margin-top: 20rpx;
       padding: 0 !important;
       margin: 0 !important;
diff --git a/src/pages/map/index.vue b/src/pages/map/index.vue
index b92167f..0e243c4 100644
--- a/src/pages/map/index.vue
+++ b/src/pages/map/index.vue
@@ -1,13 +1,4 @@
-<!--
- * @Author       : yuan
- * @Date         : 2025-12-03 14:20:57
- * @LastEditors  : yuan
- * @LastEditTime : 2025-12-20 16:49:02
- * @FilePath     : \src\pages\map\index.vue
- * @Description  :
- * Copyright 2025 OBKoro1, All Rights Reserved.
- * 2025-12-03 14:20:57
--->
+
 <template>
   <view class="page-wrap">
     <WebViewPlus :src="`${viewUrl}`" @webMessage="onPostMessage" />
@@ -18,7 +9,7 @@
 import { getWebViewUrl } from "@/utils/index.js";
 import WebViewPlus from "@/components/WebViewPlus.vue";
 import { onHide, onShow } from "@dcloudio/uni-app";
-// const viewUrl = getWebViewUrl("/defaultMap");
+import {getUserInfo} from "@/api/user/index.js";
 
 let envParam = "";
 // #ifdef WEB
@@ -56,7 +47,7 @@
     //新建任务
     const encodedData = encodeURIComponent(JSON.stringify(data.rowItem));
     uni.setStorageSync("webview_params", encodedData);
-    uni.navigateTo({
+    uni.switchTab({
       url: `/subPackages/taskDetail/addTask/index`,
     });
   } else if (data.type === "jumpMapNav") {
@@ -74,6 +65,9 @@
 };
 
 onShow(() => {
+  // 验证一下有没有登录
+  getUserInfo()
+
   // #ifndef MP-WEIXIN
   uni.setTabBarItem({
     index: 2, // Tab 的索引(从0开始)
diff --git a/src/pages/user/index.vue b/src/pages/user/index.vue
index f06fd48..5a80afb 100644
--- a/src/pages/user/index.vue
+++ b/src/pages/user/index.vue
@@ -53,12 +53,10 @@
 <script setup>
 import { getAssetsImage } from "@/utils/index.js";
 import { getUserInfo } from "@/api/user/index.js";
-import { useClipboard } from "@/hooks";
 import { useUserStore } from "@/store/index.js";
 import { onShow } from "@dcloudio/uni-app";
 import { getDeviceRegionApi } from "@/api/map.js";
 
-const { setClipboardData, getClipboardData } = useClipboard();
 
 const rightImage = getAssetsImage("/images/user/rightBtn.png");
 const logoImage = getAssetsImage("/images/user/logo1.png");
diff --git a/src/pages/work/index.vue b/src/pages/work/index.vue
index ac51a5f..7d982e1 100644
--- a/src/pages/work/index.vue
+++ b/src/pages/work/index.vue
@@ -1,13 +1,3 @@
-<!--
- * @Author       : yuan
- * @Date         : 2025-12-18 10:06:30
- * @LastEditors  : yuan
- * @LastEditTime : 2025-12-20 14:18:42
- * @FilePath     : \src\pages\work\index.vue
- * @Description  :
- * Copyright 2025 OBKoro1, All Rights Reserved.
- * 2025-12-18 10:06:30
--->
 <template>
   <view class="eventTickets">
     <WebViewPlus
@@ -21,11 +11,9 @@
 <script setup>
 import { getWebViewUrl } from "@/utils/index.js";
 import WebViewPlus from "@/components/WebViewPlus.vue";
-import { useTabAddButton } from "@/hooks/index.js";
 import { onShow, onHide } from "@dcloudio/uni-app";
 
 const sWebViewRef = ref(null);
-// const viewUrl = getWebViewUrl('/work', {})
 const updateKey = ref(0);
 const viewUrl = computed(() => {
   // #ifdef MP-WEIXIN
@@ -65,7 +53,6 @@
   }
   // #endif
 }
-const isApp = ref(false);
 onShow(() => {
   const joinParams = uni.getStorageSync("joinParams");
   if (joinParams) {
@@ -86,11 +73,9 @@
   });
   // #endif
 
-  // isApp.value = true
 });
 
 onHide(() => {
-  // isApp.value = false
 });
 </script>
 
diff --git a/src/subPackages/downloadPage/index.vue b/src/subPackages/downloadPage/index.vue
new file mode 100644
index 0000000..15b7d3b
--- /dev/null
+++ b/src/subPackages/downloadPage/index.vue
@@ -0,0 +1,13 @@
+<template>
+  <view>下载</view>
+</template>
+
+<script setup>
+
+</script>
+
+
+
+<style scoped lang="scss">
+
+</style>
diff --git a/src/subPackages/droneConsole/index.vue b/src/subPackages/droneConsole/index.vue
index a947943..b296006 100644
--- a/src/subPackages/droneConsole/index.vue
+++ b/src/subPackages/droneConsole/index.vue
@@ -6,21 +6,10 @@
 import {onHide, onLoad, onShow} from "@dcloudio/uni-app";
 import WebViewPlus from "@/components/WebViewPlus.vue";
 import {getEnvObj, getWebViewUrl} from "@/utils/index.js";
-import Recorder from "js-audio-recorder";
-import dayjs from "dayjs";
 import {useUserStore} from "@/store/index.js";
-
-const queryParams = ref({})
-
-const viewUrl = computed(() => {
-  return getWebViewUrl('/DroneConsole', queryParams.value)
-})
 
 function onPostMessage(data) {
   if (data.type === 'back'){
-    // uni.navigateTo({
-    //   url: `/subPackages/inProgress/index?wayLineJobInfoId=${data.taskDetails.id}`
-    // });
     // #ifdef H5
     window.history.back()
     // #endif
@@ -87,8 +76,12 @@
   })
 }
 
+const viewUrl = ref("");
 onLoad((options) => {
-  queryParams.value = options
+  viewUrl.value = getWebViewUrl("/DroneConsole", {
+    wayLineJobInfoId: options.wayLineJobInfoId,
+    dockSn: options.dockSn,
+  });
 })
 
 
diff --git a/src/subPackages/inspectionTask/taskDetails.vue b/src/subPackages/inspectionTask/taskDetails.vue
index f623b08..a18e604 100644
--- a/src/subPackages/inspectionTask/taskDetails.vue
+++ b/src/subPackages/inspectionTask/taskDetails.vue
@@ -26,7 +26,6 @@
 
 <script setup>
 
-import {onHide, onShow} from "@dcloudio/uni-app";
 import {useUserStore} from "@/store/index.js";
 const active = defineModel('active')
 const sWebViewRef = ref(null)
@@ -36,8 +35,6 @@
 
 import {onLoad} from "@dcloudio/uni-app";
 
-// const active = defineModel('active')
-// console.log(active.value, '555')
 function onPostMessage(event) {
   if (event.detail.data[0].type === 'back'){
     active.value = null
diff --git a/src/subPackages/qrCode/index.vue b/src/subPackages/qrCode/index.vue
index b8a10a7..feeb5f5 100644
--- a/src/subPackages/qrCode/index.vue
+++ b/src/subPackages/qrCode/index.vue
@@ -1,13 +1,3 @@
-<!--
- * @Author       : yuan
- * @Date         : 2025-10-14 17:43:52
- * @LastEditors  : yuan
- * @LastEditTime : 2025-12-19 15:33:48
- * @FilePath     : \src\subPackages\qrCode\index.vue
- * @Description  : 
- * Copyright 2025 OBKoro1, All Rights Reserved. 
- * 2025-10-14 17:43:52
--->
 <template>
   <view class="page-wrap">
     <WebViewPlus :src="`${viewUrl}`" @webMessage="onPostMessage" />
@@ -22,10 +12,6 @@
 
 const onPostMessage = (data) => {
   if (data.type === "browser") {
-    // #ifdef MP-WEIXIN
-
-    // #endif
-
     // #ifndef MP-WEIXIN
     uni.navigateTo({
       url:
diff --git a/src/subPackages/taskDetail/addTask/index.vue b/src/subPackages/taskDetail/addTask/index.vue
index f175785..c2a8f72 100644
--- a/src/subPackages/taskDetail/addTask/index.vue
+++ b/src/subPackages/taskDetail/addTask/index.vue
@@ -9,8 +9,6 @@
 import { getWebViewUrl } from "@/utils/index.js";
 import { onHide, onLoad, onShow } from "@dcloudio/uni-app";
 
-// const viewUrl = ref(getWebViewUrl('/addTask'))
-const sWebViewRef = ref(null);
 const viewUrl = ref("");
 
 function onPostMessage(data) {
@@ -27,23 +25,14 @@
     uni.setStorageSync("joinParams", {
       type: "add",
     });
-    // console.log('打印新增成功')
     uni.switchTab({
       url: "/pages/inspectionTask/index",
     });
     // #endif
 
-    // uni.redirectTo({
-    //   url: `/pages/inspectionTask/index?addLog=1111`
-    // });
   }
 }
 
-// onLoad( (options) => {
-//   console.log(options, '8888')
-//   const sns = options.device_sn
-//
-// });
 const isApp = ref(false);
 
 // #ifdef MP-WEIXIN
diff --git a/src/subPackages/taskDetail/execution/index.vue b/src/subPackages/taskDetail/execution/index.vue
index 8a11578..201e281 100644
--- a/src/subPackages/taskDetail/execution/index.vue
+++ b/src/subPackages/taskDetail/execution/index.vue
@@ -10,17 +10,7 @@
 
 const wayLineJobInfoId = ref(null)
 const viewUrl = ref('')
-// const viewUrl = ref(getWebViewUrl('/execution'))
 
-// function onPostMessage(data) {
-//   console.log(data, '9999')
-//   if (data.type === 'taskDetails'){
-//     console.log('4444')
-//     uni.switchTab({
-//       url: '/subPackages/taskDetail/execution/index'
-//     });
-//   }
-// }
 function onPostMessage(data) {
   if (data.type === 'back') {
     uni.switchTab({
@@ -47,8 +37,7 @@
 });
 
 onHide(() => {
-  // 如果工单详情返回任务详情,那么tab栏对应的是关联事件一项
-  // isApp.value = false
+
 });
 </script>
 
diff --git a/src/subPackages/taskDetail/inProgress/index.vue b/src/subPackages/taskDetail/inProgress/index.vue
index 5e1dd5c..e6ce928 100644
--- a/src/subPackages/taskDetail/inProgress/index.vue
+++ b/src/subPackages/taskDetail/inProgress/index.vue
@@ -16,8 +16,6 @@
 const viewUrl = ref("");
 const showComponent = ref(false);
 function onPostMessage(data) {
-  // #ifdef MP-WEIXIN
-  // #endif
 
   // #ifndef MP-WEIXIN
   if (data.type === "back") {
diff --git a/src/subPackages/userDetail/infos/index.vue b/src/subPackages/userDetail/infos/index.vue
index 807446e..c1a6734 100644
--- a/src/subPackages/userDetail/infos/index.vue
+++ b/src/subPackages/userDetail/infos/index.vue
@@ -1,307 +1,328 @@
 <template>
-	<view class="container">
-		<div class="avatarBox">
-			<u-avatar @click="uploadAvatar" :src="userInfo.avatar" size="114" mode="aspectFill" />
-		</div>
-		<view class="detailBox">
-			<div class="detailCon">
-				<div class="orderRow">
-					<div class="rowTitle">姓名</div>
-					<div>{{userInfo.realName}}</div>
-				</div>
-				<div class="orderRow">
-					<div class="rowTitle">所属单位</div>
-					<div>{{userInfo.deptName}}</div>
-				</div>
-				<div class="orderRow">
-					<div class="rowTitle">手机号</div>
-					<u-input input-align="right" v-model="userInfo.phone" type="number" placeholder="请输入手机号"
-						class="input-item" />
+  <view class="container">
+    <div class="avatarBox">
 
-				</div>
-				<div class="orderRow">
-					<div class="rowTitle">邮箱</div>
-					<u-input input-align="right" v-model="userInfo.email" type="email" placeholder="请输入邮箱"
-						class="input-item" />
-				</div>
-			</div>
-		</view>
-		<view class="btngroup">
-			<u-button color="#AEAEAE" class="custom-style" shape="circle" @click="reset">重置</u-button>
-			<u-button color="#1D6FE9" class="custom-style" shape="circle" @click="submit">提交</u-button>
-		</view>
-	</view>
+      <u-avatar @click="uploadAvatar" :src="userInfo.avatar" size="114" mode="aspectFill"/>
+    </div>
+    <view class="detailBox">
+      <div class="detailCon">
+        <div class="orderRow">
+          <div class="rowTitle">姓名</div>
+          <div>{{ userInfo.realName }}</div>
+        </div>
+        <div class="orderRow">
+          <div class="rowTitle">所属单位</div>
+          <div>{{ userInfo.deptName }}</div>
+        </div>
+        <div class="orderRow">
+          <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>
+          <u-input input-align="right" v-model="userInfo.email" type="email" placeholder="请输入邮箱"
+                   class="input-item"/>
+        </div>
+      </div>
+    </view>
+    <view class="btngroup">
+      <u-button color="#AEAEAE" class="custom-style" shape="circle" @click="reset">重置</u-button>
+      <u-button
+        :color="submitLoading ? '#AEAEAE' : '#1D6FE9'"
+        class="custom-style"
+        shape="circle"
+        text="提交"
+        :loading="submitLoading"
+        loading-text="提交中"
+        loading-mode="circle"
+        :loading-size="13"
+        @click="submit"
+      />
+    </view>
+  </view>
 </template>
 
 <script setup>
-	import {
-		getEnvObj,
-		getWebViewUrl
-	} from "@/utils/index.js";
-	import {
-		getUserInfo,
-		updateInfo,
-		updatePassword
-	} from '@/api/user/index.js';
-	import {
-		useUserStore
-	} from "@/store/index.js";
-	const userInfo = ref({
-		id: '',
-		avatar: '',
-		realName: '',
-		name: '',
-		phone: '',
-		email: '',
-		deptName: '',
-	});
-	// 校验手机号
-	const validatePhone = () => {
-		const phone = userInfo.value.phone
-		if (!phone) return true
-		const phoneRegex = /^1[3-9]\d{9}$/
-		if (!phoneRegex.test(phone)) {
+import {getEnvObj} from "@/utils/index.js";
+import {getUserInfo, updateInfo} from '@/api/user/index.js';
+import {useUserStore} from "@/store/index.js";
+import {ref} from "vue";
+import {onShow} from "@dcloudio/uni-app";
 
-			uni.showToast({
-				title: '请输入正确的手机号码',
-				icon: 'none',
-				duration: 2000
-			});
-			return false
-		}
-		return true
-	}
-	// 校验邮箱
-	const validateEmail = () => {
-		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)) {
+const userInfo = ref({
+  id: '',
+  avatar: '',
+  realName: '',
+  name: '',
+  phone: '',
+  email: '',
+  deptName: '',
+});
+const submitLoading = ref(false);
 
-			uni.showToast({
-				title: '请输入正确的邮箱地址',
-				icon: 'none',
-				duration: 2000
-			});
-			return false
-		}
-		return true
-	}
-	const getUserInfoData = () => {
-		getUserInfo().then(res => {
-			const user = res.data.data;
-			userInfo.value = {
-				id: user.id,
-				avatar: user.avatar,
-				name: user.name,
-				realName: user.realName,
-				phone: user.phone,
-				email: user.email,
-				deptName: user.deptName,
-			};
+// 校验手机号
+const validatePhone = () => {
+  const phone = userInfo.value.phone
+  if (!phone) return true
+  const phoneRegex = /^1[3-9]\d{9}$/
+  if (!phoneRegex.test(phone)) {
+    uni.showToast({
+      title: '请输入正确的手机号码',
+      icon: 'none',
+      duration: 2000
+    });
+    return false
+  }
+  return true
+}
 
-		});
-	};
-	const reset = () => {
-		getUserInfoData();
-	};
+// 校验邮箱
+const validateEmail = () => {
+  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)) {
 
-	const {
-		VITE_API_BASE_URL
-	} = getEnvObj()
+    uni.showToast({
+      title: '请输入正确的邮箱地址',
+      icon: 'none',
+      duration: 2000
+    });
+    return false
+  }
+  return true
+}
 
-	function uploadUtil(options) {
-		const {
-			formData,
-			filePath,
-			url
-		} = options;
+const getUserInfoData = () => {
+  getUserInfo().then(res => {
+    const user = res.data.data;
+    userInfo.value = {
+      id: user.id,
+      avatar: user.avatar,
+      name: user.name,
+      realName: user.realName,
+      phone: user.phone,
+      email: user.email,
+      deptName: user.deptName,
+    };
 
-		return new Promise((resolve, reject) => {
-			let accessToken = useUserStore()?.$state?.userInfo?.access_token;
+  });
+};
+const reset = () => {
+  getUserInfoData();
+};
 
-			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)
+const {
+  VITE_API_BASE_URL
+} = getEnvObj()
 
-						reject(res)
-					}
-				},
-				fail: (err) => {
-					reject(err)
-				}
-			});
-		})
-	}
-	const uploadAvatar = () => {
-		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: '上传中...'
-				});
+// 头像上传到服务器
+function uploadUtil(options) {
+  const {formData, filePath, url} = options;
+  uni.showLoading({title: '上传中...'})
+  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 {
+          uni.showToast(resData.message)
+          reject(res)
+        }
+      },
+      fail: (err) => {
+        reject(err)
+      },
+      complete: () => {
+        uni.hideLoading()
+      }
+    });
+  })
+}
 
-				// 上传文件
-				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 || '上传失败');
+const handleUploadResult = (filePath, fileName) => {
+  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.showToast({title: '头像上传成功', icon: 'success'});
+    } else {
+      throw new Error(resData.message || '上传失败');
+    }
+  }).catch(err => {
+    uni.showToast({title: err.message || '上传失败', icon: 'none'});
+  });
+};
 
-					}
-				}).catch(err => {
-					uni.hideLoading();
-					uni.showToast({
-						title: err.message || '上传失败',
-						icon: 'none'
-					});
-				});
-			}
-		});
-	}
-	const submit = () => {
-		if (!validatePhone() || !validateEmail()) return
-		userInfo.value.name = userInfo.value.realName;
-		updateInfo(userInfo.value).then(res => {
-			if (res.data.code === 200) {
-				uni.showToast({
-					title: '修改信息成功',
-					icon: 'none',
-					duration: 2000
-				});
-					getUserInfoData()
+// 上传头像功能
+const uploadAvatar = () => {
+  // #ifdef MP-WEIXIN
+  uni.chooseMedia({
+    count: 1,
+    mediaType: ['image'],
+    sourceType: ['album', 'camera'],
+    maxDuration: 30,
+    camera: 'back',
+    success(res) {
+      const filePath = res.tempFiles[0].tempFilePath;
+      handleUploadResult(filePath, filePath);
+    }
+  })
+  // #endif
 
-			} else {
-				uni.showToast({
-					title: res.msg,
-					icon: 'none',
-					duration: 2000
-				});
-					getUserInfoData()
-			}
+  // #ifndef MP-WEIXIN
+  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';
+      }
+      // 上传文件
+      handleUploadResult(filePath, fileName);
+    }
+  });
+  // #endif
+}
+const submit = () => {
+  if (submitLoading.value) return
+  if (!validatePhone() || !validateEmail()) return
+  submitLoading.value = true
+  userInfo.value.name = userInfo.value.realName;
+  updateInfo(userInfo.value).then(res => {
+    if (res.data.code === 200) {
+      uni.showToast({
+        title: '修改信息成功',
+        icon: 'none',
+        duration: 1500
+      });
+      setTimeout(() => {
+        uni.switchTab({
+          url: '/pages/user/index'
+        });
+      }, 1500);
+      return
 
-		});
-	
-	};
-	onShow(async () => {
-		getUserInfoData()
-	});
+    } else {
+      uni.showToast({
+        title: res.msg,
+        icon: 'none',
+        duration: 2000
+      });
+      getUserInfoData()
+    }
+    submitLoading.value = false
+  }).catch(() => {
+    getUserInfoData()
+    submitLoading.value = false
+  });
+};
+onShow(async () => {
+  getUserInfoData()
+});
 </script>
 
 <style lang="scss" scoped>
-	.container {
-		width: 100%;
-		height: 100%;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-	}
-	.avatarBox {
-		width: 228rpx;
-		height: 228rpx;
-		margin: 76rpx 0;
-	}
+.container {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
 
-	.detailBox {
-		width: 702rpx;
-		min-height: 430rpx;
-		background: #FFFFFF;
-		border-radius: 12rpx;
-		box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
+.avatarBox {
+  width: 228rpx;
+  height: 228rpx;
+  margin: 76rpx 0;
+}
 
-		.detailCon {
-			padding: 0 24rpx;
-		}
+.detailBox {
+  width: 702rpx;
+  min-height: 430rpx;
+  background: #FFFFFF;
+  border-radius: 12rpx;
+  box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
 
-		.orderRow {
-			display: flex;
-			justify-content: space-between;
-			align-items: center;
-			height: 96rpx;
-			border-bottom: 2rpx solid #f5f5f5;
-			color: #7b7b7b;
+  .detailCon {
+    padding: 0 24rpx;
+  }
 
-			.rowTitle {
-				font-family: Source Han Sans CN, Source Han Sans CN;
-				font-weight: 400;
-				font-size: 30rpx;
-				color: #222324;
-				white-space: nowrap;
-			}
+  .orderRow {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    height: 96rpx;
+    border-bottom: 2rpx solid #f5f5f5;
+    color: #7b7b7b;
 
-			::v-deep .u-input {
-				border: none !important;
-				background: transparent !important;
-				padding: 0 !important;
-			}
+    .rowTitle {
+      font-family: Source Han Sans CN, Source Han Sans CN;
+      font-weight: 400;
+      font-size: 30rpx;
+      color: #222324;
+      white-space: nowrap;
+    }
 
-			::v-deep .u-input__input {
-				border: none !important;
-				box-shadow: none !important;
-				background: transparent !important;
-				padding: 0 !important;
-				margin: 0 !important;
-				height: auto !important;
-			}
-		}
-	}
+    ::v-deep .u-input {
+      border: none !important;
+      background: transparent !important;
+      padding: 0 !important;
+    }
 
-	.btngroup {
-		display: flex;
-		position: absolute;
-		bottom: 150rpx;
-	}
+    ::v-deep .u-input__input {
+      border: none !important;
+      box-shadow: none !important;
+      background: transparent !important;
+      padding: 0 !important;
+      margin: 0 !important;
+      height: auto !important;
+    }
+  }
+}
 
-	:deep(.u-button:first-child) {
-		margin-right: 30rpx !important;
-	}
+.btngroup {
+  display: flex;
+  position: absolute;
+  bottom: 150rpx;
+}
 
-	.custom-style {
-		width: 276rpx;
-		height: 76rpx;
-	}
-	:deep(.u-button){
-		width: 276rpx !important;
-		height: 76rpx !important;
-	}
-</style>
\ No newline at end of file
+:deep(.u-button:first-child) {
+  margin-right: 30rpx !important;
+}
+
+.custom-style {
+  width: 276rpx;
+  height: 76rpx;
+}
+
+:deep(.u-button) {
+  width: 276rpx !important;
+  height: 76rpx !important;
+}
+</style>
diff --git a/src/subPackages/userDetail/password/index.vue b/src/subPackages/userDetail/password/index.vue
index 387d854..9de5039 100644
--- a/src/subPackages/userDetail/password/index.vue
+++ b/src/subPackages/userDetail/password/index.vue
@@ -21,7 +21,17 @@
 		</view>
 		<view class="btngroup">
 			<u-button color="#AEAEAE" class="custom-style" shape="circle" @click="reset">重置</u-button>
-			<u-button color="#1D6FE9" class="custom-style" shape="circle" @click="submit">提交</u-button>
+			<u-button
+				:color="submitLoading ? '#AEAEAE' : '#1D6FE9'"
+				class="custom-style"
+				shape="circle"
+				text="提交"
+				:loading="submitLoading"
+				loading-text="提交中"
+				loading-mode="circle"
+				:loading-size="13"
+				@click="submit"
+			/>
 		</view>
 	</view>
 </template>
@@ -46,6 +56,7 @@
 		newPassword: '',
 		newPassword1: '',
 	});
+	const submitLoading = ref(false);
 	// 校验密码不能包含中文
 	const validatePasswordNoChinese = (password) => {
 		const chineseRegex = /[\u4e00-\u9fa5]/;
@@ -71,12 +82,6 @@
 			});
 			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 = () => {
@@ -90,6 +95,7 @@
 		clearForm();
 	};
 	const submit = () => {
+		if (submitLoading.value) return;
 		// 原始密码校验
 		if (!passwordForm.value.oldPassword) {
 
@@ -125,6 +131,7 @@
 
 		// 复杂度校验
 		if (!validatePasswordStrength(passwordForm.value.newPassword)) return;
+		submitLoading.value = true;
 		updatePassword(md5(passwordForm.value.oldPassword),
 			md5(passwordForm.value.newPassword),
 			md5(passwordForm.value.newPassword1)).then(res => {
@@ -132,14 +139,17 @@
 				uni.showToast({
 					title: '修改信息成功',
 					icon: 'none',
-					duration: 2000
+					duration: 1500
 				});
 				clearForm();
 				userStore.setUserInfo(null)
 				uni.removeStorageSync('rememberedUser');
-				uni.reLaunch({
-					url: '/pages/login/index'
-				})
+				setTimeout(() => {
+					uni.reLaunch({
+						url: '/pages/login/index'
+					})
+				}, 1500);
+				return
 
 			} else {
 				uni.showToast({
@@ -148,7 +158,10 @@
 					duration: 2000
 				});
 			}
+			submitLoading.value = false;
 
+		}).catch(() => {
+			submitLoading.value = false;
 		});
 
 	};
diff --git a/src/subPackages/workDetail/addWork/index.vue b/src/subPackages/workDetail/addWork/index.vue
index 6d9b4a0..ce9e0c7 100644
--- a/src/subPackages/workDetail/addWork/index.vue
+++ b/src/subPackages/workDetail/addWork/index.vue
@@ -1,13 +1,4 @@
-<!--
- * @Author       : yuan
- * @Date         : 2025-11-13 18:14:52
- * @LastEditors  : yuan
- * @LastEditTime : 2025-12-20 16:56:27
- * @FilePath     : \src\subPackages\workDetail\addWork\index.vue
- * @Description  : 
- * Copyright 2025 OBKoro1, All Rights Reserved. 
- * 2025-11-13 18:14:52
--->
+
 <template>
   <view>
     <WebViewPlus
@@ -38,9 +29,6 @@
     uni.setStorageSync("joinParams", {
       type: "add",
     });
-    // uni.switchTab({
-    //   url: '/pages/work/index'
-    // });
     uni.switchTab({
       url: `/pages/work/index?addLog=111`,
     });
diff --git a/src/subPackages/workDetail/mapWork/index.vue b/src/subPackages/workDetail/mapWork/index.vue
index f00d642..6f2f4a9 100644
--- a/src/subPackages/workDetail/mapWork/index.vue
+++ b/src/subPackages/workDetail/mapWork/index.vue
@@ -1,13 +1,4 @@
-<!--
- * @Author       : yuan
- * @Date         : 2025-10-22 14:59:10
- * @LastEditors  : yuan
- * @LastEditTime : 2025-12-19 14:52:54
- * @FilePath     : \src\subPackages\workDetail\mapWork\index.vue
- * @Description  : 
- * Copyright 2025 OBKoro1, All Rights Reserved. 
- * 2025-10-22 14:59:10
--->
+
 <!-- 地图展示 -->
 <template>
   <WebViewPlus
@@ -29,14 +20,9 @@
   viewUrl.value = getWebViewUrl("/mapWork", { currentItem: currentItem });
 });
 function onPostMessage(data) {
-  // #ifdef MP-WEIXIN
-  // #endif
 
   // #ifndef MP-WEIXIN
   if (data.type === "workDetailback") {
-    // uni.navigateTo({
-    //   url: '/subPackages/workDetail/index'
-    // });
     uni.navigateBack({
       delta: 1,
     });

--
Gitblit v1.9.3