12 Комити 986f16450b ... 632fffe188

Аутор SHA1 Порука Датум
  fanghuisheng 632fffe188 门禁配置管理功能优化 пре 1 месец
  gez 7244e567cf Merge branch 'wangtao-daily' of uskycloud/usky-web-mobile into master пре 2 месеци
  wangtao d93d27901e 查看个人所有日报参数调整 пре 2 месеци
  gez 9694a04224 Merge branch 'wangtao-daily' of uskycloud/usky-web-mobile into master пре 2 месеци
  wangtao ca15ff38d3 添加查看个人所有日报功能 пре 2 месеци
  gez eed57d1eac Merge branch 'wangtao-daily' of uskycloud/usky-web-mobile into master пре 2 месеци
  wangtao c0ab9ba5db 日报填写抄送人兼容性修复 пре 2 месеци
  wangtao 23242305b6 1.综合智慧云app退出优化 2.通知公告详情文件类型图片标签调整 пре 2 месеци
  wangtao 5b2b330f7d 通知公告详情调整 пре 2 месеци
  wangtao 1478a6c247 Merge branch 'master' of http://47.111.81.118:3000/uskycloud/usky-web-mobile into wangtao-daily пре 2 месеци
  gez 9f71d8436c Merge branch 'fanghuisheng' of uskycloud/usky-web-mobile into master пре 2 месеци
  wangtao 7ecce51f95 通知公告添加富文本显示 пре 2 месеци
35 измењених фајлова са 1107 додато и 125 уклоњено
  1. 6 0
      src/api/common/message.js
  2. 12 1
      src/api/mine/info.js
  3. 36 0
      src/pages.json
  4. 12 4
      src/pages/business/common/projectMange/mall/components/mall-list.vue
  5. 3 3
      src/pages/business/common/projectMange/mall/index.vue
  6. 122 52
      src/pages/business/common/projectMange/record/details.vue
  7. 332 0
      src/pages/business/common/projectMange/record/detailsAll.vue
  8. 6 15
      src/pages/business/common/projectMange/record/index.vue
  9. 2 2
      src/pages/business/door/list/index.vue
  10. 46 9
      src/pages/business/door/list/setting.vue
  11. 0 1
      src/pages/business/oa/approval/index.vue
  12. 1 1
      src/pages/common/appMessage/details.vue
  13. 63 18
      src/pages/common/appMessage/index.vue
  14. 118 0
      src/pages/common/appMessage/nociteDetails.vue
  15. 188 0
      src/pages/common/authentication/index.vue
  16. 0 3
      src/pages/login.vue
  17. 5 0
      src/pages/mine/secure/index.vue
  18. 11 3
      src/static/iconfont/iconfont.css
  19. BIN
      src/static/iconfont/iconfont.ttf
  20. BIN
      src/static/images/door/ai.png
  21. BIN
      src/static/images/door/bg.png
  22. BIN
      src/static/images/door/setting_bindFace.png
  23. BIN
      src/static/images/door/setting_imgPath.png
  24. BIN
      src/static/images/door/setting_password.png
  25. BIN
      src/static/images/door/setting_record.png
  26. BIN
      src/static/images/door/setting_remark.png
  27. 19 0
      src/static/images/system/doc.svg
  28. 19 0
      src/static/images/system/docx.svg
  29. 18 0
      src/static/images/system/pdf.svg
  30. 18 0
      src/static/images/system/ppt.svg
  31. 19 0
      src/static/images/system/pptx.svg
  32. 15 0
      src/static/images/system/xls.svg
  33. 16 0
      src/static/images/system/xlsx.svg
  34. 16 0
      src/static/images/system/zip.svg
  35. 4 13
      src/store/modules/setting.js

+ 6 - 0
src/api/common/message.js

@@ -7,4 +7,10 @@ export function infoList(param) {
         method: "GET",
         data: param,
     });
+}
+export function infoOne(id) {
+    return request({
+        url: "/system/notice/" + id,
+        method: "GET",
+    });
 }

+ 12 - 1
src/api/mine/info.js

@@ -74,4 +74,15 @@ export function addMceSetting(data) {
     method: 'post',
     data
   })
-}
+}
+
+/**
+ * @消息设置接口
+ * @删除
+ */
+export function mceDelete(id) {
+  return request({
+      url: '/system/mceReceive/'  + id,
+      method: 'delete'
+  })
+}

+ 36 - 0
src/pages.json

@@ -158,6 +158,18 @@
                         }
                     }
                 },
+                {
+                    "path": "appMessage/nociteDetails",
+                    "style": {
+                        "navigationBarTitleText": "消息详情",
+                        "navigationStyle": "custom",
+                        "enablePullDownRefresh": false,
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
                 {
                     "path": "alarmMessage/index",
                     "style": {
@@ -200,6 +212,18 @@
                             "titleNView": false
                         }
                     }
+                },
+                {
+                    "path": "authentication/index",
+                    "style": {
+                        "navigationBarTitleText": "",
+                        "navigationStyle": "custom",
+                        "enablePullDownRefresh": false,
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
                 }
             ]
         },
@@ -816,6 +840,18 @@
                         }
                     }
                 },
+                {
+                    "path": "projectMange/record/detailsAll",
+                    "style": {
+                        "navigationBarTitleText": "报告详情",
+                        "enablePullDownRefresh": false,
+                        "navigationStyle": "custom",
+                        "app-plus": {
+                            "bounce": "none",
+                            "titleNView": false
+                        }
+                    }
+                },
                 {
                     "path": "projectMange/overview/index",
                     "style": {

+ 12 - 4
src/pages/business/common/projectMange/mall/components/mall-list.vue

@@ -1,5 +1,4 @@
 <template>
-  <view>
     <view class="box-head"><uni-mall-head ref="refUniMallHead" @change="tabChange"></uni-mall-head></view>
     <view class="box-list">
       <u-checkbox-group v-model="checkboxList" placement="column" :activeColor="$settingStore.themeColor.color" @change="checkboxChange">
@@ -55,7 +54,6 @@
         </u-button>
       </view>
     </view>
-  </view>
 </template>
 
 <script>
@@ -198,6 +196,10 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+.boxWrap{
+  position: relative;
+  height:100%;
+}
 .box-head {
   position: fixed;
   left: 0px;
@@ -210,10 +212,16 @@ export default {
   z-index: 999;
 }
 .box-list {
+  position: absolute;
+  width:100%;
+  z-index: 0;
   padding-top: 52px;
   //#ifdef APP-PLUS || MP-WEIXIN
   padding-bottom: 60px;
   //#endif
+  //#ifdef H5
+  padding-bottom: 60px;
+  //#endif
   .box-list-item {
     position: relative;
     height: 60px;
@@ -292,6 +300,7 @@ export default {
       }
     }
   }
+
   .box-list-item-department + .box-list-item-user {
     margin-top: 10px;
   }
@@ -300,14 +309,13 @@ export default {
 .box-foot {
   position: fixed;
   bottom: 0px;
+  z-index: 1;
   width: 100%;
   height: 60px;
   background: #ffffff;
-  z-index: 999;
   box-shadow: 1px 1px 4px rgb(26 26 26 / 10%);
   display: flex;
   padding: 0 15px;
-
   &-left {
     margin: auto auto auto 0;
 

+ 3 - 3
src/pages/business/common/projectMange/mall/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <u-sticky class="shadow-default" bgColor="#fff" style="top: 0">
+  <u-sticky class="shadow-default" bgColor="#fff" style="top: 0;position: fixed;z-index: 9">
     <u-navbar :titleStyle="{ color: '#000' }" :autoBack="true" :title="pageTitle" :placeholder="true" :safeAreaInsetTop="true" bgColor="#fff">
       <template #left>
         <view class="u-navbar__content__left__item">
@@ -15,14 +15,14 @@
   </u-sticky>
 
   <oa-scroll
-    customClass="record-container scroll-height"
+    customClass="record-container"
     :isSticky="false"
     :customStyle="{
       //#ifdef APP-PLUS || MP-WEIXIN
       height: `calc(100vh - (44px + 48px + 60px + ${proxy.$settingStore.StatusBarHeight}))`,
       //#endif
       //#ifdef H5
-      height: 'calc(100vh - (0px + 48px + 60px))',
+      height: 'calc(100vh - 0px )',
       //#endif
     }"
     :refresherLoad="false"

+ 122 - 52
src/pages/business/common/projectMange/record/details.vue

@@ -1,5 +1,5 @@
 <template>
-  <u-navbar  :titleStyle="{ color: '#000' }" :autoBack="true" title="日报详情" :placeholder="true" :safeAreaInsetTop="true" bgColor="#fff">
+  <u-navbar  :titleStyle="{ color: '#000' }" :autoBack="false" title="日报详情" :placeholder="true" :safeAreaInsetTop="true" bgColor="#fff">
     <template #left>
       <view class="u-navbar__content__left__item">
         <u-icon name="arrow-left" size="20" color="#000" @click="returnTo('business/common/projectMange/record/index')"></u-icon>
@@ -32,6 +32,10 @@
   >
     <template #default>
       <view class="content-area radius bg-white" v-for="(item, index) in dataList" :key="index" style="margin-top: 6px">
+        <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(item)"></u-icon>
+        </view>
         <view class="content-area-header flex mb10">
           <img :src="item?.avatar" class="content-area-header-avatarImg mr10" v-if="item?.avatar" />
           <u-avatar
@@ -68,7 +72,7 @@
         <view class="content-area-center mb10">
           <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)" />
+            <image class="image m5" style="width: 50px" mode="widthFix" v-for="(a, index2) in JSON.parse(item.reportImage)" :key="index2" :src="a.url" @click="previewImage(index,index)" />
           </view>
           <view class="imageBox" v-else>无</view>
         </view>
@@ -76,39 +80,77 @@
         <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>
+            <uni-link v-for="(file, index2) in JSON.parse(item.reportFile)" :key="index2" :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">
+        <view class="content-area-center mb10" style="display: flex; flex-wrap: wrap" v-if="item.pmReportReaders.read > 0 || item.pmReportReaders.unRead > 0">
           <u-tabs
-            :list="tabsList"
-            :current="tabsCurrent"
-            @click="tabsClick"
+            :list="item.tabsList"
+            :current="item.tab"
+            @click="tabsClick(index, $event.value)"
             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" />
+          <view class="content-area-header mt20 mb10 text-center" style="display: inline-block" v-for="(item2, index2) in item.tabsList[item.tab].treeSelectNodes" :key="index2">
+            <img v-if="item2?.avatar" class="content-area-header-avatarImg mlr5" :src="item2.avatar" style="display: block; width: 40px; height: 40px" />
             <u-avatar
-              v-if="!item.avatar"
+              v-if="!item2.avatar"
               class="content-area-header-avatar mlr5"
-              :text="item.nickName.length > 2 ? item.nickName.slice(1, 3) : item.nickName"
+              :text="item2.nickName.length > 2 ? item2.nickName.slice(1, 3) : item2.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>
+            <u-text :text="item2.nickName" color="#000000" size="14" align="center"></u-text>
           </view>
         </view>
       </view>
     </template>
+
   </oa-scroll>
+  <u-popup :show="popup.show" mode="bottom" bgColor="#fff" :round="10" @close="popup.show = false">
+    <view
+      :style="{
+        borderTopLeftRadius: '10px',
+        borderTopRightRadius: '10px',
+        overflow: 'hidden',
+      }"
+    >
+      <u-button
+        class="custom-style"
+        type="info"
+        size="normal"
+        :text="`查看${eventList.createBy}的所有日报`"
+        :customStyle="{
+          height: '50px',
+          color: '#3c9cff',
+          borderWidth: 0,
+          borderRadius: 0,
+          borderBottomWidth: '1px',
+        }"
+        @click="handleSubmit(eventList)"
+      ></u-button>
+      <u-button
+        class="custom-style"
+        type="info"
+        size="normal"
+        text="取消"
+        :customStyle="{
+          height: '50px',
+          color: '#3c9cff',
+          border: 'none',
+          borderRadius: 0,
+        }"
+        @click="popup.show = false"
+      ></u-button>
+    </view>
+  </u-popup>
 </template>
 
 <script setup>
@@ -140,19 +182,17 @@ const state = reactive({
     reportId: "",
   },
   userData: [], //用户列表
-  images: [], //图片列表
-  files: [], //附件列表
-  tabsList: [
-    { name: "已读", value: 0 },
-    { name: "未读", value: 1 },
-  ],
-  tabsCurrent: 0,
   pageSize:1,
   total:10,
   submitDate:undefined,
+  popup: {
+    show: false, //弹窗显示
+    content: "", //提示信息
+  },
+  eventList: {}, //数据存储
 });
 
