Ver Fonte

OKR-项目功能版本

guojy há 1 ano atrás
pai
commit
107eec28d7
36 ficheiros alterados com 987 adições e 736 exclusões
  1. 4 2
      src/components/DateCell.vue
  2. 1 1
      src/components/EmployeeSelector.vue
  3. 6 4
      src/examine/view/examine/examineDetail.vue
  4. 0 2
      src/main.js
  5. 26 7
      src/okr/components/public/KanMilestone.vue
  6. 25 8
      src/okr/components/public/Milestone.vue
  7. 3 2
      src/okr/components/public/Progress.vue
  8. 20 13
      src/okr/components/public/TargetSearch.vue
  9. 25 16
      src/okr/components/public/UpdateProject.vue
  10. 1 0
      src/okr/view/okrHome.vue
  11. 4 2
      src/okr/view/okrHome/messageList.vue
  12. 3 1
      src/okr/view/okrHome/okrBack.vue
  13. 1 0
      src/okr/view/project/addProject.vue
  14. 9 5
      src/okr/view/project/milestoneDetail.vue
  15. 7 8
      src/okr/view/project/projectDetail.vue
  16. 18 8
      src/okr/view/project/projectList.vue
  17. 1 1
      src/okr/view/project/taskList.vue
  18. 2 1
      src/okr/view/target/addTarget.vue
  19. 2 1
      src/okr/view/target/addTask.vue
  20. 1 2
      src/okr/view/target/communication.vue
  21. 2 2
      src/okr/view/target/krDetail.vue
  22. 3 1
      src/okr/view/target/target.vue
  23. 1 1
      src/okr/view/target/targetDetail.vue
  24. 164 53
      src/okr/view/task/task.vue
  25. 21 9
      src/okr/view/task/taskDetail.vue
  26. 2 2
      src/point/view/integral/integral_application.vue
  27. 1 1
      src/point/view/integral/integral_entry_n.vue
  28. 1 1
      src/point/view/integral/my_ranking.vue
  29. 1 1
      src/point/view/integral/rankB.vue
  30. 1 1
      src/utils/axios.js
  31. 1 1
      src/utils/axiosKq.js
  32. 1 1
      src/utils/axiosUser.js
  33. 8 5
      src/view/body/initHome.vue
  34. 31 31
      src/view/system/privacy_agreement.vue
  35. 1 1
      src/view/user/dept.vue
  36. 589 541
      src/view/user/login.vue

+ 4 - 2
src/components/DateCell.vue

@@ -89,8 +89,10 @@ export default {
   },
   watch:{
     show(val){
-      this.minDate1=this.minDate;
-      this.maxDate1=this.maxDate;
+      if(val){
+        this.minDate1=this.minDate;
+        this.maxDate1=this.maxDate;
+      }
     }
   }
 };

+ 1 - 1
src/components/EmployeeSelector.vue

@@ -83,7 +83,7 @@
       <div class="selected_btn" ref="selected_btn">
         <van-button ref="selected_button" style="height: 0.7rem; line-height: 0.7rem;" type="info" @click="confirm">
           确定
-          <template v-if="multi && max * 1 > 0">
+          <template v-if="multi && max * 1 > 0&&can_select_employee">
             ({{ employee_selected_list.length }}/{{ max }})
           </template>
         </van-button>

+ 6 - 4
src/examine/view/examine/examineDetail.vue

@@ -68,7 +68,7 @@
           </van-cell>
         </van-cell-group>
       </template>
-      
+
       <div class="main">
         <div class="flex-box-ce" style="margin-bottom: 0.2rem;">
           <div class="title flex-1">检查记录</div>
@@ -229,6 +229,11 @@ export default {
       }
     }
   },
