You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
shangmenanmo/user/pages/setting.vue

358 lines
8.8 KiB

<template>
<view class="mine-pages-setting">
<view class="flex-center flex-column pd-lg fill-base">
<view class="space-lg"></view>
<view class="space-lg"></view>
<!-- #ifdef H5 -->
<view class="avatar radius">
<view class="h5-image avatar radius" :style="{ backgroundImage : `url('${user_info.avatarUrl}')`}">
</view>
</view>
<!-- #endif -->
<!-- #ifndef H5 -->
<image mode="aspectFill" class="avatar radius" :src="user_info.avatarUrl"></image>
<!-- #endif -->
<view @tap.stop="toResetPhone" class="flex-y-center f-title c-caption mt-md" v-if="user_info.phone">
{{user_info.split_phone}}
<view class="ml-md f-caption" :style="{color:primaryColor}" v-if="configInfo.short_code_status">
更换手机号</view>
</view>
</view>
<view class="flex-between pd-lg fill-base f-paragraph">
<view>昵称</view>
<view class="c-caption">{{user_info.nickName}}</view>
</view>
<view class="flex-between pd-lg fill-base f-paragraph">
<view>注册时间</view>
<view class="c-caption">{{user_info.create_date || '-'}}</view>
</view>
<!-- #ifndef MP-WEIXIN -->
<view @tap.stop="$util.goUrl({url:`/user/pages/alipay-account`})"
class="flex-between pd-lg fill-base f-paragraph">
<view>支付宝账号</view>
<view class="flex-y-center c-caption">{{user_info.split_alipay_number || '暂无'}}
<view class="ml-md" :style="{color:primaryColor}">{{user_info.alipay_number?'修改':'去设置'}}</view>
</view>
</view>
<!-- #endif -->
<view class="space-md"></view>
<view @tap.stop="goDetail(index,'infoList')" class="flex-between pd-lg fill-base f-paragraph"
v-for="(item,index) in infoList" :key="index">
<view>{{item.text}}</view>
<i class="iconfont icon-right"></i>
</view>
<view class="space-max-footer"></view>
<!-- #ifdef H5 -->
<fix-bottom-button @confirm="toLoginOut" :text="[{ text: '退出登录', type: 'confirm' }]" bgColor="#fff">
</fix-bottom-button>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<fix-bottom-button @cancel="$util.goUrl({url:`/user/pages/logout`})" @confirm="toLoginOut"
:text="[{ text: '注销账户', type: 'cancel' },{ text: '退出登录', type: 'confirm' }]" bgColor="#fff">
</fix-bottom-button>
<!-- #endif -->
<uni-popup ref="show_phone_item" :maskClick="false">
<view @tap.stop.prevent class="common-popup-content popup-phone pd-lg flex-center flex-column fill-base">
<view class="f-md-title c-black">请输入手机号</view>
<view class="space-lg pb-lg"></view>
<view class="space-lg pb-lg"></view>
<view class="flex-center mb-lg">
<view class="input-info sm mr-md radius-16">
<input v-model="subForm.phone" type="number"
class="item-input flex-y-center pl-lg pr-lg f-sm-title c-title"
placeholder-class="c-placeholder" :placeholder="rule[0].errorMsg" />
</view>
<view @tap="toSend" class="send-btn flex-center c-base radius-16"
:style="{background:primaryColor}">
{{authTime>0?`(${authTime}s)`:'发送'}}
</view>
</view>
<view class="input-info radius-16">
<input v-model="subForm.short_code" type="number"
class="item-input flex-y-center pl-lg pr-lg f-sm-title c-title" maxlength="6"
placeholder-class="c-placeholder" :placeholder="rule[1].errorMsg" />
</view>
<view class="button">
<view @tap.stop="toResetItem" class="item-child">
取消
</view>
<view @tap.stop="submit" class="item-child" :style="{background: primaryColor,color:'#fff'}">
确定
</view>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
import {
mapState,
mapActions,
mapMutations
} from "vuex"
import siteInfo from '@/siteinfo.js';
export default {
data() {
return {
isLoad: false,
options: {},
infoList: [{
text: '隐私政策',
url: `/user/pages/protocol`
}, {
text: '服务协议',
url: `/user/pages/information`
}, {
text: '屏蔽列表',
url: `/user/pages/shield`
}],
user_info: {},
authTime: 0,
timer: null,
subForm: {
phone: '',
short_code: ''
},
rule: [{
name: "phone",
checkType: "isMobile",
errorMsg: "请输入手机号",
regText: "手机号"
}, {
name: "short_code",
checkType: "isNotNull",
errorMsg: "请输入短信验证码",
regText: "短信验证码"
}],
lockTap: false
}
},
computed: mapState({
primaryColor: state => state.config.configInfo.primaryColor,
subColor: state => state.config.configInfo.subColor,
configInfo: state => state.config.configInfo,
userInfo: state => state.user.userInfo,
}),
async onLoad() {
this.initIndex()
},
methods: {
...mapActions(['getUserInfo']),
...mapMutations(['updateConfigItem', 'updateServiceItem', 'updateTechnicianItem', 'updateOrderItem',
'updateUserItem'
]),
async initIndex(refresh = false) {
// #ifdef H5
if (!refresh && this.$jweixin.isWechat()) {
await this.$jweixin.initJssdk();
this.$jweixin.wxReady(() => {
this.$jweixin.hideOptionMenu()
})
}
// #endif
await this.getUserInfo()
this.$util.setNavigationBarColor({
bg: this.primaryColor
})
this.user_info = this.$util.deepCopy(this.userInfo)
},
initRefresh() {
this.initIndex(true)
},
toResetPhone() {
let {
short_code_status = 0
} = this.configInfo
if (!short_code_status) return
this.$refs.show_phone_item.open()
},
toResetItem() {
this.$refs.show_phone_item.close()
this.timer && clearTimeout(this.timer)
this.authTime = 0
this.subForm = {
phone: '',
short_code: ''
}
},
//表单验证
validate(param, is_send = false) {
let validate = new this.$util.Validate();
this.rule.map(item => {
let {
name,
} = item
if (name == 'short_code' && is_send) return
validate.add(param[name], item);
})
let message = validate.start();
return message;
},
async toSend() {
let {
authTime
} = this
if (authTime) return
let {
phone = ''
} = this.subForm
let msg = this.validate({
phone
}, true);
if (msg) {
this.$util.showToast({
title: msg
});
return;
}
if (this.lockTap) return
this.lockTap = true
this.$util.showLoading()
try {
await this.$api.user.sendShortMsg({
phone
})
this.$util.hideAll()
this.lockTap = false
let time = 60
this.timer = setInterval(() => {
if (time === 0) {
clearInterval(this.timer)
return
}
time--
this.authTime = time
}, 1000)
} catch (e) {
setTimeout(() => {
this.lockTap = false
this.$util.hideAll()
}, 2000)
}
},
async submit() {
let param = this.$util.deepCopy(this.subForm)
let msg = this.validate(param);
if (msg) {
this.$util.showToast({
title: msg
});
return;
}
if (param.short_code.length != 6) {
this.$util.showToast({
title: `请输入6位数短信验证码`
})
return
}
if (this.lockTap) return
this.lockTap = true
this.$util.showLoading()
try {
await this.$api.user.bindUserPhone(param)
this.$util.hideAll()
this.lockTap = false
this.toResetItem()
await this.getUserInfo()
} catch (e) {
setTimeout(() => {
this.lockTap = false
this.$util.hideAll()
}, 2000)
}
},
goDetail(index, key) {
let {
url
} = this[key][index]
this.$util.goUrl({
url
})
},
toLoginOut() {
let methodArr = ['updateServiceItem', 'updateTechnicianItem']
methodArr.map(item => {
this[item]({
key: 'pageActive',
val: false
})
})
let arr = ['autograph', 'userInfo', 'location', 'appLogin', 'loginType',
'isGzhLogin', 'isShowLogin', 'mineInfo', 'coachInfo', 'userPageType', 'commonOptions'
]
arr.map(key => {
this.updateUserItem({
key,
val: key === 'isShowLogin' ? true : key === 'isGzhLogin' ? false : key ===
'userPageType' ? 1 : ''
})
})
this.$util.showToast({
title: `退出登录`
})
setTimeout(() => {
// #ifdef H5
let {
siteroot
} = siteInfo
let url = siteroot.split('/index.php')[0]
let href = `${url}/h5/#/pages/service`
window.location.href = href
// #endif
// #ifdef APP-PLUS
this.$util.goUrl({
url: `/pages/service`,
openType: `reLaunch`
})
// #endif
}, 1000)
}
}
}
</script>
<style lang="scss">
.mine-pages-setting {
.iconfont {
color: #999
}
.popup-phone {
width: 630rpx;
.input-info {
width: 570rpx;
height: 90rpx;
background: #F7F7F7;
.item-input {
height: 90rpx;
font-size: 32rpx;
text-align: left;
}
}
.input-info.sm {
width: 400rpx;
}
.send-btn {
width: 150rpx;
height: 90rpx;
}
}
}
</style>