-const { dataList, userData, tabsList, tabsCurrent, pageSize, total } = toRefs(state);
+const { dataList, userData, tabsList, tabsCurrent, pageSize, total, popup, eventList } = toRefs(state);
   /**
  * 返回上级页面
  * @param defaultPage 默认页面
@@ -169,14 +209,13 @@ const { dataList, userData, tabsList, tabsCurrent, pageSize, total } = toRefs(st
 /**
  * @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 tabsClick(index,e) {
+  dataList.value[index].tab = e
 }
-function previewImage(index) {
+function previewImage(index1,index2) {
   uni.previewImage({
-    current: index, // 当前显示图片索引
-    urls: state.images, // 需要预览的图片http链接列表
+    current: index2, // 当前显示图片索引
+    urls: dataList.value[index1].images[index2], // 需要预览的图片http链接列表
   });
 }
 
@@ -196,28 +235,53 @@ function init() {
         pageSize: 1,
       })
       .then((requset) => {
-        dataList.value = requset.data.records;
-        state.submitDate = requset.data.records[0].submitDate;
+        dataRebuild(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);
-        });
-        load()
-      })
-      .catch((err) => {
+      }).catch((err) => {
         state.loading = false;
       });
   });
 }
+/**
+ * 
+ * @param item 数据重组
+*/
+function dataRebuild(item,type){
+  for(let i=0;i<item.length;i++){
+    item[i].tabsList = [
+      { name: "已读(" + item[i].pmReportReaders.read + ")", value: 0, 
+      treeSelectNodes:proxy.$common.findTreeNodes(tree.value, item[i].pmReportReaders.readAlready),num:item[i].pmReportReaders.read},
+      { name: "未读(" + item[i].pmReportReaders.unRead + ")", value: 1, 
+      treeSelectNodes:proxy.$common.findTreeNodes(tree.value,item[i].pmReportReaders.readNotAlready),num:item[i].pmReportReaders.read},
+    ];
+    item[i].tab = 0
+    var imgs = JSON.parse(item[i].reportImage);
+    var files = JSON.parse(item[i].reportFile);
+    imgs.forEach(function (val) {
+      item[i].images.push(val.url);
+    });
+    files.forEach(function (val) {
+      item[i].files.push(val.url);
+    });
+    //数据插入
+    if(type == "refresh"){
+      dataList.value.unshift(item[i])
+    }else{
+      dataList.value.push(item[i])
+    }
+    // 未读状态变更
+    if(item[i].readFlag == "0"){
+      projectApi()
+      .ReportRecordReadFlag({ reportId: item[i].id })
+      .then((res) => {
+        if (res.status != "SUCCESS") {
+          proxy.$modal.msgError("读取异常");
+        }
+      });
+    }
+  }
+  
+}
 /**
  * 跳转项目概览
  * @param id 项目id
@@ -229,7 +293,6 @@ function toProjectMange(id) {
  * @scrollView加载数据
  */
  function load() {
-  console.log(1111)
   projectApi().ReportRecord(
     {
       upOrDown:0,
@@ -238,7 +301,9 @@ function toProjectMange(id) {
       projectAscription:2
     }
   ).then((requset) => {
-    dataList.value.push(requset.data.records[0])
+    if(requset?.data?.records.length>0){
+      dataRebuild(requset.data.records,"load");
+    }
   })
 }
 /**
@@ -253,11 +318,21 @@ function toProjectMange(id) {
       projectAscription:2
     }
   ).then((requset) => {
-    if(requset.data.records.length>0){
-      dataList.value.unshift(requset.data.records[0]);
+    if(requset?.data?.records.length>0){
+      dataRebuild(requset.data.records,"refresh");
     }
   })
 }
+/** 更多按钮点击事件 */
+function moreClick(event) {
+  state.popup.show = true;
+  state.eventList = event;
+}
+/** 编辑、删除日报*/
+function handleSubmit(e) {
+  state.popup.show = false;
+  proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/detailsAll?reportId=${e.id}`);
+}
 onReady(() => {});
 
 onShow(() => {
@@ -313,9 +388,4 @@ onUnload(() => {
     }
   }
 }
-// .uni-scroll-view-content .content-area:nth-child(3){
-//   height:96px;
-//   overflow: hidden;
-//   background-image: linear-gradient(to top, #f3f2f2 30%, #fff 100%);
-// }
 </style>

+ 332 - 0
src/pages/business/common/projectMange/record/detailsAll.vue

@@ -0,0 +1,332 @@
+<template>
+  <u-navbar  :titleStyle="{ color: '#000' }" :autoBack="true" title="日报详情" :placeholder="true" :safeAreaInsetTop="true" bgColor="#fff">
+    <template #left>
+      <view class="u-navbar__content__left__item">
+        <u-icon name="arrow-left" size="20" color="#000" @click="returnTo('business/common/projectMange/record/index')"></u-icon>
+      </view>
+    </template>
+  </u-navbar>
+
+  <oa-scroll
+    customClass="record-container scroll-height"
+    :pageSize="pageSize"
+    :total="total"
+    :isSticky="true"
+    :customStyle="{
+      //#ifdef APP-PLUS || MP-WEIXIN
+      height: `calc(100vh - 44px)`,
+      //#endif
+      //#ifdef H5
+      height: `calc(100vh - 44px)`,
+      //#endif
+    }"
+    :refresherLoad="true"
+    :refresherEnabled="true"
+    :refresherDefaultStyle="'none'"
+    :refresherThreshold="44"
+    :lowerThreshold="44"
+    :refresherBackground="'#f5f6f7'"
+    @load="load"
+    @refresh="refresh"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+  >
+    <template #default>
+      <view class="content-area radius bg-white" v-for="(item, index) in dataList" :key="index" style="margin-top: 6px">
+        <view class="content-area-header flex mb10">
+          <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"
+            :text="item.createBy.length > 2 ? item.createBy.slice(1, 3) : item.createBy"
+            shape="square"
+            size="40"
+            fontSize="12" 
+            color="#ffffff"
+            :bgColor="proxy.$settingStore.themeColor.color"
+          ></u-avatar>
+          <view>
+            <view class="content-area-header-title font16 mb5">{{ item.createBy ? item.createBy : " " }} {{ item.submitDate.slice(0, 10) != item.reportDate ? "( " + item.reportDate + " )" : "" }}</view>
+            <view class="content-area-header-time font14">{{ item.submitDate ? item.submitDate.replace("T", " ") : " " }}</view>
+          </view>
+        </view>
+
+        <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-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 ? 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 ? item.coordinateWork : '无'" color="#000000" size="14"></u-text>
+        </view>
+        <view class="content-area-center mb10">
+          <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, index2) in JSON.parse(item.reportImage)" :key="index2" :src="a.url" @click="previewImage(index,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, index2) in JSON.parse(item.reportFile)" :key="index2" :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" v-if="item.pmReportReaders.read > 0 || item.pmReportReaders.unRead > 0">
+          <u-tabs
+            :list="item.tabsList"
+            :current="item.tab"
+            @click="tabsClick(index, $event.value)"
+            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="(item2, index2) in item.tabsList[item.tab].treeSelectNodes" :key="index2">
+            <img v-if="item2?.avatar" class="content-area-header-avatarImg mlr5" :src="item2.avatar" style="display: block; width: 40px; height: 40px" />
+            <u-avatar
+              v-if="!item2.avatar"
+              class="content-area-header-avatar mlr5"
+              :text="item2.nickName.length > 2 ? item2.nickName.slice(1, 3) : item2.nickName"
+              shape="square"
+              size="40"
+              fontSize="12"
+              color="#ffffff"
+              :bgColor="proxy.$settingStore.themeColor.color"
+            ></u-avatar>
+            <u-text :text="item2.nickName" color="#000000" size="14" align="center"></u-text>
+          </view>
+        </view>
+      </view>
+    </template>
+
+  </oa-scroll>
+</template>
+
+<script setup>
+/*----------------------------------依赖引入-----------------------------------*/
+import { onLoad, onShow, onReady, onHide, onLaunch, onBackPress, onUnload, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+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: {
+    //日报详情参数
+    reportId: "",
+  },
+  userData: [], //用户列表
+  pageSize:1,
+  pageNum:0,
+  total:10,
+  submitDate:undefined,
+});
+
+const { dataList, userData, tabsList, tabsCurrent, pageSize, pageNum, total, } = toRefs(state);
+  /**
+ * 返回上级页面
+ * @param defaultPage 默认页面
+ */
+ function returnTo(defaultPage) {
+    if(getCurrentPages().length > 1){
+      uni.navigateBack()
+    }else{
+      uni.redirectTo({
+        url: `/pages/${defaultPage}`
+      })
+    }
+  }
+/**
+ * @tabs点击事件
+ */
+function tabsClick(index,e) {
+  dataList.value[index].tab = e
+}
+function previewImage(index1,index2) {
+  uni.previewImage({
+    current: index2, // 当前显示图片索引
+    urls: dataList.value[index1].images[index2], // 需要预览的图片http链接列表
+  });
+}
+
+/**
+ * @初始化
+ */
+function init() {
+  dataList.value = [];
+  state.loading = true;
+  /** 查询树结构用户列表  回显抄送人*/
+  deptUserTreeSelect({ pageNum: "1", pageSize: "1000" }).then((res) => {
+    tree.value = res.data;
+    projectApi()
+      .ReportRecord({
+        // pageNum: ++ pageNum.value ,
+        // pageSize: 1,
+        // projectAscription:2,
+        // submitterId:state.options.submitterId,
+        reportId:state.options.reportId,
+        pageNum: 1,
+        pageSize: 1,
+      })
+      .then((requset) => {
+        dataRebuild(requset.data.records);
+        state.loading = false;
+      }).catch((err) => {
+        state.loading = false;
+      });
+  });
+}
+/**
+ * 
+ * @param item 数据重组
+*/
+function dataRebuild(item,type){
+  for(let i=0;i<item.length;i++){
+    item[i].tabsList = [
+      { name: "已读(" + item[i].pmReportReaders.read + ")", value: 0, 
+      treeSelectNodes:proxy.$common.findTreeNodes(tree.value, item[i].pmReportReaders.readAlready),num:item[i].pmReportReaders.read},
+      { name: "未读(" + item[i].pmReportReaders.unRead + ")", value: 1, 
+      treeSelectNodes:proxy.$common.findTreeNodes(tree.value,item[i].pmReportReaders.readNotAlready),num:item[i].pmReportReaders.read},
+    ];
+    item[i].tab = 0
+    var imgs = JSON.parse(item[i].reportImage);
+    var files = JSON.parse(item[i].reportFile);
+    imgs.forEach(function (val) {
+      item[i].images.push(val.url);
+    });
+    files.forEach(function (val) {
+      item[i].files.push(val.url);
+    });
+    //数据插入
+    if(type == "refresh"){
+      dataList.value.unshift(item[i])
+    }else{
+      dataList.value.push(item[i])
+    }
+    // 未读状态变更
+    if(item[i].readFlag == "0"){
+      projectApi()
+      .ReportRecordReadFlag({ reportId: item[i].id })
+      .then((res) => {
+        if (res.status != "SUCCESS") {
+          proxy.$modal.msgError("读取异常");
+        }
+      });
+    }
+  }
+  
+}
+/**
+ * 跳转项目概览
+ * @param id 项目id
+ */
+function toProjectMange(id) {
+  proxy.$tab.navigateTo(`/pages/business/common/projectMange/overview/index?id=${id}`);
+}
+/**
+ * @scrollView加载数据
+ */
+ function load() {
+  projectApi().ReportRecord(
+    {
+      upOrDown:0,
+      slideSum:1,
+      submitDate:dataList.value[dataList.value.length-1].submitDate,
+      projectAscription:2,
+      submitterId:dataList.value[0].submitterId,
+    }
+  ).then((requset) => {
+    if(requset?.data?.records.length>0){
+      dataRebuild(requset.data.records,"load");
+    }
+  })
+}
+/**
+ * @scrollView刷新数据
+ */
+ function refresh() {
+  projectApi().ReportRecord(
+    {
+      upOrDown:1,
+      slideSum:1,
+      submitDate:dataList.value[0].submitDate,
+      projectAscription:2,
+      submitterId:dataList.value[0].submitterId,
+    }
+  ).then((requset) => {
+    if(requset?.data?.records.length>0){
+      dataRebuild(requset.data.records,"refresh");
+    }
+  })
+}
+
+onReady(() => {});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+
+onLoad((options) => {
+  state.options.reportId = options?.reportId;
+  init();
+});
+</script>
+
+<style lang="scss" scoped>
+.content-area {
+  margin: 0;
+  padding: 15px 20px;
+  overflow: hidden;
+
+  &-header {
+    &-avatar {
+      margin: auto 0;
+    }
+    &-avatarImg {
+      width: 35px;
+      height: 35px;
+      border-radius: 4px;
+    }
+
+    &-title {
+      margin: 0 0 15px 0;
+      font-weight: 600;
+      color: #000000;
+    }
+  }
+
+  &-center {
+    line-height: 25px;
+    &-top {
+      color: #000000;
+      font-weight: 600;
+    }
+  }
+}
+</style>

+ 6 - 15
src/pages/business/common/projectMange/record/index.vue

@@ -118,6 +118,7 @@
         @click="handleSubmit('update', eventList)"
       ></u-button>
       <u-button
+        v-if="state.tabsCurrent == 1"
         class="custom-style"
         type="info"
         size="normal"
@@ -158,7 +159,7 @@
           borderRadius: 0,
           borderBottomWidth: '1px',
         }"
-        @click="handleSubmit('update', eventList)"
+        @click="handleSubmit('all', eventList)"
       ></u-button>
       <u-button
         class="custom-style"
@@ -330,19 +331,7 @@ function init() {
  * @跳转详情
  */
 function goContentDetails(e) {
-  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}`);
-  }
+  proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/details?reportId=${e.id}`);
 }
 
 /**
@@ -435,8 +424,10 @@ function handleSubmit(type, item) {
       .catch((errors) => {
         proxy.$modal.msg(errors);
       });
+  }else if (type === "all") {
+    proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/detailsAll?reportId=${item.id}`);
+    state.modal.show = false;
   }
