peixue-dev/peidu/uniapp/training-package/pages/franchise/apply.vue

405 lines
9.8 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="apply-page">
<view class="form-container">
<view class="form-header">
<text class="header-title">加盟申请</text>
<text class="header-subtitle">请填写以下信息我们将尽快与您联系</text>
</view>
<view class="form-content">
<!-- 基本信息 -->
<view class="form-section">
<view class="section-title">基本信息</view>
<view class="form-item required">
<text class="label">姓名</text>
<input
class="input"
v-model="formData.name"
placeholder="请输入您的姓名"
maxlength="20"
/>
</view>
<view class="form-item required">
<text class="label">联系电话</text>
<input
class="input"
v-model="formData.phone"
type="number"
placeholder="请输入您的手机号"
maxlength="11"
/>
</view>
<view class="form-item">
<text class="label">电子邮箱</text>
<input
class="input"
v-model="formData.email"
placeholder="请输入您的邮箱(选填)"
/>
</view>
</view>
<!-- 地区信息 -->
<view class="form-section">
<view class="section-title">意向地区</view>
<view class="form-item required">
<text class="label">省份</text>
<picker mode="selector" :range="provinces" @change="onProvinceChange">
<view class="picker">
<text>{{ formData.province || '请选择省份' }}</text>
<text class="arrow">></text>
</view>
</picker>
</view>
<view class="form-item required">
<text class="label">城市</text>
<picker mode="selector" :range="cities" @change="onCityChange">
<view class="picker">
<text>{{ formData.city || '请选择城市' }}</text>
<text class="arrow">></text>
</view>
</picker>
</view>
<view class="form-item">
<text class="label">区县</text>
<input
class="input"
v-model="formData.district"
placeholder="请输入区县(选填)"
/>
</view>
<view class="form-item">
<text class="label">详细地址</text>
<textarea
class="textarea"
v-model="formData.address"
placeholder="请输入详细地址(选填)"
maxlength="200"
/>
</view>
</view>
<!-- 投资信息 -->
<view class="form-section">
<view class="section-title">投资信息</view>
<view class="form-item">
<text class="label">预计投资金额</text>
<picker mode="selector" :range="investmentRanges" @change="onInvestmentChange">
<view class="picker">
<text>{{ formData.investmentAmount || '请选择投资金额' }}</text>
<text class="arrow">></text>
</view>
</picker>
</view>
<view class="form-item">
<text class="label">经营经验</text>
<textarea
class="textarea"
v-model="formData.businessExperience"
placeholder="请简要描述您的经营经验(选填)"
maxlength="500"
/>
</view>
<view class="form-item">
<text class="label">加盟意向说明</text>
<textarea
class="textarea"
v-model="formData.intentionDescription"
placeholder="请描述您的加盟意向和想法(选填)"
maxlength="500"
/>
</view>
</view>
<!-- 协议 -->
<view class="agreement-section">
<checkbox-group @change="onAgreementChange">
<label class="agreement-label">
<checkbox value="agree" :checked="agreed" />
<text class="agreement-text">
我已阅读并同意
<text class="link" @click.stop="viewAgreement">《加盟协议》</text>
</text>
</label>
</checkbox-group>
</view>
<!-- 提交按钮 -->
<button class="submit-btn" @click="submitForm" :disabled="submitting">
{{ submitting ? '提交中...' : '提交申请' }}
</button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
formData: {
name: '',
phone: '',
email: '',
province: '',
city: '',
district: '',
address: '',
investmentAmount: '',
businessExperience: '',
intentionDescription: ''
},
provinces: ['浙江省', '江苏省', '上海市', '广东省', '北京市'],
cities: [],
investmentRanges: ['10-20万', '20-50万', '50-100万', '100万以上'],
agreed: false,
submitting: false
}
},
methods: {
onProvinceChange(e) {
this.formData.province = this.provinces[e.detail.value]
this.formData.city = ''
// TODO: 根据省份加载城市列表
this.cities = ['杭州市', '宁波市', '温州市', '绍兴市']
},
onCityChange(e) {
this.formData.city = this.cities[e.detail.value]
},
onInvestmentChange(e) {
this.formData.investmentAmount = this.investmentRanges[e.detail.value]
},
onAgreementChange(e) {
this.agreed = e.detail.value.includes('agree')
},
viewAgreement() {
uni.navigateTo({
url: '/pages/franchise/agreement'
})
},
validateForm() {
if (!this.formData.name) {
uni.showToast({ title: '请输入姓名', icon: 'none' })
return false
}
if (!this.formData.phone) {
uni.showToast({ title: '请输入联系电话', icon: 'none' })
return false
}
if (!/^1[3-9]\d{9}$/.test(this.formData.phone)) {
uni.showToast({ title: '请输入正确的手机号', icon: 'none' })
return false
}
if (!this.formData.province) {
uni.showToast({ title: '请选择省份', icon: 'none' })
return false
}
if (!this.formData.city) {
uni.showToast({ title: '请选择城市', icon: 'none' })
return false
}
if (!this.agreed) {
uni.showToast({ title: '请阅读并同意加盟协议', icon: 'none' })
return false
}
return true
},
async submitForm() {
if (!this.validateForm()) {
return
}
this.submitting = true
try {
// TODO: 调用API提交申请
// await this.$api.franchise.submitApplication(this.formData)
// 模拟提交
await new Promise(resolve => setTimeout(resolve, 1500))
uni.showModal({
title: '提交成功',
content: '您的加盟申请已提交我们将在3个工作日内与您联系',
showCancel: false,
success: () => {
uni.navigateBack()
}
})
} catch (error) {
console.error('提交申请失败:', error)
uni.showToast({
title: '提交失败,请重试',
icon: 'none'
})
} finally {
this.submitting = false
}
}
}
}
</script>
<style lang="scss" scoped>
.apply-page {
min-height: 100vh;
background: #f0f9f7;
padding: 20rpx;
}
.form-container {
background: #ffffff;
border-radius: 20rpx;
overflow: hidden;
}
.form-header {
padding: 40rpx 30rpx;
background: linear-gradient(135deg, #7dd3c0 0%, #5fb8a8 100%);
text-align: center;
}
.header-title {
display: block;
font-size: 40rpx;
font-weight: bold;
color: #ffffff;
margin-bottom: 15rpx;
}
.header-subtitle {
display: block;
font-size: 26rpx;
color: rgba(255, 255, 255, 0.9);
}
.form-content {
padding: 30rpx;
}
.form-section {
margin-bottom: 40rpx;
}
.section-title {
font-size: 32rpx;
font-weight: bold;
color: #333333;
margin-bottom: 30rpx;
padding-left: 20rpx;
border-left: 6rpx solid #7dd3c0;
}
.form-item {
margin-bottom: 30rpx;
&.required .label::before {
content: '*';
color: #ff6b6b;
margin-right: 8rpx;
}
}
.label {
display: block;
font-size: 28rpx;
color: #666666;
margin-bottom: 15rpx;
}
.input, .textarea {
width: 100%;
padding: 24rpx;
background: #f5f5f5;
border-radius: 12rpx;
font-size: 28rpx;
color: #333333;
border: 2rpx solid transparent;
&:focus {
background: #ffffff;
border-color: #7dd3c0;
}
}
.textarea {
min-height: 150rpx;
}
.picker {
display: flex;
align-items: center;
justify-content: space-between;
padding: 24rpx;
background: #f5f5f5;
border-radius: 12rpx;
font-size: 28rpx;
color: #333333;
}
.arrow {
color: #999999;
}
.agreement-section {
margin: 40rpx 0;
padding: 30rpx;
background: #f0f9f7;
border-radius: 12rpx;
}
.agreement-label {
display: flex;
align-items: center;
gap: 15rpx;
}
.agreement-text {
font-size: 26rpx;
color: #666666;
}
.link {
color: #7dd3c0;
text-decoration: underline;
}
.submit-btn {
width: 100%;
padding: 32rpx;
background: linear-gradient(135deg, #7dd3c0 0%, #5fb8a8 100%);
color: #ffffff;
border-radius: 50rpx;
font-size: 32rpx;
font-weight: bold;
border: none;
&[disabled] {
opacity: 0.6;
}
}
</style>