迁移居民列表
This commit is contained in:
		@@ -62,7 +62,27 @@
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="currentTabBar1" v-if="currentTabBar == 1">
 | 
			
		||||
      <AiAreaPicker v-model="areaId" all :areaId="areaId" @select="areaSelect"></AiAreaPicker>
 | 
			
		||||
      <AiTopFixed>
 | 
			
		||||
        <u-search placeholder="请输入昵称、姓名" :show-action="false" search-icon-color="#ccc" v-model="search.name" @search=";(page.current = 1), getList()" />
 | 
			
		||||
        <AiCell>
 | 
			
		||||
          <b slot="label" class="title">共<i v-html="page.total || 0" />个居民</b>
 | 
			
		||||
        </AiCell>
 | 
			
		||||
      </AiTopFixed>
 | 
			
		||||
 | 
			
		||||
      <div class="mainPane">
 | 
			
		||||
        <AiCell v-for="item in data" :key="item.id" @click.native="showResident(item)">
 | 
			
		||||
          <template #label>
 | 
			
		||||
            <AiImage :src="item.avatar" preview />
 | 
			
		||||
          </template>
 | 
			
		||||
          <div class="card wrap start" flex>
 | 
			
		||||
            <b>{{ item.name }}</b>
 | 
			
		||||
            <div flex class="tag" v-for="(tag, j) in item.tags" :key="j">{{ tag.tagName }}</div>
 | 
			
		||||
            <div class="realName" shrink v-html="`真实姓名:${item.realName || '-'}`" />
 | 
			
		||||
          </div>
 | 
			
		||||
        </AiCell>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <!-- <AiAreaPicker v-model="areaId" all :areaId="areaId" @select="areaSelect"></AiAreaPicker>
 | 
			
		||||
 | 
			
		||||
      <div class="line"></div>
 | 
			
		||||
 | 
			
		||||
@@ -88,31 +108,17 @@
 | 
			
		||||
              <div class="rightBottom">
 | 
			
		||||
                <span>
 | 
			
		||||
                  <span>{{ item.name }}</span>
 | 
			
		||||
                  <!-- {{ item.idNumber.replace(/^(\w{6})\w{8}(.*)$/, '$1****$2') }} -->
 | 
			
		||||
                  {{ item.idNumber.replace(/^(\w{6})\w{8}(.*)$/, '$1****$2') }}
 | 
			
		||||
                </span>
 | 
			
		||||
 | 
			
		||||
                <!-- <span>{{ item.phone }}</span> -->
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <!-- <div class="left">
 | 
			
		||||
              <img :src="item.photo" alt="" v-if="item.photo" />
 | 
			
		||||
              <img src="./components/img/4.png" alt="" v-else />
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <div class="right">
 | 
			
		||||
              <div class="rightTop">{{ item.name }}</div>
 | 
			
		||||
              <div class="rightBottom">
 | 
			
		||||
                <span>{{ item.idNumber.replace(/^(\w{6})\w{8}(.*)$/, '$1****$2') }}</span>
 | 
			
		||||
 | 
			
		||||
                <span>{{ item.phone }}</span>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div> -->
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <AiEmpty v-else></AiEmpty>
 | 
			
		||||
      </div>
 | 
			
		||||
      </div> -->
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="currentTabBar2" v-if="currentTabBar == 2">
 | 
			
		||||
