Files
jdt-user/src/components/UserModal.vue
YuanHuakk 896acaef9e
All checks were successful
continuous-integration/drone/push Build is passing
feat(custom): 地图apiKey更换,订单核销详情新增支付方式
2025-05-29 15:45:16 +08:00

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>