413 lines
8.7 KiB
Vue
413 lines
8.7 KiB
Vue
<template>
|
||
<view class="container">
|
||
<view class="header">
|
||
<view class="title">跑腿注册</view>
|
||
</view>
|
||
<view class="form">
|
||
<view class="input-group" v-for="(field, index) in fields" :key="index">
|
||
<view class="label">{{ field.label }}</view>
|
||
<view class="input">
|
||
<!-- 修改后的性别字段处理 -->
|
||
<template v-if="field.model === 'gender'">
|
||
<radio-group :value="formData.gender" @change="handleGenderChange" class="radio-group">
|
||
<label class="radio-label">
|
||
<view class="radio-wrapper">
|
||
<radio value="男" color="#5e7dec" />
|
||
</view>
|
||
男
|
||
</label>
|
||
<label class="radio-label">
|
||
<view class="radio-wrapper">
|
||
<radio value="女" color="#5e7dec" />
|
||
</view>
|
||
女
|
||
</label>
|
||
|
||
</radio-group>
|
||
</template>
|
||
|
||
<!-- 配送范围字段 -->
|
||
<template v-else-if="field.model === 'distributionScope'">
|
||
<uni-data-select v-model="formData.distributionScope" :localdata="range" :clear="false"
|
||
class="distribution-select"></uni-data-select>
|
||
</template>
|
||
|
||
|
||
<!-- 其他字段保持原样 -->
|
||
<input v-else v-model="formData[field.model]" :placeholder="field.placeholder"
|
||
class="styled-input" />
|
||
</view>
|
||
</view>
|
||
<view class="button">
|
||
<button @click="saveAddress" class="styled-button">点击注册</button>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import {
|
||
apiImageUrl
|
||
} from '../../API/api';
|
||
export default {
|
||
data() {
|
||
return {
|
||
formData: {
|
||
checkPassword: '',
|
||
distributionScope: '',
|
||
errandName: '',
|
||
errandPhone: '',
|
||
gender: '',
|
||
userAccount: '',
|
||
userPassword: ''
|
||
},
|
||
range: [{
|
||
value: '1公寓',
|
||
text: '1公寓'
|
||
},
|
||
{
|
||
value: '2公寓',
|
||
text: '2公寓'
|
||
},
|
||
{
|
||
value: '3公寓',
|
||
text: '3公寓'
|
||
},
|
||
{
|
||
value: '4公寓',
|
||
text: '4公寓'
|
||
},
|
||
{
|
||
value: '5公寓',
|
||
text: '5公寓'
|
||
},
|
||
{
|
||
value: '6公寓',
|
||
text: '6公寓'
|
||
},
|
||
{
|
||
value: '7公寓',
|
||
text: '7公寓'
|
||
},
|
||
{
|
||
value: '8公寓',
|
||
text: '8公寓'
|
||
},
|
||
{
|
||
value: '9公寓',
|
||
text: '9公寓'
|
||
},
|
||
{
|
||
value: '10公寓',
|
||
text: '10公寓'
|
||
},
|
||
{
|
||
value: '11公寓',
|
||
text: '11公寓'
|
||
},
|
||
{
|
||
value: '12公寓',
|
||
text: '12公寓'
|
||
},
|
||
{
|
||
value: '育才大厦',
|
||
text: '育才大厦'
|
||
}
|
||
],
|
||
|
||
fields: [{
|
||
label: '账户',
|
||
model: 'userAccount',
|
||
placeholder: '请输入账户'
|
||
},
|
||
{
|
||
label: '密码',
|
||
model: 'userPassword',
|
||
placeholder: '请输入密码'
|
||
},
|
||
{
|
||
label: '确认密码',
|
||
model: 'checkPassword',
|
||
placeholder: '请再次输入密码'
|
||
},
|
||
{
|
||
label: '用户名称',
|
||
model: 'errandName',
|
||
placeholder: '请输入用户名称'
|
||
},
|
||
{
|
||
label: '手机号',
|
||
model: 'errandPhone',
|
||
placeholder: '请输入手机号'
|
||
},
|
||
{
|
||
label: '性别',
|
||
model: 'gender',
|
||
placeholder: '请选择性别'
|
||
},
|
||
{
|
||
label: '配送范围',
|
||
model: 'distributionScope',
|
||
placeholder: '请选择配送范围'
|
||
}
|
||
]
|
||
};
|
||
},
|
||
methods: {
|
||
handleGenderChange(e) {
|
||
// 将性别转换为数字
|
||
this.formData.gender = e.detail.value === '男' ? 0 : 1;
|
||
},
|
||
|
||
|
||
saveAddress() {
|
||
// 验证表单数据
|
||
if (!this.validateForm()) {
|
||
return; // validateForm内部已处理提示
|
||
}
|
||
|
||
const url = apiImageUrl + '/api/errand/add';
|
||
const data = {
|
||
checkPassword: this.formData.checkPassword,
|
||
distributionScope: this.formData.distributionScope,
|
||
errandName: this.formData.errandName,
|
||
errandPhone: this.formData.errandPhone,
|
||
gender: this.formData.gender,
|
||
userAccount: this.formData.userAccount,
|
||
userPassword: this.formData.userPassword
|
||
};
|
||
|
||
uni.request({
|
||
url,
|
||
method: 'POST',
|
||
data,
|
||
header: {
|
||
'Content-Type': 'application/json'
|
||
},
|
||
success(res) {
|
||
console.log(res.data);
|
||
if (res.data.code === 0) {
|
||
uni.showToast({
|
||
title: '注册成功!',
|
||
duration: 2000,
|
||
icon: "success"
|
||
})
|
||
uni.reLaunch({
|
||
url:'/pages/login/login'
|
||
})
|
||
} else if (res.data.code === 40000) {
|
||
uni.showToast({
|
||
title: res.data.description,
|
||
duration: 2000,
|
||
icon: "fail"
|
||
})
|
||
}
|
||
},
|
||
fail(err) {
|
||
console.error(err);
|
||
uni.showModal({
|
||
title: '注册失败', //提示标题
|
||
content: '请重新输入', //提示内容
|
||
//showCancel: true, //是否显示取消按钮
|
||
// success: function (res) {
|
||
// if (res.confirm) { //confirm为ture,代表用户点击确定
|
||
// console.log('点击了确定按钮');
|
||
// } else if (res.cancel) { //cancel为ture,代表用户点击取消
|
||
// console.log('点击了取消按钮');
|
||
// }
|
||
// }
|
||
})
|
||
}
|
||
});
|
||
},
|
||
validateForm() {
|
||
// 逐个字段校验并给出具体提示
|
||
if (!this.formData.userAccount) {
|
||
uni.showToast({
|
||
title: '请输入账户',
|
||
icon: 'none'
|
||
});
|
||
return false;
|
||
}
|
||
if (!this.formData.userPassword) {
|
||
uni.showToast({
|
||
title: '请输入密码',
|
||
icon: 'none'
|
||
});
|
||
return false;
|
||
}
|
||
if (this.formData.userPassword.length < 8) {
|
||
uni.showToast({
|
||
title: '密码过短,至少8位',
|
||
icon: 'none'
|
||
});
|
||
return false;
|
||
}
|
||
if (!this.formData.checkPassword) {
|
||
uni.showToast({
|
||
title: '请输入确认密码',
|
||
icon: 'none'
|
||
});
|
||
return false;
|
||
}
|
||
if (this.formData.userPassword !== this.formData.checkPassword) {
|
||
uni.showToast({
|
||
title: '两次密码不一致',
|
||
icon: 'none'
|
||
});
|
||
return false;
|
||
}
|
||
if (!this.formData.errandName) {
|
||
uni.showToast({
|
||
title: '请输入用户名称',
|
||
icon: 'none'
|
||
});
|
||
return false;
|
||
}
|
||
if (!this.formData.errandPhone) {
|
||
uni.showToast({
|
||
title: '请输入手机号',
|
||
icon: 'none'
|
||
});
|
||
return false;
|
||
}
|
||
if (!this.formData.gender) {
|
||
uni.showToast({
|
||
title: '请选择性别',
|
||
icon: 'none'
|
||
});
|
||
return false;
|
||
}
|
||
if (!this.formData.distributionScope) {
|
||
uni.showToast({
|
||
title: '请选择配送范围',
|
||
icon: 'none'
|
||
});
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.container {
|
||
padding: 20px;
|
||
background-color: #fff;
|
||
border-radius: 8px;
|
||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.header {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
margin-bottom: 20px;
|
||
|
||
.title {
|
||
font-size: 24px;
|
||
font-weight: bold;
|
||
}
|
||
}
|
||
|
||
.form {
|
||
.input-group {
|
||
display: flex;
|
||
align-items: center;
|
||
margin-bottom: 20px;
|
||
|
||
.label {
|
||
flex: 1;
|
||
font-size: 14px;
|
||
margin-right: 20px;
|
||
}
|
||
|
||
.input {
|
||
flex: 3;
|
||
|
||
.styled-input {
|
||
font-size: 14px;
|
||
width: 100%;
|
||
padding: 10px;
|
||
background-color: rgba(255, 235, 59, 0.6);
|
||
/* 淡黄色并带有透明度 */
|
||
border: none;
|
||
border-radius: 20px;
|
||
/* 圆角 */
|
||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.08);
|
||
/* 添加阴影以创建立体效果 */
|
||
outline: none;
|
||
transition: all 0.2s ease-in-out;
|
||
|
||
&:focus {
|
||
background-color: rgba(255, 235, 59, 0.8);
|
||
/* 增加透明度 */
|
||
box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15), 0 2px 4px rgba(0, 0, 0, 0.1);
|
||
/* 更强的阴影 */
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.button {
|
||
margin-top: 20px;
|
||
|
||
.styled-button {
|
||
width: 100%;
|
||
padding: 10px;
|
||
background-color: #5e7dec;
|
||
color: #fff;
|
||
border: none;
|
||
border-radius: 15px;
|
||
cursor: pointer;
|
||
font-size: 16px;
|
||
line-height: inherit;
|
||
transition: background-color 0.2s;
|
||
|
||
&:hover {
|
||
background-color: #5e7dec;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/* 新增radio样式 */
|
||
.radio-group {
|
||
display: flex;
|
||
align-items: center;
|
||
height: 100%;
|
||
|
||
.radio-label {
|
||
display: flex;
|
||
align-items: center;
|
||
margin-right: 30px;
|
||
font-size: 14px;
|
||
|
||
/* 移除直接对radio的样式操作 */
|
||
/* 改为通过包裹元素实现间距 */
|
||
.radio-wrapper {
|
||
display: inline-block;
|
||
margin-right: 5px;
|
||
transform: scale(0.9);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/* 新增下拉选择样式 */
|
||
.distribution-select {
|
||
width: 100%;
|
||
.uni-select {
|
||
padding: 10px;
|
||
background-color: rgba(255, 235, 59, 0.6);
|
||
border-radius: 20px;
|
||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.08);
|
||
|
||
&::after {
|
||
border-color: #5e7dec; /* 下拉箭头颜色 */
|
||
}
|
||
}
|
||
}
|
||
|
||
</style> |