Merge branch 'dev' of http://git.sinoecare.com/sinoecare/digital_village_v2/dvcp_v2_wechat_app into dev
This commit is contained in:
		@@ -72,7 +72,6 @@
 | 
			
		||||
<script>
 | 
			
		||||
import {mapActions, mapState} from 'vuex'
 | 
			
		||||
 | 
			
		||||
const navbarTitle = wx.getAccountInfoSync().miniProgram.appId == "wx41792b6cbf573dc0" ? "平昌党建" : "数字平昌"
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'AppHome',
 | 
			
		||||
  appName: "首页",
 | 
			
		||||
@@ -103,7 +102,7 @@ export default {
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  onReady() {
 | 
			
		||||
    uni.setNavigationBarTitle({title: navbarTitle})
 | 
			
		||||
    uni.setNavigationBarTitle({title: '数字平昌'})
 | 
			
		||||
  },
 | 
			
		||||
  onLoad() {
 | 
			
		||||
    this.autoLogin().then(() => {
 | 
			
		||||
@@ -240,7 +239,7 @@ export default {
 | 
			
		||||
 | 
			
		||||
  onShareAppMessage() {
 | 
			
		||||
    return {
 | 
			
		||||
      title: `欢迎使用${navbarTitle}~`,
 | 
			
		||||
      title: `欢迎使用数字平昌~`,
 | 
			
		||||
      path: `/pages/AppHome/AppHome`
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										353
									
								
								src/project/pingchang/AppMine/AppMine.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										353
									
								
								src/project/pingchang/AppMine/AppMine.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,353 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="page">
 | 
			
		||||
    <div class="header-bg">
 | 
			
		||||
      <div class="header-info">
 | 
			
		||||
        <div class="wrap" @click="handleLogin()">
 | 
			
		||||
          <div class="user-img-div">
 | 
			
		||||
            <img :src="user.avatarUrl" alt="" class="user-img" v-if="user.id && user.avatarUrl"/>
 | 
			
		||||
            <open-data type="userAvatarUrl" lang="zh_CN" class="user-img" v-else/>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="user-info">
 | 
			
		||||
            <div class="option">
 | 
			
		||||
              <template v-if="!user.id">
 | 
			
		||||
                <p>登录</p>
 | 
			
		||||
                <p>点击进行登录</p>
 | 
			
		||||
              </template>
 | 
			
		||||
              <template v-else>
 | 
			
		||||
                <p v-if="isApprove">{{ user.realName }}</p>
 | 
			
		||||
                <p v-else>{{ user.nickName }}</p>
 | 
			
		||||
                <p>{{ user.areaName || "" }}</p>
 | 
			
		||||
              </template>
 | 
			
		||||
            </div>
 | 
			
		||||
            <p class="info" v-if="user.id" @click.stop="$linkTo('./userInfo')">个人信息</p>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="approve">
 | 
			
		||||
      <img class="icon" src="./authentication-img.png" alt="">
 | 
			
		||||
      <div class="flex">
 | 
			
		||||
        <span class="cert" v-if="isApprove" v-text="approveLabel" @click="$linkTo('/mods/AppAuth/AppAuth')"/>
 | 
			
		||||
        <u-icon v-else name="arrow-right" color="#E7F2FF" size="28"
 | 
			
		||||
                :label="approveLabel" label-color="#E7F2FF" label-pos="left" @click="approve"/>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <!-- <div class="list-wrap">
 | 
			
		||||
      <div class="card" v-for="(group,index) in listGroup" :key="index">
 | 
			
		||||
        <div class="item" v-for="(item) in group" hover-class="bg-hover" :key="item.label"
 | 
			
		||||
             @click="linkTo(item.path, item.type)">
 | 
			
		||||
          <div class="block">
 | 
			
		||||
            <img class="icon" :src="item.icon" alt="">
 | 
			
		||||
          </div>
 | 
			
		||||
          <span class="desc" v-if="!item.share">{{ item.label }}</span>
 | 
			
		||||
          <button open-type="share" v-else>
 | 
			
		||||
            <span>{{ item.label }}</span>
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div> -->
 | 
			
		||||
    <AiLogin ref="login" @success="getAuth()"/>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
import {mapActions, mapState} from "vuex";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "AppMine",
 | 
			
		||||
  appName: "我的",
 | 
			
		||||
  customNavigation: true,
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapState(['user', 'token']),
 | 
			
		||||
    isApprove() {
 | 
			
		||||
      return this.user?.status == 2;
 | 
			
		||||
    },
 | 
			
		||||
    approveLabel() {
 | 
			
		||||
      return this.user?.status == 2 ? "已认证" :
 | 
			
		||||
          this.user?.status == 1 ? "审核中" :
 | 
			
		||||
              this.user?.status == -1 ? "审核驳回" : "前往认证"
 | 
			
		||||
    },
 | 
			
		||||
    listGroup() {
 | 
			
		||||
      return [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            icon: "https://cdn.cunwuyun.cn/wxmp/mine/wodejiating.png",
 | 
			
		||||
            label: "我的家庭",
 | 
			
		||||
            path: "./myFamily",
 | 
			
		||||
            type: 'idNumber'
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            icon: "https://cdn.cunwuyun.cn/wxmp/mine/wodejiaxiang.png",
 | 
			
		||||
            label: "我的家乡",
 | 
			
		||||
            path: "/mods/AppHometown/AppHometown",
 | 
			
		||||
            type: 'token'
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            icon: "https://cdn.cunwuyun.cn/wxmp/mine/wodejifen.png",
 | 
			
		||||
            label: "我的积分",
 | 
			
		||||
            path: "/mods/AppCreditPoints/AppCreditPoints?type=detail",
 | 
			
		||||
            type: 'idNumber'
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            icon: "https://cdn.cunwuyun.cn/wxmp/mine/chaoshidingdan.png",
 | 
			
		||||
            label: "超市订单",
 | 
			
		||||
            path: "/mods/AppOrderList/AppOrderList",
 | 
			
		||||
            type: 'idNumber'
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            icon: "https://cdn.cunwuyun.cn/wxmp/mine/banshijindu.png",
 | 
			
		||||
            label: "办事进度",
 | 
			
		||||
            path: "/mods/AppMyPlan/AppMyPlan",
 | 
			
		||||
            type: 'idNumber'
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    ...mapActions(['getUserInfo']),
 | 
			
		||||
    approve() {
 | 
			
		||||
      if (!this.token) {
 | 
			
		||||
        this.$refs.login.show();
 | 
			
		||||
      } else if (!this.isApprove) {
 | 
			
		||||
        if (this.user.status == 0) {
 | 
			
		||||
          this.$linkTo('/mods/AppAuth/AppAuth');
 | 
			
		||||
        } else {
 | 
			
		||||
          this.$linkTo('/mods/AppAuth/authSuccess')
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    linkTo(url, type) {
 | 
			
		||||
      if (type) {
 | 
			
		||||
        if (this.token) {
 | 
			
		||||
          if (type == 'token') {
 | 
			
		||||
            this.$linkTo(url)
 | 
			
		||||
          }
 | 
			
		||||
          if (type == 'idNumber') {
 | 
			
		||||
            if (this.user.status == 0) {
 | 
			
		||||
              if (!this.user.phone) {
 | 
			
		||||
                this.$linkTo('/pages/phone/bingPhoneNumber?from=auth')
 | 
			
		||||
              } else {
 | 
			
		||||
                this.$linkTo('/mods/AppAuth/AppAuth')
 | 
			
		||||
              }
 | 
			
		||||
            } else {
 | 
			
		||||
              this.$linkTo(url)
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          this.$refs.login.show()
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        this.$linkTo(url)
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    handleLogin() {
 | 
			
		||||
      if (!this.token) {
 | 
			
		||||
        this.$refs.login.show();
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    getAuth() {
 | 
			
		||||
      this.$nextTick(() => {
 | 
			
		||||
        this.token && this.getUserInfo()
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  onShow() {
 | 
			
		||||
    this.getAuth();
 | 
			
		||||
  },
 | 
			
		||||
  onShareAppMessage() {
 | 
			
		||||
    return {
 | 
			
		||||
      title: `欢迎使用数字平昌~`,
 | 
			
		||||
      path: `/pages/AppHome/AppHome`
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
@import "~dvcp-wui/common";
 | 
			
		||||
 | 
			
		||||
.page {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  min-height: 100%;
 | 
			
		||||
  background-color: #F3F6F9;
 | 
			
		||||
  position: relative;
 | 
			
		||||
 | 
			
		||||
  .header-bg {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 512px;
 | 
			
		||||
    position: relative;
 | 
			
		||||
 | 
			
		||||
    .header-info {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      height: 100%;
 | 
			
		||||
      background: url("https://cdn.cunwuyun.cn/wxmp/sanjianxi/mineBg.png") no-repeat no-repeat;
 | 
			
		||||
      background-size: 100% 100%;
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      padding: 240px 0 0 48px;
 | 
			
		||||
 | 
			
		||||
      .wrap {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        height: 96px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
 | 
			
		||||
        .user-img-div {
 | 
			
		||||
          display: inline-block;
 | 
			
		||||
          width: 96px;
 | 
			
		||||
          height: 96px;
 | 
			
		||||
          border-radius: 50%;
 | 
			
		||||
          overflow: hidden;
 | 
			
		||||
          border: 4px solid #FFFFFF;
 | 
			
		||||
          flex-shrink: 0;
 | 
			
		||||
 | 
			
		||||
          .user-img {
 | 
			
		||||
            display: inline-block;
 | 
			
		||||
            width: 96px;
 | 
			
		||||
            height: 96px;
 | 
			
		||||
            border-radius: 58px;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .user-info {
 | 
			
		||||
          flex: 1;
 | 
			
		||||
          display: flex;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
          justify-content: space-between;
 | 
			
		||||
          margin-left: 26px;
 | 
			
		||||
          box-sizing: border-box;
 | 
			
		||||
          padding-right: 32px;
 | 
			
		||||
 | 
			
		||||
          .option {
 | 
			
		||||
            & > p:first-child {
 | 
			
		||||
              font-size: 34px;
 | 
			
		||||
              font-weight: 600;
 | 
			
		||||
              color: #333333;
 | 
			
		||||
              line-height: 54px;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            & > p:last-child {
 | 
			
		||||
              font-size: 26px;
 | 
			
		||||
              font-weight: 400;
 | 
			
		||||
              color: #7088A0;
 | 
			
		||||
              line-height: 36px;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          .info {
 | 
			
		||||
            width: 136px;
 | 
			
		||||
            height: 48px;
 | 
			
		||||
            border-radius: 8px;
 | 
			
		||||
            border: 2px solid #7088A0;
 | 
			
		||||
            font-size: 26px;
 | 
			
		||||
            font-weight: 400;
 | 
			
		||||
            color: #7088A0;
 | 
			
		||||
            display: flex;
 | 
			
		||||
            align-items: center;
 | 
			
		||||
            justify-content: center;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .approve {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    left: 50%;
 | 
			
		||||
    top: 400px;
 | 
			
		||||
    transform: translateX(-50%);
 | 
			
		||||
    width: 686px;
 | 
			
		||||
    height: 112px;
 | 
			
		||||
    background: linear-gradient(90deg, #8FB4FF 0%, #4181FF 100%);
 | 
			
		||||
    border-radius: 16px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    padding: 0 20px;
 | 
			
		||||
 | 
			
		||||
    .icon {
 | 
			
		||||
      width: 296px;
 | 
			
		||||
      height: 52px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .cert {
 | 
			
		||||
      font-family: PingFangSC-Regular, PingFang SC;
 | 
			
		||||
      font-size: 28px;
 | 
			
		||||
      color: #E7F2FF;
 | 
			
		||||
      margin-right: 4px;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .list-wrap {
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    padding: 32px;
 | 
			
		||||
 | 
			
		||||
    .card {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      min-height: 100px;
 | 
			
		||||
      border-radius: 16px;
 | 
			
		||||
      background-color: #fff;
 | 
			
		||||
      margin-bottom: 32px;
 | 
			
		||||
 | 
			
		||||
      .item {
 | 
			
		||||
        height: 100px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
 | 
			
		||||
        &:last-child {
 | 
			
		||||
          .desc {
 | 
			
		||||
            border-bottom: none !important;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .block {
 | 
			
		||||
          width: 80px;
 | 
			
		||||
          height: 100%;
 | 
			
		||||
          display: flex;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
          justify-content: center;
 | 
			
		||||
          flex-shrink: 0;
 | 
			
		||||
 | 
			
		||||
          .icon {
 | 
			
		||||
            width: 44px;
 | 
			
		||||
            height: 44px;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .desc, & > button {
 | 
			
		||||
          height: 100%;
 | 
			
		||||
          flex: 1;
 | 
			
		||||
          font-size: 30px;
 | 
			
		||||
          font-weight: 400;
 | 
			
		||||
          color: #666666;
 | 
			
		||||
          display: flex;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
          border-bottom: 1px solid #EEEEEE;
 | 
			
		||||
 | 
			
		||||
          & > span {
 | 
			
		||||
            width: 100%;
 | 
			
		||||
            height: 100%;
 | 
			
		||||
            text-align: left;
 | 
			
		||||
            display: flex;
 | 
			
		||||
            align-items: center;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          &::after {
 | 
			
		||||
            border: none;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .no-border {
 | 
			
		||||
          border-bottom: none;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &:first-of-type {
 | 
			
		||||
        margin-bottom: 32px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/project/pingchang/AppMine/authentication-img.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/project/pingchang/AppMine/authentication-img.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 22 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/project/pingchang/AppMine/me.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/project/pingchang/AppMine/me.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 993 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/project/pingchang/AppMine/me_selected.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/project/pingchang/AppMine/me_selected.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.0 KiB  | 
							
								
								
									
										180
									
								
								src/project/pingchang/AppMine/myFamily.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								src/project/pingchang/AppMine/myFamily.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,180 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="page">
 | 
			
		||||
    <div class="credit-points">
 | 
			
		||||
      <div class="bg-blue"></div>
 | 
			
		||||
      <div class="header-content">
 | 
			
		||||
        <div class="title">家庭地址</div>
 | 
			
		||||
        <div class="address">
 | 
			
		||||
          <img src="https://cdn.cunwuyun.cn/img/location-blue.svg" alt="">
 | 
			
		||||
          <p>{{ info.resident.currentAreaName || '' }}{{ info.resident.currentAddress || '' }}</p>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="list-content">
 | 
			
		||||
        <div class="title">家庭成员</div>
 | 
			
		||||
        <div class="item" v-for="(item, index) in info.family" :key="index">
 | 
			
		||||
          <img src="https://cdn.cunwuyun.cn/dvcp/myFamily/1.png" alt="" class="banner-top" v-if="item.sex == 1">
 | 
			
		||||
          <img src="https://cdn.cunwuyun.cn/dvcp/myFamily/2.png" alt="" class="banner-top" v-else>
 | 
			
		||||
          <div class="user-img">
 | 
			
		||||
            <img v-if="item.photo" :src="item.photo" alt=""/>
 | 
			
		||||
            <img v-else src="https://cdn.cunwuyun.cn/dvcp/myFamily/tx.png" alt=""/>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="user-info">
 | 
			
		||||
            <p>{{ item.name }}</p>
 | 
			
		||||
            <div v-if="item.householdName == 1" class="color-5AAD6A">户主</div>
 | 
			
		||||
            <div v-else>{{ $dict.getLabel('householdRelation', item.householdRelation) }}</div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
import {mapState} from 'vuex'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  appName: "我的家庭",
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapState(['user', 'token'])
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      info: {}
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  onLoad() {
 | 
			
		||||
    this.$dict.load('householdRelation').then(() => {
 | 
			
		||||
      this.$nextTick(() => {
 | 
			
		||||
        this.getUser()
 | 
			
		||||
      })
 | 
			
		||||
    })
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    getUser() {
 | 
			
		||||
      this.$instance.post(`/app/appresident/detailForWx?id=${this.user.residentId}`).then(res => {
 | 
			
		||||
        if (res.code === 0) {
 | 
			
		||||
          this.info = res.data
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
@import "~dvcp-wui/common";
 | 
			
		||||
 | 
			
		||||
.page {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  background-color: #f3f6f9;
 | 
			
		||||
 | 
			
		||||
  .credit-points {
 | 
			
		||||
    .bg-blue {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      height: 112px;
 | 
			
		||||
      background-color: #197DF0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .header-content {
 | 
			
		||||
      width: 690px;
 | 
			
		||||
      background: #FFF;
 | 
			
		||||
      border-radius: 16px;
 | 
			
		||||
      margin: -80px 0 32px 30px;
 | 
			
		||||
      padding: 0 30px 80px;
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.02);
 | 
			
		||||
 | 
			
		||||
      .address {
 | 
			
		||||
        font-size: 32px;
 | 
			
		||||
        color: #666;
 | 
			
		||||
        overflow: hidden;
 | 
			
		||||
 | 
			
		||||
        img {
 | 
			
		||||
          width: 34px;
 | 
			
		||||
          height: 38px;
 | 
			
		||||
          margin-right: 14px;
 | 
			
		||||
          vertical-align: middle;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        p {
 | 
			
		||||
          line-height: 44px;
 | 
			
		||||
          width: 580px;
 | 
			
		||||
          word-break: break-all;
 | 
			
		||||
          float: right;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .title {
 | 
			
		||||
      font-size: 32px;
 | 
			
		||||
      font-weight: 500;
 | 
			
		||||
      color: #333;
 | 
			
		||||
      line-height: 120px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .list-content {
 | 
			
		||||
      width: 690px;
 | 
			
		||||
      background: #FFF;
 | 
			
		||||
      border-radius: 16px;
 | 
			
		||||
      padding: 0 30px 110px;
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      margin-left: 30px;
 | 
			
		||||
      box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.02);
 | 
			
		||||
 | 
			
		||||
      .item {
 | 
			
		||||
        width: 630px;
 | 
			
		||||
        height: 192px;
 | 
			
		||||
        background: #FFF;
 | 
			
		||||
        box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.08);
 | 
			
		||||
        border-radius: 16px;
 | 
			
		||||
        padding-left: 30px;
 | 
			
		||||
        box-sizing: border-box;
 | 
			
		||||
        margin-bottom: 32px;
 | 
			
		||||
        overflow: hidden;
 | 
			
		||||
 | 
			
		||||
        .banner-top {
 | 
			
		||||
          width: 100%;
 | 
			
		||||
          height: 72px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .user-img {
 | 
			
		||||
          width: 104px;
 | 
			
		||||
          height: 104px;
 | 
			
		||||
          margin: -16px 34px 0 0;
 | 
			
		||||
          border-radius: 50%;
 | 
			
		||||
          float: left;
 | 
			
		||||
 | 
			
		||||
          img {
 | 
			
		||||
            width: 100%;
 | 
			
		||||
            height: 100%;
 | 
			
		||||
            border-radius: 50%;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .user-info {
 | 
			
		||||
          margin-top: -16px;
 | 
			
		||||
          width: calc(100% - 138px);
 | 
			
		||||
          float: right;
 | 
			
		||||
 | 
			
		||||
          p {
 | 
			
		||||
            font-size: 32px;
 | 
			
		||||
            font-weight: 600;
 | 
			
		||||
            color: #333;
 | 
			
		||||
            line-height: 44px;
 | 
			
		||||
            margin-bottom: 8px;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          div {
 | 
			
		||||
            font-size: 26px;
 | 
			
		||||
            font-weight: 400;
 | 
			
		||||
            color: #666;
 | 
			
		||||
            line-height: 36px;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          .color-5AAD6A {
 | 
			
		||||
            color: #5AAD6A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										222
									
								
								src/project/pingchang/AppMine/userInfo.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										222
									
								
								src/project/pingchang/AppMine/userInfo.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,222 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="page">
 | 
			
		||||
    <div class="info-list">
 | 
			
		||||
      <div class="item-content mar-b8">
 | 
			
		||||
        <div class="item solid">
 | 
			
		||||
          <p class="mar-t22">头像</p>
 | 
			
		||||
          <button class="user-img-div" open-type="chooseAvatar" @chooseavatar="handleWeixinSync">
 | 
			
		||||
            <img :src="user.avatarUrl" class="user-img">
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="item">
 | 
			
		||||
          <p>用户昵称</p>
 | 
			
		||||
          <div v-if="!editNickName" @click="editNickName=true">
 | 
			
		||||
            <p class="name" v-text="nickName"/>
 | 
			
		||||
          </div>
 | 
			
		||||
          <input v-else type="nickname" class="editNickName" v-model="nickName" @blur="handleWeixinSync">
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="item-content mar-b8">
 | 
			
		||||
        <div class="item">
 | 
			
		||||
          <p>手机号</p>
 | 
			
		||||
          <div>{{ user.phone || '' }}</div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="item-content" @click="onLogout">
 | 
			
		||||
        <div class="item">
 | 
			
		||||
          <p class="login-out">退出登录</p>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
import {mapActions, mapState} from 'vuex'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "userInfo",
 | 
			
		||||
  appName: "个人中心",
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapState(['user', 'token']),
 | 
			
		||||
    nickName: {
 | 
			
		||||
      set(v) {
 | 
			
		||||
      },
 | 
			
		||||
      get() {
 | 
			
		||||
        const {nickName} = this.user
 | 
			
		||||
        return nickName
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  onLoad() {
 | 
			
		||||
    this.getUserInfo()
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      editNickName: false
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    ...mapActions(['getUserInfo', 'autoLogin']),
 | 
			
		||||
    upLoad(img) {
 | 
			
		||||
      return new Promise((resolve, reject) => {
 | 
			
		||||
        uni.uploadFile({
 | 
			
		||||
          url: `${this.$instance.defaults.baseURL}/admin/file/add`,
 | 
			
		||||
          filePath: img,
 | 
			
		||||
          name: 'file',
 | 
			
		||||
          header: {
 | 
			
		||||
            'Content-Type': 'multipart/form-data',
 | 
			
		||||
            Authorization: uni.getStorageSync('token')
 | 
			
		||||
          },
 | 
			
		||||
          success: uploadFileRes => {
 | 
			
		||||
            resolve(uploadFileRes)
 | 
			
		||||
          },
 | 
			
		||||
          fail: err => {
 | 
			
		||||
            reject(err)
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    onLogout() {
 | 
			
		||||
      uni.showModal({
 | 
			
		||||
        title: '提示',
 | 
			
		||||
        content: "是否要退出登录",
 | 
			
		||||
        success: res => {
 | 
			
		||||
          if (res.confirm) {
 | 
			
		||||
            this.$store.commit('logout')
 | 
			
		||||
            this.$toast('退出成功');
 | 
			
		||||
            setTimeout(() => {
 | 
			
		||||
              uni.switchTab({
 | 
			
		||||
                url: '/pages/AppMine/AppMine'
 | 
			
		||||
              })
 | 
			
		||||
            }, 500)
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    handleWeixinSync({detail}) {
 | 
			
		||||
      const {value: nickName, avatarUrl} = detail
 | 
			
		||||
      this.autoLogin({nickName, avatarUrl})
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
@import "~dvcp-wui/common";
 | 
			
		||||
 | 
			
		||||
.page {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  background-color: #F5F5F5;
 | 
			
		||||
 | 
			
		||||
  .info-list {
 | 
			
		||||
    margin: 0 0 16px 0;
 | 
			
		||||
 | 
			
		||||
    .item-content {
 | 
			
		||||
      padding: 0 32px;
 | 
			
		||||
      background-color: #fff;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .item {
 | 
			
		||||
      padding: 36px 0;
 | 
			
		||||
      line-height: 40px;
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      box-sizing: content-box;
 | 
			
		||||
      display: flex;
 | 
			
		||||
      justify-content: space-between;
 | 
			
		||||
 | 
			
		||||
      p {
 | 
			
		||||
        color: #333;
 | 
			
		||||
        font-weight: 400;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      div {
 | 
			
		||||
        color: #666;
 | 
			
		||||
        font-size: 28px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .user-img-div {
 | 
			
		||||
        width: 104px;
 | 
			
		||||
        height: 104px;
 | 
			
		||||
        border-radius: 50%;
 | 
			
		||||
        overflow: hidden;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .user-img {
 | 
			
		||||
        width: 104px;
 | 
			
		||||
        height: 104px;
 | 
			
		||||
        vertical-align: middle;
 | 
			
		||||
        border-radius: 50%;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .right-icon {
 | 
			
		||||
        width: 40px;
 | 
			
		||||
        height: 40px;
 | 
			
		||||
        vertical-align: middle;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .mar-t22 {
 | 
			
		||||
        margin-top: 44px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .login-out {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      font-size: 30px;
 | 
			
		||||
      text-align: center;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .self-knowledge-show {
 | 
			
		||||
    position: fixed;
 | 
			
		||||
    left: 0;
 | 
			
		||||
    top: 0;
 | 
			
		||||
    z-index: 100;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    background: rgba(0, 0, 0, 0.3);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .toast-bg {
 | 
			
		||||
    position: fixed;
 | 
			
		||||
    z-index: 101;
 | 
			
		||||
    top: 50%;
 | 
			
		||||
    left: 50%;
 | 
			
		||||
    transform: translate(-50%, -50%);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .toast {
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    width: 686px;
 | 
			
		||||
    height: 316px;
 | 
			
		||||
    font-size: 36px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .toast-msg {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    line-height: 50px;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    font-weight: 500;
 | 
			
		||||
    padding: 84px 0 80px 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .toast-btn {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    width: 120px;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    line-height: 50px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .cancel {
 | 
			
		||||
    margin-left: 394px;
 | 
			
		||||
    margin-right: 40px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .confirm {
 | 
			
		||||
    color: #197DF0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .editNickName {
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    font-size: 28px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										171
									
								
								src/project/pingchang/AppPartyAuth/AppPartyAuth.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								src/project/pingchang/AppPartyAuth/AppPartyAuth.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,171 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="AppPartyAuth">
 | 
			
		||||
    <div class="top">
 | 
			
		||||
      <img src="https://cdn.cunwuyun.cn/AppAuth/security.png" alt="">
 | 
			
		||||
      <span class="toast">请验证你的个人信息</span>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form">
 | 
			
		||||
      <u-input placeholder="请输入姓名" trim placeholder-style="color:#ccc;font-size:17px"
 | 
			
		||||
               :custom-style="{height:'72px',borderBottom:'1px solid #ddd'}" v-model="name"/>
 | 
			
		||||
      <u-input placeholder="请输入身份证号码" trim placeholder-style="color:#ccc;font-size:17px"
 | 
			
		||||
               :custom-style="{height:'72px'}" v-model="idNumber" maxlength="18"/>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="btn" @click="confirm()">提交</div>
 | 
			
		||||
    <!-- <div class="promise">以上信息将为你严格保密</div> -->
 | 
			
		||||
    <div class="bottom-text">
 | 
			
		||||
      <u-checkbox v-model="isChecked"></u-checkbox>
 | 
			
		||||
      <span @click="isChecked=!isChecked">阅读并同意</span>
 | 
			
		||||
      <span class="deal" @click.stop="toAgreement()">《用户服务及隐私协议》</span>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
import {mapState} from 'vuex';
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "AppPartyAuth",
 | 
			
		||||
  appName: "党员认证",
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapState(['user']),
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      name: '',
 | 
			
		||||
      idNumber: '',
 | 
			
		||||
      isChecked: false,
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  onLoad() {
 | 
			
		||||
    // 0未认证 1认证中 2已认证 3认证失败
 | 
			
		||||
    let {partyStatusForWX} = this.user
 | 
			
		||||
    if (partyStatusForWX == 2) {
 | 
			
		||||
      uni.redirectTo({url: "./partyAuthInfo"})
 | 
			
		||||
    } else if (partyStatusForWX == 0) {
 | 
			
		||||
      // 停留此页
 | 
			
		||||
    } else if(partyStatusForWX == 1) {
 | 
			
		||||
      uni.redirectTo({url: "./partyAuthSuccess"})
 | 
			
		||||
    } else if(partyStatusForWX == 3) {
 | 
			
		||||
      uni.redirectTo({url: "./partyAuthSuccess"})
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    toAgreement() {
 | 
			
		||||
      uni.navigateTo({url: "./partyAgreement"})
 | 
			
		||||
    },
 | 
			
		||||
    confirm() {
 | 
			
		||||
      let {name, idNumber} = this
 | 
			
		||||
      if (!name) {
 | 
			
		||||
        return this.$u.toast('请填写姓名')
 | 
			
		||||
      }
 | 
			
		||||
      if (!idNumber) {
 | 
			
		||||
        return this.$u.toast('请填写身份证号码')
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (!this.$idCardNoUtil.checkIdCardNo(idNumber)) {
 | 
			
		||||
        return this.$u.toast('请输入正确的身份证号码')
 | 
			
		||||
      }
 | 
			
		||||
      if(!this.isChecked) {
 | 
			
		||||
        return this.$u.toast('请勾选用户服务及隐私协议')
 | 
			
		||||
      }
 | 
			
		||||
      this.$instance.post(`/app/appwechatuser/idNumberAttestation`, {
 | 
			
		||||
        idNumber, name
 | 
			
		||||
      }).then(res => {
 | 
			
		||||
        if (res.code == 0) {
 | 
			
		||||
          if (res.data == 2 || res.data == 0) {
 | 
			
		||||
            this.$store.dispatch('getUserInfo')
 | 
			
		||||
            uni.redirectTo({
 | 
			
		||||
              url: `./partyAuthSuccess?status=${res.data}`, success: () => {
 | 
			
		||||
                if (res.data == 0) {
 | 
			
		||||
                  uni.setStorageSync("authForm", {idNumber, name})
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            })
 | 
			
		||||
          } else {
 | 
			
		||||
            uni.redirectTo({url: "./partyAuthSuccess"})
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          this.$u.toast(res.msg);
 | 
			
		||||
          setTimeout(() => {
 | 
			
		||||
            uni.navigateBack();
 | 
			
		||||
          }, 500)
 | 
			
		||||
        }
 | 
			
		||||
      }).catch(err => {
 | 
			
		||||
        this.$u.toast(err)
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
<style lang="scss" scope>
 | 
			
		||||
@import "~dvcp-wui/common";
 | 
			
		||||
 | 
			
		||||
.top {
 | 
			
		||||
  height: 480px;
 | 
			
		||||
  background: #4181FF;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  padding-top: 48px;
 | 
			
		||||
 | 
			
		||||
  & > img {
 | 
			
		||||
    width: 160px;
 | 
			
		||||
    height: 160px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .toast {
 | 
			
		||||
    margin-top: 32px;
 | 
			
		||||
    font-size: 44px;
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    color: #D9E5FF;
 | 
			
		||||
    line-height: 60px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.form {
 | 
			
		||||
  width: 686px;
 | 
			
		||||
  background: #FFFFFF;
 | 
			
		||||
  margin: -132px auto 0;
 | 
			
		||||
  box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.02);
 | 
			
		||||
  border-radius: 16px;
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  padding: 0 48px;
 | 
			
		||||
 | 
			
		||||
  .input {
 | 
			
		||||
    width: 590px;
 | 
			
		||||
    height: 144px;
 | 
			
		||||
    border-bottom: 2px solid #DDDDDD;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.btn {
 | 
			
		||||
  width: 686px;
 | 
			
		||||
  height: 88px;
 | 
			
		||||
  margin: 80px auto 0;
 | 
			
		||||
  background: #4181FF;
 | 
			
		||||
  border-radius: 16px;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  font-size: 34px;
 | 
			
		||||
  font-weight: 500;
 | 
			
		||||
  color: #FFFFFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.bottom-text {
 | 
			
		||||
  padding: 0 48px;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  margin-top: 30px;
 | 
			
		||||
  .deal {
 | 
			
		||||
    color: #4181ff;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.promise {
 | 
			
		||||
  font-size: 28px;
 | 
			
		||||
  font-weight: 400;
 | 
			
		||||
  color: #999999;
 | 
			
		||||
  line-height: 40px;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  margin-top: 48px;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/project/pingchang/AppPartyAuth/img/success.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/project/pingchang/AppPartyAuth/img/success.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 29 KiB  | 
							
								
								
									
										286
									
								
								src/project/pingchang/AppPartyAuth/partyAgreement.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										286
									
								
								src/project/pingchang/AppPartyAuth/partyAgreement.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,286 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="partyAgreement">
 | 
			
		||||
    <h1>“村微数字乡村”平台用户服务及隐私协议</h1>
 | 
			
		||||
 | 
			
		||||
    <p>您的信任对我们非常重要,我们深知个人信息对您的重要性,我们将按法律法规要求,采取相应安全保护措施,尽力保护您的个人信息安全可控。有鉴于此,“村微数字乡村”平台产品和服务提供者(或简称“我们”)制定本《用户服务及隐私协议》(下称“本协议”)并提醒您:</p>
 | 
			
		||||
 | 
			
		||||
    <p>本协议适用于“村微数字乡村”平台产品及服务,包括“村微数字乡村”小程序端以及将“村微数字乡村”平台部分功能/服务作为第三方服务集成在其他第三方智能硬件、软件或服务中。</p>
 | 
			
		||||
 | 
			
		||||
    <p>在使用“村微数字乡村”平台产品或服务前,请您务必仔细阅读并透彻理解本协议全部内容,在确认充分理解并同意后使用相关产品或服务。一旦您开始使用“村微数字乡村”平台产品或服务,即表示您已充分理解并同意本协议。</p>
 | 
			
		||||
 | 
			
		||||
    <p>如您对本协议内容有任何疑问、意见或建议,请通过文末的联系方式与我们联系。
 | 
			
		||||
    特别提示:</p>
 | 
			
		||||
 | 
			
		||||
    <p>本隐私协议不适用于其他第三方通过前述网页或客户端向您提供的服务。例如您通过“村微数字乡村”平台开放平台下载使用的第三方应用或者依托“村微数字乡村”平台产品向您提供服务时,您向第三方提供的信息不适用本协议。</p>
 | 
			
		||||
 | 
			
		||||
    <p>第一部分 定义</p>
 | 
			
		||||
 | 
			
		||||
    <p>“村微数字乡村”平台服务:是指由“村微数字乡村”平台服务提供者开发、运营,旨在为基层政府及群众提供简单、便利工具的多端平台。包括“村微数字乡村”小程序端及“村微数字乡村”移动端、PC端以及将“村微数字乡村”平台部分功能/服务作为第三方服务集成在其他第三方软件和/或智能硬件而提供的服务。 “村微数字乡村”平台服务提供者:是指研发并提供“村微数字乡村”平台产品和服务的中卫慧通科技有限公司,以下简称“我们”。</p>
 | 
			
		||||
    <p>
 | 
			
		||||
    <p>个人信息:指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。</p>
 | 
			
		||||
    <p>
 | 
			
		||||
    <p>个人敏感信息:包括身份证件号码、手机号码、个人生物识别信息、银行账号、财产信息、行踪轨迹、交易信息、14岁以下(含)儿童的个人信息等。</p>
 | 
			
		||||
    <p>
 | 
			
		||||
    <p>个人信息删除:指在实现日常业务功能所涉及的系统中去除个人信息的行为,使其保持不可被检索、访问的状态。</p>
 | 
			
		||||
 | 
			
		||||
    <p>第二部分 法律声明</p>
 | 
			
		||||
 | 
			
		||||
    <p>一、权利归属</p>
 | 
			
		||||
 | 
			
		||||
    <p>“村微数字乡村”平台的Logo、“村微数字乡村”平台等文字、图形及其组合,以及“村微数字乡村”平台其他标识、徽记、“村微数字乡村”平台服务的名称等为“村微数字乡村”平台在中国和其他国家的注册商标。未经“村微数字乡村”平台书面授权,任何人不得以任何方式展示、使用或做其他处理(包括但不限于复制、传播、展示、镜像、上传、下载),也不得向他人表明您有权展示、使用或做其他处理。</p>
 | 
			
		||||
    <p>
 | 
			
		||||
    <p>“村微数字乡村”平台所有的产品、服务、技术与所有应用程序或其组件/功能(以下或简称“技术服务”)的知识产权均归属于“村微数字乡村”平台所有或归其权利人所有。 除非另行声明,“村微数字乡村”平台拥有“村微数字乡村”平台在网站内发布文档等信息(包括但不限于文字、图形、图片、照片、音频、视频、图标、色彩、版面设计、电子文档)的所有权利(包括但不限于版权、商标权、专利权、商业秘密和其他所有相关权利)。未经“村微数字乡村”平台许可,任何人不得擅自使用如上内容(包括但不限于通过程序或设备监视、复制、转播、展示、镜像、上传、下载“村微数字乡村”平台网站内的任何内容)。被授权浏览、复制、打印和传播属于“村微数字乡村”平台产品和服务内信息内容的,都不得用于商业目的,且所有信息内容及其任何部分的使用都必须包括此权利声明。</p>
 | 
			
		||||
 | 
			
		||||
    <p>二、责任限制</p>
 | 
			
		||||
 | 
			
		||||
    <p>“村微数字乡村”平台用户在“村微数字乡村”平台小程序端以及开放平台上自行上传、提供、发布相关信息,包括但不限于用户名称、公司名称、 联系人及联络信息,相关图片、资讯等,该等信息均由用户自行提供,“村微数字乡村”平台用户须对其提供的任何信息依法承担全部责任。</p>
 | 
			
		||||
 | 
			
		||||
    <p>“村微数字乡村”平台转载作品出于传递更多信息之目的,并不意味“村微数字乡村”平台赞同其观点或证实其内容的真实性。</p>
 | 
			
		||||
 | 
			
		||||
    <p>“村微数字乡村”平台在此提示,您在使用“村微数字乡村”平台产品及服务期间应当遵守中华人民共和国的法律,不得危害网络安全,不得利用“村微数字乡村”平台产品及服务从事侵犯他人名誉、隐私、知识产权和其他合法权益的活动。尽管有前述提示,“村微数字乡村”平台不对您使用“村微数字乡村”平台产品及服务的用途和目的承担任何责任。</p>
 | 
			
		||||
 | 
			
		||||
    <p>三、知识产权保护</p>
 | 
			
		||||
 | 
			
		||||
    <p>我们尊重知识产权,反对并打击侵犯知识产权的行为。任何组织或个人认为“村微数字乡村”平台提供的产品及服务(如转载文章、发布的信息、“村微数字乡村”平台开放平台入驻的第三方应用及其发布的信息等)可能侵犯其合法权益的,可以通过以下形式向“村微数字乡村”平台提出书面权利通知,“村微数字乡村”平台将在收到知识产权权利人合格通知后依法尽快处理:</p>
 | 
			
		||||
 | 
			
		||||
    <p>1. 通过邮寄的方式将通知书及证明材料原件邮寄至:</p>
 | 
			
		||||
 | 
			
		||||
    <p>收件人:武汉中卫慧通科技有限公司</p>
 | 
			
		||||
 | 
			
		||||
    <p>地址:湖北省武汉市武昌区和平大道840号绿地蓝海A座22楼</p>
 | 
			
		||||
 | 
			
		||||
    <p>邮编:430070</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <p>第三部分隐私协议</p>
 | 
			
		||||
 | 
			
		||||
    <p>本隐私协议部分将帮助您了解以下内容:</p>
 | 
			
		||||
 | 
			
		||||
    <p>1. 我们如何收集和使用您的个人信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>2. 我们如何使用Cookie和同类技术</p>
 | 
			
		||||
 | 
			
		||||
    <p>3. 我们如何共享、转让、公开披露您的个人信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>4. 我们如何保护您的个人信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>5. 我们如何处理未成年人的个人信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>6. 您的个人信息如何在全球范围转移</p>
 | 
			
		||||
 | 
			
		||||
    <p>7. 本隐私协议如何更新</p>
 | 
			
		||||
 | 
			
		||||
    <p>8. 如何联系我们</p>
 | 
			
		||||
 | 
			
		||||
    <p>一、我们如何收集和使用您的个人信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>(一) 我们如何收集您的信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>我们会出于本协议所述的以下目的,收集和使用您的个人信息:</p>
 | 
			
		||||
 | 
			
		||||
    <p>1.帮助您成为“村微数字乡村”平台用户</p>
 | 
			
		||||
 | 
			
		||||
    <p>注册成为“村微数字乡村”用户,以便我们为您提供服务,包括小程序的所有服务功能,您需要通过微信授权我们获取您的手机号、昵称、实名认证、性别、生日等基本信息。如您需实现多方通话功能,则您需要您授权我们访问您的手机通讯录。如果您仅需使用浏览、搜索“村微数字乡村”基本服务及介绍,您不需要注册成为我们的会员及提供上述信息。</p>
 | 
			
		||||
 | 
			
		||||
    <p>当您所在组织机构注销“村微数字乡村”平台时,我们将会匿名或删除您在该组织的相关个人信息,但你作为“村微数字乡村”平台用户的信息仍将保留,除非您主动注销“村微数字乡村”平台账号;在您主动注销账户之后,我们将停止为您提供产品或服务,根据适用法律的要求删除您的个人信息,或使其匿名化处理。</p>
 | 
			
		||||
 | 
			
		||||
    <p>2.向您提供产品或服务</p>
 | 
			
		||||
 | 
			
		||||
    <p>1)您向我们提供的信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>在服务使用过程中,您可以对“村微数字乡村”平台产品及服务的体验问题反馈,帮助我们更好地了解您使用我们产品或服务的体验和需求,改善我们产品或服务。</p>
 | 
			
		||||
 | 
			
		||||
    <p>您可以通过“村微数字乡村”平台为其他人订购产品或服务,您需要提供该实际订购人的前述个人信息。向我们提供该实际订购人的前述个人信息之前,您需确保您已经取得其授权同意。若前述个人不同意,我们将不对该个人可能造成的侵权承当相应法律责任。</p>
 | 
			
		||||
 | 
			
		||||
    <p>2)我们在您使用服务过程中收集的信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>为向您提供更契合您需求的智能硬件和/或软件、页面展示和搜索结果、了解产品适配性、识别账号异常状态,我们会收集关于您使用产品、服务以及使用方式的信息并将这些信息进行关联,这些信息包括:</p>
 | 
			
		||||
 | 
			
		||||
    <p>设备信息:我们会根据您在软件安装及使用中授予的具体权限,接收并记录您所使用的设备相关信息(例如设备型号、操作系统版本、设备设置、唯一设备标识符等软硬件特征信息)、设备所在位置相关信息(例如IP地址、GPS/北斗位置信息以及能够提供相关信息的Wi-Fi接入点、蓝牙和基站等传感器信息)。</p>
 | 
			
		||||
 | 
			
		||||
    <p>日志信息:当您使用我们的网站或客户端提供的产品或服务时,我们会自动收集您对我们服务的详细使用情况,作为有关网络日志保存。例如您的搜索查询内容、IP地址、浏览器的类型、电信运营商、使用的语言、访问日期和时间、您访问的网页记录、通话状态信息等。</p>
 | 
			
		||||
 | 
			
		||||
    <p>请注意,单独的设备信息、日志信息等是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将该类个人信息做匿名化、去标识化处理。</p>
 | 
			
		||||
 | 
			
		||||
    <p>当您与我们联系时,我们可能会保存您的通信/通话记录和内容或您留下的联系方式等信息,以便与您联系或帮助您解决问题,或记录相关问题的处理方案及结果。</p>
 | 
			
		||||
 | 
			
		||||
    <p>3)我们在您使用个性推荐服务过程中收集的信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>为向您提供更好、更个性化的服务,例如在不同的服务端或设备上提供更个性化但体验一致的服务,更契合您需求的输入推荐、客服接待或信息推送,了解产品适配性,识别账号异常状态,我们会收集您使用服务的相关信息,这些信息包括:设备信息、日志、服务使用信息。</p>
 | 
			
		||||
    <p>日志:当您使用我们的网页或客户端时,我们会自动收集您对我们服务的详细使用情况,作为有关网络日志保存。例如您的IP地址、浏览器的类型、电信运营商、使用的语言、访问日期和时间以及访问时长、软硬件特征信息、您需求的网页记录及“村微数字乡村”平台服务Cookies信息,等。</p>
 | 
			
		||||
 | 
			
		||||
    <p>服务使用信息:我们会记录您在使用“村微数字乡村”平台产品及服务时提交或产生的信息、创建的好友列表、设置信息(例如记住密码、自动登录、通用设置、隐私设置、消息提示)等。
 | 
			
		||||
    
 | 
			
		||||
    <p>当您在使用“村微数字乡村”平台服务执行某些操作时(例如向您的分组添加好友),我们可能会向您或其他人发送通知;</p>
 | 
			
		||||
 | 
			
		||||
    <p>对于您在“村微数字乡村”平台开放平台开通使用的第三方应用服务,我们将在您启动该应用时收集相关信息,并按照本隐私权协议进行处理;第三方应用服务提供者可能会获取您使用“村微数字乡村”平台服务的相关个人信息,该第三方应用服务对您的个人信息的收集(如有)则受该第三方隐私权协议约束。</p>
 | 
			
		||||
    <p>4) 第三方向我们提供的信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>“村微数字乡村”平台将对其他用户进行与您相关的操作时收集关于您的信息,亦可能从“村微数字乡村”平台合作第三方或通过其他合法途径获取的您的个人数据信息。</p>
 | 
			
		||||
 | 
			
		||||
    <p>3.为您提供安全保障</p>
 | 
			
		||||
 | 
			
		||||
    <p>为预防、发现、调查欺诈、侵权、危害安全、非法或违反与我们的协议、协议或规则的行为,我们可能收集或整合您的用户信息、服务使用信息、设备信息、日志信息以及我们合作伙伴取得您授权或依据法律共享的信息。</p>
 | 
			
		||||
 | 
			
		||||
    <p>4.其他用途</p>
 | 
			
		||||
 | 
			
		||||
    <p>我们将基于本协议未载明的其他特定目的收集您的信息时,会事先征求您的同意。</p>
 | 
			
		||||
 | 
			
		||||
    <p>“村微数字乡村”平台收集及使用上述信息的目的是为了更好地经营“村微数字乡村”平台产品和服务(包括但不限于向您提供个性化的服务),并且会通过包括但不限于通过网站通知、电子邮件、电话或短信息等方式通知,“村微数字乡村”平台不会查看或者使用您通过“村微数字乡村”平台存储的任何业务数据。</p>
 | 
			
		||||
 | 
			
		||||
    <p>如我们停止运营“村微数字乡村”平台产品或服务,我们将及时停止继续收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,对所持有的个人信息进行删除或匿名化处理。</p>
 | 
			
		||||
    <p>(二) 我们如何使用您的信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>收集您的信息是为了向您提供服务及提升服务质量,为了实现这一目的,我们会把您的信息用于下列用途:</p>
 | 
			
		||||
 | 
			
		||||
    <p>1. 向您提供您使用的“村微数字乡村”平台产品或服务,并维护、改进、优化这些服务及服务体验;</p>
 | 
			
		||||
 | 
			
		||||
    <p>2. 为预防、发现、调查欺诈、侵权、危害安全、非法或违反与我们的协议、协议或规则的行为,保护您、其他用户或公众,我们的合法权益,我们可能使用或整合您的用户信息、服务使用信息、设备信息、日志信息以及我们合作伙伴取得您授权或依据法律共享的信息,来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施;</p>
 | 
			
		||||
 | 
			
		||||
    <p>3. 我们可能会将您的信息进行处理或者与来自其他服务的信息结合起来,用于为了向您提供更加个性化的服务使用,例如向您推荐可能感兴趣的内容,包括但不限于向您发出产品和服务信息,或通过系统向您展示个性化的第三方推广信息,或者在征得您同意的情况下与“村微数字乡村”平台合作伙伴共享信息以便他们向您发送有关其产品和服务的信息;</p>
 | 
			
		||||
 | 
			
		||||
    <p>4. 经您许可的其他用途。</p>
 | 
			
		||||
 | 
			
		||||
    <p>二、我们如何使用 Cookie 和同类技术</p>
 | 
			
		||||
 | 
			
		||||
    <p>为使您获得更轻松的访问体验,您使用“村微数字乡村”平台产品或服务时,我们可能会通过采用各种技术收集和存储您访问“村微数字乡村”平台服务的相关数据,在您访问或再次访问“村微数字乡村”平台服务时,我们能识别您的身份,并通过分析数据为您提供更好更多的服务。包括使用小型数据文件识别您的身份,这么做是为了解您的使用习惯,帮您省去重复输入账户信息的步骤,或者帮助判断您的账户安全。这些数据文件可能是Cookie、Flash Cookie,或您的浏览器或关联应用程序提供的其他本地存储(统称“Cookie”)。 请您理解,我们的某些服务只能通过使用Cookie才可得到实现。如果您的浏览器或浏览器附加服务允许,您可以修改对Cookie的接受程度或者拒绝“村微数字乡村”平台的Cookie,但拒绝“村微数字乡村”平台的Cookie在某些情况下您可能无法使用依赖于Cookies的“村微数字乡村”平台服务的部分功能。</p>
 | 
			
		||||
 | 
			
		||||
    <p>网页上常会包含一些电子图像,称为“单像素 GIF 文件”或“网络 beacon”,它可以帮助网站计算浏览网页的用户或访问某些Cookie。我们会通过网络beacon收集您浏览网页活动信息,例如您访问的页面地址、您先前访问的援引页面的位址、您停留在页面的时间、您的浏览环境以及显示设定等。</p>
 | 
			
		||||
 | 
			
		||||
    <p>三、我们如何共享、转让、公开披露您的信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>(一) 共享</p>
 | 
			
		||||
 | 
			
		||||
    <p>我们不会与“村微数字乡村”平台服务提供者以外的公司、组织和个人共享您的个人信息,但以下情况除外:</p>
 | 
			
		||||
 | 
			
		||||
    <p>1. 在获取明确同意的情况下共享:获得您的明确同意后,我们会与其他方共享您的个人信息。</p>
 | 
			
		||||
 | 
			
		||||
    <p>2. 在法定情形下的共享:我们可能会根据法律法规规定、诉讼争议解决需要,或按行政、司法机关依法提出的要求,对外共享您的个人信息。</p>
 | 
			
		||||
 | 
			
		||||
    <p>3. 只有透露您的资料,才能提供您所要求的产品和服务,如电话会议服务,您通过验证码确认的手机号码,将传送至基础电信业务运营商以实现通信,并作为来电显示号码向其他用户展示;
 | 
			
		||||
    
 | 
			
		||||
    <p>4. 在您被他人投诉侵犯知识产权或其他合法权利时,需要向投诉人披露您的必要资料,以便进行投诉处理的;</p>
 | 
			
		||||
 | 
			
		||||
    <p>5. 为方便你和通讯录好友之间相互找到,你在开启通讯录匹配的时候,系统会将通讯录中的手机号进行高强度的加密算法处理后,将相应的特征码进行匹配,并将有匹配关系的用户展示给你。“村微数字乡村”平台不会保留您通讯录中的任何可识别的信息,使用到的您通讯录中的手机号码数据,会先经过高强度的加密算法进行处理,并通过处理后的特征码实现匹配。</p>
 | 
			
		||||
 | 
			
		||||
    <p>6. 与授权合作伙伴共享:仅为实现本隐私协议中声明的目的,我们的某些服务将由我们和授权合作伙伴共同提供。我们可能会与合作伙伴共享您的某些个人信息,以提供更好的客户服务和用户体验。我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。我们的合作伙伴无权将共享的个人信息用于与产品或服务无关的其他用途。</p>
 | 
			
		||||
 | 
			
		||||
    <p>“村微数字乡村”平台服务含有到其他网站的链接。除法律另有规定外,“村微数字乡村”平台对其他网站的隐私保护措施不负任何责任。我们可能在任何需要的时候增加商业伙伴或共用品牌的网站,但是提供给他们的将仅是综合信息,我们将不会公开您的身份。</p>
 | 
			
		||||
    <p>(二) 转让</p>
 | 
			
		||||
 | 
			
		||||
    <p>我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</p>
 | 
			
		||||
 | 
			
		||||
    <p>1. 在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的个人信息。</p>
 | 
			
		||||
 | 
			
		||||
    <p>2. 在“村微数字乡村”平台服务提供者发生合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如涉及到个人信息转让,我们会要求新的持有您个人信息的公司、组织继续受本协议的约束,否则我们将要求该公司、组织和个人重新向您征求授权同意。</p>
 | 
			
		||||
 | 
			
		||||
    <p>(三) 公开披露</p>
 | 
			
		||||
 | 
			
		||||
    <p>我们仅会在以下情况下,公开披露您的个人信息:</p>
 | 
			
		||||
 | 
			
		||||
    <p>1. 获得您明确同意或基于您的主动选择,我们可能会公开披露您的个人信息;</p>
 | 
			
		||||
 | 
			
		||||
    <p>2. 如果我们确定您出现违反法律法规或严重违反“村微数字乡村”平台相关协议规则的情况,或为保护“村微数字乡村”平台用户或公众的人身财产安全免遭侵害,我们可能依据法律法规或“村微数字乡村”平台相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及“村微数字乡村”平台已对您采取的措施。</p>
 | 
			
		||||
 | 
			
		||||
    <p>(四) 共享、转让、公开披露个人信息时事先征得授权同意的例外</p>
 | 
			
		||||
 | 
			
		||||
    <p>以下情形中,共享、转让、公开披露您的个人信息无需事先征得您的授权同意:</p>
 | 
			
		||||
 | 
			
		||||
    <p>1. 与国家安全、国防安全有关的;</p>
 | 
			
		||||
 | 
			
		||||
    <p>2. 与公共安全、公共卫生、重大公共利益有关的;</p>
 | 
			
		||||
 | 
			
		||||
    <p>3. 与犯罪侦查、起诉、审判和判决执行等有关的;</p>
 | 
			
		||||
 | 
			
		||||
    <p>4. 出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</p>
 | 
			
		||||
 | 
			
		||||
    <p>5. 您自行向社会公众公开的个人信息;</p>
 | 
			
		||||
 | 
			
		||||
    <p>6. 从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道。</p>
 | 
			
		||||
 | 
			
		||||
    <p>根据法律规定,共享、转让经去标识化处理的个人信息,且确保数据接收方无法复原并重新识别个人信息主体的,不属于个人信息的对外共享、转让及公开披露行为,对此类数据的保存及处理将无需另行向您通知并征得您的同意。</p>
 | 
			
		||||
    <p>四、我们如何保护您的信息</p>
 | 
			
		||||
 | 
			
		||||
    <p>我们会采取各种预防措施来保护您的个人信息,以保障您的个人信息免遭丢失、盗用和误用,以及被擅自取阅、披露、更改或销毁。为确保您个人信息的安全,我们有严格的信息安全规定和流程,并有专门的信息安全团队在公司内部严格执行上述措施。</p>
 | 
			
		||||
 | 
			
		||||
    <p>“村微数字乡村”平台有行业先进的以数据为核心,围绕数据生命周期进行的数据安全管理体系,从组织建设、制度设计、人员管理、产品技术等方面多维度提升整个系统的安全性。</p>
 | 
			
		||||
 | 
			
		||||
    <p>我们会采取合理可行的措施,尽力避免收集无关的个人信息,并在限于达成本协议所述目的所需的期限内保留您的个人信息,除非需要延长保留期限或在法律的允许期限内。</p>
 | 
			
		||||
    <p>在不幸发生个人信息安全事件后,我们将按照法律法规的要求【并最迟不迟于30 个自然日内】向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。事件相关情况我们将以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,上报个人信息安全事件的处置情况。</p>
 | 
			
		||||
 | 
			
		||||
    <p>互联网环境并非百分之百安全,尽管我们有这些安全措施,但请注意在互联网上不存在“完善的安全措施”,我们将尽力确保您的信息的安全性。</p>
 | 
			
		||||
 | 
			
		||||
    <p>五、您的个人信息如何在全球范围转移</p>
 | 
			
		||||
 | 
			
		||||
    <p>原则上,我们在中华人民共和国境内运营中收集和产生的个人信息,存储在中华人民共和国境内。就中华人民共和国境外“村微数字乡村”平台用户使用“村微数字乡村”平台产品及服务过程中产生的个人信息,您同意回传存储在中国境内的服务器上,否则您无法使用现有“村微数字乡村”平台的产品及服务。在此类情况下,我们会确保您的个人信息得到在中华人民共和国境内足够同等的保护。</p>
 | 
			
		||||
 | 
			
		||||
    <p>六、本协议如何更新</p>
 | 
			
		||||
 | 
			
		||||
    <p>我们的隐私协议可能变更。</p>
 | 
			
		||||
 | 
			
		||||
    <p>未经您明确同意我们不会限制您按照本隐私协议所应享有的权利。</p>
 | 
			
		||||
 | 
			
		||||
    <p>对于重大变更,我们还会提供更为显著的通知(包括我们会通过“村微数字乡村”平台公示的方式进行意见征集、公告通知甚至向您提供弹窗提示)。</p>
 | 
			
		||||
 | 
			
		||||
    <p>本协议所指的重大变更包括但不限于:</p>
 | 
			
		||||
 | 
			
		||||
    <p>1. 我们的服务模式发生重大变化。如处理用户信息的目的、用户信息的使用方式等;</p>
 | 
			
		||||
 | 
			
		||||
    <p>2. 我们在控制权、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;</p>
 | 
			
		||||
 | 
			
		||||
    <p>3. 用户信息共享、转让或公开披露的主要对象发生变化;</p>
 | 
			
		||||
 | 
			
		||||
    <p>4. 我们负责处理用户信息安全的责任部门、联络方式及投诉渠道发生变化时;</p>
 | 
			
		||||
 | 
			
		||||
    <p>5. 用户信息安全影响评估报告表明存在高风险时。</p>
 | 
			
		||||
 | 
			
		||||
    <p>七、如何联系我们</p>
 | 
			
		||||
 | 
			
		||||
    <p>如果您对“村微数字乡村”平台的隐私保护协议或数据处理有任何疑问、意见或建议, 可以通过以下地址与我们联系,我们邮寄联系方式如下:</p>
 | 
			
		||||
 | 
			
		||||
    <p>➢ 收件人:武汉中卫慧通科技有限公司</p>
 | 
			
		||||
 | 
			
		||||
    <p>➢ 地址:湖北省武汉市武昌区和平大道840号绿地蓝海A座22楼</p>
 | 
			
		||||
 | 
			
		||||
    <p>➢ 邮编:430070</p>
 | 
			
		||||
 | 
			
		||||
    <p>一般情况下,我们将在收到您相关联系信息后三十天内回复。</p>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
  name: "partyAgreement",
 | 
			
		||||
  appName: "用户服务及隐私协议",
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  onShow() {
 | 
			
		||||
    this.setNavbar()
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    setNavbar() {
 | 
			
		||||
      uni.setNavigationBarTitle({
 | 
			
		||||
        title: '用户服务及隐私协议'
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
.partyAgreement {
 | 
			
		||||
  padding: 20px 30px 30px 40px;
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  h1 {
 | 
			
		||||
    font-size: 36px;
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
  }
 | 
			
		||||
  p {
 | 
			
		||||
    text-indent: 2em;
 | 
			
		||||
    font-size: 30px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										247
									
								
								src/project/pingchang/AppPartyAuth/partyAuthApply.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								src/project/pingchang/AppPartyAuth/partyAuthApply.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,247 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <section class="partyAuthApply">
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <div class="item">
 | 
			
		||||
        <div class="label required" v-text="`是否户主`"/>
 | 
			
		||||
        <div class="flex">
 | 
			
		||||
          <div class="radioBtn" v-for="op in ownerOps" :key="op.dictValue" v-text="op.dictName"
 | 
			
		||||
               :class="{current:op.dictValue==form.householdName}" @click="form.householdName=op.dictValue"/>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <template v-if="form.householdName==0">
 | 
			
		||||
        <div class="flex item">
 | 
			
		||||
          <div class="label required" required v-text="`户主身份证号`"/>
 | 
			
		||||
          <u-input v-model="form.householdIdNumber" input-align="right" maxlength="18"/>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="flex item">
 | 
			
		||||
          <div class="label required" required v-text="`与户主关系`"/>
 | 
			
		||||
          <AiSelect v-model="form.householdRelation" dict="householdRelation"/>
 | 
			
		||||
        </div>
 | 
			
		||||
      </template>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <view class="item flex spb" v-for="row in baseInfo" :key="row.prop">
 | 
			
		||||
        <span class="label" :class="{required:row.required}" v-text="row.label"/>
 | 
			
		||||
        <AiSelect v-if="row.dict" v-model="form[row.prop]" :dict="row.dict" :disabled="row.disabled"/>
 | 
			
		||||
        <AiDate v-else-if="row.type=='time'" @change="v=>$set(form,row.prop,v)" :value="form[row.prop]"/>
 | 
			
		||||
        <u-input v-else-if="row.type=='idNumber'" v-model="form[row.prop]" input-align="right" maxlength="18"/>
 | 
			
		||||
        <u-input v-else-if="row.type=='phone'" v-model="form[row.prop]" input-align="right" maxlength="11"/>
 | 
			
		||||
        <u-input v-else v-model="form[row.prop]" input-align="right"/>
 | 
			
		||||
      </view>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <view class="item" :class="{spb:!row.topLabel,flex:!row.topLabel}" v-for="row in contract" :key="row.prop">
 | 
			
		||||
        <span class="label" :class="{required:row.required}" v-text="row.label"/>
 | 
			
		||||
        <AiAreaPicker v-if="row.type=='area'" @input="v=>$set(form,row.prop,v)" :fullName.sync="form.currentAreaName" :selectRoot="false">
 | 
			
		||||
          <u-icon name="arrow-right" :label="form.currentAreaName||'请选择'" label-pos="left" color="#ddd"/>
 | 
			
		||||
        </AiAreaPicker>
 | 
			
		||||
        <textarea v-else v-model="form[row.prop]" input-align="right" placeholder="请输入" placeholder-style="color:#999"
 | 
			
		||||
                  maxlength="50"/>
 | 
			
		||||
      </view>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <view class="item" :class="{spb:!row.topLabel,flex:!row.topLabel}" v-for="row in household" :key="row.prop">
 | 
			
		||||
        <span class="label" :class="{required:row.required}" v-text="row.label"/>
 | 
			
		||||
        <AiAreaPicker v-if="row.prop=='householdAreaId'" all @input="v=>$set(form,row.prop,v)" v-model="form[row.prop]"
 | 
			
		||||
                      :fullName.sync="form.householdAreaName" valueLevel="5" isForm :selectRoot="false"/>
 | 
			
		||||
        <textarea v-else v-model="form[row.prop]" input-align="right" placeholder="请输入" placeholder-style="color:#999"
 | 
			
		||||
                  maxlength="50"/>
 | 
			
		||||
      </view>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <view class="item flex spb" v-for="row in extra" :key="row.prop">
 | 
			
		||||
        <span class="label" :class="{required:row.required}" v-text="row.label"/>
 | 
			
		||||
        <AiSelect v-if="row.dict" v-model="form[row.prop]" :dict="row.dict"/>
 | 
			
		||||
        <AiDate v-else-if="row.type=='time'" v-model="form[row.prop]"/>
 | 
			
		||||
        <AiAreaPicker v-else-if="row.type=='area'" all v-model="form[row.prop]"
 | 
			
		||||
                      :fullName.sync="form.birthplaceAreaName">
 | 
			
		||||
          <u-icon name="arrow-right" :label="form.birthplaceAreaName||'请选择'" label-pos="left" color="#ddd"/>
 | 
			
		||||
        </AiAreaPicker>
 | 
			
		||||
        <u-input v-else v-model="form[row.prop]" input-align="right"/>
 | 
			
		||||
      </view>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="fixed-bottom">
 | 
			
		||||
      <u-button type="primary" @click="submit">
 | 
			
		||||
        <text style="font-size: 16px" v-text="`提交`"/>
 | 
			
		||||
      </u-button>
 | 
			
		||||
    </div>
 | 
			
		||||
  </section>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import {mapState} from "vuex";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "partyAuthApply",
 | 
			
		||||
  appName: "居民档案申请",
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapState(['user'])
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    let required = true
 | 
			
		||||
    return {
 | 
			
		||||
      ownerOps: [],
 | 
			
		||||
      form: {
 | 
			
		||||
        householdName: "1",
 | 
			
		||||
        currentAreaName: "",
 | 
			
		||||
        householdAreaName: "",
 | 
			
		||||
        birthplaceAreaName: ""
 | 
			
		||||
      },
 | 
			
		||||
      baseInfo: [
 | 
			
		||||
        {label: "姓名", prop: "name", required},
 | 
			
		||||
        {label: "身份证号", prop: "idNumber", required, type: "idNumber"},
 | 
			
		||||
        {label: "性别", prop: "sex", required, dict: "sex", disabled: true},
 | 
			
		||||
        {label: "出生日期", prop: "birthDate", required, type: "time", disabled: true},
 | 
			
		||||
        {label: "联系方式", prop: "phone", type: "phone"},
 | 
			
		||||
      ],
 | 
			
		||||
      contract: [
 | 
			
		||||
        {label: "现住址", prop: "currentAreaId", type: "area", required},
 | 
			
		||||
        {label: "详细住址", prop: "currentAddress", type: 'textarea', topLabel: true},
 | 
			
		||||
      ],
 | 
			
		||||
      household: [
 | 
			
		||||
        {label: "户籍地址", prop: "householdAreaId", type: "area"},
 | 
			
		||||
        {label: "详细地址", prop: "householdAddress", type: 'textarea', topLabel: true},
 | 
			
		||||
      ],
 | 
			
		||||
      extra: [
 | 
			
		||||
        {label: "籍贯", prop: "birthplaceAreaId", type: "area"},
 | 
			
		||||
        {label: "民族", prop: "nation", dict: "nation"},
 | 
			
		||||
        {label: "文化程度", prop: "education", dict: "education"},
 | 
			
		||||
        {label: "婚姻状况", prop: "maritalStatus", dict: "maritalStatus"},
 | 
			
		||||
        {label: "政治面貌", prop: "politicsStatus", dict: "politicsStatus"},
 | 
			
		||||
        {label: "兵役状况", prop: "militaryStatus", dict: "militaryStatus"},
 | 
			
		||||
        {label: "宗教信仰", prop: "faithType", dict: "faithType"},
 | 
			
		||||
        {label: "职业", prop: "job", dict: "job"},
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  onLoad() {
 | 
			
		||||
    this.$dict.load("yesOrNo", "householdRelation").then(() => {
 | 
			
		||||
      this.ownerOps = this.$dict.getDict("yesOrNo")
 | 
			
		||||
    })
 | 
			
		||||
    this.getResident()
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
    'form.idNumber'(v) {
 | 
			
		||||
      let {birthday: birthDate, sex} = this.$idCardNoUtil.getIdCardInfo(v),
 | 
			
		||||
          age = this.$calcAge(v)
 | 
			
		||||
      this.form = {...this.form, birthDate, sex, age}
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    getResident() {
 | 
			
		||||
      let {residentId: id} = this.user
 | 
			
		||||
      if (id) {
 | 
			
		||||
        this.$instance.post("/app/appresident/detailForWx", null, {
 | 
			
		||||
          params: {id}
 | 
			
		||||
        }).then(res => {
 | 
			
		||||
          if (res?.data) {
 | 
			
		||||
            this.form = res.data.resident
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      } else if (uni.getStorageSync("authForm")) {
 | 
			
		||||
        let info = uni.getStorageSync("authForm"),
 | 
			
		||||
            {birthday: birthDate, sex} = this.$idCardNoUtil.getIdCardInfo(info.idNumber)
 | 
			
		||||
        uni.removeStorageSync("authForm")
 | 
			
		||||
        this.form = {...this.form, ...info, birthDate, sex}
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    submit() {
 | 
			
		||||
      let {baseInfo, contract, household, extra, form: {householdName, householdIdNumber, householdRelation}} = this
 | 
			
		||||
      if (householdName == 0) {
 | 
			
		||||
        if (!householdIdNumber) return this.$u.toast("请输入户主身份证号")
 | 
			
		||||
        else if (!this.$idCardNoUtil.checkIdCardNo(householdIdNumber)) return this.$u.toast("请输入正确的身份证号")
 | 
			
		||||
        if (!householdRelation) return this.$u.toast("请输入与户主关系")
 | 
			
		||||
      }
 | 
			
		||||
      let flag = [baseInfo, contract, household, extra].flat().reverse().some(e => {
 | 
			
		||||
        if (e.required && !this.form[e.prop]) {
 | 
			
		||||
          if (!e.dict && (['textarea', 'idNumber'].includes(e.type) || !e.type)) return this.$u.toast("请输入" + e.label) || true
 | 
			
		||||
          else return this.$u.toast("请选择" + e.label) || true
 | 
			
		||||
        } else if (e.type == 'idNumber' && !this.$idCardNoUtil.checkIdCardNo(this.form[e.prop])) {
 | 
			
		||||
          return this.$u.toast("请输入正确的身份证号") || true
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      if (!flag) {
 | 
			
		||||
        this.$instance.post("/app/appresident/addOrUpdate", this.form).then(res => {
 | 
			
		||||
          if (res?.code == 0) {
 | 
			
		||||
            this.$u.toast("提交成功!")
 | 
			
		||||
            setTimeout(() => uni.switchTab({url: "/pages/AppMine/AppMine"}), 1000)
 | 
			
		||||
            // uni.redirectTo({url: "./authSuccess"})
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
.partyAuthApply {
 | 
			
		||||
  background: #F3F6F9;
 | 
			
		||||
  min-height: 100vh;
 | 
			
		||||
  padding-bottom: 280px;
 | 
			
		||||
 | 
			
		||||
  .card {
 | 
			
		||||
    background: #fff;
 | 
			
		||||
    padding-left: 32px;
 | 
			
		||||
    margin-bottom: 24px;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .label {
 | 
			
		||||
      font-size: 34px;
 | 
			
		||||
      font-family: PingFangSC-Medium, PingFang SC;
 | 
			
		||||
      color: #666;
 | 
			
		||||
      font-weight: bold;
 | 
			
		||||
      line-height: 112px;
 | 
			
		||||
      position: relative;
 | 
			
		||||
 | 
			
		||||
      &.required:before {
 | 
			
		||||
        content: "*";
 | 
			
		||||
        color: #FF4466;
 | 
			
		||||
        position: absolute;
 | 
			
		||||
        left: 0;
 | 
			
		||||
        transform: translateX(-100%);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .item {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      min-height: 128px;
 | 
			
		||||
      color: #333;
 | 
			
		||||
      box-shadow: inset 0px -1px 0px 0px #DDDDDD;
 | 
			
		||||
      padding-right: 32px;
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      justify-content: space-between;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .radioBtn {
 | 
			
		||||
    width: 218px;
 | 
			
		||||
    height: 80px;
 | 
			
		||||
    background: #FFFFFF;
 | 
			
		||||
    border-radius: 16px;
 | 
			
		||||
    border: 1px solid #CCC;
 | 
			
		||||
    margin-right: 16px;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    line-height: 80px;
 | 
			
		||||
    margin-bottom: 48px;
 | 
			
		||||
 | 
			
		||||
    &.current {
 | 
			
		||||
      background: #4181FF;
 | 
			
		||||
      color: #fff;
 | 
			
		||||
      border-color: #4181ff;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .fixed-bottom {
 | 
			
		||||
    width: 100vw;
 | 
			
		||||
    height: 120px;
 | 
			
		||||
    padding: 16px 32px;
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    background: inherit;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  textarea {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										155
									
								
								src/project/pingchang/AppPartyAuth/partyAuthInfo.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								src/project/pingchang/AppPartyAuth/partyAuthInfo.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,155 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <section class="partyAuthInfo">
 | 
			
		||||
    <div class="headerCard flex card">
 | 
			
		||||
      <div class="avatar">
 | 
			
		||||
        <open-data type="userAvatarUrl" lang="zh_CN" class="user-img"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="flex fill">
 | 
			
		||||
        <div class="fill">
 | 
			
		||||
          <b v-text="user.realName"/>
 | 
			
		||||
          <div class="color-999" v-text="sexAge"/>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="blue" v-if="isOwner">户主</div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <b class="title" v-text="`基本信息`"/>
 | 
			
		||||
      <view class="item flex spb" v-for="row in baseInfo" :key="row.prop">
 | 
			
		||||
        <span class="color-999" v-text="row.label"/>
 | 
			
		||||
        <div v-if="row.dict" v-text="$dict.getLabel(row.dict,detail[row.prop])||'-'"/>
 | 
			
		||||
        <div v-else v-text="detail[row.prop]||'-'"/>
 | 
			
		||||
      </view>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="card">
 | 
			
		||||
      <b class="title" v-text="`联络方式`"/>
 | 
			
		||||
      <view class="item" :class="{spb:!row.topLabel,flex:!row.topLabel}" v-for="row in contract" :key="row.prop">
 | 
			
		||||
        <span class="color-999" v-text="row.label"/>
 | 
			
		||||
        <div v-text="detail[row.prop]||'-'"/>
 | 
			
		||||
      </view>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="fixed-bottom">
 | 
			
		||||
      <u-button type="primary" @click="apply">
 | 
			
		||||
        <text style="font-size: 16px" v-text="`申请修改`"/>
 | 
			
		||||
      </u-button>
 | 
			
		||||
    </div>
 | 
			
		||||
  </section>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import {mapState} from "vuex";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "partyAuthInfo",
 | 
			
		||||
  appName: "我的档案",
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      detail: {},
 | 
			
		||||
      baseInfo: [
 | 
			
		||||
        {label: "身份证号", prop: "idNumber"},
 | 
			
		||||
        {label: "籍贯", prop: "birthplaceAreaName"},
 | 
			
		||||
        {label: "民族", prop: "nation", dict: "nation"},
 | 
			
		||||
        {label: "文化程度", prop: "education", dict: "education"},
 | 
			
		||||
        {label: "政治面貌", prop: "politicsStatus", dict: "politicsStatus"},
 | 
			
		||||
        {label: "兵役状况", prop: "militaryStatus", dict: "militaryStatus"},
 | 
			
		||||
        {label: "宗教信仰", prop: "faithType", dict: "faithType"},
 | 
			
		||||
        {label: "职业", prop: "job", dict: "job"},
 | 
			
		||||
      ],
 | 
			
		||||
      contract: [
 | 
			
		||||
        {label: "联系方式", prop: "phone"},
 | 
			
		||||
        {label: "现住址", prop: "currentAreaName"},
 | 
			
		||||
        {label: "详细住址", prop: "currentAddress", topLabel: true},
 | 
			
		||||
        {label: "户籍地址", prop: "householdAreaName"},
 | 
			
		||||
        {label: "详细地址", prop: "householdAddress", topLabel: true},
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapState(['user']),
 | 
			
		||||
    sexAge() {
 | 
			
		||||
      let {idNumber, gender} = this.$idCardNoUtil.getIdCardInfo(this.user.idNumber), age = this.$calcAge(idNumber)
 | 
			
		||||
      return `${this.$dict.getLabel("sex", gender) || ""} ${age ? age + "岁" : ""}`
 | 
			
		||||
    },
 | 
			
		||||
    isOwner() {
 | 
			
		||||
      return this.detail.householdName == 1
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  onLoad() {
 | 
			
		||||
    this.$dict.load("sex", "nation", "education", "politicsStatus", "militaryStatus", "faithType", "job")
 | 
			
		||||
    this.getResident()
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    getResident() {
 | 
			
		||||
      this.$instance.post("/app/appresident/detailForWx", null, {
 | 
			
		||||
        params: {id: this.user.residentId}
 | 
			
		||||
      }).then(res => {
 | 
			
		||||
        if (res?.data) {
 | 
			
		||||
          this.detail = res.data.resident
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    apply() {
 | 
			
		||||
      uni.navigateTo({url: "./partyAuthApply"})
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
.partyAuthInfo {
 | 
			
		||||
  background: #F3F6F9;
 | 
			
		||||
  min-height: 100vh;
 | 
			
		||||
  padding-bottom: 280px;
 | 
			
		||||
 | 
			
		||||
  .avatar {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    width: 96px;
 | 
			
		||||
    height: 96px;
 | 
			
		||||
    border-radius: 50%;
 | 
			
		||||
    overflow: hidden;
 | 
			
		||||
    border: 4px solid #FFFFFF;
 | 
			
		||||
    flex-shrink: 0;
 | 
			
		||||
    margin-right: 16px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .card {
 | 
			
		||||
    background: #fff;
 | 
			
		||||
    padding-left: 32px;
 | 
			
		||||
    margin-bottom: 24px;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .title {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      height: 116px;
 | 
			
		||||
      line-height: 116px;
 | 
			
		||||
      font-weight: bold;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .item {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      min-height: 112px;
 | 
			
		||||
      color: #333;
 | 
			
		||||
      box-shadow: inset 0px -1px 0px 0px #DDDDDD;
 | 
			
		||||
      padding: 32px 32px 32px 0;
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      white-space: normal;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .headerCard {
 | 
			
		||||
    height: 160px;
 | 
			
		||||
    padding-right: 32px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .blue {
 | 
			
		||||
    color: #4181FF;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .fixed-bottom {
 | 
			
		||||
    width: 100vw;
 | 
			
		||||
    height: 120px;
 | 
			
		||||
    padding: 16px 32px;
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    background: inherit;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										195
									
								
								src/project/pingchang/AppPartyAuth/partyAuthSuccess.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								src/project/pingchang/AppPartyAuth/partyAuthSuccess.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,195 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="partyAuthSuccess">
 | 
			
		||||
    <template v-if="isSuccess">
 | 
			
		||||
      <!-- <image src="https://cdn.cunwuyun.cn/img/authSuccess.png"/> -->
 | 
			
		||||
      <image src="./img/success.png"/>
 | 
			
		||||
      <h2 v-text="`认证成功!`"/>
 | 
			
		||||
      <div class="btn" @click="gotoInfo" v-text="`前往查看`"/>
 | 
			
		||||
    </template>
 | 
			
		||||
    <template v-else-if="isFail">
 | 
			
		||||
      <image src="https://cdn.cunwuyun.cn/img/authFail.png"/>
 | 
			
		||||
      <h2 v-text="`认证失败!`"/>
 | 
			
		||||
      <span class="flex">请先填写<div class="blue" v-text="`居民档案`"/> 进行申请</span>
 | 
			
		||||
      <div class="btn" @click="apply">居民档案申请</div>
 | 
			
		||||
      <div class="btn plain" @click="backToHome">返回</div>
 | 
			
		||||
    </template>
 | 
			
		||||
    <div class="authing" v-else>
 | 
			
		||||
      <div class="result" v-text="`你发起的申请/修改`"/>
 | 
			
		||||
      <div class="result" v-text="authingResult"/>
 | 
			
		||||
      <div class="failReason" v-if="authFail">
 | 
			
		||||
        <div class="title flex spb">
 | 
			
		||||
          <b v-text="`审核结果`"/>
 | 
			
		||||
          <b class="red" v-text="`未通过`"/>
 | 
			
		||||
        </div>
 | 
			
		||||
        <b v-text="`原因`"/>
 | 
			
		||||
        <div v-html="info.resident.auditOpinion"/>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="fixed-bottom">
 | 
			
		||||
        <u-button type="primary" @click="$linkTo('./authInfo')">
 | 
			
		||||
          <text style="font-size: 16px" v-text="`查看填报内容`"/>
 | 
			
		||||
        </u-button>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
import {mapState} from "vuex";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  appName: "实名身份认证",
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      info: {}
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapState(['user']),
 | 
			
		||||
    isSuccess() {
 | 
			
		||||
      return this.user.partyStatusForWX == 0
 | 
			
		||||
    },
 | 
			
		||||
    // isFail() {
 | 
			
		||||
    //   return this.user.partyStatusForWX == 0
 | 
			
		||||
    // },
 | 
			
		||||
    authFail() {
 | 
			
		||||
      return this.user.status == -1
 | 
			
		||||
    },
 | 
			
		||||
    authingResult() {
 | 
			
		||||
      return this.authFail ? "审核未通过" : "正在审核中"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  onLoad() {
 | 
			
		||||
    if (!this.isSuccess && !this.isFail) this.getAuthResult()
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    backToHome() {
 | 
			
		||||
      uni.navigateBack({})
 | 
			
		||||
    },
 | 
			
		||||
    apply() {
 | 
			
		||||
      uni.redirectTo({url: "./authApply"})
 | 
			
		||||
    },
 | 
			
		||||
    gotoInfo() {
 | 
			
		||||
      uni.redirectTo({url: "./authInfo"})
 | 
			
		||||
    },
 | 
			
		||||
    getAuthResult() {
 | 
			
		||||
      this.$instance.post(`/app/appresident/detailForWx`, null, {
 | 
			
		||||
        params: {id: this.user.residentId}
 | 
			
		||||
      }).then(res => {
 | 
			
		||||
        if (res?.data) {
 | 
			
		||||
          this.info = res.data
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
<style lang="scss">
 | 
			
		||||
@import "~dvcp-wui/common";
 | 
			
		||||
 | 
			
		||||
.partyAuthSuccess {
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
  padding-top: 96px;
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
  background-color: #fff;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
 | 
			
		||||
  image {
 | 
			
		||||
    width: 240px;
 | 
			
		||||
    height: 240px;
 | 
			
		||||
    margin-bottom: 16px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  h2 {
 | 
			
		||||
    margin-bottom: 16px;
 | 
			
		||||
    color: #333333;
 | 
			
		||||
    font-size: 40px;
 | 
			
		||||
    font-weight: 700;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  span {
 | 
			
		||||
    font-size: 28px;
 | 
			
		||||
    font-family: PingFangSC-Medium, PingFang SC;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    margin-bottom: 40px;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
 | 
			
		||||
    .blue {
 | 
			
		||||
      color: #4181FF;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .btn {
 | 
			
		||||
    width: 320px;
 | 
			
		||||
    height: 88px;
 | 
			
		||||
    line-height: 88px;
 | 
			
		||||
    margin: 48px auto 0;
 | 
			
		||||
    color: #fff;
 | 
			
		||||
    font-size: 34px;
 | 
			
		||||
    background: #4181FF;
 | 
			
		||||
    box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.02);
 | 
			
		||||
    border-radius: 16px;
 | 
			
		||||
 | 
			
		||||
    &.plain {
 | 
			
		||||
      background: #fff;
 | 
			
		||||
      color: #4181FF;
 | 
			
		||||
      border: 2px solid #4181FF;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .authing {
 | 
			
		||||
    margin-top: -272px;
 | 
			
		||||
    padding: 224px 32px 0;
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    height: calc(100vh + 272px);
 | 
			
		||||
    background-image: url("https://cdn.cunwuyun.cn/shandong10086/authInfoHbg.png");
 | 
			
		||||
    background-size: 100vw;
 | 
			
		||||
    background-repeat: no-repeat;
 | 
			
		||||
    background-color: #f3f6f9;
 | 
			
		||||
 | 
			
		||||
    .result {
 | 
			
		||||
      font-size: 56px;
 | 
			
		||||
      font-family: PingFangSC-Semibold, PingFang SC;
 | 
			
		||||
      font-weight: bold;
 | 
			
		||||
      color: #000;
 | 
			
		||||
      line-height: 88px;
 | 
			
		||||
      text-align: left;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .failReason {
 | 
			
		||||
      margin-top: 160px;
 | 
			
		||||
      background: #FFFFFF;
 | 
			
		||||
      box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.02);
 | 
			
		||||
      border-radius: 16px;
 | 
			
		||||
      padding: 0 32px 34px;
 | 
			
		||||
      font-size: 32px;
 | 
			
		||||
      text-align: left;
 | 
			
		||||
 | 
			
		||||
      .title {
 | 
			
		||||
        height: 112px;
 | 
			
		||||
        box-shadow: inset 0px -1px 0px 0px #DDDDDD;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      b {
 | 
			
		||||
        font-size: inherit;
 | 
			
		||||
        color: #999;
 | 
			
		||||
        line-height: 112px;
 | 
			
		||||
 | 
			
		||||
        &.red {
 | 
			
		||||
          color: #f46;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .fixed-bottom {
 | 
			
		||||
      position: fixed;
 | 
			
		||||
      bottom: 16px;
 | 
			
		||||
      width: 100vw;
 | 
			
		||||
      height: 120px;
 | 
			
		||||
      padding: 16px 32px;
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      background-color: inherit;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										491
									
								
								src/project/pingchang/AppPartyHome/AppPartyHome.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										491
									
								
								src/project/pingchang/AppPartyHome/AppPartyHome.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,491 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="page">
 | 
			
		||||
    <div class="search-wrap">
 | 
			
		||||
      <div class="search fill" @click="$linkTo('/mods/AppContent/contentManager?moduleId=' + search.moduleId)">
 | 
			
		||||
        <u-icon name="search" color="#ffffff" size="40"></u-icon>
 | 
			
		||||
        <span class="desc">请输入需要搜索的内容</span>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="header-bg"></div>
 | 
			
		||||
    <img class="border" :src="`${cdn}/border.png`" alt="">
 | 
			
		||||
    <div class="swiper-content">
 | 
			
		||||
      <u-swiper :list="swiperList" mode="none" height="240" bg-color="none" @click="handleBannerClick"/>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="grid-content">
 | 
			
		||||
      <u-grid :col="4" hover-class="text-hover" :border="false">
 | 
			
		||||
        <u-grid-item v-for="(item, index) in grids" :key="index" :custom-style="{padding:'8px 0'}" bg-color="none"
 | 
			
		||||
                     class="grid-item" @click="handleClick(item)">
 | 
			
		||||
          <img :src="item.pictureUrl" alt=""/>
 | 
			
		||||
          <div class="grid-text">{{ item.name }}</div>
 | 
			
		||||
        </u-grid-item>
 | 
			
		||||
      </u-grid>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="notice">
 | 
			
		||||
      <img :src="`${cdn}/notice-new.png`" alt="">
 | 
			
		||||
      <u-notice-bar mode="vertical" color="#4181FF" style="flex: 1;" :volume-icon="false" :is-circular="false"
 | 
			
		||||
                    duration="5000" speed="5000" :list="noticeList" @click="clickNotice"/>
 | 
			
		||||
    </div>
 | 
			
		||||
    <template v-if="activeList.length>0">
 | 
			
		||||
      <header>推荐专题</header>
 | 
			
		||||
      <scroll-view :scroll-x="true" style="width: 100%" class="scroll-wrap">
 | 
			
		||||
        <div class="scroll-card"
 | 
			
		||||
             :style="{background:'url(' + item.pictureUrl + ') no-repeat no-repeat;background-size:100% 100%;'}"
 | 
			
		||||
             v-for="(item,index) in activeList" :key="index" @click="handleActive(item)"/>
 | 
			
		||||
      </scroll-view>
 | 
			
		||||
    </template>
 | 
			
		||||
    <template v-if="categorys&&categorys.length>0">
 | 
			
		||||
      <u-tabs :list="categorys.map(e=>({name:e.categoryName}))" font-size="40" bg-color="transparent"
 | 
			
		||||
              inactive-color="#999999" :active-item-style="active"
 | 
			
		||||
              :is-scroll="true" :current="index" @change="tabChange"/>
 | 
			
		||||
      <div class="list-wrap" v-if="categoryList && categoryList.length>0">
 | 
			
		||||
        <div class="list-card" v-for="(category,index) in categoryList" :key="index"
 | 
			
		||||
             @click="$linkTo('/mods/AppContent/contentDetail?id='+category.id)">
 | 
			
		||||
          <div class="header">{{ category.title }}</div>
 | 
			
		||||
          <div class="content-wrap"
 | 
			
		||||
               v-if="category.contentType==0 && category.files && category.files.length<3&&category.files.length>0">
 | 
			
		||||
            <img class="img" :src="item.url" v-for="(item,index) in category.files.slice(0,1)" :key="index.id">
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="content-wrap" v-if="category.contentType==0 && category.files && category.files.length >= 3">
 | 
			
		||||
            <img class="min-img" :src="item.url" v-for="(item,index) in  category.files.slice(0,3)" :key="index.id">
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="content-wrap" v-if="category.contentType == 1">
 | 
			
		||||
            <img class="img" :src="category.pictureUrl" alt=""/>
 | 
			
		||||
            <img class="play-icon" :src="`${cdn}/play.png`" alt=""/>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="bottom">
 | 
			
		||||
            <div class="left">
 | 
			
		||||
              <div class="tag">{{ category.categoryName }}</div>
 | 
			
		||||
              {{ category.createTime }}
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="right">
 | 
			
		||||
              <em>{{ category.viewCount }}</em>
 | 
			
		||||
              人看过
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <AiEmpty v-else/>
 | 
			
		||||
    </template>
 | 
			
		||||
    <AiLogin ref="login"/>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
<script>
 | 
			
		||||
import {mapActions, mapState} from 'vuex'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'AppPartyHome',
 | 
			
		||||
  appName: "党建首页",
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      cdn: "https://cdn.cunwuyun.cn/wxmp",
 | 
			
		||||
      swiperList: [],
 | 
			
		||||
      index: 0,
 | 
			
		||||
      grids: [],
 | 
			
		||||
      activeList: [],
 | 
			
		||||
      notices: [],
 | 
			
		||||
      categorys: [],
 | 
			
		||||
      categoryList: [],
 | 
			
		||||
      search: {areaId: ''},
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    ...mapState(['user', 'token']),
 | 
			
		||||
    active() {
 | 
			
		||||
      return {
 | 
			
		||||
        fontSize: '22px',
 | 
			
		||||
        color: '#333333',
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    noticeList() {
 | 
			
		||||
      let {notices} = this
 | 
			
		||||
      return notices?.length > 0 ? notices?.map(e => e.title) || ['暂无公告'] : ['暂无公告']
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  onReady() {
 | 
			
		||||
    uni.setNavigationBarTitle({title: '平昌党建'})
 | 
			
		||||
  },
 | 
			
		||||
  onLoad() {
 | 
			
		||||
    this.autoLogin().then(() => {
 | 
			
		||||
      this.getSwiperList();
 | 
			
		||||
      this.getName();
 | 
			
		||||
      this.getGrids();
 | 
			
		||||
      this.getActive();
 | 
			
		||||
      this.getNotice();
 | 
			
		||||
    })
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    ...mapActions(['autoLogin', 'authCheck']),
 | 
			
		||||
    getName() {
 | 
			
		||||
      this.$instance.post("/app/appcontentmoduleinfo/listByName", null, {
 | 
			
		||||
        params: {names: "新闻发布"},
 | 
			
		||||
        withoutToken: true
 | 
			
		||||
      }).then(res => {
 | 
			
		||||
        if (res?.data[0]?.categoryList?.length) {
 | 
			
		||||
          this.categorys = res.data[0]["categoryList"];
 | 
			
		||||
          this.search.moduleId = res.data[0]['id']
 | 
			
		||||
          this.search.categoryId = res.data[0]['categoryList'][0]['id']
 | 
			
		||||
          this.getCategoryList()
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    tabChange(idx) {
 | 
			
		||||
      this.index = idx
 | 
			
		||||
      this.search.categoryId = this.categorys[idx]['id']
 | 
			
		||||
      this.getCategoryList()
 | 
			
		||||
    },
 | 
			
		||||
    getCategoryList() {
 | 
			
		||||
      this.$instance.post("/app/appcontentinfo/list", null, {
 | 
			
		||||
        params: {...this.search, size: 100}
 | 
			
		||||
      }).then(res => {
 | 
			
		||||
        if (res?.data) {
 | 
			
		||||
          this.categoryList = res.data.records;
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    clickNotice(val) {
 | 
			
		||||
      const id = this.notices[val]["id"];
 | 
			
		||||
      if (id) {
 | 
			
		||||
        uni.navigateTo({
 | 
			
		||||
          url: "/mods/AppNotice/AppNotice?id=" + id
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    handleActive({type, appId, url}) {
 | 
			
		||||
      if (type == 0) {
 | 
			
		||||
        uni.navigateToMiniProgram({appId})
 | 
			
		||||
      } else if (type == 1) {
 | 
			
		||||
        this.$linkTo("/subPages/h5/webview?link=" + url);
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    getNotice() {
 | 
			
		||||
      this.$instance.post("/app/appmininotice/list", null, {
 | 
			
		||||
        params: {size: 999},
 | 
			
		||||
        withoutToken: true
 | 
			
		||||
      }).then(res => {
 | 
			
		||||
        if (res?.data) {
 | 
			
		||||
          this.notices = res.data.records;
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    getActive() {
 | 
			
		||||
      this.$instance.post("/app/appminitopicconfig/list", null, {
 | 
			
		||||
        params: {size: 999},
 | 
			
		||||
        withoutToken: true
 | 
			
		||||
      }).then(res => {
 | 
			
		||||
        if (res?.data) {
 | 
			
		||||
          this.activeList = res.data.records;
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取顶部九宫格
 | 
			
		||||
     */
 | 
			
		||||
    getGrids() {
 | 
			
		||||
      this.$instance.post("/app/appminihomeconfig/list", null, {
 | 
			
		||||
        params: {picked: 1},
 | 
			
		||||
        withoutToken: true
 | 
			
		||||
      }).then(res => {
 | 
			
		||||
        if (res?.data) {
 | 
			
		||||
          this.grids = res.data.records;
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    getSwiperList() {
 | 
			
		||||
      this.$instance.post('/app/appbanner/listForWx', null, {
 | 
			
		||||
        withoutToken: true
 | 
			
		||||
      }).then((res) => {
 | 
			
		||||
        if (res?.data) {
 | 
			
		||||
          this.swiperList = res.data?.map((e) => ({...e, image: e.imgUrl})) || []
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    handleClick({type, appId, modulePath, url, checkType, corpId}) {
 | 
			
		||||
      //先判读是不是系统应用
 | 
			
		||||
      if (type != "0") {
 | 
			
		||||
        if (type == "1") {
 | 
			
		||||
          uni.navigateToMiniProgram({appId});
 | 
			
		||||
        } else if (type == "2") {
 | 
			
		||||
          uni.navigateTo({url: "/subPages/h5/webview?link=" + url});
 | 
			
		||||
        } else if (type == "3") {
 | 
			
		||||
          this.$linkTo(url);
 | 
			
		||||
        } else if (type == "4") {
 | 
			
		||||
          uni.openCustomerServiceChat({
 | 
			
		||||
            extInfo: {url: url},
 | 
			
		||||
            corpId: corpId,
 | 
			
		||||
            fail: () => {
 | 
			
		||||
              this.$u.toast('请使用普通微信打开小程序进行咨询');
 | 
			
		||||
            }
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
      } else if (type && type == "0") {
 | 
			
		||||
        uni.showLoading({title: '正在进入应用...'})
 | 
			
		||||
        this.authCheck({checkType, modulePath}).finally(() => uni.hideLoading())
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    handleBannerClick(index) {
 | 
			
		||||
      if (!this.swiperList[index].linkUrl) return
 | 
			
		||||
 | 
			
		||||
      if (this.swiperList[index].type == '0') {  //0 h5链接; 1 小程序链接; 2外部小程序
 | 
			
		||||
        this.$linkTo(`/subPages/h5/webview?link=${this.swiperList?.[index]?.linkUrl}&title=${this.swiperList?.[index]?.title}`)
 | 
			
		||||
      } else if (this.swiperList[index].type == '1') {
 | 
			
		||||
        this.$linkTo(`${this.swiperList?.[index]?.linkUrl}`)
 | 
			
		||||
      } else {
 | 
			
		||||
        wx.navigateToMiniProgram({
 | 
			
		||||
          appId: this.swiperList[index].linkUrl
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  onShareAppMessage() {
 | 
			
		||||
    return {
 | 
			
		||||
      title: `欢迎使用平昌党建~`,
 | 
			
		||||
      path: `/pages/AppHome/AppHome`
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
@import "~dvcp-wui/common";
 | 
			
		||||
 | 
			
		||||
.page {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  min-height: 100%;
 | 
			
		||||
  background-color: #F3F6F9;
 | 
			
		||||
  position: relative;
 | 
			
		||||
 | 
			
		||||
  .search-wrap {
 | 
			
		||||
    width: 750px;
 | 
			
		||||
    height: 112px;
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    padding: 0 32px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
    background-color: #4181FF;
 | 
			
		||||
 | 
			
		||||
    .search {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      height: 64px;
 | 
			
		||||
      background: #000000;
 | 
			
		||||
      border-radius: 32px;
 | 
			
		||||
      opacity: 0.2;
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      padding: 0 32px;
 | 
			
		||||
      display: flex;
 | 
			
		||||
      align-items: center;
 | 
			
		||||
 | 
			
		||||
      .desc {
 | 
			
		||||
        font-size: 28px;
 | 
			
		||||
        color: #FFFFFF;
 | 
			
		||||
        margin-left: 16px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .area-content {
 | 
			
		||||
    height: 96px;
 | 
			
		||||
    line-height: 96px;
 | 
			
		||||
    background-color: #2d80fb;
 | 
			
		||||
 | 
			
		||||
    .area-ai {
 | 
			
		||||
      display: block;
 | 
			
		||||
      width: 200px;
 | 
			
		||||
      margin-left: 34px;
 | 
			
		||||
      text-align: left;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .picker-location {
 | 
			
		||||
      text-align: left;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .header-bg {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 160px;
 | 
			
		||||
    background-color: #4181FF;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .border {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 40px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .swiper-content {
 | 
			
		||||
    width: 686px;
 | 
			
		||||
    height: 240px;
 | 
			
		||||
    margin: -176px auto 24px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .grid-content {
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
 | 
			
		||||
    .grid-item {
 | 
			
		||||
      img {
 | 
			
		||||
        width: 108px;
 | 
			
		||||
        height: 108px;
 | 
			
		||||
        object-fit: fill;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .grid-text {
 | 
			
		||||
        font-size: 26px;
 | 
			
		||||
        font-weight: 400;
 | 
			
		||||
        color: #333333;
 | 
			
		||||
        line-height: 36px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ::v-deep .notice {
 | 
			
		||||
    width: 686px;
 | 
			
		||||
    height: 88px;
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    padding: 0 24px;
 | 
			
		||||
    margin: 30px auto 48px;
 | 
			
		||||
    background: #FFFFFF;
 | 
			
		||||
    box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.02);
 | 
			
		||||
    border-radius: 16px;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
 | 
			
		||||
    & > img {
 | 
			
		||||
      width: 128px;
 | 
			
		||||
      height: 52px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .u-news-item {
 | 
			
		||||
      text-overflow: ellipsis;
 | 
			
		||||
      overflow: hidden;
 | 
			
		||||
      white-space: nowrap;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .list-wrap {
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    padding: 32px;
 | 
			
		||||
 | 
			
		||||
    .list-card {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      min-height: 100px;
 | 
			
		||||
      background: #FFFFFF;
 | 
			
		||||
      box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.02);
 | 
			
		||||
      border-radius: 16px;
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      padding: 32px;
 | 
			
		||||
      margin-bottom: 24px;
 | 
			
		||||
 | 
			
		||||
      .header {
 | 
			
		||||
        font-size: 36px;
 | 
			
		||||
        font-weight: 600;
 | 
			
		||||
        color: #333333;
 | 
			
		||||
        line-height: 50px;
 | 
			
		||||
        display: -webkit-box;
 | 
			
		||||
        -webkit-box-orient: vertical;
 | 
			
		||||
        -webkit-line-clamp: 2;
 | 
			
		||||
        overflow: hidden;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .content-wrap {
 | 
			
		||||
        display: flex;
 | 
			
		||||
        gap: 4px;
 | 
			
		||||
        flex-wrap: wrap;
 | 
			
		||||
        margin-top: 24px;
 | 
			
		||||
        position: relative;
 | 
			
		||||
 | 
			
		||||
        .img {
 | 
			
		||||
          width: 100%;
 | 
			
		||||
          height: 350px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .min-img {
 | 
			
		||||
          width: 204px;
 | 
			
		||||
          height: 204px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .play-icon {
 | 
			
		||||
          width: 80px;
 | 
			
		||||
          height: 80px;
 | 
			
		||||
          border-radius: 50%;
 | 
			
		||||
          position: absolute;
 | 
			
		||||
          left: 50%;
 | 
			
		||||
          top: 50%;
 | 
			
		||||
          transform: translate(-50%, -50%);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .bottom {
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        justify-content: space-between;
 | 
			
		||||
        margin-top: 24px;
 | 
			
		||||
 | 
			
		||||
        .left {
 | 
			
		||||
          display: flex;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
          font-size: 28px;
 | 
			
		||||
          font-weight: 400;
 | 
			
		||||
          color: #999999;
 | 
			
		||||
 | 
			
		||||
          .tag {
 | 
			
		||||
            width: 144px;
 | 
			
		||||
            height: 48px;
 | 
			
		||||
            background: #EEEEEE;
 | 
			
		||||
            border-radius: 24px;
 | 
			
		||||
            display: flex;
 | 
			
		||||
            align-items: center;
 | 
			
		||||
            justify-content: center;
 | 
			
		||||
            font-size: 28px;
 | 
			
		||||
            font-weight: 400;
 | 
			
		||||
            color: #999999;
 | 
			
		||||
            margin-right: 16px;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .right {
 | 
			
		||||
          font-size: 28px;
 | 
			
		||||
          font-weight: 400;
 | 
			
		||||
          color: #999999;
 | 
			
		||||
          display: flex;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
 | 
			
		||||
          em {
 | 
			
		||||
            font-style: normal;
 | 
			
		||||
            color: #4181FF;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  header {
 | 
			
		||||
    font-size: 44px;
 | 
			
		||||
    font-weight: 600;
 | 
			
		||||
    color: #333333;
 | 
			
		||||
    padding: 0 32px;
 | 
			
		||||
    margin-bottom: 32px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .scroll-wrap {
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    padding: 0 32px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    white-space: nowrap;
 | 
			
		||||
    margin-bottom: 24px;
 | 
			
		||||
 | 
			
		||||
    .scroll-card {
 | 
			
		||||
      display: inline-block;
 | 
			
		||||
      width: 440px;
 | 
			
		||||
      height: 240px;
 | 
			
		||||
      box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.02);
 | 
			
		||||
      border-radius: 16px;
 | 
			
		||||
      margin-right: 32px;
 | 
			
		||||
 | 
			
		||||
      &:last-child {
 | 
			
		||||
        margin-right: 0;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/project/pingchang/AppPartyHome/home.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/project/pingchang/AppPartyHome/home.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 965 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/project/pingchang/AppPartyHome/home_selected.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/project/pingchang/AppPartyHome/home_selected.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1000 B  | 
@@ -158,7 +158,7 @@ export default {
 | 
			
		||||
  },
 | 
			
		||||
  onShareAppMessage() {
 | 
			
		||||
    return {
 | 
			
		||||
      title: '欢迎使用数字乡村治理服务一体化平台~',
 | 
			
		||||
      title: '欢迎使用数字平昌~',
 | 
			
		||||
      path: `/pages/AppModules/AppModules`
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user