+  created() {
+    if(this.$route.query.isShow){
+      this.isShowCommunication=true;
+    }
+  },
   activated() {
       if(this.$route.query.id){
         this.id=this.$route.query.id;
@@ -236,9 +241,6 @@ export default {
         this.kan=this.$route.query.kan;
         this.getData();
         this.getList();
-        if(this.$route.query.isShow){
-          this.isShowCommunication=true;
-        }
       }
   },
   methods: {

+ 0 - 2
src/main.js

@@ -46,8 +46,6 @@ Vue.prototype.$returnFh = returnFh
 Vue.prototype.$isWx=getIsWx()
 
 // true为APP打包,false为M端打包
-
-
 Vue.prototype.$isApp = true
 
 

+ 26 - 7
src/okr/components/public/KanMilestone.vue

@@ -5,7 +5,7 @@
           <div class="title flex-1">{{item.name}}</div>
           <van-icon name="edit" class="active-icon" v-if="item.id&&isReturnPJ" @click="updateName(item)"/>
         </div>
-        <div class="list-box" :style="{'max-height':item.show? '2000px':'0px'}">
+        <div class="list-box" :style="{'max-height':item.show? '3000px':'0px'}">
           <div class="flex-box list-item" v-for="(item,index) in item.plans" :key="index" @click="openDetail(item)">
             <van-icon :name="item.icon" class="blue" :class="(item.day<=0&&$moment(item.end_time).format('YYYY-MM-DD')!=$moment().format('YYYY-MM-DD')&&(item.composite_state==8||item.composite_state==3)) ? 'red':''" style="margin-right: 0.2rem;position: relative;" />
             <div class="flex-1">
@@ -25,12 +25,12 @@
         <div class="flex-box-ce item-bottom">
           <div class="blue" @click="addTask(item.id)" v-if="isPstake"><van-icon name="plus" /> 添加任务</div>
           <div class="flex-1"></div>
-          <div class="fontColorC" @click="item.show=!item.show"><van-icon :name="!item.show? 'arrow-down':'arrow-up'" /> {{item.show? '收起':'查看'}}任务</div>
+          <div class="fontColorC" @click="item.show=!item.show"><van-icon :name="!item.show? 'arrow-down':'arrow-up'" /> {{item.show? '收起':'查看'}}任务({{item.plans.length}})</div>
         </div>
       </div>
       <div v-if="milestoneList.length==0" class="dotted-line">暂无看板</div>
 
-      <div style="margin-top: 0.6rem;" v-if="milestoneList.length<10">
+      <div style="margin-top: 0.6rem;" v-if="milestone.length<10&&isReturnPJ">
         <div @click="openAddKb" style="margin: 0 auto;border: 1px solid #f1f1f1;background-color: #ffff;border-radius: 5px;padding: 0.16rem 0;width: 3rem;text-align: center;"><van-icon name="plus" /> 创建新看板</div>
       </div>
       <van-dialog :title="tag_id? '编辑看板':'创建新看板'" v-model="isShowProcess" show-cancel-button :beforeClose="subContent">
@@ -61,6 +61,7 @@
       return {
         userInfo:this.$userInfo(),
         milestoneList:[],
+        milestone:[],
         plans:[],
         dataDetail:{},
         p_id:0,
@@ -148,9 +149,11 @@
         }
         this.$axiosUser('get', '/api/pro/okr/tag/list',data).then(res => {
             let milestones=res.data.data.tags;
+            this.milestone=JSON.parse(JSON.stringify(res.data.data.tags));
             let plans=res.data.data.plans;
             milestones.forEach(item=>{
               item.day=this.$moment(item.end_date).diff(this.$moment().format('YYYY-MM-DD'), 'day')
+              item.show=false;
               if(item.plans.length>0&&item.id){
                 item.plans.forEach((a)=>{
                     a.pName=item.name
@@ -164,12 +167,25 @@
                 a.day=this.$moment(a.end_date).diff(this.$moment().format('YYYY-MM-DD'), 'day');
                 a.icon=taskStatus(a.composite_state).icon
             })
-            if(plans.length>0){
+            // if(plans.length>0){
               milestones.unshift({id:0,plans:plans,name:'默认分组'})
+            // }
+            let milestoneListShowArr=this.milestoneList.map((item)=>{
+              return {id:item.id,show:item.show}
+            });
+            if(milestoneListShowArr.length>0){
+              milestones.forEach((item)=>{
+                milestoneListShowArr.forEach(e=>{
+                  if(e.id==item.id){
+                    item.show=e.show;
+                  }
+                })
+              })
+            }else{
+              milestones.forEach((item)=>{
+                  item.show=false;
+              })
             }
-            milestones.forEach((item)=>{
-                item.show=false;
-            })
             this.$nextTick(()=>{
               this.milestoneList=JSON.parse(JSON.stringify(milestones));
               this.plans=plans;
@@ -186,6 +202,9 @@
           this.getMilestoneList();
         }
     },
+    activated() {
+      this.getMilestoneList();
+    }
   };
 </script>
 

+ 25 - 8
src/okr/components/public/Milestone.vue

@@ -5,7 +5,7 @@
           <div class="title flex-1">{{item.name}}</div>
           <van-icon name="arrow" class="active-icon" v-if="item.id" @click="openMDetail(item)" />
         </div>
-        <div class="list-box" :style="{'max-height':item.show? '2000px':'0px'}">
+        <div class="list-box" :style="{'max-height':item.show? '3000px':'0px'}">
           <div class="flex-box list-item" v-for="(item,index) in item.plans" :key="index" @click="openDetail(item)">
             <van-icon :name="item.icon" class="blue" :class="(item.day<=0&&$moment(item.end_time).format('YYYY-MM-DD')!=$moment().format('YYYY-MM-DD')&&(item.composite_state==8||item.composite_state==3)) ? 'red':''" style="margin-right: 0.2rem;position: relative;" />
             <div class="flex-1">
@@ -25,17 +25,15 @@
         <div class="flex-box-ce item-bottom">
           <div class="blue" @click="addTask(item.id)" v-if="isPstake"><van-icon name="plus" /> 添加任务</div>
           <div class="flex-1"></div>
-          <div class="fontColorC" @click="item.show=!item.show"><van-icon :name="!item.show? 'arrow-down':'arrow-up'" /> {{item.show? '收起':'查看'}}任务</div>
+          <div class="fontColorC" @click="item.show=!item.show"><van-icon :name="!item.show? 'arrow-down':'arrow-up'" /> {{item.show? '收起':'查看'}}任务({{item.plans.length}})</div>
         </div>
       </div>
       <div v-if="milestoneList.length==0" class="dotted-line">暂无里程碑</div>
 
-      <div style="margin-top: 0.6rem;" v-if="isReturnPJ&&milestoneList.length<10">
+      <div style="margin-top: 0.6rem;" v-if="isReturnPJ&&milestones.length<10">
         <div @click="openAddKb" style="margin: 0 auto;border: 1px solid #f1f1f1;background-color: #ffff;border-radius: 5px;padding: 0.16rem 0;width: 3rem;text-align: center;"><van-icon name="plus" /> 创建里程碑</div>
       </div>
 
-
-
       <!-- 里程碑 -->
       <van-popup v-model:show="isShowUpdateTask" round position="bottom" :style="{ height: '90%',background:'#fff' }" @close="isShowUpdateTask=false">
          <div>
@@ -116,6 +114,7 @@
         // 负责人
         selectUser:false,
         selected_user: { dept: [], employee: [] },
+        milestones:[],
       };
     },
     methods: {
@@ -187,8 +186,10 @@
         let data={ project_id:this.p_id}
         this.$axiosUser('get', '/api/pro/okr/project/milestones',data).then(res => {
             let milestones=res.data.data.milestones;
+            this.milestones=JSON.parse(JSON.stringify(res.data.data.milestones));
             let plans=res.data.data.plans;
             milestones.forEach(item=>{
+              item.show=false;
               item.day=this.$moment(item.end_date).diff(this.$moment().format('YYYY-MM-DD'), 'day')
               if(item.plans.length>0&&item.id){
                 item.plans.forEach((a)=>{
@@ -206,9 +207,22 @@
             if(plans.length>0){
               milestones.unshift({id:0,plans:plans,name:'默认分组'})
             }
-            milestones.forEach((item)=>{
-                item.show=false;
-            })
+            let milestoneListShowArr=this.milestoneList.map((item)=>{
+              return {id:item.id,show:item.show}
+            });
+            if(milestoneListShowArr.length>0){
+              milestones.forEach((item)=>{
+                milestoneListShowArr.forEach(e=>{
+                  if(e.id==item.id){
+                    item.show=e.show;
+                  }
+                })
+              })
+            }else{
+              milestones.forEach((item)=>{
+                  item.show=false;
+              })
+            }
             this.$nextTick(()=>{
               this.milestoneList=JSON.parse(JSON.stringify(milestones));
               this.plans=plans;
@@ -225,6 +239,9 @@
           this.getMilestoneList();
         }
     },
+    activated() {
+      this.getMilestoneList();
+    }
   };
 </script>
 

+ 3 - 2
src/okr/components/public/Progress.vue

@@ -8,7 +8,8 @@
           <div class="blue" @click="confirm">确定</div>
         </header>
         <div>
-          <van-field  label="完成度" input-align="right" ref="input" v-model.trim="form.process" :disabled="isOpen" @input="form.process = form.process.replace(/[^\d]/g, '');">
+          <van-field  label="完成度" input-align="right" ref="input" type="number" v-model.trim="form.process" :disabled="isOpen">
+             <!-- @input="form.process = form.process.replace(/[^\d]/g, '');" -->
             <template #right-icon>
               <span>%</span>
             </template>
@@ -125,7 +126,7 @@ export default {
       this.$nextTick(() => {
         this.risk_level=this.progressData.risk_level;
         this.form = {
-          process: Number(this.progressData.process),
+          process: this.progressData.process,
           risk_level: this.progressData.risk_level,
           content: ''
         };

+ 20 - 13
src/okr/components/public/TargetSearch.vue

@@ -52,8 +52,9 @@
             <van-dropdown-item :title="deptDropdownItemTitle" ref="deptDropdownItem">
               <DeptSelectorDropdown @onConfirm="onConfirmDept" />
             </van-dropdown-item>
-            <van-dropdown-item :title="userName2"/>
-            <div @click="activeUser(2)" class="selectUser"></div>
+            <van-dropdown-item v-model="userType" @open="isShowV=true" @close="isShowV=false" :options="status2Arr"/>
+<!--            <van-dropdown-item :title="userName2"/>
+            <div @click="activeUser(2)" class="selectUser"></div> -->
           </van-dropdown-menu>
           <div style="height: calc(100% - 1.86rem);position: relative;">
               <scroller ref="scroller2" :on-refresh="refresh" :on-infinite="infinite" noDataText="没有了噢" :list="projectList">
@@ -66,9 +67,8 @@
                             <van-icon v-if="showSelectType!=2" :name="item.isShow? 'arrow-up':'arrow-down'" style="padding-left: 0.2rem;" @click.stop="openHide(item)"/>
                           </div>
                           <div class="flex-box-ce fontColorC" style="font-size: 0.26rem;">
-                              <span>{{item.year}}年</span>
-                              <span class="border-l-r">{{item.dateStr}}</span>
-                              <span>{{$getEmployeeMapItem(item.owner_id).name}}</span>
+                            <span>{{$getEmployeeMapItem(item.owner_id).name}}</span>
+                            <span class="border-l-r">{{item.start_date}}~{{item.end_date}}</span>
                           </div>
                         </div>
                     </div>
@@ -138,7 +138,7 @@ export default {
       selectUser:false,
       selected_user: { dept: [], employee: [] } ,//传入已选部门
       userName:'全部人员',
-      userName2:'全部人员',
+      userName2:this.$userInfo().name,
       owner_id:'',
 
       belong_type:0,
@@ -150,7 +150,7 @@ export default {
       type:1,
       activeName:'okr',
       projectData:{
-        owner_id:'',
+        owner_id:this.$userInfo().id,
         composite_state:0,
         dept_id:0,
       },
@@ -161,6 +161,12 @@ export default {
         {value: 3,text: '已逾期'},
         {value: 4,text: '已完成'},
       ],
+      status2Arr: [
+        {value: 0,text: '我负责的'},
+        {value: 1,text: '我创建的'},
+      ],
+      userType:0,
+
       page:1,
       page2:1,
       projectList:[],
@@ -168,6 +174,9 @@ export default {
     };
   },
   watch: {
+    userType(){
+      this.pullDown();
+    },
     dataId(val){
       this.pullDown();
     },
@@ -269,8 +278,10 @@ export default {
         dept_id:this.projectData.dept_id,//	否	string	部门id,默认为0
         visible:1,
       }
-      if(this.projectData.owner_id){
-        data.owner_id=this.projectData.owner_id
+      if(this.userType===0){
+        data.owner_id=this.$userInfo().id
+      }else{
+        data.publisher_id=this.$userInfo().id
       }
       this.$axiosUser('get','api/pro/okr/project/list',data).then(res => {
         let list=res.data.data.list;
@@ -289,10 +300,6 @@ export default {
         callback && callback(hasMore);
       })
     },
-
-
-
-
     // 确定
     confirm() {
       this.$emit('confirm', {item:this.selectItme,type:this.type});

+ 25 - 16
src/okr/components/public/UpdateProject.vue

@@ -6,15 +6,15 @@
           <div class="fontColorB" style="font-size: 0.28rem;padding-right: 0.2rem;" v-if="isReturnPJ"><span @click="isUpdate=!isUpdate">{{isUpdate==false? '编辑':'完成'}}</span></div>
       </div>
       <div style="padding: 0 0.24rem;">
-        <div class="flex-box" style="margin-top:0.24rem">
+        <div class="flex-box" style="margin-top:0.24rem" @click="updataActive(1)">
           <div style="font-weight: 600;color:#303133;" class="flex-1">{{projectDetail.name}}</div>
-          <div style="width: 1rem;text-align: right;" v-if="isUpdate" @click="updataActive(1)"><van-icon name="edit" class="active-icon"/></div>
+          <div style="width: 1rem;text-align: right;" v-if="isUpdate"><van-icon name="edit" class="active-icon"/></div>
         </div>
 
-        <div class="describe">
+        <div class="describe" @click="updataActive(2)">
           <div class="flex-box-ce" style="margin: 0;">
             <div class="flex-1">项目描述</div>
-            <div style="width: 1rem;text-align: right;" v-if="isUpdate" @click="updataActive(2)"><van-icon name="edit" class="active-icon"/></div>
+            <div style="width: 1rem;text-align: right;" v-if="isUpdate"><van-icon name="edit" class="active-icon"/></div>
           </div>
           <pre style="margin: 5px 0;" v-if="projectDetail.desc">{{projectDetail.desc}}</pre>
           <div style="margin: 5px 0;" v-else>暂无描述</div>
@@ -22,13 +22,13 @@
 
         <div class="flex-box-ce">
           <div class="label">可见范围</div>
-          <div class="flex-1 fontColorA">{{projectDetail.scope_type==1? '仅项目成员可见':'公开全员可见'}}</div>
-          <van-icon name="arrow" v-if="isUpdate" @click="isShowV=true"/>
+          <div class="flex-1 fontColorA" @click="openSelect">{{projectDetail.scope_type==1? '仅项目成员可见':'公开全员可见'}}</div>
+          <van-icon name="arrow" v-if="isUpdate" @click="openSelect"/>
         </div>
 
         <div class="flex-box-ce">
           <div class="label">起止时间</div>
-          <div class="flex-1 fontColorA">
+          <div class="flex-1 fontColorA" @click="updataActive(3)">
             <span>{{projectDetail.start_date}}~{{projectDetail.end_date}}</span>
             <template v-if="projectDetail.composite_state==3">
               <span v-if="projectDetail.day<0">&nbsp;(逾期<span class="red">{{Math.abs(projectDetail.day)}}</span>天)</span>
@@ -55,13 +55,6 @@
           </div>
         </div>
         <div class="flex-box-ce">
-          <div class="flex-1">
-            <div class="user-title">发布者</div>
-            <div class="flex-box-v" style="text-align: center;width: 1.06rem">
-              <userImage :img_url="projectDetail.p_userInfo.img_url" :user_name="projectDetail.p_userInfo.name" width="0.7rem" height="0.7rem"></userImage>
-              <div style="font-size: 0.26rem;padding: 0.1rem 0;" class="font-flex-word">{{ projectDetail.p_userInfo.name }}</div>
-            </div>
-          </div>
           <div class="flex-1">
             <div class="user-title">负责人</div>
             <div class="flex-box-ce">
@@ -72,6 +65,13 @@
               <div class="zj" v-if="isUpdate" @click="openSelectUser(1)">转交</div>
             </div>
           </div>
+          <div class="flex-1">
+            <div class="user-title">创建人</div>
+            <div class="flex-box-v" style="text-align: center;width: 1.06rem">
+              <userImage :img_url="projectDetail.p_userInfo.img_url" :user_name="projectDetail.p_userInfo.name" width="0.7rem" height="0.7rem"></userImage>
+              <div style="font-size: 0.26rem;padding: 0.1rem 0;" class="font-flex-word">{{ projectDetail.p_userInfo.name }}</div>
+            </div>
+          </div>
         </div>
         <div style="margin-top: 0.24rem;">
           <div class="user-title">参与人员</div>
@@ -90,7 +90,7 @@
           </div>
         </div>
         <div class="flex-box" style="margin-top: 0.24rem;">
-          <div class="label">所属KR</div>
+          <div class="label">关联KR</div>
           <div v-if="projectDetail.relate.length>0" class="flex-1">
               <div v-for="(item,index) in projectDetail.relate" class="flex-box" style="margin-bottom: 0.2rem;">
                 <span class="flex-1 font-flex-word fontColorA" style="margin-right: 0.2rem;max-width: 4.9rem;" @click="openKr(item)"><span class="blue">KR</span>-{{item.kr_name}}</span>
@@ -115,7 +115,7 @@
          </header>
          <div>
             <van-field v-if="updataIndex==1" style="font-size: 0.38rem;" v-model="updateData.name" rows="1" type="textarea" maxlength="30"  placeholder="请填写项目名称(必填)" show-word-limit/>
-            <van-field v-if="updataIndex==2" v-model="updateData.desc" rows="2"  type="textarea" maxlength="200"  placeholder="填写项目描述" show-word-limit/>
+            <van-field v-if="updataIndex==2" v-model="updateData.desc" rows="5"  type="textarea" maxlength="200"  placeholder="填写项目描述" show-word-limit/>
             <template v-if="updataIndex==3">
               <van-cell title="开始时间" is-link :value="updateData.startDateName" @click="openTime(1)" />
               <van-cell title="截止时间" is-link :value="updateData.endDateName" @click="openTime(2)"/>
@@ -242,6 +242,12 @@ export default {
 
   },
   methods: {
+    openSelect(){
+      if(!this.isUpdate){
+        return false
+      }
+      this.isShowV=true;
+    },
     openKr(item){
       this.$router.push({name: 'krDetail', query: {id: item.kr_id}})
     },
@@ -317,6 +323,9 @@ export default {
       }
     },
     updataActive(index){
+      if(!this.isUpdate){
+        return false
+      }
       this.updataIndex=index;
       if(index==1){
         this.updateData.name=this.projectDetail.name;

+ 1 - 0
src/okr/view/okrHome.vue

@@ -166,6 +166,7 @@ export default {
     this.getTargetList();
     this.getTaskList();
     this.getProjectList();
+    console.log(window.sessionStorage.getItem('__VCKEEPALIVE__'))
   },
   methods: {
     getUnitList(){

+ 4 - 2
src/okr/view/okrHome/messageList.vue

@@ -25,7 +25,7 @@
               <div class="backlog_list_tit">{{ item.time }}</div>
               <div v-for="(arr, keys) in item.list" :key="keys" @click="openDetail(arr)" :style="'z-index:' + (item.list.length - keys)" class="performanceList backlog_list">
                   <div class="flex-box">
-                     <span class="flex-1">{{ arr.target_type==1? '目标':arr.target_type==2? 'KR':'任务' }}“{{arr.title}}”,有人提到了你</span>
+                     <span class="flex-1">{{ arr.target_type==1? '目标':arr.target_type==2? 'KR':arr.target_type==3? '任务':'项目' }}“{{arr.title}}”,有人提到了你</span>
                      <van-icon name="arrow" />
                   </div>
               </div>
@@ -73,8 +73,10 @@ export default {
         }else{
           this.$router.push({ name: 'krDetail', query: { id: item.target_id} })
         }
-      } else {
+      } else  if(item.target_type == 3){
         this.$router.push({ name: 'taskDetail', query: { id: item.target_id} })
+      } else  if(item.target_type == 4){
+        this.$router.push({ name:'projectDetail',query:{id:item.target_id}})
       }
     },
     cc (callback) {

+ 3 - 1
src/okr/view/okrHome/okrBack.vue

@@ -73,8 +73,10 @@ export default {
         }else{
           this.$router.push({ name: 'krDetail', query: { id: item.target_id} })
         }
-      } else {
+      } else  if(item.target_type == 3){
         this.$router.push({ name: 'taskDetail', query: { id: item.target_id} })
+      } else  if(item.target_type == 4){
+        this.$router.push({ name:'projectDetail',query:{id:item.target_id}})
       }
     },
     cc (callback) {

+ 1 - 0
src/okr/view/project/addProject.vue

@@ -128,6 +128,7 @@ export default {
         deptName:'',
 
         timeArr: [
+          { name: '今天',value:1,},
           { name: '明天',value:2,},
           { name: '本周',value:3,},
           { name: '下周',value:4,},

+ 9 - 5
src/okr/view/project/milestoneDetail.vue

@@ -10,7 +10,7 @@
           </div>
           <div class="flex-box-ce" style="margin: 0.16rem 0;">
             <div class="progress"><div class="progress-inner" :style="{width:detailData.process>100? '100%':detailData.process+'%'}"></div></div>
-            <span style="padding-left: 0.1rem;font-size: 0.24rem;" class="blue">{{ detailData.process }}%</span>
+            <span style="padding-left: 0.1rem;font-size: 0.24rem;" class="blue">{{ Math.floor(detailData.process) }}%</span>
           </div>
           <div class="flex-box-ce fontColorC" style="font-size: 0.26rem;margin-bottom: 0.16rem;">
             <span style="margin-right: 0.24rem;">{{$getEmployeeMapItem(detailData.owner_id).name}}</span>
@@ -93,7 +93,7 @@ export default {
       detailData:{visible:1},
       isShowbelong:false,
       scopeArr:[
-        {value: 1, name:'编辑',disabled: false},
+        {value: 1,name:'编辑',disabled: false},
         {value: 2,name:'删除',color: '#f56c6c',disabled: false},
       ],
 
@@ -198,9 +198,13 @@ export default {
       this.detailData=JSON.parse(this.$route.query.item);
       this.isReturnPJ=this.$route.query.isReturnPJ;
       this.isPstake=this.$route.query.isPstake;
-
-      this.isOperation=(this.$route.query.isReturnPJ||this.detailData.owner_id==this.$userInfo().id)=='true'? true:false;
-      console.log(this.isOperation)
+      if(this.$route.query.isReturnPJ||this.detailData.owner_id==this.$userInfo().id){
+        this.isOperation=true;
+      }
+      this.scopeArr=[
+        {value: 1,name:'编辑',disabled: false},
+        {value: 2,name:'删除',color: '#f56c6c',disabled: this.$route.query.isReturnPJ? false:true},
+      ];
     }
   },
 };

+ 7 - 8
src/okr/view/project/projectDetail.vue

@@ -60,12 +60,12 @@
                   <div class="fontColorC" style="font-size: 0.24rem;" @click="compileContent(item)" v-if="isReturnPJ"> <van-icon name="edit" /> 编辑</div>
                 </div>
               </div>
-              <div style="text-align: center;margin: 1rem 0;" class="fontColorC" v-if="processList.length==0">目标进展一目了然?赶快更新完成度吧</div>
+              <div style="text-align: center;margin: 1rem 0;" class="fontColorC" v-if="processList.length==0">进展一目了然?赶快更新完成度吧</div>
 
             </div>
           </template>
           <template v-if="tabActive == 3">
-            <van-notice-bar color="#1989fa" background="#ecf9ff" left-icon="info-o">本页面统计项目内的所有任务数(含子任务)</van-notice-bar>
+            <van-notice-bar color="#1989fa" background="#ecf9ff" left-icon="info-o">本页面统计项目内的所有任务数(含子任务)</van-notice-bar>
             <div style="padding: 0.2rem;">
               <div class="tj-box">
                 <div class="tj-title">任务完成度</div>
@@ -88,7 +88,7 @@
                 <div class="tj-title">人员任务统计</div>
                 <div v-for="(item, index) in tableData" :key="index" class="flex-box-ce" style="margin-bottom: 0.2rem;">
                     <div class="clamp flex-1">{{item.name}}</div>
-                    <div class="progress" style="margin: 0 0.2rem;"><div class="progress-inner" :style="{width:item.currentRate>100? '100%':item.currentRate+'%'}"></div></div>
+                    <div class="progress" style="margin: 0 0.2rem;"><div class="progress-inner" :style="{width:item.rate}"></div></div>
                     <div style="width: 1rem;">({{item.finish+'/'+item.total}})</div>
                 </div>
                 <noData v-if="tableData.length==0"></noData>
@@ -96,7 +96,7 @@
             </div>
           </template>
           <template v-if="tabActive == 4">
-              <UpdateProject></UpdateProject>
+              <UpdateProject ref="UpdateProject"></UpdateProject>
           </template>
           <div style="height: 3rem;"></div>
           <footer class="footer">
@@ -280,10 +280,6 @@ export default {
     },
     // 沟通
     openCommunication(){
-      if(!this.isPstake){
-        this.$toast("您不是相关成员!");
-        return false
-      }
       let data={
         item:JSON.stringify(this.projectDetail),
         target_type:4,
@@ -312,6 +308,9 @@ export default {
     activebelong(item){
       if(item.value==1){//编辑
         this.tabActive=4;
+        this.$nextTick(()=>{
+          this.$refs.UpdateProject.isUpdate=true;
+        })
       }else if(item.value==2){//删除
         this.$dialog.confirm({ title:'删除', message: '项目删除后不可恢复!确认要删除吗?'}).then(() => {
           this.$axiosUser('post', '/api/pro/okr/project/d', { project_id: this.p_id }).then(res => {

+ 18 - 8
src/okr/view/project/projectList.vue

@@ -26,14 +26,14 @@
       <template v-if="activeName=='c'||activeName=='d'">
         <div class="flex-box-ce" style="background-color: #fff;margin-bottom: 0.2rem;">
           <van-search style="border-radius: 25px;" class="flex-1" placeholder="请输入关键字" v-model="keyword" @input="keyVal()"/>
-          <div @click="show_dept_selector=true">
-            <span style="font-size: 0.28rem;" class="fontColorC">部门</span>
-            <van-icon name="cluster-o"  class="dept-icon" :class="{isDept:dept_id}"/>
+          <div @click="show_dept_selector=true" class="dept-box flex-box-ce" :class="{isDept:dept_id}">
+            <van-icon name="cluster-o"  class="dept-icon"/>
+            <span style="font-size: 0.28rem;color: #606266;">部门</span>
           </div>
         </div>
       </template>
 
-      <div :class="activeName=='b'? 'scroller2':'scroller'" >
+      <div :class="activeName=='b'? 'scroller2':(activeName=='c'||activeName=='d')? 'scroller3':'scroller'" >
         <scroller ref="scroller" :isInitRefresh="false" :on-refresh="refresh" :on-infinite="infinite" noDataText="没有了噢" :list="projectList">
             <div class="flex-box-ce list-item" v-for="(item, index) in projectList" :key="index">
               <van-circle
@@ -186,7 +186,7 @@ export default {
       this.selectGl = false;
     },
     get_employee_list() {
-      this.$axiosUser('get', '/api/pro/employee/list', { dept_id: this.selectDeptId }, 'v2').then(res => {
+      this.$axiosUser('get', '/api/pro/employee/list', { dept_id: this.selectDeptId,page:1,page_size:1000,include_sub:0, },'v2').then(res => {
         this.userList = res.data.data.list;
         if(this.userList.length>0){
           this.ownerUserInfo=this.userList[0];
@@ -294,6 +294,13 @@ export default {
 </script>
 
 <style scoped lang="less">
+.dept-box{
+  border-radius: 25px;
+  border: 1px solid #f1f1f1;
+  margin-right: 0.2rem;
+  position: relative;
+  padding:0 0.1rem;
+}
 .aite{
     width: 1rem;
     height: 1rem;
@@ -324,12 +331,11 @@ export default {
 .dept-icon{
     width: 0.6rem;
     height: 0.6rem;
-    border: 1px solid rgb(241, 241, 241);
+    // border: 1px solid rgb(241, 241, 241);
     border-radius: 50%;
     font-size: 0.4rem;
     text-align: center;
     line-height: 0.6rem;
-    margin-right: 0.2rem;
     color: #606266;
     position: relative;
 }
@@ -399,7 +405,11 @@ export default {
 }
 .scroller2 {
   position: relative;
-  height: calc(100% - 4.1rem);
+  height: calc(100% - 4.3rem);
+}
+.scroller3 {
+  position: relative;
+  height: calc(100% - 2.2rem);
 }
 /deep/ .van-dropdown-menu__bar{
   box-shadow: 0 0rem 0rem #fff;

+ 1 - 1
src/okr/view/project/taskList.vue

@@ -58,7 +58,7 @@ export default {
       console.log(this.$route)
       if(this.$route.query.p_id){
         this.project_id=this.$route.query.p_id;
-        this.composite_state=this.$route.query.composite_state;
+        this.composite_state=Number(this.$route.query.composite_state);
       }
   },
   activated() {

+ 2 - 1
src/okr/view/target/addTarget.vue

@@ -1,4 +1,4 @@
-<template>
+  <template>
   <div style="height: 100%;">
     <van-nav-bar title="创建目标" left-text="返回" left-arrow @click-left="$route_back" />
     <div class="scroller">
@@ -44,6 +44,7 @@
         <div style="height: 1rem;"></div>
       </scroller>
     </div>
+
     <!-- 添加KR -->
     <AddKr :userId="userId" :name="krName" :weight="Number(weight)" :visible.sync="isShowAddKr" @confirm="confirmAddkr"></AddKr>
     <!-- 对齐目标 -->

+ 2 - 1
src/okr/view/target/addTask.vue

@@ -1,6 +1,6 @@
 <template>
   <div style="height: 100%;">
-    <van-nav-bar title="创建任务" left-text="返回" left-arrow @click-left="$route_back" />
+    <van-nav-bar title="添加任务" left-text="返回" left-arrow @click-left="$route_back" />
     <div class="scroller">
       <scroller :isNeed="isNeed">
         <div>
@@ -194,6 +194,7 @@ export default {
         isShowGl:false,
 
         timeArr: [
+          { name: '今天',value:1,},
           { name: '明天',value:2,},
           { name: '本周',value:3,},
           { name: '下周',value:4,},

+ 1 - 2
src/okr/view/target/communication.vue

@@ -14,7 +14,7 @@
         </div>
       </header>
       <div class="main">
-        <div style="margin-bottom: 0.3rem;font-size: 0.3rem;" class="fontColorC">沟通 <span v-if="feedbackList.length>0">{{feedbackList.length}}</span></div>
+        <div style="margin-bottom: 0.3rem;font-size: 0.3rem;" class="fontColorC" v-if="feedbackList.length>0">沟通 <span>{{feedbackList.length}}</span></div>
         <div class="record" v-if="feedbackList.length > 0">
           <div v-for="(item, index) in feedbackList" :key="index" class="record-list">
             <div class="flex-box-ce record-date fontColorB">
@@ -133,7 +133,6 @@ export default {
   created(){
     if(this.$route.query.item){
       this.detailData=JSON.parse(this.$route.query.item);
-      console.log(this.detailData)
       this.parameter.target_type=this.$route.query.target_type;
       this.parameter.target_id=this.detailData.id;
       this.getList();

+ 2 - 2
src/okr/view/target/krDetail.vue

@@ -93,7 +93,7 @@
                         </div>
                       </div>
                   </template>
-                  <div v-if="item.projects.length==0&&item.plans.length==0" style="text-align: center;margin: 0.2rem 0;font-size: 0.28rem;" class="fontColorC">用“项目/任务”推动目标达成,合理规划安排工作</div>
+                  <div v-if="item.projects.length==0&&item.plans.length==0" style="text-align: center;margin: 0.2rem 0;font-size: 0.28rem;" class="fontColorC">用“任务”推动目标达成,合理规划安排工作</div>
                 </div>
               </div>
             </template>
@@ -441,7 +441,7 @@ export default {
       if(index==1){
         this.vArr=[{value: 1,name: '添加任务'},{value: 2,name: '添加项目'}];
       }else{
-        this.vArr=[{value: 1,name: '绑定任务'},{value: 2,name: '绑定项目'}];
+        this.vArr=[{value: 1,name: '关联任务'},{value: 2,name: '关联项目'}];
       }
       this.isShowV=true;
     },

+ 3 - 1
src/okr/view/target/target.vue

@@ -98,7 +98,7 @@
           </div>
           <div v-if="targetList.length==0" style="text-align: center;margin-top: 2rem;" class="fontColorC">
               <span>未找到相关的目标</span>
-              <div v-if="activeName=='a'" @click="$router.push({name: 'addTarget'})" style="margin: 0 auto;margin-top: 0.8rem;background-color: #26A2FF;color: #fff;border-radius: 25px;width: 2rem;padding: 0.1rem 0;font-size: 0.28rem;">添加目标</div>
+              <div v-if="activeName=='a'&&targetType==1" @click="$router.push({name: 'addTarget'})" style="margin: 0 auto;margin-top: 0.8rem;background-color: #26A2FF;color: #fff;border-radius: 25px;width: 2rem;padding: 0.1rem 0;font-size: 0.28rem;">添加目标</div>
           </div>
         </scroller>
       </div>
@@ -267,6 +267,7 @@ export default {
          if(this.followList.length>0){
            this.follUserInfo=this.followList[0];
          }else{
+           this.follUserInfo={};
            this.pullDown();
          }
       })
@@ -353,6 +354,7 @@ export default {
           params.owner_id=this.follUserInfo.id;
         }else{
           this.targetList=[];
+          callback && callback(hasMore)
           return false
         }
       }else if(this.activeName=='d'){//全公司

+ 1 - 1
src/okr/view/target/targetDetail.vue

@@ -534,7 +534,7 @@ export default {
       if(index==1){
         this.vArr=[{value: 1,name: '添加任务'},{value: 2,name: '添加项目'}];
       }else{
-        this.vArr=[{value: 1,name: '绑定任务'},{value: 2,name: '绑定项目'}];
+        this.vArr=[{value: 1,name: '关联任务'},{value: 2,name: '关联项目'}];
       }
       this.isShowV=true;
     },

+ 164 - 53
src/okr/view/task/task.vue

@@ -1,10 +1,6 @@
 <template>
   <div style="height: 100%;">
-    <van-nav-bar left-text="返回" :title="type==1?'我的计划':type==2? '我的部门计划':'全部计划'"  left-arrow @click-left="$route_back">
-      <div slot="right" @click="selectGl = true" style="color: #fff;">更多</div>
-<!--      <span @click="type=2" v-if="type==1" style="color: #fff;" slot="right">部门</span>
-      <span @click="type=1" v-if="type==2" style="color: #fff;" slot="right">我的</span> -->
-    </van-nav-bar>
+    <van-nav-bar left-text="返回" title="计划表"  left-arrow @click-left="$route_back"></van-nav-bar>
     <div class="all">
       <header class="header">
           <div class="flex-box-ce flex-center-center" @click="isShowTime=true">
@@ -14,31 +10,50 @@
             <van-icon name="arrow-down" class="fontColorC"/>
           </div>
       </header>
+      <van-tabs v-model="tabIndex">
+        <van-tab v-for="(item,index) in tabs" :title="item.label" :name="item.value" :key="index"></van-tab>
+      </van-tabs>
+      <div class="flex-box-ce flex-d-wrap" style="padding:0.2rem;position: relative;">
+        <!-- 状态 -->
+        <div class="search-item2" @click="selectDialog2=true">
+          <span class="clamp" style="max-width: 1.6rem;">{{ returnComposite_state }}</span>
+          <van-icon name="play" class="play" />
+        </div>
+        <!-- 我负责的 -->
+        <div class="search-item2" v-if="tabIndex==1" @click="selectDialog=true">
+          <span class="clamp" style="max-width: 1.6rem;">{{ optionsFw[scope_type-1].name }}</span>
+          <van-icon name="play" class="play" />
+        </div>
+        <template v-if="tabIndex==2">
+          <!-- 部门 -->
+          <div class="search-item2" @click="selectDialog3=true">
+            <span class="clamp" style="max-width: 1.6rem;">{{ returnDept }}</span>
+            <van-icon name="play" class="play" />
+          </div>
 
-      <van-dropdown-menu style="font-size: 0.28rem;">
-        <van-dropdown-item v-model="composite_state" :options="taskStatus" />
-        <van-dropdown-item v-model="scope_type" v-if="type==1" :options="optionsFw"/>
-        <template v-if="type==2">
-          <van-dropdown-item v-model="dept_id" :options="userDepts" />
-          <van-dropdown-item v-model="owner_id" :options="userList" />
-        </template>
-        <template v-if="type==3">
-          <van-dropdown-item :title="userName"></van-dropdown-item>
-          <div class="userName" @click="selectUser=true"></div>
+          <!-- 人员 -->
+          <div class="search-item2" @click="selectDialog4=true">
+            <span class="clamp" style="max-width: 1.6rem;">{{ returnName }}</span>
+            <van-icon name="play" class="play" />
+          </div>
         </template>
-        <template v-if="type==1||type==3">
-          <van-dropdown-item/>
-          <div class="selectUser red" style="text-align: center;">
-            <span v-if="type==1&&start_date2==end_date2&&start_date2==$moment().format('YYYY-MM-DD')&&total2>0" @click="$router.push({path:'overdueTask'})">逾期任务({{total2}})</span>
+        <template v-if="tabIndex==3">
+          <!-- 人员 -->
+          <div class="search-item2" @click="selectUser=true">
+            <span class="clamp" style="max-width: 1.6rem;">{{ userName }}</span>
+            <van-icon name="play" class="play" />
           </div>
         </template>
-      </van-dropdown-menu>
 
+        <div class="selectUser red" style="text-align: center;" v-if="tabIndex==1">
+          <span v-if="start_date2==end_date2&&start_date2==$moment().format('YYYY-MM-DD')&&total2>0" @click="$router.push({path:'overdueTask'})">逾期任务({{total2}})</span>
+        </div>
+      </div>
       <div class="scroller">
         <scroller ref="scroller" :isInitRefresh="false" :on-refresh="refresh" :on-infinite="infinite" noDataText="没有了噢" :list="taskList">
-            <div class="flex-box list-item" v-for="(item,index) in taskList" :key="index" @click="openDetail(item)">
+            <div class="flex-box list-item" v-for="(item,index) in taskList" :key="index">
               <van-icon :name="item.icon" class="blue" :class="(item.day<=0&&$moment(item.end_date).format('YYYY-MM-DD')!=$moment().format('YYYY-MM-DD')&&(item.composite_state==8||item.composite_state==3)) ? 'red':''" style="margin-right: 0.2rem;position: relative;" />
-              <div class="flex-1">
+              <div class="flex-1" @click="openDetail(item)">
                 <div class="clamp2" style="font-size: 0.28rem;">{{item.name}}</div>
                 <div style="padding: 5px 0;" class="flex-box-ce">
                     <div class="progress"><div class="progress-inner" :style="{width:item.process>100? '100%':item.process+'%'}"></div></div>
@@ -93,12 +108,45 @@
       :selected.sync="selected_data"
     ></EmployeeSelector>
 
-    <!-- 选择范围 -->
-    <van-dialog v-model="selectGl" title="" width="300" :show-confirm-button="false" closeOnClickOverlay>
-      <van-radio-group v-model="type">
-        <div v-for="(item, index) in selectGlType" :key="index">
+    <!-- 我负责的 -->
+    <van-dialog v-model="selectDialog"  width="300" :show-confirm-button="false" closeOnClickOverlay>
+      <van-radio-group v-model="scope_type">
+        <div v-for="(item, index) in optionsFw" :key="index">
+          <van-radio :name="item.value" style="margin:.3rem 0 .3rem .4rem;font-size:.3rem" icon-size="16px">
+            <span style="margin-left:.3rem">{{ item.name }}</span>
+          </van-radio>
+        </div>
+      </van-radio-group>
+    </van-dialog>
+
+    <!-- 状态 -->
+    <van-dialog v-model="selectDialog2"  width="300" :show-confirm-button="false" closeOnClickOverlay>
+      <van-radio-group v-model="composite_state">
+        <div v-for="(item, index) in taskStatus" :key="index">
+          <van-radio :name="item.value" style="margin:.3rem 0 .3rem .4rem;font-size:.3rem" icon-size="16px">
+            <span style="margin-left:.3rem">{{ item.name }}</span>
+          </van-radio>
+        </div>
+      </van-radio-group>
+    </van-dialog>
+
+    <!-- 部门 -->
+    <van-dialog v-model="selectDialog3"  width="300" :show-confirm-button="false" closeOnClickOverlay>
+      <van-radio-group v-model="dept_id">
+        <div v-for="(item, index) in userDepts" :key="index">
           <van-radio :name="item.value" style="margin:.3rem 0 .3rem .4rem;font-size:.3rem" icon-size="16px">
-            <span style="margin-left:.3rem">{{ item.label }}</span>
+            <span style="margin-left:.3rem">{{ item.name }}</span>
+          </van-radio>
+        </div>
+      </van-radio-group>
+    </van-dialog>
+
+    <!-- 人员 -->
+    <van-dialog v-model="selectDialog4"  width="300" :show-confirm-button="false" closeOnClickOverlay>
+      <van-radio-group v-model="owner_id">
+        <div v-for="(item, index) in userList" :key="index">
+          <van-radio :name="item.value" style="margin:.3rem 0 .3rem .4rem;font-size:.3rem" icon-size="16px">
+            <span style="margin-left:.3rem">{{ item.name }}</span>
           </van-radio>
         </div>
       </van-radio-group>
@@ -122,7 +170,7 @@ export default {
     return {
       total2:0,
       page:1,
-      type:1, //1 我的计划 2部门成员计划
+
       scope_type: 1,
       composite_state:0,
       taskStatus:taskStatusAll,
@@ -155,31 +203,52 @@ export default {
       userName: '全部人员',
       selectUser: false,
       selected_data: { dept: [], employee: [] } ,//传入已选部门
-      selectGlType: [// 选择时间选项
+      tabs: [// 选择时间选项
         { value: 1, label: '我的计划' },
         { value: 2, label: '我的部门计划' },
       ],
-      selectGl:false,
+      tabIndex:1, //1 我的计划 2部门成员计划
+
       dept_id:0,
       userDepts:[],
       userList:[{name: '全部人员',value:0,text:'全部人员'}],
       owner_id:0,
+
+      selectDialog:false,
+      selectDialog2:false,
+      selectDialog3:false,
+      selectDialog4:false,
+      ass:0
     };
   },
-  created() {
-    if(this.$userInfo().is_okr_manager==1){
-      this.selectGlType=[
-        { value: 1, label: '我的计划' },
-        { value: 2, label: '我的部门计划' },
-        { value: 3, label: '全部计划' },
-      ];
+  computed:{
+    returnComposite_state(){
+      let name='';
+      this.taskStatus.forEach(item=>{
+        if(item.value==this.composite_state){
+          name=item.name;
+        }
+      })
+      return name
+    },
+    returnDept(){
+      let name='';
+      this.userDepts.forEach(item=>{
+        if(item.value==this.dept_id){
+          name=item.name;
+        }
+      })
+      return name
+    },
+    returnName(){
+      let name='';
+      this.userList.forEach(item=>{
+        if(item.value==this.owner_id){
+          name=item.name;
+        }
+      })
+      return name
     }
-    this.getAllTask();
-    this.pullDown();
-    this.get_department_list();
-  },
-  activated() {
-    this.pullDown();
   },
   watch:{
     isShowTime(val){
@@ -195,13 +264,12 @@ export default {
     scope_type(){
       this.pullDown();
     },
-    type(val){
+    tabIndex(val){
       if(val==2||val==3){
         this.employee_id=0;
         this.userName= '全部人员';
         this.selected_data={ dept: [], employee: [] }; //传入已选部门
       }
-      this.selectGl=false;
       this.pullDown();
     },
     dept_id(val){
@@ -287,6 +355,10 @@ export default {
       this.pullDown()
     },
     pullDown(){
+      this.selectDialog=false;
+      this.selectDialog2=false;
+      this.selectDialog3=false;
+      this.selectDialog4=false;
       setTimeout(() => {
         this.$refs.scroller.triggerPullToRefresh();
       }, 50);
@@ -353,9 +425,9 @@ export default {
         sort_e:1
       }
       let url='/api/pro/okr/plan/list';
-      if(this.type == 1){//我的计划
+      if(this.tabIndex == 1){//我的计划
 
-      }else if(this.type == 2){ //部门成员
+      }else if(this.tabIndex == 2){ //部门成员
         url='api/pro/okr/plan/list/dept'
         delete data.scope_type;
         if(this.owner_id){
@@ -395,10 +467,52 @@ export default {
       this.getPastTask(true,done)
     },
   },
+  created() {
+    if(this.$userInfo().is_okr_manager==1){
+      this.tabs=[
+        { value: 1, label: '我的计划' },
+        { value: 2, label: '我的部门计划' },
+        { value: 3, label: '全部计划' },
+      ];
+    }
+    this.getAllTask();
+    this.pullDown();
+    this.get_department_list();
+  },
+  activated() {
+    this.pullDown();
+  },
 };
 </script>
 
 <style scoped lang="less">
+.play{
+  transform: rotate(90deg);
+  color: #dcdee0;
+  font-size: 0.26rem;
+}
+.search-item2{
+  padding: 0.06rem 0.1rem;
+  background-color: #fff;
+  color: #89919F;
+  text-align: center;
+  margin-right: 0.2rem;
+  // margin-bottom: 0.2rem;
+  border-radius: 0.06rem;
+  font-size: 0.3rem;
+  border-radius: 25px;font-size: 0.28rem;
+  display: flex;
+  align-items: center;
+  -webkit-align-items: center;
+  -webkit-box-align: center;
+}
+.search-item2 span{
+  display: inline-block;
+}
+.searchActive{
+  color: #26A2FF;
+  background-color: #E9F0FD;
+}
 .progress {
   border-radius: 100px;
   background-color: #ebeef5;
@@ -443,7 +557,7 @@ export default {
 .list-item{
   margin: 0.2rem;
   background-color: #fff;
-  margin-bottom: 0rem;
+  margin-top: 0rem;
   padding: 0.2rem;
   border-radius: 3px;
 }
@@ -469,7 +583,7 @@ export default {
 }
 .scroller {
   position: relative;
-  height: calc(100% - 1.96rem);
+  height: calc(100% - 2.8rem);
 }
 /deep/ .van-dropdown-menu__bar{
   box-shadow: 0 0rem 0rem #fff;
@@ -485,13 +599,10 @@ export default {
 .selectUser{
   position: absolute;
   width: 33%;
-  height: 0.96rem;
-  line-height: 0.96rem;
   right: 0;
-  top: 0;
+  // top: 0px;
   z-index: 12;
   font-size: 0.3rem;
-  background-color: #fff;
 }
 .userName{
   position: absolute;

+ 21 - 9
src/okr/view/task/taskDetail.vue

@@ -5,7 +5,7 @@
       <template v-if="taskDetail.visible==1">
         <header class="header">
           <div class="flex-box">
-            <div class="flex-1" style="font-weight: 600;padding-right: 0.2rem;">
+            <div class="flex-1" style="font-weight: 600;padding-right: 0.2rem;word-break:break-all;">
               <span class="status">{{taskStatus(taskDetail.composite_state).name}}</span>
               {{taskDetail.name}}</div>
             <van-icon name="weapp-nav" class="fontColorB weapp" @click="isShowbelong = true" v-if="taskDetail.id"/>
@@ -167,27 +167,39 @@
                 <div class="label">所属KR/项目</div>
 
                 <div v-if="taskDetail.main.kr_id" class="flex-1">
-                    <div v-if="isUpdate" class="flex-box" style="margin-top: 0;">
-                        <span class="blue flex-1 clamp2" style="margin-right: 0.2rem;max-width: 4.9rem;" @click="openGlKr(1)">KR-{{taskDetail.main.kr_name}}</span>
+                    <div v-if="isUpdate" class="flex-box-ce" style="margin-top: 0;">
+                        <div @click="openGlKr(1)" style="margin-right: 0.2rem;max-width: 4.9rem;">
+                          <div class="blue flex-1 clamp">O -&nbsp;{{taskDetail.main.o_name}}</div>
+                          <div class="blue flex-1 clamp">KR -&nbsp;{{taskDetail.main.kr_name}}</div>
+                        </div>
                         <van-icon name="clear" @click="relieveKr(1)"/>
                     </div>
-                    <span class="fontColorA" v-else><span class="blue">KR</span>-{{taskDetail.main.kr_name}}</span>
+                    <div class="flex-1 fontColorA" v-else>
+                      <div class="clamp">O -&nbsp;{{taskDetail.main.o_name}}</div>
+                      <div class="clamp">KR -&nbsp;{{taskDetail.main.kr_name}}</div>
+                    </div>
                 </div>
 
                 <div v-else-if="taskDetail.main.milestone_id" class="flex-1">
-                    <div v-if="isUpdate" class="flex-box" style="margin-top: 0;">
-                        <span class="blue flex-1 clamp2" style="margin-right: 0.2rem;max-width: 4.9rem;" @click="openGlKr(1)">里程碑-{{taskDetail.main.milestone_name}}</span>
+                    <div v-if="isUpdate" class="flex-box-ce" style="margin-top: 0;">
+                        <div @click="openGlKr(1)" style="margin-right: 0.2rem;max-width: 4.9rem;">
+                          <div class="blue flex-1 clamp">项目 -&nbsp;{{taskDetail.main.project_name}}</div>
+                          <div class="blue flex-1 clamp">里程碑 -&nbsp;{{taskDetail.main.milestone_name}}</div>
+                        </div>
                         <van-icon name="clear" @click="relieveKr(5)"/>
                     </div>
-                    <span class="fontColorA" v-else><span class="blue">里程碑</span>-{{taskDetail.main.milestone_name}}</span>
+                    <div class="flex-1 fontColorA" v-else style="margin-right: 0.2rem;max-width: 5.1rem;">
+                      <div class="clamp">项目 -&nbsp;{{taskDetail.main.project_name}}</div>
+                      <div class="clamp">里程碑 -&nbsp;{{taskDetail.main.milestone_name}}</div>
+                    </div>
                 </div>
 
                 <div v-else-if="taskDetail.main.project_id" class="flex-1">
                     <div v-if="isUpdate" class="flex-box" style="margin-top: 0;">
-                        <span class="blue flex-1 clamp2" style="margin-right: 0.2rem;max-width: 4.9rem;" @click="openGlKr(1)">项目-{{taskDetail.main.project_name}}</span>
+                        <span class="blue flex-1 clamp2" style="margin-right: 0.2rem;max-width: 4.9rem;" @click="openGlKr(1)">项目&nbsp;{{taskDetail.main.project_name}}</span>
                         <van-icon name="clear" @click="relieveKr(4)"/>
                     </div>
-                    <span class="fontColorA" v-else><span class="blue">项目</span>-{{taskDetail.main.project_name}}</span>
+                    <span class="fontColorA" v-else><span class="blue">项目</span>&nbsp;{{taskDetail.main.project_name}}</span>
                 </div>
 
                 <div v-else class="flex-1">

+ 2 - 2
src/point/view/integral/integral_application.vue

@@ -57,7 +57,7 @@
             </van-cell>
 
             <!--发生时间  -->
-            <DateCell required  title="发生时间"  name="日期"  :maxDate="maxDate" v-model="item.event_time"></DateCell>
+            <DateCell required  title="发生时间"  name="日期"  v-model="item.event_time"></DateCell>
             <!--选择递交审批人  -->
             <div>
               <van-cell v-if="change_reviewer" is-link required title="审批人" class="noInput" :value="userName" ></van-cell>
@@ -172,7 +172,7 @@ export default {
 
       itemRule:[],//规则数组
       rule_switch:true,
-      maxDate: new Date(),
+      maxDate: new Date(2050, 12, 30),
 
       // 长连接结果
       results: [], //提交的返回结果集合

+ 1 - 1
src/point/view/integral/integral_entry_n.vue

@@ -187,7 +187,7 @@ export default {
 
       employee_list: [],
       isCreator: this.$userInfo().is_creator,
-      maxDate: new Date(),
+      maxDate: new Date(2050, 12, 30),
 
       // 长连接结果
       results: [], //提交的返回结果集合

+ 1 - 1
src/point/view/integral/my_ranking.vue

@@ -11,7 +11,7 @@
           <van-cell-group v-for="(item,index) in data" :key="index" style="margin-top: 0rem;margin-bottom: 0.2rem;">
             <van-cell center>
               <template #title>
-                <span class="custom-title">{{item.group_name}}</span>
+                <span class="custom-title">{{item.group_name=='累计总分排名'? '累计B分排名':item.group_name}}</span>
               </template>
               <template #right-icon>
                  <!-- <div class="ranking_num">第  <span>{{item.rank}}</span>  名</div> -->

+ 1 - 1
src/point/view/integral/rankB.vue

@@ -142,7 +142,7 @@ export default {
   // 数据
   data () {
     return {
-      title: '累计分排名',
+      title: '累计B分排名',
       list: [],
       filter: {
         page: 1,

+ 1 - 1
src/utils/axios.js

@@ -19,7 +19,7 @@ let url = '';
 const request = axios.create({
   baseURL: process.env.BASE_API, //
   // baseURL: 'https://oa.g107.com',
-  timeout: 10000,
+  timeout: 20000,
   headers: {
     'Content-Type': 'application/x-www-form-urlencoded',
     'pl': pl

+ 1 - 1
src/utils/axiosKq.js

@@ -19,7 +19,7 @@ let url = '';
 const service = axios.create({
   baseURL: process.env.BASE_API_KQ, // api的base_url
   // baseURL: 'https://ad.g107.com',
-  timeout: 10000,
+  timeout: 20000,
   headers: {
     'Content-Type': 'application/x-www-form-urlencoded',
     'pl': pl

+ 1 - 1
src/utils/axiosUser.js

@@ -19,7 +19,7 @@ let url = '';
 const service = axios.create({
   baseURL: process.env.BASE_API,
   // baseURL:'https://oa.g107.com',
-  timeout: 10000,
+  timeout: 20000,
   headers: {
     'Content-Type': 'application/x-www-form-urlencoded',
     'pl': pl

+ 8 - 5
src/view/body/initHome.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="html-box">
       <van-nav-bar class="left-text-bold" left-text="首页">
-       <template slot="right"><van-icon v-if="is_app" name="scan" @click="$router.push({ name: 'scanqr' })"></van-icon></template>
+       <template slot="right"><van-icon v-if="is_app" class="icon-box"  name="scan" @click="$router.push({ name: 'scanqr' })"></van-icon></template>
       </van-nav-bar>
       <div class="flex-box-ce" style="padding: 0.16rem 0.32rem;background-color: #FFFAE5;font-size: 0.28rem;" @click="openUrl" v-if="ggData.name">
         <van-icon name="bullhorn-o" />
@@ -214,9 +214,9 @@
       getggList(){
         this.$axiosUser('get', '/api/pro/information/list/page',{page:1,page_size:1}).then(res => {
           this.ggData = res.data.data.list[0]||{};
-          this.$nextTick(()=>{
-            this.initShepherd();
-          })
+          // this.$nextTick(()=>{
+          //   this.initShepherd();
+          // })
         });
       },
       init(str){
@@ -264,6 +264,9 @@
 </script>
 
 <style lang="scss" scoped>
+  .icon-box{
+    font-size: 0.4rem;
+  }
   /deep/ .shepherd-has-title .shepherd-content .shepherd-header {
       background: #e6e6e6;
       padding: 0.24rem;
@@ -321,7 +324,7 @@
     max-width: 1.4rem;
     padding: 0 0.08rem;
     color: #646566;
-    font-size: .28rem;
+    font-size: .32rem;
     line-height: .88rem;
     height: 100%;
     cursor: pointer;

+ 31 - 31
src/view/system/privacy_agreement.vue

@@ -4,13 +4,13 @@
     <div class="login-box">
       <scroller>
         <div class="center">
-          <h4 class="fontColorA">功道云隐私政策</h4>
+          <h4 class="fontColorA">功道云积分制隐私政策</h4>
           <div class="fu-text">发布日期:2020年6月6日</div>
           <div class="fu-text">更新日期:2022年9月27日</div>
           <div class="privacy_agreement">
             <p>欢迎您使用我们的产品和服务!我们深知个人信息对您的重要性,您的信赖对我们非常重要,我们
               将严格遵守法律法规要求采取相应的安全保护措施,致力于保护您的个人信息安全可控。基于此,功道
-              云服务提供者(或简称“我们”)制定本《功道云隐私政策》(下称“本政策”/“本隐私政策”),帮助您
+              云服务提供者(或简称“我们”)制定本《功道云积分制隐私政策》(下称“本政策”/“本隐私政策”),帮助您
               充分了解在您使用我们产品和服务的过程中,我们会如何收集、使用、共享、存储和保护您的个人信息
               以及您可以如何管理您的个人信息,以便您更好地作出适当的选择。在您开始使用我们的产品和服务前,
               请您务必先仔细阅读和理解本政策,特别应重点阅读我们以粗体/粗体下划线标识的条款,确保您充分理
@@ -40,12 +40,12 @@
             <div class="title2">(—)我们如何收集您的信息</div>
             <p>我们会出于本政策所述的以下目的,收集和使用您的个人信息:</p>
 
-            <div class="title3">1.帮助您成为功道云用户</div>
-            <p>成为功道云用户,以便我们为您提供相应的服务,包括设置企业通讯录等功能,<span class="strong2">您需要提供手机号码、姓名、职称、性别、企业名称、邮箱等基本信息、</span>并创建功道云账号和密码。如您需实现多方通话功能,则需要您授权我们访问您的手机通讯录。如果您仅需使用浏览功道云应用的基本功能以及介绍,您不需要注册成为我们的会员及提供上述信息。
+            <div class="title3">1.帮助您成为功道云积分制用户</div>
+            <p>成为功道云积分制用户,以便我们为您提供相应的服务,包括设置企业通讯录等功能,<span class="strong2">您需要提供手机号码、姓名、职称、性别、企业名称、邮箱等基本信息、</span>并创建功道云积分制账号和密码。如您需实现多方通话功能,则需要您授权我们访问您的手机通讯录。如果您仅需使用浏览功道云积分制应用的基本功能以及介绍,您不需要注册成为我们的会员及提供上述信息。
             </p>
-            <p>如您需要通过使用功道云以实现考勤定位打卡、审批、积分申请、公告、PK等协同功能,您需要提供以下额外资料补全账号信息,以便我们给您提供功道云产品的协同功能:<span class="strong2">您的职位、主营行业、邮箱、公司名等。</span>但如果您不提供这些信息,将会影响到您使用应用的产品功能,例如自行添加企业的员工信息,但不会影响使用功道云基本功能以及浏览服务介绍。
+            <p>如您需要通过使用功道云积分制以实现考勤定位打卡、审批、积分申请、公告、PK等协同功能,您需要提供以下额外资料补全账号信息,以便我们给您提供功道云积分制产品的协同功能:<span class="strong2">您的职位、主营行业、邮箱、公司名等。</span>但如果您不提供这些信息,将会影响到您使用应用的产品功能,例如自行添加企业的员工信息,但不会影响使用功道云积分制基本功能以及浏览服务介绍。
             </p>
-            <p>成为功道云用户后,客户可以对个人信息做修改,操作入径: <span class="strong2">[手机端我的-点击名字或头像], 如昵称、电话、生日、职位等。</span></p>
+            <p>成为功道云积分制用户后,客户可以对个人信息做修改,操作入径: <span class="strong2">[手机端我的-点击名字或头像], 如昵称、电话、生日、职位等。</span></p>
             <p style="margin-top:5px;margin-right:0;margin-bottom:10px;margin-left:0;text-indent:28px;line-height:21px">
               <span style="font-family:Calibri;font-size:16px"><span style="font-family:宋体">个人信息列表</span></span>
             </p>
@@ -75,7 +75,7 @@
             <div class="center2">使用场景<span>应用第一次安装启动时</span></div>
 
             <div class="title6">位置信息</div>
-            <div class="center2">使用目的<span>使用功道云以实现智能考勤、审批、签到、打卡等功能</span></div>
+            <div class="center2">使用目的<span>使用功道云积分制以实现智能考勤、审批、签到、打卡等功能</span></div>
             <div class="center2">使用场景<span>使用APP过程中</span></div>
             </p>
 
@@ -140,7 +140,7 @@
 
             <div class="title4">1)您向我们提供的信息</div>
             <p>
-              在服务使用过程中,您可以对功道云产品及服务的体验问题反馈,帮助我们更好地了解您使用我们产品或服务的体验和需求,改善我们产品或服务。您可以通过功道云为自己或他人订购产品或服务,您需要提供该实际订购人的前述个人信息。向我们提供该实际订购人的前述个人信息之前,您需确保您已经取得其授权同意。若前述个人不同意,我们将不对该个人可能造成的侵权承当相应法律责任。
+              在服务使用过程中,您可以对功道云积分制产品及服务的体验问题反馈,帮助我们更好地了解您使用我们产品或服务的体验和需求,改善我们产品或服务。您可以通过功道云积分制为自己或他人订购产品或服务,您需要提供该实际订购人的前述个人信息。向我们提供该实际订购人的前述个人信息之前,您需确保您已经取得其授权同意。若前述个人不同意,我们将不对该个人可能造成的侵权承当相应法律责任。
             </p>
 
             <div class="title4">2)我们在您使用服务过程中收集的信息</div>
@@ -165,13 +165,13 @@
             </p>
             <div class="title3">4.其他用途</div>
             <p>我们将基于本政策未载明的其他特定目的收集您的信息时,会事先征求您的同意。
-              功道云收集及使用上述信息的目的是为了更好地经营功道云产品和服务,
-              并且会通过包括但不限于通过<span class="strong2">网站通知、电子邮件、电话或短信息等方式通知,</span>功道云不会查看或者使用您通过功道云服务存储的任何业务数据。<span class="strong2">如我们停止运营功道云产品或服务,我们将及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,对所持有的个人信息进行删除或匿名化处理。</span></p>
+              功道云积分制收集及使用上述信息的目的是为了更好地经营功道云积分制产品和服务,
+              并且会通过包括但不限于通过<span class="strong2">网站通知、电子邮件、电话或短信息等方式通知,</span>功道云积分制不会查看或者使用您通过功道云积分制服务存储的任何业务数据。<span class="strong2">如我们停止运营功道云积分制产品或服务,我们将及时停止收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,对所持有的个人信息进行删除或匿名化处理。</span></p>
 
             <div class="title2">(二)我们如何使用您的信息</div>
             <p>收集您的信息是为了向您提供服务及提升服务质量,为了实现这一目的,我们会把您的信息用于下列用途:</p>
             <div class="centers">
-              <div>1.向您提供您使用的功道云产品或服务,并维护、改进、优化这些服务及服务体验;</div>
+              <div>1.向您提供您使用的功道云积分制产品或服务,并维护、改进、优化这些服务及服务体验;</div>
               <div>2.为预防、发现、调查欺诈、侵权、危害安全、
                 非法或违反与我们或与我们关联公司的协议、政策或规则的行为,保护您以及其他用户或公众,我们或我们关联公司的合法权益,我们可能使用或整合您的用户信息、服务使用信息、设备信息、日志信息以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息,
                 来综合判断您账户及交易风险、进行身份验证、 检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施;</div>
@@ -179,38 +179,38 @@
             </div>
 
             <div class="title">二、我们如何使用 Cookie 和同类技术</div>
-            <p>为使您获得更轻松的访问体验,您使用功道云产品或服务时,<span class="strong2">我们可能会通过采用各种技术收集和存储您访问功道云服务的相关数据,在您访问或再次访问功道云服务时,我们能识别您的身份,并通过分析数据为您提供更好更多的服务。</span>包括使用小型数据文件识别您的身份,这么做是为了解您的使用习惯,帮您省去重复输入账户信息的步骤,或者帮助判断您的账户安全。<span class="strong2">这些数据文件可能是 Cookie、Flash Cookie , 或您的浏览器或关联应用程序提供的其他本地存储(统称\"Cookie”) 。</span></p>
-            <p>请您理解,我们的某些服务只能通过使用 cookie 才可得到实现。如果您的浏览器或浏览器附加服务允许, 您可以修改对 cookie 的接受程度或者拒绝功道云的cookie,但拒绝功道云的 cookie
-              在某些情况下您可能无法使用依赖于 cookies 的功道云服务的部分功能。</p>
+            <p>为使您获得更轻松的访问体验,您使用功道云积分制产品或服务时,<span class="strong2">我们可能会通过采用各种技术收集和存储您访问功道云积分制服务的相关数据,在您访问或再次访问功道云积分制服务时,我们能识别您的身份,并通过分析数据为您提供更好更多的服务。</span>包括使用小型数据文件识别您的身份,这么做是为了解您的使用习惯,帮您省去重复输入账户信息的步骤,或者帮助判断您的账户安全。<span class="strong2">这些数据文件可能是 Cookie、Flash Cookie , 或您的浏览器或关联应用程序提供的其他本地存储(统称\"Cookie”) 。</span></p>
+            <p>请您理解,我们的某些服务只能通过使用 cookie 才可得到实现。如果您的浏览器或浏览器附加服务允许, 您可以修改对 cookie 的接受程度或者拒绝功道云积分制的cookie,但拒绝功道云积分制的 cookie
+              在某些情况下您可能无法使用依赖于 cookies 的功道云积分制服务的部分功能。</p>
             <p>网页上常会包含一些电子图像,称为“单像素 GIF 文件\"或“网络 beacon”,它可以帮助网站计算浏览网页的用户或访问某些 cookie 。<span class="strong2">我们会通过网络
                 beacon 收集您浏览网页活动信息,例如您访问的页面地址、您先前访问的援引页面的位址、您停留在页面的时间、 您的浏览环境以及显示设定等。</span></p>
 
             <div class="title">三、我们如何共享、转让、公开披露您的信息</div>
 
-            <div class="title2">(一)共享我们不会与功道云服务提供者以外的公司、组织和个人共享您的个人信息,但以下情况除外:</div>
+            <div class="title2">(一)共享我们不会与功道云积分制服务提供者以外的公司、组织和个人共享您的个人信息,但以下情况除外:</div>
             <div class="title3">1.<span class="strong2">在获取明确同意的情况下共享</span>:获得您的明确同意后,我们会与其他方共享您的个人信息。</div>
             <div class="title3">2.<span class="strong2">在法定情形下的共享</span>:我们可能会根据法律法规规定、诉讼争议解决需要,或按行政、司法机关依法提出的要求,对外共享您的个人信息。</div>
             <div class="title3">3.在您被他人投诉侵犯知识产权或其他合法权利时,需要向投诉人披露您的必要资料,以便进行投诉 处理的。</div>
-            <div class="title3">4.<span class="strong2">为方便你和通讯录好友之间相互找到,你在开启通讯录匹配的时候,系统会将通讯录中的手机号进行高强度的加密算法处理后,将相应的特征码进行匹配,并将有匹配关系的用户展示给你。</span>功道云不会保留您通讯录中的任何可识别的信息,使用到的您通讯录中的手机号码数据,会先经过高强度的加密算法进 行处理,并通过处理后的特征码实现匹配。</div>
-            <div class="title3">5.<span class="strong2">与关联公司间共享</span>:为便于我们基于关联账号 共同向您提供服务,保护功道云关联公司或其他用户或公众的人身财产安全免遭侵害,您的个人信息可能会与我们的关联公司共享。我们只会共享必要的个人信息(如为便于您使用功道云账号使用我们关联公司产品或服务,</span>我们会向 联公司共享您必要的账号信息),如果我们共享您的个人敏感信息或关联公司改变个人信息的使用及处理目的,将再次征求您的授权同意。</div>
+            <div class="title3">4.<span class="strong2">为方便你和通讯录好友之间相互找到,你在开启通讯录匹配的时候,系统会将通讯录中的手机号进行高强度的加密算法处理后,将相应的特征码进行匹配,并将有匹配关系的用户展示给你。</span>功道云积分制不会保留您通讯录中的任何可识别的信息,使用到的您通讯录中的手机号码数据,会先经过高强度的加密算法进 行处理,并通过处理后的特征码实现匹配。</div>
+            <div class="title3">5.<span class="strong2">与关联公司间共享</span>:为便于我们基于关联账号 共同向您提供服务,保护功道云积分制关联公司或其他用户或公众的人身财产安全免遭侵害,您的个人信息可能会与我们的关联公司共享。我们只会共享必要的个人信息(如为便于您使用功道云积分制账号使用我们关联公司产品或服务,</span>我们会向 联公司共享您必要的账号信息),如果我们共享您的个人敏感信息或关联公司改变个人信息的使用及处理目的,将再次征求您的授权同意。</div>
             <div class="title3">6.<span class="strong2">与授权合作伙伴共享</span>:仅为实现本隐私政策中声明的目的,<span class="strong2">我们的某些服务将由我们和授权合作伙伴共同提供。我们可能会与合作伙伴共享您的某些个人信息,以提供更好的客户服务和用户体验。</span></div>
             <div class="title3">7.涉及嵌入第三方代码、插件传输个人信息的情形逐项举例:</div>
             <div class="centers">
               <div>
                 (1)腾讯移动分析SDK应用目的或场景:用于统计、分析数据,提供基础反作弊能力、设备应用性能监控服务收集及共享个人信息的类型/范围:设备识别信息(含设备标识符、iOS广告标识符、IP地址、互联网服务提供商及网络状态)、IMSI、安装应用列表、浏览器、会话启动/停止时间我们仅会出于合法、正当、必要、
-                特定、明确的目的共享您的个人信息,并且只会共享 提供服务所必要的个人信息。我们的合作伙伴无权将 共享的个人信息用于与产品或服务无关的其他用途。功道云服务含有到其他网站的链接。除法律另有
-                规定外,功道云对其他网站的隐私保护措施不负任何 责任。我们可能在任何需要的时候增加商业伙伴或共 用品牌的网站,但是提供给他们的将仅是综合信息, 我们将不会公开您的身份。</div>
+                特定、明确的目的共享您的个人信息,并且只会共享 提供服务所必要的个人信息。我们的合作伙伴无权将 共享的个人信息用于与产品或服务无关的其他用途。功道云积分制服务含有到其他网站的链接。除法律另有
+                规定外,功道云积分制对其他网站的隐私保护措施不负任何 责任。我们可能在任何需要的时候增加商业伙伴或共 用品牌的网站,但是提供给他们的将仅是综合信息, 我们将不会公开您的身份。</div>
             </div>
 
             <div class="title2">(二)转让</div>
             <p><span class="strong2">我们不会将您的个人信息转让给任何公司、组织 和个人,但以下情况除外:在获取明确同意的情况下转让:获得您的明确同
-                意后,我们会向其他方转让您的个人信息。</span>在功道云服务提供者发生合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如 涉及到个人信息转让,我们会要求新的持有您个人信
+                意后,我们会向其他方转让您的个人信息。</span>在功道云积分制服务提供者发生合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如 涉及到个人信息转让,我们会要求新的持有您个人信
               息的公司、组织继续受本政策的约束,否则我们将要 求该公司、组织和个人重新向您征求授权同意。</p>
 
             <div class="title2">(三)公开披露</div>
             <p>我们仅会在以下情况下,公开披露您的个人信 息:</p>
-            <p>获得您明确同意或基于您的主动选择,我们可能会公开披露您的个人信息﹔如果我们确定您出现违反法律法规或严重违反功 道云相关协议规则的情况,或为保护功道云及其关联 公司用户或公众的人身财产安全免遭侵害,我们可能
-              依据法律法规或功道云相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及 功道云已对您采取的措施。</p>
+            <p>获得您明确同意或基于您的主动选择,我们可能会公开披露您的个人信息﹔如果我们确定您出现违反法律法规或严重违反功 道云相关协议规则的情况,或为保护功道云积分制及其关联 公司用户或公众的人身财产安全免遭侵害,我们可能
+              依据法律法规或功道云积分制相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及 功道云积分制已对您采取的措施。</p>
 
             <div class="title2">(四)共享、转让、公开披露个人信息时事先征 得授权同意的例外</div>
             <p>以下情形中,共享、转让、公开披露您的个人信 息无需事先征得您的授权同意:</p>
@@ -225,7 +225,7 @@
             <div class="title">四、我们如何保护您的信息</div>
             <p>我们会采取各种预防措施来保护您的个人信息, 以保障您的个人信息免遭丢失、盗用和误用,以及被 擅自取阅、披露、更改或销毁。为确保您个人信息的 安全,我们有严格的信息安全规定和流程,并有专门
               的信息安全团队在公司内部严格执行上述措施。</p>
-            <p>功道云有行业先进的以数据为核心,围绕数据生 命周期进行的数据安全管理体系,从组织建设、制度 设计、人员管理、产品技术等方面多维度提升整个系 统的安全性。</p>
+            <p>功道云积分制有行业先进的以数据为核心,围绕数据生 命周期进行的数据安全管理体系,从组织建设、制度 设计、人员管理、产品技术等方面多维度提升整个系 统的安全性。</p>
             <p>我们会采取合理可行的措施,尽力避免收集无关 的个人信息,并在限于达成本政策所述目的所需的期 限内保留您的个人信息,除非需要延长保留期限或在 法律的允许期限内。</p>
             <p>在不幸发生个人信息安全事件后,我们将按照法 律法规的要求<span class="strong2">【并最迟不迟于 30 个自然日内】</span>向您告知: 安全事件的基本情况和可能的影响、我们已采取
               或将要采取的处置措施、您可自主防范和降低风险的 建议、对您的补救措施等。<span class="strong2">事件相关情况我们将以邮 件、信函、电话、推送通知等方式告知您,</span>难以逐一
@@ -235,11 +235,11 @@
             <div class="title">五、未成年人保护</div>
             <p>我们重视未成年人的信息保护,如您为未成年人 的,建议您请您的父母或监护人仔细阅读本隐私权政 策, 并在征得您的父母或监护人同意的前提下使用我 们的服务或向我们提供信息。对于经父母或监护人同
               意使用我们的产品或服务而收集未成年人个人信息的 情况,我们只会在法律法规允许,父母或监护人明确 同意或者保护未成年人所必要的情况下使用,共享, 转让或披露此信息。我们将根据国家相关法律法规及
-              本《功道云隐私政策》的规定保护未成年人的个人信 息。</p>
+              本《功道云积分制隐私政策》的规定保护未成年人的个人信 息。</p>
 
             <div class="title">六、您的个人信息如何在全球范围转移</div>
-            <p>原则上,我们在中华人民共和国境内运营中收集 和产生的个人信息,存储在中华人民共和国境内。就 中华人民共和国境外功道云用户使用功道云产品及服
-              务过程中产生的个人信息,您同意回传存储在中国境内的服务器上,否则您无法使用现有功道云的产品及 服务。在此类情况下,我们会确保您的个人信息得到在中华人民共和国境内足够同等的保护。</p>
+            <p>原则上,我们在中华人民共和国境内运营中收集 和产生的个人信息,存储在中华人民共和国境内。就 中华人民共和国境外功道云积分制用户使用功道云积分制产品及服
+              务过程中产生的个人信息,您同意回传存储在中国境内的服务器上,否则您无法使用现有功道云积分制的产品及 服务。在此类情况下,我们会确保您的个人信息得到在中华人民共和国境内足够同等的保护。</p>
 
             <p>关于账户注销</p>
             <p><span class="strong2">在遵循相关法律、法规及标准的情况下,您有权访问、更正、删除您的个人信息以及注销账户 (您可以进入APP-我的-个人信息-账号管理-更多
@@ -249,8 +249,8 @@
 
             <div class="title">七、本政策如何更新</div>
             <p>我们的隐私政策可能变更。</p>
-            <p>未经您明确同意我们不会限制您按照本隐私政策 所应享有的权利。我们会在功道云官方主页(链接: https://www.intesys.cms.g107.com/)上公告发布对本隐 私政策所做的任何变更。</p>
-            <p>对于重大变更,我们还会提供更为显著的通知(包括我们会通过功道云公示的方式进行意见征集、 公告通知甚至向您提供弹窗提示)。</p>
+            <p>未经您明确同意我们不会限制您按照本隐私政策 所应享有的权利。我们会在功道云积分制官方主页(链接: https://www.intesys.cms.g107.com/)上公告发布对本隐 私政策所做的任何变更。</p>
+            <p>对于重大变更,我们还会提供更为显著的通知(包括我们会通过功道云积分制公示的方式进行意见征集、 公告通知甚至向您提供弹窗提示)。</p>
             <p>本政策所指的重大变更包括但不限于:</p>
             <div class="title3">1.我们的服务模式发生重大变化。如处理用户信 息的目的、用户信息的使用方式等;</div>
             <div class="title3">2.我们在控制权、组织架构等方面发生重大变 化。如业务调整、破产并购等引起的所有者变更等;</div>
@@ -259,9 +259,9 @@
             <div class="title3">5.用户信息安全影响评估报告表明存在高风险 时。</div>
 
             <div class="title">八、如何联系我们</div>
-            <p> 如果您对功道云的隐私保护政策或数据处理有任 何疑问、意见或建议,可以通过[7*12 小时客服热线(400-6877-880) ]与我们联系,我们邮寄联系方式 如下:</p>
-            <p>广东功道云数字科技有限公司</p>
-            <p>联系部门:功道云用户运营中心</p>
+            <p> 如果您对功道云积分制的隐私保护政策或数据处理有任 何疑问、意见或建议,可以通过[7*12 小时客服热线(400-6877-880) ]与我们联系,我们邮寄联系方式 如下:</p>
+            <p>广东功道云积分制数字科技有限公司</p>
+            <p>联系部门:功道云积分制用户运营中心</p>
             <p>地址:广东省东莞市万江街道东江之星商业中心18栋写字楼4103</p>
             <p>邮编:523000电子邮箱:32223173@qq.com</p>
             <p>一般情况下,我们将在收到您相关联系信息后三 十天内回复。</p>

+ 1 - 1
src/view/user/dept.vue

@@ -2,7 +2,7 @@
   <div class="dept_box" style="background-color: rgb(245, 245, 245);height: 100%;">
     <van-nav-bar :title="title" left-text="返回" @click-left="routeBack()" left-arrow>
       <template slot="right">
-        <span v-if="formdata.name" class="van-nav-bar__text" @click="save_btn">保存</span>
+        <span  class="van-nav-bar__text" @click="save_btn">保存</span>
       </template>
     </van-nav-bar>
     <div class="body_com has_header">

+ 589 - 541
src/view/user/login.vue

@@ -8,78 +8,48 @@
             <icon name="login_logo_bg" class="login_logo_bg"></icon>
           </div>
           <div style="height: 1rem;"></div>
-          <div class="login_logo"><icon name="logo" class="app_logn"></icon></div>
+          <div class="login_logo">
+            <icon name="logo" class="app_logn"></icon>
+          </div>
           <div class="setp1">
             <van-cell-group style="margin-top:0.3rem;">
-              <van-field
-                class="tel"
-                left-icon="logo"
-                label-class="hidden"
-                label=""
-                type="Number"
-                v-model="formData.username"
-                placeholder="手机号"
-                clearable
-                style="color:#515151;caret-color:#26A2FF;"
-                name="手机号码"
-                v-validate="'required|phone'"
-              >
+              <van-field class="tel" left-icon="logo" label-class="hidden" label="" type="Number"
+                v-model="formData.username" placeholder="手机号" clearable style="color:#515151;caret-color:#26A2FF;"
+                name="手机号码" v-validate="'required|phone'">
                 <template slot="left-icon">
                   <icon name="tel" class="login_tel"></icon>
                 </template>
               </van-field>
 
-              <van-field
-                class="psw"
-                label-class="hidden"
-                left-icon="logo"
-                clearable
-                label=""
-                type="password"
-                v-model="formData.password"
-                placeholder="密码"
-                name="密码"
-                v-validate="'required|alpha_dash|min:6'"
-                style="color:#515151;caret-color:#26A2FF;"
-              >
-                >
-                <template slot="left-icon">
-                  <icon name="pwd" class="login_pwd"></icon>
-                </template>
-              </van-field>
-              <van-field
-                class="psw"
-                label-class="hidden"
-                left-icon="logo"
-                v-show="false"
-                label=""
-                type="password"
-                v-model="formData.password"
-                placeholder="密码"
-                name="密码"
-                v-validate="'required|alpha_dash|min:6'"
-                style="color:#515151;caret-color:#26A2FF;"
-              >
-                >
+              <van-field class="psw" label-class="hidden" left-icon="logo" clearable type="password" v-model="formData.password" placeholder="密码" name="密码" v-validate="'required|alpha_dash|min:6'"  style="color:#515151;caret-color:#26A2FF;">
                 <template slot="left-icon">
                   <icon name="pwd" class="login_pwd"></icon>
                 </template>
               </van-field>
+
             </van-cell-group>
           </div>
 
           <div style="padding:0 0.32rem">
-            <van-button class="login_button" color="#228bf8"  size="large" :disabled="!next_btn_enable" @click="sendLogin" type="info">登录</van-button>
+            <van-button class="login_button" color="#228bf8" size="large" :disabled="!next_btn_enable"
+              @click="sendLogin" type="info">登录</van-button>
           </div>
           <div style="padding:0.2rem 0.32rem 0.2rem;" class="reg_link_box">
             <van-row>
-              <van-col span="12"><div class="blue" @click="openUrl(1)">找回密码</div></van-col>
-              <van-col span="12" style="text-align: right;"><div @click="openUrl(2)">注册免费试用</div></van-col>
+              <van-col span="12">
+                <div class="blue" @click="openUrl(1)">找回密码</div>
+              </van-col>
+              <van-col span="12" style="text-align: right;">
+                <div @click="openUrl(2)">注册免费试用</div>
+              </van-col>
             </van-row>
           </div>
-          <div style="text-align: center; padding:0 0.32rem;letter-spacing: 0.01rem" v-if="(auths.length > 0&&isAndroid)||$isWx">
+          <div style="text-align: center; padding:0 0.32rem;letter-spacing: 0.01rem"
+            v-if="(auths.length > 0&&isAndroid)||$isWx">
             <van-divider>快捷登录</van-divider>
-            <div style="display: inline-block;" @click="doWeixinLogin"><icon name="weixindenglu" style="width:1.2rem;"></icon></div>
+            <div style="display: inline-block;" @click="doWeixinLogin">
+              <icon name="weixindenglu" style="width:1.2rem;"></icon>
+            </div>
           </div>
         </div>
         <div class="footer flex-box-ce flex-center-center" v-if="!$isWx">
@@ -114,10 +84,10 @@
     <!-- 微信登录 -->
     <van-popup v-model="isShowSelect" class="popup-all">
       <div style="position: relative;">
-        <div style="position: absolute;top:16px;right:16px" @click="isShowSelect=false"><van-icon name="cross"/></div>
+        <div style="position: absolute;top:16px;right:16px" @click="isShowSelect=false"><van-icon name="cross" /></div>
         <div class="contentBox">
           <div class="">欢迎使用功道云!</div>
-          <p>请选择以下进入方式,如已有登录账号<br/>请先绑定账号再进入</p>
+          <p>请选择以下进入方式,如已有登录账号<br />请先绑定账号再进入</p>
         </div>
         <div class="btns" style="padding-bottom: 16px;">
           <div class="bdBtn" @click="$router.push({ name: 'bindingPhone', query: { secret: wo_token } })">绑定已有账号</div>
@@ -130,10 +100,13 @@
       <div style="padding: 0.3rem;">
         <div class="flex-box-ce" style="margin-bottom: 0.24rem;">
           <div style="font-size: 0.4rem;font-weight: 700;" class="flex-1 black">服务协议和隐私政策</div>
-          <van-icon name="cross" @click="isShowDialog=false" class="fontColorC"  style="font-size: 0.3rem;position: relative;top: -0.1rem;right: -0.1rem;"/>
+          <van-icon name="cross" @click="isShowDialog=false" class="fontColorC"
+            style="font-size: 0.3rem;position: relative;top: -0.1rem;right: -0.1rem;" />
         </div>
         <div class="fontColorC">
-          为了更好地保障你的合法权益,使用前请阅读并同意功道云<span style="color:#28a2f1" @click="$router.push({ name: 'user_agreement' })">《服务协议》</span>&<span style="color:#28a2f1" @click="$router.push({ name: 'privacy_agreement' })">《隐私政策》</span>
+          为了更好地保障你的合法权益,使用前请阅读并同意功道云<span style="color:#28a2f1"
+            @click="$router.push({ name: 'user_agreement' })">《服务协议》</span>&<span style="color:#28a2f1"
+            @click="$router.push({ name: 'privacy_agreement' })">《隐私政策》</span>
         </div>
       </div>
     </van-dialog>
@@ -141,527 +114,602 @@
 </template>
 
 <script>
-import { setToken, returnJSEncrypt } from '@/utils/auth';
-import axios from 'axios';
-import qs from 'qs';
-import Vue from 'vue';
-import { Divider } from 'vant';
-Vue.use(Divider);
-export default {
-  name: 'login',
-  data() {
-    return {
-      input_focus: false,
-      next_btn_enable: false,
-      isAndroid:this.$getCache('isAndroid'),
-      formData: {
-        username: '',
-        password: ''
-      },
-      aweixin: null,
-      auths: [],
-
-      index: 0,
-      // 微信登录
-      isShowSelect: false,
-      // 隐私相关
-      isYsShow: false,
-      showYs: false,
-      wo_token:'',
-      isShowDialog:false,
-      // wo_token:'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOm51bGwsImlhdCI6MTY0MjI0MDQ3NywiZXhwIjoxNjQ0ODMyNDc3LCJuYmYiOjE2NDIyNDA0NzcsImp0aSI6ImtlZmVxZ09yMVZYWEVNZmwiLCJzdWIiOjgsInBydiI6IjAzMDBhNTQ5YWI4ZjcwMmNkYTgzMjMxYTQxMzMyZWNjYmRlOWRmOGYiLCJyb2xlIjoid2VjaGF0X29wZW5fdXNlciJ9.SRt2d8-J3FXQ0UFU27csIiGOJvOSxzQSoDMV-LpE3ZM' //微信登录token
-    };
-  },
-  created() {
-    let that = this;
-    document.body.addEventListener('blur', function(e) {
-      setTimeout(() => {
-        e.target.parentNode.parentNode.parentNode.classList.remove('field-focus');
-        that.input_focus = false;
-      }, 100);
-    },true);
-    document.body.addEventListener('focus', function(e) {
-      e.target.parentNode.parentNode.parentNode.classList.add('field-focus');
-      setTimeout(() => {
-        that.input_focus = true;
-      }, 100);
-    }, true);
-    this.$store.commit('SET_USERINFO', {}); // 清空人员信息
-    this.$store.commit('SET_USERID', 0);
-    // alert(`$isWx${this.$isWx}`)
-    if(this.$isWx){
-       this.doWeixinLogin();
-       return false
-    }
-    if (window.plus) {
-      this.hei = plus.navigator.getStatusbarHeight();
-      this.getServiceOauth();
-    }
-  },
-  mounted() {
-    this.$removeCache('account')
-  },
-  watch: {
-    formData: {
-      handler(val, oldVal) {
-        if (val.username != '' && val.password != '') {
-          this.next_btn_enable = true;
-        } else {
-          this.next_btn_enable = false;
-        }
-      },
-      deep: true
-    }
-  },
-  methods: {
-    confirmDialog(){
-      this.isShowDialog=true;
-      this.isYsShow=true
-    },
-    wxLogin() {
-      let pl = 'a';
-      if (window.plus) {
-        if (navigator.userAgent.indexOf('Android') > 0) {
-          pl = 'a';
-        } else {
-          pl = 'i';
-        }
-      }
-      axios({
-        method: 'post',
-        url: process.env.BASE_API + '/api/pro/wo/create',
-        headers: {
-          'Content-Type': 'application/x-www-form-urlencoded',
-          pl: pl,
-          'A-TOKEN': this.wo_token
-        }
-      }).then(res => {
-        if (res.data.code == 1) {
-          this.$setCache('account', res.data.data.account);
-          localStorage.setItem('a-token-temp', res.data.data.token); // 保存平台账号登录的token
-          this.registrationExperience(); //进入体验账号
-        } else {
-          this.$toast(res.data.msg);
-        }
-      });
+  import {
+    setToken,
+    returnJSEncrypt
+  } from '@/utils/auth';
+  import axios from 'axios';
+  import qs from 'qs';
+  import Vue from 'vue';
+  import {
+    Divider
+  } from 'vant';
+  Vue.use(Divider);
+  export default {
+    name: 'login',
+    data() {
+      return {
+        input_focus: false,
+        next_btn_enable: false,
+        isAndroid: this.$getCache('isAndroid'),
+        formData: {
+          username: '',
+          password: ''
+        },
+        aweixin: null,
+        auths: [],
+
+        index: 0,
+        // 微信登录
+        isShowSelect: false,
+        // 隐私相关
+        isYsShow: false,
+        showYs: false,
+        wo_token: '',
+        isShowDialog: false,
+        // wo_token:'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOm51bGwsImlhdCI6MTY0MjI0MDQ3NywiZXhwIjoxNjQ0ODMyNDc3LCJuYmYiOjE2NDIyNDA0NzcsImp0aSI6ImtlZmVxZ09yMVZYWEVNZmwiLCJzdWIiOjgsInBydiI6IjAzMDBhNTQ5YWI4ZjcwMmNkYTgzMjMxYTQxMzMyZWNjYmRlOWRmOGYiLCJyb2xlIjoid2VjaGF0X29wZW5fdXNlciJ9.SRt2d8-J3FXQ0UFU27csIiGOJvOSxzQSoDMV-LpE3ZM' //微信登录token
+      };
     },
-    openUrl(index) {
-      if(!this.isLogin()){
+    created() {
+      let that = this;
+      document.body.addEventListener('blur', function(e) {
+        setTimeout(() => {
+          e.target.parentNode.parentNode.parentNode.classList.remove('field-focus');
+          that.input_focus = false;
+        }, 100);
+      }, true);
+      document.body.addEventListener('focus', function(e) {
+        e.target.parentNode.parentNode.parentNode.classList.add('field-focus');
+        setTimeout(() => {
+          that.input_focus = true;
+        }, 100);
+      }, true);
+      this.$store.commit('SET_USERINFO', {}); // 清空人员信息
+      this.$store.commit('SET_USERID', 0);
+      // alert(`$isWx${this.$isWx}`)
+      if (this.$isWx) {
+        this.doWeixinLogin();
         return false
       }
-      if (index == 1) {
-        this.$router.push({ name: 'forget_pwd' });
-      } else {
-        this.$router.push({ name: 'reg' });
+      if (window.plus) {
+        this.hei = plus.navigator.getStatusbarHeight();
+        this.getServiceOauth();
       }
     },
-    openHome() {
-      setTimeout(() => {
-        window.location.href = window.location.href.split('#')[0];
-      }, 100);
-    },
-    isLogin(){
-      if (!this.isYsShow&&process.env.NODE_ENV=='production') {
-        this.isShowDialog=true;
-        return false;
-      }else{
-        return true;
-      }
+    mounted() {
+      this.$removeCache('account')
     },
-    // 判断是否获取微信登录认证
-    getServiceOauth() {
-      var that = this;
-      if (window.plus) {
-        plus.oauth.getServices(function(services) {
-          that.auths = services;
-          for (let i in services) {
-            if (services[i].id == 'weixin') {
-              that.aweixin = services[i];
-            }
+    watch: {
+      formData: {
+        handler(val, oldVal) {
+          if (val.username != '' && val.password != '') {
+            this.next_btn_enable = true;
+          } else {
+            this.next_btn_enable = false;
           }
-        });
+        },
+        deep: true
       }
     },
-    doWeixinLogin() {
-      if(this.$isWx){
-        if(this.isAndroid){
-          window.open(process.env.VUE_APP_WXURL,'_blank');
-        }else{
-          window.location.href = process.env.VUE_APP_WXURL
+    methods: {
+      confirmDialog() {
+        this.isShowDialog = true;
+        this.isYsShow = true
+      },
+      wxLogin() {
+        let pl = 'a';
+        if (window.plus) {
+          if (navigator.userAgent.indexOf('Android') > 0) {
+            pl = 'a';
+          } else {
+            pl = 'i';
+          }
         }
-        return false
-      }
-      let that = this;
-      if (window.plus&&this.isLogin()) {
-        if (this.aweixin == null) {
-          plus.nativeUI.alert('当前环境不支持微信登录');
-          return;
+        axios({
+          method: 'post',
+          url: process.env.BASE_API + '/api/pro/wo/create',
+          headers: {
+            'Content-Type': 'application/x-www-form-urlencoded',
+            pl: pl,
+            'A-TOKEN': this.wo_token
+          }
+        }).then(res => {
+          if (res.data.code == 1) {
+            this.$setCache('account', res.data.data.account);
+            localStorage.setItem('a-token-temp', res.data.data.token); // 保存平台账号登录的token
+            this.registrationExperience(); //进入体验账号
+          } else {
+            this.$toast(res.data.msg);
+          }
+        });
+      },
+      openUrl(index) {
+        if (!this.isLogin()) {
+          return false
         }
-        this.aweixin.authorize(
-          function(e) {
-            that.WeixinLogin(e.code);
-          },
-          function(e) {
-            if (e.code == '-1002') {
-              plus.nativeUI.alert('请先安装微信客户端');
-            }
-          },
-          { scope: 'snsapi_userinfo', state: 'authorize test', appid: 'wx84f9a9b3ce29f450' }
-        );
-      }
-    },
-    sendLogin() {
-      if(!this.isLogin()){
-        return false
-      }
-      this.$validator.validate().then(result => {
-        if (!result) {
-          this.$notify({ type: 'danger', message: this.$validator.errors.items[0].msg });
+        if (index == 1) {
+          this.$router.push({
+            name: 'forget_pwd'
+          });
         } else {
-          this.$toast.loading({
-            mask: true,
-            message: '正在登录...'
+          this.$router.push({
+            name: 'reg'
           });
-          this.$store.dispatch('login', { tel: this.formData.username, password: this.formData.password }).then(res => {
-              if (res.code == 1) {
-                localStorage.setItem('a-token-temp', res.data.token); // 保存平台账号登录的token
-                this.openUrl2(res.data.account_site, res.data.invitation_wait_count);
-              } else {
-                this.$toast.fail({
-                  message: res.msg,
-                  duration: 1000
-                });
-              }
-            })
-            .finally(() => {
-              this.$toast.clear();
-            });
         }
-      });
-    },
-    // 直接进入,跳过选择行业与公司,体验账户专用
-    registrationExperience() {
-      this.$router.replace({name:'create_company'})
-    },
-    WeixinLogin(code) {
-      this.$toast.loading({
-        mask: true,
-        message: '正在登录...'
-      });
-      let pl = 'a';
-      if (window.plus) {
-        if (navigator.userAgent.indexOf('Android') > 0) {
-          pl = 'a';
+      },
+      openHome() {
+        setTimeout(() => {
+          window.location.href = window.location.href.split('#')[0];
+        }, 100);
+      },
+      isLogin() {
+        if (!this.isYsShow && process.env.NODE_ENV == 'production') {
+          this.isShowDialog = true;
+          return false;
         } else {
-          pl = 'i';
+          return true;
         }
-      }
-      let data = {
-        code: code,
-      };
-      axios({
-        method: 'post',
-        url: process.env.BASE_API + '/api/pro/wo/code',
-        data: qs.stringify({ data: returnJSEncrypt(data) }),
-        headers: {
-          'Content-Type': 'application/x-www-form-urlencoded',
-          pl: pl
+      },
+      // 判断是否获取微信登录认证
+      getServiceOauth() {
+        var that = this;
+        if (window.plus) {
+          plus.oauth.getServices(function(services) {
+            that.auths = services;
+            for (let i in services) {
+              if (services[i].id == 'weixin') {
+                that.aweixin = services[i];
+              }
+            }
+          });
         }
-      }).then(res => {
-        if (res.data.code == 1) {
-          this.wo_token = res.data.data.wo_token;
-          this.wxSelect();
-        } else {
-          this.$toast(res.data.msg);
+      },
+      doWeixinLogin() {
+        if (this.$isWx) {
+          if (this.isAndroid) {
+            window.open(process.env.VUE_APP_WXURL, '_blank');
+          } else {
+            window.location.href = process.env.VUE_APP_WXURL
+          }
+          return false
         }
-      });
-    },
-    wxSelect() {
-      let pl = 'a';
-      if (window.plus) {
-        if (navigator.userAgent.indexOf('Android') > 0) {
-          pl = 'a';
-        } else {
-          pl = 'i';
+        let that = this;
+        if (window.plus && this.isLogin()) {
+          if (this.aweixin == null) {
+            plus.nativeUI.alert('当前环境不支持微信登录');
+            return;
+          }
+          this.aweixin.authorize(
+            function(e) {
+              that.WeixinLogin(e.code);
+            },
+            function(e) {
+              if (e.code == '-1002') {
+                plus.nativeUI.alert('请先安装微信客户端');
+              }
+            }, {
+              scope: 'snsapi_userinfo',
+              state: 'authorize test',
+              appid: 'wx84f9a9b3ce29f450'
+            }
+          );
         }
-      }
-      axios({
-        method: 'get',
-        url: process.env.BASE_API + '/api/pro/wo/oui',
-        headers: {
-          'Content-Type': 'application/x-www-form-urlencoded',
-          pl: pl,
-          'A-TOKEN': this.wo_token
+      },
+      sendLogin() {
+        if (!this.isLogin()) {
+          return false
         }
-      }).then(res => {
-        if (res.data.code == 1) {
-          this.$setCache('account', res.data.data.account);
-          if (res.data.data.account_id !== 0) {
-            localStorage.setItem('a-token-temp', res.data.data.token); // 保存平台账号登录的token
-            // 已绑定平台账号
-            this.openUrl2(res.data.data.account_site, res.data.data.invitation_wait_count);
+        this.$validator.validate().then(result => {
+          if (!result) {
+            this.$notify({
+              type: 'danger',
+              message: this.$validator.errors.items[0].msg
+            });
           } else {
-            this.$router.replace({ name: 'regWx',query:{wo_token:this.wo_token}});
-            // this.isShowSelect = true;
+            this.$toast.loading({
+              mask: true,
+              message: '正在登录...'
+            });
+            this.$store.dispatch('login', {
+                tel: this.formData.username,
+                password: this.formData.password
+              }).then(res => {
+                if (res.code == 1) {
+                  localStorage.setItem('a-token-temp', res.data.token); // 保存平台账号登录的token
+                  this.openUrl2(res.data.account_site, res.data.invitation_wait_count);
+                } else {
+                  this.$toast.fail({
+                    message: res.msg,
+                    duration: 1000
+                  });
+                }
+              })
+              .finally(() => {
+                this.$toast.clear();
+              });
+          }
+        });
+      },
+      // 直接进入,跳过选择行业与公司,体验账户专用
+      registrationExperience() {
+        this.$router.replace({
+          name: 'create_company'
+        })
+      },
+      WeixinLogin(code) {
+        this.$toast.loading({
+          mask: true,
+          message: '正在登录...'
+        });
+        let pl = 'a';
+        if (window.plus) {
+          if (navigator.userAgent.indexOf('Android') > 0) {
+            pl = 'a';
+          } else {
+            pl = 'i';
           }
-        } else {
-          this.$toast(res.data.msg);
         }
-      });
-    },
-    openUrl2(account_site, invitation_wait_count) {
-      if (account_site.length > 0) {
-        // 公司数量
-        if (invitation_wait_count > 0) {
-          this.$router.push({ name: 'registration_experience', query: { invite: 1, iscompany: 1 } }); // 选择行业
-        } else {
-          this.$router.push({ name: 'login_company_list' }); // 选择企业
+        let data = {
+          code: code,
+        };
+        axios({
+          method: 'post',
+          url: process.env.BASE_API + '/api/pro/wo/code',
+          data: qs.stringify({
+            data: returnJSEncrypt(data)
+          }),
+          headers: {
+            'Content-Type': 'application/x-www-form-urlencoded',
+            pl: pl
+          }
+        }).then(res => {
+          if (res.data.code == 1) {
+            this.wo_token = res.data.data.wo_token;
+            this.wxSelect();
+          } else {
+            this.$toast(res.data.msg);
+          }
+        });
+      },
+      wxSelect() {
+        let pl = 'a';
+        if (window.plus) {
+          if (navigator.userAgent.indexOf('Android') > 0) {
+            pl = 'a';
+          } else {
+            pl = 'i';
+          }
         }
-      } else {
-        if (invitation_wait_count > 0) {
-          // 待邀请数量
-          this.$router.push({ name: 'registration_experience', query: { invite: 1 } }); // 选择行业
+        axios({
+          method: 'get',
+          url: process.env.BASE_API + '/api/pro/wo/oui',
+          headers: {
+            'Content-Type': 'application/x-www-form-urlencoded',
+            pl: pl,
+            'A-TOKEN': this.wo_token
+          }
+        }).then(res => {
+          if (res.data.code == 1) {
+            this.$setCache('account', res.data.data.account);
+            if (res.data.data.account_id !== 0) {
+              localStorage.setItem('a-token-temp', res.data.data.token); // 保存平台账号登录的token
+              // 已绑定平台账号
+              this.openUrl2(res.data.data.account_site, res.data.data.invitation_wait_count);
+            } else {
+              this.$router.replace({
+                name: 'regWx',
+                query: {
+                  wo_token: this.wo_token
+                }
+              });
+              // this.isShowSelect = true;
+            }
+          } else {
+            this.$toast(res.data.msg);
+          }
+        });
+      },
+      openUrl2(account_site, invitation_wait_count) {
+        if (account_site.length > 0) {
+          // 公司数量
+          if (invitation_wait_count > 0) {
+            this.$router.push({
+              name: 'registration_experience',
+              query: {
+                invite: 1,
+                iscompany: 1
+              }
+            }); // 选择行业
+          } else {
+            this.$router.push({
+              name: 'login_company_list'
+            }); // 选择企业
+          }
         } else {
-          this.registrationExperience(); //进入体验账号
+          if (invitation_wait_count > 0) {
+            // 待邀请数量
+            this.$router.push({
+              name: 'registration_experience',
+              query: {
+                invite: 1
+              }
+            }); // 选择行业
+          } else {
+            this.registrationExperience(); //进入体验账号
+          }
         }
-      }
-    },
-    // 关闭APP
-    closeYs2() {
-      this.isYsShow = false;
-      this.showYs = false;
-      if (window.plus) {
-        plus.runtime.quit();
-      }
-    },
-    // 关闭隐私
-    closeYs() {
-      localStorage.setItem('isYsShow', true);
-      this.isYsShow = true;
-      this.showYs = false;
-    },
-  }
-};
+      },
+      // 关闭APP
+      closeYs2() {
+        this.isYsShow = false;
+        this.showYs = false;
+        if (window.plus) {
+          plus.runtime.quit();
+        }
+      },
+      // 关闭隐私
+      closeYs() {
+        localStorage.setItem('isYsShow', true);
+        this.isYsShow = true;
+        this.showYs = false;
+      },
+    }
+  };
 </script>
 
 <style rel="stylesheet/scss" lang="scss" scoped>
-.contentBox{
-  text-align: center;
-  padding: 50px 0;
-  div{
-    font-size: 0.38rem;
-    color: #222;
+  .contentBox {
+    text-align: center;
+    padding: 50px 0;
+
+    div {
+      font-size: 0.38rem;
+      color: #222;
+    }
+
+    p {
+      font-size: 0.28rem;
+      color: #666;
+    }
   }
-  p{
-    font-size: 0.28rem;
-    color: #666;
+
+  .bdBtn {
+    width: 80%;
+    padding: 10px;
+    border-radius: 25px;
+    background-image: linear-gradient(117deg, #04b3fb, #31d4ff);
+    color: #fff;
+    margin: 0 auto;
+    margin-bottom: 16px;
   }
-}
-.bdBtn{
-  width: 80%;
-  padding: 10px;
-  border-radius: 25px;
-  background-image: linear-gradient(117deg,#04b3fb,#31d4ff);
-  color: #fff;
-  margin: 0 auto;
-  margin-bottom: 16px;
-}
-.popup-all {
-  border-radius: 0.15rem;
-  background: #fff;
-  width: 80%;
-  text-align: center;
-  font-size: 0.32rem;
-  .title {
-    padding: 0.2rem 0;
+
+  .popup-all {
+    border-radius: 0.15rem;
+    background: #fff;
+    width: 80%;
+    text-align: center;
+    font-size: 0.32rem;
+
+    .title {
+      padding: 0.2rem 0;
+    }
+
+    .content {
+      font-size: 0.28rem;
+      padding: 0 0.2rem;
+      padding-bottom: 0.2rem;
+      height: 3rem;
+      // overflow-y: scroll;
+    }
+
+    .footer2 div:nth-child(1) {
+      background-color: #ccc;
+      color: #333333;
+      padding: 0.24rem 0;
+      font-size: 0.28rem;
+    }
+
+    .footer2 div:nth-child(2) {
+      background-color: #1989fa;
+      color: #fff;
+      padding: 0.24rem 0;
+      font-size: 0.28rem;
+    }
   }
-  .content {
-    font-size: 0.28rem;
-    padding: 0 0.2rem;
-    padding-bottom: 0.2rem;
-    height: 3rem;
-    // overflow-y: scroll;
+
+  .body_com {
+    background-color: #fff;
+    position: fixed;
+    top: 1rem;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    overflow: auto;
+    z-index: 2;
   }
-  .footer2 div:nth-child(1) {
-    background-color: #ccc;
-    color: #333333;
-    padding: 0.24rem 0;
-    font-size: 0.28rem;
+
+  .login_button {
+    height: 1rem;
+    line-height: 0.8rem;
+    border-radius: 0.15rem;
+  }
+
+  .imgLsit img {
+    height: 100%;
+    width: 100%;
+    vertical-align: bottom;
+  }
+
+  .input_focus.login-box {
+    height: calc(100% - 0rem);
+  }
+
+  .login-box {
+    height: calc(100%);
+    position: relative;
+  }
+
+  .login-box-parent .van-field__icon .van-icon {
+    color: #4b0;
+  }
+
+  .login-form-box-bg {
+    position: absolute;
+    top: -0.4rem;
+    left: 0;
+    width: 100%;
+    height: 3.4rem;
+    color: #26a2ff;
   }
-  .footer2 div:nth-child(2) {
-    background-color: #1989fa;
+
+  .login_logo {
+    position: relative;
+    display: block;
+    margin: -1.45rem auto;
+    width: 3.6rem;
     color: #fff;
-    padding: 0.24rem 0;
+    margin-bottom: 0rem;
+    z-index: 1;
+  }
+
+  .setp1,
+  .setp2 {
+    padding-bottom: 0.5rem;
+  }
+
+  .login-box-parent .mint-cell.cell-last:before {
+    bottom: 0;
+  }
+
+  .login-box .van-cell[data-v-1a0d0fb5]:not(:last-child)::after {
+    border: none;
+    border-bottom: 0.02rem #efefef solid;
+    transform: scaleY(0.5);
+    left: 0.32rem;
+    right: 0.32rem;
+  }
+
+  .login-box .login-form-box .tel {
+    font-size: 0.32rem;
+    margin-bottom: 0.16rem;
+    padding: 0.2rem 0.32rem;
+    line-height: 0.5rem;
+  }
+
+  .login-box .login-form-box .tel .login_tel {
+    width: 0.37rem;
+    height: 0.37rem;
+    color: #b8b8b8;
+    margin-top: -0.06rem;
+    margin-left: -0.06rem;
+    padding-right: 0rem;
+    border-right: none;
+  }
+
+  .login-box .login-form-box .psw {
+    font-size: 0.32rem;
+    margin-bottom: 0.16rem;
+    padding: 0.2rem 0.32rem;
+    line-height: 0.5rem;
+  }
+
+  .login-box .login-form-box .psw .login_pwd {
+    width: 0.37rem;
+    height: 0.37rem;
+    color: #b8b8b8;
+    margin-top: -0.05rem;
+    margin-left: -0.06rem;
+    padding-right: 0rem;
+    border-right: none;
+  }
+
+  /deep/ .login-box input {
+    font-size: 0.4rem !important;
+    color: #1c1c1c;
+    letter-spacing: 0.005rem;
+  }
+
+  .login-box ::-webkit-input-placeholder {
+    font-size: 0.32rem;
+    color: #b8b8b8 !important;
+    letter-spacing: 0.005rem;
+  }
+
+  .login-box input:-ms-input-placeholder {
+    font-size: 0.32rem;
+    color: #b8b8b8 !important;
+    letter-spacing: 0.005rem;
+  }
+
+  .login-box ::-moz-input-placeholder {
+    font-size: 0.32rem;
+    color: #b8b8b8 !important;
+    letter-spacing: 0.005rem;
+  }
+
+  // .login-box .field-focus ::-webkit-input-placeholder{
+  //   color:#238cf9 !important;
+  // }
+  // .login-box input:-ms-input-placeholder {
+  //    color:#238cf9 !important;
+  //  }
+  // .login-box .field-focus ::-moz-input-placeholder {
+  //   color:#238cf9 !important;
+  // }
+  // .login-box .field-focus .login_tel{
+  //   color:#238cf9 !important;
+  // }
+  // .login-box .field-focus .login_pwd {
+  //   color:#238cf9 !important;
+  // }
+  .login-box .van-hairline--top-bottom:after {
+    border: none;
+    border-bottom: 0.02rem #efefef solid;
+    transform: scaleY(0.5);
+    left: 0.32rem;
+    right: 0.32rem;
+  }
+
+  .login-box .van-hairline-unset--top-bottom:after {
+    border: none;
+    border-bottom: 0.02rem #efefef solid;
+    transform: scaleY(0.5);
+    left: 0.32rem;
+    right: 0.32rem;
+  }
+
+  // /deep/ .login-box .field-focus:after {
+  //   border-bottom: 0.02rem #238cf9 solid !important;
+  // }
+  .login-box .van-row {
+    margin-top: 0.08rem;
     font-size: 0.28rem;
   }
-}
-.body_com {
-  background-color: #fff;
-  position: fixed;
-  top: 1rem;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  overflow: auto;
-  z-index: 2;
-}
-.login_button {
-  height: 1rem;
-  line-height: 0.8rem;
-  border-radius: 0.15rem;
-}
-.imgLsit img {
-  height: 100%;
-  width: 100%;
-  vertical-align: bottom;
-}
-.input_focus.login-box {
-  height: calc(100% - 0rem);
-}
-.login-box {
-  height: calc(100%);
-  position: relative;
-}
-.login-box-parent .van-field__icon .van-icon {
-  color: #4b0;
-}
-.login-form-box-bg {
-  position: absolute;
-  top: -0.4rem;
-  left: 0;
-  width: 100%;
-  height: 3.4rem;
-  color: #26a2ff;
-}
-.login_logo {
-  position: relative;
-  display: block;
-  margin: -1.45rem auto;
-  width: 3.6rem;
-  color: #fff;
-  margin-bottom: 0rem;
-  z-index: 1;
-}
-.setp1,
-.setp2 {
-  padding-bottom: 0.5rem;
-}
-.login-box-parent .mint-cell.cell-last:before {
-  bottom: 0;
-}
-.login-box .van-cell[data-v-1a0d0fb5]:not(:last-child)::after {
-  border: none;
-  border-bottom: 0.02rem #efefef solid;
-  transform: scaleY(0.5);
-  left: 0.32rem;
-  right: 0.32rem;
-}
-.login-box .login-form-box .tel {
-  font-size: 0.32rem;
-  margin-bottom: 0.16rem;
-  padding: 0.2rem 0.32rem;
-  line-height: 0.5rem;
-}
-.login-box .login-form-box .tel .login_tel {
-  width: 0.37rem;
-  height: 0.37rem;
-  color: #b8b8b8;
-  margin-top: -0.06rem;
-  margin-left: -0.06rem;
-  padding-right: 0rem;
-  border-right: none;
-}
-.login-box .login-form-box .psw {
-  font-size: 0.32rem;
-  margin-bottom: 0.16rem;
-  padding: 0.2rem 0.32rem;
-  line-height: 0.5rem;
-}
-.login-box .login-form-box .psw .login_pwd {
-  width: 0.37rem;
-  height: 0.37rem;
-  color: #b8b8b8;
-  margin-top: -0.05rem;
-  margin-left: -0.06rem;
-  padding-right: 0rem;
-  border-right: none;
-}
-/deep/ .login-box input {
-  font-size: 0.4rem !important;
-  color: #1c1c1c;
-  letter-spacing: 0.005rem;
-}
-.login-box ::-webkit-input-placeholder {
-  font-size: 0.32rem;
-  color: #b8b8b8 !important;
-  letter-spacing: 0.005rem;
-}
-.login-box input:-ms-input-placeholder {
-  font-size: 0.32rem;
-  color: #b8b8b8 !important;
-  letter-spacing: 0.005rem;
-}
-.login-box ::-moz-input-placeholder {
-  font-size: 0.32rem;
-  color: #b8b8b8 !important;
-  letter-spacing: 0.005rem;
-}
-// .login-box .field-focus ::-webkit-input-placeholder{
-//   color:#238cf9 !important;
-// }
-// .login-box input:-ms-input-placeholder {
-//    color:#238cf9 !important;
-//  }
-// .login-box .field-focus ::-moz-input-placeholder {
-//   color:#238cf9 !important;
-// }
-// .login-box .field-focus .login_tel{
-//   color:#238cf9 !important;
-// }
-// .login-box .field-focus .login_pwd {
-//   color:#238cf9 !important;
-// }
-.login-box .van-hairline--top-bottom:after {
-  border: none;
-  border-bottom: 0.02rem #efefef solid;
-  transform: scaleY(0.5);
-  left: 0.32rem;
-  right: 0.32rem;
-}
-.login-box .van-hairline-unset--top-bottom:after {
-  border: none;
-  border-bottom: 0.02rem #efefef solid;
-  transform: scaleY(0.5);
-  left: 0.32rem;
-  right: 0.32rem;
-}
-// /deep/ .login-box .field-focus:after {
-//   border-bottom: 0.02rem #238cf9 solid !important;
-// }
-.login-box .van-row {
-  margin-top: 0.08rem;
-  font-size: 0.28rem;
-}
-.login-box .van-row .van-col:not(:last-child) {
-  color: #9e9da3;
-}
-.login-box .van-row .van-col {
-  color: #28a2f1;
-  letter-spacing: 0.005rem;
-}
-.login-box .login_button {
-  height: 1rem;
-  line-height: 0.8rem;
-  border-radius: 0.04rem;
-}
-.footer {
-  font-size: 0.28rem;
-  line-height: 1rem;
-  text-align: center;
-  letter-spacing: 0.005rem;
-  margin-bottom: 0.5rem;
-}
-.footer a {
-  color: #1989fa;
-}
+
+  .login-box .van-row .van-col:not(:last-child) {
+    color: #9e9da3;
+  }
+
+  .login-box .van-row .van-col {
+    color: #28a2f1;
+    letter-spacing: 0.005rem;
+  }
+
+  .login-box .login_button {
+    height: 1rem;
+    line-height: 0.8rem;
+    border-radius: 0.04rem;
+  }
+
+  .footer {
+    font-size: 0.28rem;
+    line-height: 1rem;
+    text-align: center;
+    letter-spacing: 0.005rem;
+    margin-bottom: 0.5rem;
+  }
+
+  .footer a {
+    color: #1989fa;
+  }
 </style>