-  state.modalShow = false;
 }
 
 onReady(() => {});

+ 2 - 2
src/pages/business/door/list/index.vue

@@ -36,7 +36,7 @@
       <u-loading-page :loading="state.loading" fontSize="16" style="z-index: 99"></u-loading-page>
 
       <u-grid class="p10" :border="true" :col="2" gap="10px">
-        <u-grid-item class="p10 radius" bgColor="#FFF" v-for="(item, index) in dataList" :key="index" @click="doorSetting(item)">
+        <u-grid-item class="p10 radius" bgColor="#fff" v-for="(item, index) in dataList" :key="index" @click="doorSetting(item)">
           <view
             :style="{
               fontSize: '14px',
@@ -54,7 +54,7 @@
             }"
           >
             <image style="width: 40px; height: 40px" :src="'/static/images/door/lock.png'" mode="aspectFill"></image>
-            <view class="iconfont oaIcon-open_door ml-auto mtb-auto font30" @click.stop="controlStore.openDoor(item, true)"></view>
+            <view class="iconfont oaIcon-open_door ml-auto mtb-auto font35" @click.stop="controlStore.openDoor(item, true)"></view>
           </view>
         </u-grid-item>
       </u-grid>

+ 46 - 9
src/pages/business/door/list/setting.vue

