Browse Source

Merge branch 'ming' of uskycloud/usky-web-mobile into master

gez 6 months ago
parent
commit
a19ddfb738
63 changed files with 2866 additions and 1408 deletions
  1. 18 0
      AndroidManifest.xml
  2. 3 2
      package.json
  3. 23 7
      src/App.vue
  4. 0 12
      src/api/index/index.js
  5. 30 16
      src/components/oa-scroll/index.vue
  6. 6 2
      src/config.js
  7. 158 164
      src/manifest.json
  8. 772 772
      src/pages.json
  9. 20 3
      src/pages/business/common/projectMange/list/addEdit.vue
  10. 93 72
      src/pages/business/common/projectMange/list/index.vue
  11. 1 1
      src/pages/business/common/projectMange/overview/index.vue
  12. 108 34
      src/pages/business/common/projectMange/record/details.vue
  13. 72 79
      src/pages/business/common/projectMange/record/index.vue
  14. 113 29
      src/pages/business/common/projectMange/write/components/template1.vue
  15. 4 19
      src/pages/business/common/projectMange/write/insert.vue
  16. 1 0
      src/pages/business/common/videoMonitor/videoDetail.vue
  17. 1 1
      src/pages/business/common/videoMonitor/videoList.vue
  18. 1 0
      src/pages/business/fireIot/alarmManage/alarmDetails/index.vue
  19. 0 1
      src/pages/business/fireIot/alarmManage/alarmDetailsList/index.vue
  20. 1 0
      src/pages/business/fireIot/alarmManage/index.vue
  21. 1 0
      src/pages/business/fireIot/customManage/index.vue
  22. 1 0
      src/pages/business/fireIot/deviceManage/components/deviceDetails.vue
  23. 1 0
      src/pages/business/fireIot/deviceManage/components/deviceDetailsList.vue
  24. 1 0
      src/pages/business/fireIot/deviceManage/index.vue
  25. 1 0
      src/pages/business/fireIot/facilitiesGather/index.vue
  26. 19 2
      src/pages/business/fireIot/facilitiesManage/facilitiesDetails.vue
  27. 1 0
      src/pages/business/fireIot/facilitiesManage/facilitiesDetailsList.vue
  28. 1 0
      src/pages/business/fireIot/facilitiesManage/index.vue
  29. 1 0
      src/pages/business/fireIot/repairManage/index.vue
  30. 1 0
      src/pages/business/fireIot/repairManage/repairDetails.vue
  31. 0 1
      src/pages/business/fireIot/repairManage/repairDetailsList.vue
  32. 1 0
      src/pages/business/fireIot/repairReport/index.vue
  33. 1 0
      src/pages/business/fireIot/repairReport/record.vue
  34. 1 0
      src/pages/business/mhxf/fireReport/index.vue
  35. 1 0
      src/pages/business/zhaf/xunJian/collect/components/collectDetail.vue
  36. 1 0
      src/pages/business/zhaf/xunJian/collect/index.vue
  37. 0 1
      src/pages/business/zhxf/fireInspect/inspectDetailsList/index.vue
  38. 16 2
      src/pages/common/appMessage/index.vue
  39. 58 0
      src/pages/common/face/api.js
  40. 473 0
      src/pages/common/face/index.vue
  41. 1 1
      src/pages/common/searchSelect/index.vue
  42. 4 2
      src/pages/index.vue
  43. 1 1
      src/pages/info.vue
  44. 80 50
      src/pages/login.vue
  45. 1 1
      src/pages/mine/info/index.vue
  46. 1 0
      src/pages/register.vue
  47. 1 1
      src/pages/serveConfig.vue
  48. 1 0
      src/permission.js
  49. 18 21
      src/plugins/common.plugins.js
  50. 16 0
      src/plugins/index.js
  51. 134 0
      src/plugins/keyListen.plugins.js
  52. 46 0
      src/plugins/time.plugins.js
  53. BIN
      src/static/face/img/logo.png
  54. 382 0
      src/static/face/index.html
  55. 7 0
      src/static/face/js/face-min.js
  56. 1 0
      src/static/face/js/jquery-2.2.1.min.js
  57. 7 0
      src/static/face/js/tracking-min.js
  58. 0 0
      src/static/face/js/uni.webview.1.5.4.js
  59. 4 0
      src/static/scss/global.scss
  60. 16 5
      src/store/modules/setting.js
  61. 25 1
      src/store/modules/xunJian.js
  62. 0 105
      src/utils/keyListen.js
  63. 115 0
      unpackage/config/setting.js

+ 18 - 0
AndroidManifest.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="no" ?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:compileSdkVersion="33" android:compileSdkVersionCodename="13" package="android.dcloud.uskyMobile" platformBuildVersionCode="33" platformBuildVersionName="13">
+	<application android:allowBackup="false" android:allowClearUserData="true" android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:debuggable="false" android:extractNativeLibs="true" android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name" android:largeHeap="true" android:name="io.dcloud.application.DCloudApplication" android:supportsRtl="true" android:usesCleartextTraffic="true">
+        <activity android:configChanges="fontScale|keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize" android:exported="true" android:hardwareAccelerated="true" android:label="@string/app_name" android:name="io.dcloud.PandoraEntry" android:screenOrientation="user" android:theme="@style/DCloudTranslucentTheme" android:windowSoftInputMode="adjustResize">
+            <intent-filter>
+				<action android:name="android.intent.action.MAIN"/>
+				<category android:name="android.intent.category.LAUNCHER"/>
+				<category android:name="android.intent.category.HOME"/>
+				<category android:name="android.intent.category.DEFAULT"/>
+			</intent-filter>
+			<intent-filter>
+				<action android:name="android.intent.action.VIEW"/>
+				<category android:name="android.intent.category.DEFAULT"/>
+				<category android:name="android.intent.category.BROWSABLE"/>
+			</intent-filter>
+		</activity>	
+    </application>
+</manifest>

+ 3 - 2
package.json

@@ -33,7 +33,8 @@
         "build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
         "build:quickapp-webview-union": "uni build -p quickapp-webview-union",
         "clear": "rimraf node_modules && npm install --force",
-        "clean": "npm cache clean --force"
+        "clean": "npm cache clean --force",
+        "update:setting": "node unpackage/config/setting.js"
     },
     "dependencies": {
         "@amap/amap-jsapi-loader": "^1.0.1",
@@ -75,4 +76,4 @@
         "sass": "1.57.1",
         "vite": "5.2.8"
     }
-}
+}

+ 23 - 7
src/App.vue

@@ -1,28 +1,44 @@
 <script setup>
 /*----------------------------------依赖引入-----------------------------------*/
-import { onLoad, onShow, onHide, onLaunch, onReady } from "@dcloudio/uni-app";
+import { onLoad, onShow, onHide, onLaunch, onReady, onBackPress } from "@dcloudio/uni-app";
 import { defineComponent, getCurrentInstance, inject, nextTick, onMounted, watchEffect, ref } from "vue";
 /*----------------------------------接口引入-----------------------------------*/
 /*----------------------------------组件引入-----------------------------------*/
 /*----------------------------------store引入-----------------------------------*/
 /*----------------------------------公共方法引入-----------------------------------*/
 import config from "./config";
-import JKeyListen from "@/utils/keyListen.js";
 import { storageSystem } from "@/utils/storage";
 /*----------------------------------公共变量-----------------------------------*/
 const { proxy } = getCurrentInstance();
 /*----------------------------------变量声明-----------------------------------*/
-
 function initApp() {
   proxy.$settingStore.initThemeColor(storageSystem.get("themeColor")); //初始化默认主题
   proxy.$settingStore.systemHeightTop(); //初始化获取安全区高度
-
   //#ifdef APP-PLUS
+  stteingInit();
+  //#endif
+}
+
+//设置初始化
+function stteingInit() {
   plus.screen.unlockOrientation(); //解除屏幕方向的锁定,但是不一定是竖屏;
-  plus.screen.lockOrientation("portrait-primary"); //设置屏幕方向(1.竖屏正方向:portrait-primary 2.竖屏反方向:portrait-secondary 3.横屏正方向:landscape-primary 4.横屏反方向:landscape-secondary 5.自然方向:default)
+
+  // 综合智慧云
+  if (config.appInfo.appid === "__UNI__36DE3A0") {
+    plus.screen.lockOrientation("portrait-primary"); //设置屏幕方向(1.竖屏正方向:portrait-primary 2.竖屏反方向:portrait-secondary 3.横屏正方向:landscape-primary 4.横屏反方向:landscape-secondary 5.自然方向:default)
+  }
+  // 智能巡更
+  else if (config.appInfo.appid === "__UNI__BF1A1F0") {
+    plus.screen.lockOrientation("portrait-primary"); //设置屏幕方向(1.竖屏正方向:portrait-primary 2.竖屏反方向:portrait-secondary 3.横屏正方向:landscape-primary 4.横屏反方向:landscape-secondary 5.自然方向:default)
+    proxy.$keyListen.startListen(true); //开启物理按钮监听
+  }
+  // 智能会议
+  else if (config.appInfo.appid === "__UNI__F3963F8") {
+    plus.screen.lockOrientation("landscape-primary"); //设置屏幕方向(1.竖屏正方向:portrait-primary 2.竖屏反方向:portrait-secondary 3.横屏正方向:landscape-primary 4.横屏反方向:landscape-secondary 5.自然方向:default)
+    plus.navigator.hideSystemNavigation(); //隐藏安卓底部虚拟导航键
+  }
+
   proxy.$settingStore.pushListener(); //开启消息推送监听
-  // JKeyListen.startListen(true); //开启物理按钮监听
-  //#endif
 }
 
 // 设置手机通知权限

+ 0 - 12
src/api/index/index.js

@@ -46,18 +46,6 @@ export function getFunctionalModuleStatistics(param) {
   });
 }
 
-// 登录方法
-// export function login(data) {
-//   return request({
-//     url: "/system/appLogin",
-//     headers: {
-//       isToken: false,
-//     },
-//     method: "POST",
-//     data: data,
-//   });
-// }
-
 //扫码登录PC端
 export function qrCodeSend(param) {
   return request({

+ 30 - 16
src/components/oa-scroll/index.vue

@@ -3,10 +3,10 @@
     :class="customClass"
     :style="{
       //#ifdef APP-PLUS || MP-WEIXIN
-      height: !isSticky ? 'calc(100vh - 0px)' : 'calc(100vh - 44px)',
+      height: `calc(100vh - (${!isSticky ? '0px' : '44px'}))`,
       //#endif
       //#ifdef H5
-      height: !isSticky ? 'calc(100vh - 44px)' : 'calc(100vh - 88px)',
+      height: `calc(100vh - (${!isSticky ? '44px' : '88px'}))`,
       //#endif
       ...customStyle,
     }"
@@ -40,11 +40,23 @@
     </slot>
     <slot name="default"> </slot>
     <slot name="bottomLoading">
-      <div class="bottoBox" :style="`margin-top:20px;padding-bottom:${lowerThreshold + 'px'}`">
-        <span v-show="total != 0 && refresherLoad && refresherLoadTitle">
+      <div class="bottoBox">
+        <span
+          v-show="total != 0 && refresherLoad && refresherLoadTitle"
+          :style="{
+            marginTop: '20px',
+            marginBottom: '20px',
+          }"
+        >
           {{ pageSize >= total ? "没有更多啦~" : isScrolltolower }}
         </span>
-        <span v-show="total == 0 && refresherEnabled && refresherEnabledTitle && !triggered">
+        <span
+          v-show="total == 0 && refresherEnabled && refresherEnabledTitle && !triggered"
+          :style="{
+            marginTop: '20px',
+            marginBottom: '20px',
+          }"
+        >
           <image style="width: 160px; height: 160px" src="@/static/images/data.png"></image>
           <view>暂无数据</view>
         </span>
@@ -54,7 +66,7 @@
 </template>
 <script setup>
 import { onReady, onLoad, onShow, onNavigationBarButtonTap, onPullDownRefresh, onReachBottom } from "@dcloudio/uni-app";
