国外MOSE官网
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.
 
 
 
 

354 lines
8.0 KiB

<template>
<view>
<uv-popup
ref="popup"
mode="bottom"
border-radius="20"
@close="handleClose"
>
<view class="signup-form">
<!-- 表单标题 -->
<view class="form-header">
<text class="form-title">我要报名</text>
</view>
<!-- 表单内容 -->
<view class="form-content">
<!-- 姓名 -->
<view class="form-item">
<view class="input-container">
<text class="input-label required">姓名</text>
<uv-input
v-model="formData.name"
placeholder="请输入您的姓名"
border="none"
:custom-style="inputStyle"
></uv-input>
</view>
</view>
<!-- 性别 -->
<view class="form-item">
<view class="input-container" @click="showGenderPicker">
<text class="input-label required">性别</text>
<view class="picker-input">
<text class="picker-text" :class="{ placeholder: !formData.gender }">{{ formData.gender || '请选择' }}</text>
<uv-icon name="arrow-right" size="14" color="#999"></uv-icon>
</view>
</view>
</view>
<!-- 年龄 -->
<view class="form-item">
<view class="input-container">
<text class="input-label required">年龄</text>
<uv-input
v-model="formData.age"
placeholder="请输入您的年龄"
type="number"
border="none"
:custom-style="inputStyle"
></uv-input>
</view>
</view>
<!-- 手机号 -->
<view class="form-item">
<view class="input-container">
<text class="input-label required">手机号</text>
<uv-input
v-model="formData.phone"
placeholder="请输入您的手机号"
type="number"
border="none"
:custom-style="inputStyle"
></uv-input>
</view>
</view>
<!-- 所在地区 -->
<view class="form-item">
<view class="input-container" @click="chooseLocation">
<text class="input-label">所在地区</text>
<view class="picker-input">
<text class="picker-text" :class="{ placeholder: !formData.area }">{{ formData.area || '请选择地址' }}</text>
<uv-icon name="arrow-right" size="14" color="#999"></uv-icon>
</view>
</view>
</view>
<!-- 详细地址 -->
<view class="form-item">
<view class="input-container">
<text class="input-label">详细地址</text>
<uv-input
v-model="formData.address"
placeholder="请输入详细地址"
border="none"
:custom-style="inputStyle"
></uv-input>
</view>
</view>
</view>
<!-- 提交按钮 -->
<view class="form-footer">
<uv-button
type="primary"
text="提交报名"
:custom-style="buttonStyle"
@click="submitForm"
></uv-button>
</view>
</view>
</uv-popup>
<!-- 性别选择器 -->
<uv-picker
ref="genderPicker"
:columns="genderOptions"
@confirm="onGenderConfirm"
@cancel="onGenderCancel"
@close="onGenderCancel"
></uv-picker>
</view>
</template>
<script>
export default {
name: 'SignUpForm',
data() {
return {
show: false,
formData: {
name: '',
gender: '',
age: '',
phone: '',
area: '',
address: ''
},
genderOptions: [['男', '女']],
inputStyle: {
backgroundColor: 'transparent',
fontSize: '28rpx'
},
buttonStyle: {
width: '100%',
height: '88rpx',
borderRadius: '44rpx'
}
}
},
methods: {
handleClose() {
this.$emit('close')
this.$refs.popup.close()
},
showGenderPicker() {
this.$refs.genderPicker.open()
},
chooseLocation() {
uni.chooseLocation({
success: (res) => {
console.log('位置名称:' + res.name)
console.log('详细地址:' + res.address)
console.log('纬度:' + res.latitude)
console.log('经度:' + res.longitude)
// 设置选中的地址
this.formData.area = res.address || res.name
// 如果详细地址为空,也可以自动填充
if (!this.formData.address && res.name) {
this.formData.address = res.name
}
},
fail: (err) => {
console.log('选择位置失败:', err)
uni.showToast({
title: '获取位置失败',
icon: 'none'
})
}
})
},
onGenderConfirm(value) {
this.formData.gender = value.value[0]
},
onGenderCancel() {
// 性别选择器取消时的处理
},
validateForm() {
if (!this.formData.name.trim()) {
uni.showToast({
title: '请输入姓名',
icon: 'none'
})
return false
}
if (!this.formData.gender) {
uni.showToast({
title: '请选择性别',
icon: 'none'
})
return false
}
if (!this.formData.age.trim()) {
uni.showToast({
title: '请输入年龄',
icon: 'none'
})
return false
}
if (!this.formData.phone.trim()) {
uni.showToast({
title: '请输入手机号',
icon: 'none'
})
return false
}
if (!/^1[3-9]\d{9}$/.test(this.formData.phone)) {
uni.showToast({
title: '请输入正确的手机号',
icon: 'none'
})
return false
}
return true
},
submitForm() {
if (!this.validateForm()) {
return
}
this.formData.gender = this.formData.gender === '男' ? 0 : 1
// 提交表单数据
this.$emit('submit', this.formData)
// 重置表单
this.resetForm()
// 关闭弹窗
this.handleClose()
},
resetForm() {
this.formData = {
name: '',
gender: '',
age: '',
phone: '',
area: '',
address: ''
}
},
open() {
this.$refs.popup.open()
},
close() {
this.$refs.popup.close()
}
},
expose: ['open', 'close']
}
</script>
<style lang="scss" scoped>
.signup-form {
max-height: 1000rpx;
display: flex;
flex-direction: column;
background: #ffffff;
.form-header {
padding: 40rpx 30rpx 20rpx;
text-align: center;
border-bottom: 1rpx solid #f0f0f0;
.form-title {
font-size: 36rpx;
font-weight: bold;
color: #333333;
}
}
.form-content {
flex: 1;
padding: 30rpx;
overflow-y: auto;
.form-item {
margin-bottom: 30rpx;
&:last-child {
margin-bottom: 0;
}
.input-container {
background: #f3f7f8;
border-radius: 16rpx;
padding: 24rpx 30rpx;
display: flex;
align-items: center;
.input-label {
font-size: 28rpx;
color: #333333;
margin-right: 20rpx;
min-width: 120rpx;
&.required::before {
content: '*';
color: #ff4757;
margin-right: 4rpx;
}
}
.picker-input {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
.picker-text {
font-size: 28rpx;
color: #333333;
&.placeholder {
color: #999999;
}
}
}
}
}
}
.form-footer {
padding: 30rpx;
border-top: 1rpx solid #f0f0f0;
}
}
</style>