风险测评小程序前端代码仓库
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.
 
 
 

276 lines
5.9 KiB

<template>
<view class="page__view">
<navbar title="资料修改" leftClick @leftClick="$utils.navigateBack" />
<view class="form">
<view class="flex form-header">
<view class="line"></view>
<view>个人信息</view>
</view>
<uv-form
ref="form"
:model="form"
:rules="rules"
errorType="toast"
>
<view class="form-item">
<uv-form-item prop="headImage" :customStyle="formItemStyle">
<button class="btn btn-avatar" :plain="true" :hairline="false" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
<view class="flex flex-column avatar-box">
<view v-if="form.headImage" class="avatar">
<image class="img" :src="form.headImage" mode="aspectFill"></image>
</view>
<view v-else class="flex avatar">
<image class="img" src="@/static/image/avatar-default.png" mode="scaleToFill"></image>
</view>
<view>点击更换头像</view>
</view>
</button>
</uv-form-item>
</view>
<view class="form-item">
<uv-form-item prop="nickName" :customStyle="formItemStyle">
<view class="flex row">
<view class="row-label">昵称</view>
<view class="row-content input">
<input
v-model="form.nickName"
type="nickname"
placeholder="请输入"
placeholderStyle="color: #999999; font-size: 30rpx; font-weight: 400;"
style="text-align: right;"
/>
</view>
</view>
</uv-form-item>
</view>
<view class="form-item">
<uv-form-item prop="phone" :customStyle="formItemStyle">
<view class="flex row">
<view class="row-label">手机号</view>
<view class="row-content input">
<input
v-model="form.phone"
placeholder="请输入"
placeholderStyle="color: #999999; font-size: 30rpx; font-weight: 400;"
style="text-align: right;"
:disabled="!!userInfo.phone"
/>
</view>
</view>
</uv-form-item>
</view>
</uv-form>
</view>
<view class="bottom">
<button class="btn" @click="onSubmit">保存</button>
</view>
</view>
</template>
<script>
import { mapState } from 'vuex'
export default {
props: {
mode: {
type: String,
default: null,
}
},
data() {
return {
form: {
nickName: null,
phone: null,
headImage: null,
},
rules: {
'nickName': {
type: 'string',
required: true,
message: '请输入昵称',
},
'phone': {
type: 'string',
required: true,
message: '请输入手机号',
},
'headImage': {
type: 'string',
required: false,
message: '请选择头像',
},
},
formItemStyle: { padding: 0 },
}
},
computed: {
...mapState(['userInfo']),
},
onLoad(arg) {
this.mode = arg.mode
this.form.nickName = this.userInfo.nickName || ''
this.form.phone = this.userInfo.phone || ''
this.form.headImage = this.userInfo.headImage || ''
},
methods: {
onChooseAvatar(res) {
this.$Oss.ossUpload(res.target.avatarUrl)
.then(url => {
this.form.headImage = url
})
},
getPhone(e){
this.$api('bindPhone', {
code : e.detail.code
}, res => {
if(res.code == 200){
if(res.success){
this.form.phone = res.result
}else{
uni.showModal({
title: res.message
})
}
}
})
},
async onSubmit() {
try {
await this.$refs.form.validate()
const {
nickName,
phone,
headImage,
} = this.form
const params = {
nickName,
phone,
headImage,
}
await this.$fetch('updateInfo', params, false)
uni.showToast({
icon: 'success',
title: '保存成功',
});
this.$store.commit('getUserInfo')
setTimeout(uni.navigateBack, 1000, -1)
} catch (err) {
console.log('onSubmit err', err)
}
},
},
}
</script>
<style lang="scss" scoped>
.form {
padding: 34rpx 22rpx;
&-header {
justify-content: flex-start;
padding: 0 18rpx;
column-gap: 7rpx;
font-family: PingFang SC;
font-weight: 600;
font-size: 36rpx;
line-height: 1.4;
color: #000000;
margin-bottom: 24rpx;
.line {
width: 9rpx;
height: 33rpx;
background: #014FA2;
border-radius: 5rpx;
}
}
&-item {
& + & {
margin-top: 34rpx;
border-bottom: 0.5rpx solid rgba($color: #707070, $alpha: 0.14);
}
}
}
.btn-avatar {
margin-bottom: 27rpx;
display: inline-block;
width: auto;
border: none;
}
.avatar-box {
box-sizing: border-box;
row-gap: 9rpx;
font-size: 28rpx;
color: rgba($color: #999999, $alpha: 0.5);
}
.avatar {
position: relative;
width: 157rpx;
height: 157rpx;
border-radius: 50%;
overflow: hidden;
.img {
width: 100%;
height: 100%;
}
}
.row {
padding: 12rpx 69rpx 12rpx 23rpx;
justify-content: space-between;
font-family: PingFang SC;
font-weight: 400;
line-height: 1.4;
font-size: 30rpx;
color: #8B8B8B;
& + & {
margin-top: 32rpx;
}
}
.bottom {
position: fixed;
left: 0;
bottom: 0;
width: 100vw;
padding: 0 78rpx 231rpx 78rpx;
box-sizing: border-box;
.btn {
width: 100%;
padding: 25rpx 0;
box-sizing: border-box;
font-size: 32rpx;
color: #FFFFFF;
background: #014FA2;
border-radius: 41rpx;
}
}
</style>