-import { ref, onMounted, inject, shallowRef, reactive, getCurrentInstance, watchEffect, toRefs, toRef, watch } from "vue";
+import { ref, onMounted, inject, shallowRef, reactive, getCurrentInstance, watchEffect, toRefs, toRef, watch, computed } from "vue";
 
 const emit = defineEmits(["load", "refresh"]);
 const props = defineProps({
@@ -98,11 +110,6 @@ const props = defineProps({
     type: Boolean,
     default: true,
   },
-  //距离底部上拉加载距离
-  lowerThreshold: {
-    type: Number,
-    default: 0,
-  },
   //是否开启下拉刷新
   refresherEnabled: {
     type: Boolean,
@@ -116,7 +123,7 @@ const props = defineProps({
   //距离顶部下拉刷新距离
   refresherThreshold: {
     type: Number,
-    default: 45,
+    default: 44,
   },
   //是否使用默认下拉刷新样式(支持设置 black、white、none/none 表示不使用默认样式)
   refresherDefaultStyle: {
@@ -135,16 +142,23 @@ const props = defineProps({
   },
 });
 
-const { pageSize, total, scrollTop, customClass, customStyle, refresherLoad, lowerThreshold, refresherEnabled, refresherEnabledTitle, refresherThreshold, refresherDefaultStyle, refresherBackground } =
-  toRefs(props);
+const { pageSize, total, scrollTop, customClass, customStyle, refresherLoad, refresherEnabled, refresherEnabledTitle, refresherThreshold, refresherDefaultStyle, refresherBackground } = toRefs(props);
 
-const defaultArray = reactive({
+const state = reactive({
+  StatusBarHeight: computed(() => {
+    let systemInfo = uni.getSystemInfoSync();
+    return systemInfo.statusBarHeight + "px";
+  }),
+  tabBarHeight: computed(() => {
+    let systemInfo = uni.getSystemInfoSync();
+    return systemInfo.screenHeight - systemInfo.safeArea.bottom + "px";
+  }),
   triggered: false,
   topTis: "松手刷新",
   isScrolltolower: "上拉加载更多",
 });
 
-const { triggered, topTis, isScrolltolower } = toRefs(defaultArray);
+const { StatusBarHeight, tabBarHeight, triggered, topTis, isScrolltolower } = toRefs(state);
 
 /**
  * @scrollView上拉刷新

+ 6 - 2
src/config.js

@@ -1,3 +1,5 @@
+import manifest from './manifest.json'
+
 // 应用全局配置
 export default {
   //#ifdef APP-PLUS || MP-WEIXIN
@@ -11,8 +13,10 @@ export default {
   websiteUrl: "https://qhome.usky.cn",
   // 应用信息
   appInfo: {
+    // 应用id
+    appid: manifest.appid,
     // 应用名称
-    name: "usky-app-mobile",
+    name: manifest.name,
     // 应用版本
     version: uni.getSystemInfoSync().appWgtVersion || uni.getSystemInfoSync().appVersion,
     // 应用logo
@@ -44,4 +48,4 @@ export default {
       },
     ],
   },
-};
+};

+ 158 - 164
src/manifest.json

@@ -1,46 +1,46 @@
 {
-    "name" : "综合智慧云",
-    "appid" : "__UNI__36DE3A0",
-    "description" : "综合智慧云APP,是一款助力于企业数字化的应用平台,帮助企业提升办公效率,实现组织数字化和业务数字化。",
-    "versionName" : "2.1.9",
-    "versionCode" : 19,
-    "transformPx" : false,
-    "app-plus" : {
-        "compatible" : {
-            "ignoreVersion" : true
+    "name": "综合智慧云",
+    "appid": "__UNI__36DE3A0",
+    "description": "综合智慧云APP,是一款助力于企业数字化的应用平台,帮助企业提升办公效率,实现组织数字化和业务数字化。",
+    "versionName": "2.1.9",
+    "versionCode": 19,
+    "transformPx": false,
+    "app-plus": {
+        "compatible": {
+            "ignoreVersion": true
         },
-        "kernel" : {
-            "ios" : "WKWebview"
+        "kernel": {
+            "ios": "WKWebview"
         },
-        "usingComponents" : true,
-        "nvueStyleCompiler" : "uni-app",
-        "compilerVersion" : 3,
-        "splashscreen" : {
-            "alwaysShowBeforeRender" : true,
-            "waiting" : true,
-            "autoclose" : true,
-            "delay" : 0
+        "usingComponents": true,
+        "nvueStyleCompiler": "uni-app",
+        "compilerVersion": 3,
+        "splashscreen": {
+            "alwaysShowBeforeRender": true,
+            "waiting": true,
+            "autoclose": true,
+            "delay": 0
         },
-        "screenOrientation" : [
+        "screenOrientation": [
             "portrait-primary",
             "portrait-secondary",
             "landscape-primary",
             "landscape-secondary"
         ],
-        "modules" : {
-            "VideoPlayer" : {},
-            "iBeacon" : {},
-            "Geolocation" : {},
-            "Maps" : {},
-            "Barcode" : {},
-            "Fingerprint" : {},
-            "Push" : {},
-            "Camera" : {},
-            "LivePusher" : {}
+        "modules": {
+            "VideoPlayer": {},
+            "iBeacon": {},
+            "Geolocation": {},
+            "Maps": {},
+            "Barcode": {},
+            "Fingerprint": {},
+            "Push": {},
+            "Camera": {},
+            "LivePusher": {}
         },
-        "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\"/>",
@@ -80,171 +80,165 @@
                     "<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
                     "<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>"
                 ],
-                "minSdkVersion" : "",
-                "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ],
-                "targetSdkVersion" : 30
+                "minSdkVersion": "",
+                "abiFilters": [
+                    "armeabi-v7a",
+                    "arm64-v8a"
+                ],
+                "targetSdkVersion": 30
             },
-            "ios" : {
-                "dSYMs" : false,
-                "privacyDescription" : {
-                    "NSPhotoLibraryUsageDescription" : "该应用需要读取你的相册,用于上传头像",
-                    "NSPhotoLibraryAddUsageDescription" : "该应用需要读取你的相册,用于拍照保存图片",
-                    "NSCameraUsageDescription" : "该应用需要你的相机,用于你拍摄上传头像信息",
-                    "NSMicrophoneUsageDescription" : "该应用需要使用你的麦克风,用于语音播放",
-                    "NSLocationWhenInUseUsageDescription" : "该应用需要你的地理位置,用于天气、签到等功能",
-                    "NSLocationAlwaysUsageDescription" : "该应用需要持续获取用户地理位置,用于天气、签到等功能",
-                    "NSLocationAlwaysAndWhenInUseUsageDescription" : "该应用需要你的地理位置,用于天气、签到等功能",
-                    "NSCalendarsUsageDescription" : "该应用需要获取你的日历,以便更好的体验",
-                    "NSContactsUsageDescription" : "该应用需要读取你的通讯录,以便联系同事",
-                    "NSBluetoothPeripheralUsageDescription" : "该应用需要你的蓝牙,以便读取相关蓝牙设备",
-                    "NFCReaderUsageDescription" : "",
-                    "NSBluetoothAlwaysUsageDescription" : "该应用需要你的蓝牙,以便读取相关蓝牙设备"
+            "ios": {
+                "dSYMs": false,
+                "privacyDescription": {
+                    "NSPhotoLibraryUsageDescription": "该应用需要读取你的相册,用于上传头像",
+                    "NSPhotoLibraryAddUsageDescription": "该应用需要读取你的相册,用于拍照保存图片",
+                    "NSCameraUsageDescription": "该应用需要你的相机,用于你拍摄上传头像信息",
+                    "NSMicrophoneUsageDescription": "该应用需要使用你的麦克风,用于语音播放",
+                    "NSLocationWhenInUseUsageDescription": "该应用需要你的地理位置,用于天气、签到等功能",
+                    "NSLocationAlwaysUsageDescription": "该应用需要持续获取用户地理位置,用于天气、签到等功能",
+                    "NSLocationAlwaysAndWhenInUseUsageDescription": "该应用需要你的地理位置,用于天气、签到等功能",
+                    "NSCalendarsUsageDescription": "该应用需要获取你的日历,以便更好的体验",
+                    "NSContactsUsageDescription": "该应用需要读取你的通讯录,以便联系同事",
+                    "NSBluetoothPeripheralUsageDescription": "该应用需要你的蓝牙,以便读取相关蓝牙设备",
+                    "NFCReaderUsageDescription": "",
+                    "NSBluetoothAlwaysUsageDescription": "该应用需要你的蓝牙,以便读取相关蓝牙设备"
                 },
-                "UIBackgroundModes" : ""
+                "UIBackgroundModes": ""
             },
-            "sdkConfigs" : {
-                "ad" : {},
-                "maps" : {
-                    "amap" : {
-                        "appkey_ios" : "fb35d03fbb17cbf7a8743a522da3c7fc",
-                        "appkey_android" : "ffc71dfd4e576596027f8f45a1b8fb2f",
-                        "name" : "amapBOujshtbA"
+            "sdkConfigs": {
+                "ad": {},
+                "maps": {
+                    "amap": {
+                        "appkey_ios": "fb35d03fbb17cbf7a8743a522da3c7fc",
+                        "appkey_android": "ffc71dfd4e576596027f8f45a1b8fb2f",
+                        "name": "amapBOujshtbA"
                     }
                 },
-                "geolocation" : {
-                    "system" : {
-                        "__platform__" : [ "ios", "android" ]
+                "geolocation": {
+                    "system": {
+                        "__platform__": [
+                            "ios",
+                            "android"
+                        ]
                     },
-                    "amap" : {
-                        "__platform__" : [ "ios", "android" ],
-                        "appkey_ios" : "fb35d03fbb17cbf7a8743a522da3c7fc",
-                        "appkey_android" : "ffc71dfd4e576596027f8f45a1b8fb2f",
-                        "name" : "amapBOujshtbA"
+                    "amap": {
+                        "__platform__": [
+                            "ios",
+                            "android"
+                        ],
+                        "appkey_ios": "fb35d03fbb17cbf7a8743a522da3c7fc",
+                        "appkey_android": "ffc71dfd4e576596027f8f45a1b8fb2f",
+                        "name": "amapBOujshtbA"
                     }
                 },
-                "push" : {
-                    "unipush" : {
-                        "version" : "2",
-                        "offline" : true,
-                        "icons" : {
-                            "small" : {
-                                "hdpi" : "unpackage/res/push/36x36.png",
-                                "ldpi" : "unpackage/res/push/18x18.png",
-                                "mdpi" : "unpackage/res/push/24x24.png",
-                                "xhdpi" : "unpackage/res/push/48x48.png",
-                                "xxhdpi" : "unpackage/res/push/72x72.png"
+                "push": {
+                    "unipush": {
+                        "version": "2",
+                        "offline": true,
+                        "icons": {
+                            "small": {
+                                "hdpi": "unpackage/res/push/36x36.png",
+                                "ldpi": "unpackage/res/push/18x18.png",
+                                "mdpi": "unpackage/res/push/24x24.png",
+                                "xhdpi": "unpackage/res/push/48x48.png",
+                                "xxhdpi": "unpackage/res/push/72x72.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"
+            "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" : {
-                "androidStyle" : "default",
-                "android" : {
-                    "hdpi" : "src/static/images/wt/bg.png"
+            "splashscreen": {
+                "androidStyle": "default",
+                "android": {
+                    "hdpi": "src/static/images/wt/bg.png"
                 },
-                "iosStyle" : "common"
-            }
-        },
-        "nativePlugins" : {
-            "Fvv-AutoStart" : {
-                "__plugin_info__" : {
-                    "name" : "AutoStart",
-                    "description" : "安卓开机自启动",
-                    "platforms" : "Android",
-                    "url" : "",
-                    "android_package_name" : "android.dcloud.uskyMobile",
-                    "ios_bundle_id" : "",
-                    "isCloud" : false,
-                    "bought" : -1,
-                    "pid" : "",
-                    "parameters" : {}
-                }
+                "iosStyle": "common"
             }
         },
-        "safearea" : {
-            "offset" : "none"
+        "nativePlugins": {},
+        "safearea": {
+            "offset": "none"
         }
     },
-    "quickapp" : {},
-    "mp-weixin" : {
-        "appid" : "",
-        "setting" : {
-            "urlCheck" : false,
-            "checkSiteMap" : false
+    "quickapp": {},
+    "mp-weixin": {
+        "appid": "",
+        "setting": {
+            "urlCheck": false,
+            "checkSiteMap": 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
     },
-    "h5" : {
-        "publicPath" : "./",
-        "title" : "智慧消防",
-        "router" : {
-            "mode" : "hash"
+    "h5": {
+        "publicPath": "./",
+        "title": "综合智慧云",
+        "router": {
+            "mode": "hash"
         },
-        "devServer" : {
-            "https" : false,
-            "proxy" : {}
+        "devServer": {
+            "https": false,
+            "proxy": {}
         },
-        "sdkConfigs" : {
-            "maps" : {
-                "amap" : {
-                    "key" : "d4d73a7d572b6ff6028d5f67de62029a",
-                    "securityJsCode" : "be916fcd16d0b33d228c49f0ff096b17",
-                    "serviceHost" : ""
+        "sdkConfigs": {
+            "maps": {
+                "amap": {
+                    "key": "d4d73a7d572b6ff6028d5f67de62029a",
+                    "securityJsCode": "be916fcd16d0b33d228c49f0ff096b17",
+                    "serviceHost": ""
                 }
             }
         },
-        "optimization" : {
-            "treeShaking" : {
-                "enable" : true
+        "optimization": {
+            "treeShaking": {
+                "enable": true
             }
         },
-        "template" : "index.html"
+        "template": "index.html"
     },
-    "vueVersion" : "3",
-    "locale" : "zh-Hans"
-}
+    "vueVersion": "3",
+    "locale": "zh-Hans"
+}

+ 772 - 772
src/pages.json

@@ -1,797 +1,797 @@
 {
-  "pages": [
-    {
-      "path": "pages/index",
-      "style": {
-        "navigationStyle": "custom",
-        "navigationBarTitleText": "工作台",
-        "app-plus": {
-          "bounce": "none",
-          "titleNView": false
-        }
-      }
-    },
-    {
-      "path": "pages/login",
-      "style": {
-        "navigationBarTitleText": "登录",
-        "navigationStyle": "custom",
-        "navigationBarTextStyle": "black" // 仅支持 black/white
-      }
-    },
-    {
-      "path": "pages/register",
-      "style": {
-        "navigationBarTitleText": "注册",
-        "navigationStyle": "custom",
-        "navigationBarTextStyle": "black" // 仅支持 black/white
-      }
-    },
-    {
-      "path": "pages/serveConfigSelect",
-      "style": {
-        "navigationBarTitleText": "服务器配置",
-        "navigationStyle": "custom",
-        "navigationBarTextStyle": "black" // 仅支持 black/white
-      }
-    },
-    {
-      "path": "pages/serveConfig",
-      "style": {
-        "navigationBarTitleText": "服务器配置",
-        "navigationStyle": "custom",
-        "navigationBarTextStyle": "black" // 仅支持 black/white
-      }
-    },
-    {
-      "path": "pages/info",
-      "style": {
-        "navigationBarTitleText": "消息",
-        "navigationStyle": "custom",
-        "enablePullDownRefresh": false,
-        "app-plus": {
-          "bounce": "none",
-          "titleNView": false
-        }
-      }
-    },
-    {
-      "path": "pages/mine",
-      "style": {
-        // "disableScroll": true,
-        "navigationBarTitleText": "我的",
-        "navigationStyle": "custom",
-        "app-plus": {
-          "bounce": "none",
-          "titleNView": false
-        }
-      }
-    }
-  ],
-  "subPackages": [
-    // 公共
-    {
-      "root": "pages/common",
-      "pages": [
-        {
-          "path": "webview/index",
-          "style": {
-            "navigationBarTitleText": "浏览网页"
-          }
-        },
-        {
-          "path": "textview/index",
-          "style": {
-            "navigationBarTitleText": "浏览文本"
-          }
-        },
-        {
-          "path": "square/index",
-          "style": {
-            "navigationBarTitleText": "",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "invoicing/index",
-          "style": {
-            "navigationBarTitleText": "续费提醒",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "phoneVerify/index",
-          "style": {
-            "navigationBarTitleText": "",
-            "navigationBarTextStyle": "black",
-            "navigationBarBackgroundColor": "#FFFFFF"
-          }
-        },
-        {
-          "path": "success/index",
-          "style": {
-            "navigationBarTitleText": "提交成功",
-            "navigationStyle": "custom",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "appMessage/index",
-          "style": {
-            "navigationBarTitleText": "消息列表",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "appMessage/details",
-          "style": {
-            "navigationBarTitleText": "消息详情",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "alarmMessage/index",
-          "style": {
-            "navigationBarTitleText": "告警通知",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "evaluate/index",
-          "style": {
-            "navigationBarTitleText": "服务评价",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "nfc/index",
-          "style": {
-            "navigationBarTitleText": "NFC读取",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "searchSelect/index",
-          "style": {
-            "navigationBarTitleText": "搜索",
-            "navigationStyle": "custom",
-            "enablePullDownRefresh": false,
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
+    "pages": [
+        {
+            "path": "pages/index",
+            "style": {
+                "navigationStyle": "custom",
+                "navigationBarTitleText": "工作台",
+                "app-plus": {
+                    "bounce": "none",
+                    "titleNView": false
+                }
             }
-          }
-        }
-      ]
-    },
-    // 我的
-    {
-      "root": "pages/mine",
-      "pages": [
-        {
-          "path": "info/index",
-          "style": {
-            "navigationBarTitleText": "我的信息"
-          }
-        },
-        {
-          "path": "msg/index",
-          "style": {
-            "navigationBarTitleText": "消息设置"
-          }
-        },
-        {
-          "path": "secure/index",
-          "style": {
-            "navigationBarTitleText": "账号与安全"
-          }
-        },
-        {
-          "path": "secure/loginLog/index",
-          "style": {
-            "navigationBarTitleText": "登录日志",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "secure/fingerprint/index",
-          "style": {
-            "navigationBarTitleText": "",
-            "navigationBarTextStyle": "black",
-            "navigationBarBackgroundColor": "#FFFFFF"
-          }
-        },
-        {
-          "path": "avatar/index",
-          "style": {
-            "navigationBarTitleText": "修改头像"
-          }
         },
         {
-          "path": "help/index",
-          "style": {
-            "navigationBarTitleText": "常见问题",
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
+            "path": "pages/login",
+            "style": {
+                "navigationBarTitleText": "登录",
+                "navigationStyle": "custom",
+                "navigationBarTextStyle": "black"
             }
-          }
         },
         {
-          "path": "about/index",
-          "style": {
-            "navigationBarTitleText": "关于我们",
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
+            "path": "pages/register",
+            "style": {
+                "navigationBarTitleText": "注册",
+                "navigationStyle": "custom",
+                "navigationBarTextStyle": "black"
             }
-          }
-        },
-        {
-          "path": "setting/index",
-          "style": {
-            "navigationBarTitleText": "设置",
-            "enablePullDownRefresh": false
-          }
-        }
-      ]
-    },
-    // 消息
-    {
-      "root": "pages/info",
-      "pages": []
-    },
-    // 智慧安防
-    {
-      "root": "pages/business/zhaf/",
-      "pages": [
-        //巡检模块 开始
-        {
-          "path": "xunJian/xunJian",
-          "style": {
-            "navigationBarTitleText": "巡检",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "xunJian/plan/index",
-          "style": {
-            "navigationBarTitleText": "巡检计划",
-            "enablePullDownRefresh": false
-          }
         },
         {
-          "path": "xunJian/plan/components/siteDetails",
-          "style": {
-            "navigationBarTitleText": "站点详情",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "xunJian/plan/components/content",
-          "style": {
-            "navigationBarTitleText": "巡检内容",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "xunJian/plan/components/report",
-          "style": {
-            "navigationBarTitleText": "巡检上报",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "xunJian/record/index",
-          "style": {
-            "navigationBarTitleText": "巡检记录",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "xunJian/record/recordDetail/index",
-          "style": {
-            "navigationBarTitleText": "巡检记录详情",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "xunJian/collect/index",
-          "style": {
-            "navigationBarTitleText": "点位采集",
-            "navigationStyle": "custom",
-            "enablePullDownRefresh": false,
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
+            "path": "pages/serveConfigSelect",
+            "style": {
+                "navigationBarTitleText": "服务器配置",
+                "navigationStyle": "custom",
+                "navigationBarTextStyle": "black"
             }
-          }
         },
         {
-          "path": "xunJian/collect/components/collectDetail",
-          "style": {
-            "navigationBarTitleText": "采集上报",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "xunJian/collect/components/collectRecord",
-          "style": {
-            "navigationBarTitleText": "采集记录",
-            "navigationStyle": "custom",
-            "enablePullDownRefresh": false,
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
+            "path": "pages/serveConfig",
+            "style": {
+                "navigationBarTitleText": "服务器配置",
+                "navigationStyle": "custom",
+                "navigationBarTextStyle": "black"
             }
-          }
-        },
-        {
-          "path": "xunJian/error/index",
-          "style": {
-            "navigationBarTitleText": "异常上报",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "xunJian/error/errorList",
-          "style": {
-            "navigationBarTitleText": "异常列表",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "xunJian/error/errorListDetail",
-          "style": {
-            "navigationBarTitleText": "事件详情",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "xunJian/error/errorDisposition",
-          "style": {
-            "navigationBarTitleText": "处置内容",
-            "enablePullDownRefresh": false
-          }
-        },
-        //巡检模块 结束
-        //人员签到 开始
-        {
-          "path": "signIn/index",
-          "style": {
-            "navigationBarTitleText": "人员签到",
-            "enablePullDownRefresh": false
-          }
-        }
-        //人员签到 签退
-      ]
-    },
-    // 闵行消防
-    {
-      "root": "pages/business/mhxf/",
-      "pages": [
-        {
-          "path": "informationSelect/index",
-          "style": {
-            "navigationBarTitleText": "信息查询",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "deviceManage/index",
-          "style": {
-            "navigationBarTitleText": "设备管理",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "coordination/index",
-          "style": {
-            "navigationBarTitleText": "协同作战地图",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "unitInfoCollection/index",
-          "style": {
-            "navigationBarTitleText": "单位信息采集",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "fireReport/index",
-          "style": {
-            "navigationBarTitleText": "消防报告",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "fireReport/components/detailed",
-          "style": {
-            "navigationBarTitleText": "消防报告",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "fireReport/components/detailedPath",
-          "style": {
-            "navigationBarTitleText": "消防报告",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "needMatter/index",
-          "style": {
-            "navigationBarTitleText": "待办事项",
-            "enablePullDownRefresh": false
-          }
-        }
-      ]
-    },
-    // 智慧消防
-    {
-      "root": "pages/business/zhxf/",
-      "pages": [
-        {
-          "path": "messagePush/index",
-          "style": {
-            "navigationBarTitleText": "消息推送设置",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "building/index",
-          "style": {
-            "navigationBarTitleText": "建筑管理",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "fireInspect/index",
-          "style": {
-            "navigationBarTitleText": "消防督察单",
-            "enablePullDownRefresh": false
-          }
         },
         {
-          "path": "fireInspect/inspectDetailsList/index",
-          "style": {
-            "navigationBarTitleText": "",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "fireInspect/inspectDetails/index",
-          "style": {
-            "navigationBarTitleText": "消防督察单处理",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "funReport/index",
-          "style": {
-            "navigationBarTitleText": "功能报备",
-            "enablePullDownRefresh": false,
-            "onReachBottomDistance": 100 //距离底部多远时触发 单位px
-          }
+            "path": "pages/info",
+            "style": {
+                "navigationBarTitleText": "消息",
+                "navigationStyle": "custom",
+                "enablePullDownRefresh": false,
+                "app-plus": {
+                    "bounce": "none",
+                    "titleNView": false
+                }
+            }
         },
         {
-          "path": "funReport/funcAdd/index",
-          "style": {
-            "navigationBarTitleText": "功能报备新增",
-            "enablePullDownRefresh": false
-          }
+            "path": "pages/mine",
+            "style": {
+                "navigationBarTitleText": "我的",
+                "navigationStyle": "custom",
+                "app-plus": {
+                    "bounce": "none",
+                    "titleNView": false
+                }
+            }
         }
-      ]
-    },
-    // 消防物联网
-    {
-      "root": "pages/business/fireIot/",
-      "pages": [
-        {
-          "path": "deviceManage/index",
-          "style": {
-            "navigationBarTitleText": "设备管理",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "deviceManage/components/deviceDetailsList",
-          "style": {
-            "navigationBarTitleText": "",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "deviceManage/components/deviceDetails",
-          "style": {
-            "navigationBarTitleText": "设备详情",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "facilitiesGather/index",
-          "style": {
-            "navigationBarTitleText": "设施采集",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "facilitiesGather/mapGather",
-          "style": {
-            "navigationBarTitleText": "地图采集",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "facilitiesManage/index",
-          "style": {
-            "navigationBarTitleText": "设施管理",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "facilitiesManage/mapFacilitiesView",
-          "style": {
-            "navigationBarTitleText": "设施查看",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "facilitiesManage/facilitiesDetailsList",
-          "style": {
-            "navigationBarTitleText": "",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "facilitiesManage/facilitiesDetails",
-          "style": {
-            "navigationBarTitleText": "设施详情",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "alarmManage/index",
-          "style": {
-            "navigationBarTitleText": "告警管理",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "alarmManage/alarmDetailsList/index",
-          "style": {
-            "navigationBarTitleText": "",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "alarmManage/alarmDetails/index",
-          "style": {
-            "navigationBarTitleText": "告警处理",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "repairManage/repairDetailsList",
-          "style": {
-            "navigationBarTitleText": "报修列表",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "repairManage/repairDetails",
-          "style": {
-            "navigationBarTitleText": "报修处理",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "customManage/index",
-          "style": {
-            "navigationBarTitleText": "客户管理",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "repairReport/index",
-          "style": {
-            "navigationBarTitleText": "报修申请",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "repairReport/record",
-          "style": {
-            "navigationBarTitleText": "报修历史",
-            "enablePullDownRefresh": false
-          }
+    ],
+    "subPackages": [
+        {
+            "name": "公共模块",
+            "root": "pages/common",
+            "pages": [
+                {
+                    "path": "webview/index",
+                    "style": {
+                        "navigationBarTitleText": "浏览网页"
+                    }
+                },
+                {
+                    "path": "textview/index",
+                    "style": {
+                        "navigationBarTitleText": "浏览文本"
+                    }
+                },
+                {
+                    "path": "square/index",
+                    "style": {
+                        "navigationBarTitleText": "",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "invoicing/index",
+                    "style": {
+                        "navigationBarTitleText": "续费提醒",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "phoneVerify/index",
+                    "style": {
+                        "navigationBarTitleText": "",
+                        "navigationBarTextStyle": "black",
+                        "navigationBarBackgroundColor": "#FFFFFF"
+                    }
+                },
+                {
+                    "path": "success/index",
+                    "style": {
+                        "navigationBarTitleText": "提交成功",
+                        "navigationStyle": "custom",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "appMessage/index",
+                    "style": {
+                        "navigationBarTitleText": "消息列表",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "appMessage/details",
+                    "style": {
+                        "navigationBarTitleText": "消息详情",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "alarmMessage/index",
+                    "style": {
+                        "navigationBarTitleText": "告警通知",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "evaluate/index",
+                    "style": {
+                        "navigationBarTitleText": "服务评价",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "nfc/index",
+                    "style": {
+                        "navigationBarTitleText": "NFC读取",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "searchSelect/index",
+                    "style": {
+                        "navigationBarTitleText": "搜索",
+                        "navigationStyle": "custom",
+                        "enablePullDownRefresh": false,
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "face/index",
+                    "style": {
+                        "navigationBarTitleText": "人脸识别",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                }
+            ]
+        },
+        {
+            "name": "我的",
+            "root": "pages/mine",
+            "pages": [
+                {
+                    "path": "info/index",
+                    "style": {
+                        "navigationBarTitleText": "我的信息"
+                    }
+                },
+                {
+                    "path": "msg/index",
+                    "style": {
+                        "navigationBarTitleText": "消息设置"
+                    }
+                },
+                {
+                    "path": "secure/index",
+                    "style": {
+                        "navigationBarTitleText": "账号与安全"
+                    }
+                },
+                {
+                    "path": "secure/loginLog/index",
+                    "style": {
+                        "navigationBarTitleText": "登录日志",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "secure/fingerprint/index",
+                    "style": {
+                        "navigationBarTitleText": "",
+                        "navigationBarTextStyle": "black",
+                        "navigationBarBackgroundColor": "#FFFFFF"
+                    }
+                },
+                {
+                    "path": "avatar/index",
+                    "style": {
+                        "navigationBarTitleText": "修改头像"
+                    }
+                },
+                {
+                    "path": "help/index",
+                    "style": {
+                        "navigationBarTitleText": "常见问题",
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "about/index",
+                    "style": {
+                        "navigationBarTitleText": "关于我们",
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "setting/index",
+                    "style": {
+                        "navigationBarTitleText": "设置",
+                        "enablePullDownRefresh": false
+                    }
+                }
+            ]
+        },
+        {
+            "name": "智慧安防",
+            "root": "pages/business/zhaf/",
+            "pages": [
+                {
+                    "path": "xunJian/xunJian",
+                    "style": {
+                        "navigationBarTitleText": "巡检",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/plan/index",
+                    "style": {
+                        "navigationBarTitleText": "巡检计划",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/plan/components/siteDetails",
+                    "style": {
+                        "navigationBarTitleText": "站点详情",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/plan/components/content",
+                    "style": {
+                        "navigationBarTitleText": "巡检内容",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/plan/components/report",
+                    "style": {
+                        "navigationBarTitleText": "巡检上报",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/record/index",
+                    "style": {
+                        "navigationBarTitleText": "巡检记录",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/record/recordDetail/index",
+                    "style": {
+                        "navigationBarTitleText": "巡检记录详情",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/collect/index",
+                    "style": {
+                        "navigationBarTitleText": "点位采集",
+                        "navigationStyle": "custom",
+                        "enablePullDownRefresh": false,
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "xunJian/collect/components/collectDetail",
+                    "style": {
+                        "navigationBarTitleText": "采集上报",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/collect/components/collectRecord",
+                    "style": {
+                        "navigationBarTitleText": "采集记录",
+                        "navigationStyle": "custom",
+                        "enablePullDownRefresh": false,
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "xunJian/error/index",
+                    "style": {
+                        "navigationBarTitleText": "异常上报",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/error/errorList",
+                    "style": {
+                        "navigationBarTitleText": "异常列表",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/error/errorListDetail",
+                    "style": {
+                        "navigationBarTitleText": "事件详情",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "xunJian/error/errorDisposition",
+                    "style": {
+                        "navigationBarTitleText": "处置内容",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "signIn/index",
+                    "style": {
+                        "navigationBarTitleText": "人员签到",
+                        "enablePullDownRefresh": false
+                    }
+                }
+            ]
+        },
+        {
+            "name": "闵行消防",
+            "root": "pages/business/mhxf/",
+            "pages": [
+                {
+                    "path": "informationSelect/index",
+                    "style": {
+                        "navigationBarTitleText": "信息查询",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "deviceManage/index",
+                    "style": {
+                        "navigationBarTitleText": "设备管理",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "coordination/index",
+                    "style": {
+                        "navigationBarTitleText": "协同作战地图",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "unitInfoCollection/index",
+                    "style": {
+                        "navigationBarTitleText": "单位信息采集",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "fireReport/index",
+                    "style": {
+                        "navigationBarTitleText": "消防报告",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "fireReport/components/detailed",
+                    "style": {
+                        "navigationBarTitleText": "消防报告",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "fireReport/components/detailedPath",
+                    "style": {
+                        "navigationBarTitleText": "消防报告",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "needMatter/index",
+                    "style": {
+                        "navigationBarTitleText": "待办事项",
+                        "enablePullDownRefresh": false
+                    }
+                }
+            ]
+        },
+        {
+            "name": "智慧消防",
+            "root": "pages/business/zhxf/",
+            "pages": [
+                {
+                    "path": "messagePush/index",
+                    "style": {
+                        "navigationBarTitleText": "消息推送设置",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "building/index",
+                    "style": {
+                        "navigationBarTitleText": "建筑管理",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "fireInspect/index",
+                    "style": {
+                        "navigationBarTitleText": "消防督察单",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "fireInspect/inspectDetailsList/index",
+                    "style": {
+                        "navigationBarTitleText": "",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "fireInspect/inspectDetails/index",
+                    "style": {
+                        "navigationBarTitleText": "消防督察单处理",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "funReport/index",
+                    "style": {
+                        "navigationBarTitleText": "功能报备",
+                        "enablePullDownRefresh": false,
+                        "onReachBottomDistance": 100
+                    }
+                },
+                {
+                    "path": "funReport/funcAdd/index",
+                    "style": {
+                        "navigationBarTitleText": "功能报备新增",
+                        "enablePullDownRefresh": false
+                    }
+                }
+            ]
+        },
+        {
+            "name": "消防物联网",
+            "root": "pages/business/fireIot/",
+            "pages": [
+                {
+                    "path": "deviceManage/index",
+                    "style": {
+                        "navigationBarTitleText": "设备管理",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "deviceManage/components/deviceDetailsList",
+                    "style": {
+                        "navigationBarTitleText": "",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "deviceManage/components/deviceDetails",
+                    "style": {
+                        "navigationBarTitleText": "设备详情",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "facilitiesGather/index",
+                    "style": {
+                        "navigationBarTitleText": "设施采集",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "facilitiesGather/mapGather",
+                    "style": {
+                        "navigationBarTitleText": "地图采集",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "facilitiesManage/index",
+                    "style": {
+                        "navigationBarTitleText": "设施管理",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "facilitiesManage/mapFacilitiesView",
+                    "style": {
+                        "navigationBarTitleText": "设施查看",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "facilitiesManage/facilitiesDetailsList",
+                    "style": {
+                        "navigationBarTitleText": "",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "facilitiesManage/facilitiesDetails",
+                    "style": {
+                        "navigationBarTitleText": "设施详情",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "alarmManage/index",
+                    "style": {
+                        "navigationBarTitleText": "告警管理",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "alarmManage/alarmDetailsList/index",
+                    "style": {
+                        "navigationBarTitleText": "",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "alarmManage/alarmDetails/index",
+                    "style": {
+                        "navigationBarTitleText": "告警处理",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "repairManage/repairDetailsList",
+                    "style": {
+                        "navigationBarTitleText": "报修列表",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "repairManage/repairDetails",
+                    "style": {
+                        "navigationBarTitleText": "报修处理",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "customManage/index",
+                    "style": {
+                        "navigationBarTitleText": "客户管理",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "repairReport/index",
+                    "style": {
+                        "navigationBarTitleText": "报修申请",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "repairReport/record",
+                    "style": {
+                        "navigationBarTitleText": "报修历史",
+                        "enablePullDownRefresh": false
+                    }
+                }
+            ]
+        },
+        {
+            "name": "业务公共模块",
+            "root": "pages/business/common/",
+            "pages": [
+                {
+                    "path": "fastMail/index",
+                    "style": {
+                        "navigationBarTitleText": "我的快递",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "videoMonitor/videoList",
+                    "style": {
+                        "navigationBarTitleText": "视频监测列表",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "videoMonitor/videoDetail",
+                    "style": {
+                        "navigationBarTitleText": "实时监控",
+                        "enablePullDownRefresh": false
+                    }
+                },
+                {
+                    "path": "projectMange/record/index",
+                    "style": {
+                        "navigationBarTitleText": "工作报告",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "projectMange/record/details",
+                    "style": {
+                        "navigationBarTitleText": "报告详情",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "projectMange/overview/index",
+                    "style": {
+                        "navigationBarTitleText": "项目概览",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "projectMange/record/timingLog",
+                    "style": {
+                        "navigationBarTitleText": "定时日志",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "projectMange/write/index",
+                    "style": {
+                        "navigationBarTitleText": "报告填写",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "projectMange/write/insert",
+                    "style": {
+                        "navigationBarTitleText": "",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "projectMange/list/index",
+                    "style": {
+                        "navigationBarTitleText": "项目列表",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "projectMange/list/addEdit",
+                    "style": {
+                        "navigationBarTitleText": "",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "projectMange/mall/index",
+                    "style": {
+                        "navigationBarTitleText": "选择接收人",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                }
+            ]
         }
-      ]
+    ],
+    "globalStyle": {
+        "navigationBarTextStyle": "white",
+        "navigationBarTitleText": "uni-app",
+        "backgroundColor": "#F8F8F8"
     },
-    // 业务公共模块
-    {
-      "root": "pages/business/common/",
-      "pages": [
-        {
-          "path": "fastMail/index",
-          "style": {
-            "navigationBarTitleText": "我的快递",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "videoMonitor/videoList",
-          "style": {
-            "navigationBarTitleText": "视频监测列表",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "videoMonitor/videoDetail",
-          "style": {
-            "navigationBarTitleText": "实时监控",
-            "enablePullDownRefresh": false
-          }
-        },
-        {
-          "path": "projectMange/record/index",
-          "style": {
-            "navigationBarTitleText": "工作报告",
-            "enablePullDownRefresh": false,
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
+    "tabBar": {
+        "fontSize": "12px",
+        "color": "#a9a9a9",
+        "selectedColor": "#000000",
+        "borderStyle": "white",
+        "backgroundColor": "#ffffff",
+        "list": [
+            {
+                "pagePath": "pages/index",
+                "iconPath": "/static/images/tabBar/tab-home.png",
+                "selectedIconPath": "/static/images/tabBar/tab-home-blue.png",
+                "text": "工作台",
+                "visible": false
+            },
+            {
+                "pagePath": "pages/info",
+                "iconPath": "/static/images/tabBar/tab-info.png",
+                "selectedIconPath": "/static/images/tabBar/tab-info-blue.png",
+                "text": "消息",
+                "visible": false
+            },
+            {
+                "pagePath": "pages/mine",
+                "iconPath": "/static/images/tabBar/tab-my.png",
+                "selectedIconPath": "/static/images/tabBar/tab-my-blue.png",
+                "text": "我的",
+                "visible": false
             }
-          }
-        },
-        {
-          "path": "projectMange/record/details",
-          "style": {
-            "navigationBarTitleText": "报告详情",
-            "enablePullDownRefresh": false,
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
-            }
-          }
-        },
-        {
-          "path": "projectMange/overview/index",
-          "style": {
-            "navigationBarTitleText": "项目概览",
-            "enablePullDownRefresh": false,
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
-            }
-          }
-        },
-        {
-          "path": "projectMange/record/timingLog",
-          "style": {
-            "navigationBarTitleText": "定时日志",
-            "enablePullDownRefresh": false,
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
-            }
-          }
-        },
-        {
-          "path": "projectMange/write/index",
-          "style": {
-            "navigationBarTitleText": "报告填写",
-            "enablePullDownRefresh": false,
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
-            }
-          }
-        },
-        {
-          "path": "projectMange/write/insert",
-          "style": {
-            "navigationBarTitleText": "",
-            "enablePullDownRefresh": false,
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
-            }
-          }
-        },
-        {
-          "path": "projectMange/list/index",
-          "style": {
-            "navigationBarTitleText": "项目列表",
-            "enablePullDownRefresh": false,
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
-            }
-          }
-        },
-        {
-          "path": "projectMange/list/addEdit",
-          "style": {
-            "navigationBarTitleText": "",
-            "enablePullDownRefresh": false,
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
-            }
-          }
-        },
-        {
-          "path": "projectMange/mall/index",
-          "style": {
-            "navigationBarTitleText": "选择接收人",
-            "enablePullDownRefresh": false,
-            "navigationStyle": "custom",
-            "app-plus": {
-              "bounce": "none",
-              "titleNView": false
+        ]
+    },
+    "condition": {
+        "current": 0,
+        "list": [
+            {
+                "name": "",
+                "path": "pages/login",
+                "query": ""
             }
-          }
-        }
-      ]
+        ]
     }
-  ],
-  "globalStyle": {
-    "navigationBarTextStyle": "white",
-    "navigationBarTitleText": "uni-app",
-    // "navigationBarBackgroundColor": "#000000",
-    "backgroundColor": "#F8F8F8"
-  },
-  "tabBar": {
-    "fontSize": "12px",
-    "color": "#a9a9a9",
-    "selectedColor": "#000000",
-    "borderStyle": "white",
-    "backgroundColor": "#ffffff",
-    "list": [
-      {
-        "pagePath": "pages/index",
-        "iconPath": "/static/images/tabBar/tab-home.png",
-        "selectedIconPath": "/static/images/tabBar/tab-home-blue.png",
-        "text": "工作台",
-        "visible": false
-      },
-      {
-        "pagePath": "pages/info",
-        "iconPath": "/static/images/tabBar/tab-info.png",
-        "selectedIconPath": "/static/images/tabBar/tab-info-blue.png",
-        "text": "消息",
-        "visible": false
-      },
-      {
-        "pagePath": "pages/mine",
-        "iconPath": "/static/images/tabBar/tab-my.png",
-        "selectedIconPath": "/static/images/tabBar/tab-my-blue.png",
-        "text": "我的",
-        "visible": false
-      }
-    ]
-  },
-  "condition": {
-    //模式配置,仅开发期间生效
-    "current": 0, //当前激活的模式(list 的索引项)
-    "list": [
-      {
-        "name": "", //模式名称
-        "path": "pages/login", //启动页面,必选
-        "query": "" //启动参数,在页面的onLoad函数里面得到
-      }
-    ]
-  }
 }

+ 20 - 3
src/pages/business/common/projectMange/list/addEdit.vue

@@ -57,6 +57,19 @@
           />
           <u-button class="mt20" type="primary" style="width: 100px; height: 25px" @click="handleAction('项目状态', project_status)" shape="circle" icon="plus" size="mini"> 选择项目状态 </u-button>
         </view>
+        <view class="content-area-item mt10 p10 bg-white">
+          <view class="font14 weight mb10 required">公开状态</view>
+          <u-input
+            :modelValue="proxy.$common.mapping('label', 'value', form.visibleRange, project_displayType)"
+            fontSize="14px"
+            placeholderStyle="color:#909399;font-size:12px"
+            placeholder="请选择"
+            border="none"
+            disabledColor="transparent"
+            disabled
+          />
+          <u-button class="mt20" type="primary" style="width: 100px; height: 25px" @click="handleAction('公开状态', project_displayType)" shape="circle" icon="plus" size="mini"> 选择公开状态 </u-button>
+        </view>
         <view class="content-area-item mt10 p10 bg-white">
           <view class="font14 weight mb10 required">项目负责人</view>
           <avatarList :userList="projectHeadList" @deleteUsers="(value) => deleteUsers(value, 'projectHeadList')" />
@@ -127,7 +140,7 @@ import { storageSystem } from "@/utils/storage"; // 公共方法引用
 /*----------------------------------公共变量-----------------------------------*/
 const systemStore = systemStores();
 const { proxy } = getCurrentInstance();
-const { project_status, project_type, project_ascription } = proxy.useDict("project_status", "project_type", "project_ascription");
+const { project_status, project_type, project_ascription,project_displayType } = proxy.useDict("project_status", "project_type", "project_ascription","project_displayType");
 const props = defineProps({
   id: {
     type: String,
@@ -196,9 +209,11 @@ function handleAction(title, event, index, ind) {
  */
 function selectAction(e) {
   if (state.actionTitle == "项目类型") {
-    state.form.projectType = e.value[0].value; //项目名称
+    state.form.projectType = e.value[0].value;
   } else if (state.actionTitle == "项目状态") {
-    state.form.projectStatus = e.value[0].value; //项目名称
+    state.form.projectStatus = e.value[0].value; 
+  } else if (state.actionTitle == "公开状态") {
+    state.form.visibleRange = e.value[0].value;
   }
   state.actionShow = false;
 }
@@ -221,6 +236,7 @@ function selectListApi() {
         state.form.projectName = data.projectName;
         state.form.projectType = data.projectType;
         state.form.projectStatus = data.projectStatus;
+        state.form.visibleRange = data.visibleRange;
         state.form.projectWorkload = data.projectWorkload ? data.projectWorkload : "";
         state.form.projectHead = data.projectHead;
         state.form.projectMember = data.projectMember;
@@ -303,6 +319,7 @@ function handleSubmit(value) {
       projectHead: state.form.projectHead, //项目负责人
       projectMember: state.form.projectMember, //项目成员
       projectDescribe: state.form.projectDescribe, //项目描述
+      visibleRange: state.form.visibleRange, //公开状态
       // startTime: "2022-10-01T01:00:00",
       // endTime: "2023-03-31T23:59:59",
     })

+ 93 - 72
src/pages/business/common/projectMange/list/index.vue

@@ -29,10 +29,10 @@
     :isSticky="true"
     :customStyle="{
       //#ifdef APP-PLUS || MP-WEIXIN
-      height: 'calc(100vh - 132px)',
+      height: `calc(100vh - (138px + ${proxy.$settingStore.StatusBarHeight}))`,
       //#endif
       //#ifdef H5
-      height: 'calc(100vh - 132px)',
+      height: `calc(100vh - (138px))`,
       //#endif
     }"
     :refresherLoad="true"
@@ -46,9 +46,18 @@
     :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
   >
     <template #default>
-      <view class="projectSearchBox" >
-        <u-input v-model="projectTypeName" disabledColor="#fff" disabled clearable  @click="handleAction('项目类型',project_type)" placeholder="项目类型" suffixIcon="arrow-down" suffixIconStyle="color: #909399" />        
-        <u-input v-model="projectName" placeholder="请输入项目名称"  clearable prefixIcon="search" size="small" />
+      <view class="projectSearchBox">
+        <u-input
+          v-model="projectTypeName"
+          disabledColor="#fff"
+          disabled
+          clearable
+          @click="handleAction('项目类型', project_type)"
+          placeholder="项目类型"
+          suffixIcon="arrow-down"
+          suffixIconStyle="color: #909399"
+        />
+        <u-input v-model="projectName" placeholder="请输入项目名称" clearable prefixIcon="search" size="small" />
         <!-- <u-button   type="primary" @click="selectListApi">搜索</u-button> -->
         <u-picker
           :show="actionShow"
@@ -61,23 +70,34 @@
           @cancel="actionShow = false"
           @confirm="selectAction"
         ></u-picker>
-
-      </view>      		
+      </view>
       <view class="menu-list m0">
-        <view class="list-cell" style="color: #666666; line-height: 25px" v-for="(base, index) in dataList" :key="index">
+        <view class="list-cell" style="color: #666666; line-height: 25px; margin: 10px; width: auto; border-radius: 10px" v-for="(base, index) in dataList" :key="index">
           <view class="content-area-top menu-item">
-            <view class="content-area-top-name" style="color: #559AFF;" @click="toProjectMange(base.id)">{{ base.projectName }} </view>
+            <view class="content-area-top-name" style="color: #559aff" @click="toProjectMange(base.id)">{{ base.projectName }} </view>
+            <view class="content-area-top-status" :style="{ backgroundColor: proxy.$common.mapping('elTagClass', 'value', base.projectStatus, project_status) }" style="margin-left: 10px">
+              {{ proxy.$common.mapping("label", "value", base.projectStatus, project_status) }}
+            </view>
+
             <u-icon class="content-area-top-icon" name="more-dot-fill" size="20" color="#000" @click="moreClick(base)"></u-icon>
           </view>
           <view class="content-area-row_wrap menu-item">
             <view class="content-area-row_wrap-view"> 负责人: {{ proxy.$common.mapping("nickName", "userId", base.projectHead, userDate) }} </view>
-            <view class="content-area-row_wrap-view">
+            <!-- <view class="content-area-row_wrap-view">
               状态:
-			  <span :style='{color:proxy.$common.mapping("elTagClass", "value", base.projectStatus, project_status)}'>{{ proxy.$common.mapping("label", "value", base.projectStatus, project_status) }}</span>
-            </view>
+              <span :style="{ color: proxy.$common.mapping('elTagClass', 'value', base.projectStatus, project_status) }">{{
+                proxy.$common.mapping("label", "value", base.projectStatus, project_status)
+              }}</span>
+            </view> -->
             <view class="content-area-row_wrap-view">
               类型:
-			  {{ proxy.$common.mapping("label", "value", base.projectStatus, project_type) }}
+              {{ proxy.$common.mapping("label", "value", base.projectStatus, project_type) }}
+            </view>
+            <view class="content-area-row_wrap-view">
+              公开状态:
+              <span :style="{ color: proxy.$common.mapping('elTagClass', 'value', base.visibleRange, project_displayType) }">{{
+                proxy.$common.mapping("label", "value", base.visibleRange, project_displayType)
+              }}</span>
             </view>
             <view class="content-area-row_wrap-view" style="display: block">
               成员:<span>{{ proxy.$common.mapping("nickName", "userId", base.projectMember, userDate) }} </span>
@@ -188,7 +208,7 @@
 <script setup>
 /*----------------------------------依赖引入-----------------------------------*/
 import { onLoad, onShow, onReady, onHide, onLaunch, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
-import { ref, reactive, computed, getCurrentInstance, toRefs, inject,watchEffect} from "vue";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject, watchEffect } from "vue";
 /*----------------------------------接口引入-----------------------------------*/
 import { projectApi } from "@/api/business/project.js";
 import { dUserList } from "@/api/system/user.js";
@@ -198,10 +218,8 @@ import { useStores } from "@/store/modules/index";
 /*----------------------------------公共方法引入-----------------------------------*/
 /*----------------------------------公共变量-----------------------------------*/
 const { proxy } = getCurrentInstance();
-
 const useStore = useStores();
-const { project_type,project_status } = proxy.useDict("project_type","project_status");
-
+const { project_type, project_status, project_displayType } = proxy.useDict("project_type", "project_status", "project_displayType");
 /*----------------------------------变量声明-----------------------------------*/
 const state = reactive({
   loading: false,
@@ -227,24 +245,24 @@ const state = reactive({
     content: "", //提示信息
   },
   eventList: {}, //数据存储
-  projectName:'',
+  projectName: "",
   projectTypeName: "", //项目类型名称
   actionShow: false,
   projectType: "", //项目类型
-  projectTypeList:[[]],    
+  projectTypeList: [[]],
 });
 
-const { tabsList, tabsCurrent, dataList, pageSize, current, total, userDate, popup, modal, eventList,array,index,projectTypeName,actionShow,projectType,projectTypeList,projectName} = toRefs(state);
-
+const { tabsList, tabsCurrent, dataList, pageSize, current, total, userDate, popup, modal, eventList, array, index, projectTypeName, actionShow, projectType, projectTypeList, projectName } =
+  toRefs(state);
 
 /**
  * @action弹出框点击事件
  */
- function handleAction(value,event, index, ind) {
-  if(!event.some((element => element.value==0))){
-    event.unshift({label:'全部',value:0})
-  } 
- 
+function handleAction(value, event, index, ind) {
+  if (!event.some((element) => element.value == 0)) {
+    event.unshift({ label: "全部", value: 0 });
+  }
+
   if (value == "项目类型") {
     state.projectTypeList[0] = event;
   }
@@ -255,10 +273,10 @@ const { tabsList, tabsCurrent, dataList, pageSize, current, total, userDate, pop
 /**
  * @action弹出框选择事件
  */
- function selectAction(e) {
-   state.projectType = e.value[0].value;
-   state.projectTypeName = e.value[0].label;
-   state.actionShow = false;
+function selectAction(e) {
+  state.projectType = e.value[0].value;
+  state.projectTypeName = e.value[0].label;
+  state.actionShow = false;
 }
 
 /**
@@ -360,7 +378,6 @@ function selectListApi() {
  */
 function load() {
   state.pageSize += 10;
-  init();
 }
 
 /**
@@ -368,7 +385,6 @@ function load() {
  */
 function refresh() {
   state.pageSize = 20;
-  init();
 }
 
 /**
@@ -376,10 +392,9 @@ function refresh() {
  */
 function tabsClick(e) {
   state.tabsCurrent = e.index;
-  state.projectName='';
-  state.projectType='';
-  state.projectTypeName=''
-  init();
+  state.projectName = "";
+  state.projectType = "";
+  state.projectTypeName = "";
 }
 /**
  * 跳转项目概览
@@ -408,56 +423,62 @@ onLoad((options) => {});
   font-size: 14px;
   justify-content: left;
 }
+:deep(.list-container .content-area-top-name) {
+  font-size: 16px !important;
+}
 </style>
 <style lang="scss" scoped>
 .projectSearchBox {
-  margin:20px 4% ;width:92%;vertical-align:middle;
-  position:relative;
-  display:flex;
-  :deep(.u-input--radius, .u-input--square){
-      border-radius:0
-    }
-  
-  .u-input{
-   display:inline-block;background:#fff;height:34px;line-height:34px;padding:0 5px;
-    .uni-input-input{
-      font-size:12px!important;
+  margin: 20px 4%;
+  width: 92%;
+  vertical-align: middle;
+  position: relative;
+  display: flex;
+  :deep(.u-input--radius, .u-input--square) {
+    border-radius: 0;
+  }
+
+  .u-input {
+    display: inline-block;
+    background: #fff;
+    height: 34px;
+    line-height: 34px;
+    padding: 0 5px;
+    .uni-input-input {
+      font-size: 12px !important;
     }
-    :deep(.u-input__content__prefix-icon){
-      position:absolute;
-      right:8px;
-       .uicon-search{
-        font-size:16px
+    :deep(.u-input__content__prefix-icon) {
+      position: absolute;
+      right: 8px;
+      .uicon-search {
+        font-size: 16px;
       }
     }
   }
-  .u-input:first-child{
-    flex:2;
+  .u-input:first-child {
+    flex: 2;
     border-top-left-radius: 20px;
     border-bottom-left-radius: 20px;
-    border-right:none;
+    border-right: none;
   }
-  .u-input:nth-child(2){
-    flex:4;
+  .u-input:nth-child(2) {
+    flex: 4;
     // width:70%;
     border-top-right-radius: 20px;
     border-bottom-right-radius: 20px;
     // border-left:none
   }
-  .u-popup{
-    flex:0;
+  .u-popup {
+    flex: 0;
   }
-  .u-button{
-    width:50px;
-    position:absolute;
-    right:0px;
-    top:0;
-    height:32px;
-    line-height:32px;
-   
-
+  .u-button {
+    width: 50px;
+    position: absolute;
+    right: 0px;
+    top: 0;
+    height: 32px;
+    line-height: 32px;
   }
-  
 }
 .list-container {
   .content-area {
@@ -523,9 +544,9 @@ onLoad((options) => {});
     }
   }
 }
-:deep(.uni-tag){
-  padding:0px 2px;
-  height:20px;
+:deep(.uni-tag) {
+  padding: 0px 2px;
+  height: 20px;
   line-height: 20px !important;
   border-radius: 10px;
 }

+ 1 - 1
src/pages/business/common/projectMange/overview/index.vue

@@ -47,7 +47,7 @@
           <view class="menu-item">
             <span style="color:#559AFF;font-weight:bold;">丨 背景</span>
           </view>
-          <view class="menu-item">
+          <view class="menu-item textExceeds">
             <span>{{ project.projectDescribe ? project.projectDescribe : "无" }}</span>
           </view>
         </view>

+ 108 - 34
src/pages/business/common/projectMange/record/details.vue

@@ -11,10 +11,10 @@
     customClass="record-details-container scroll-height"
     :style="{
       //#ifdef APP-PLUS || MP-WEIXIN
-      height: 'calc(100vh - 88px)',
+      height: `calc(100vh - (44px + ${proxy.$settingStore.StatusBarHeight}))`,
       //#endif
       //#ifdef H5
-      height: 'calc(100vh - 44px)',
+      height: 'calc(100vh - (44px))',
       //#endif
     }"
     :refresherLoad="false"
@@ -26,9 +26,9 @@
     :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
   >
     <template #default>
-      <view class="content-area radius bg-white" v-for="(item,index) in dataList" :key="index">
+      <view class="content-area radius bg-white" v-for="(item, index) in dataList" :key="index">
         <view class="content-area-header flex mb10">
-          <img :src="item.avatar"  class="content-area-header-avatarImg mr10" v-if="item.avatar"/>
+          <img :src="item.avatar" class="content-area-header-avatarImg mr10" v-if="item.avatar" />
           <u-avatar
             v-if="!item.avatar"
             class="content-area-header-avatar mr10"
@@ -47,29 +47,62 @@
 
         <view class="content-area-center mb10" v-for="child in item.workContents" :key="child">
           <view class="content-area-center-top flex">
-            <view class="content-area-center-top-title mr10" style="color: #559AFF;" @click="toProjectMange(child.projectId)">{{ child.projectName ? child.projectName : " " }}</view>
+            <view class="content-area-center-top-title mr10" style="color: #559aff" @click="toProjectMange(child.projectId)">{{ child.projectName ? child.projectName : " " }}</view>
             <view class="content-area-center-top-time" :style="{ color: proxy.$settingStore.themeColor.color }">{{ child.workTime }}h</view>
           </view>
           <u-text :text="child.workContent" color="#000000" size="14"></u-text>
         </view>
         <view class="content-area-center mb10">
           <view class="content-area-center-top"> 明日计划 </view>
-          <u-text :text="item.tomorrowPlan" color="#000000" size="14"></u-text>
+          <u-text :text="item.tomorrowPlan ? item.tomorrowPlan : '无'" color="#000000" size="14"></u-text>
         </view>
         <view class="content-area-center mb10">
           <view class="content-area-center-top"> 工作协调 </view>
-          <u-text :text="item.coordinateWork" color="#000000" size="14"></u-text>
+          <u-text :text="item.coordinateWork ? item.coordinateWork : '无'" color="#000000" size="14"></u-text>
         </view>
         <view class="content-area-center mb10">
-          <view class="content-area-center-top">抄送人 </view>
-          <u-text :text='item.ccTo ? proxy.$common.mapping("nickName", "userId", item.ccTo, userData) : "无"' color="#000000" size="14"></u-text>
+          <view class="content-area-center-top">图片</view>
+          <view class="imageBox" v-if="JSON.parse(item.reportImage)&&JSON.parse(item.reportImage).length>0">
+            <image class="image m5" style="width: 50px" mode="widthFix" v-for="(a, index) in JSON.parse(item.reportImage)" :key="index" :src="a.url" @click="previewImage(index)" />
+          </view>
+          <view class="imageBox" v-else>无</view>
         </view>
 
-
+        <view class="content-area-center mb10">
+          <view class="content-area-center-top">附件 </view>
+          <view v-if="JSON.parse(item.reportFile)&&JSON.parse(item.reportFile).length>0">
+            <uni-link v-for="(file, index) in JSON.parse(item.reportFile)" :key="index" :href="file.url" text="file.url" style="color: rgba(0, 0, 0, 0.7)">{{ file.name }}</uni-link>
+          </view>
+          <view v-else>无</view>
+        </view>
+        <view class="content-area-center mb10" style="display: flex; flex-wrap: wrap">
+          <u-tabs
+            :list="tabsList"
+            :current="tabsCurrent"
+            @click="tabsClick"
+            lineColor="#333"
+            :activeStyle="{ color: '#333', fontSize: '14px' }"
+            :inactiveStyle="{ color: '#909399', fontSize: '14px' }"
+            :scrollable="false"
+            style="width: 100%"
+          ></u-tabs>
+          <view class="content-area-header mt20 mb10 text-center" style="display: inline-block" v-for="(item, index) in reportDetailData.treeSelectNodes" :key="index">
+            <img v-if="item.avatar" class="content-area-header-avatarImg mlr5" :src="item.avatar" style="display: block; width: 40px; height: 40px" />
+            <u-avatar
+              v-if="!item.avatar"
+              class="content-area-header-avatar mlr5"
+              :text="item.nickName.length > 2 ? item.nickName.slice(1, 3) : item.nickName"
+              shape="square"
+              size="40"
+              fontSize="12"
+              color="#ffffff"
+              :bgColor="proxy.$settingStore.themeColor.color"
+            ></u-avatar>
+            <u-text :text="item.nickName" color="#000000" size="14" align="center"></u-text>
+          </view>
+        </view>
       </view>
     </template>
-
-    
   </oa-scroll>
 </template>
 
@@ -80,23 +113,52 @@ import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue
 /*----------------------------------接口引入-----------------------------------*/
 import { projectApi } from "@/api/business/project.js";
 import { dUserList } from "@/api/system/user.js";
+import { deptUserTreeSelect } from "@/api/system/user.js";
 /*----------------------------------组件引入-----------------------------------*/
 /*----------------------------------store引入-----------------------------------*/
 /*----------------------------------公共方法引入-----------------------------------*/
 /*----------------------------------公共变量-----------------------------------*/
 const { proxy } = getCurrentInstance();
 /*----------------------------------变量声明-----------------------------------*/
+const tree = ref({
+  value: "tree_root",
+  label: "Root",
+  children: [],
+});
+const reportDetailData = ref([]);
+const pmReportReaders = ref([]); //已读未读集合
 const state = reactive({
   loading: true,
-  dataList: [],//日报列表
-  options: {//日报详情参数
+  dataList: [], //日报列表
+  options: {
+    //日报详情参数
     reportId: "",
   },
-  userData:[],//用户列表
+  userData: [], //用户列表
+  images: [], //图片列表
+  files: [], //附件列表
+  tabsList: [
+    { name: "已读", value: 0 },
+    { name: "未读", value: 1 },
+  ],
+  tabsCurrent: 0,
 });
 
-const { dataList, userData} = toRefs(state);
+const { dataList, userData, tabsList, tabsCurrent } = toRefs(state);
 
+/**
+ * @tabs点击事件
+ */
+function tabsClick(e) {
+  state.tabsCurrent = e.index;
+  reportDetailData.value.treeSelectNodes = proxy.$common.findTreeNodes(tree.value, state.tabsCurrent == 0 ? pmReportReaders.value.readAlready : pmReportReaders.value.readNotAlready);
+}
+function previewImage(index) {
+  uni.previewImage({
+    current: index, // 当前显示图片索引
+    urls: state.images, // 需要预览的图片http链接列表
+  });
+}
 
 /**
  * @初始化
@@ -104,23 +166,35 @@ const { dataList, userData} = toRefs(state);
 function init() {
   dataList.value = [];
   state.loading = true;
-  dUserList().then(res=>{
-    userData.value = res.data;
+  /** 查询树结构用户列表  回显抄送人*/
+  deptUserTreeSelect({ pageNum: "1", pageSize: "1000" }).then((res) => {
+    tree.value = res.data;
     projectApi()
-    .ReportRecord({
-      reportId: state.options.reportId,
-      pageNum: 1,
-      pageSize: 1,
-    })
-    .then((requset) => {
-      dataList.value = requset.data.records;
-      state.loading = false;
-    })
-    .catch((err) => {
-      state.loading = false;
-    });
-  })
-
+      .ReportRecord({
+        reportId: state.options.reportId,
+        pageNum: 1,
+        pageSize: 1,
+      })
+      .then((requset) => {
+        dataList.value = requset.data.records;
+        state.loading = false;
+        pmReportReaders.value = requset.data.records[0].pmReportReaders;
+        state.tabsList[0].name=state.tabsList[0].name+'('+pmReportReaders.value.read+')';
+        state.tabsList[1].name=state.tabsList[1].name+'('+pmReportReaders.value.unRead+')';
+        reportDetailData.value.treeSelectNodes = proxy.$common.findTreeNodes(tree.value, tabsCurrent.value == 0 ? pmReportReaders.value.readAlready : pmReportReaders.value.readNotAlready);
+        var imgs = JSON.parse(dataList.value[0].reportImage);
+        var files = JSON.parse(dataList.value[0].reportFile);
+        imgs.forEach(function (item) {
+          state.images.push(item.url);
+        });
+        files.forEach(function (item) {
+          state.files.push(item.url);
+        });
+      })
+      .catch((err) => {
+        state.loading = false;
+      });
+  });
 }
 /**
  * 跳转项目概览
@@ -164,8 +238,8 @@ onUnload(() => {
       margin: auto 0;
     }
     &-avatarImg {
-      width:35px;
-      height:35px;
+      width: 35px;
+      height: 35px;
       border-radius: 4px;
     }
 

+ 72 - 79
src/pages/business/common/projectMange/record/index.vue

@@ -25,10 +25,10 @@
     :isSticky="true"
     :customStyle="{
       //#ifdef APP-PLUS || MP-WEIXIN
-      height: 'calc(100vh - 132px)',
+      height: `calc(100vh - (138px + ${proxy.$settingStore.StatusBarHeight}))`,
       //#endif
       //#ifdef H5
-      height: 'calc(100vh - 132px)',
+      height: `calc(100vh - (138px))`,
       //#endif
     }"
     :refresherLoad="true"
@@ -42,27 +42,25 @@
     :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
   >
     <template #default>
+      <view v-if="timedList.length > 0" @click="goTimingPage()" class="list-cell list-cell-arrow" style="margin: 20px 0; color: rgb(20, 158, 255); background-color: rgba(20, 158, 255, 0.1)">
+        <view style="width: calc(100% - 51px); display: flex; padding-right: 10px">
+          <u-icon name="info-circle" color="#2979ff" size="18" style="margin-right: 5px"></u-icon>
+          <view v-if="timedList.length == 1">您有1条定时日志将于{{ timedList[0].timingTime.slice(0, 16) }}发布</view>
 
-      <view v-if="timedList.length>0" @click="goTimingPage()" class="list-cell list-cell-arrow"  style="margin:20px 0;color:rgb(20, 158, 255);background-color: rgba(20, 158, 255,.1)"  >
-          <view style="width: calc(100% - 51px); display: flex; ; padding-right: 10px"  >
-            <u-icon name="info-circle" color="#2979ff" size="18" style="margin-right: 5px"></u-icon>
-            <view v-if="timedList.length==1">您有1条定时日志将于{{timedList[0].timingTime.slice(0,16)}}发布</view>
-
-            <view v-else >您有{{timedList.length}}条定时日志将于指定时间发布</view>
-          </view>
+          <view v-else>您有{{ timedList.length }}条定时日志将于指定时间发布</view>
+        </view>
       </view>
 
-
       <u-loading-page :loading="state.loading" fontSize="16" style="z-index: 99"></u-loading-page>
       <view class="content-area" v-for="(group, date) in proxy.$common.groupedItems(state.dataList, 'submitDate')" :key="date">
         <view class="content-area-time font14">{{ proxy.$time.jktTimes(date, "否") }}</view>
         <view class="content-area-center bg-white" v-for="(el, ind) in group" :key="ind">
-          <view class="content-area-top menu-item" style="float:right;padding:10px 0px">
+          <view class="content-area-top menu-item" style="float: right; padding: 10px 0px">
             <view class="content-area-top-time"> </view>
             <u-icon class="content-area-top-icon" name="more-dot-fill" size="20" color="#000" @click="moreClick(el)"></u-icon>
           </view>
           <view class="flex mb10" @click="goContentDetails(el)">
-            <img :src="el.avatar"  class="content-area-center-avatarImg mr10" v-if="el.avatar"/>
+            <img :src="el.avatar" class="content-area-center-avatarImg mr10" v-if="el.avatar" />
             <u-avatar
               v-if="!el.avatar"
               class="content-area-center-avatar mr10"
@@ -101,9 +99,8 @@
         overflow: 'hidden',
       }"
     >
-     
       <u-button
-        v-if="state.tabsCurrent ==1"
+        v-if="state.tabsCurrent == 1"
         class="custom-style"
         type="info"
         size="normal"
@@ -132,7 +129,7 @@
         @click="handleSubmit('copy', eventList)"
       ></u-button>
       <u-button
-        v-if="state.tabsCurrent ==1"
+        v-if="state.tabsCurrent == 1"
         class="custom-style"
         type="info"
         size="normal"
@@ -162,13 +159,8 @@
     </view>
   </u-popup>
 
-  
-
-
-
   <uni-popup ref="alertDialog" type="dialog">
-    <uni-popup-dialog :type="state.tip.type" cancelText="取消" confirmText="确定" title="操作提醒" :content="state.tip.content" @confirm="dialogConfirm"
-      @close="dialogClose"></uni-popup-dialog>
+    <uni-popup-dialog :type="state.tip.type" cancelText="取消" confirmText="确定" title="操作提醒" :content="state.tip.content" @confirm="dialogConfirm" @close="dialogClose"></uni-popup-dialog>
   </uni-popup>
 
   <u-modal
@@ -181,7 +173,6 @@
     @cancel="modal.show = false"
     @close="modal.show = false"
   ></u-modal>
-
 </template>
 
 <script setup>
@@ -226,19 +217,18 @@ const state = reactive({
   },
   eventList: {}, //数据存储
 
-
-  reportData:{},
-  tip:{
-    type:undefined,//弹框类型
-    content:"",//提示信息
-    data:{},//带入数据
-    operation:undefined,//操作类型
+  reportData: {},
+  tip: {
+    type: undefined, //弹框类型
+    content: "", //提示信息
+    data: {}, //带入数据
+    operation: undefined, //操作类型
   },
-  timedList:[],
-  tree:[]
+  timedList: [],
+  tree: [],
 });
 
-const { tabsList, tabsCurrent, dataList, pageSize, current, total,popup,eventList,modal,timedList,tree} = toRefs(state);
+const { tabsList, tabsCurrent, dataList, pageSize, current, total, popup, eventList, modal, timedList, tree } = toRefs(state);
 /**
  * 操作弹框提醒
  * @param type  弹框类型
@@ -246,23 +236,23 @@ const { tabsList, tabsCurrent, dataList, pageSize, current, total,popup,eventLis
  * @param item 带入数据
  * @param operation 操作类型
  */
- function tips(type,content,item,operation){
-  state.tip.type=type
-  state.tip.content=content
-  state.tip.data=item
-  state.tip.operation=operation
-  proxy.$refs.alertDialog.open()
+function tips(type, content, item, operation) {
+  state.tip.type = type;
+  state.tip.content = content;
+  state.tip.data = item;
+  state.tip.operation = operation;
+  proxy.$refs.alertDialog.open();
 }
 /**弹框确定操作 */
-function dialogConfirm(){
-  if(state.tip.operation =='delete'){
-    handleSubmit('delete',state.tip.data)
+function dialogConfirm() {
+  if (state.tip.operation == "delete") {
+    handleSubmit("delete", state.tip.data);
   }
-  if(state.tip.operation=='exit'){
-    handleSubmit('exit',state.tip.data)
+  if (state.tip.operation == "exit") {
+    handleSubmit("exit", state.tip.data);
   }
-  if(state.tip.operation=='copy'){
-    handleSubmit('copy',state.tip.data)
+  if (state.tip.operation == "copy") {
+    handleSubmit("copy", state.tip.data);
   }
 }
 /**
@@ -281,34 +271,43 @@ function init() {
       requset.data.records.forEach((el) => {
         el.contentText = "";
         el.workContents.forEach((cl) => {
-          el.contentText += `${cl.projectName} ${cl.workTime}h \n ${cl.workContent}`;
+          el.contentText += `${cl.projectName} ${cl.workTime}h \n ${cl.workContent} \n`;
         });
       });
       state.dataList = requset.data.records;
       state.total = requset.data.total;
       state.loading = false;
 
-      console.log(state.dataList )
+      console.log(state.dataList);
     })
     .catch((err) => {
       state.loading = false;
     });
-    projectApi()
-    .TimedReports({
-     }).then((requset) => {
+  projectApi()
+    .TimedReports({})
+    .then((requset) => {
       state.timedList = requset.data;
-     })
-    .catch((err) => {
-
     })
-
-  }
+    .catch((err) => {});
+}
 
 /**
  * @跳转详情
  */
 function goContentDetails(e) {
-  proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/details?reportId=${e.id}`);
+  if (state.tabsCurrent == 0 && e.readFlag != 1) {
+    projectApi()
+      .ReportRecordReadFlag({ reportId: e.id })
+      .then((res) => {
+        if (res.status == "SUCCESS") {
+          proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/details?reportId=${e.id}`);
+        } else {
+          proxy.$modal.msgError("读取异常");
+        }
+      });
+  } else {
+    proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/details?reportId=${e.id}`);
+  }
 }
 
 /**
@@ -335,9 +334,8 @@ function tabsClick(e) {
   init();
 }
 
-
 // 定时日志页面
-function goTimingPage(){
+function goTimingPage() {
   proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/timingLog`);
 
   // proxy.$tab.navigateTo(`/pages/business/common/projectMange/report/timingLog`);
@@ -348,7 +346,6 @@ function moreClick(event) {
   state.eventList = event;
 }
 
-
 function handleModal(type, content) {
   state.modal.show = true;
   state.modal.type = type;
@@ -356,28 +353,26 @@ function handleModal(type, content) {
 }
 
 /** 编辑、删除日报*/
-function handleSubmit(type,item) {
+function handleSubmit(type, item) {
   if (type === "update") {
     proxy.$tab.navigateTo(`/pages/business/common/projectMange/write/insert?templateId=1&id=${item.id}`);
     state.modal.show = false;
-  }else if (type === "copy") {
-    var workLongString=''
+  } else if (type === "copy") {
+    var workLongString = "";
     item.workContents.forEach((item) => {
-      workLongString+=item.projectName+':'+item.workTime+ "h\n"+item.workContent+ "\n"
-    })
+      workLongString += item.projectName + ":" + item.workTime + "h\n" + item.workContent + "\n";
+    });
     item.ccTo1 = item.ccTo.split(",").map(function (value, index) {
       return Number(value);
     });
 
-     /** 查询树结构用户列表  回显抄送人*/
+    /** 查询树结构用户列表  回显抄送人*/
 
-     item.tomorrowPlan=item.tomorrowPlan?item.tomorrowPlan:'-';
-     item.coordinateWork=item.coordinateWork?item.coordinateWork:'-'
+    item.tomorrowPlan = item.tomorrowPlan ? item.tomorrowPlan : "-";
+    item.coordinateWork = item.coordinateWork ? item.coordinateWork : "-";
     // 触发方法
-      proxy.$common.uniCopy({
-      content: workLongString+ "\n" +
-              "明日计划:\n" + item.tomorrowPlan + "\n" +
-              "工作协调:\n" + item.coordinateWork,
+    proxy.$common.uniCopy({
+      content: workLongString + "\n" + "明日计划:\n" + item.tomorrowPlan + "\n" + "工作协调:\n" + item.coordinateWork,
       success: (res) => {
         uni.showToast({
           title: res,
@@ -393,8 +388,6 @@ function handleSubmit(type,item) {
       },
     });
     state.popup.show = false;
-    
-
   } else if (type === "delete") {
     projectApi()
       .ReportDelete(item.id)
@@ -407,7 +400,7 @@ function handleSubmit(type,item) {
       .catch((errors) => {
         proxy.$modal.msg(errors);
       });
-  } 
+  }
   state.modalShow = false;
 }
 
@@ -454,8 +447,8 @@ onUnload(() => {
       margin: auto 0;
     }
     &-avatarImg {
-      width:35px;
-      height:35px;
+      width: 35px;
+      height: 35px;
       border-radius: 4px;
     }
 
@@ -467,12 +460,12 @@ onUnload(() => {
   }
 }
 
-.pp{
+.pp {
   text-align: left;
 }
 </style>
 <style>
-.pp .u-modal__content{
-  justify-content: left !important
+.pp .u-modal__content {
+  justify-content: left !important;
 }
 </style>

+ 113 - 29
src/pages/business/common/projectMange/write/components/template1.vue

@@ -65,10 +65,31 @@
         @change="realTimeSaving()"
       ></u-textarea>
     </view>
-    <!-- <view class="content-area-item mt10 p10 bg-white">
+    <view class="content-area-item mt10 p10 bg-white">
       <view class="font14 weight mb10">图片上传</view>
-      <oa-upload :uploadCount="5" :uploadList="form.imageList" :uploadListSrc="'url'" @uploadSuccessChange="uploadSuccessChange" @uploadDeleteChange="uploadDeleteChange"></oa-upload>
-    </view> -->
+      <view style="color:#f56c6c;font-size:11px;margin-bottom:10px">( 注:不可同步钉钉,最多上传5张 )</view>
+      <oa-upload :uploadCount="5" :uploadList="reportImage1" :uploadListSrc="'url'" @uploadSuccessChange="uploadSuccessChange" @uploadDeleteChange="uploadDeleteChange"></oa-upload>
+    </view>
+    <view class="content-area-item mt10 p10 bg-white">
+      <view class="font14 weight mb10">附件上传</view>
+      <view style="color:#f56c6c;font-size:11px;margin-bottom:10px">( 注:不可同步钉钉,最多上传5个 )</view>
+      <uni-file-picker limit="5" 
+        @select='selectUpload' 
+          v-model="reportFile1"
+					:auto-upload='false' 
+					file-extname='git,pdf,docx,doc,xls,xlsx,ppt,pptx,txt,zip,rar,7z,gz,bz2,tar,tgz,tbz,txz,apk,ipa,mp3,mp4,avi,flv,rmvb,wmv,mkv,mov,wma,aac,m4a,amr,ogg,flac,wav,amr,ape,m4r,aac,ac3,dts,m4b,m4p,m4v,mp2,mpe,mpeg,mpg,mpv,ogv,rm,swf,vob,wmv,3gp,3g2,asf,asx,avi,flv,m2ts,m4v,mkv,mov,mp4,mpg,mpeg,rm,swf,vob,wmv,3gp,3g2,asf,asx,avi,' 
+					file-mediatype="all" 
+		  >
+      </uni-file-picker>
+       <!-- 文件列表回显 -->
+       <br>
+      <view v-for="(file, index) in reportFile1" :key="index" style="border-bottom:1px solid #eee;margin:6px;padding:6px;font-size:12px">
+       <uni-link :href="file.url" text="file.url">{{file.name}}</uni-link>
+        <uni-icons type="closeempty" size="12" style="float:right" @click="delectFile(file)"></uni-icons>
+      </view>
+    </view>
+
+    
 
     <view class="content-area-item mt10 p10 bg-white">
       <view class="font14 weight mb10">抄送到人</view>
@@ -198,6 +219,7 @@ import avatarList from "../../components/avatarList.vue";
 import { systemStores } from "@/store/modules/index";
 /*----------------------------------公共方法引入-----------------------------------*/
 import { storageSystem } from "@/utils/storage"; // 公共方法引用
+import config from "@/config";
 /*----------------------------------公共变量-----------------------------------*/
 const { proxy } = getCurrentInstance();
 const systemStore = systemStores();
@@ -208,6 +230,7 @@ const props = defineProps({
   },
 });
 /*----------------------------------变量声明-----------------------------------*/
+
 const modal = reactive({
   timeShow: false,
   timeValue: Number(new Date()),
@@ -223,8 +246,8 @@ const state = reactive({
     sendDingTalk: 1,
     isRegularlySend: 0,
     timingTime: null,
-    // reportStatus: null,
-    imageList: [],
+    reportImage: [],
+    reportFile: [],
   },
   projectsCheck: [],
   projectsList: [],
@@ -232,6 +255,8 @@ const state = reactive({
   userDate: [],
   saveTime: "",
 });
+const reportImage1=ref([])//图片
+const reportFile1=ref([])//附件
 const { timeShow, timeValue, modalShow } = toRefs(modal);
 const { form, projectsCheck, projectsList, userList, userDate, saveTime } = toRefs(state);
 
@@ -243,11 +268,7 @@ function init() {
     state.userDate = res.data;
   });
 
-  projectApi()
-    .ProjectsSelect()
-    .then((requset) => {
-      state.projectsList = requset.data;
-    });
+
 }
 
 /** 时间选择器确定按钮点击事件 */
@@ -332,22 +353,69 @@ function modalConfirm() {
  * @图片上传成功回调
  */
  function uploadSuccessChange(e) {
-  
-  state.form.imageList.push({
+  reportImage1.value.push({
     name: e.name,
     url: e.url,
   })
+  reportImage1.value=reportImage1.value.slice(0,5)
   realTimeSaving()
 }
 /**
  * @图片删除回调
  */
  function uploadDeleteChange(e) {
-  state.form.imageList = e;
+  reportImage1.value = e;
+  realTimeSaving()
+}
+
+
+
+
+
+/**
+ * @文件删除
+ */
+function delectFile(param){
+  reportFile1.value = reportFile1.value.filter(function (item) {
+    return item.name!=param.name;
+  });
   realTimeSaving()
 }
 
 
+/**
+ * @文件上传
+ */
+function selectUpload(e) {
+  // console.log('上传:', e)
+
+    e.tempFilePaths.forEach((item,index) => {
+      uni.uploadFile({
+        url: config.baseUrl+'/service-file/upload', 
+        filePath: item,
+        name: 'file',
+        success: (uploadFileRes) => {
+          reportFile1.value.push(JSON.parse(uploadFileRes.data).data)
+          realTimeSaving()
+        },
+        fail: (err) => {
+          console.log(err);
+        }
+      })
+   })
+}
+// function delectUpload(e){
+//   console.log(e)
+// }
+// function uploadSuccess(e) {
+// console.log('上传成功', e)
+// }
+// function uploadFail(e) {
+// 	console.log('上传失败:', e)
+// }
+
+
+
 /** 提交 */
 function handleSubmit() {
   state.form.sendDingTalk == true ? 1 : 0;
@@ -357,18 +425,29 @@ function handleSubmit() {
   state.form.workContents.forEach((e) => {
     e.workTime = Number(e.workTime);
   });
+  state.form.reportImage=JSON.stringify(reportImage1.value);
+  state.form.reportFile=JSON.stringify(reportFile1.value);
   projectApi()
     .ReportInsert(state.form)
     .then((requset) => {
       proxy.$tab.redirectTo("/pages/business/common/projectMange/record/index"); //返回到需要执行方法的页面
-      state.form.workContents = [];
-      state.form.tomorrowPlan = "";
-      state.form.coordinateWork = null;
-      state.form.isRegularlySend = 0;
-      state.form.timingTime = null;
+
       // storageSystem.set("project", state);
-    });
+    }).catch((err) => {
+     
+    });;
 }
+watch(
+  () => reportFile1.value.length,
+  (val) => {
+    var element = document.querySelector('.files-button');
+   if(reportFile1.value.length>=5){
+    element.style.display = 'none';
+   }else{
+    element.style.display = 'block';
+   }
+  }
+);
 
 watch(
   () => props.projectList,
@@ -376,12 +455,15 @@ watch(
     state.userList = [];
     state.projectsCheck = [];
     state.projectsList = [];
-    state.form.imageList = [];
-
+    state.form.reportImage = [];
+    state.form.reportFile = [];
+   
     Object.keys(props.projectList).forEach((key) => {
       state.form[key] = props.projectList[key];
     });
-
+ 
+    reportImage1.value=state.form.reportImage?JSON.parse(state.form.reportImage):[];
+    reportFile1.value=state.form.reportFile?JSON.parse(state.form.reportFile):[];
     state.form.workContents.forEach((e) => {
       state.projectsCheck.push(e.projectId);
     });
@@ -407,11 +489,6 @@ watch(
       });
     // }, 300);
 
-    projectApi()
-      .ProjectsSelect()
-      .then((requset) => {
-        state.projectsList = requset.data;
-      });
     if(!state.form.id){
         storageSystem.set("project", state);
       }
@@ -447,7 +524,7 @@ onShow(() => {
 });
 
 onLoad((options) => {
-  init();
+
   if (options.id) {
     state.form.id = options.id;
   } else {
@@ -459,8 +536,15 @@ onUnload(() => {
   uni.$off("UserMall"); //将值删除监听器
 });
 </script>
-
+<style lang="scss" >
+ :deep(.uni-file-picker__lists, .is-text-box){
+  display:none!important;
+  opacity:0!important;
+  height:0!important;
+}
+</style>
 <style lang="scss" scoped>
+
 .checkbox-group-title{
   display:block;width:100%;
   font-size:16px;

+ 4 - 19
src/pages/business/common/projectMange/write/insert.vue

@@ -6,7 +6,7 @@
           <u-icon name="arrow-left" size="20" color="#000"></u-icon>
         </view>
       </template>
-      <template #right>
+      <template #right v-if="state.pageTitle=='报告填写'">
         <view class="u-navbar__content__right__item">
           <u-icon name="more-dot-fill" size="20" color="#000" @click="moreClick()"></u-icon>
         </view>
@@ -109,7 +109,8 @@ function handleSubmit(type, id) {
           workContents: newData.workContents,
           sendDingTalk: newData.sendDingTalk,
           ccTo: newData.ccTo,
-          imgList: newData.imgList,
+          reportImage: newData.reportImage,
+          reportFile: newData.reportFile,
           timingTime: newData.timingTime,
           isRegularlySend: newData.isRegularlySend,
         };
@@ -118,23 +119,7 @@ function handleSubmit(type, id) {
       });
   }
   if (type === "update") {
-    projectApi()
-      .ReportRecord({
-        reportId: id,
-        pageNum: 1,
-        pageSize: 10000,
-      })
-      .then((requset) => {
-        var newData = requset.data.records[0];
-        state.newProjectList = {
-          id: newData.id,
-          tomorrowPlan: newData.tomorrowPlan,
-          coordinateWork: newData.coordinateWork,
-          workContents: newData.workContents,
-          sendDingTalk: newData.sendDingTalk,
-          ccTo: newData.ccTo,
-        };
-      });
+
   }
 }
 

+ 1 - 0
src/pages/business/common/videoMonitor/videoDetail.vue

@@ -1,6 +1,7 @@
 <template>
   <oa-scroll
     customClass="videoDetail-container scroll-height"
+    :isSticky="false"
     :refresherLoad="false"
     :refresherEnabled="false"
     :refresherEnabledTitle="false"

+ 1 - 1
src/pages/business/common/videoMonitor/videoList.vue

@@ -3,11 +3,11 @@
     customClass="repairManage-container scroll-height"
     :pageSize="state.pageSize"
     :total="state.total"
+    :isSticky="false"
     :refresherLoad="true"
     :refresherEnabled="true"
     :refresherDefaultStyle="'none'"
     :refresherThreshold="44"
-    :lowerThreshold="44"
     :refresherBackground="'#f5f6f7'"
     @load="load"
     @refresh="refresh"

+ 1 - 0
src/pages/business/fireIot/alarmManage/alarmDetails/index.vue

@@ -1,6 +1,7 @@
 <template>
   <oa-scroll
     customClass="alarmDetails-container scroll-height"
+    :isSticky="false"
     :refresherLoad="false"
     :refresherEnabled="false"
     :refresherEnabledTitle="false"

+ 0 - 1
src/pages/business/fireIot/alarmManage/alarmDetailsList/index.vue

@@ -20,7 +20,6 @@
     :refresherEnabled="true"
     :refresherDefaultStyle="'none'"
     :refresherThreshold="44"
-    :lowerThreshold="44"
     :refresherBackground="'#f5f6f7'"
     @load="load"
     @refresh="refresh"

+ 1 - 0
src/pages/business/fireIot/alarmManage/index.vue

@@ -3,6 +3,7 @@
     customClass="bg-white scroll-height"
     :pageSize="pageSize"
     :total="total"
+    :isSticky="false"
     :refresherLoad="true"
     :refresherLoadTitle="false"
     :refresherEnabled="true"

+ 1 - 0
src/pages/business/fireIot/customManage/index.vue

@@ -3,6 +3,7 @@
     customClass="customManage-container scroll-height"
     :pageSize="pageSize"
     :total="total"
+    :isSticky="false"
     :refresherLoad="true"
     :refresherEnabled="true"
     :refresherDefaultStyle="'none'"

+ 1 - 0
src/pages/business/fireIot/deviceManage/components/deviceDetails.vue

@@ -1,6 +1,7 @@
 <template>
   <oa-scroll
     customClass="deviceDetails-container scroll-height"
+    :isSticky="false"
     :refresherLoad="false"
     :refresherEnabled="false"
     :refresherEnabledTitle="false"

+ 1 - 0
src/pages/business/fireIot/deviceManage/components/deviceDetailsList.vue

@@ -3,6 +3,7 @@
     customClass="scroll-height"
     :pageSize="pageSize"
     :total="total"
+    :isSticky="false"
     :refresherLoad="true"
     :refresherEnabled="true"
     :refresherDefaultStyle="'none'"

+ 1 - 0
src/pages/business/fireIot/deviceManage/index.vue

@@ -3,6 +3,7 @@
     customClass="bg-white scroll-height"
     :pageSize="pageSize"
     :total="total"
+    :isSticky="false"
     :refresherLoad="true"
     :refresherLoadTitle="false"
     :refresherEnabled="true"

+ 1 - 0
src/pages/business/fireIot/facilitiesGather/index.vue

@@ -3,6 +3,7 @@
     id="facilitiesGather"
     customClass="scroll-height"
     :customStyle="{}"
+    :isSticky="false"
     :refresherLoad="false"
     :refresherEnabled="false"
     :refresherDefaultStyle="'none'"

+ 19 - 2
src/pages/business/fireIot/facilitiesManage/facilitiesDetails.vue

@@ -1,6 +1,7 @@
 <template>
   <oa-scroll
     customClass="facilitiesDetails-container scroll-height"
+    :isSticky="false"
     :refresherLoad="false"
     :refresherEnabled="false"
     :refresherEnabledTitle="false"
@@ -46,7 +47,15 @@
         <uni-section class="block mb10" title="关联设备" type="line"></uni-section>
 
         <view class="flex mb10" style="height: 35px; line-height: 35px">
-          <u-input v-model="state.deviceId" placeholder="设备编号" @change="deviceInfoApi()" disabledColor="transparent" prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" clearable />
+          <u-input
+            v-model="state.deviceId"
+            placeholder="设备编号"
+            @change="deviceInfoApi()"
+            disabledColor="transparent"
+            prefixIcon="search"
+            prefixIconStyle="font-size: 22px;color: #909399"
+            clearable
+          />
         </view>
 
         <view class="tableType1">
@@ -85,7 +94,15 @@
         <uni-section class="block mb10" title="关联建筑" type="line"></uni-section>
 
         <view class="flex mb10" style="height: 35px; line-height: 35px">
-          <u-input v-model="state.buildNum" placeholder="建筑编号" @change="buildInfoApi()" disabledColor="transparent" prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" clearable />
+          <u-input
+            v-model="state.buildNum"
+            placeholder="建筑编号"
+            @change="buildInfoApi()"
+            disabledColor="transparent"
+            prefixIcon="search"
+            prefixIconStyle="font-size: 22px;color: #909399"
+            clearable
+          />
         </view>
 
         <view class="tableType1">

+ 1 - 0
src/pages/business/fireIot/facilitiesManage/facilitiesDetailsList.vue

@@ -3,6 +3,7 @@
     customClass="scroll-height"
     :pageSize="pageSize"
     :total="total"
+    :isSticky="false"
     :refresherLoad="true"
     :refresherEnabled="true"
     :refresherDefaultStyle="'none'"

+ 1 - 0
src/pages/business/fireIot/facilitiesManage/index.vue

@@ -1,6 +1,7 @@
 <template>
   <oa-scroll
     customClass="scroll-height"
+    :isSticky="false"
     :refresherLoad="false"
     :refresherLoadTitle="false"
     :refresherEnabled="true"

+ 1 - 0
src/pages/business/fireIot/repairManage/index.vue

@@ -3,6 +3,7 @@
     customClass="bg-white scroll-height"
     :pageSize="pageSize"
     :total="total"
+    :isSticky="false"
     :refresherLoad="true"
     :refresherLoadTitle="false"
     :refresherEnabled="true"

+ 1 - 0
src/pages/business/fireIot/repairManage/repairDetails.vue

@@ -1,6 +1,7 @@
 <template>
   <oa-scroll
     customClass="repairDetails-container scroll-height"
+    :isSticky="false"
     :refresherLoad="false"
     :refresherEnabled="false"
     :refresherEnabledTitle="false"

+ 0 - 1
src/pages/business/fireIot/repairManage/repairDetailsList.vue

@@ -20,7 +20,6 @@
     :refresherEnabled="true"
     :refresherDefaultStyle="'none'"
     :refresherThreshold="44"
-    :lowerThreshold="44"
     :refresherBackground="'#f5f6f7'"
     @load="load"
     @refresh="refresh"

+ 1 - 0
src/pages/business/fireIot/repairReport/index.vue

@@ -2,6 +2,7 @@
   <oa-scroll
     customClass="scroll-height"
     :customStyle="{}"
+    :isSticky="false"
     :refresherLoad="false"
     :refresherEnabled="false"
     :refresherDefaultStyle="'none'"

+ 1 - 0
src/pages/business/fireIot/repairReport/record.vue

@@ -4,6 +4,7 @@
     customClass="repairReport-record-container scroll-height"
     :pageSize="pageSize"
     :total="total"
+    :isSticky="false"
     :refresherLoad="true"
     :refresherEnabled="true"
     :refresherDefaultStyle="'none'"

+ 1 - 0
src/pages/business/mhxf/fireReport/index.vue

@@ -3,6 +3,7 @@
     customClass="scroll-height"
     :pageSize="pageSize"
     :total="total"
+    :isSticky="false"
     :refresherLoad="true"
     :refresherEnabled="true"
     :refresherDefaultStyle="'none'"

+ 1 - 0
src/pages/business/zhaf/xunJian/collect/components/collectDetail.vue

@@ -1,6 +1,7 @@
 <template>
   <oa-scroll
     customClass="scroll-height"
+    :isSticky="false"
     :refresherLoad="false"
     :refresherEnabled="false"
     :refresherEnabledTitle="false"

+ 1 - 0
src/pages/business/zhaf/xunJian/collect/index.vue

@@ -13,6 +13,7 @@
   <oa-scroll
     customClass="scroll-height"
     :total="xunJianStore.collectDataList.length"
+    :isSticky="false"
     :refresherEnabled="true"
     :refresherEnabledTitle="true"
     :refresherDefaultStyle="'none'"

+ 0 - 1
src/pages/business/zhxf/fireInspect/inspectDetailsList/index.vue

@@ -20,7 +20,6 @@
     :refresherEnabled="true"
     :refresherDefaultStyle="'none'"
     :refresherThreshold="44"
-    :lowerThreshold="44"
     :refresherBackground="'#f5f6f7'"
     @load="load"
     @refresh="refresh"

+ 16 - 2
src/pages/common/appMessage/index.vue

@@ -7,7 +7,6 @@
     :refresherEnabled="true"
     :refresherDefaultStyle="'none'"
     :refresherThreshold="44"
-    :lowerThreshold="44"
     :refresherBackground="'#f5f6f7'"
     @load="load"
     @refresh="refresh"
@@ -44,6 +43,8 @@ import { onLoad, onShow, onReady, onHide, onLaunch, onUnload, onNavigationBarBut
 import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
 /*----------------------------------接口引入-----------------------------------*/
 import { getMceList, updateMceReceiveStatus } from "@/api/mine/info.js";
+import { projectApi } from "@/api/business/project.js";
+
 /*----------------------------------组件引入-----------------------------------*/
 /*----------------------------------store引入-----------------------------------*/
 /*----------------------------------公共方法引入-----------------------------------*/
@@ -71,7 +72,20 @@ function goContentDetails(e) {
   if (e.infoType == 4) {
     proxy.$tab.navigateTo(`/pages/business/fireIot/alarmManage/alarmDetails/index?contentId=${e.contentId}`).then(() => {});
   } else if (e.infoType == 5) {
-    proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/details?reportId=${e.moduleId}`).then(() => {});
+
+    if (e.readFlag != 1) {
+      projectApi()
+        .ReportRecordReadFlag({ reportId: e.id })
+        .then((res) => {
+          if (res.status == "SUCCESS") {
+            proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/details?reportId=${e.moduleId}`);
+          } else {
+            proxy.$modal.msgError("读取异常");
+          }
+        });
+    } else {
+        proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/details?reportId=${e.moduleId}`);
+      }
   } else {
     proxy.$tab.navigateTo(`/pages/common/appMessage/details?contentId=${e.contentId}`).then(() => {});
   }

+ 58 - 0
src/pages/common/face/api.js

@@ -0,0 +1,58 @@
+import { request } from "@/utils/request";
+
+/**
+ * 会议室管理接口集合
+ * @method GetMeetingRoomList 会议室下拉列表
+ * @method GetMeetingRoomReservationList 会议预约详情列表
+ * @method Attendee 会议人员权限审核
+ */
+export function meetingApi() {
+    return {
+        GetMeetingRoomList(data) {
+            return request({
+                url: '/service-meeting/meetingRoom/MeetingRoomList',
+                method: 'GET',
+                params: data
+            })
+        },
+        GetMeetingRoomReservationList(data) {
+            return request({
+                url: '/service-meeting/meetingRoom/getMeetingRoomReservationList',
+                method: 'POST',
+                data: data
+            })
+        },
+        Attendee(data) {
+            return request({
+                url: '/service-meeting/meetingRoom/attendee',
+                method: 'GET',
+                params: data
+            })
+        }
+    }
+}
+
+/**
+ * 人脸校验接口集合
+ * @method faceVef 人脸验证
+ */
+export function faceApi() {
+    return {
+        faceVef: (data) => {
+            return request({
+                url: '/service-meeting/meetingFace/vef',
+                method: 'POST',
+                data,
+            });
+        },
+    };
+}
+
+//人员签到-人员签退
+export function signOnOut(data) {
+    return request({
+        url: '/service-meeting/meetingInfo/signOnOut',
+        method: 'POST',
+        data
+    })
+}

+ 473 - 0
src/pages/common/face/index.vue

@@ -0,0 +1,473 @@
+<template>
+  <web-view ref="faceView" id="faceView" class="faceView" src="/static/face/index.html" bindmessage="receiveMessage" :webview-styles="webviewStyles" @message="onMessage"></web-view>
+  <u-modal
+    :show="modal.show"
+    title="配置服务器"
+    :cancelText="'退出应用'"
+    :zoom="false"
+    :showConfirmButton="true"
+    :showCancelButton="true"
+    :closeOnClickOverlay="true"
+    @confirm="modalConfirm"
+    @cancel="modalCancel"
+    @close="modal.show = false"
+  >
+    <view class="slot-content">
+      <view>
+        <view class="mb10 required">服务器地址</view>
+        <view class="mb20">
+          <u-input v-model="form.linkUrl" placeholder="服务器地址(必填)" border="bottom" style="padding: 6px 0px" />
+        </view>
+      </view>
+      <view>
+        <view class="mb10">服务器端口</view>
+        <view class="mb20">
+          <u-input v-model="form.port" placeholder="服务器端口(非必填)" border="bottom" style="padding: 6px 0px" />
+        </view>
+      </view>
+      <view v-if="meetingRoomList.length > 0">
+        <view class="mb10 required">绑定会议室</view>
+        <view>
+          <u-input
+            v-model="form.meetingName"
+            placeholder="会议室(必选)"
+            suffixIcon="arrow-right"
+            suffixIconStyle="color: #909399"
+            border="none"
+            disabledColor="transparent"
+            disabled
+            @click="handlePicker('绑定会议室')"
+          />
+        </view>
+      </view>
+    </view>
+  </u-modal>
+
+  <u-picker
+    :show="picker.show"
+    :columns="picker.list"
+    :title="'请选择' + picker.title"
+    keyName="name"
+    visibleItemCount="6"
+    :defaultIndex="[picker.defaultIndex]"
+    :closeOnClickOverlay="true"
+    @close="picker.show = false"
+    @cancel="picker.show = false"
+    @confirm="pickerConfirm"
+  ></u-picker>
+</template>
+<script setup>
+/*----------------------------------依赖引入-----------------------------------*/
+import { onLoad, onShow, onReady, onHide, onLaunch, onUnload, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject, nextTick, watch } from "vue";
+/*----------------------------------接口引入-----------------------------------*/
+import { meetingApi, faceApi, signOnOut } from "./api.js";
+/*----------------------------------组件引入-----------------------------------*/
+/*----------------------------------store引入-----------------------------------*/
+/*----------------------------------公共方法引入-----------------------------------*/
+const { proxy } = getCurrentInstance();
+/*----------------------------------公共变量-----------------------------------*/
+const state = reactive({
+  webviewStyles: {
+    width: "100%",
+    height: "100%",
+  },
+  meetingRoomList: [],
+  meetingTimeList: [],
+  meetingReservaList: {
+    dataAll: {},
+    thisVenueData: [],
+    thisVenueTime: {},
+    nextSceneData: [],
+    nextSceneTime: {},
+    timeList: [],
+  },
+  modal: {
+    show: false,
+  },
+  picker: {
+    show: false,
+    title: "",
+    list: [[]],
+    defaultIndex: 0,
+  },
+  form: {
+    linkUrl: "",
+    port: "",
+    meetingId: undefined,
+    meetingName: undefined,
+  },
+});
+const { webviewStyles, meetingRoomList, modal, picker, form } = toRefs(state);
+
+// 初始化
+function init() {
+  var storage = uni.getStorageSync("storage_face");
+  if (storage) {
+    state.form.linkUrl = storage.linkUrl.indexOf(":") != -1 ? storage.linkUrl.split(":")[0] : storage.linkUrl;
+    state.form.port = storage.port ? storage.port : "";
+    state.form.meetingId = storage.meetingId || undefined;
+    state.form.meetingName = storage.meetingName || undefined;
+    meetingInit();
+  }
+}
+
+/**
+ * @会议信息初始化
+ * @method domain 服务器地址
+ */
+function meetingInit() {
+  getMeetingRoomList();
+  getMeetingRoomReservationList();
+}
+
+/**
+ * @会议室下拉列表
+ */
+function getMeetingRoomList() {
+  var domain = "";
+  if (state.form.linkUrl) {
+    domain = state.form.linkUrl;
+    if (state.form.port) {
+      domain += ":" + state.form.port;
+    }
+  }
+
+  meetingApi()
+    .GetMeetingRoomList({
+      domain: domain,
+    })
+    .then((requset) => {
+      requset.data.forEach((e) => {
+        state.meetingRoomList.push({
+          value: e.roomId,
+          name: e.roomName,
+        });
+      });
+    });
+}
+
+/**
+ * @会议室详情列表
+ */
+function getMeetingRoomReservationList() {
+  var domain = "";
+  if (state.form.linkUrl) {
+    domain = state.form.linkUrl;
+    if (state.form.port) {
+      domain += ":" + state.form.port;
+    }
+  }
+
+  if (!state.form.meetingId) {
+    return;
+  }
+
+  meetingApi()
+    .GetMeetingRoomReservationList({
+      domain: domain,
+      meetingRoomId: state.form.meetingId,
+      date: proxy.$dayjs().format("YYYY-MM-DD") + " 00:00:00",
+    })
+    .then((requset) => {
+      for (let i = 0; i <= 23.5; i += 0.5) {
+        var time = "";
+        if (i % 1 === 0.5) {
+          if (i < 10) {
+            time = "0" + (i - 0.5) + ":30";
+          } else {
+            time = i - 0.5 + ":30";
+          }
+        } else {
+          if (i < 10) {
+            time = "0" + i + ":00";
+          } else {
+            time = i + ":00";
+          }
+        }
+
+        state.meetingTimeList.push({
+          startTime: time,
+          endTime: time,
+          isEnd: 0,
+          isHave: 0,
+          isReservation: 0,
+        });
+      }
+
+      if (requset.data.length > 0) {
+        state.meetingReservaList.dataAll = requset.data[0];
+        state.meetingReservaList.dataAll.dmMeetingList.forEach((e, index) => {
+          //判断开始时间和结束时间是否包含当前时间
+          if (proxy.$dayjs().isBetween(e.startDate, e.endDate, null, "[]")) {
+            state.meetingReservaList.thisVenueData.push(e);
+            state.meetingReservaList.thisVenueTime = proxy.$time.timeRestructuring(state.meetingReservaList.dataAll.meetingRoomUsage[index]);
+          }
+          //判断当前时间是否相同或在其之前
+          if (proxy.$dayjs().isSameOrBefore(e.startDate) && state.meetingReservaList.nextSceneData.length < 1) {
+            state.meetingReservaList.nextSceneData.push(e);
+            state.meetingReservaList.nextSceneTime = proxy.$time.timeRestructuring(state.meetingReservaList.dataAll.meetingRoomUsage[index]);
+          }
+        });
+
+        state.meetingReservaList.timeList = showTimeSegments(state.meetingTimeList);
+
+        setTimeout(() => {
+          handleChildren({
+            funcName: "初始化",
+            data: JSON.stringify(state.meetingReservaList),
+          });
+        }, 0);
+      } else {
+        setTimeout(() => {
+          handleChildren({
+            funcName: "初始化",
+            data: JSON.stringify(state.meetingReservaList),
+          });
+        }, 0);
+      }
+    });
+}
+
+// 显示时间段的函数
+function showTimeSegments(times) {
+  const timesXleList = JSON.parse(JSON.stringify(times));
+
+  for (var i = 0; i < timesXleList.length; i++) {
+    state.meetingReservaList.dataAll.meetingRoomUsage.forEach((item) => {
+      const timeValue = new Date(`${proxy.$dayjs().format("YYYY-MM-DD")}T${timesXleList[i].startTime}`);
+      const timeList = proxy.$time.timeRestructuring(item);
+      const startValue = new Date(`${proxy.$dayjs().format("YYYY-MM-DD")}T${timeList.startTime}`);
+      const endValue = new Date(`${proxy.$dayjs().format("YYYY-MM-DD")}T${timeList.endTime}`);
+
+      if (timeValue.getTime() >= startValue.getTime() && timeValue.getTime() < endValue.getTime()) {
+        timesXleList.splice(i--, 1);
+      }
+    });
+  }
+
+  state.meetingReservaList.dataAll.meetingRoomUsage.forEach((item) => {
+    const timeList = proxy.$time.timeRestructuring(item);
+    const startValue = new Date(`${proxy.$dayjs().format("YYYY-MM-DD")}T${timeList.startTime}`);
+    const endValue = new Date(`${proxy.$dayjs().format("YYYY-MM-DD")}T${timeList.endTime}`);
+
+    if (proxy.$dayjs().isBetween(startValue, endValue, null, "[]")) {
+      timesXleList.push({
+        ...timeList,
+        isEnd: 0,
+        isHave: 1,
+        isReservation: 0,
+      });
+    } else {
+      if (proxy.$dayjs().isSameOrAfter(startValue)) {
+        timesXleList.push({
+          ...timeList,
+          isEnd: 1,
+          isHave: 0,
+          isReservation: 0,
+        });
+      }
+      if (proxy.$dayjs().isSameOrBefore(startValue)) {
+        timesXleList.push({
+          ...timeList,
+          isEnd: 0,
+          isHave: 0,
+          isReservation: 1,
+        });
+      }
+    }
+  });
+
+  var newTimesXleList = proxy.$common
+    .uniq(timesXleList, "startTime")
+    .sort((a, b) => new Date(`${proxy.$dayjs().format("YYYY-MM-DD")}T${a.startTime}`) - new Date(`${proxy.$dayjs().format("YYYY-MM-DD")}T${b.startTime}`));
+  return newTimesXleList;
+}
+
+/**
+ * @人脸验证
+ */
+function faceVerify(imageBase) {
+  faceApi()
+    .faceVef({ imageBase })
+    .then((res) => {
+      state.faceImgState = false;
+      if (res.data.code === 200 || res.data.code === 201) {
+        proxy.$modal.msg(res.data.msg);
+
+        meetingApi()
+          .Attendee({
+            meetingId: state.thisVenueData[0].meetingId,
+            userId: res.data.userId,
+            name: res.data.faceName,
+          })
+          .then((res1) => {
+            if (res1.data.status == "1") {
+              proxy.$modal.msg(res1.data.msg);
+              state.msg = `[${res.data.faceName}] ${res1.data.msg}`;
+
+              signOnOut({
+                meetingId: state.thisVenueData[0].meetingId,
+                userId: res.data.userId, //参会人Id
+                mothodType: 0, //签到签退类别(0.签到 1.签退)
+                signType: 1, //签到签退方式(0.人工 1.人脸)
+              }).then((res) => {});
+            } else {
+              proxy.$modal.msg(res1.data.msg);
+            }
+          });
+      } else {
+        proxy.$modal.msg(res.data.msg);
+      }
+    })
+    .catch((err) => {
+      state.faceImgState = false;
+    });
+}
+
+/**
+ * @弹窗确定按钮事件
+ */
+function modalConfirm() {
+  if (!state.form.linkUrl) {
+    proxy.$modal.msg("请输入链接地址");
+    return;
+  }
+
+  if (!/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}(?:\.[a-zA-Z0-9]{2,})+$/.test(state.form.linkUrl)) {
+    proxy.$modal.msg("请输入正确的链接地址");
+    return;
+  }
+
+  if (!state.form.meetingName) {
+    proxy.$modal.msg("请选择绑定会议室");
+    return;
+  }
+
+  uni.setStorageSync("storage_face", state.form);
+  getMeetingRoomReservationList();
+  state.modal.show = false;
+}
+
+/**
+ * @action弹出框点击事件
+ */
+function handlePicker(value, index, ind) {
+  if (value == "绑定会议室") {
+    state.picker.title = "绑定会议室";
+    state.picker.list = [state.meetingRoomList];
+    state.picker.defaultIndex = 0;
+  }
+
+  state.picker.show = true;
+}
+
+/**
+ * @action弹出框选择事件
+ */
+function pickerConfirm(e) {
+  if (state.picker.title == "绑定会议室") {
+    state.form.meetingId = e.value[0].value;
+    state.form.meetingName = e.value[0].name;
+  }
+
+  state.picker.show = false;
+}
+
+/**
+ * @弹窗退出按钮事件
+ */
+function modalCancel() {
+  state.modal.show = false;
+}
+
+/**
+ * @解析父页面传回的数据
+ */
+function analysisData(event) {
+  if ("funcName" in event) {
+    console.log(event.funcName);
+    if (event.funcName == "打开配置") {
+      state.modal.show = true;
+    } else if (event.funcName == "人脸识别") {
+      faceVerify(event.data.imageBase);
+    }
+  }
+}
+
+/**
+ * @向子页面发送数据
+ */
+function handleChildren(data) {
+  // #ifdef APP-PLUS
+  var currentWebview = pages[pages.length - 1].$getAppWebview();
+  var wv = currentWebview.children()[0];
+  wv.evalJS(`receiveData(${JSON.stringify(data)})`);
+  // #endif
+
+  // #ifdef H5
+  var iframe = document.getElementById("faceView");
+  iframe.contentWindow.postMessage(data, "*");
+  // #endif
+}
+
+/**
+ * @接收子页面传过来的值
+ */
+function onMessage(e) {
+  analysisData(e.detail.data[0]);
+}
+// #ifdef H5
+window.onmessage = function (event) {
+  analysisData(event.data);
+};
+// #endif
+
+onLoad((options) => {
+  init();
+});
+
+watch(
+  () => [state.form.linkUrl, state.form.port],
+  (val) => {
+    state.meetingRoomList = [];
+
+    if (!state.form.linkUrl) {
+      return;
+    }
+
+    if (!/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}(?:\.[a-zA-Z0-9]{2,})+$/.test(state.form.linkUrl)) {
+      return;
+    }
+
+    getMeetingRoomList();
+  }
+);
+</script>
+<style>
+.faceView {
+  width: 100% !important;
+  height: 100% !important;
+}
+
+iframe {
+  width: 100% !important;
+  height: 100% !important;
+  border-width: 0;
+}
+</style>
+<style lang="scss" scoped>
+:deep() {
+  .u-modal {
+    width: 30rem !important;
+
+    &__title {
+      font-size: 18px !important;
+    }
+    .slot-content {
+      font-size: 16px;
+      width: 100%;
+    }
+  }
+}
+</style>

+ 1 - 1
src/pages/common/searchSelect/index.vue

@@ -9,7 +9,7 @@
 
   <oa-scroll
     customClass="info-container scroll-height"
-    :customStyle="{ height: `calc(100vh - (${proxy.$settingStore.barHightTop} + ${proxy.$settingStore.tabBarHeight}))` }"
+    :customStyle="{ height: `calc(100vh - (44px + ${proxy.$settingStore.StatusBarHeight} + ${proxy.$settingStore.tabBarHeight}))` }"
     :refresherLoad="false"
     :refresherEnabled="false"
     :refresherEnabledTitle="false"

+ 4 - 2
src/pages/index.vue

@@ -19,7 +19,7 @@
 
   <oa-scroll
     customClass="scroll-height"
-    :customStyle="{ height: `calc(100vh - (50px + ${proxy.$settingStore.barHightTop} + ${proxy.$settingStore.tabBarHeight}))` }"
+    :customStyle="{ height: `calc(100vh - (94px + ${proxy.$settingStore.StatusBarHeight} + ${proxy.$settingStore.tabBarHeight}))` }"
     :refresherLoad="false"
     :refresherEnabled="true"
     :refresherEnabledTitle="false"
@@ -33,7 +33,7 @@
         <!-- 右侧弹窗 -->
         <u-transition :show="dialogFlag" :duration="200" mode="fade">
           <view class="transition" @click="rightButtonClick()">
-            <view class="transition-section" :style="{ top: proxy.$settingStore.barHightTop }">
+            <view class="transition-section" :style="{ top: '44px' + proxy.$settingStore.StatusBarHeight }">
               <view class="transition-section-content" @click="scanCode()">
                 <text class="transition-section-content-icon iconfont oaIcon-saoyisao"></text>
                 <view class="transition-section-content-text"> 扫一扫 </view>
@@ -48,7 +48,9 @@
         <image v-if="!state.swiperBool" style="width: 100%; height: 160px" src="@/static/images/index/banner1.png"></image>
 
         <!-- 天气 -->
+        <!-- #ifdef APP-PLUS || H5 -->
         <oa-weather ref="oaWeatherRef"></oa-weather>
+        <!-- #endif -->
 
         <!-- 最近使用宫格 -->
         <view class="grid-area bg-white" v-if="state.recentlyUsed.length > 0">

+ 1 - 1
src/pages/info.vue

@@ -26,7 +26,7 @@
 
   <oa-scroll
     customClass="info-container scroll-height bg-white"
-    :customStyle="{ height: `calc(100vh - (50px + ${proxy.$settingStore.barHightTop} + ${proxy.$settingStore.tabBarHeight}))`, position: 'relative' }"
+    :customStyle="{ height: `calc(100vh - (94px + ${proxy.$settingStore.StatusBarHeight} + ${proxy.$settingStore.tabBarHeight}))`, position: 'relative' }"
     :refresherLoad="false"
     :refresherEnabled="true"
     :refresherEnabledTitle="false"

+ 80 - 50
src/pages/login.vue

@@ -61,16 +61,7 @@
     </view>
   </view>
 
-  <u-modal
-    :show="modalShow"
-    title="用户协议及隐私政策"
-    :confirmText="'同意'"
-    :cancelText="'不同意'"
-    :zoom="false"
-    :showCancelButton="true"
-    @confirm="(uChecked = true), (modalShow = false)"
-    @cancel="modalShow = false"
-  >
+  <u-modal :show="modalShow" title="用户协议及隐私政策" :confirmText="'同意'" :cancelText="'不同意'" :zoom="false" :showCancelButton="true" @confirm="modalConfirm()" @cancel="modalShow = false">
     <view class="slot-content">
       <view>
         您在使用我们的服务时,我们可能会收集和使用您的相关信息。我们希望通过本
@@ -82,6 +73,24 @@
       </view>
     </view>
   </u-modal>
+
+  <u-modal
+    :show="xunJianStore.modal.show"
+    title="提醒"
+    :zoom="false"
+    :showConfirmButton="true"
+    :showCancelButton="true"
+    :closeOnClickOverlay="true"
+    @confirm="xunJianStore.modalConfirm"
+    @cancel="xunJianStore.modal.show = false"
+    @close="xunJianStore.modal.show = false"
+  >
+    <view class="slot-content">
+      <view class="mb20">
+        <u-input v-model="xunJianStore.modal.exitPassword" placeholder="霸屏退出密码(必填)" border="bottom" style="padding: 6px 0px" />
+      </view>
+    </view>
+  </u-modal>
 </template>
 
 <script setup>
@@ -91,7 +100,7 @@ import { reactive, getCurrentInstance, toRefs, inject, nextTick } from "vue";
 /*----------------------------------接口引入-----------------------------------*/
 /*----------------------------------组件引入-----------------------------------*/
 /*----------------------------------store引入-----------------------------------*/
-import { useStores, commonStores } from "@/store/modules/index";
+import { useStores, commonStores, xunJianStores } from "@/store/modules/index";
 /*----------------------------------公共方法引入-----------------------------------*/
 import config from "@/config";
 import { storageSystem } from "@/utils/storage";
@@ -99,6 +108,7 @@ import { storageSystem } from "@/utils/storage";
 const { proxy } = getCurrentInstance();
 const useStore = useStores();
 const commonStore = commonStores();
+const xunJianStore = xunJianStores();
 /*----------------------------------变量声明-----------------------------------*/
 const state = reactive({
   /** login数据 */
@@ -231,10 +241,10 @@ function submitRes() {
   }
 
   login({
-    username: switchText.value == "账号密码登录" ? username.value : undefined,
-    password: switchText.value == "账号密码登录" ? password.value : undefined,
-    phone: switchText.value == "验证码登录" ? phone.value : undefined,
-    verify: switchText.value == "验证码登录" ? verify.value : undefined,
+    username: state.switchText == "账号密码登录" ? state.username : undefined,
+    password: state.switchText == "账号密码登录" ? state.password : undefined,
+    phone: state.switchText == "验证码登录" ? state.phone : undefined,
+    verify: state.switchText == "验证码登录" ? state.verify : undefined,
     tenantId: useStore.tenantId,
     cids: proxy.$settingStore.pushClientId || undefined,
     type: proxy.$common.isWechatMp() ? "wx" : "app",
@@ -256,9 +266,18 @@ function login(data) {
   });
 }
 
+/** 隐私弹窗确定事件 */
+function modalConfirm() {
+  state.uChecked = true;
+  state.modalShow = false;
+  setTimeout(() => {
+    submitRes();
+  });
+}
+
 // 复选框chage事件
 function uCheckedChange(e) {
-  uChecked.value = e;
+  state.uChecked = e;
 }
 
 // 用户协议
@@ -283,6 +302,14 @@ onLoad((options) => {});
 </script>
 
 <style lang="scss" scoped>
+:deep() {
+  .u-modal {
+    .slot-content {
+      font-size: 16px;
+      width: 100%;
+    }
+  }
+}
 .login-container {
   position: fixed;
   top: 0;
@@ -375,40 +402,37 @@ onLoad((options) => {});
 
     // 登录页-服务器配置样式 开始
     &-input {
-      :deep(.u-input) {
-        height: 45px;
-        border: 0 !important;
-        border-radius: 8px;
-        margin-bottom: 15px;
-        padding: 5px 12px !important;
-        background-color: #f5f6fa !important;
-      }
-
-      :deep(.input-placeholder) {
-        color: #c0c4cc !important;
-      }
-
-      :deep(.uni-input-wrapper) {
-        font-size: 16px;
-      }
-
-      :deep(.u-icon__icon) {
-        font-size: 24px !important;
-        line-height: 24px !important;
-        color: gray !important;
-      }
-
-      :deep(.iconfont) {
-        color: gray !important;
-      }
-
-      :deep(:-webkit-autofill) {
-        caret-color: #000; // 设置光标颜色
-        // -webkit-text-fill-color: gray !important;
-        -webkit-box-shadow: 0 0 0px 1000px transparent inset !important;
-        background-color: transparent;
-        background-image: none;
-        transition: background-color 50000s ease-in-out 0s; //背景色透明  生效时长  过渡效果  启用时延迟的时间
+      :deep() {
+        .u-input {
+          height: 45px;
+          border: 0 !important;
+          border-radius: 8px;
+          margin-bottom: 15px;
+          padding: 5px 12px !important;
+          background-color: #f5f6fa !important;
+        }
+        .input-placeholder {
+          color: #c0c4cc !important;
+        }
+        .uni-input-wrapper {
+          font-size: 16px;
+        }
+        .u-icon__icon {
+          font-size: 24px !important;
+          line-height: 24px !important;
+          color: gray !important;
+        }
+        .iconfont {
+          color: gray !important;
+        }
+        :-webkit-autofill {
+          caret-color: #000; // 设置光标颜色
+          // -webkit-text-fill-color: gray !important;
+          -webkit-box-shadow: 0 0 0px 1000px transparent inset !important;
+          background-color: transparent;
+          background-image: none;
+          transition: background-color 50000s ease-in-out 0s; //背景色透明  生效时长  过渡效果  启用时延迟的时间
+        }
       }
     }
 
@@ -475,4 +499,10 @@ onLoad((options) => {});
     }
   }
 }
+
+@media (min-width: 1280px) {
+  .middle {
+    margin-top: auto !important;
+  }
+}
 </style>

+ 1 - 1
src/pages/mine/info/index.vue

@@ -65,7 +65,7 @@
       </view>
     </view>
 
-    <!-- <view class="user-section" :class="'bg-' + proxy.$settingStore.themeColor.name" :style="{ paddingTop: proxy.$settingStore.barHightTop }">
+    <!-- <view class="user-section" :class="'bg-' + proxy.$settingStore.themeColor.name" :style="{ paddingTop: '44px' + proxy.$settingStore.StatusBarHeight }">
       <image class="bg" src="@/static/images/mine/user-bg.png"></image>
       <view class="portrait-box">
         <image v-if="!avatar" @click="proxy.$settingStore.handleToAvatar(1)" class="portrait" src="@/static/images/mine/missing-face.png"></image>

+ 1 - 0
src/pages/register.vue

@@ -143,6 +143,7 @@ function handleSubmit() {
 function navigateTo() {
   proxy.$tab.navigateBack(1);
 }
+
 onLoad((options) => {});
 </script>
 

+ 1 - 1
src/pages/serveConfig.vue

@@ -12,7 +12,7 @@
 
     <view class="bottom-area">
       <u-input v-model="linkUrl" placeholder="服务器地址(必填)" border="none" clearable> </u-input>
-      <u-input v-model="port" type="number" placeholder="端口(非必填)" border="none" maxlength="5" clearable> </u-input>
+      <u-input v-model="port" type="number" placeholder="服务器端口(非必填)" border="none" maxlength="5" clearable> </u-input>
       <u-input v-model="content" placeholder="备注(非必填)" border="none" maxlength="20" clearable> </u-input>
 
       <u-button

+ 1 - 0
src/permission.js

@@ -21,6 +21,7 @@ const whiteList = [
   "/pages/common/evaluate/record",//服务评价
   "/pages/common/NFC/index",//NFC读取
   "/pages/common/appMessage/details",//消息详情
+  "/pages/common/face/index",//人脸识别
 ];
 
 // 检查地址白名单

+ 18 - 21
src/plugins/common.plugins.js

@@ -71,31 +71,28 @@ export default {
       }
     });
   },
-
-
-    /**
+  /**
    * 树结构过滤
    * @param {*} treeData 
    * @param {*} ids 
    * @returns 
    */
-    findTreeNodes(treeData, ids) {
-      const result = [];
-      const findNodes_ = (nodes, idArray) => {
-        nodes.forEach(node => {
-          if (idArray.includes(node.id)) {
-            result.push(node);
-          }
-          if (node.children && node.children.length > 0) {
-            findNodes_(node.children, idArray);
-          }
-        });
-      };
-     
-      findNodes_(treeData, ids);
-      return result;
-    },
-  
+  findTreeNodes(treeData, ids) {
+    const result = [];
+    const findNodes_ = (nodes, idArray) => {
+      nodes.forEach(node => {
+        if (idArray.includes(node.id)) {
+          result.push(node);
+        }
+        if (node.children && node.children.length > 0) {
+          findNodes_(node.children, idArray);
+        }
+      });
+    };
+
+    findNodes_(treeData, ids);
+    return result;
+  },
   /**
    * @复制粘贴板
    * @param {传入值} content 
@@ -305,5 +302,5 @@ export default {
     if (data && data.length > 0) {
       uni.previewImage(param)
     }
-  }
+  },
 };

+ 16 - 0
src/plugins/index.js

@@ -6,11 +6,20 @@ import setting from "./setting.plugins";
 import time from "./time.plugins.js";
 import constData from "./constData.plugins.js";
 import nfc from "./nfc.plugins.js";
+import keyListen from "./keyListen.plugins.js";
 
 import config from "@/config"; // config
 import { useDict } from '@/utils/dict'
 import { settingStores } from "@/store/modules/index";
 
+import dayjs from 'dayjs'
+import isBetween from 'dayjs/plugin/isBetween';
+import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
+import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
+dayjs.extend(isBetween);
+dayjs.extend(isSameOrAfter)
+dayjs.extend(isSameOrBefore)
+
 export default {
   install(app) {
     // 公共请求路径
@@ -46,7 +55,14 @@ export default {
     // 公共设置stroe
     app.provide("$settingStore", settingStores());
     app.config.globalProperties.$settingStore = settingStores();
+    // 公共时间处理方法dayjs
+    app.provide("$dayjs", dayjs);
+    app.config.globalProperties.$dayjs = dayjs;
     // 公共字典模块
     app.config.globalProperties.useDict = useDict
+    // 公共物理按钮监听
+    app.provide("$keyListen", keyListen);
+    app.config.globalProperties.$keyListen = keyListen;
+
   },
 };

+ 134 - 0
src/plugins/keyListen.plugins.js

@@ -0,0 +1,134 @@
+import { xunJianStores } from "@/store/modules/index";
+
+const SYSTEM_REASON = "reason";
+//Home键
+const SYSTEM_HOME_KEY = "homekey";
+//最近使用的应用键
+const SYSTEM_RECENT_APPS = "recentapps";
+
+let receiver, Intent = false;
+export default {
+    startListen: function (needStopSystem = false) {//开始监听,初始化
+        //参数needStopSystem默认不阻止系统响应,如需阻止调用startListen(true)
+        /*特别提醒,全面屏手势Home和recent部分机型是监听不到的,自行测试,如遇卡死电脑控制台直接重新运行项目即可解决!*/
+        let that = this;
+        let main = plus.android.runtimeMainActivity();
+        that.openListen();
+        if (needStopSystem) {
+            plus.key.addEventListener("backbutton", function (e) {
+                // main.stopLockTask()//按返回键恢复
+                // main.startLockTask()//阻止系统home建和近期任务键
+                // main.unregisterReceiver(receiver); //同时停止接收home和recent点击
+                const pages = getCurrentPages(); // 获取当前页面栈
+                const currentPage = pages[pages.length - 1]; // 最后一个元素即为当前页面
+                xunJianStores().modal.show = currentPage.route === 'pages/login' ? true : false
+                console.log('监听返回')
+                e.preventDefault();
+            });
+        } else {
+        }
+
+    },
+    openListen: function () {//注册监听
+        let that = this;
+        try {
+            let main = plus.android.runtimeMainActivity();
+            Intent = plus.android.importClass('android.content.Intent');
+            let IntentFilter = plus.android.importClass('android.content.IntentFilter');
+            var filter = new IntentFilter();
+            filter.addAction(Intent.ACTION_SCREEN_ON);
+            filter.addAction(Intent.ACTION_SCREEN_OFF);
+            filter.addAction(Intent.ACTION_USER_PRESENT);
+            filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+            filter.addAction('android.intent.action.MEDIA_BUTTON');
+            receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
+                onReceive: function (context, intent) { //实现onReceiver回调函数  
+                    let act = intent.getAction();
+                    if (act == Intent.ACTION_SCREEN_ON) {
+                        console.log('开屏')
+                    } else if (act == Intent.ACTION_SCREEN_OFF) {
+                        console.log('锁屏')
+                    } else if (act == Intent.ACTION_USER_PRESENT) {
+                        console.log('解锁')
+                    } else if (act == Intent.ACTION_CLOSE_SYSTEM_DIALOGS) {
+                        let systemReason = intent.getStringExtra(SYSTEM_REASON);
+                        console.log("关闭原因", systemReason);
+                        if (systemReason != null) {
+                            if (systemReason == SYSTEM_HOME_KEY) {
+                                // System.out.println("按下HOME键");
+                                console.log('按下HOME键')
+                                that.launchApp();//启动APP
+
+                            } else if (systemReason == SYSTEM_RECENT_APPS) {
+                                // System.out.println("按下多任务键");
+                                console.log('按下多任务键')
+                                that.launchApp();//启动APP
+                            }
+                        }
+                    }
+                    // main.unregisterReceiver(receiver);
+                    /*在这里取消会出现第二次监听无效,可根据不同业务要求
+                    在不同时刻停止接收两个按键的广播,我的处理是在返回的时候停*/
+                    // context.unregisterReceiver(receiver);
+                }
+            });
+            main.registerReceiver(receiver, filter); //注册监听  
+        } catch (e) {
+            console.error(e);
+            that.toast('初始化错误');
+        }
+    },
+    // 全屏函数
+    fullScreen() {
+        // Android全屏
+        if (uni.getSystemInfoSync().platform === "android") {
+            plus.android.invoke("setFullScreen", true);
+        }
+
+        // iOS全屏
+        if (uni.getSystemInfoSync().platform === "ios") {
+            // iOS无法通过API直接全屏,可以尝试隐藏所有导航栏
+            plus.navigator.hideSystemBar();
+        }
+    },
+    // 进入固定屏幕模式
+    stopHomeEmit() {
+        let main = plus.android.runtimeMainActivity();
+        main.stopLockTask()//按返回键恢复
+        main.startLockTask()//阻止系统home建和近期任务键
+    },
+    // 启动APP
+    launchApp() {
+        var isApp = plus.runtime.isApplicationExist({
+            //查看安卓系统手机有没有下载这款app
+            pname: 'android.dcloud.uskyMobile' //本地浏览器的包名
+        })
+
+        if (isApp) {
+            //安装了app则运行
+            plus.runtime.launchApplication(
+                {
+                    pname: "android.dcloud.uskyMobile",
+                    newTask: false
+                },
+                (e) => {
+                    console.log("e", e);
+                }
+            );
+        }
+        plus.runtime.launcher('shortcut');
+        plus.runtime.restart();
+    },
+    // 退出APP
+    quitApp() {
+        plus.runtime.quit();
+    },
+    // 提示
+    toast(content) {
+        uni.showToast({
+            title: content,
+            icon: 'none'
+
+        })
+    }
+}

+ 46 - 0
src/plugins/time.plugins.js

@@ -167,5 +167,51 @@ export default {
             startDate: startDate,
             endDate: endDate
         }
+    },
+    /**
+     * @时间重组
+     * @param { 时间段 } chooseTime 
+     */
+    timeRestructuring(chooseTime) {
+        var startTime = "";
+        var endTime = "";
+        let start = chooseTime[0];
+        let end = chooseTime[1];
+
+        if (start == 0 && end == 0) {
+            startTime = "00:00";
+            endTime = "00:30";
+        }
+
+        if ((!start && start !== 0) || !end) {
+            startTime = "";
+            endTime = "";
+            return;
+        }
+
+        if (start % 1 === 0.5) {
+            start = (start - 0.5 < 10 ? "0" : "") + (start - 0.5) + ":30";
+        } else {
+            start = (start < 10 ? "0" : "") + start + ":00";
+        }
+
+        if (Number.isInteger(end)) {
+            if (end === 24) {
+                end = "23:30";
+            } else {
+                end = (end - 0.5 < 10 ? "0" : "") + end + ":00";
+            }
+        } else {
+            if (end === 24) {
+                end = "23:30";
+            } else {
+                end = (end < 10 ? "0" : "") + (end - 0.5) + ":30";
+            }
+        }
+
+        return {
+            startTime: start,
+            endTime: end,
+        };
     }
 }

BIN
src/static/face/img/logo.png


+ 382 - 0
src/static/face/index.html

@@ -0,0 +1,382 @@
+<!doctype html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <title>人脸识别</title>
+    <script type="text/javascript" src="./js/tracking-min.js"></script>
+    <script type="text/javascript" src="./js/face-min.js"></script>
+    <script type="text/javascript" src="./js/jquery-2.2.1.min.js"></script>
+    <!-- uni 的 SDK -->
+    <!-- 需要把 uni.webview.1.5.4.js 下载到自己的服务器 -->
+    <script type="text/javascript" src="./js/uni.webview.1.5.4.js"></script>
+    <style>
+        html,
+        body {
+            width: 100%;
+            height: 100%;
+            margin: 0;
+            /* Safari */
+            -webkit-user-select: none;
+            /* Firefox */
+            -moz-user-select: none;
+            /* IE10+/Edge */
+            -ms-user-select: none;
+            /* Standard syntax */
+            user-select: none;
+
+            ::-webkit-scrollbar {
+                display: none;
+            }
+        }
+
+        video,
+        canvas {
+            position: absolute;
+            left: 0;
+            top: 0;
+        }
+
+        .home-card-one,
+        .home-card-two,
+        .home-card-three {
+            display: flex;
+            flex-wrap: wrap;
+            overflow: auto;
+            color: #000;
+            padding: 20px 20px 50px 20px;
+            width: calc(100% - 40px);
+            height: calc(100% - 70px);
+            text-align: center;
+            background-color: #fff;
+        }
+
+
+        .home-card-left {
+            display: flex;
+            flex-wrap: wrap;
+            width: calc(50% - 10px);
+            margin-right: 10px;
+        }
+
+        .home-card-left-image {
+            max-height: auto;
+        }
+
+        .home-card-left-header {
+            width: 100%;
+            clear: both;
+            font-size: 30px;
+            color: #409eff;
+            margin: 30px 0 30px 0;
+        }
+
+        .home-card-left-content {
+            width: 100%;
+            font-size: 18px;
+            padding: 10px;
+            background-color: #dfdfdf;
+            border-radius: 15px;
+        }
+
+        /* .home-card-left-content>div:last-child {
+            margin-bottom: 30px;
+        } */
+
+        .home-card-left-content>div {
+            margin-bottom: 20px;
+        }
+
+        .home-card-left-content>div:first-child {
+            text-align: left;
+            margin-bottom: 30px;
+        }
+
+        .home-card-right {
+            display: flex;
+            flex-wrap: wrap;
+            width: calc(50% - 10px);
+            text-align: center;
+            justify-content: center;
+            background-color: #409eff;
+            border-radius: 15px;
+            color: white;
+            margin-left: 10px;
+        }
+
+        .home-card-right-header {
+            display: flex;
+            justify-content: center;
+            max-height: 36px;
+            margin-bottom: 30px;
+        }
+
+        .home-card-right-header-center {
+            padding: 10px;
+            font-size: 12px;
+            background: rgb(255 255 255 / 10%);
+            border-radius: 5px;
+        }
+
+        .home-card-right-header-title {
+            font-size: 18px;
+            margin: auto 0;
+        }
+
+        .home-card-right-content {
+            width: 100%;
+        }
+
+        .home-card-right-footer {
+            position: relative;
+            width: 320px;
+            height: 240px;
+        }
+
+        .home-card-bottom {
+            width: 100%;
+            position: absolute;
+            left: 0;
+            bottom: 0;
+            display: flex;
+            overflow: auto;
+            height: 31px;
+            margin-top: 20px;
+        }
+
+        .home-card-bottom>div {
+            padding: 6px;
+            font-size: 13px;
+            color: #fff;
+            border-left: 1.5px #fff solid;
+            white-space: nowrap;
+        }
+
+        .home-card-bottom>div:first-child {
+            border: 0px;
+        }
+
+        @media (max-width: 768px) {
+
+            .home-card-left,
+            .home-card-right {
+                width: 100% !important;
+                margin: 0 !important;
+            }
+
+            .home-card-left {
+                margin-bottom: 20px !important;
+            }
+        }
+    </style>
+</head>
+
+<body>
+    <div id="face-container" class="face-container home-card-two">
+        <div id="home-card-left" class="home-card-left"></div>
+        <div id="home-card-right" class="home-card-right"></div>
+        <div id="home-card-bottom" class="home-card-bottom"></div>
+    </div>
+
+    <script type="text/javascript">
+        var state = {
+            dataAll: {},
+            thisVenueData: [],
+            thisVenueTime: {},
+            nextSceneData: [],
+            nextSceneTime: {},
+            timeList: []
+        }
+        var timeOutEvent = 0;
+
+
+        // 初始化
+        function initData() {
+            $(`#home-card-left`).append(`
+                <image id="home-card-left-image" class="home-card-left-image" src="./img/logo.png" width="125px" height="60px" mode="aspectFill"></image>
+                <div class="home-card-left-header">${state.dataAll?.roomName || "请配置会议室"}</div>
+                <div class="home-card-left-content" style="margin-bottom: 20px;">
+                    <div>本场会议</div>
+                    <div>${state.thisVenueData[0]?.meetingName || "空闲中"}</div>
+                    <div>${state.thisVenueTime.startTime || "00:00"} — ${state.thisVenueTime.endTime || "00:00"}</div>
+                </div>
+
+                <div class="home-card-left-content">
+                    <div>下场会议</div>
+                    <div>${state.nextSceneData[0]?.meetingName || "空闲中"}</div>
+                    <div>${state.nextSceneTime.startTime || "00:00"} — ${state.nextSceneTime.endTime || "00:00"}</div>
+                </div>
+            `)
+
+            $(`#home-card-right`).append(`
+                <div class="home-card-right-header">
+                    <div class="home-card-right-header-center">
+                        <span style="padding: 0 5px 0 0; border-right: 1px #fff solid">温度:80℃</span>
+                        <span style="padding: 0px 5px; border-right: 1px #fff solid">湿度:80%</span>
+                        <span style="padding: 0px 5px; border-right: 1px #fff solid">PM2.5:10μg/m3</span>
+                        <span style="padding: 0 0 0 5px">甲醛:0ppm</span>
+                    </div>
+                    <div class="home-card-right-header-title">${state.thisVenueData[0] ? "&nbsp;&nbsp;会议进行中" : "&nbsp;"}</div>
+                </div>
+                <div class="home-card-right-content">
+                    <div style="font-size: 20px; margin-bottom: 15px;">${state.thisVenueData[0]?.meetingName || "空闲中"}</div>
+                    <div style="font-size: 18px; margin-bottom: 15px;">
+                        ${state.thisVenueTime.startTime || "00:00"} — ${state.thisVenueTime.endTime || "00:00"}
+                    </div>
+                    <div style="font-size: 14px; margin-bottom: 15px;">${state.msg || "&nbsp;"}</div>
+                </div>
+                <div class="home-card-right-footer" id="home-card-right-footer">
+                    <video id="video" width="320" height="240" preload autoplay loop muted></video>
+                    <canvas id="canvas" width="320" height="240"></canvas>
+                </div>
+            `)
+
+            var html = ``
+            state.timeList.forEach((item, timeIndex) => {
+                html += `
+                    <div id="timeScorll${timeIndex}" style="background-color: ${item.isEnd === 1 ? "#909399" : item.isHave === 1 ? "#fa3534" : item.isReservation === 1 ? "#ff9900" : "#409eff"}">
+                      ${item.isEnd != 0 || item.isHave != 0 || item.isReservation != 0 ? item.startTime + " —— " + item.endTime : item.startTime}  
+                    </div >
+                `
+            });
+            $(`#home-card-bottom`).append(html)
+
+            var video = document.getElementById("video");//视频dom
+            video.style.transform = 'scaleX(-1)';//视频翻转(1.水平翻转-scaleX(-1) 2.垂直翻转-scaleY(-1))
+            var canvas = document.getElementById('canvas');//画布dom
+            canvas.style.transform = 'scaleX(-1)';//画布翻转(1.水平翻转-scaleX(-1) 2.垂直翻转-scaleY(-1))
+            var context = canvas.getContext('2d');
+            var time = 5000;
+            var tracker = new tracking.ObjectTracker('face');
+            tracker.setInitialScale(4); //设置识别的放大比例
+            tracker.setStepSize(2);//设置步长
+            tracker.setEdgesDensity(0.1);//边缘密度
+            //启动摄像头,并且识别视频内容
+            var trackerTask = tracking.track('#video', tracker, {
+                camera: true
+            });
+
+            var flag = true;
+            tracker.on('track', function (event) {
+                if (event.data.length === 0) {
+                    // console.log('未检测到人脸')
+                    context.clearRect(0, 0, canvas.width, canvas.height);
+                } else if (event.data.length > 1) {
+                    // console.log('检测到多张人脸')
+                } else {
+                    context.clearRect(0, 0, canvas.width, canvas.height);
+                    event.data.forEach(function (rect) {
+                        context.strokeStyle = '#409eff';
+                        context.strokeRect(rect.x, rect.y, rect.width, rect.height);
+                        context.fillStyle = "#409eff";
+                        context.lineWidth = 1.5;
+                    });
+                    if (flag) {
+                        console.log("拍照");
+                        context.drawImage(video, 0, 0, video.width, video.height);
+                        saveAsLocalImage();
+                        context.clearRect(0, 0, canvas.width, canvas.height);
+                        flag = false;
+                        setTimeout(function () {
+                            flag = true;
+                        }, time);
+                    } else {
+                        //console.log("冷却中");
+                    }
+                }
+            });
+
+            $("#home-card-left-image").on({
+                touchstart: function (e) {
+                    timeOutEvent = setTimeout("longPress()", 500);
+                    e.preventDefault();
+                },
+                touchmove: function () {
+                    clearTimeout(timeOutEvent);
+                    timeOutEvent = 0;
+                },
+                touchend: function () {
+                    clearTimeout(timeOutEvent);
+                    if (timeOutEvent != 0) {
+                        console.log("你这是点击,不是长按");
+                    }
+                    return false;
+                }
+            })
+        }
+
+        // 长按事件
+        function longPress() {
+            timeOutEvent = 0
+            parentMessage('打开配置')
+        }
+
+        /**
+         * 解析数据
+         */
+        function analysisData(event) {
+            console.log(event.funcName)
+            if ("funcName" in event) {
+                if (event.funcName == "初始化") {
+                    $(`#home-card-left`).empty();//删除dom下的所有子元素
+                    $("#home-card-right").empty();//删除dom下的所有子元素
+                    $(`#home-card-bottom`).empty();//删除dom下的所有子元素
+
+                    state.dataAll = JSON.parse(event.data).dataAll
+                    state.thisVenueData = JSON.parse(event.data).thisVenueData
+                    state.thisVenueTime = JSON.parse(event.data).thisVenueTime
+                    state.nextSceneData = JSON.parse(event.data).nextSceneData
+                    state.nextSceneTime = JSON.parse(event.data).nextSceneTime
+                    state.timeList = JSON.parse(event.data).timeList
+
+                    initData();
+                } else if (event.funcName == "撒点") {
+
+                }
+            }
+        }
+
+        // 获取图片bold
+        function saveAsLocalImage() {
+            var myCanvas = document.getElementById("canvas");
+            var image = myCanvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
+            parentMessage('人脸识别', { imageBase: image })
+        }
+
+        // 向父页面发送数据
+        function parentMessage(type, data) {
+            var message = {
+                funcName: type,
+                data: data,
+            };
+
+            //APP-PLUS
+            uni.postMessage({
+                data: message
+            });
+
+            //H5
+            if (window.parent) {
+                window.parent.postMessage(message, '*');
+            }
+        }
+
+        /**
+         * APP-PLUS || H5
+         * 接收父页面传过来的值
+         */
+        window.receiveData = function (msg) {
+            analysisData(msg)
+        }
+        window.addEventListener("message", function (event) {
+            analysisData(event.data)
+        });
+
+        window.onload = function () {
+            initData();
+        };
+    </script>
+
+</body>
+
+</html>

File diff suppressed because it is too large
+ 7 - 0
src/static/face/js/face-min.js


File diff suppressed because it is too large
+ 1 - 0
src/static/face/js/jquery-2.2.1.min.js


File diff suppressed because it is too large
+ 7 - 0
src/static/face/js/tracking-min.js


File diff suppressed because it is too large
+ 0 - 0
src/static/face/js/uni.webview.1.5.4.js


+ 4 - 0
src/static/scss/global.scss

@@ -108,4 +108,8 @@
       }
     }
   }
+}
+.textExceeds{
+  word-wrap: break-word; 
+  word-break: break-all; 
 }

+ 16 - 5
src/store/modules/setting.js

@@ -20,9 +20,8 @@ const settingStores = defineStore("storage-setting", {
         currentSize: "",//APP缓存
         barHeight: 0,//微信小程序顶部安全距离
         webViewHeight: "",//webView整体高度-铺满
-        StatusBar: 0,//APP顶部安全距离
+        StatusBarHeight: "",//APP顶部安全距离
         tabBarHeight: "",//APP底部安全距离
-        barHightTop: "",//APP头部计算距离
         deviceList: {
             networkType: null, //网络类型
             deviceBrand: null, //设备品牌
@@ -46,9 +45,8 @@ const settingStores = defineStore("storage-setting", {
         systemHeightTop() {
             let systemInfo = uni.getSystemInfoSync();
             this.webViewHeight = systemInfo.safeArea.bottom  //高度+安全区域的高度
-            this.StatusBar = systemInfo.statusBarHeight
+            this.StatusBarHeight = systemInfo.statusBarHeight + "px"
             this.tabBarHeight = common.isWechatMp() ? "0px" : systemInfo.screenHeight - systemInfo.safeArea.bottom + "px"
-            this.barHightTop = this.StatusBar ? this.StatusBar + 44 + 'px' : '44px'
 
             //#ifdef MP
             let custom = wx.getMenuButtonBoundingClientRect();
@@ -294,9 +292,22 @@ const settingStores = defineStore("storage-setting", {
             let platform = uni.getSystemInfoSync().platform; //手机平台
             let data = {
                 _api_key: "fba7440cd37400b6ff46e303896af4df",
-                appKey: platform === "android" ? "cbd3508235d03365f4253f6aae6b68ab" : "4b858fce6367652f5c0959a0444a4bea",
+                appKey: "",
                 buildVersion: config.appInfo.version,
             };
+
+            // 综合智慧云
+            if (config.appInfo.appid === "__UNI__36DE3A0") {
+                data.appKey = platform === "android" ? "cbd3508235d03365f4253f6aae6b68ab" : "4b858fce6367652f5c0959a0444a4bea"
+            }
+            // 智能巡更
+            else if (config.appInfo.appid === "__UNI__BF1A1F0") {
+                data.appKey = platform === "android" ? "d67e04ab2f4b8a1fa01a773692fc666c" : "d67e04ab2f4b8a1fa01a773692fc666c"
+            }
+            // 智能会议
+            else if (config.appInfo.appid === "__UNI__F3963F8") {
+            }
+
             modal.loading("加载中");
             checkUpdates(data).then((res) => {
                 if (res.code == 0) {

+ 25 - 1
src/store/modules/xunJian.js

@@ -5,7 +5,7 @@ import { updatePlan } from "@/api/business/zhaf/xunJian/plan.js";
 // 公共方法引用
 import modal from "@/plugins/modal.plugins.js";
 import common from "@/plugins/common.plugins.js";
-import { storage, storageSystem } from "@/utils/storage";
+import keyListen from "@/plugins/keyListen.plugins.js";
 
 const xunJianStores = defineStore(`storage-xunJian`, {
   state: () => ({
@@ -20,6 +20,12 @@ const xunJianStores = defineStore(`storage-xunJian`, {
 
     collectDataList: [], //巡检点位采集数据存储
     planDataList: [],//巡检计划采集数据存储
+
+    modal: {
+      show: false,
+      exitPassword: "",
+      newExitPassword: "Usky-1707",//系统退出密码
+    }
   }),
   unistorage: true,
   actions: {
@@ -44,6 +50,24 @@ const xunJianStores = defineStore(`storage-xunJian`, {
           }, 1000);
         });
       }
+    },
+    modalConfirm() {
+      //#ifdef APP-PLUS
+      if (!this.modal.exitPassword) {
+        modal.showToast("密码不能为空");
+        return;
+      }
+
+      if (this.modal.exitPassword != this.modal.newExitPassword) {
+        modal.showToast("密码错误");
+        this.modal.show = true;
+        return;
+      }
+
+      this.modal.exitPassword = ""
+      this.modal.show = false;
+      keyListen.quitApp(); //退出APP
+      //#endif
     }
   },
 });

+ 0 - 105
src/utils/keyListen.js

@@ -1,105 +0,0 @@
-// 包路径
-// const package_Activity = 'android.app.Activity'; 
-// const package_Bundle = 'android.os.Bundle'; 
-// const package_MotionEvent = 'android.view.MotionEvent'; 
-// const package_KeyEvent = 'android.view.KeyEvent'; 
-
-
-const SYSTEM_REASON = "reason";
-//Home键
-const SYSTEM_HOME_KEY = "homekey";
-//最近使用的应用键
-const SYSTEM_RECENT_APPS = "recentapps";
-
-let receiver, Intent = false;
-export default {
-	startListen: function (needStopSystem = false) {//开始监听,初始化
-		//参数needStopSystem默认不阻止系统响应,如需阻止调用startListen(true)
-		/*特别提醒,全面屏手势Home和recent部分机型是监听不到的,自行测试,如遇卡死电脑控制台直接重新运行项目即可解决!*/
-		let that = this;
-		that.openListen();
-		let main = plus.android.runtimeMainActivity();
-		if (needStopSystem) {
-			main.startLockTask()//阻止系统home建和近期任务键
-			plus.key.addEventListener("backbutton", function () {
-				// main.stopLockTask()//按返回键恢复
-				// main.unregisterReceiver(receiver); //同时停止接收home和recent点击
-			});
-		} else {
-			plus.globalEvent.addEventListener('resume', function (e) {
-				that.openListen();//应用切换到前台时需要重新开启监听
-				main.startLockTask()//阻止系统home建和近期任务键
-			});
-			plus.key.addEventListener("backbutton", function () {
-				// main.unregisterReceiver(receiver); //同时停止监听home和recent
-			});
-		}
-	},
-	openListen: function () {//注册监听
-		let that = this;
-		try {
-			let main = plus.android.runtimeMainActivity();
-			Intent = plus.android.importClass('android.content.Intent');
-			let IntentFilter = plus.android.importClass('android.content.IntentFilter');
-			var filter = new IntentFilter();
-			filter.addAction(Intent.ACTION_SCREEN_ON);
-			filter.addAction(Intent.ACTION_SCREEN_OFF);
-			filter.addAction(Intent.ACTION_USER_PRESENT);
-			filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
-			filter.addAction(Intent.GLOBAL_ACTION_BACK);
-			receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
-				onReceive: function (context, intent) { //实现onReceiver回调函数  
-					let act = intent.getAction();
-					if (act == Intent.ACTION_SCREEN_ON) {
-						console.log('开屏')
-					} else if (act == Intent.ACTION_SCREEN_OFF) {
-						console.log('锁屏')
-					} else if (act == Intent.ACTION_USER_PRESENT) {
-						console.log('解锁')
-					} else if (act == Intent.ACTION_CLOSE_SYSTEM_DIALOGS) {
-						let systemReason = intent.getStringExtra(SYSTEM_REASON);
-						// console.log("关闭原因", systemReason);
-						if (systemReason != null) {
-							if (systemReason == SYSTEM_HOME_KEY) {
-								// System.out.println("按下HOME键");
-								console.log('按下HOME键')
-							} else if (systemReason == SYSTEM_RECENT_APPS) {
-								// System.out.println("按下多任务键");
-								console.log('按下多任务键')
-							}
-						}
-					} else if (act == Intent.GLOBAL_ACTION_BACK) {
-						console.log('返回')
-					}
-					// main.unregisterReceiver(receiver);
-					/*在这里取消会出现第二次监听无效,可根据不同业务要求
-					在不同时刻停止接收两个按键的广播,我的处理是在返回的时候停*/
-					// context.unregisterReceiver(receiver);
-				}
-			});
-			main.registerReceiver(receiver, filter); //注册监听  
-		} catch (e) {
-			console.error(e);
-			toast('初始化错误');
-		}
-	},
-	// 全屏函数
-	fullScreen() {
-		// Android全屏
-		if (uni.getSystemInfoSync().platform === "android") {
-			plus.android.invoke("setFullScreen", true);
-		}
-
-		// iOS全屏
-		if (uni.getSystemInfoSync().platform === "ios") {
-			// iOS无法通过API直接全屏,可以尝试隐藏所有导航栏
-			plus.navigator.hideSystemBar();
-		}
-	}
-}
-function toast(content) {
-	uni.showToast({
-		title: content,
-		icon: 'none'
-	})
-}

+ 115 - 0
unpackage/config/setting.js

@@ -0,0 +1,115 @@
+const fs = require('fs');
+
+const args = process.argv.slice(2)[0];
+const filesToModify = ['./src/manifest.json', './src/pages.json'];
+filesToModify.forEach((file) => {
+    fs.readFile(file, 'utf8', function (err, data) {
+        if (err) throw err;
+        let cleanedData = data.replace(/\/\/.*|\/\*[\s\S]*?\*\//g, '');// 使用正则表达式去除单行注释
+        let state = JSON.parse(cleanedData);// 解析JSON数据
+
+        if (file == './src/manifest.json') {
+            if (args === 'zhiHuiYun') {
+                state.name = '综合智慧云'
+                state.appid = '__UNI__36DE3A0'
+                state.description = '综合智慧云APP,是一款助力于企业数字化的应用平台,帮助企业提升办公效率,实现组织数字化和业务数字化。'
+                state.versionName = "2.1.9"
+                state.versionCode = 19
+                state.h5.title = '综合智慧云'
+            } else if (args === 'xunJian') {
+                state.name = '智能巡更'
+                state.appid = '__UNI__BF1A1F0'
+                state.description = '智能巡更app,是一款用于监督和记录巡逻人员按照预定路线和时间进行巡逻的系统。'
+                state.versionName = "2.2.0"
+                state.versionCode = 20
+                state.h5.title = '智能巡更'
+            } else if (args === 'huiYi') {
+                state.name = '智能会议'
+                state.appid = '__UNI__F3963F8'
+                state.description = '智能会议APP,是一款集成了现代信息技术和智能化管理功能的移动应用程序,旨在提升会议体验和管理效率。'
+                state.versionName = "2.0.1"
+                state.versionCode = 1
+                state.h5.title = '智能会议'
+            }
+        } else if ('./src/pages.json') {
+            state.pages = [
+                {
+                    "path": "pages/index",
+                    "style": {
+                        "navigationStyle": "custom",
+                        "navigationBarTitleText": "工作台",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "pages/login",
+                    "style": {
+                        "navigationBarTitleText": "登录",
+                        "navigationStyle": "custom",
+                        "navigationBarTextStyle": "black"
+                    }
+                },
+                {
+                    "path": "pages/register",
+                    "style": {
+                        "navigationBarTitleText": "注册",
+                        "navigationStyle": "custom",
+                        "navigationBarTextStyle": "black"
+                    }
+                },
+                {
+                    "path": "pages/serveConfigSelect",
+                    "style": {
+                        "navigationBarTitleText": "服务器配置",
+                        "navigationStyle": "custom",
+                        "navigationBarTextStyle": "black"
+                    }
+                },
+                {
+                    "path": "pages/serveConfig",
+                    "style": {
+                        "navigationBarTitleText": "服务器配置",
+                        "navigationStyle": "custom",
+                        "navigationBarTextStyle": "black"
+                    }
+                },
+                {
+                    "path": "pages/info",
+                    "style": {
+                        "navigationBarTitleText": "消息",
+                        "navigationStyle": "custom",
+                        "enablePullDownRefresh": false,
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
+                {
+                    "path": "pages/mine",
+                    "style": {
+                        "navigationBarTitleText": "我的",
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                }
+            ]
+        }
+
+        // 将修改后的对象转换回JSON字符串
+        const updated = JSON.stringify(state, null, 4);
+
+        // 写入新的配置到manifest.json
+        fs.writeFile(file, updated, 'utf8', function (err) {
+            if (err) throw err;
+            console.log(file + ' updated successfully');
+        });
+    });
+})
+

Some files were not shown because too many files changed in this diff