You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

422 lines
8.9 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="register-container" v-if="formData">
<view class="main">
<!-- 标题 -->
<view class="title">
<view class="title-main">用户注册</view>
<view class="title-sub">创建您的个人账户</view>
</view>
<!-- 表单 -->
<form @submit="onSubmit">
<!-- -->
<view class="form-item">
<text class="label">手机号</text>
<input class="input" type="tel" placeholder="请输入手机号" v-model="formData.tel" maxlength="11" />
</view>
<!-- 密码 -->
<view class="form-item">
<text class="label">密码</text>
<input class="input" type="password" placeholder="请输入密码" v-model="formData.password" />
</view>
<!-- 确认密码 -->
<view class="form-item">
<text class="label">确认密码</text>
<input class="input" type="password" placeholder="请再次输入密码" v-model="formData.confirmPassword" />
</view>
<!-- 真实姓名 -->
<view class="form-item">
<text class="label">真实姓名</text>
<input class="input" type="text" placeholder="请输入真实姓名" v-model="formData.name" />
</view>
<!-- 身份证号 -->
<view class="form-item">
<text class="label">身份证号</text>
<input class="input" type="text" placeholder="请输入身份证号" v-model="formData.sfz" />
</view>
<!-- 银行卡号 -->
<view class="form-item">
<text class="label">银行卡号</text>
<input class="input" type="text" placeholder="请输入银行卡号" v-model="formData.card_number" />
</view>
<!-- 银行名称 -->
<view class="form-item">
<text class="label">银行名称</text>
<input class="input" type="text" placeholder="请输入银行名称" v-model="formData.bank_name" />
</view>
<!-- 上传收款信息图片 -->
<view class="form-item upload-item">
<text class="label">上传收款信息图片</text>
<view class="upload-box" @click="chooseImage">
<image v-if="imageUrl" :src="imageUrl" mode="aspectFit"></image>
<span v-else>
<text class="upload-text">点击上传图片</text>
<text class="upload-tip">支持JPG、PNG格式</text>
</span>
</view>
</view>
<!-- 短信验证码 -->
<view class="form-item">
<text class="label">短信验证码</text>
<view class="code-input">
<input class="input-short" type="number" placeholder="请输入验证码" v-model="formData.verifyCode"
maxlength="6" />
<button class="send-btn" :disabled="sending" @click="sendVerifyCode">
{{ sending ? '发送中...' : '发送验证码' }}
</button>
</view>
</view>
<!-- 注册按钮 -->
<button class="register-btn" @click="onSubmit()">注册</button>
<!-- 登录跳转 -->
<view class="login-link">
<text>已有账号?</text>
<text class="link" @click="gotoLogin">立即登录</text>
</view>
</form>
</view>
</view>
</template>
<script setup>
import {
ref
} from "vue"
import {
MemberRegister,
UpFileNoLogin,
GetBaseUrl,SmsSendCode
} from "@/api"
import {
onShow
} from "@dcloudio/uni-app"
let formData = ref({
tel: '',
password: '',
confirmPassword: '',
name: '',
sfz: '',
card_number: '',
bank_name: '',
verifyCode: '',
res_bank_img: ''
})
let sending = ref(false)
let imageUrl = ref('') // 上传图片路径
// 上传图片
const chooseImage = () => {
uni.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
const tempFilePath = res.tempFilePaths[0];
// imageUrl.value = tempFilePath;
// 这里可以上传到服务器
console.log('上传图片:', tempFilePath);
uni.showLoading({
title: ''
})
uni.uploadFile({
url: UpFileNoLogin(), // 替换为你的后端接口地址
filePath: tempFilePath,
name: 'file', // 后端接收字段名,通常叫 file、image、avatar 等
success: (uploadRes) => {
uni.hideLoading()
console.log('上传成功:', uploadRes);
const data = JSON.parse(uploadRes.data); // 注意uploadRes.data 是字符串
// 假设后端返回 { url: "https://xxx.jpg" }
if (data.status === true && data.data) {
imageUrl.value = GetBaseUrl() + data.data; // 使用服务器返回的真实 URL
formData.value.res_bank_img = data.data
}
},
fail: (err) => {
uni.hideLoading()
console.error('上传失败:', err);
uni.showToast({
title: '上传失败',
icon: 'none'
});
}
});
}
});
}
// 发送验证码
const sendVerifyCode = () => {
if (!formData.value.tel) {
uni.showToast({
title: '请输入手机号',
icon: 'none'
});
return;
}
sending.value = true;
// 模拟发送验证码
SmsSendCode({
tel: formData.value.tel
}).then(res => {
sending.value = false;
if (res.status) {
uni.showToast({
title: '验证码已发送',
icon: 'success'
});
}
})
}
// 提交注册
const onSubmit = () => {
// 基本验证
if (!formData.value.tel) {
uni.showToast({
title: '请输入手机号',
icon: 'none'
});
return;
}
if (!formData.value.password) {
uni.showToast({
title: '请输入密码',
icon: 'none'
});
return;
}
if (formData.value.password !== formData.value.confirmPassword) {
uni.showToast({
title: '两次密码不一致',
icon: 'none'
});
return;
}
if (!formData.value.name) {
uni.showToast({
title: '请输入真实姓名',
icon: 'none'
});
return;
}
if (!formData.value.sfz) {
uni.showToast({
title: '请输入身份证号',
icon: 'none'
});
return;
}
if (!formData.value.card_number) {
uni.showToast({
title: '请输入银行卡号',
icon: 'none'
});
return;
}
if (!formData.value.bank_name) {
uni.showToast({
title: '请输入银行名称',
icon: 'none'
});
return;
}
if (!formData.value.verifyCode) {
uni.showToast({
title: '请输入验证码',
icon: 'none'
});
return;
}
// 此处可调用接口提交数据
console.log('注册数据:', formData.value);
MemberRegister({
info: formData.value
}).then(res => {
if (res.status) {
uni.showToast({
title: '注册成功',
icon: 'success'
});
uni.navigateTo({
url: '/pages/login'
});
}
})
}
// 跳转登录页
const gotoLogin = () => {
uni.navigateTo({
url: '/pages/login/login'
});
}
</script>
<style scoped lang="scss">
.register-container {
background: linear-gradient(135deg, #E1EBFB, #f0f9ff);
padding-top: 20rpx;
}
.main {
padding: 40rpx;
background-color: #fff;
border-radius: 20rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
width: 80%;
margin: 0 auto;
}
.title {
text-align: center;
margin-bottom: 40rpx;
.title-main {
font-size: 40rpx;
font-weight: bold;
color: #1a56db;
}
.title-sub {
font-size: 24rpx;
color: #999999;
margin-top: 10rpx;
}
}
.form-item {
margin-bottom: 32rpx;
position: relative;
.label {
display: block;
font-size: 26rpx;
color: #333;
margin-bottom: 12rpx;
}
.input {
width: 100%;
height: 80rpx;
border: 1px solid #ddd;
border-radius: 8rpx;
padding: 0 20rpx;
font-size: 28rpx;
line-height: 80rpx;
box-sizing: border-box;
}
.input-short {
width: 360rpx;
height: 80rpx;
border: 1px solid #ddd;
border-radius: 8rpx;
padding: 0 20rpx;
font-size: 28rpx;
line-height: 60rpx;
box-sizing: border-box;
}
.code-input {
display: flex;
align-items: center;
gap: 20rpx;
}
.send-btn {
width: 200rpx;
height: 60rpx;
background-color: #0047e5;
color: white;
border-radius: 8rpx;
font-size: 26rpx;
line-height: 60rpx;
border: none;
margin-left: 20rpx;
background-color: #0047e5;
color: white;
font-size: 26rpx;
border: none;
border-radius: 8rpx;
transition: background-color 0.3s;
}
.send-btn:disabled {
background-color: #ccc;
cursor: not-allowed;
}
.upload-box {
width: 100%;
height: 160rpx;
border: 2rpx dashed #ddd;
border-radius: 8rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #999;
font-size: 26rpx;
background-color: #f9f9f9;
}
.upload-icon1 {
width: 40rpx;
height: 40rpx;
margin-bottom: 10rpx;
}
.upload-text {
font-size: 28rpx;
margin-bottom: 6rpx;
}
.upload-tip {
font-size: 22rpx;
}
}
.register-btn {
width: 100%;
height: 80rpx;
background-color: #0047e5;
color: white;
border-radius: 8rpx;
font-size: 30rpx;
line-height: 80rpx;
margin: 30rpx 0;
font-weight: bold;
}
.login-link {
text-align: center;
font-size: 24rpx;
color: #666;
margin-top: 20rpx;
}
.login-link .link {
color: #0047e5;
font-weight: bold;
margin-left: 10rpx;
}
</style>