Explorar el Código

'改-2020-9-7'

魏志佳 hace 4 años
padre
commit
b408ab4159

BIN
dist.zip


+ 2 - 0
package.json

@@ -7,6 +7,8 @@
     "build": "vue-cli-service build"
   },
   "dependencies": {
+    "@riophae/vue-treeselect": "^0.4.0",
+    "ant-design-vue": "^1.6.5",
     "core-js": "^3.6.5",
     "element-ui": "^2.3.6",
     "register-service-worker": "^1.7.1",

+ 1 - 1
src/Layout.vue

@@ -107,7 +107,7 @@ import Vue from 'vue'
 }
 .el-col,.el-menu{
   height: 100%;
-  overflow: hidden;
+  overflow: auto;
 }
 .topNav{
   background: fff;

BIN
src/assets/image/1.png


BIN
src/assets/image/2.png


BIN
src/assets/image/3.png


BIN
src/assets/image/follow.png


BIN
src/assets/image/followRed.png


+ 42 - 7
src/components/Nav.vue

@@ -1,13 +1,15 @@
 <template>
     <div class="nav">
         <el-menu
-        default-active="1-1"
+        :default-active="activePage"
+        @select='selectChange'
         class="el-menu-vertical-demo"
         @open="handleOpen"
         @close="handleClose"
         background-color="#545c64"
         text-color="#fff"
-        active-text-color="#ffd04b">
+        active-text-color="#ffd04b"
+        style="box-sixe:border-box;overflow:hidden">
         <el-submenu index="1">
           <template slot="title">
             <i class="el-icon-location"></i>
@@ -21,7 +23,17 @@
             </router-link>
             <router-link to="/OKRList">
                 <el-menu-item index="1-2">
-                    我可见的
+                    OKR看板
+                </el-menu-item>
+            </router-link>
+            <router-link to="/MyConcerns">
+                <el-menu-item index="1-3">
+                    我的关注
+                </el-menu-item>
+            </router-link>
+            <router-link to="/myDepart">
+                <el-menu-item index="1-4">
+                    我的部门
                 </el-menu-item>
             </router-link>
           </el-menu-item-group>
@@ -57,14 +69,32 @@
 
 <script>
     export default {
+        data() {
+            return {
+                activePage:'1-1'
+            }
+        },
+        
+        
         methods: {
             handleOpen(key, keyPath) {
-                console.log(key, keyPath);
+                // console.log(key, keyPath);
             },
             handleClose(key, keyPath) {
-                console.log(key, keyPath);
+                // console.log(key, keyPath);
+            },
+            selectChange(key, keyPath){
+                // console.log(key, keyPath);
+                this.activePage=key
+                localStorage.setItem('activePage',key)
             }
         },
+        mounted(){
+            let activePage=localStorage.getItem('activePage');
+            if(activePage){
+                this.activePage=activePage
+            }
+        }
     }
 </script>
 
@@ -77,8 +107,13 @@
         color:#fff;
         text-decoration: none;
     }
-    
-   
+    .el-submenu .el-menu {
+        border: none;
+        overflow: hidden;
+    }
+   .el-menu .el-menu--inline{
+       overflow: hidden;
+   }
     
     
 }

+ 7 - 0
src/main.js

@@ -4,10 +4,17 @@ import App from './App.vue'
 import './registerServiceWorker'
 import router from './router'
 import store from './store'
+
+
 import ElementUI from 'element-ui'
 import 'element-ui/lib/theme-chalk/index.css'
 import Storage from 'vue-ls'
+import Antd from 'ant-design-vue';
+// import 'ant-design-vue/dist/antd.css';
+
+Vue.config.productionTip = false;
 
+Vue.use(Antd);
 Vue.use(ElementUI)
 Vue.use(Storage)
 Vue.config.productionTip = false

+ 25 - 3
src/router/index.js

