wzdxx1314@163.com 2 年之前
父节点
当前提交
57988a4195

+ 1 - 0
public/index.html

@@ -6,6 +6,7 @@
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="http://121.5.58.50:8088/logo.png">
       <link rel="stylesheet" href="//at.alicdn.com/t/font_2939460_fcaitngwfe8.css">
+      <link rel="stylesheet" href="//at.alicdn.com/t/c/font_4008559_je56nyzymj.css">
     <title>业主之家</title>
   </head>
   <body>

+ 21 - 11
src/api/api.js

@@ -69,20 +69,18 @@ function fetch(ourl, params = {}, methods = 'post') {
                 resolve(res)
             }else if(res.code == 104){
 
+            }else if(res.code == 107){
+                reject(res)
             }else if(res.code == 201){
-                Dialog.confirm({
-                    title: '未登录',
-                    message: '是否回到登录页',
-                })
-                    .then(() => {
-                        router.push({name:'login'})
-                    })
-                    .catch(() => {
-                        // on cancel
-                    });
+                Dialog.alert({
+                    title: '登录信息已失效',
+                    message: '点击确定后,将返回欢迎页',
+                }).then(() => {
+                    router.push({name:'welcome'})
+                });
             }else{
                 Notify(res.message);
-                reject(err)
+                reject(res)
             }
 
         }).catch((err) => {
@@ -141,10 +139,16 @@ export default {
     houseBlind(params){
         return fetch('house/passport/',params,'put')
     },
+    houseBlindAuto(params){
+        return fetch('house/passport/',params,'post')
+    },
     //投票 choice
     voteItem(params){
         return fetch('choice',params,'put')
     },
+    agentVote(params){
+        return fetch('choice/delegation',params,'put')
+    },
     getVoteResult(params){
         return fetch('vote/result',params,'get')
     },
@@ -157,5 +161,11 @@ export default {
     getEstates(params){
         return fetch('estates/',params,'get')
     },
+    getUserHouses(params){
+        return fetch('passport/house/s',params,'get')
+    },
+    getProxyPermission(params){
+        return fetch('auth/proxy',params,'get')
+    },
 
 }

二进制
src/assets/acitive.png


二进制
src/assets/banner.jpg


二进制
src/assets/banner.png


二进制
src/assets/banner1.png


二进制
src/assets/news.png


+ 130 - 0
src/components/houseSelect.vue

@@ -0,0 +1,130 @@
+<template>
+<div class="houseSelect">
+  <van-field
+      class="input-a"
+      v-model="fieldValue"
+      is-link
+      readonly
+      label="具体房屋信息"
+      placeholder="请选择具体位置"
+      @click="show = true"
+  />
+  <van-popup v-model="show" round position="bottom" class="popup" :get-container="getEl">
+    <van-cascader
+        :field-names="fieldNames"
+        v-model="cascaderValue"
+        title="请选择具体位置"
+        :options="options"
+        @change="onChange"
+        @close="show = false"
+        @finish="onFinish"
+    />
+  </van-popup>
+</div>
+</template>
+
+<script>
+export default {
+  name: "houseSelect",
+  mounted() {
+    this.getEstates()
+  },
+  methods:{
+    getEl(){
+      return document.getElementsByTagName('body')[0]
+    },
+    onChange(target){
+      if(target.selectedOptions[target.tabIndex].leaf == true){
+        // this.form.houseId = String(target.value)
+        this.$emit('on-select',String(target.value))
+      }else{
+        let params = {
+          estateUnitId:target.value
+        }
+        this.$api.getEstates(params).then(res=>{
+          target.selectedOptions[target.tabIndex].children = res.content.subs.map(x=>{
+            if(!x.leaf){
+              return {
+                ...x,
+                name:x.name+(x.exp?x.exp:''),
+                children:[]
+              }
+            }else{
+              return {
+                ...x,
+                name:x.name+(x.exp?x.exp:''),
+              }
+            }
+          })
+        })
+      }
+
+    },
+    // 全部选项选择完毕后,会触发 finish 事件
+    onFinish({ selectedOptions }) {
+      this.show = false;
+      this.fieldValue = selectedOptions.map((option) => option.name).join('/');
+    },
+    getEstates(){
+      let params = {
+        estateUnitId:1
+      }
+      this.$api.getEstates(params).then(res=>{
+        console.log(res)
+        this.options = res.content.subs.map(x=>{
+          if(!x.leaf){
+            return {
+              ...x,
+              name:x.name+(x.exp?x.exp:''),
+              children:[]
+            }
+          }else{
+            return {
+              ...x,
+              name:x.name+(x.exp?x.exp:''),
+            }
+          }
+        })
+      })
+    },
+  },
+  data(){
+    return {
+      el:null,
+      show:false,
+      fieldValue: '',
+      cascaderValue: '',
+      fieldNames:{
+        text:'name',
+        value:'id',
+        children:'children'
+      },
+      // 选项列表,children 代表子选项,支持多级嵌套
+      options: [
+      ],
+    }
+  },
+}
+</script>
+
+<style scoped lang="less">
+.popup{
+  //position: relative;
+  z-index: 99999;
+}
+.input-a{
+  //width: 340px;
+  padding: 0 15px;
+  height: 48px;
+display: flex;
+//justify-content: center;
+align-items: center;
+  margin: 0 auto;
+  background: #F4F5F6;
+  border-radius: 8px;
+  opacity: 0.8;
+  border: none;
+  outline: none;
+  line-height: 50px;
+}
+</style>

+ 9 - 0
src/router/index.js

@@ -22,6 +22,10 @@ const routes = [
     path: '/voteDetial',
     name: 'voteDetial',
     component: ()=>import('../views/fuzhu/voteDetial')
+  },{
+    path: '/agentVoteDetial',
+    name: 'agentVoteDetial',
+    component: ()=>import('../views/fuzhu/agentVoteDetial')
   },{
     path: '/meetingDetial',
     name: 'meetingDetial',
@@ -47,6 +51,11 @@ const routes = [
     name: 'voteModel',
     component: ()=>import('../views/fuzhu/voteModel')
   },
+  {
+    path: '/suggestion',
+    name: 'suggestion',
+    component: ()=>import('../views/fuzhu/suggestion')
+  },
   {
     path: '/Main',
     name: 'Main',

+ 26 - 0
src/util/reg.js

@@ -0,0 +1,26 @@
+import { Notify  } from 'vant';
+let testPhone = (phone)=>{
+    let reg = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/ ;
+    return new Promise((resolve,reject)=>{
+        if(reg.test(phone)){
+            resolve()
+        }else{
+            Notify({ type: 'warning', message: '请输入正确格式的手机号码' });
+            reject()
+        }
+    })
+}
+let regIDNumber = (IdNumber)=>{
+    let reg =   /^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
+    return new Promise((resolve,reject)=>{
+        if(reg.test(IdNumber)){
+            resolve()
+        }else{
+            Notify({ type: 'warning', message: '请输入正确格式的身份证号码' });
+            reject()
+        }
+    })
+}
+export default {
+    testPhone,regIDNumber
+}

+ 11 - 5
src/views/Home/Home.vue

@@ -1,10 +1,12 @@
 <template>
   <div class="home">
     <van-swipe class="my-swipe" :autoplay="3000" indicator-color="white">
-      <van-swipe-item>1</van-swipe-item>
-      <van-swipe-item>2</van-swipe-item>
-      <van-swipe-item>3</van-swipe-item>
-      <van-swipe-item>4</van-swipe-item>
+      <van-swipe-item>
+        <img class="banner" src="http://121.5.58.50:8088/banner.png" alt="">
+      </van-swipe-item>
+      <van-swipe-item>
+        <img class="banner" src="http://121.5.58.50:8088/banner1.png" alt="">
+      </van-swipe-item>
     </van-swipe>
     <vote></vote>
     <announcement></announcement>
@@ -26,6 +28,10 @@ export default {
 </script>
 <style scoped lang="less">
 .home{
+  .banner{
+    width: 100%;
+    height: 100%;
+  }
   .my-swipe{
     margin: 0 auto;
   }
@@ -34,7 +40,7 @@ export default {
     font-size: 20px;
     line-height: 200px;
     text-align: center;
-    background-color: #39a9ed;
+    height: 240px;
   }
 }
 </style>

+ 1 - 0
src/views/Home/module/announcement.vue

@@ -1,6 +1,7 @@
 <template>
   <voteCard :title="'小区公告'" @click="goMore">
     <van-skeleton  :row="3" :loading="loading">
+      <van-empty description="暂无公告"  v-if="list.length == 0"/>
       <announcementItem v-for="(item,index) in list" :key="index" :params="item" class="announcementItem"></announcementItem>
     </van-skeleton>
 

+ 3 - 2
src/views/Home/module/announcementItem.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="cardItem" @click="goDetial">
-    <img class="img" src="http://121.5.58.50:8088/sport.png" alt="">
+    <svg t="1681219999465" class="img" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3171" ><path d="M0 0h1024v1024H0z" fill="#8475EF" p-id="3172"></path><path d="M536.968533 223.044267l2.389334 1.194666 147.456 107.008h92.740266c16.657067 0 29.730133 13.090133 29.730134 29.730134v416.2048c0 16.64-13.073067 29.730133-29.730134 29.730133H244.445867a29.44 29.44 0 0 1-29.730134-29.730133V360.96c0-15.4624 13.073067-28.535467 29.730134-28.535467h93.934933l147.456-107.025066c15.4624-10.7008 35.669333-11.895467 51.131733-2.389334z m212.855467 168.8576h-475.648v356.744533h475.648V391.901867zM512 599.995733c8.328533 0 14.267733 7.133867 14.267733 15.4624v29.730134a15.735467 15.735467 0 0 1-15.4624 15.4624h-161.723733a15.735467 15.735467 0 0 1-15.4624-15.4624v-29.730134c0-8.328533 7.150933-15.4624 15.4624-15.4624H512z m164.096-118.920533c8.328533 0 15.4624 7.133867 15.4624 15.4624v29.730133a15.735467 15.735467 0 0 1-15.4624 15.4624h-326.997333a15.735467 15.735467 0 0 1-15.479467-15.4624v-29.730133c0-8.328533 7.150933-15.4624 14.2848-15.4624h328.192zM513.194667 278.920533l-72.533334 53.521067h145.066667l-72.533333-53.521067z" fill="#FFFFFF" p-id="3173"></path></svg>
     <div class="right">
       <span class="title">{{ params.title }}</span>
       <span class="des">{{ params.secondTitle }}</span>
@@ -38,7 +38,8 @@ export default {
     width: 60px;
     height: 60px;
     padding: 15px;
-    border-radius: 20px;
+    border-radius: 35px;
+    font-size: 60px;
   }
   .right{
     display: flex;

+ 7 - 2
src/views/Home/module/bottomMenu.vue

@@ -1,11 +1,16 @@
 <template>
 <div class="bottomMenu">
   <div :class="['btnbox',{active:routerName == 'home'}]" @click="$router.push({name:'home'})">
-    <van-icon name="gem"  size="25"/>
+<!--    <van-icon name="gem"  size="25"/>-->
+    <svg t="1681205236914" v-if="routerName == 'home'" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2490" width="25" height="25"><path d="M853.333333 283.306667l-270.890666-163.2c-25.6-15.445333-38.4-23.125333-52.053334-26.154667a85.333333 85.333333 0 0 0-36.736 0c-13.696 2.986667-26.496 10.709333-52.096 26.154667L170.666667 283.306667V802.133333c0 47.786667 0 71.68 9.301333 89.941334a85.333333 85.333333 0 0 0 37.290667 37.290666C235.52 938.666667 259.413333 938.666667 307.2 938.666667h409.6c47.786667 0 71.68 0 89.941333-9.301334a85.333333 85.333333 0 0 0 37.290667-37.290666C853.333333 873.813333 853.333333 849.92 853.333333 802.133333V283.306667z" fill="#6C5DD3" opacity=".25" p-id="2491"></path><path d="M107.264 420.608L512 177.749333l404.693333 242.858667a42.666667 42.666667 0 1 0 43.946667-73.173333L555.861333 104.533333a85.333333 85.333333 0 0 0-87.808 0L63.36 347.434667a42.666667 42.666667 0 1 0 43.946667 73.173333z" fill="#6C5DD3" p-id="2492"></path><path d="M512 554.666667a128 128 0 0 1 128 128v256H384v-256a128 128 0 0 1 128-128z" fill="#6C5DD3" p-id="2493"></path></svg>
+    <svg t="1681205216203" v-else class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2354" width="25" height="25"><path d="M853.333333 283.306667l-270.890666-163.2c-25.6-15.445333-38.4-23.125333-52.053334-26.154667a85.333333 85.333333 0 0 0-36.736 0c-13.696 2.986667-26.496 10.709333-52.096 26.154667L170.666667 283.306667V802.133333c0 47.786667 0 71.68 9.301333 89.941334a85.333333 85.333333 0 0 0 37.290667 37.290666C235.52 938.666667 259.413333 938.666667 307.2 938.666667h409.6c47.786667 0 71.68 0 89.941333-9.301334a85.333333 85.333333 0 0 0 37.290667-37.290666C853.333333 873.813333 853.333333 849.92 853.333333 802.133333V283.306667z" fill="#75818F" opacity=".25" p-id="2355"></path><path d="M107.264 420.608L512 177.749333l404.693333 242.858667a42.666667 42.666667 0 1 0 43.946667-73.173333L555.861333 104.533333a85.333333 85.333333 0 0 0-87.808 0L63.36 347.434667a42.666667 42.666667 0 1 0 43.946667 73.173333zM512 554.666667a128 128 0 0 1 128 128v256H384v-256a128 128 0 0 1 128-128z" fill="#75818F" p-id="2356"></path></svg>
     <span>首页</span>
   </div>
   <div :class="['btnbox',{active:routerName == 'my'}]" @click="$router.push({name:'my'})">
-    <van-icon name="map-marked" size="25"/>
+<!--    <van-icon name="map-marked" size="25"/>-->
+
+    <svg t="1681205334098" v-if="routerName == 'my'" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2627" width="25" height="25"><path d="M512 512a213.333333 213.333333 0 1 1 0-426.666667 213.333333 213.333333 0 0 1 0 426.666667z" fill="#6C5DD3" p-id="2628"></path><path d="M696.106667 593.066667A382.293333 382.293333 0 0 1 512 640a382.293333 382.293333 0 0 1-184.106667-46.933333c-35.328-19.328-80.512-20.906667-106.794666 9.6A382.506667 382.506667 0 0 0 128 853.333333v42.666667a85.333333 85.333333 0 0 0 85.333333 85.333333h597.333334a85.333333 85.333333 0 0 0 85.333333-85.333333v-42.666667a382.506667 382.506667 0 0 0-93.098667-250.666666c-26.282667-30.506667-71.466667-28.928-106.794666-9.6z" fill="#6C5DD3" opacity=".25" p-id="2629"></path></svg>
+    <svg t="1681205342614" v-else class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2763" width="25" height="25"><path d="M512 512a213.333333 213.333333 0 1 1 0-426.666667 213.333333 213.333333 0 0 1 0 426.666667z" fill="#75818F" p-id="2764"></path><path d="M696.106667 593.066667A382.293333 382.293333 0 0 1 512 640a382.293333 382.293333 0 0 1-184.106667-46.933333c-35.328-19.328-80.512-20.906667-106.794666 9.6A382.506667 382.506667 0 0 0 128 853.333333v42.666667a85.333333 85.333333 0 0 0 85.333333 85.333333h597.333334a85.333333 85.333333 0 0 0 85.333333-85.333333v-42.666667a382.506667 382.506667 0 0 0-93.098667-250.666666c-26.282667-30.506667-71.466667-28.928-106.794666-9.6z" fill="#75818F" opacity=".25" p-id="2765"></path></svg>
     <span>我的</span>
   </div>
 </div>

文件差异内容过多而无法显示
+ 2 - 1
src/views/Home/module/cardItem.vue


+ 1 - 0
src/views/Home/module/vote.vue

@@ -1,6 +1,7 @@
 <template>
   <voteCard :title="'会议决策'" @click="goMore">
     <van-skeleton   :row="3" :loading="loading">
+      <van-empty description="暂无会议决策"  v-if="list.length == 0"/>
       <cardItem v-for="(item,index) in list" :key="index" :params="item" class="cardItem"></cardItem>
     </van-skeleton>
   </voteCard>

+ 2 - 2
src/views/Home/module/voteItem.vue

@@ -1,7 +1,7 @@
 
 <template>
   <div class="voteItem" @click="goDetial">
-    <img class="img" src="http://121.5.58.50:8088/sport.png" alt="">
+    <svg t="1681219932465" class="img" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3035"><path d="M0 0h1024v1024H0z" fill="#8475EF" p-id="3036"></path><path d="M739.549867 341.333333h-28.433067a14.216533 14.216533 0 0 0-14.2336 14.216534V384c0 7.850667 6.365867 14.216533 14.2336 14.216533 15.701333 0 28.433067 12.7488 28.433067 28.450134v284.450133c0 15.701333-12.731733 28.433067-28.433067 28.433067H312.8832c-15.701333 0-28.433067-12.731733-28.433067-28.433067V426.666667c0-15.701333 12.731733-28.450133 28.433067-28.450134 7.850667 0 14.2336-6.365867 14.2336-14.216533v-28.450133a14.216533 14.216533 0 0 0-14.2336-14.216534h-28.433067a56.8832 56.8832 0 0 0-56.900266 56.8832v341.333334a56.8832 56.8832 0 0 0 56.900266 56.900266h455.099734a56.8832 56.8832 0 0 0 56.900266-56.900266v-341.333334A56.8832 56.8832 0 0 0 739.549867 341.333333zM369.783467 568.900267h284.433066A28.450133 28.450133 0 0 0 682.666667 535.620267 29.44 29.44 0 0 0 652.663467 512h-5.546667a7.1168 7.1168 0 0 1-7.1168-7.1168V284.450133a56.8832 56.8832 0 0 0-56.8832-56.900266h-142.2336a56.8832 56.8832 0 0 0-56.8832 56.900266v220.433067c0 3.925333-3.191467 7.1168-7.1168 7.1168h-5.546667A29.44 29.44 0 0 0 341.333333 535.6032a28.450133 28.450133 0 0 0 28.450134 33.28z m71.099733-256c0-15.7184 12.7488-28.450133 28.450133-28.450134h85.333334c15.701333 0 28.450133 12.731733 28.450133 28.433067v192c0 3.925333-3.191467 7.1168-7.1168 7.1168h-128a7.1168 7.1168 0 0 1-7.1168-7.1168v-192zM479.573333 433.493333c4.369067 4.488533 10.376533 6.997333 16.64 6.9632 6.212267 0.034133 12.1856-2.474667 16.503467-6.9632l52.906667-53.76a20.189867 20.189867 0 0 0-1.4336-29.44 20.189867 20.189867 0 0 0-26.88 1.570134l-41.096534 41.813333-9.386666-9.6768a20.189867 20.189867 0 0 0-27.016534-1.570133 19.9168 19.9168 0 0 0-1.4336 29.303466L479.573333 433.493333z" fill="#FFFFFF" p-id="3037"></path></svg>
     <div class="right">
       <span class="title">{{ params.title }}</span>
       <span class="des">{{ params.content }}</span>
@@ -38,7 +38,7 @@ export default {
     width: 60px;
     height: 60px;
     padding: 15px;
-    border-radius: 20px;
+    border-radius: 35px;
   }
   .right{
     display: flex;

文件差异内容过多而无法显示
+ 2 - 2
src/views/Home/my.vue


+ 139 - 0
src/views/fuzhu/agentVoteDetial.vue

@@ -0,0 +1,139 @@
+<template>
+  <div class="voteDetial">
+    <span class="title">投票:{{ $route.query.title }}?</span>
+    <span class="des">{{ $route.query.content }}</span>
+    <div class="voteBox">
+      <van-skeleton  :row="3" :loading="loading">
+        <van-radio-group v-model="radio" :label-position="'left'" >
+          <van-radio  class="van-radio" :name="item.id" checked-color="#5DD8D0" v-for="(item,index) in list" :key="index">{{ item.value }}</van-radio>
+        </van-radio-group>
+      </van-skeleton>
+      <houseSelect class="center" @on-select="onSelect"></houseSelect>
+
+    </div>
+    <div class="btn" @click="goSubmit" >进行投票</div>
+    <div class="btn btn1" @click="goSee">查看投票情况</div>
+  </div>
+</template>
+
+<script>
+import { Dialog,Notify  } from 'vant';
+import houseSelect from "@/components/houseSelect";
+export default {
+  name: "agentVoteDetial",
+  components:{
+    houseSelect
+  },
+  data(){
+    return {
+      radio:'',
+      list:[],
+      houseId:'',
+      loading:false,
+      show: false,
+      actions: [{ name: '房产1' }, { name: '房产2' }, { name: '房产3' }],
+    }
+  },
+  mounted() {
+    this.getVoteOptions()
+  },
+  methods:{
+    onSelect(v){
+      this.houseId = String(v)
+    },
+    getVoteOptions(){
+      this.loading = true
+      this.$api.getVoteOptions({voteId:this.$route.query.id}).then(res=>{
+        this.loading = false
+        this.list = res.content
+      })
+    },
+    goSee(){
+      this.$router.push({name:'voteModel',query:{id:this.$route.query.id}})
+    },
+    goSubmit(){
+      if(this.radio == ''){
+        Notify({ type: 'warning', message: '请选择投票项' });
+        return;
+      }
+      Dialog.confirm({
+        title: '提示',
+        message: '确认提交?提交后无法再修改提交结果。',
+      })
+          .then(() => {
+            let params = {
+              optionId:this.radio,
+              houseId:this.houseId,
+            }
+            this.$api.agentVote(params).then(res=>{
+              Notify({ type: 'success', message: '提交成功' });
+            })
+          })
+          .catch(() => {
+            // on cancel
+          });
+    },
+  }
+}
+</script>
+
+<style scoped lang="less">
+.center{
+  align-items: center
+}
+input{
+  width: 299px;
+  padding: 0 10px;
+  height: 48px;
+  background: #F4F5F6;
+  border-radius: 8px;
+  opacity: 0.8;
+  border: none;
+  outline: none;
+}
+.voteDetial{
+  width: 100%;
+  .title{
+    display: inline-block;
+    width: calc(100% - 48px);
+    padding: 0 24px;
+    font-size: 28px;
+    font-family: PingFangSC-Medium, PingFang SC;
+    font-weight: 500;
+    color: #01040D;
+    line-height: 36px;
+    text-align: left;
+    margin-bottom: 20px;
+    margin-top: 20px;
+  }
+  .des{
+    display: inline-block;
+    width: calc(100% - 48px);
+    padding: 0 24px;
+    text-align: left;
+    margin-bottom: 50px;
+  }
+  .voteBox{
+    width: 319px;
+    margin: 0 auto;
+    .van-radio{
+      //width: 319px;
+      height: 48px;
+      background: #F4F5F6;
+      border-radius: 8px;
+      opacity: 0.8;
+      padding: 0 30px;
+      margin-bottom: 15px;
+    }
+    margin-bottom: 50px;
+  }
+}
+.btn1{
+  background-color: #F4F5F6 ;
+  color: #6C5DD3;
+  //border-color: #6C5DD3;
+  margin-top: 20px;
+  //box-shadow:  0 0 50px #6C5DD3;
+}
+
+</style>

+ 2 - 1
src/views/fuzhu/announcementList.vue

@@ -2,6 +2,7 @@
 <div class="announcementList">
   <searchBox class="searchBox"></searchBox>
     <scrollBox class="announcementBox" @touchBottom="touchBottom">
+      <van-empty description="暂无公告"  v-if="list.length == 0"/>
       <announcementItem class="announcementItem" v-for="(item,index) in list" :key="index" :params="item"></announcementItem>
     </scrollBox>
 </div>
@@ -36,7 +37,7 @@ export default {
     getNotices(){
       if(!this.hasNext) return
       let params = {
-        type:'0',
+        type:'1',
         pageNum:this.page,
         pageCapacity:10
       }

+ 17 - 2
src/views/fuzhu/meetingDetial.vue

@@ -5,6 +5,7 @@
 
     </div>
     <div class="voteBox">
+      <van-empty description="暂未添加投票活动"  v-if="list.length == 0"/>
       <voteItem class="voteItem" v-for="(item,index) in list" :key="index" :params="item"></voteItem>
     </div>
   </div>
@@ -19,7 +20,21 @@ export default {
   },
   data(){
     return {
-      list:[]
+      list:[],
+      res:{
+        list:[
+          {
+            title:'',
+            des:'',
+            children:[
+              {
+                name:'wzd'
+              }
+            ]
+          }
+
+        ]
+      }
     }
   },
   mounted() {
@@ -40,7 +55,7 @@ export default {
   width: 100%;
   height: 100%;
   .header{
-    background: url("http://121.5.58.50:8088/sport.png");
+    background: url("http://121.5.58.50:8088/acitive.png");
     background-size: 100%;
     height: 300px;
     border-bottom-left-radius: 20px;

+ 1 - 0
src/views/fuzhu/meetingList.vue

@@ -3,6 +3,7 @@
   <div class="meetingList">
     <searchBox class="searchBox"></searchBox>
       <scrollBox class="announcementBox">
+        <van-empty description="暂无公告"  v-if="list.length == 0"/>
         <cardItem v-for="(item,index) in list" :key="index" :params="item" class="cardItem"></cardItem>
       </scrollBox>
   </div>

+ 1 - 1
src/views/fuzhu/newsPage.vue

@@ -41,7 +41,7 @@ export default {
   .header{
     width: 100%;
     height: 371px;
-    background-image: url("http://121.5.58.50:8088/sport.png");
+    background-image: url("http://121.5.58.50:8088/news.png");
     background-size: 100% 100%;
     position: relative;
     .title{

+ 48 - 0
src/views/fuzhu/suggestion.vue

@@ -0,0 +1,48 @@
+<template>
+<div class="suggestion">
+  <span class="title">意见箱:</span>
+  <van-field
+      v-model="message"
+      class="field"
+      rows="9"
+      autosize
+      type="textarea"
+      maxlength="200"
+      placeholder="请输入意见详情"
+      show-word-limit
+  />
+  <div class="btn">提交建议</div>
+</div>
+</template>
+
+<script>
+export default {
+  name: "suggestion",
+  data(){
+    return {
+      message:''
+    }
+  },
+}
+</script>
+
+<style scoped lang="less">
+.suggestion{
+  padding: 24px;
+  .title{
+    display: inline-block;
+    font-size: 24px;
+    font-family: PingFangSC-Medium, PingFang SC;
+    font-weight: 500;
+    color: #01040D;
+    line-height: 32px;
+    margin-bottom: 20px;
+  }
+  .btn{
+    margin-top: 20px;
+  }
+  .field{
+    background: #F4F5F6;
+  }
+}
+</style>

+ 75 - 17
src/views/fuzhu/voteDetial.vue

@@ -7,13 +7,20 @@
         <van-radio-group v-model="radio" :label-position="'left'" >
           <van-radio  class="van-radio" :name="item.id" checked-color="#5DD8D0" v-for="(item,index) in list" :key="index">{{ item.value }}</van-radio>
         </van-radio-group>
-        <input class="input" type="text" placeholder="意见和建议" v-model="suggestion" >
       </van-skeleton>
 
 
     </div>
     <div class="btn" @click="goSubmit" >进行投票</div>
     <div class="btn btn1" @click="goSee">查看投票情况</div>
+    <div class="btn btn2 " @click="goAgentVote" v-if="isPermissionShow">代理投票</div>
+    <van-action-sheet
+        @select="onSelect"
+        v-model="show"
+        :actions="actions"
+        cancel-text="取消"
+        close-on-click-action
+    />
   </div>
 </template>
 
@@ -24,29 +31,29 @@ export default {
   data(){
     return {
       radio:'',
-      suggestion:'',
       list:[],
-      loading:false
+      loading:false,
+      show: false,
+      actions: [],
+      isPermissionShow:false,
     }
   },
   mounted() {
     this.getVoteOptions()
+    this.getProxyPermission()
+    this.el = this.$el
   },
+
   methods:{
-    getVoteOptions(){
-      this.loading = true
-      this.$api.getVoteOptions({voteId:this.$route.query.id}).then(res=>{
-        this.loading = false
-        this.list = res.content
+    getProxyPermission(){
+      this.$api.getProxyPermission().then(res=>{
+        this.isPermissionShow = res.content.have
       })
     },
-    goSee(){
-      this.$router.push({name:'voteModel',query:{id:this.$route.query.id}})
+    goAgentVote(){
+      this.$router.push({name:'agentVoteDetial',query:this.$route.query})
     },
-    goSubmit(){
-      if(this.radio == ''){
-        return;
-      }
+    onSelect(item){
       Dialog.confirm({
         title: '提示',
         message: '确认提交?提交后无法再修改提交结果。',
@@ -54,7 +61,7 @@ export default {
           .then(() => {
             let params = {
               optionId:this.radio,
-              suggestion:this.suggestion
+              houseId:item.houseId,
             }
             this.$api.voteItem(params).then(res=>{
               Notify({ type: 'success', message: '提交成功' });
@@ -64,6 +71,50 @@ export default {
             // on cancel
           });
 
+    },
+    getVoteOptions(){
+      this.loading = true
+      this.$api.getVoteOptions({voteId:this.$route.query.id}).then(res=>{
+        this.loading = false
+        this.list = res.content
+      })
+    },
+    goSee(){
+      this.$router.push({name:'voteModel',query:{id:this.$route.query.id}})
+    },
+    goSubmit(){
+      if(this.radio == ''){
+        Notify({ type: 'warning', message: '请选择投票项' });
+        return;
+      }
+
+      this.$api.getUserHouses({voteId:this.$route.query.id}).then(res=>{
+        if(res.content.length == 0){
+          Dialog.confirm({
+            title: '提示',
+            message: '用户暂时未绑定任何房产,请先绑定房产之后再进行投票',
+          })
+              .then(() => {
+                this.$router.push({name:'binding'})
+              })
+              .catch(() => {
+                // on cancel
+              });
+          return;
+        }
+
+        this.actions = res.content.map(x=>{
+          return {
+            ...x,
+            name:x.houseName,
+            disabled:!x.enabled
+          }
+        })
+        this.show = true
+      })
+
+
+
     },
   }
 }
@@ -118,11 +169,18 @@ input{
   }
 }
 .btn1{
-  background-color: white;
+  background-color: #F4F5F6 ;
+  color: #6C5DD3;
+  //border-color: #6C5DD3;
+  margin-top: 20px;
+  //box-shadow:  0 0 50px #6C5DD3;
+}
+.btn2{
+  background-color: white ;
   color: #6C5DD3;
   border-color: #6C5DD3;
   margin-top: 20px;
-  box-shadow:  0 0 3px #6C5DD3;
+  box-shadow:  0 0 10px #6C5DD3;
 }
 
 </style>

+ 7 - 4
src/views/fuzhu/voteModel.vue

@@ -13,10 +13,13 @@
           <span>{{ item.value }}</span>
         </div>
       </div>
-      <van-cell class="van-cell" :title="item.value" icon="shop-o" v-for="(item,index) in options">
-        <!-- 使用 right-icon 插槽来自定义右侧图标 -->
-        <span>{{item.quantity}}票</span>
-      </van-cell>
+      <div style="padding:0  24px">
+        <van-cell class="van-cell" :title="item.value" icon="shop-o" v-for="(item,index) in options">
+          <!-- 使用 right-icon 插槽来自定义右侧图标 -->
+          <span>{{item.quantity}}票</span>
+        </van-cell>
+      </div>
+
 <!--      <div class="suggestions">-->
 <!--        <div class="sHeader">-->
 <!--          <span>意见箱</span>-->

+ 48 - 97
src/views/signAndResiger/binding.vue

@@ -2,33 +2,15 @@
 <div class="binding">
   <span class="title">完善业主信息</span>
   <div class="label">
-    <span class="small-title">业主基本信息</span>
-    <input type="text" placeholder="姓名" class="input" v-model="form.name">
+    <span class="small-title">房屋信息</span>
+    <houseSelect class="input" @on-select="onSelect"></houseSelect>
   </div>
   <div class="label">
-    <span class="small-title">房屋信息</span>
-    <input type="text" placeholder="房产证号码" class="input" v-model="form.certificateNo">
-    <van-field
-        class="input-a"
-        v-model="fieldValue"
-        is-link
-        readonly
-        label="具体房屋信息"
-        placeholder="请选择具体位置"
-        @click="show = true"
-    />
-    <van-popup v-model="show" round position="bottom">
-      <van-cascader
-          :field-names="fieldNames"
-          v-model="cascaderValue"
-          title="请选择具体位置"
-          :options="options"
-          @change="onChange"
-          @close="show = false"
-          @finish="onFinish"
-      />
-    </van-popup>
+    <span class="small-title">业主基本信息</span>
+    <input type="text" placeholder="姓名" class="input" v-model="form.name">
+    <input type="text" placeholder="身份证号码" class="input" v-model="form.idNumber">
   </div>
+
   <div class="label">
     <span class="small-title">产证信息</span>
     <van-uploader :max-count="1"  v-model="fileList" :after-read="afterRead" />
@@ -38,93 +20,66 @@
 </template>
 
 <script>
-import { Dialog } from 'vant';
+import {Dialog, Notify} from 'vant';
+import houseSelect from "@/components/houseSelect";
+import reg from "@/util/reg";
 export default {
   name: "binding",
+  components:{
+    houseSelect
+  },
   data() {
     return {
       form:{
         certificateNo:'',
         certificatePhoto:'',
         houseId:'',
-        name:''
+        name:'',
+        idNumber:''
       },
       fileList:[],
-      show: false,
-      fieldValue: '',
-      cascaderValue: '',
-      fieldNames:{
-        text:'name',
-        value:'id',
-        children:'children'
-      },
-      // 选项列表,children 代表子选项,支持多级嵌套
-      options: [
-      ],
     };
   },
-  mounted() {
-    this.getEstates();
-  },
   methods: {
-    onChange(target){
-      if(target.selectedOptions[target.tabIndex].leaf == true){
-        this.form.houseId = String(target.value)
-      }else{
-        let params = {
-          estateUnitId:target.value
-        }
-        this.$api.getEstates(params).then(res=>{
-          target.selectedOptions[target.tabIndex].children = res.content.subs.map(x=>{
-            if(!x.leaf){
-              return {
-                ...x,
-                name:x.name+(x.exp?x.exp:''),
-                children:[]
-              }
-            }else{
-              return {
-                ...x,
-                name:x.name+(x.exp?x.exp:''),
-              }
-            }
-          })
-        })
-      }
-
-    },
-
-    getEstates(){
+    onSelect(v){
+      this.form.houseId = v
       let params = {
-        estateUnitId:1
+        houseId:String(v),
+        name:this.name,
+        idNumber:this.idNumber,
       }
-      this.$api.getEstates(params).then(res=>{
-        console.log(res)
-        this.options = res.content.subs.map(x=>{
-          if(!x.leaf){
-            return {
-              ...x,
-              name:x.name+(x.exp?x.exp:''),
-              children:[]
-            }
-          }else{
-            return {
-              ...x,
-              name:x.name+(x.exp?x.exp:''),
-            }
-          }
+      this.$api.houseBlindAuto(params).then(res=>{
+        Dialog.confirm({
+          title: '提示',
+          message: '该房产的预留号码与该账号配对成功,无需审核,已绑定',
         })
-      })
+            .then(() => {
+              this.$router.go(-1)
+            })
+            .catch(() => {
+              // on cancel
+            });
+
+      }).catch(err=>{})
     },
     submit(){
-
-      this.$api.houseBlind(this.form).then(res=>{
-        Dialog.alert({
-          title: '提交成功',
-          message: '请等待管理员审核通过后,参能参与实名后的活动',
-          theme: 'round-button',
+      if(this.form.certificatePhoto == '' || this.houseId == '' || this.name == ''){
+        Notify({ type: 'warning', message: '请填写完整的审核信息' });
+        return
+      }
+      reg.regIDNumber(this.form.idNumber).then(x=>{
+        this.$api.houseBlind(this.form).then(res=>{
+          Dialog.confirm({
+            title: '提交成功',
+            message: '请等待管理员审核通过后,参能参与实名后的活动',
+          })
+              .then(() => {
+                this.$router.go(-1)
+              })
+              .catch(() => {
+                // on cancel
+              });
         })
-        this.$router.go(-1)
       })
     },
     afterRead(file) {
@@ -134,11 +89,7 @@ export default {
         this.form.certificatePhoto = res.content
       })
     },
-    // 全部选项选择完毕后,会触发 finish 事件
-    onFinish({ selectedOptions }) {
-      this.show = false;
-      this.fieldValue = selectedOptions.map((option) => option.name).join('/');
-    },
+
   },
 }
 </script>

+ 29 - 22
src/views/signAndResiger/login.vue

@@ -24,6 +24,7 @@
 </template>
 
 <script>
+import reg from "@/util/reg";
 export default {
   name: "login",
   methods:{
@@ -31,34 +32,40 @@ export default {
       this.type = this.type == '1'?'2':'1'
     },
     goLogin(){
-      let params = {
-        ...this.form,
-        securityCode:this.type == '1'?this.password1:this.password2,
-        type:this.type
-      }
-      this.$api.login(params).then(res=>{
-        console.log(res)
-        this.$router.push({name:'home'})
+      reg.testPhone(this.form.mobile).then(x=>{
+        let params = {
+          ...this.form,
+          securityCode:this.type == '1'?this.password1:this.password2,
+          type:this.type
+        }
+        this.$api.login(params).then(res=>{
+          console.log(res)
+          this.$router.push({name:'home'})
+        })
       })
 
+
     },
     goTimeOver(){
-      if(this.over){
+      reg.testPhone(this.form.mobile).then(x=>{
+        if(this.over){
 
-        this.$api.verificationCode({mobile:this.form.mobile}).then(res=>{
-          this.number = 60
-          this.over = false
-          this.timer = setInterval(()=>{
-            this.number --
-            if(this.number == 0){
-              this.over = true
-              clearInterval(this.timer)
-            }
-          },1000)
-        })
-      }else{
+          this.$api.verificationCode({mobile:this.form.mobile}).then(res=>{
+            this.number = 60
+            this.over = false
+            this.timer = setInterval(()=>{
+              this.number --
+              if(this.number == 0){
+                this.over = true
+                clearInterval(this.timer)
+              }
+            },1000)
+          })
+        }else{
+
+        }
+      })
 
-      }
 
     },
   },

+ 24 - 18
src/views/signAndResiger/resiger.vue

@@ -6,7 +6,7 @@
       <input type="text" placeholder="请输入手机号码" v-model="form.mobile">
     </div>
     <div class="inputLabel">
-      <input type="text" placeholder="请输入密码" v-model="form.password">
+      <input type="password" placeholder="请输入密码" v-model="form.password">
     </div>
     <div class="inputLabel">
       <input type="text" v-model="form.verificationCode" placeholder="请输入短信验证码">
@@ -19,34 +19,40 @@
 </template>
 
 <script>
+import reg from "@/util/reg";
 export default {
   name: "resiger",
   methods:{
     resiger(){
-      let params = {
-        ...this.form
-      }
+      reg.testPhone(this.form.mobile).then(x=>{
+        let params = {
+          ...this.form
+        }
         this.$api.resiger(params).then(res=>{
           this.$router.push({name:'home'})
         })
+      })
+
     },
     goTimeOver(){
-      if(this.over){
+      reg.testPhone(this.form.mobile).then(x=>{
+        if(this.over){
+          this.$api.verificationCode({mobile:this.form.mobile}).then(res=>{
+            this.number = 60
+            this.over = false
+            this.timer = setInterval(()=>{
+              this.number --
+              if(this.number == 0){
+                this.over = true
+                clearInterval(this.timer)
+              }
+            },1000)
+          })
+        }else{
 
-        this.$api.verificationCode({mobile:this.form.mobile}).then(res=>{
-          this.number = 60
-          this.over = false
-          this.timer = setInterval(()=>{
-            this.number --
-            if(this.number == 0){
-              this.over = true
-              clearInterval(this.timer)
-            }
-          },1000)
-        })
-      }else{
+        }
+      })
 
-      }
 
     },
   },

部分文件因为文件数量过多而无法显示