@@ -39,7 +39,9 @@
         <view class="center-area-seting">
           <view class="center-area-seting_title">会客模式</view>
           <view class="center-area-seting_center">
-            <u-subsection :list="subsection.list" :current="subsection.current" mode="subsection" @change="subsectionChange"></u-subsection>
+            <view class="center-area-seting_center_itemSub" :class="[{ active: list.value == modal.form.workStatus }]" v-for="list in subsection.list" :key="list" @click="subsectionChange(list)">
+              {{ list.label }}
+            </view>
           </view>
         </view>
 
@@ -47,6 +49,7 @@
           <view class="center-area-seting_title">门禁配置</view>
           <view class="center-area-seting_center">
             <view class="center-area-seting_center_item" v-for="(baseListItem, baseListIndex) in baseList" :key="baseListIndex" v-show="baseListItem.status" @click="handle(baseListItem)">
+              <image class="center-area-seting_center_item_image" :src="baseListItem.imgPath" style="width: 25px; height: 25px"></image>
               <view class="center-area-seting_center_item_title">{{ baseListItem.title }}</view>
               <view class="center-area-seting_center_item_subTitle">{{ baseListItem.subTitle }}</view>
             </view>
@@ -71,7 +74,7 @@
     <view class="slot-content">
       <view class="remark" style="" v-if="modal.type == '标识语'">
         <u-textarea v-model="modal.form.remark" placeholder="请输入标识语" border="none" maxlength="200" style="padding: 0px" autoHeight></u-textarea>
-        <view class="remark_changeIt" @click="changeIt()">换一换</view>
+        <image class="remark_changeIt" src="@/static/images/door/ai.png" style="width: 25px; height: 25px" @click="changeIt()"></image>
       </view>
 
       <view class="imgPath" v-if="modal.type == '屏保'">
