312 lines
6.5 KiB
Vue
312 lines
6.5 KiB
Vue
<script lang="ts" setup>
|
|
import { computed, ref } from 'vue';
|
|
import Taro from '@tarojs/taro';
|
|
import headImg from '../static/def_avatar.png';
|
|
import logoImg from '../static/logo.jpg';
|
|
import { BASE_URL } from '@/utils/request';
|
|
import { getPhone, login } from '@/api/user';
|
|
|
|
const props = defineProps({
|
|
isShow: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
});
|
|
const emits = defineEmits(['closeEdit', 'update:isShow']);
|
|
|
|
const userInfo = ref({
|
|
nickname: '',
|
|
avatar: '',
|
|
phone: '',
|
|
});
|
|
|
|
const show = computed({
|
|
get: (): boolean => props.isShow,
|
|
set: val => {
|
|
emits('update:isShow', val);
|
|
},
|
|
});
|
|
|
|
const mp_is_new = ref(true);
|
|
|
|
const canvasStatus = ref(false);
|
|
|
|
const closeAttr = () => {
|
|
emits('closeEdit');
|
|
};
|
|
|
|
const onChooseAvatar = e => {
|
|
const { avatarUrl } = e.detail;
|
|
Taro.uploadFile({
|
|
url: `${BASE_URL}/upload`,
|
|
filePath: avatarUrl,
|
|
name: 'file',
|
|
success: function (res) {
|
|
const data = JSON.parse(res.data);
|
|
userInfo.value.avatar = data.data.data;
|
|
},
|
|
});
|
|
};
|
|
|
|
const uploadPic = () => {
|
|
canvasStatus.value = true;
|
|
};
|
|
|
|
const getPhoneNumber = async (e: any) => {
|
|
Taro.showLoading({
|
|
title: '授权手机号中',
|
|
mask: true,
|
|
});
|
|
const { code } = e.detail;
|
|
const res = await getPhone({
|
|
code: code,
|
|
});
|
|
userInfo.value.phone = res.data.phone;
|
|
Taro.hideLoading();
|
|
};
|
|
|
|
const formSubmit = async (e: any) => {
|
|
if (!userInfo.value.avatar)
|
|
return Taro.showToast({
|
|
title: '请上传头像',
|
|
icon: 'none',
|
|
});
|
|
userInfo.value.nickname = e.detail.value.nickname;
|
|
if (!userInfo.value.nickname)
|
|
return Taro.showToast({
|
|
title: '请输入昵称',
|
|
icon: 'none',
|
|
});
|
|
if (!userInfo.value.phone)
|
|
return Taro.showToast({
|
|
title: '请授权手机号码',
|
|
icon: 'none',
|
|
});
|
|
const res = await login({
|
|
Code: Taro.getStorageSync('wx_code'),
|
|
NickName: userInfo.value.nickname,
|
|
AvatarUrl: userInfo.value.avatar,
|
|
Phone: userInfo.value.phone,
|
|
Referee: Taro.getStorageSync('bind_id') || '',
|
|
});
|
|
emits('closeEdit');
|
|
Taro.showToast({
|
|
title: res.msg,
|
|
icon: 'success',
|
|
duration: 2000,
|
|
});
|
|
Taro.setStorageSync('token', res.data.token);
|
|
setTimeout(() => {
|
|
Taro.removeStorageSync('wx_code');
|
|
Taro.removeStorageSync('bind_id');
|
|
Taro.switchTab({
|
|
url: '/pages/user/index',
|
|
});
|
|
}, 2000);
|
|
};
|
|
</script>
|
|
|
|
<template>
|
|
<view>
|
|
<nut-popup
|
|
position="bottom"
|
|
safe-area-inset-bottom
|
|
closeable
|
|
:style="{ padding: '20px 10px' }"
|
|
v-model:visible="show"
|
|
@close="closeAttr"
|
|
:close-on-click-overlay="false">
|
|
<view class="mp-data">
|
|
<image class="image" :src="logoImg"></image>
|
|
<text class="mp-name">捷兑通 申请</text>
|
|
</view>
|
|
<!-- <view class="trip-msg">
|
|
<view class="title"> 获取您的昵称、头像 </view>
|
|
<view class="trip"> 提供具有辨识度的用户中心界面 </view>
|
|
</view> -->
|
|
<form @submit="formSubmit">
|
|
<view class="edit">
|
|
<view class="avatar edit-box">
|
|
<view class="left">
|
|
<view class="head">头像</view>
|
|
<view
|
|
class="avatar-box"
|
|
v-if="!mp_is_new"
|
|
@click.stop="uploadPic">
|
|
<image
|
|
:src="userInfo.avatar || headImg"
|
|
mode="aspectFill"></image>
|
|
</view>
|
|
<button
|
|
v-else
|
|
class="avatar-box"
|
|
open-type="chooseAvatar"
|
|
@chooseavatar="onChooseAvatar">
|
|
<image
|
|
:src="userInfo.avatar || headImg"
|
|
mode="aspectFill"></image>
|
|
</button>
|
|
</view>
|
|
</view>
|
|
<view class="nickname edit-box">
|
|
<view class="left">
|
|
<view class="head">昵称</view>
|
|
<view class="input">
|
|
<input
|
|
type="nickname"
|
|
placeholder-class="pl-sty"
|
|
placeholder="请输入昵称"
|
|
name="nickname"
|
|
:maxlength="16"
|
|
:value="userInfo.nickname" />
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="nickname edit-box">
|
|
<view class="left">
|
|
<view class="head">号码</view>
|
|
<view class="input">
|
|
<button
|
|
open-type="getPhoneNumber"
|
|
@getphonenumber="getPhoneNumber">
|
|
{{ !userInfo.phone ? '请授权手机号' : '授权成功' }}
|
|
</button>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="bottom">
|
|
<nut-button formType="submit" block type="success" color="#07C160">
|
|
保存
|
|
</nut-button>
|
|
</view>
|
|
</form>
|
|
</nut-popup>
|
|
</view>
|
|
</template>
|
|
|
|
<style lang="scss">
|
|
.mp-data {
|
|
display: flex;
|
|
align-items: center;
|
|
margin-bottom: 30px;
|
|
|
|
.mp-name {
|
|
font-size: 28px;
|
|
font-weight: bold;
|
|
color: #000000;
|
|
}
|
|
|
|
.image {
|
|
width: 48px;
|
|
height: 48px;
|
|
border-radius: 50%;
|
|
margin-right: 16px;
|
|
}
|
|
}
|
|
|
|
.trip-msg {
|
|
padding-bottom: 32px;
|
|
border-bottom: 1px solid #f5f5f5;
|
|
|
|
.title {
|
|
font-size: 30px;
|
|
font-weight: bold;
|
|
color: #000;
|
|
margin-bottom: 6px;
|
|
}
|
|
|
|
.trip {
|
|
font-size: 26px;
|
|
color: #777777;
|
|
}
|
|
}
|
|
|
|
.edit {
|
|
// border-bottom: 1px solid #f5f5f5;
|
|
|
|
.avatar {
|
|
border-bottom: 1px solid #f5f5f5;
|
|
}
|
|
|
|
.nickname {
|
|
.input {
|
|
width: 100%;
|
|
}
|
|
border-bottom: 1px solid #f5f5f5;
|
|
}
|
|
|
|
input {
|
|
height: 80px;
|
|
}
|
|
button {
|
|
flex: 1;
|
|
display: flex;
|
|
align-items: center;
|
|
background: none;
|
|
padding: 0;
|
|
height: 50px;
|
|
font-size: 28px;
|
|
color: #838383;
|
|
|
|
&::after {
|
|
border: none;
|
|
}
|
|
}
|
|
}
|
|
|
|
.edit-box {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
font-size: 30px;
|
|
padding: 22px 0;
|
|
|
|
.left {
|
|
display: flex;
|
|
align-items: center;
|
|
flex: 1;
|
|
|
|
.head {
|
|
color: rgba(0, 0, 0, 0.9);
|
|
white-space: nowrap;
|
|
margin-right: 60px;
|
|
}
|
|
|
|
.avatar-box {
|
|
image {
|
|
width: 100px;
|
|
height: 100%;
|
|
border-radius: 6px;
|
|
}
|
|
}
|
|
|
|
button {
|
|
flex: 1;
|
|
display: flex;
|
|
align-items: center;
|
|
background: none;
|
|
height: 100px;
|
|
|
|
&::after {
|
|
border: none;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.icon-xiangyou {
|
|
color: #cfcfcf;
|
|
}
|
|
|
|
.bottom {
|
|
margin-top: 20px;
|
|
padding: 0 150px;
|
|
|
|
.nut-button {
|
|
border-radius: 10px;
|
|
}
|
|
}
|
|
</style>
|