HomeLease/pages/agents/agents.vue

840 lines
19 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="agents-page">
<!-- 头部区域 -->
<custom-nav-bar
:fill="false"
:show-back="true"
background-color="transparent"
title=""
></custom-nav-bar>
<view class="header">
<image :src="commonEnum.AGENT" class="agent-background" mode="widthFix"></image>
</view>
<!-- 主要内容区域 -->
<view class="main-content">
<!-- 表单区域 -->
<view class="form-section">
<!-- 姓名输入 -->
<view class="form-item">
<view class="form-label">请填写您的姓名</view>
<input
v-model="formData.name"
class="form-input"
maxlength="20"
placeholder="请输入您的姓名"
/>
</view>
<!-- 联系方式输入 -->
<view class="form-item">
<view class="form-label">请填写您的联系方式</view>
<input
v-model="formData.phone"
class="form-input"
maxlength="11"
placeholder="请输入您的联系方式"
type="number"
/>
</view>
<!-- 身份证号码输入 -->
<view class="form-item">
<view class="form-label">请输入您的身份证号码</view>
<input
v-model="formData.idCard"
class="form-input"
maxlength="18"
placeholder="请输入您的身份证号码"
/>
</view>
<!-- 服务区域选择 - 三级选择 -->
<view class="form-item">
<view class="form-label">请选择您的服务区域</view>
<view class="region-selector" @click="open">
<view class="selector-display">
<text class="selector-text">
{{ formData.serviceArea || '请选择服务区域' }}
</text>
<text class="selector-arrow">></text>
</view>
</view>
<uv-picker
ref="picker"
:columns="addressList"
:loading="loading"
keyName="name"
@change="change"
@confirm="confirm"
>
</uv-picker>
</view>
<!-- 详细地址输入 -->
<view class="form-item">
<view class="form-label">请输入您的详细地址</view>
<input
v-model="formData.detailAddress"
class="form-input"
maxlength="100"
placeholder="请输入您的详细地址"
/>
</view>
<!-- 协议同意 -->
<view class="agreement-section">
<view class="agreement-item">
<view :class="{ checked: formData.agreed }" class="checkbox">
<text v-if="formData.agreed" class="checkmark">✓</text>
</view>
<text class="agreement-text">
<text v-if="formData.agreed">我已签署</text>
<text v-else>去签署</text>
<text class="agreement-link" @click="goToProtocol">《代理商协议》</text>
</text>
</view>
</view>
<!-- 提交按钮 -->
<view class="submit-section">
<button :disabled="submitting" class="submit-btn" @click="submitApplication">
{{ submitting ? '提交中...' : '申请成为代理商' }}
</button>
</view>
</view>
</view>
<!-- &lt;!&ndash; 代理商协议模态框 &ndash;&gt;-->
<!-- <view v-if="showAgreementModal" class="agreement-modal-overlay" @click="hideAgreement">-->
<!-- <view class="agreement-modal" @click.stop>-->
<!-- <view class="agreement-modal-header">-->
<!-- <text class="agreement-modal-title">代理商协议</text>-->
<!-- <text class="agreement-modal-close" @click="hideAgreement">×</text>-->
<!-- </view>-->
<!-- <scroll-view class="agreement-modal-content" scroll-y>-->
<!-- <rich-text :nodes="agreementContent"></rich-text>-->
<!-- </scroll-view>-->
<!-- <view class="agreement-modal-footer">-->
<!-- <view class="agreement-modal-checkbox" @click="toggleAgreement">-->
<!-- <view :class="{ checked: formData.agreed }" class="modal-checkbox">-->
<!-- <text v-if="formData.agreed" class="checkmark">✓</text>-->
<!-- </view>-->
<!-- <text class="modal-checkbox-text">我已阅读并同意代理商协议</text>-->
<!-- </view>-->
<!-- <button-->
<!-- :class="{ disabled: !formData.agreed }"-->
<!-- class="agreement-modal-btn"-->
<!-- @click="hideAgreement"-->
<!-- >-->
<!-- {{ formData.agreed ? '确定' : '请先同意协议' }}-->
<!-- </button>-->
<!-- </view>-->
<!-- </view>-->
<!-- </view>-->
</view>
</template>
<script>
import commonEnum from '../../enum/commonEnum'
import { applyForAgent, getAgentAgreement, getServiceAreas } from '@/api/agents'
import { isSignProtocolPartner } from '../../api/protocol/protocol'
export default {
name: 'AgentsPage',
computed: {
addressList() {
return [this.provinces, this.citys, this.areas]
},
commonEnum() {
return commonEnum
},
canSubmit() {
return (
this.formData.name &&
this.formData.phone &&
this.formData.idCard &&
this.selectedRegionId &&
this.formData.detailAddress &&
this.formData.agreed &&
!this.submitting
)
},
},
onShow() {
this.getIsSignProtocol()
},
onLoad() {
// 页面加载时获取服务区域列表和协议内容
this.getIsSignProtocol()
this.loadServiceAreas()
this.loadAgreement()
},
data() {
return {
formData: {
name: '',
phone: '',
idCard: '',
serviceArea: '',
detailAddress: '',
agreed: false,
},
submitting: false,
agreementContent: '',
showAgreementModal: false,
loading: true,
provinces: [], //省
citys: [], //市
areas: [], //区
pickerValue: [0, 0, 0],
defaultValue: [3442, 1, 2],
selectedRegionId: null, // 选中的区域ID
}
},
methods: {
async getIsSignProtocol() {
let res = await isSignProtocolPartner()
console.log('res', res)
console.log('res.data', res.data)
this.formData.agreed = res.data
console.log('this.hasAgreed', this.formData.agreed)
},
goToProtocol() {
if (!this.formData.agreed) {
uni.navigateTo({
url: '/pages/partnerProtocol/partnerProtocol',
})
}
},
// 加载服务区域列表
async loadServiceAreas() {
try {
const response = await getServiceAreas()
if (response.code === 200 && response.data) {
// 处理服务器返回的区域数据提取所有区域名称和ID映射
this.provinces = response.data.sort((left, right) =>
Number(left.code) > Number(right.code) ? 1 : -1
)
console.log(this.provinces)
this.loading = false
this.handlePickValueDefault()
}
} catch (error) {
console.error('获取服务区域失败:', error)
this.loading = false
}
},
handlePickValueDefault() {
// 设置省
this.pickerValue[0] = this.provinces.findIndex(
item => Number(item.id) === this.defaultValue[0]
)
// 设置市
this.citys = this.provinces[this.pickerValue[0]]?.children || []
this.pickerValue[1] = this.citys.findIndex(item => Number(item.id) === this.defaultValue[1])
// 设置区
this.areas = this.citys[this.pickerValue[1]]?.children || []
this.pickerValue[2] = this.areas.findIndex(item => Number(item.id) === this.defaultValue[2])
// 重置下位置
this.$refs.picker.setIndexs(
[this.pickerValue[0], this.pickerValue[1], this.pickerValue[2]],
true
)
},
change(e) {
if (this.loading) return
const { columnIndex, index, indexs } = e
// 改变了省
if (columnIndex === 0) {
this.citys = this.provinces[index]?.children || []
this.areas = this.citys[0]?.children || []
this.$refs.picker.setIndexs([index, 0, 0], true)
} else if (columnIndex === 1) {
this.areas = this.citys[index]?.children || []
this.$refs.picker.setIndexs(indexs, true)
}
},
open() {
this.$refs.picker.open()
this.handlePickValueDefault()
},
confirm(e) {
console.log('确认选择的地区:', e)
// 保存选中的区域ID
this.selectedRegionId = e.value[2]?.id || e.value[1]?.id || e.value[0]?.id
// 更新服务区域显示
this.formData.serviceArea = `${e.value[0].name}/${e.value[1].name}/${e.value[2].name}`
uni.showToast({
icon: 'none',
title: `${e.value[0].name}/${e.value[1].name}/${e.value[2].name}`,
})
},
// 加载代理商协议
async loadAgreement() {
try {
const response = await getAgentAgreement()
if (response.code === 200 && response.data) {
this.agreementContent = response.data.content || '这里是代理商协议的详细内容...'
}
} catch (error) {
console.error('获取代理商协议失败:', error)
this.agreementContent = '这里是代理商协议的详细内容...'
}
},
// 切换协议同意状态
toggleAgreement() {
this.formData.agreed = !this.formData.agreed
},
// 显示代理商协议
showAgreement() {
this.showAgreementModal = true
},
// 隐藏代理商协议
hideAgreement() {
this.showAgreementModal = false
},
// 验证表单数据
validateForm() {
if (!this.formData.name.trim()) {
uni.showToast({
title: '请输入姓名',
icon: 'none',
})
return false
}
if (!this.formData.phone.trim()) {
uni.showToast({
title: '请输入手机号',
icon: 'none',
})
return false
}
// 验证手机号格式
const phoneRegex = /^1[3-9]\d{9}$/
if (!phoneRegex.test(this.formData.phone)) {
uni.showToast({
title: '请输入正确的手机号',
icon: 'none',
})
return false
}
if (!this.formData.idCard.trim()) {
uni.showToast({
title: '请输入身份证号',
icon: 'none',
})
return false
}
// 验证身份证号格式
const idCardRegex = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
if (!idCardRegex.test(this.formData.idCard)) {
uni.showToast({
title: '请输入正确的身份证号',
icon: 'none',
})
return false
}
if (!this.selectedRegionId) {
uni.showToast({
title: '请选择服务区域',
icon: 'none',
})
return false
}
if (!this.formData.detailAddress.trim()) {
uni.showToast({
title: '请输入详细地址',
icon: 'none',
})
return false
}
if (!this.formData.agreed) {
uni.showToast({
title: '请签署代理商协议',
icon: 'none',
})
return false
}
return true
},
// 提交申请
async submitApplication() {
// 检查是否同意协议,如果未同意则自动弹窗
if (!this.formData.agreed) {
this.showAgreement()
uni.showToast({
title: '请签署代理商协议',
icon: 'none',
})
return
}
if (!this.validateForm()) {
return
}
this.submitting = true
try {
const requestData = {
name: this.formData.name.trim(),
phone: this.formData.phone.trim(),
idCard: this.formData.idCard.trim(),
regionId: this.selectedRegionId,
address: this.formData.detailAddress.trim(),
}
console.log('提交代理商申请:', requestData)
const response = await applyForAgent(requestData)
if (response.code === 200) {
uni.showModal({
title: '申请成功',
content: '您的代理商申请已提交我们将在3个工作日内审核并联系您。',
showCancel: false,
confirmText: '确定',
success: () => {
// 重置表单
this.resetForm()
},
})
} else {
uni.showToast({
title: response.msg || '申请失败,请重试',
icon: 'none',
})
}
} finally {
this.submitting = false
}
},
// 重置表单
resetForm() {
this.formData = {
name: '',
phone: '',
idCard: '',
serviceArea: '',
detailAddress: '',
agreed: false,
}
this.selectedRegionId = null
},
},
}
</script>
<style lang="scss" scoped>
.agents-page {
position: relative;
background: #f3f5f6;
}
// 头部区域
.header {
position: relative;
.agent-background {
position: relative;
width: 750rpx;
}
}
// 主要内容区域
.main-content {
position: relative;
top: -34rpx;
background: #ffffff;
border-radius: 40rpx 40rpx 0 0;
margin: 0 30rpx;
padding: 40rpx;
}
// 表单区域
.form-section {
.form-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
text-align: center;
margin-bottom: 60rpx;
}
.form-item {
margin-bottom: 40rpx;
.form-label {
font-size: 28rpx;
color: #333;
margin-bottom: 20rpx;
font-weight: 500;
}
.form-input {
width: 100%;
height: 80rpx;
background: #ffffff;
border: 2rpx solid #e8e8e8;
border-radius: 12rpx;
padding: 0 24rpx;
font-size: 28rpx;
color: #333;
box-sizing: border-box;
&:focus {
border-color: #ff6b6b;
}
&::placeholder {
color: #999;
}
}
.form-selector {
width: 100%;
height: 80rpx;
background: #ffffff;
border: 2rpx solid #e8e8e8;
border-radius: 12rpx;
padding: 0 24rpx;
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
.selector-text {
font-size: 28rpx;
color: #333;
flex: 1;
}
.arrow-icon {
font-size: 24rpx;
color: #999;
transform: rotate(90deg);
}
}
}
}
// 协议区域
.agreement-section {
margin-bottom: 60rpx;
.agreement-item {
display: flex;
align-items: center;
.checkbox {
width: 32rpx;
height: 32rpx;
border: 2rpx solid #ff6b6b;
border-radius: 6rpx;
margin-right: 20rpx;
display: flex;
align-items: center;
justify-content: center;
background: #ffffff;
&.checked {
background: #f15a04;
}
.checkmark {
color: #ffffff;
font-size: 20rpx;
font-weight: bold;
}
}
.agreement-text {
font-size: 26rpx;
color: #666;
flex: 1;
.agreement-link {
color: #f15a04;
text-decoration: underline;
}
}
}
}
// 提交区域
.submit-section {
.submit-btn {
width: 100%;
height: 88rpx;
background: #f15a04;
color: #ffffff;
border: none;
border-radius: 12rpx;
font-size: 32rpx;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
&:disabled {
background: #cccccc;
color: #999999;
}
&:active {
transform: scale(0.98);
}
}
}
// 代理商协议模态框样式
.agreement-modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
}
.agreement-modal {
width: 90%;
max-width: 600rpx;
max-height: 80%;
background: #ffffff;
border-radius: 20rpx;
overflow: hidden;
display: flex;
flex-direction: column;
}
.agreement-modal-header {
padding: 30rpx;
border-bottom: 1rpx solid #e8e8e8;
display: flex;
align-items: center;
justify-content: space-between;
background: #f8f8f8;
.agreement-modal-title {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.agreement-modal-close {
font-size: 40rpx;
color: #999;
cursor: pointer;
padding: 10rpx;
}
}
.agreement-modal-content {
flex: 1;
padding: 50rpx;
max-width: 500rpx;
max-height: 600rpx;
overflow-y: auto;
}
.agreement-modal-footer {
padding: 30rpx;
border-top: 1rpx solid #e8e8e8;
background: #f8f8f8;
.agreement-modal-checkbox {
display: flex;
align-items: center;
margin-bottom: 20rpx;
.modal-checkbox {
width: 32rpx;
height: 32rpx;
border: 2rpx solid #ff6b6b;
border-radius: 6rpx;
margin-right: 10rpx;
display: flex;
align-items: center;
justify-content: center;
background: #ffffff;
&.checked {
background: #f15a04;
}
.checkmark {
color: #ffffff;
font-size: 20rpx;
font-weight: bold;
}
}
.modal-checkbox-text {
font-size: 26rpx;
color: #666;
}
}
.agreement-modal-btn {
width: 100%;
height: 80rpx;
background: #f15a04;
color: #ffffff;
border: none;
border-radius: 12rpx;
font-size: 28rpx;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
&:active {
transform: scale(0.98);
}
&.disabled {
background: #cccccc;
color: #999999;
cursor: not-allowed;
&:active {
transform: none;
}
}
}
}
.debug-info {
background: #f0f0f0;
padding: 10rpx;
margin-bottom: 10rpx;
border-radius: 8rpx;
font-size: 24rpx;
color: #666;
text {
display: block;
margin-bottom: 5rpx;
}
}
// 三级选择器样式
.region-picker-item {
margin-bottom: 20rpx;
.picker-label {
font-size: 26rpx;
color: #666;
margin-bottom: 10rpx;
font-weight: 500;
}
.picker-display {
height: 80rpx;
background: #ffffff;
border: 2rpx solid #e8e8e8;
border-radius: 12rpx;
padding: 0 24rpx;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
cursor: pointer;
&:active {
background: #f5f5f5;
}
.picker-text {
font-size: 28rpx;
color: #333;
flex: 1;
}
.picker-arrow {
font-size: 24rpx;
color: #999;
}
}
}
.selected-address {
margin-top: 20rpx;
padding: 20rpx;
background: #f8f9fa;
border-radius: 12rpx;
border: 2rpx solid #e9ecef;
.address-text {
font-size: 28rpx;
color: #495057;
font-weight: 500;
}
}
// 服务区域选择器样式
.region-selector {
.selector-display {
width: 100%;
height: 80rpx;
background: #ffffff;
border: 2rpx solid #e8e8e8;
border-radius: 12rpx;
padding: 0 24rpx;
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
cursor: pointer;
&:active {
background: #f5f5f5;
}
.selector-text {
font-size: 28rpx;
color: #333;
flex: 1;
&:empty::before {
content: '请选择服务区域';
color: #999;
}
}
.selector-arrow {
font-size: 24rpx;
color: #999;
transform: rotate(90deg);
}
}
}
</style>