@@ -192,14 +198,14 @@ export default {
 | 
			
		||||
      Echarts2: null,
 | 
			
		||||
      areaId: '',
 | 
			
		||||
      currentPeople: 0,
 | 
			
		||||
      tabPeopleList: [
 | 
			
		||||
        {
 | 
			
		||||
          name: '本地居民',
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          name: '流动人员',
 | 
			
		||||
        },
 | 
			
		||||
      ],
 | 
			
		||||
      // tabPeopleList: [
 | 
			
		||||
      //   {
 | 
			
		||||
      //     name: '本地居民',
 | 
			
		||||
      //   },
 | 
			
		||||
      //   {
 | 
			
		||||
      //     name: '流动人员',
 | 
			
		||||
      //   },
 | 
			
		||||
      // ],
 | 
			
		||||
      current: 1,
 | 
			
		||||
      keyword: '',
 | 
			
		||||
      data: [],
 | 
			
		||||
@@ -212,6 +218,10 @@ export default {
 | 
			
		||||
      todayList2: [],
 | 
			
		||||
      counts1: '',
 | 
			
		||||
      counts2: '',
 | 
			
		||||
      page2: { current: 1, size: 10, total: 0 },
 | 
			
		||||
      search2: { name: '' },
 | 
			
		||||
      page1: { current: 1, size: 10, total: 0 },
 | 
			
		||||
      search1: { name: '' },
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
@@ -226,10 +236,37 @@ export default {
 | 
			
		||||
    this.Echarts1 = echarts.init(document.getElementById('echarts1'))
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    getList() {
 | 
			
		||||
      this.$http
 | 
			
		||||
        .post('/app/wxcp/wxcustomer/list', null, {
 | 
			
		||||
          params: { ...this.page1, ...this.search, type: 1 },
 | 
			
		||||
        })
 | 
			
		||||
        .then((res) => {
 | 
			
		||||
          if (res?.data) {
 | 
			
		||||
            if (this.page.current > 1) {
 | 
			
		||||
              this.data = [...this.data, ...res.data.records]
 | 
			
		||||
            } else this.data = res.data.records
 | 
			
		||||
            this.page.total = res.data.total
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
    },
 | 
			
		||||
    reachBottom() {
 | 
			
		||||
      if (this.page.total > this.list.length) {
 | 
			
		||||
        this.page.current++
 | 
			
		||||
        this.getList()
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    showResident({ id }) {
 | 
			
		||||
      id &&
 | 
			
		||||
        uni.navigateTo({
 | 
			
		||||
          url: './resident?id=' + id,
 | 
			
		||||
        })
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getList2() {
 | 
			
		||||
      this.$http
 | 
			
		||||
        .post('/app/wxcp/wxgroup/list', null, {
 | 
			
		||||
          params: { ...this.page, ...this.search },
 | 
			
		||||
          params: { ...this.page2, ...this.search },
 | 
			
		||||
        })
 | 
			
		||||
        .then((res) => {
 | 
			
		||||
          if (res?.data) {
 | 
			
		||||
@@ -247,7 +284,7 @@ export default {
 | 
			
		||||
 | 
			
		||||
    reachBottom() {
 | 
			
		||||
      if (this.page.total > this.list.length) {
 | 
			
		||||
        this.page.current++
 | 
			
		||||
        this.page.current = this.page.current + 1
 | 
			
		||||
        this.getList2()
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@@ -258,26 +295,28 @@ export default {
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getList() {
 | 
			
		||||
      this.$http
 | 
			
		||||
        .post('/app/wxcp/wxcustomer/list', null, {
 | 
			
		||||
          params: {
 | 
			
		||||
            size: 10,
 | 
			
		||||
            current: this.current,
 | 
			
		||||
            areaId: this.areaId,
 | 
			
		||||
            name: this.keyword,
 | 
			
		||||
            residentType: this.currentPeople == 0 ? '0' : '1',
 | 
			
		||||
          },
 | 
			
		||||
        })
 | 
			
		||||
        .then((res) => {
 | 
			
		||||
          if (res.code == 0) {
 | 
			
		||||
            this.data = this.current > 1 ? [...this.data, ...res.data.records] : res.data.records
 | 
			
		||||
            this.pages = res.data.pages
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
    },
 | 
			
		||||
    // getList() {
 | 
			
		||||
    //   this.$http
 | 
			
		||||
    //     .post('/app/wxcp/wxcustomer/list', null, {
 | 
			
		||||
    //       params: {
 | 
			
		||||
    //         size: 10,
 | 
			
		||||
    //         current: this.current,
 | 
			
		||||
    //         areaId: this.areaId,
 | 
			
		||||
    //         name: this.keyword,
 | 
			
		||||
    //         residentType: this.currentPeople == 0 ? '0' : '1',
 | 
			
		||||
    //       },
 | 
			
		||||
    //     })
 | 
			
		||||
    //     .then((res) => {
 | 
			
		||||
    //       if (res.code == 0) {
 | 
			
		||||
    //         this.data = this.current > 1 ? [...this.data, ...res.data.records] : res.data.records
 | 
			
		||||
    //         this.pages = res.data.pages
 | 
			
		||||
    //       }
 | 
			
		||||
    //     })
 | 
			
		||||
    // },
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // 居民群统计
 | 
			
		||||
 | 
			
		||||
    getEchart1() {
 | 
			
		||||
      this.$http.post(`/app/wxcp/wxgroup/groupStatistic`).then((res) => {
 | 
			
		||||
        if (res.code === 0) {
 | 
			
		||||
@@ -501,26 +540,26 @@ export default {
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    toDetailCard(item) {
 | 
			
		||||
      uni.navigateTo({ url: `./DetailCard?id=${item.id}` })
 | 
			
		||||
    },
 | 
			
		||||
    // toDetailCard(item) {
 | 
			
		||||
    //   uni.navigateTo({ url: `./DetailCard?id=${item.id}` })
 | 
			
		||||
    // },
 | 
			
		||||
 | 
			
		||||
    areaSelect(e) {
 | 
			
		||||
      this.areaId = e.id
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
    // areaSelect(e) {
 | 
			
		||||
    //   this.areaId = e.id
 | 
			
		||||
    //   this.getList()
 | 
			
		||||
    // },
 | 
			
		||||
 | 
			
		||||
    handerSearch(e) {
 | 
			
		||||
      this.keyword = e
 | 
			
		||||
      this.current = 1
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
    // handerSearch(e) {
 | 
			
		||||
    //   this.keyword = e
 | 
			
		||||
    //   this.current = 1
 | 
			
		||||
    //   this.getList()
 | 
			
		||||
    // },
 | 
			
		||||
 | 
			
		||||
    handerClear() {
 | 
			
		||||
      this.keyword = ''
 | 
			
		||||
      this.current = 1
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
    // handerClear() {
 | 
			
		||||
    //   this.keyword = ''
 | 
			
		||||
    //   this.current = 1
 | 
			
		||||
    //   this.getList()
 | 
			
		||||
    // },
 | 
			
		||||
 | 
			
		||||
    changeTab(e) {
 | 
			
		||||
      this.currentTabBar = e
 | 
			
		||||
@@ -651,52 +690,124 @@ uni-page-body {
 | 
			
		||||
  .currentTabBar1 {
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    background: #fff;
 | 
			
		||||
    .AiAreaPicker {
 | 
			
		||||
      padding: 16px 0 14px 12px;
 | 
			
		||||
    }
 | 
			
		||||
    ::v-deep .AiTopFixed {
 | 
			
		||||
      b.title {
 | 
			
		||||
        color: #333;
 | 
			
		||||
        font-size: 32px;
 | 
			
		||||
 | 
			
		||||
    .line {
 | 
			
		||||
      height: 16px;
 | 
			
		||||
      background: #f5f5f5;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .peopleCard {
 | 
			
		||||
      background: #fff;
 | 
			
		||||
      .seachObj {
 | 
			
		||||
        border-bottom: 2px solid #f5f5f5;
 | 
			
		||||
        border-top: 2px solid #f5f5f5;
 | 
			
		||||
        padding: 20px 32px;
 | 
			
		||||
      }
 | 
			
		||||
      .datas {
 | 
			
		||||
        .datass {
 | 
			
		||||
          display: flex;
 | 
			
		||||
          padding: 24px 32px;
 | 
			
		||||
          .left {
 | 
			
		||||
            img {
 | 
			
		||||
              width: 80px;
 | 
			
		||||
              height: 80px;
 | 
			
		||||
              border-radius: 50%;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          .right {
 | 
			
		||||
            display: flex;
 | 
			
		||||
            flex-direction: column;
 | 
			
		||||
            margin-left: 32px;
 | 
			
		||||
            width: 100%;
 | 
			
		||||
            .rightTop {
 | 
			
		||||
              font-size: 32px;
 | 
			
		||||
              font-weight: 500;
 | 
			
		||||
              color: #333333;
 | 
			
		||||
            }
 | 
			
		||||
            .rightBottom {
 | 
			
		||||
              display: flex;
 | 
			
		||||
              justify-content: space-between;
 | 
			
		||||
              margin-top: 8px;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        & > i {
 | 
			
		||||
          color: #267fce;
 | 
			
		||||
          font-style: normal;
 | 
			
		||||
          margin: 0 4px;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ::v-deep .mainPane {
 | 
			
		||||
      background: #fff;
 | 
			
		||||
      padding: 0 32px;
 | 
			
		||||
 | 
			
		||||
      .AiCell {
 | 
			
		||||
        flex-shrink: 0;
 | 
			
		||||
        justify-content: flex-start;
 | 
			
		||||
 | 
			
		||||
        .content {
 | 
			
		||||
          flex: 1;
 | 
			
		||||
          min-width: 0;
 | 
			
		||||
          max-width: unset;
 | 
			
		||||
          border-bottom: 1px solid rgba(221, 221, 221, 1);
 | 
			
		||||
          min-height: 160px;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .card {
 | 
			
		||||
        text-align: left;
 | 
			
		||||
 | 
			
		||||
        b {
 | 
			
		||||
          max-width: 100%;
 | 
			
		||||
          white-space: nowrap;
 | 
			
		||||
          overflow: hidden;
 | 
			
		||||
          text-overflow: ellipsis;
 | 
			
		||||
          font-size: 36px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .tag {
 | 
			
		||||
          justify-content: center;
 | 
			
		||||
          background: #f3f4f7;
 | 
			
		||||
          border-radius: 4px;
 | 
			
		||||
          padding: 0 16px;
 | 
			
		||||
          font-size: 28px;
 | 
			
		||||
          font-weight: 400;
 | 
			
		||||
          color: #333;
 | 
			
		||||
          margin-left: 16px;
 | 
			
		||||
          margin-bottom: 16px;
 | 
			
		||||
          height: 56px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .realName {
 | 
			
		||||
          width: 100%;
 | 
			
		||||
          margin-top: 8px;
 | 
			
		||||
          font-size: 28px;
 | 
			
		||||
          font-weight: 400;
 | 
			
		||||
          color: #999;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .AiImage {
 | 
			
		||||
        margin-right: 24px;
 | 
			
		||||
 | 
			
		||||
        image {
 | 
			
		||||
          width: 112px;
 | 
			
		||||
          height: 112px;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    // .AiAreaPicker {
 | 
			
		||||
    //   padding: 16px 0 14px 12px;
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    // .line {
 | 
			
		||||
    //   height: 16px;
 | 
			
		||||
    //   background: #f5f5f5;
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    // .peopleCard {
 | 
			
		||||
    //   background: #fff;
 | 
			
		||||
    //   .seachObj {
 | 
			
		||||
    //     border-bottom: 2px solid #f5f5f5;
 | 
			
		||||
    //     border-top: 2px solid #f5f5f5;
 | 
			
		||||
    //     padding: 20px 32px;
 | 
			
		||||
    //   }
 | 
			
		||||
    //   .datas {
 | 
			
		||||
    //     .datass {
 | 
			
		||||
    //       display: flex;
 | 
			
		||||
    //       padding: 24px 32px;
 | 
			
		||||
    //       .left {
 | 
			
		||||
    //         img {
 | 
			
		||||
    //           width: 80px;
 | 
			
		||||
    //           height: 80px;
 | 
			
		||||
    //           border-radius: 50%;
 | 
			
		||||
    //         }
 | 
			
		||||
    //       }
 | 
			
		||||
    //       .right {
 | 
			
		||||
    //         display: flex;
 | 
			
		||||
    //         flex-direction: column;
 | 
			
		||||
    //         margin-left: 32px;
 | 
			
		||||
    //         width: 100%;
 | 
			
		||||
    //         .rightTop {
 | 
			
		||||
    //           font-size: 32px;
 | 
			
		||||
    //           font-weight: 500;
 | 
			
		||||
    //           color: #333333;
 | 
			
		||||
    //         }
 | 
			
		||||
    //         .rightBottom {
 | 
			
		||||
    //           display: flex;
 | 
			
		||||
    //           justify-content: space-between;
 | 
			
		||||
    //           margin-top: 8px;
 | 
			
		||||
    //         }
 | 
			
		||||
    //       }
 | 
			
		||||
    //     }
 | 
			
		||||
    //   }
 | 
			
		||||
    // }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .currentTabBar2 {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										129
									
								
								src/apps/AppResidentFile/components/document.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								src/apps/AppResidentFile/components/document.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,129 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <section class="document">
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <div class="info">
 | 
			
		||||
        <u-image border-radius="4" :src="top.detail.avatar" width="118" height="118"/>
 | 
			
		||||
        <div class="fill">
 | 
			
		||||
          <b>{{ top.detail.realName || top.detail.name }}</b>
 | 
			
		||||
          <u-row>
 | 
			
		||||
            <span class="idNumber" v-html="IDObj.id"/>
 | 
			
		||||
            <a @tap="showID=!showID">{{ IDObj.btn }}</a>
 | 
			
		||||
          </u-row>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <AiCell label="性别">{{ $dict.getLabel("sex", resident.sex) || "-" }}</AiCell>
 | 
			
		||||
      <AiCell label="出生日期">{{ resident.birthDate }}</AiCell>
 | 
			
		||||
      <AiCell label="年龄">{{ resident.age }}</AiCell>
 | 
			
		||||
      <AiCell label="籍贯">{{ resident.birthplaceAreaName }}</AiCell>
 | 
			
		||||
      <AiCell label="民族">{{ $dict.getLabel("nation", resident.nation) || "-" }}</AiCell>
 | 
			
		||||
      <AiCell label="文化程度">{{ $dict.getLabel("education", resident.education) || "-" }}</AiCell>
 | 
			
		||||
      <AiCell label="兵役状况">{{ $dict.getLabel("militaryStatus", resident.militaryStatus) || "-" }}</AiCell>
 | 
			
		||||
      <AiCell label="政治面貌">{{ $dict.getLabel("politicsStatus", resident.politicsStatus) || "-" }}</AiCell>
 | 
			
		||||
      <AiCell label="职业">{{ $dict.getLabel("job", resident.job) || "-" }}</AiCell>
 | 
			
		||||
      <AiCell label="宗教信仰">{{ $dict.getLabel("faithType", resident.faithType) || "-" }}</AiCell>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <AiCell title label="联络信息"/>
 | 
			
		||||
      <AiCell label="联系方式">{{ resident.phone }}</AiCell>
 | 
			
		||||
      <AiCell label="现住址">{{ resident.currentAreaName + resident.currentAddress }}</AiCell>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <AiCell title label="家庭信息"/>
 | 
			
		||||
      <AiCell label="是否户主">{{ $dict.getLabel("householdName", resident.householdName) || "-" }}</AiCell>
 | 
			
		||||
      <AiCell label="与户主关系">{{ $dict.getLabel("householdRelation", resident.householdRelation) || "-" }}</AiCell>
 | 
			
		||||
      <AiCell label="现住址">{{ resident.householdAreaName + resident.householdAddress }}</AiCell>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <AiCell title label="家庭成员"/>
 | 
			
		||||
      <AiTable :data="family" :colConfigs="colConfigs"/>
 | 
			
		||||
    </div>
 | 
			
		||||
  </section>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "document",
 | 
			
		||||
  inject: ['top'],
 | 
			
		||||
  computed: {
 | 
			
		||||
    IDObj() {
 | 
			
		||||
      return this.showID ? {
 | 
			
		||||
        id: this.resident?.idNumber,
 | 
			
		||||
        btn: '隐藏'
 | 
			
		||||
      } : {
 | 
			
		||||
        id: this.resident?.idNumber?.replace(/(\d{10}).+/g, '$1******'),
 | 
			
		||||
        btn: '显示'
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    colConfigs() {
 | 
			
		||||
      return [
 | 
			
		||||
        {label: "与户主关系", prop: "householdRelation", width: '160rpx', dict: "householdRelation"},
 | 
			
		||||
        {label: "姓名", prop: "name", width: '120rpx'},
 | 
			
		||||
        {label: "性别", prop: "sex", dict: "sex"},
 | 
			
		||||
        {label: "年龄", prop: "age"},
 | 
			
		||||
        {label: "身份证号", prop: "idNumber", width: '320rpx'},
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    resident() {
 | 
			
		||||
      let obj = {}
 | 
			
		||||
      Object.keys(this.top.detail?.residentInfo?.resident || {}).map(e => {
 | 
			
		||||
        obj[e] = this.top.detail?.residentInfo?.resident[e] || ""
 | 
			
		||||
      })
 | 
			
		||||
      return obj
 | 
			
		||||
    },
 | 
			
		||||
    family() {
 | 
			
		||||
      return this.top.detail?.residentInfo?.family?.map(e => ({...e, householdRelation: e.householdRelation || "户主"}))
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      showID: false,
 | 
			
		||||
      familyList: []
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  created() {
 | 
			
		||||
    this.$dict.load("sex", "nation", "education", "job",
 | 
			
		||||
        "faithType", "politicsStatus", "militaryStatus", "householdRelation",
 | 
			
		||||
        "householdName")
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
.document {
 | 
			
		||||
  overflow-y: auto;
 | 
			
		||||
  background: #F5F5F5;
 | 
			
		||||
 | 
			
		||||
  .info {
 | 
			
		||||
    height: 186px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
 | 
			
		||||
    .fill {
 | 
			
		||||
      color: #3C7FC8;
 | 
			
		||||
      margin-left: 24px;
 | 
			
		||||
      font-size: 28px;
 | 
			
		||||
      line-height: 40px;
 | 
			
		||||
      display: flex;
 | 
			
		||||
      flex-direction: column;
 | 
			
		||||
 | 
			
		||||
      b {
 | 
			
		||||
        font-size: 36px;
 | 
			
		||||
        color: #333;
 | 
			
		||||
        margin-bottom: 8px;
 | 
			
		||||
        line-height: 50px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      a {
 | 
			
		||||
        cursor: pointer;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .idNumber {
 | 
			
		||||
        margin-right: 16px;
 | 
			
		||||
        color: #999;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										353
									
								
								src/apps/AppResidentFile/components/info.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										353
									
								
								src/apps/AppResidentFile/components/info.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,353 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <section class="info">
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <div class="baseInfo">
 | 
			
		||||
        <u-image border-radius="4" :src="top.detail.avatar" width="118" height="118"/>
 | 
			
		||||
        <div class="fill">
 | 
			
		||||
          <b>{{ top.detail.name }}</b>
 | 
			
		||||
          <div v-if="top.detail.type==1" class="wx">@微信</div>
 | 
			
		||||
          <div v-if="top.detail.type==2">@企业微信</div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="certBtn" @tap="handleCert">{{ !isCert ? "实名认证" : "解绑" }}</div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <u-row>
 | 
			
		||||
        <AiCell class="half" top-label label="来源">{{ $dict.getLabel("wxCustomerAddWay", top.detail.addWay) }}</AiCell>
 | 
			
		||||
        <AiCell class="half" top-label label="添加时间">{{ top.detail.createTime }}</AiCell>
 | 
			
		||||
        <AiCell class="half" top-label label="真实姓名">{{ top.detail.realName }}</AiCell>
 | 
			
		||||
        <AiCell class="half" top-label label="手机号码">{{ resident.phone || "-" }}</AiCell>
 | 
			
		||||
        <AiCell class="half" top-label label="家庭积分">{{ resident.familyIntegral }}</AiCell>
 | 
			
		||||
        <AiCell class="half" top-label label="个人积分">{{ resident.personalIntegral }}</AiCell>
 | 
			
		||||
      </u-row>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <AiCell title label="公共标签">
 | 
			
		||||
        <u-icon label="添加" size="38" name="iconAdd" custom-prefix="iconfont" color="#1365DD"
 | 
			
		||||
                label-color="#1365DD" @tap="top.showTagManage=true"/>
 | 
			
		||||
      </AiCell>
 | 
			
		||||
      <AiCell top-label v-for="(op,name) in tagsList" :label="name" :key="name">
 | 
			
		||||
        <u-row>
 | 
			
		||||
          <div class="tag" v-for="(tag,j) in op" :key="j">{{ tag }}</div>
 | 
			
		||||
        </u-row>
 | 
			
		||||
      </AiCell>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <AiCell title label="动态"/>
 | 
			
		||||
      <AiCell top-label>
 | 
			
		||||
        <div class="logItem" v-for="item in customLogs" :key="item.id">
 | 
			
		||||
          <div flex class="column" shrink>
 | 
			
		||||
            <div class="dot"/>
 | 
			
		||||
            <div class="line fill"/>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div flex class="start column">
 | 
			
		||||
            <b>{{ $dict.getLabel('wxCustomerLogType', item.type) }}</b>
 | 
			
		||||
            <span>{{ item.createTime }}</span>
 | 
			
		||||
            <div v-html="item.content"/>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </AiCell>
 | 
			
		||||
    </div>
 | 
			
		||||
    <u-mask :show="dialog" @tap="dialog=false">
 | 
			
		||||
      <div class="bindCert" @tap.stop>
 | 
			
		||||
        <b class="title">实名认证</b>
 | 
			
		||||
        <u-input class="searchInput" v-model="search" clearable placeholder="请输入姓名或身份证号" @input="handleSearch"/>
 | 
			
		||||
        <div class="residents">
 | 
			
		||||
          <div flex class="spb" v-for="(op,i) in result" :key="i" @tap="bindCert(op.id)">
 | 
			
		||||
            <div v-html="op.name"/>
 | 
			
		||||
            <div v-html="op.idNumber"/>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </u-mask>
 | 
			
		||||
    <div bottom>
 | 
			
		||||
      <u-button type="primary" @tap="handleWechat">微信联系</u-button>
 | 
			
		||||
      <u-button v-if="isMobile" :disabled="!resident.phone" @tap="handleTel">电话联系</u-button>
 | 
			
		||||
    </div>
 | 
			
		||||
  </section>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import {mapActions} from "vuex";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "info",
 | 
			
		||||
  inject: ['top'],
 | 
			
		||||
  computed: {
 | 
			
		||||
    resident() {
 | 
			
		||||
      return this.top.detail?.residentInfo?.resident || {}
 | 
			
		||||
    },
 | 
			
		||||
    tagsList() {
 | 
			
		||||
      let obj = {}
 | 
			
		||||
      this.top.detail?.tags?.map(e => {
 | 
			
		||||
        if (e.type == 1 && e?.groupName) {
 | 
			
		||||
          if (obj?.[e.groupName]) {
 | 
			
		||||
            obj[e.groupName].push(e.tagName)
 | 
			
		||||
          } else {
 | 
			
		||||
            obj[e.groupName] = [e.tagName]
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      return obj
 | 
			
		||||
    },
 | 
			
		||||
    isCert() {
 | 
			
		||||
      return !!this.top?.detail?.residentInfo
 | 
			
		||||
    },
 | 
			
		||||
    isMobile() {
 | 
			
		||||
      return ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]
 | 
			
		||||
      .some(e => navigator.userAgent.indexOf(e) > -1)
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      dialog: false,
 | 
			
		||||
      search: "",
 | 
			
		||||
      result: [],
 | 
			
		||||
      customLogs: []
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    ...mapActions(['injectJWeixin', 'wxInvoke']),
 | 
			
		||||
    searchResident() {
 | 
			
		||||
      this.$http.post("/app/appresident/check-name", null, {
 | 
			
		||||
        params: {name: this.search}
 | 
			
		||||
      }).then(res => {
 | 
			
		||||
        if (res?.data) {
 | 
			
		||||
          let reg = new RegExp(this.search, 'g')
 | 
			
		||||
          this.result = res.data?.map(e => ({
 | 
			
		||||
            ...e,
 | 
			
		||||
            name: e.name.replace(reg, `<b>${this.search}</b>`),
 | 
			
		||||
            idNumber: e.idNumber.replace(reg, `<b>${this.search}</b>`),
 | 
			
		||||
          }))
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    handleSearch() {
 | 
			
		||||
      if (this.search?.length >= 2) {
 | 
			
		||||
        this.searchResident()
 | 
			
		||||
      } else {
 | 
			
		||||
        this.result = []
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    handleCert() {
 | 
			
		||||
      if (this.isCert) {
 | 
			
		||||
        this.$confirm("是否要解绑当前实名认证?").then(() => {
 | 
			
		||||
          this.$http.post("/app/wxcp/wxcustomer/unBindCustomer2Resident", null, {
 | 
			
		||||
            params: {residentId: this.resident.id, customerId: this.top.custom}
 | 
			
		||||
          }).then(res => {
 | 
			
		||||
            if (res?.code == 0) {
 | 
			
		||||
              this.$u.toast("解除绑定成功!")
 | 
			
		||||
              this.top.getContact()
 | 
			
		||||
            }
 | 
			
		||||
          })
 | 
			
		||||
        })
 | 
			
		||||
      } else this.dialog = true
 | 
			
		||||
    },
 | 
			
		||||
    bindCert(residentId) {
 | 
			
		||||
      this.dialog = false
 | 
			
		||||
      this.$confirm("是否要绑定该居民?").then(() => {
 | 
			
		||||
        this.$http.post("/app/wxcp/wxcustomer/bindCustomer2Resident", null, {
 | 
			
		||||
          params: {residentId, customerId: this.top.custom}
 | 
			
		||||
        }).then(res => {
 | 
			
		||||
          if (res?.code == 0) {
 | 
			
		||||
            this.$u.toast("绑定成功!")
 | 
			
		||||
            this.top.getContact()
 | 
			
		||||
          }
 | 
			
		||||
        }).catch(err => {
 | 
			
		||||
          this.$u.toast(err)
 | 
			
		||||
          setTimeout(() => this.dialog = true, 1000)
 | 
			
		||||
        })
 | 
			
		||||
      }).catch(() => this.dialog = true)
 | 
			
		||||
    },
 | 
			
		||||
    getCustomLog(customerId) {
 | 
			
		||||
      customerId && this.$http.post("/app/wxcp/wxcustomerlog/listAll", null, {
 | 
			
		||||
        params: {customerId}
 | 
			
		||||
      }).then(res => {
 | 
			
		||||
        if (res?.data) {
 | 
			
		||||
          this.customLogs = res.data
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    handleTel() {
 | 
			
		||||
      location.href = "tel:" + this.resident.phone
 | 
			
		||||
    },
 | 
			
		||||
    handleWechat() {
 | 
			
		||||
      this.wxInvoke(['openUserProfile', {
 | 
			
		||||
        type: 2,
 | 
			
		||||
        userid: this.top.custom
 | 
			
		||||
      }, () => 0])
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  created() {
 | 
			
		||||
    this.$dict.load("wxCustomerAddWay", 'wxCustomerLogType')
 | 
			
		||||
    this.getCustomLog(this.top.custom)
 | 
			
		||||
    this.injectJWeixin('openUserProfile')
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
.info {
 | 
			
		||||
  padding-bottom: 130px;
 | 
			
		||||
 | 
			
		||||
  .certBtn {
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    background: $uni-color-primary;
 | 
			
		||||
    color: #fff;
 | 
			
		||||
    padding: 8px 16px;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .baseInfo {
 | 
			
		||||
    height: 186px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
 | 
			
		||||
    .fill {
 | 
			
		||||
      color: #3C7FC8;
 | 
			
		||||
      margin-left: 24px;
 | 
			
		||||
      font-size: 28px;
 | 
			
		||||
      line-height: 40px;
 | 
			
		||||
 | 
			
		||||
      b {
 | 
			
		||||
        font-size: 36px;
 | 
			
		||||
        color: #333;
 | 
			
		||||
        margin-bottom: 8px;
 | 
			
		||||
        line-height: 50px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .wx {
 | 
			
		||||
        color: #2EA222;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ::v-deep .AiCell {
 | 
			
		||||
    &.half {
 | 
			
		||||
      width: 50%;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ::v-deep .u-form-item {
 | 
			
		||||
    width: 50%;
 | 
			
		||||
    min-height: 124px;
 | 
			
		||||
 | 
			
		||||
    .u-form-item--left {
 | 
			
		||||
      color: #999;
 | 
			
		||||
      min-height: 40px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .u-form-item--right {
 | 
			
		||||
      min-height: 0;
 | 
			
		||||
      margin-top: 16px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ::v-deep .u-mask {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
 | 
			
		||||
    .bindCert {
 | 
			
		||||
      width: 600px;
 | 
			
		||||
      padding: 32px;
 | 
			
		||||
      min-height: 400px;
 | 
			
		||||
      background-color: #fff;
 | 
			
		||||
      display: flex;
 | 
			
		||||
      flex-direction: column;
 | 
			
		||||
      color: #333;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .residents {
 | 
			
		||||
      max-height: 780px;
 | 
			
		||||
      overflow-y: auto;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .title {
 | 
			
		||||
      text-align: center;
 | 
			
		||||
      font-size: 36px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .searchInput {
 | 
			
		||||
      margin: 16px 0;
 | 
			
		||||
      border: 1px solid #D0D4DC;
 | 
			
		||||
      border-radius: 8px;
 | 
			
		||||
      padding: 0 16px !important;
 | 
			
		||||
      flex: 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .spb {
 | 
			
		||||
      height: 60px;
 | 
			
		||||
      cursor: pointer;
 | 
			
		||||
      padding: 0 16px;
 | 
			
		||||
 | 
			
		||||
      b {
 | 
			
		||||
        font-size: 32px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &:nth-of-type(2n) {
 | 
			
		||||
        background: #eee;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ::v-deep .logItem {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    min-height: 220px;
 | 
			
		||||
 | 
			
		||||
    &:last-of-type {
 | 
			
		||||
      .line {
 | 
			
		||||
        display: none;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    & > .column + .column {
 | 
			
		||||
      margin-left: 16px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .dot {
 | 
			
		||||
      flex-shrink: 0;
 | 
			
		||||
      width: 16px;
 | 
			
		||||
      height: 16px;
 | 
			
		||||
      background: $uni-color-primary;
 | 
			
		||||
      border: 8px solid #FFFFFF;
 | 
			
		||||
      border-radius: 50%;
 | 
			
		||||
      margin: 8px 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .line {
 | 
			
		||||
      width: 4px;
 | 
			
		||||
      background: #eee;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .start {
 | 
			
		||||
      font-size: 26px;
 | 
			
		||||
      font-weight: 400;
 | 
			
		||||
      color: #666;
 | 
			
		||||
 | 
			
		||||
      b {
 | 
			
		||||
        color: #333;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      i {
 | 
			
		||||
        color: $uni-color-primary;
 | 
			
		||||
        font-style: normal;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      & > b {
 | 
			
		||||
        font-size: 32px;
 | 
			
		||||
        font-weight: bold;
 | 
			
		||||
        margin-bottom: 8px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      & > span {
 | 
			
		||||
        color: #999;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      & > div {
 | 
			
		||||
        margin-top: 16px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										153
									
								
								src/apps/AppResidentFile/resident.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								src/apps/AppResidentFile/resident.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,153 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <section class="resident">
 | 
			
		||||
    <AiLoading v-if="!custom && !error" tips="获取居民信息中..." />
 | 
			
		||||
    <AiResult v-else-if="error" status="error" :tips="error" />
 | 
			
		||||
    <template v-else>
 | 
			
		||||
      <tag-manage v-if="showTagManage" />
 | 
			
		||||
      <template v-else>
 | 
			
		||||
        <AiTopFixed>
 | 
			
		||||
          <u-tabs :list="tabs" :is-scroll="false" :current="currentType" font-size="32" bar-width="192" height="96" @change="handleTabClick" />
 | 
			
		||||
        </AiTopFixed>
 | 
			
		||||
        <component :is="currentTab.comp" />
 | 
			
		||||
      </template>
 | 
			
		||||
    </template>
 | 
			
		||||
    <AiBack v-if="isNormal && !showTagManage" />
 | 
			
		||||
  </section>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { mapActions } from 'vuex'
 | 
			
		||||
import Info from './components/info'
 | 
			
		||||
import Document from './components/document'
 | 
			
		||||
import TagManage from './tagManage.vue'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'resident',
 | 
			
		||||
  components: { TagManage, Document, Info },
 | 
			
		||||
  provide() {
 | 
			
		||||
    return {
 | 
			
		||||
      top: this,
 | 
			
		||||
      id: '',
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    tabs() {
 | 
			
		||||
      return [
 | 
			
		||||
        { name: '居民信息', value: 0, comp: Info },
 | 
			
		||||
        { name: '居民档案', value: 1, comp: Document, hide: !this.detail.residentInfo },
 | 
			
		||||
      ].filter((e) => !e.hide)
 | 
			
		||||
    },
 | 
			
		||||
    currentTab() {
 | 
			
		||||
      return this.tabs.find((e) => e.value == this.currentType)
 | 
			
		||||
    },
 | 
			
		||||
    isNormal() {
 | 
			
		||||
      return !!this.id
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      currentType: 0,
 | 
			
		||||
      detail: {},
 | 
			
		||||
      showTagManage: false,
 | 
			
		||||
      custom: '',
 | 
			
		||||
      error: '',
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    ...mapActions(['injectJWeixin', 'wxInvoke']),
 | 
			
		||||
    handleTabClick(i) {
 | 
			
		||||
      this.currentType = i
 | 
			
		||||
    },
 | 
			
		||||
    getContact() {
 | 
			
		||||
      if (this.isNormal) {
 | 
			
		||||
        this.getCustom(this.id)
 | 
			
		||||
      } else {
 | 
			
		||||
        this.injectJWeixin('getCurExternalContact')
 | 
			
		||||
          .then(() => {
 | 
			
		||||
            this.wxInvoke([
 | 
			
		||||
              'getCurExternalContact',
 | 
			
		||||
              {},
 | 
			
		||||
              (res) => {
 | 
			
		||||
                if (res?.err_msg == 'getCurExternalContact:ok') {
 | 
			
		||||
                  this.getCustom(res.userId)
 | 
			
		||||
                }
 | 
			
		||||
              },
 | 
			
		||||
            ])
 | 
			
		||||
          })
 | 
			
		||||
          .catch(({ errMsg }) => {
 | 
			
		||||
            this.error = errMsg
 | 
			
		||||
          })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    getCustom(id) {
 | 
			
		||||
      this.$http
 | 
			
		||||
        .post('/app/wxcp/wxcustomer/queryCustomerById', null, {
 | 
			
		||||
          params: { id },
 | 
			
		||||
        })
 | 
			
		||||
        .then((ret) => {
 | 
			
		||||
          if (ret?.data) {
 | 
			
		||||
            this.custom = id
 | 
			
		||||
            this.detail = ret.data
 | 
			
		||||
            if (this.detail.type == 2) {
 | 
			
		||||
              this.error = '只能查看个人微信绑定的居民信息'
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  onLoad(o) {
 | 
			
		||||
    this.id = o.id
 | 
			
		||||
    this.getContact()
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
.resident {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  background: #f5f5f5;
 | 
			
		||||
 | 
			
		||||
  .error {
 | 
			
		||||
    font-size: 32px;
 | 
			
		||||
    color: #666;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ::v-deep .u-scroll-box {
 | 
			
		||||
    border-bottom: 1px solid #d4d4d4;
 | 
			
		||||
 | 
			
		||||
    .u-tab-bar {
 | 
			
		||||
      position: absolute;
 | 
			
		||||
      bottom: -6px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ::v-deep .card {
 | 
			
		||||
    background: #fff;
 | 
			
		||||
    margin-bottom: 16px;
 | 
			
		||||
    padding: 16px 32px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .half {
 | 
			
		||||
    width: 50%;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ::v-deep .tag {
 | 
			
		||||
    height: 56px;
 | 
			
		||||
    line-height: 56px;
 | 
			
		||||
    background: #f3f4f7;
 | 
			
		||||
    border-radius: 6px;
 | 
			
		||||
    padding: 8px 16px;
 | 
			
		||||
    margin-right: 16px;
 | 
			
		||||
    margin-bottom: 16px;
 | 
			
		||||
    overflow: hidden;
 | 
			
		||||
    cursor: default;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
		Reference in New Issue
	
	Block a user