@@ -41,6 +41,28 @@ const routes = [
           }
         },
         {
+          path: 'MyConcerns',
+          name: 'MyConcerns',
+          // route level code-splitting
+          // this generates a separate chunk (about.[hash].js) for this route
+          // which is lazy-loaded when the route is visited.
+          component: () => import(/* webpackChunkName: "about" */ '../views/MyConcerns.vue'),
+          meta:{
+            isLogin:true
+          }
+        },
+        {
+          path: 'myDepart',
+          name: 'myDepart',
+          // route level code-splitting
+          // this generates a separate chunk (about.[hash].js) for this route
+          // which is lazy-loaded when the route is visited.
+          component: () => import(/* webpackChunkName: "about" */ '../views/myDepart.vue'),
+          meta:{
+            isLogin:true
+          }
+        },
+        {
           path: 'Feedback',
           name: 'Feedback',
           // route level code-splitting
@@ -85,12 +107,12 @@ router.beforeEach((to,from,next)=>{
   let userInfo=null;
   if(Login_Userinfo){
      userInfo=JSON.parse(Login_Userinfo)
-     console.log(userInfo)
+    //  console.log(userInfo)
   }
-  console.log(to,from,userInfo)
+  // console.log(to,from,userInfo)
   if(to.matched.some(res=>res.meta.isLogin)){//判断是否需要登录
       if (userInfo) {
-        console.log('登陆跳转---tolist')
+        // console.log('登陆跳转---tolist')
           next();
       }else{
           next({

+ 2 - 2
src/store/user.js

@@ -62,7 +62,7 @@ const user = {
     },
     //企业微信登录
     wxLogin({commit}, userInfos) {
-        console.log(userInfos)
+        // console.log(userInfos)
         const result = userInfos.result
         const userInfo = result.userInfo
         Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000)
@@ -122,7 +122,7 @@ const user = {
     Logout({commit, state}) {
       return new Promise((resolve) => {
         let logoutToken = state.token;
-        console.log(logoutToken)
+        // console.log(logoutToken)
         // commit('SET_TOKEN', '')
         commit('SET_PERMISSIONLIST', [])
         Vue.ls.remove(ACCESS_TOKEN)

+ 2 - 2
src/utils/api/request.js

@@ -28,8 +28,8 @@ const err = (error) => {
   if (error.response) {
     let data = error.response.data
     const token = Vue.ls.get(ACCESS_TOKEN)
-    console.log("------异常响应------", token)
-    console.log("------异常响应------", error.response.status)
+    // console.log("------异常响应------", token)
+    // console.log("------异常响应------", error.response.status)
     switch (error.response.status) {
       case 403:
         Notification.error({title: '系统提示', message: '拒绝访问', duration: 4})

+ 1 - 1
src/views/Login.vue

@@ -25,7 +25,7 @@
                 } else if (process.env.NODE_ENV === 'production') {
                     url = 'http://okr.c-top.com.cn'
                 }
-                console.log(url)
+                // console.log(url)
                 window.WwLogin({
                     id: 'wx_reg',
                     appid: 'ww24b8a47826f5875f',

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1245 - 0
src/views/MyConcerns.vue


+ 168 - 27
src/views/OKRList.vue

@@ -1,10 +1,10 @@
 <template>
-    <div class="OKRList">
+    <div class="OKRList"  >
         <!-- <div class="topBox"> </div> -->
         <div class="title">
-            我可见的目标
+            OKR广场
         </div>
-        <div class="OKRBody">
+        <div class="OKRBody" v-loading="loading">
             <div class="top-opt">
                 <span class="year">
                     <el-select v-model="yearValue" clearable placeholder="年份" @change="yearChange">
@@ -28,9 +28,10 @@
                         </el-option>
                     </el-select>
                  </span>
+                 
                  <span class="nameSearch">
                      <el-input
-                        placeholder="输入搜索的名字"
+                        placeholder="输入搜索的名字"
                         v-model="nameValue"
                         clearable>
                         <el-button slot="append" icon="el-icon-search" @click="searchName"></el-button>
@@ -41,7 +42,7 @@
                      <el-button type="warning" round @click="search">搜索</el-button>
                  </span> -->
             </div>
-            <div class="listBody" v-if="list.length>0">
+            <div class="listBody" >
                 <div class="itemBody" @click="getThisOKR(item)" v-for="(item,index) in list" :key="index" >
                     <div class="item">
                         <div class="item-top">
@@ -52,21 +53,41 @@
                             </div>
                             <div class="krlist">
                                 <span class="tip">KR</span>
-                                <span class="num">关键结果<span style="width:10px;display:inline-block"></span> <span class="nums"> {{item.krList.length}}</span> </span>
+                                <span class="num">关键结果
+                                    <span style="width:10px;display:inline-block"></span> <span class="nums" v-if="item.krList"> {{ item.krList.length }}</span> 
+                                    <span class="nums" v-else> 0</span> 
+                                </span>
                             </div>
                         </div>
                         <div class="item-bottom">
                             <span>负责人:{{item.name}}</span>
+                            <span>
+                               <el-tooltip :content="item.follow?'取消关注':'关注'" placement="bottom" effect="dark">
+                                    <img src="../assets/image/followRed.png" alt="" class="follow" v-if="item.follow" @click.stop="followHis(item)">
+                                    <img src="../assets/image/follow.png" alt="" class="follow" v-else  @click.stop="followHis(item)">
+                                </el-tooltip>
+                                    
+                            </span>
                         </div>
                     </div>
                 </div>
             </div>
-            <div v-else>
+            <div v-if="list.length==0">
                <div class="noListData">
                    <img src="../assets/image/nodata.png" alt="" class="nodata">
                    <p class="tip">咦,没有OKR哎~</p>
                </div>
             </div>
+            <!-- <div class="fenye" >
+                <el-pagination
+                background
+                layout="prev, pager, next"
+                :total="totalPage"
+                :current-page='currentPage'
+                >
+                </el-pagination>
+            </div> -->
+            
         </div>
         <!-- okr 四象限 -->
         <el-dialog
@@ -126,9 +147,15 @@
                                         
                                         <span slot="reference" class="content">
                                             <span class="taskGrade">
-                                                P{{item.priority}}
+                                                <!-- P{{item.priority}} -->
+                                                <img src="../assets/image/1.png" alt="" v-if="item.priority=='1'" class="priorityIMg">
+                                                <img src="../assets/image/2.png" alt="" v-if="item.priority=='2'"  class="priorityIMg">
+                                                <img src="../assets/image/3.png" alt="" v-if="item.priority=='3'"  class="priorityIMg">
                                             </span> 
-                                            {{item.taskTitle}}
+                                            <span class="taskTitle">
+                                                {{item.taskTitle}}
+                                                <span v-for="(element) in item.remindVOS" :key="element.krId" class="remindSpan">@{{element.name}}</span>
+                                            </span>                                   
                                         </span>                            
                                     </el-popover>
                                 </li>
@@ -160,7 +187,9 @@
                                             :content="'KR:'+ele.krInfo">  
                                             
                                             <span slot="reference" class="content">
-                                                <span class="KR-content">{{ele.krInfo}}</span>
+                                                <span class="KR-content">{{ele.krInfo}}
+                                                    <span v-for="element in ele.remindVOS" :key="element.remindId" class="remindSpan">@{{element.name}}</span>
+                                                </span>
                                             </span>                            
                                         </el-popover>
                                         <!-- <span class="KR-content">{{ele.krInfo}}</span> -->
@@ -188,12 +217,17 @@
                                         width="300"
                                         trigger="hover"
                                         :content="'详细描述:'+item.taskInfo">   
-                                        <span slot="reference">
+                                        <span slot="reference" class="content">
                                             <span class="taskGrade">
-                                                P{{item.priority}}
+                                                <!-- P{{item.priority}} -->
+                                                 <img src="../assets/image/1.png" alt="" v-if="item.priority=='1'" class="priorityIMg">
+                                                <img src="../assets/image/2.png" alt="" v-if="item.priority=='2'"  class="priorityIMg">
+                                                <img src="../assets/image/3.png" alt="" v-if="item.priority=='3'"  class="priorityIMg">
                                             </span> 
-                                            
-                                            {{item.taskTitle}}
+                                            <span class="taskTitle">
+                                                {{item.taskTitle}}
+                                                  <span v-for="(element) in item.remindVOS" :key="element.krId" class="remindSpan">@{{element.name}}</span>
+                                            </span>                                   
                                         </span>                            
                                     </el-popover>
                                     
@@ -250,6 +284,12 @@ import {postAction , getAction} from '@/utils/api/http.js'
 export default {
     data() {
         return {
+            loading:false,
+            totalPage:0,
+            currentPage:1,
+            isLoading:false,
+            nomore:false,
+            follow:false,
             yearValue:undefined,
             yearsOptions:[],
             cycleValue:undefined,
@@ -287,6 +327,28 @@ export default {
     //     }
     // },
     methods: {
+        followHis(item){
+            // this.follow=!this.follow;
+            console.log(item)
+            
+            let status=item.follow?0:1;
+            postAction('/okr/focusInfo/focus',{
+                status,
+                userId:item.object.userId
+            }).then(res=>{
+                console.log(res)
+                if(res.success){
+                    this.list.forEach((ele,index)=>{
+                        if(item.object.userId==ele.object.userId){
+                            this.$set(ele,'follow',!item.follow)
+                        }
+                    })
+                }else{
+                    this.$meaasge.error('取消关注失败,请稍后再试!')
+                }
+
+            })
+        },
         handleClose(done) {
             this.$confirm('确认关闭?')
             .then(_ => {
@@ -317,8 +379,11 @@ export default {
             }
             
         },
-
+        handleCurrentChange(val){
+            this.currentPage=val;
+        },
         getList(){
+            this.loading=true;
             this.isCurrentQuarter=2;
             this.list=[];
             postAction('/okr/okr/getSyncUserListByMemberId',{
@@ -326,23 +391,26 @@ export default {
                 quarter:this.cycleValue,
                 name:this.nameValue
             }).then((res)=>{
-                console.log(res);
+                // console.log(res);
+                 this.loading=false;
                 this.isCurrentQuarter=res.result.isCurrentQuarter;
                 this.list=res.result.list
             })
         },
+        
         getThisOKR(item){
+            console.log(item)
             this.currentData={
                 object:{},
-                krLiat:[]
+                krList:[]
             },
             this.dialogVisible=true;
-            console.log(item,this.isCurrentQuarter);
+            // console.log(item,this.isCurrentQuarter);
             if(this.isCurrentQuarter!=1){
                 this.currentData=item
             }else{
                 postAction('/okr/okr/getOkrInfo',{
-                    userId:item.object.userId
+                    objectId:item.object.id
                 }
                 ).then((res)=>{
                     console.log(res);
@@ -368,12 +436,36 @@ export default {
             }
             
         },
+        // scroll() {
+        //     let scrollTop = document.documentElement.scrollTop||document.body.scrollTop;
+        //     let windowHeight = document.documentElement.clientHeight || document.body.clientHeight;
+        //     let scrollHeight = document.body.scrollHeight;
+        //     console.log(scrollTop+windowHeight,scrollHeight)
+        //     if(scrollTop+windowHeight>=scrollHeight){  //测试浏览器有的时候相加 会出现小数点 这里用 >= 不用 ==
+        //         if(this.page <= this.totalPage) {
+        //             this.getList();
+        //         }
+        //     }
+        // },
+        
+       
     },
+    // created () {
+    //     var that = this;
+    //     window.addEventListener('scroll',this.scroll,true)
+    //     console.log(this.$router)
+    //     this.getList();
+    // },
+    // destroyed () {
+    //     window.removeEventListener('scroll', this.scroll,true)
+    // },
     mounted() {
+        this.loading=true;
         postAction('/okr/okr/getSyncUserListByMemberId',{
             
         }).then((res)=>{
             console.log(res);
+            this.loading=false;
             this.isCurrentQuarter=res.result.isCurrentQuarter;
             this.list=res.result.list;
             this.yearValue=res.result.year;
@@ -381,7 +473,7 @@ export default {
         })
         postAction('/okr/okr/getObjectYear ',{           
         }).then((res)=>{
-            console.log(res);
+            // console.log(res);
             this.yearsOptions=[]
             res.result.forEach((item)=>{
                 this.yearsOptions.push({
@@ -396,7 +488,7 @@ export default {
 
 <style lang="less" scoped>
 .OKRList{
-     max-height: 300px;
+    //  max-height: 300px;
     .topBox{
         height: 41px;
     }
@@ -408,7 +500,7 @@ export default {
         text-align: left;
     }
     .OKRBody{
-        min-height: calc(100% - 121px);
+        // min-height: calc(100% - 121px);
         background: #fff;
         .top-opt{
             padding: 10px 20px;
@@ -438,6 +530,7 @@ export default {
         .listBody{
             display: flex;
             flex-wrap: wrap;
+            overflow: auto;
             .itemBody{
                 width: 25%;                
                 padding: 20px 0;
@@ -521,6 +614,14 @@ export default {
                         line-height: 30px;
                         background-color: #fff;
                         font-size: 12px;
+                        position: relative;
+                        .follow{
+                            width: 20px;
+                            position: absolute;
+                            right: 20px;
+                            top: 16px;
+                            cursor: pointer;
+                        }
                     }
                 }
                 .item:hover{
@@ -528,6 +629,10 @@ export default {
                 }
             }
         }
+        .fenye{
+            padding: 20px 40px  60px;
+            text-align: center;
+        }
     }
     .noListData{
         width: 30%;
@@ -753,22 +858,26 @@ ul,li{
                 }
             }
             .okrbox-list{
+                width: 100%;
                 overflow: auto;
-                max-height: 250px;
+                max-height: 80%;
                 // margin-top: 10px;
                 text-align: left;
                 font-size: 14px;
                 color: #333;
                 box-sizing: border-box;
                 ul{
+                     width: 100%;
                     height: 100%;
                     overflow: auto
                 }
                 li{
-                    height: 20px;
-                    padding: 10px 15px 10px;
+                    width: 100%;
+                    height: 41px;
+                    padding: 8px 15px 8px;
                     line-height: 20px;
                     border-bottom: 1px solid rgb(240, 242, 245);
+                    box-sizing: border-box;
                     cursor: pointer;
                     position: relative;
                     .list-opt{
@@ -787,7 +896,7 @@ ul,li{
                     // }
                     .content{
                         display: inline-block;
-
+                        width: 100%;
                     }
                     .taskGrade{
                         display: inline-block;
@@ -796,9 +905,30 @@ ul,li{
                         border-radius: 50%;
                         text-align: center;
                         box-sizing: border-box;
-                        background-color: turquoise;
+                        // background-color: turquoise;
                         margin-right: 10px;
                     }
+                    .priorityIMg{
+                        width: 25px;
+                        height: 25px;
+                        
+                    }
+                    .taskTitle{
+                        display: inline-block; 
+                        width: 70%; 
+                        overflow: hidden; 
+                        text-overflow: ellipsis;
+                         white-space: nowrap;
+                         height: 25px;
+                         line-height: 25px;
+                        .remindSpan{
+                            color:#2e9cff;
+                            display: inline-block;
+                            margin-right: 3px;
+                            cursor: pointer;
+                        }
+                    }
+                   
                 }
                 li:hover .list-opt{
                     display: flex;
@@ -916,6 +1046,12 @@ ul,li{
                                 height:100%;
                                 line-height: 30px;
                                 padding-left: 45px;
+                                 .remindSpan{
+                                    color:#2e9cff;
+                                    display: inline-block;
+                                    margin-right: 3px;
+                                    cursor: pointer;
+                                }
                             }
                             .KR-opt{
                                 display: inline-block;
@@ -993,6 +1129,11 @@ ul,li{
 </style>
 <style lang="less">
     .taskBody{
+        .el-tooltip__popper.is-dark {
+            background: #303133;
+            color: #FFF;
+            opacity: 0.8;
+        }
         .el-radio.is-bordered.is-checked {
             border-color: #CC9966;
         }

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 681 - 91
src/views/OKRpage.vue


+ 2 - 2
src/views/TransferLocal.vue

@@ -144,14 +144,14 @@ export default {
   },
   mounted() {
     this.$nextTick(() => {
-      console.log(window.location.search)
+      // console.log(window.location.search)
       var data = window.location.search.split('?')[1]
       var arr = data.split('=')
       var json = {}
       json[arr[0]] = arr[1]
       var params = qs.stringify(json)
       postAction('/okr/sys/wxlogin', params).then(res => {
-        console.log(res)
+        // console.log(res)
         if (res.success) {
           this.login(res)
         } else {

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1242 - 0
src/views/myDepart.vue


+ 1 - 1
vue.config.js

@@ -3,7 +3,7 @@ module.exports = {
         port: 3000,
         proxy: {
             "/api": {
-                target: 'http://192.168.1.94:8910', // 要访问的接口域名
+                target: 'http://192.168.1.72:8910', // 要访问的接口域名
                 // target: 'http://okrapi.c-top.com.cn', // 要访问的接口域名
                 ws: true, // 是否启用websockets
                 changeOrigin: true, //开启代理:在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题