Files
MER-2.2_2601/mer_uniapp/pages/users/user_info/index.vue
2026-03-08 20:07:52 +08:00

442 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view :data-theme="theme">
<form @submit="formSubmit" report-submit='true'>
<view class='personal-data borderPad'>
<view class='list borRadius14 bg--w111-fff mt20'>
<view class="item acea-row row-between-wrapper">
<view>头像</view>
<!-- #ifndef MP -->
<view class="pictrue" @click.stop='uploadpic'>
<image :src='avatarUrl'></image>
<image :src='editPng' class="alter"></image>
</view>
<!-- #endif -->
<!-- #ifdef MP -->
<view class="pictrue">
<button class="avatar-wrapper" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
<image class="avatar" :src="avatarUrl"></image>
</button>
<image :src='editPng' class="alter"></image>
</view>
<!-- #endif -->
</view>
<view class='item acea-row row-between-wrapper'>
<view>昵称</view>
<view class='input fontColor'>
<!-- #ifndef MP -->
<input type='text' name='nickname' :value='nickname' maxlength="20"></input>
<!-- #endif -->
<!-- #ifdef MP -->
<input type="nickname" name='nickname' :value='nickname' class="weui-input"
placeholder="请输入昵称" maxlength="20"/>
<!-- #endif -->
</view>
</view>
<view class='item acea-row row-between-wrapper'>
<view>性别</view>
<view class='input'>
<picker @change="bindSexChange" :value="sexindex" :range="sexList" range-key="name">
<view class="uni-input">{{sexList[sexindex].name}}</view>
</picker>
</view>
</view>
<view class='item acea-row row-between-wrapper'>
<view>出生日期</view>
<view class='input'>
<picker mode="date" :value="date"
@change="bindDateChange">
<view class="uni-input">{{date}}</view>
</picker>
</view>
</view>
<view class='item acea-row row-between-wrapper'>
<view>地区</view>
<view class='input'>
<picker mode="multiSelector" :value="cityIndex" :range="cityData" @change="bindCityChange"
@columnchange="selMonitor">
<view class="uni-input">{{addressNode.province&&addressNode.city ? addressNode.province + ' , ' + addressNode.city : '-'}}
</view>
</picker>
</view>
</view>
</view>
<button class='modifyBnt bg-color' formType="submit">保存修改</button>
</view>
</form>
</view>
</template>
<script>
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
userEdit
} from '@/api/user.js';
import {
getCity
} from '@/api/api.js';
import {
toLogin
} from '@/libs/login.js';
import {
mapGetters
} from "vuex";
import {
Debounce
} from '@/utils/validate.js'
import city from "../static/js/city.js";
let app = getApp();
const CACHE_ADDRESS = {};
export default {
data() {
return {
memberInfo: {
avatar: '',
},
userIndex: 0,
wechat: false,
theme: app.globalData.theme,
editPng: '../../../static/images/alert1.png',
sexList: [{
val: 0,
name: '未知'
},
{
val: 1,
name: '男'
},
{
val: 2,
name: '女'
}
],
sexindex: 0,
date: '2000-01-01',
sex: 0,
cityData: city,
cityIndex: 0,
addressNode: {
province: "请选择城市",
city: ""
},
provinceList: [],
cityAllList: [],
avatarUrl: "",
nickname: '',
userInfo: null
};
},
computed: {
...mapGetters(['isLogin']),
startDate() {
return this.getDate('start');
},
endDate() {
return this.getDate('end');
}
},
onLoad() {
//this.loadAddress(1, 1);
if (!this.isLogin) {
toLogin();
} else {
this.getUserInfo();
}
this.getAddressData();
// #ifdef H5
let ua = navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == "micromessenger") {
this.$set(this, 'wechat', false);
} else {
this.$set(this, 'wechat', true);
}
// #endif
switch (this.theme) {
case 'theme2':
this.editPng = '../static/images/alert2.png'
break;
case 'theme3':
this.editPng = '../static/images/alert3.png'
break;
case 'theme4':
this.editPng = '../static/images/alert4.png'
break;
case 'theme5':
this.editPng = '../static/images/alert5.png'
break;
default:
this.editPng = '../static/images/alert1.png'
break;
}
},
methods: {
getUserInfo(data) {
this.$store.dispatch('USERINFO').then(res => {
this.userInfo = res;
this.avatarUrl = this.userInfo.avatar ? this.userInfo.avatar : '../static/images/f.png';
this.nickname = this.userInfo.nickname ? this.userInfo.nickname : '-';
this.date = this.userInfo.birthday || '2000-01-01';
this.sexindex = this.userInfo.sex;
this.sex = this.sexList[this.sexindex].val;
this.addressNode = {
province: this.userInfo.province,
city: this.userInfo.city
}
});
},
/**
* 小程序端上传头像
*
*/
onChooseAvatar(e) {
const {
avatarUrl
} = e.detail
uni.showLoading({
title: '加载中...'
});
this.$util.uploadImgs( avatarUrl, {
url: 'upload/image',
name: 'multipart',
model: "maintain",
pid: 0
},(res) => {
this.avatarUrl = res.data.url;
uni.hideLoading();
}, (err) => {
uni.hideLoading();
})
},
/**
* 监听省市区滚动
*
*/
selMonitor(e) {
const that = this
let column = e.detail.column
if (column == 0) {
let index = e.detail.value
let length = that.cityData[1].length
// 改变市
that.cityData[1].splice(0, length, ...that.cityAllList[index])
}
},
/**
* 将省市区的数据转换为picker可用的多维数组
*
*/
getAddressData() {
// 所有城市列表,二维数组
let cityAllList = [];
// 省列表
let provinceList = [];
// cityData为省市区的json数据
for (let key in this.cityData) {
let newDataList = [];
if (this.cityData[key].child) {
for (let key2 in this.cityData[key].child) {
newDataList.push(this.cityData[key].child[key2].city);
}
}
provinceList.push(this.cityData[key].province);
cityAllList.push(newDataList);
}
this.provinceList = provinceList;
this.cityAllList = cityAllList;
this.cityData = [provinceList, cityAllList[0]];
},
bindCityColumnChange(e) {
let column = e.detail.column
if (column == 0) {
let index = e.detail.value
this.cityData[1] = this.cityAllList[index]
}
},
bindCityChange(e) {
let val = e.target.value
this.addressNode = {
province: this.cityData[0][val[0]],
city: this.cityData[1][val[1]]
}
},
bindSexChange(e) {
this.sexindex = e.detail.value;
this.sex = this.sexList[this.sexindex].val;
},
bindDateChange: function(e) {
this.date = e.detail.value
},
getDate(type) {
const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
if (type === 'start') {
year = year - 60;
} else if (type === 'end') {
year = year + 2;
}
month = month > 9 ? month : '0' + month;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
},
/**
* 上传文件
*
*/
uploadpic: function() {
let that = this;
that.$util.uploadImageOne({
url: 'upload/image',
name: 'multipart',
model: "maintain",
pid: 0,
count: 1
}, function(res) {
that.avatarUrl = res;
});
},
/**
* 提交修改
*/
formSubmit: Debounce(function(e) {
let that = this,
value = e.detail.value
if (!value.nickname) return that.$util.Tips({
title: '用户姓名不能为空'
});
value.avatar = that.avatarUrl ? that.avatarUrl : that.userInfo.avatar;
uni.showLoading({
title: '加载中...'
});
userEdit({
avatar: value.avatar,
birthday: that.date,
city: this.addressNode.city,
province: this.addressNode.province,
nickname: value.nickname,
sex: that.sex
}).then(res => {
uni.hideLoading();
that.$util.Tips({
title: '保存成功',
icon: 'success'
});
setTimeout(function() {
uni.reLaunch({
url: '/pages/user/index',
})
}, 2000);
}).catch(msg => {
uni.hideLoading();
return that.$util.Tips({
title: msg || '保存失败,您并没有修改'
});
});
})
}
}
</script>
<style scoped lang="scss">
.fontColor {
color: #868686;
}
.personal-data .wrapper {
margin: 10rpx 0;
background-color: #fff;
padding: 36rpx 30rpx 13rpx 30rpx;
}
.personal-data .wrapper .title {
margin-bottom: 30rpx;
font-size: 32rpx;
color: #282828;
}
.list{
padding: 0 30rpx;
}
.personal-data .list .item {
border-bottom: 1rpx solid #f2f2f2;
padding: 36rpx 0;
font-size: 32rpx;
color: #333333;
}
.personal-data .list .item .phone {
width: 160rpx;
height: 56rpx;
font-size: 24rpx;
color: #fff;
line-height: 56rpx;
border-radius: 32rpx
}
.personal-data .list .item .pictrue {
width: 80rpx;
height: 80rpx;
position: relative;
}
.personal-data .list .item .pictrue image {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
}
.personal-data .list .item .pictrue .alter {
width: 30rpx;
height: 30rpx;
border-radius: 50%;
position: absolute;
bottom: 0;
right: 0;
}
.personal-data .list .item .input {
width: 415rpx;
text-align: right;
color: #666666;
}
.personal-data .list .item .input .id {
width: 365rpx;
}
.personal-data .list .item .input .iconfont {
font-size: 35rpx;
}
.personal-data .modifyBnt {
font-size: 32rpx;
color: #fff;
width: 690rpx;
height: 90rpx;
border-radius: 50rpx;
text-align: center;
line-height: 90rpx;
margin: 76rpx auto 0 auto;
}
.personal-data .logOut {
font-size: 32rpx;
text-align: center;
width: 690rpx;
height: 90rpx;
border-radius: 45rpx;
margin: 30rpx auto 0 auto;
}
</style>