Files
xiaokuaisong-paotui/distribution/pages/register/register.vue
2025-08-18 09:57:10 +08:00

413 lines
8.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>