@@ -115,6 +118,7 @@ const state = reactive({
       subTitle: "标识语/标语",
       status: true,
       type: "remark",
+      imgPath: "/static/images/door/setting_remark.png",
     },
     {
       name: "star",
@@ -122,6 +126,7 @@ const state = reactive({
       subTitle: "屏保/主题互动",
       status: true,
       type: "imgPath",
+      imgPath: "/static/images/door/setting_imgPath.png",
     },
     {
       name: "photo",
@@ -129,13 +134,18 @@ const state = reactive({
       subTitle: "通行记录/人员通行记录",
       status: true,
       type: "record",
+      imgPath: "/static/images/door/setting_record.png",
     },
   ],
 
   subsection: {
-    list: ["办公", "会客", "外出", "勿扰"],
-    current: 0,
-    value: "",
+    list: [
+      { label: "办公", value: 1 },
+      { label: "会客", value: 2 },
+      { label: "外出", value: 3 },
+      { label: "勿扰", value: 4 },
+    ],
+    value: 1,
   },
   modal: {
     show: false,
@@ -146,14 +156,16 @@ const state = reactive({
       remark: "",
       password: "",
       openMode: "",
+      workStatus: 1,
     },
   },
 });
 const { pageTitle, deviceUuid, baseList, subsection, modal } = toRefs(state);
 
 function subsectionChange(e) {
-  state.subsection.current = e;
-  state.subsection.value = state.subsection.list[e];
+  state.subsection.value = e.value;
+  state.modal.form.workStatus = e.value;
+  modalConfirm();
 }
 
 /** 操作按钮事件 */
@@ -185,15 +197,16 @@ function modalConfirm() {
 
 /** 换一换 */
 function changeIt() {
+  proxy.$modal.loading("加载中");
   aiApi()
     .changeIt({
       content: state.pageTitle + "每天一语简洁",
     })
     .then((response) => {
-      console.log(response);
       const data = response.data;
       state.modal.form.remark = "";
       state.modal.form.remark = data.reasoningContent;
+      proxy.$modal.closeLoading();
     });
 }
 
@@ -235,6 +248,7 @@ onLoad((options) => {
         state.modal.form.openMode = records.openMode;
         state.modal.form.remark = records.remark;
         state.modal.form.password = records.password;
+        state.modal.form.workStatus = records.workStatus ? records.workStatus : 1;
 
         state.deviceUuid = records.deviceUuid;
       })
@@ -255,6 +269,9 @@ onUnload(() => {});
       height: 180px;
       border-radius: 50%;
       margin: 50px auto;
+      box-shadow: 0px 0px 10px rgba(60, 156, 255, 1.1);
+      // background: url("@/static/images/door/bg.png") no-repeat;
+      // background-size: 100% 100%;
 
       &_icon {
         justify-content: center;
@@ -282,6 +299,25 @@ onUnload(() => {});
         display: flex;
         flex-wrap: wrap;
 
+        &_itemSub {
+          width: calc(25% - 10px);
+          padding: 10px;
+          text-align: center;
+          border-radius: 40px;
+          box-shadow: 0px 0px 10px rgba(60, 156, 255, 0.1);
+          background-color: #f2f6ff;
+        }
+
+        &_itemSub:nth-child(2),
+        &_itemSub:nth-child(3) {
+          margin: 0 10px;
+        }
+
+        .active {
+          background-color: #3c9cff;
+          color: #fff;
+        }
+
         &_item {
           width: calc(50% - 10px);
           padding: 15px;
@@ -325,7 +361,8 @@ onUnload(() => {});
 
         &_changeIt {
           position: absolute;
-          right: 0;
+          right: -18px;
+          bottom: -18px;
           z-index: 5;
           color: #2979ff;
         }

+ 0 - 1
src/pages/business/oa/approval/index.vue

@@ -137,7 +137,6 @@
       state.formList = res.data;
       for(let i=0;i<state.formList.length;i++){
         state.formList[i].icon = prefix + `images/oa/${state.formList[i].formImage}.png`
-        console.log(state.formList[i].icon)
       }
       state.appContent[0].array = state.formList
     })

+ 1 - 1
src/pages/common/appMessage/details.vue

@@ -9,7 +9,7 @@
 
   <view>
     <uni-card class="view-title" :title="data?.infoTitle || ''">
-      <view class="uni-body view-content">{{ data?.infoContent || "" }}</view>
+      <rich-text :nodes="data?.infoContent || ''" class="uni-body view-content"></rich-text>
       <text class="uni-body view-time">{{ data?.createTime ? data.createTime.replace("T", " ") : "" }}</text>
     </uni-card>
   </view>

+ 63 - 18
src/pages/common/appMessage/index.vue

@@ -34,12 +34,21 @@
           v-show="noticeList.length > 0"
           @click="goContentDetails(el)"
         >
-          <view style="width: 100%; max-width: 100%">
-            <view class="content-area-center-title font16">{{ el.infoTitle }}</view>
-            <view class="content-area-center-cont font14">{{ el.infoContent }}</view>
-          </view>
-          <view class="content-area-center-badge"><u-badge :isDot="el.readFlag == 0 ? true : false" type="error"></u-badge></view>
-          <view class="content-area-center-time font14">{{ proxy.$time.jktTimes(el.createTime.replace("T", " ")) }}</view>
+            
+        <uni-swipe-action style="width: 100%;" ref="swipeAction">
+          <uni-swipe-action-item :right-options="notice"  @click="noticeDelete(el)">
+            <view style="display: flex; align-items: center;">
+              <view style="width: 82% !important;float:left;">
+                <view class="content-area-center-title font16">{{ el.infoTitle }}</view>
+                <rich-text :nodes="el.infoContent" class="content-area-center-cont font14"></rich-text>
+              </view>
+              <view class="sign">
+                <view class="badge"><u-badge :isDot="el.readFlag == 0 ? true : false" type="error"></u-badge></view>
+                <view class="time font14">{{ proxy.$time.jktTimes(el.createTime.replace("T", " ")) }}</view>
+              </view>
+            </view>
+          </uni-swipe-action-item>
+        </uni-swipe-action>
         </view>
       </view>
     </template>
@@ -51,7 +60,7 @@
 import { onLoad, onShow, onReady, onHide, onLaunch, onUnload, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
 import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
 /*----------------------------------接口引入-----------------------------------*/
-import { getMceList, updateMceReceiveStatus } from "@/api/mine/info.js";
+import { getMceList, updateMceReceiveStatus, mceDelete } from "@/api/mine/info.js";
 import { projectApi } from "@/api/business/project.js";
 
 /*----------------------------------组件引入-----------------------------------*/
@@ -71,9 +80,19 @@ const state = reactive({
     typeName: "",
   },
 });
-
+const notice = ref([
+  {
+    text: '删除',
+    style: {
+      backgroundColor: '#FF0000',
+    },
+    icon: 'trash', // 如果库支持图标,可以这样设置
+  },
+])
+const swipeAction = ref(null);
 const { scrollIntoView, noticeList } = toRefs(state);
 
+
 /**
  * @跳转相应类型系统
  */
@@ -95,7 +114,12 @@ function goContentDetails(e) {
       proxy.$tab.navigateTo(`/pages/business/common/projectMange/record/details?reportId=${e.moduleId}`);
     }
   } else {
-    proxy.$tab.navigateTo(`/pages/common/appMessage/details?contentId=${e.contentId}`).then(() => {});
+    //通知公告
+    if(e.infoType == 1){
+      proxy.$tab.navigateTo(`/pages/common/appMessage/nociteDetails?moduleId=${e.moduleId}`).then(() => {});
+    }else{
+      proxy.$tab.navigateTo(`/pages/common/appMessage/details?contentId=${e.contentId}`).then(() => {});
+    }
   }
 
   //是否已读
@@ -104,6 +128,18 @@ function goContentDetails(e) {
   }
 }
 
+function noticeDelete(e) {
+  mceDelete(e.contentId).then(() => {
+    for(let i=0;i<noticeList.value.length;i++){
+      if(noticeList.value[i].id == e.id){
+        swipeAction.value[i].closeAll()       
+        noticeList.value.splice(i,1);
+      }
+    }
+    proxy.$modal.msg("删除成功");
+  })
+}
+
 /**
  * @通知公告列表
  * @api接口调用
@@ -201,12 +237,11 @@ onNavigationBarButtonTap((e) => {
     font-weight: 600;
   }
 
-  &-center {
+  .content-area-center {
     margin: 0;
     padding: 15px;
     overflow: hidden;
     border-bottom: 1px solid #eaeef1;
-
     &:nth-child(2) {
       border-radius: 10px 10px 0 0;
     }
@@ -229,14 +264,24 @@ onNavigationBarButtonTap((e) => {
     &-cont {
       color: #666666;
     }
-
-    &-badge {
-      margin: auto 10px auto 0;
-    }
-
-    &-time {
-      margin: auto 0.9375rem auto 0;
+    .sign{
+      width:18%;
+      margin-right:4%;
+      text-align: right;
+      .badge {
+        margin-right:6px;
+        display: inline-block;
+      }
+      .time {
+        display: inline-block;
+      }
     }
+    
   }
 }
 </style>
+<style>
+.uni-swipe_button-text,.uni-swipe_button .button-hock{
+  font-size: 12px !important;
+}
+</style>

+ 118 - 0
src/pages/common/appMessage/nociteDetails.vue

@@ -0,0 +1,118 @@
+<template>
+  <u-navbar :titleStyle="{ color: '#fff' }" :autoBack="true" title="消息详情" :placeholder="true" :safeAreaInsetTop="true" :bgColor="proxy.$settingStore.themeColor.color">
+    <template #left>
+      <view class="u-navbar__content__left__item">
+        <u-icon name="arrow-left" size="20" color="#fff"></u-icon>
+      </view>
+    </template>
+  </u-navbar>
+  <view>
+    <view class="content">
+      <view class="view-wrap">
+        标题: <text class="weight-bold">{{ data?.noticeTitle || '' }}</text>
+      </view>
+      <view class="view-wrap">
+        作者: <text class="uni-body">{{ data?.author || '' }}</text>
+      </view>
+      <view class="view-wrap">
+        发送到: <text class="uni-body">{{ data?.deptId ? proxy.$common.mapping("deptName", "deptId", data.deptId, deptList)  : '' }}</text>
+      </view>
+      <view class="view-wrap">
+        内容: 
+        <rich-text :nodes="data?.noticeContent || ''" class="uni-body view-content"></rich-text>
+      </view>
+      <view class="view-wrap" v-if="data.fileUrl">
+          <view v-for="(item, index) in JSON.parse(data.fileUrl)" :key="index" class="fileImg">
+            <a :href="item.url" style="color: #333;">
+              <image src="/static/images/system/doc.svg" alt="" v-if="item.name.split('.').pop() == 'doc'" />
+              <image src="/static/images/system/docx.svg" alt="" v-if="item.name.split('.').pop() == 'docx'" />
+              <image src="/static/images/system/pdf.svg" alt="" v-if="item.name.split('.').pop() == 'pdf'" />
+              <image src="/static/images/system/ppt.svg" alt="" v-if="item.name.split('.').pop() == 'ppt'" />
+              <image src="/static/images/system/pptx.svg" alt="" v-if="item.name.split('.').pop() == 'pptx'" />
+              <image src="/static/images/system/xls.svg" alt="" v-if="item.name.split('.').pop() == 'xls'" />
+              <image src="/static/images/system/xlsx.svg" alt="" v-if="item.name.split('.').pop() == 'xlsx'" />
+              <image src="/static/images/system/zip.svg" alt="" v-if="item.name.split('.').pop() == 'zip'" />
+              <span>{{ item.name }}</span>
+            </a>
+          </view>
+        </view>
+    </view>
+  </view>
+</template>
+<script setup>
+/*----------------------------------依赖引入-----------------------------------*/
+import { onReady, onLoad, onShow, onNavigationBarButtonTap } from "@dcloudio/uni-app";
+import { ref, onMounted, inject, shallowRef, reactive, getCurrentInstance, toRefs } from "vue";
+/*----------------------------------接口引入-----------------------------------*/
+import { infoOne } from "@/api/common/message.js";
+import { listDeptNoAuth } from "@/api/system/user.js";
+/*----------------------------------组件引入-----------------------------------*/
+/*----------------------------------store引入-----------------------------------*/
+/*----------------------------------公共方法引入-----------------------------------*/
+/*----------------------------------公共变量-----------------------------------*/
+const { proxy } = getCurrentInstance();
+/*----------------------------------变量声明-----------------------------------*/
+const data = ref();//详情数据
+const deptList = ref([]);//部门列表
+function init(options) {
+  listDeptNoAuth().then((res) => {
+    deptList.value = res.data;
+    infoOne(options.moduleId).then((requset) => {
+      data.value = requset.data
+    });
+  })
+}
+onLoad((options) => {
+  init(options);
+});
+
+onShow(() => {
+  //调用系统主题颜色
+  proxy.$settingStore.systemThemeColor([1]);
+});
+</script>
+
+<style scoped lang="scss">
+.content {
+  max-height:calc(100vh - 80px);
+  padding:10px;
+  overflow: auto;
+}
+
+.view-content {
+  font-size: 12px;
+  padding: 12px 0 0;
+  color: #333;
+  line-height: 24px;
+  font-weight: normal;
+}
+.view-time {
+  margin: 30px 0 10px;
+  font-size: 12px;
+  float: right;
+}
+.view-wrap{
+  margin-top:10px;
+  font-weight: 400;
+  padding-bottom:8px;
+  border-bottom:4px solid rgba(243,243,243,1);
+  .weight-bold{
+    font-weight: 600;
+  }
+  .fileImg{
+    height:auto;
+    image{
+      width:20px;
+      height:20px;
+      vertical-align: middle;
+    }
+    span{
+      margin-left:10px;
+    }
+  }
+}
+.view-wrap:nth-child(1){
+  margin-top:0;
+}
+
+</style>

+ 188 - 0
src/pages/common/authentication/index.vue

@@ -0,0 +1,188 @@
+<template>
+  <u-sticky class="shadow-default" bgColor="#fff" style="top: 0">
+    <u-navbar :titleStyle="{ color: '#000' }" :autoBack="true" title="身份验证" :placeholder="true" :safeAreaInsetTop="true" bgColor="#fff">
+      <template #left>
+        <view class="u-navbar__content__left__item">
+          <u-icon name="arrow-left" size="20" color="#000"></u-icon>
+        </view>
+      </template>
+    </u-navbar>
+  </u-sticky>
+
+  <oa-scroll
+    customClass="authentication-container scroll-height bg-white"
+    :isSticky="true"
+    :customStyle="{
+      //#ifdef APP-PLUS || MP-WEIXIN
+      height: `calc(100vh - (44px + ${proxy.$settingStore.StatusBarHeight}))`,
+      //#endif
+      //#ifdef H5
+      height: `calc(100vh - (44px ))`,
+      //#endif
+    }"
+    :refresherLoad="false"
+    :refresherEnabled="flase"
+    :refresherDefaultStyle="'none'"
+    :refresherBackground="'#f5f6f7'"
+    :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
+  >
+    <template #default>
+      <view class="center-area">
+        <view class="center-area-title">请从下方选择一种方式进行验证</view>
+        <view class="center-area-item">
+          <text class="iconfont oaIcon-mima"></text>
+          <view class="center-area-item-title">密码验证</view>
+          <view class="center-area-item-subTitle"></view>
+        </view>
+        <view class="center-area-item">
+          <text class="iconfont oaIcon-shouji"></text>
+          <view class="center-area-item-title">短信验证</view>
+          <view class="center-area-item-subTitle">{{ user.phonenumber }}</view>
+        </view>
+      </view>
+    </template>
+  </oa-scroll>
+
+  <!-- <u-modal class="modal-section" :show="modalShow" :showConfirmButton="true" :showCancelButton="true" @cancel="handleCancel()" @close="handleCancel()" @confirm="handleConfirm()">
+    <view class="modal-section-slot">
+      <view class="modal-section-slot-item" v-if="modalTitle === '修改手机号'">
+        <view class="mb15 title">{{ modalTitle }}</view>
+        <u-input v-model="phone" placeholder="请输入手机号" :maxlength="11" border="bottom" />
+        <u-input v-model="verify" placeholder="请输入验证码" :maxlength="6" border="bottom">
+          <template #suffix>
+            <button class="verify" @click="getVerifyCode">{{ !useStore.codeTime ? "获取验证码" : useStore.codeTime + "s" }}</button>
+          </template>
+        </u-input>
+      </view>
+
+      <view class="modal-section-slot-item" v-if="modalTitle === '修改密码'">
+        <view class="mb15 title">{{ modalTitle }}</view>
+        <u-input class="mb15" v-model="oldPassword" placeholder="请输入旧密码" :password="oldPasswordBool" border="bottom">
+          <template #suffix>
+            <text :class="!oldPasswordBool ? 'iconfont oaIcon-eye' : 'iconfont oaIcon-eye-close'" @click="oldPasswordBool = !oldPasswordBool"></text>
+          </template>
+        </u-input>
+
+        <u-input class="mb15" v-model="newPassword" placeholder="请输入新密码" :password="newPasswordBool" border="bottom">
+          <template #suffix>
+            <text :class="!newPasswordBool ? 'iconfont oaIcon-eye' : 'iconfont oaIcon-eye-close'" @click="newPasswordBool = !newPasswordBool"></text>
+          </template>
+        </u-input>
+
+        <u-input v-model="confirmPassword" placeholder="请再次输入新的密码" :password="confirmPasswordBool" border="bottom">
+          <template #suffix>
+            <text :class="!confirmPasswordBool ? 'iconfont oaIcon-eye' : 'iconfont oaIcon-eye-close'" @click="confirmPasswordBool = !confirmPasswordBool"></text>
+          </template>
+        </u-input>
+      </view>
+
+      <view class="modal-section-slot-item" v-if="modalTitle === '手机号验证'">
+        <view class="mb5 title">{{ modalTitle }}</view>
+        <view class="mb15 subTitle"> 请填写完整的手机号 {{ user.phonenumber }} 以验证身份 </view>
+        <u-input v-model="phone" placeholder="请输入手机号" :maxlength="11" border="bottom" />
+        <u-input v-model="verify" placeholder="请输入验证码" :maxlength="6" border="bottom">
+          <template #suffix>
+            <button class="verify" @click="getVerifyCode">{{ !useStore.codeTime ? "获取验证码" : useStore.codeTime + "s" }}</button>
+          </template>
+        </u-input>
+      </view>
+    </view>
+  </u-modal> -->
+</template>
+
+<script setup>
+/*----------------------------------依赖引入-----------------------------------*/
+import { onLoad, onShow, onReady, onHide, onLaunch, onUnload, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
+import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
+/*----------------------------------接口引入-----------------------------------*/
+/*----------------------------------组件引入-----------------------------------*/
+/*----------------------------------store引入-----------------------------------*/
+import { useStores, commonStores, controlStores } from "@/store/modules/index";
+/*----------------------------------公共方法引入-----------------------------------*/
+/*----------------------------------公共变量-----------------------------------*/
+const { proxy } = getCurrentInstance();
+const useStore = useStores();
+const controlStore = controlStores();
+/*----------------------------------变量声明-----------------------------------*/
+const state = reactive({
+  loading: false,
+  dataList: [],
+  pageSize: 20,
+  current: 1,
+  total: 0,
+});
+
+const { dataList } = toRefs(state);
+const { avatar, user, userArr } = toRefs(useStore);
+
+/**
+ * @初始化
+ */
+function init() {}
+
+onReady(() => {});
+
+onShow(() => {});
+
+onLoad((options) => {
+  init();
+  useStore.GetUser();
+});
+
+onUnload(() => {});
+</script>
+
+<style lang="scss" scoped>
+.center-area {
+  padding: 0 20px;
+  color: #000000;
+
+  &-title {
+    text-align: center;
+    margin: 20px 0;
+  }
+
+  &-item {
+    display: flex;
+    position: relative;
+    padding: 15px;
+    background-color: #f2f1f6;
+    border-radius: 5px;
+    margin-bottom: 10px;
+    font-size: 16px;
+
+    .iconfont {
+      font-size: 18px;
+      color: $uni-color-primary;
+      margin: auto 0;
+      margin-right: 10px;
+    }
+
+    &-title {
+      margin: auto 0;
+    }
+
+    &-subTitle {
+      margin: auto 20px auto auto;
+      font-size: 14px;
+      color: #909399;
+      text-align: right;
+    }
+  }
+
+  &-item::before {
+    content: " ";
+    height: 10px;
+    width: 10px;
+    border-width: 2px 2px 0 0;
+    border-color: #c0c0c0;
+    border-style: solid;
+    -webkit-transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+    transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+    position: absolute;
+    top: 50%;
+    margin-top: -6px;
+    right: 30rpx;
+  }
+}
+</style>

+ 0 - 3
src/pages/login.vue

@@ -180,7 +180,6 @@ function init() {
   useStore.GetWxOpenId(1); //调用获取微信公众号openId
 
   if (window.location.host.indexOf("localhost") != -1) {
-    linkUrl.value = "192.168.10.165:13200";
     useStore.GetMobileTenantConfig({ url: linkUrl.value });
   } else {
     linkUrl.value = window.location.host;
@@ -298,9 +297,7 @@ function handlePrivacy() {
 }
 
 onShow(() => {
-  // nextTick(() => {
   init();
-  // });
 });
 
 onLoad((options) => {

+ 5 - 0
src/pages/mine/secure/index.vue

@@ -148,6 +148,10 @@ const { modalShow, modalTitle, oldPassword, oldPasswordBool, newPassword, newPas
 const { avatar, user, userArr } = toRefs(useStore);
 
 function handleUserModal(title) {
+  // if (title == "修改密码") {
+  //   proxy.$tab.navigateTo("/pages/common/authentication/index");
+  //   return;
+  // }
   modalShow.value = true;
   modalTitle.value = title;
 }
@@ -297,6 +301,7 @@ onNavigationBarButtonTap((e) => {
     width: 100% !important;
 
     &-item {
+
       .title {
         text-align: center;
         color: #000;

+ 11 - 3
src/static/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 4510027 */
-  src: url('iconfont.woff2?t=1741163438430') format('woff2'),
-       url('iconfont.woff?t=1741163438430') format('woff'),
-       url('iconfont.ttf?t=1741163438430') format('truetype');
+  src: url('iconfont.woff2?t=1744794181277') format('woff2'),
+       url('iconfont.woff?t=1744794181277') format('woff'),
+       url('iconfont.ttf?t=1744794181277') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,14 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.oaIcon-mima:before {
+  content: "\e8b2";
+}
+
+.oaIcon-left:before {
+  content: "\e62b";
+}
+
 .oaIcon-exit:before {
   content: "\e62a";
 }

BIN
src/static/iconfont/iconfont.ttf


BIN
src/static/images/door/ai.png


BIN
src/static/images/door/bg.png


BIN
src/static/images/door/setting_bindFace.png


BIN
src/static/images/door/setting_imgPath.png


BIN
src/static/images/door/setting_password.png


BIN
src/static/images/door/setting_record.png


BIN
src/static/images/door/setting_remark.png


+ 19 - 0
src/static/images/system/doc.svg

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#2287FF;}
+</style>
+<g>
+	<path class="st0" d="M18.4,21.2c0-1.7-0.4-2.2-1.6-2.2s-1.6,0.5-1.6,2.2c0,1.7,0.4,2.2,1.6,2.2S18.4,22.9,18.4,21.2z"/>
+	<path class="st0" d="M10.8,21.2c0-1.3-0.3-2.2-1.7-2.2c-1.3,0-1.5,1-1.5,2.2c0,1.2,0.2,2.2,1.5,2.2C10.4,23.4,10.8,22.6,10.8,21.2z
+		"/>
+	<path class="st0" d="M29.3,13.3V8l-6.7-8h-20v13.3H0v13.3h2.7V28c0,2.3,1.7,4,4,4h22.7v-5.3H32V13.3H29.3z M23.5,3.5l3.1,3.7h-3.1
+		V3.5z M27.8,30.4L27.8,30.4H6.7c-1.3,0-2.4-1.1-2.4-2.4v-1.3h23.5V30.4z M6.1,21.2c0-1.8,0.5-3.4,2.6-3.4c1.2,0,1.8,0.4,2,1v-3.6
+		h1.5v9.1h-1.3l-0.1-0.9c-0.3,0.6-0.9,1.1-2,1.1C6.6,24.6,6.1,23.3,6.1,21.2z M13.7,21.2c0-2.6,1.1-3.4,3.1-3.4s3.1,0.7,3.1,3.4
+		c0,2.6-1.1,3.4-3.1,3.4C14.9,24.6,13.7,23.9,13.7,21.2z M24.5,23.3c0.5,0,1.1-0.1,1.5-0.3v1.3c-0.4,0.1-1.1,0.2-1.7,0.2
+		c-2,0-3.1-0.7-3.1-3.4c0-2.6,1.2-3.4,3.1-3.4c0.7,0,1.3,0.1,1.7,0.2v1.3c-0.5-0.2-0.9-0.3-1.5-0.3c-1.2,0-1.7,0.5-1.7,2.1
+		C22.7,22.9,23.2,23.3,24.5,23.3z M27.8,13.3H4.3V1.6h17.6v7.2h5.9V13.3z"/>
+</g>
+</svg>

+ 19 - 0
src/static/images/system/docx.svg

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#2287FF;}
+</style>
+<g>
+	<path class="st0" d="M7.4,21.2C7.4,19.9,7,19,5.7,19s-1.5,1-1.5,2.2s0.2,2.2,1.5,2.2C7,23.4,7.4,22.6,7.4,21.2z"/>
+	<path class="st0" d="M32,13.3h-2.7V8l-6.7-8h-20v13.3H0v13.3h2.7V28c0,2.3,1.7,4,4,4h22.7v-5.3H32V13.3z M23.5,3.5l3.1,3.7h-3.1
+		V3.5z M4.3,1.6h17.6v7.2h5.9v4.5H4.3V1.6z M21.1,23.3c0.5,0,1.1-0.1,1.5-0.3v1.3c-0.4,0.1-1.1,0.2-1.7,0.2c-2,0-3.1-0.7-3.1-3.4
+		c0-2.6,1.2-3.4,3.1-3.4c0.7,0,1.3,0.1,1.7,0.2v1.3c-0.5-0.2-0.9-0.3-1.5-0.3c-1.2,0-1.7,0.5-1.7,2.1C19.3,22.9,19.8,23.3,21.1,23.3
+		z M16.6,21.2c0,2.6-1.1,3.4-3.1,3.4s-3.1-0.7-3.1-3.4c0-2.6,1.1-3.4,3.1-3.4C15.4,17.9,16.6,18.6,16.6,21.2z M2.7,21.2
+		c0-1.8,0.5-3.4,2.6-3.4c1.2,0,1.8,0.4,2,1v-3.6h1.5v9.1H7.4l-0.1-0.9c-0.3,0.6-0.9,1.1-2,1.1C3.2,24.6,2.7,23.3,2.7,21.2z
+		 M27.7,30.4h-21c-1.3,0-2.4-1.1-2.4-2.4v-1.3h23.5L27.7,30.4L27.7,30.4z M28,24.5l-1.5-2.4h-0.1L25,24.5h-1.8l2.2-3.3l-2-3.2h1.7
+		l1.4,2.3h0.1L28,18h1.7l-2.1,3.2l2.2,3.3H28z"/>
+	<path class="st0" d="M11.9,21.2c0,1.7,0.4,2.2,1.6,2.2s1.6-0.5,1.6-2.2S14.7,19,13.5,19C12.2,19,11.9,19.6,11.9,21.2z"/>
+</g>
+</svg>

+ 18 - 0
src/static/images/system/pdf.svg

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FF3C1A;}
+</style>
+<g>
+	<path class="st0" d="M17.4,17.8c-1.3,0-1.5,1-1.5,2.2s0.2,2.2,1.5,2.2s1.7-0.8,1.7-2.2C19.1,18.7,18.8,17.8,17.4,17.8z"/>
+	<path class="st0" d="M32,13.3h-2.7V8l-6.7-8h-20v13.3H0v13.3h2.7V28c0,2.3,1.7,4,4,4h22.7v-5.3H32V13.3z M25.5,16.7v1.2h-1.4v5.3
+		h-1.5v-5.3h-1v-1.2h1v-0.1c0-2.2,0.9-2.6,2.4-2.6c0.3,0,0.5,0,0.7,0.1v1.1c-0.2,0-0.4,0-0.6,0c-0.9,0-1.1,0.3-1.1,1.6h1.5V16.7z
+		 M23.5,3.5l3.1,3.7h-3.1V3.5z M4.3,1.6h17.6v7.2h5.9v4.5H4.3V1.6z M19,14.1h1.5v9.1h-1.3l-0.1-0.9c-0.3,0.6-0.9,1.1-2,1.1
+		c-2.1,0-2.6-1.3-2.6-3.4c0-1.8,0.5-3.4,2.6-3.4c1.2,0,1.8,0.4,2,1v-3.5H19z M10.6,16.6c2.1,0,2.6,1.3,2.6,3.4
+		c0,1.8-0.5,3.4-2.6,3.4c-1.2,0-1.7-0.4-2-1v3.3H7.1v-8.9h1.5v0.9C8.9,17.1,9.4,16.6,10.6,16.6z M27.7,30.4h-21
+		c-1.3,0-2.4-1.1-2.4-2.4v-1.3h23.5L27.7,30.4L27.7,30.4z"/>
+	<path class="st0" d="M10.2,22.2c1.3,0,1.5-1,1.5-2.2s-0.2-2.2-1.5-2.2S8.5,18.6,8.5,20C8.5,21.3,8.9,22.2,10.2,22.2z"/>
+</g>
+</svg>

+ 18 - 0
src/static/images/system/ppt.svg

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FF701A;}
+</style>
+<g>
+	<path class="st0" d="M17.9,21.8c1.3,0,1.5-1,1.5-2.2s-0.2-2.2-1.5-2.2s-1.7,0.8-1.7,2.2C16.3,20.9,16.6,21.8,17.9,21.8z"/>
+	<path class="st0" d="M10.3,21.8c1.3,0,1.5-1,1.5-2.2s-0.2-2.2-1.5-2.2s-1.7,0.8-1.7,2.2C8.6,20.9,9,21.8,10.3,21.8z"/>
+	<path class="st0" d="M29.3,13.3V8l-6.7-8h-20v13.3H0v13.3h2.7V28c0,2.3,1.7,4,4,4h22.7v-5.3H32V13.3H29.3z M23.5,3.5l3.1,3.7h-3.1
+		V3.5z M27.7,30.4h-21c-1.3,0-2.4-1.1-2.4-2.4v-1.3h23.5L27.7,30.4L27.7,30.4z M10.7,16.2c2.1,0,2.6,1.3,2.6,3.4
+		c0,1.8-0.5,3.4-2.6,3.4c-1.2,0-1.7-0.4-2-1v3.3H7.2v-8.9h1.5v0.9C8.9,16.7,9.5,16.2,10.7,16.2z M18.3,16.2c2.1,0,2.6,1.3,2.6,3.4
+		c0,1.8-0.5,3.4-2.6,3.4c-1.2,0-1.7-0.4-2-1v3.3h-1.5v-8.9h1.5v0.9C16.6,16.7,17.2,16.2,18.3,16.2z M25.5,16.4v1.2h-1.4v3.1
+		c0,0.8,0.1,1,0.8,1c0.2,0,0.4,0,0.6-0.1v1.2c-0.3,0-0.5,0.1-0.8,0.1c-1.5,0-2.1-0.4-2.1-2.1v-3.2h-0.9v-1.2h0.9v-1.5h1.5v1.5H25.5z
+		 M27.7,13.3H4.3V1.6h17.6v7.2h5.9v4.5H27.7z"/>
+</g>
+</svg>

+ 19 - 0
src/static/images/system/pptx.svg

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FF701A;}
+</style>
+<g>
+	<path class="st0" d="M32,13.3h-2.7V8l-6.7-8h-20v13.3H0v13.3h2.7V28c0,2.3,1.7,4,4,4h22.7v-5.3H32V13.3z M23.5,3.5l3.1,3.7h-3.1
+		V3.5z M4.3,1.6h17.6v7.2h5.9v4.5H4.3V1.6z M19.2,14.8h1.5v1.5h1.4v1.2h-1.4v3.1c0,0.8,0.1,1,0.8,1c0.2,0,0.4,0,0.6-0.1v1.2
+		c-0.3,0-0.5,0.1-0.8,0.1c-1.5,0-2.1-0.4-2.1-2.1v-3.2h-0.9v-1.2h0.9V14.8z M14.9,16.2c2.1,0,2.6,1.3,2.6,3.4c0,1.8-0.5,3.4-2.6,3.4
+		c-1.2,0-1.7-0.4-2-1v3.3h-1.5v-8.9h1.5v0.9C13.2,16.7,13.8,16.2,14.9,16.2z M3.8,25.2v-8.9h1.5v0.9c0.3-0.6,0.8-1,2-1
+		c2.1,0,2.6,1.3,2.6,3.4c0,1.8-0.5,3.4-2.6,3.4c-1.2,0-1.7-0.4-2-1v3.3L3.8,25.2L3.8,25.2z M27.7,30.4h-21c-1.3,0-2.4-1.1-2.4-2.4
+		v-1.3h23.5L27.7,30.4L27.7,30.4z M27.3,22.8l-1.5-2.4h-0.1l-1.5,2.4h-1.8l2.2-3.3l-2.1-3.2h1.7l1.4,2.3h0.1l1.4-2.3h1.7l-2.1,3.2
+		l2.2,3.3H27.3z"/>
+	<path class="st0" d="M14.5,21.8c1.3,0,1.5-1,1.5-2.2s-0.2-2.2-1.5-2.2s-1.7,0.8-1.7,2.2C12.9,20.9,13.2,21.8,14.5,21.8z"/>
+	<path class="st0" d="M6.9,21.8c1.3,0,1.5-1,1.5-2.2s-0.2-2.2-1.5-2.2s-1.7,0.8-1.7,2.2C5.2,20.9,5.6,21.8,6.9,21.8z"/>
+</g>
+</svg>

+ 15 - 0
src/static/images/system/xls.svg

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#0AAB1A;}
+</style>
+<path class="st0" d="M32,13.3h-2.7V8l-6.7-8h-20v13.3H0v13.3h2.7V28c0,2.3,1.7,4,4,4h22.7v-5.3H32V13.3z M23.5,3.5l3.1,3.7h-3.1V3.5
+	z M4.3,1.6h17.6v7.2h5.9v4.5H4.3V1.6z M20.6,21.6c-1.4-0.3-1.8-0.8-1.8-1.8c0-1.2,0.7-1.9,2.5-1.9c0.7,0,1.4,0.1,1.7,0.2l0,1.2
+	c-0.3-0.1-1-0.2-1.6-0.2c-0.8,0-1.1,0.2-1.1,0.7s0.2,0.6,1.2,0.8c1.4,0.3,1.9,0.8,1.9,2c0,1.5-0.9,2-2.6,2c-0.7,0-1.5-0.1-2-0.2
+	v-1.3c0.6,0.2,1.3,0.3,1.9,0.3c0.8,0,1.2-0.2,1.2-0.8S21.7,21.8,20.6,21.6z M17.6,23.3c0.1,0,0.3,0,0.4,0v1.2
+	c-0.2,0-0.5,0.1-0.7,0.1c-1.3,0-1.7-0.5-1.7-1.6v-7.6H17v7.2C17,23.2,17.2,23.3,17.6,23.3z M8.3,18H10l1.4,2.3h0.1l1.4-2.3h1.7
+	l-2.1,3.2l2.2,3.3h-1.8l-1.5-2.4h-0.1l-1.5,2.4H8.1l2.2-3.3L8.3,18z M27.7,30.4h-21c-1.3,0-2.4-1.1-2.4-2.4v-1.3h23.5L27.7,30.4
+	L27.7,30.4z"/>
+</svg>

+ 16 - 0
src/static/images/system/xlsx.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#0AAB1A;}
+</style>
+<path class="st0" d="M32,13.3h-2.7V8l-6.7-8h-20v13.3H0v13.3h2.7V28c0,2.3,1.7,4,4,4h22.7v-5.3H32V13.3z M23.5,3.5l3.1,3.7h-3.1V3.5
+	z M4.3,1.6h17.6v7.2h5.9v4.5H4.3V1.6z M20.8,18h1.7l1.4,2.3H24l1.4-2.3h1.7L25,21.1l2.2,3.3h-1.8L24,22.1h-0.1l-1.5,2.4h-1.8
+	l2.2-3.3L20.8,18z M17.3,21.6c-1.4-0.3-1.8-0.8-1.8-1.8c0-1.2,0.7-1.9,2.5-1.9c0.7,0,1.4,0.1,1.7,0.2l-0.1,1.2
+	c-0.3-0.1-1-0.2-1.6-0.2c-0.8,0-1.1,0.2-1.1,0.7s0.2,0.6,1.2,0.8c1.4,0.3,1.9,0.8,1.9,2c0,1.5-0.9,2-2.6,2c-0.7,0-1.5-0.1-2-0.2
+	v-1.3c0.6,0.2,1.3,0.3,1.9,0.3c0.8,0,1.2-0.2,1.2-0.8C18.6,22,18.4,21.8,17.3,21.6z M14.2,23.3c0.1,0,0.3,0,0.4,0v1.2
+	c-0.2,0-0.5,0.1-0.7,0.1c-1.3,0-1.7-0.5-1.7-1.6v-7.6h1.5v7.2C13.7,23.2,13.8,23.3,14.2,23.3z M4.9,18h1.7L8,20.3h0.1L9.5,18h1.7
+	l-2.1,3.2l2.2,3.3H9.6l-1.5-2.4H8l-1.5,2.4H4.8L7,21.2L4.9,18z M27.7,30.4h-21c-1.3,0-2.4-1.1-2.4-2.4v-1.3h23.5L27.7,30.4
+	L27.7,30.4z"/>
+</svg>

+ 16 - 0
src/static/images/system/zip.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 32 32" style="enable-background:new 0 0 32 32;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#A766C5;}
+</style>
+<g>
+	<path class="st0" d="M32,13.3h-2.7V8l-6.7-8h-20v13.3H0v13.3h2.7V28c0,2.3,1.7,4,4,4h22.7v-5.3H32V13.3z M21.5,16.6
+		c2.1,0,2.6,1.3,2.6,3.4c0,1.8-0.5,3.4-2.6,3.4c-1.2,0-1.7-0.4-2-1v3.3H18v-8.9h1.5v0.9C19.8,17.1,20.3,16.6,21.5,16.6z M23.5,3.5
+		l3.1,3.7h-3.1V3.5z M4.3,1.6h17.6v7.2h5.9v4.5H4.3V1.6z M14.5,14.9c0-0.7,0.2-0.8,0.9-0.8c0.7,0,0.9,0.1,0.9,0.8s-0.2,0.8-0.9,0.8
+		C14.7,15.8,14.5,15.7,14.5,14.9z M16.1,16.8v6.5h-1.5v-6.5H16.1z M8.1,18v-1.2H13V18l-3.3,4l0,0h3.6v1.2H7.9V22l3.3-3.9V18H8.1z
+		 M27.7,30.4h-21c-1.3,0-2.4-1.1-2.4-2.4v-1.3h23.5L27.7,30.4L27.7,30.4z"/>
+	<path class="st0" d="M21.1,22.2c1.3,0,1.5-1,1.5-2.2s-0.2-2.2-1.5-2.2s-1.7,0.8-1.7,2.2C19.4,21.3,19.8,22.2,21.1,22.2z"/>
+</g>
+</svg>

+ 4 - 13
src/store/modules/setting.js

@@ -394,19 +394,10 @@ const settingStores = defineStore("storage-setting", {
                     }
                 });
             } else {
-                modal.confirmInput("确定注销并退出系统吗?", "请输入密码").then((res) => {
-                    if (res.confirm) {
-                        if (!res.content) {
-                            modal.msg("请输入密码")
-                        } else if (res.content == "sh628628") {
-                            useStore.LogOut().then(() => {
-                                modal.msgSuccess("退出成功")
-                                tab.reLaunch("/pages/index");
-                            });
-                        } else {
-                            modal.msg("密码错误")
-                        }
-                    }
+                modal.confirm("确定注销并退出系统吗?").then(() => {
+                    useStore.LogOut().then(() => {
+                        tab.reLaunch("/pages/index");
+                    });
                 });
             }
             //#endif