Quellcode durchsuchen

Merge branch 'V0.0.5' of http://10.87.21.221:8000/jzyd_yyds/soc_app into V0.0.5

coys vor 1 Jahr
Ursprung
Commit
f2c1f194be

+ 14 - 0
src/api/public.js

@@ -183,3 +183,17 @@ export function handsheDeptTreeSelect() {
   })
 }
 
+export function wholeTreeSelect(para) {
+  if(!para) {
+    para={
+      orgId:"",
+      includeSub:true,
+      excludeOrgName:"各部门"
+    }
+  }
+  return request({
+    url: '/system/dept/deptTree/whole',
+    method: 'post',
+    data: para,
+  })
+}

BIN
src/assets/img/my/Pdf.png


BIN
src/assets/img/my/WORD.png


BIN
src/assets/img/my/header.png


BIN
src/assets/img/my/my_header.png


BIN
src/assets/img/my/operta.png


BIN
src/assets/img/my/org.png


BIN
src/assets/img/my/role.png


BIN
src/assets/img/my/server.png


+ 1 - 1
src/components/Calendar/index.vue

@@ -117,7 +117,7 @@ export default {
             this.$emit('change',v)
           }
           return{
-            key:v.id,
+            key:v.id || v.ymdDate,
             customData: v,
             highlight: {
               color: v.isEnable == 1 ? 'green' : v.isEnable == 0 ? 'yellow' : v.isEnable == null ? 'red' : 'indigo',

+ 2 - 2
src/components/OrgPicker/index.vue

@@ -72,10 +72,10 @@ export default {
     }
   },
   computed:{
-    ...mapGetters(['orgTree']),
+    ...mapGetters(['wholeTree']),
   },
   created() {
-    this.$store.dispatch('getOrgTree')
+    this.$store.dispatch('getWholeTree')
   },
   methods:{
     clickOverlay(){

+ 65 - 7
src/components/TopBar.vue

@@ -2,20 +2,54 @@
   <div class="top-bar-box">
     <div class="top-bar">
       <div class="top-box">
-        <span>移动安全保卫管理平台</span>
+<!--        <span>移动安全保卫管理平台</span>-->
         <van-icon name="setting-o" size="26" @click="clickOutLogin" />
       </div>
       <div class="bottom-box">
-        <div>
+<!--        <div>
           <p class="user-name">{{ userName }}</p>
           <p class="org-info">
             <span>{{ orgName }}</span>
             <van-icon name="arrow" size="20" />
           </p>
-          <p class="van-multi-ellipsis--l2 introduce-info ">
+          <p class="van-multi-ellipsis&#45;&#45;l2 introduce-info ">
             <span v-for="item in roleList" :key="item.roleId">{{ item.roleName }}</span>
           </p>
-        </div>
+        </div>-->
+      </div>
+    </div>
+    <div class="top-card">
+      <div class="top-card-line">
+        <van-image
+          round
+          width="1.3rem"
+          height="1.3rem"
+          style="float: left"
+          :src="require('@/assets/img/my/header.png')"
+        />
+        <p class="user-name">{{ userName }}</p>
+      </div>
+      <div class="top-card-line">
+        <van-image
+          width="0.6rem"
+          height="0.6rem"
+          style="margin-left: 10px;float: left"
+          :src="require('@/assets/img/my/org.png')"
+        />
+        <p style="line-height: 28px;">
+          <span class="top_text_content">{{ orgName }}</span>
+        </p>
+      </div>
+      <div class="top-card-line">
+        <van-image
+          width="0.65rem"
+          height="0.6rem"
+          style="margin-left: 10px;float: left"
+          :src="require('@/assets/img/my/role.png')"
+        />
+        <p class="van-multi-ellipsis&#45;&#45;l2 introduce-info " style="line-height: 28px;">
+          <span class="top_text_content" v-for="item in roleList" :key="item.roleId">{{ item.roleName }}</span>
+        </p>
       </div>
     </div>
 
@@ -46,15 +80,39 @@ export default {
 <style scoped lang="scss">
 .top-bar-box{
   position: relative;
+  height: 750px;
+}
+.top-card{
+  height: 45.333333vw;
+  background-color: #FFFFFF;
+  margin-top: -23vw;
+  margin-left: 6%;
+  margin-right: 6%;
+  border-radius: 10px;
+  .top-card-line{
+    padding-top: 2vw;
+    padding-left: 4vw;
+  }
+}
+.user-name{
+  padding-left: 15vw;
+  font-size: 6.333333vw;
+  line-height: 14vw;
+}
+
+.top_text_content{
+  margin-left: 2vw;
+  font-size: 3.8vw;
+  color: #797979;
 }
 .top-bar {
-  height: 300px;
+  height: 550px;
   width: 100%;
-  background: url('../assets/img/banner.png') no-repeat center rgba(255,255,255,.1);
+  background: url('../assets/img/my/my_header.png') no-repeat center rgba(255,255,255,.1);
   background-size: 100% 100%;
   padding: 40px 40px 20px 40px;
   text-shadow: 0 1px 3px #666;
-  box-shadow: 0 1px 10px #5ebaee;
+  box-shadow: 0 1px 10px #ffffff;
   color: #fff;
   > div {
     width: 100%;

+ 74 - 38
src/components/weatherBox/index.vue

@@ -3,7 +3,7 @@
     <!--  天气消息  -->
     <div v-if="showNotice" class="notice-box">
       <div>
-        <van-notice-bar v-if="lists.length > 0" left-icon="volume-o" mode="closeable"  :color="color" :background="background">
+        <van-notice-bar v-if="lists.length > 0" left-icon="volume-o" mode="closeable"  :background="background">
           <van-swipe
             @change="changeColor"
             vertical
@@ -11,7 +11,9 @@
             :autoplay="8000"
             :show-indicators="false">
             <van-swipe-item v-for="item in lists" :key="item.id" @click="clickHandler(item)" >
-              {{item.alarmTitle}}
+              <span :style="{color:color,textShadow:'0 0 1px #666'}">
+                 {{item.alarmTitle}}
+              </span>
             </van-swipe-item>
           </van-swipe>
         </van-notice-bar>
@@ -61,37 +63,63 @@ export default {
     getList() {
       if(!this.orgId)return [];
       getTheAreaWeather(this.orgId).then(res => {
-        this.lists = res.data || [];
+        //this.lists = res.data || [];
         //模拟数据
-        // let str = [
-        //   {
-        //     alarmContent:"周宁县气象台2023年12月13日10时27分继续发布大雾黄色预警信号:预计未来12小时,我县部分乡镇将出现能见度小于500米的雾。请注意防范!(预警信息来源:国家预警信息发布中心)",
-        //     alarmLevel:"黄色",
-        //     alarmTime:"2023-12-13 14:00:10",
-        //     alarmTitle:"周宁县气象台2023年12月13日10时27分继续发布大雾黄色预警信号",
-        //     alarmType:"大雾",
-        //     area:"周宁",
-        //     city:"宁德",
-        //     code:"101230305",
-        //     createTime:"2023-12-13 10:27:00",
-        //     id:"8",
-        //     province:"福建"
-        //   },
-        //   {
-        //     alarmContent:"YY县气象台2023年12月13日10时27分继续发布大雾黄色预警信号:预计未来12小时,我县部分乡镇将出现能见度小于500米的雾。请注意防范!(预警信息来源:国家预警信息发布中心)",
-        //     alarmLevel:"红色",
-        //     alarmTime:"2023-12-13 14:00:10",
-        //     alarmTitle:"YY县气象台2023年12月13日10时27分继续发布大雾黄色预警信号",
-        //     alarmType:"大雾",
-        //     area:"周宁",
-        //     city:"宁德",
-        //     code:"101230305",
-        //     createTime:"2023-12-13 10:27:00",
-        //     id:"9",
-        //     province:"福建"
-        //   },
-        // ]
-        //this.lists = str;
+        let str = [
+          {
+            alarmContent:"周宁县气象台2023年12月13日10时27分继续发布大雾黄色预警信号:预计未来12小时,我县部分乡镇将出现能见度小于500米的雾。请注意防范!(预警信息来源:国家预警信息发布中心)",
+            alarmLevel:"蓝色",
+            alarmTime:"2023-12-13 14:00:10",
+            alarmTitle:"周宁县气象台2023年12月13日10时27分继续发布大雾蓝色预警信号",
+            alarmType:"大雾",
+            area:"周宁",
+            city:"宁德",
+            code:"101230305",
+            createTime:"2023-12-13 10:27:00",
+            id:"1",
+            province:"福建"
+          },
+          {
+            alarmContent:"周宁县气象台2023年12月13日10时27分继续发布大雾黄色预警信号:预计未来12小时,我县部分乡镇将出现能见度小于500米的雾。请注意防范!(预警信息来源:国家预警信息发布中心)",
+            alarmLevel:"黄色",
+            alarmTime:"2023-12-13 14:00:10",
+            alarmTitle:"周宁县气象台2023年12月13日10时27分继续发布大雾黄色预警信号",
+            alarmType:"大雾",
+            area:"周宁",
+            city:"宁德",
+            code:"101230305",
+            createTime:"2023-12-13 10:27:00",
+            id:"2",
+            province:"福建"
+          },
+          {
+            alarmContent:"周宁县气象台2023年12月13日10时27分继续发布大雾黄色预警信号:预计未来12小时,我县部分乡镇将出现能见度小于500米的雾。请注意防范!(预警信息来源:国家预警信息发布中心)",
+            alarmLevel:"橙色",
+            alarmTime:"2023-12-13 14:00:10",
+            alarmTitle:"周宁县气象台2023年12月13日10时27分继续发布大雾橙色预警信号",
+            alarmType:"大雾",
+            area:"周宁",
+            city:"宁德",
+            code:"101230305",
+            createTime:"2023-12-13 10:27:00",
+            id:"3",
+            province:"福建"
+          },
+          {
+            alarmContent:"YY县气象台2023年12月13日10时27分继续发布大雾黄色预警信号:预计未来12小时,我县部分乡镇将出现能见度小于500米的雾。请注意防范!(预警信息来源:国家预警信息发布中心)",
+            alarmLevel:"红色",
+            alarmTime:"2023-12-13 14:00:10",
+            alarmTitle:"YY县气象台2023年12月13日10时27分继续发布大雾红色预警信号",
+            alarmType:"大雾",
+            area:"周宁",
+            city:"宁德",
+            code:"101230305",
+            createTime:"2023-12-13 10:27:00",
+            id:"4",
+            province:"福建"
+          },
+        ]
+        this.lists = str;
         if(this.lists.length > 0){
           this.changeColor(0);
         }
@@ -102,25 +130,33 @@ export default {
       let alarmLevel = this.lists[index].alarmLevel;
       switch (alarmLevel){
         case '蓝色':
-          this.background = 'rgba(78,162,248,0.62)';
+          this.color= '#2E65FE';
+          this.background = '#f5f5f5';
+          //this.background = 'rgba(46,101,254,0.8)';
           //this.color = '#fff';
           break;
         case '黄色':
-          this.background = 'rgba(238,227,103,0.63)';
+          this.color = '#FBEE20';
+          this.background = '#f5f5f5';
+          //this.background = 'rgba(251,238,32,0.8)';
           //this.color = '#fdb0b1';
           break;
         case '橙色':
-          this.background = 'rgba(246,181,104,0.62)';
+          this.color = '#F68D19';
+          this.background = '#f5f5f5';
+          //this.background = 'rgba(246,141,25,0.8)';
           //this.color = '#fff';
           break;
         case '红色':
-          this.background = 'rgba(239,70,74,0.65)';
+          this.color = '#D72B23';
+          this.background = '#f5f5f5';
+          //this.background = 'rgba(215,43,35,0.8)';
         //this.color = '#fff';
       }
     },
     clickHandler(item) {
       this.info = item;
-      this.info.color = this.background;
+      this.info.color = this.color;
       this.show = true;
     },
   }
@@ -137,7 +173,7 @@ export default {
   line-height: 30px;
 }
 .van-swipe-item{
-  text-shadow: 0 0 3px #888;
+  -text-shadow: 0 0 2px #333;
 }
 </style>
 <style scoped lang="scss">

+ 2 - 2
src/config/env.development.js

@@ -1,8 +1,8 @@
 /** 本地开发环境*/
 module.exports = {
   title: 'soc-app-dev',
-  baseUrl: 'http://10.87.21.107:8080', // 本地图片地址
-  baseApi: '/dev', // 本地api请求地址,注意:如果你使用了代理,请设置成'/'
+  baseUrl: 'http://10.87.10.55:8080', // 本地图片地址
+  baseApi: '/gaoxiong', // 本地api请求地址,注意:如果你使用了代理,请设置成'/'
   APPID: 'xxx',
   APPSECRET: 'xxx',
   $cdn: 'https://www.sunniejs.cn/static'  //静态资源

+ 6 - 2
src/router/router.config.js

@@ -84,8 +84,6 @@ export let routers = [
     component: () => import('@/views/menu/rehearsalTask/components/rehearsalTaskSign.vue'),
     meta: { title: '演练详情', keepAlive: false }
   },
-  
-
   {
     path: '/home',
     component: () => import('@/components/layouts/index'),
@@ -305,6 +303,12 @@ export let routers = [
         component: () => import('@/views/menu/visitRecord/add.vue'),
         meta: { title: '人员登记', keepAlive: false ,hideTabBar:true,deep: 2}
       },
+      {
+        path: '/operate',
+        name: 'operate',
+        component: () => import('@/views/menu/operate/index.vue'),
+        meta: { title: '操作手册', keepAlive: false ,hideTabBar:true,deep: 2}
+      },
 
     ],
   },

+ 1 - 0
src/store/getters.js

@@ -8,6 +8,7 @@ const getters = {
   orgTree: state => state.app.orgTree,
   orgTreeHangshe: state => state.app.orgTreeHangshe,
   depTree: state => state.app.depTree,
+  wholeTree: state => state.app.wholeTree,
   commonTree: state => state.app.commonTree,
   dictionary: state => state.app.dictionary,
 }

+ 20 - 3
src/store/modules/app.js

@@ -1,4 +1,4 @@
-import {deptTreeSelect, handsheDeptTreeSelect, getDict,hangsheAndOrgTree, userAndOrgTree} from '@/api/public'
+import {deptTreeSelect, handsheDeptTreeSelect, getDict,hangsheAndOrgTree, userAndOrgTree,wholeTreeSelect } from '@/api/public'
 export default {
   state: {
     //用户名
@@ -17,6 +17,8 @@ export default {
     commonTree:[],
     //行社机构树
     depTree: [],
+    //完整树
+    wholeTree:[],
     //字典
     dictionary: []
   },
@@ -26,15 +28,18 @@ export default {
     },
     SET_ORGTREE: (state, val) => {
       state.orgTree = val
-      
+
     },
     SET_ORGTREE_HANGSHE: (state, val) => {
       state.orgTreeHangshe = val
-      
+
     },
     SET_DEPTREE: (state, val) => {
       state.depTree = val
     },
+    SET_WHOLETREE: (state, val) => {
+      state.wholeTree = val;
+    },
     SET_COMMONTREE: (state, val) => {
       state.commonTree = val
     },
@@ -108,5 +113,17 @@ export default {
         })
       })
     },
+
+    //获完整路径树(显示登录用户所在机构的所有下级以及直接上级机构)
+    getWholeTree({ commit, state }) {
+      return new Promise((resolve, reject) => {
+        wholeTreeSelect().then((res) => {
+          commit("SET_WHOLETREE", res.data);
+          resolve(res);
+        }).catch((error) => {
+          reject(error);
+        });
+      });
+    },
   }
 }

+ 10 - 0
src/views/home/api.js

@@ -0,0 +1,10 @@
+import request from "@/utils/request";
+
+export function getServer(data) {
+  return request({
+    url: "/system/config/findFirstByCode",
+    method: "get",
+    params: data,
+  });
+}
+

+ 35 - 6
src/views/home/isMy.vue

@@ -2,20 +2,34 @@
   <div v-if="!showServer" class="about-container">
     <top-bar></top-bar>
     <div  class="item-list">
+
+
       <van-cell is-link @click="clickServe">
         <!-- 使用 title 插槽来自定义标题 -->
         <template #title>
           <p class="item-title">
-            <van-icon size=".5rem" name="smile-comment-o" color="#008cd6"/>
-            <span class="custom-title">运维服务</span>
+<!--            <van-icon size=".5rem" name="smile-comment-o" color="#008cd6"/>-->
+            <van-image
+              width="0.6rem"
+              height="0.6rem"
+              style="margin-left: 10px;float: left"
+              :src="require('@/assets/img/my/server.png')"
+            />
+            <span class="custom-title">客服服务</span>
           </p>
         </template>
       </van-cell>
-      <van-cell is-link>
+      <van-cell is-link @click="checkOperate">
         <!-- 使用 title 插槽来自定义标题 -->
         <template #title>
           <p class="item-title">
-            <van-icon size=".5rem" name="info-o" color="#008cd6"/>
+<!--            <van-icon size=".5rem" name="info-o" color="#008cd6"/>-->
+            <van-image
+              width="0.6rem"
+              height="0.6rem"
+              style="margin-left: 10px;float: left"
+              :src="require('@/assets/img/my/operta.png')"
+            />
             <span class="custom-title">操作手册</span>
           </p>
         </template>
@@ -25,7 +39,7 @@
   <!-- 消息详情 -->
   <div v-else class="serve-detail">
     <van-nav-bar
-      title="运维信息"
+      title="客服服务"
       left-arrow
       @click-left="onClickLeft"
     />
@@ -41,6 +55,8 @@
 
 <script>
 import TopBar from '@/components/TopBar'
+import {getServer} from '@/views/home/api'
+import { getOperatings } from '@/views/menu/operate/api'
 export default {
   name: 'isMy',
   components: { TopBar },
@@ -55,9 +71,20 @@ export default {
     }
   },
   mounted() {
-
+    this.initData();
   },
   methods: {
+    initData(){
+      getServer({code:'CUSTOMER_SERVICE'}).then(res => {
+        let data = res.data;
+        if(data){
+          this.dataInfo.content = data.configValue;
+        }
+      });
+    },
+    checkOperate(){
+      this.$router.push({path:"/operate"})
+    },
     clickServe(){
       this.showServer = true;
     },
@@ -81,6 +108,8 @@ export default {
   }
   .custom-title{
     margin-left: 10px;
+    font-size: 4vw;
+    color: #797979;
   }
 }
 

+ 10 - 0
src/views/menu/operate/api.js

@@ -0,0 +1,10 @@
+import request from "@/utils/request";
+
+export function getOperatings(data) {
+  return request({
+    url: "/system/operating/operatingData",
+    method: "get",
+    data,
+  });
+}
+

+ 160 - 0
src/views/menu/operate/index.vue

@@ -0,0 +1,160 @@
+<template>
+  <div class="index-container">
+    <NavBar  :go="{ type: 'push', path: '/isMy' }"/>
+    <van-row>
+      <van-col span="5" class="side_list">
+        <van-sidebar v-model="activeKey" @change="onChange">
+          <van-sidebar-item :title="item.sourceName" v-for="item in sources" />
+        </van-sidebar>
+      </van-col>
+      <van-col span="19">
+        <div class="sidebar-content">
+          <div class="operator-card" v-for="item in list" :key="item" :title="item.fileName"  @click="showFile(item)">
+            <van-image
+              width="1rem"
+              height="1rem"
+              style="margin-left: 10px;float: left"
+              :src="getFileType(item.fileType)"
+            />
+            <span class="sid-content-title">{{item.fileName}}</span>
+          </div>
+
+        </div>
+      </van-col>
+    </van-row>
+
+
+  </div>
+</template>
+
+<script>
+import NavBar from '@/components/NavBar'
+import { Sidebar, SidebarItem,Notify  } from 'vant';
+import {getOperatings} from '@/views/menu/operate/api'
+import { imgUrl } from '@/utils'
+export default {
+  name: 'operate',
+  components: {
+    NavBar,
+    Sidebar,
+    SidebarItem,
+    Notify
+  },
+  data() {
+    return {
+      activeKey: 0,
+      sources:[],
+      list: [],
+    }
+  },
+  created() {
+  },
+  mounted() {
+    this.initData();
+  },
+  methods: {
+    getFileType(type){
+      if(type === 'pdf'){
+        return require('@/assets/img/my/Pdf.png');
+      }
+      if(type === 'doc' || type === 'docx'){
+        return require('@/assets/img/my/WORD.png')
+      }
+    },
+    initData(){
+      getOperatings().then(res => {
+        this.sources = res.data;
+        this.onChange(0);
+      });
+    },
+    onChange(index) {
+      let data = this.sources[index];
+      this.list = data.list;
+    },
+    showFile(item){
+      let url = item.fileUrl;
+      let system = this.isAndroidOrIos();
+      const parms = {
+        url: url.indexOf('http') > -1 ?   url : imgUrl(url),
+        name: item.fileName
+      }
+      if(system === 1){
+        //android
+        // 判断当前环境是是否存在 js桥 'sap'
+        const hasSap = window.hasOwnProperty('sap');
+        if (hasSap) {
+          // 判断是否存在方法 ?preview
+          const fun = sap.hasOwnProperty('preview');
+          if (fun) {
+            sap.preview(JSON.stringify(parms));
+          }
+        }
+      }
+
+      if(system === 2){
+        //ios
+        // 判断 ios是否存在方法 preview
+        const fun = window.webkit.messageHandlers.hasOwnProperty('preview')
+        if (fun) {
+          window.webkit.messageHandlers.preview.postMessage(JSON.stringify(parms))
+        }
+      }
+    },
+    isAndroidOrIos(){
+      const urls = navigator.userAgent;
+      let isAndroid = urls.indexOf('Android') > -1 || urls.indexOf('Linux') > -1;
+      let isIos = !!urls.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
+      if(isAndroid){
+        return 1;
+      }
+      if(isIos){
+        return 2;
+      }
+      return 3;
+    },
+  }
+}
+</script>
+<style lang="scss" scoped>
+.sid-content-title{
+  font-size: 3.2vw;
+  line-height: 12vw;
+  margin-left: 3vw;
+}
+.index-container {
+  .van-sidebar-item--select::before {
+    background-color: #008cd6;
+    width: 1.066667vw;
+    height: 15.266667vw;
+  }
+  .van-sidebar-item {
+    background-color:#ffffff
+  }
+  .van-sidebar-item--select{
+    background-color: #f7f7f7;
+    color: #008cd6;
+  }
+
+}
+.sidebar-content{
+  margin-left: 2px;
+}
+.index-container{
+    height: 100vh;
+    background-color: #f7f8fa;
+  }
+.side_list{
+  background-color: #FFFFFF;
+  height: 100vh;
+}
+.operator-card{
+  height: 6vh;
+  margin-left: 2%;
+  margin-right: 2%;
+  margin-top: 2%;
+  background-color: #fff;
+  border-radius: 12px;
+  box-shadow: 0 8px 12px #ebedf0;
+
+}
+</style>