480 lines
11 KiB
Vue
480 lines
11 KiB
Vue
<template>
|
||
<view class="apply-page">
|
||
<view class="form-container">
|
||
<view class="form-header gradient-bg">
|
||
<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.idCard"
|
||
placeholder="请输入身份证号(选填)"
|
||
maxlength="18"
|
||
/>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 分销类型 -->
|
||
<view class="form-section">
|
||
<view class="section-title">分销类型</view>
|
||
|
||
<radio-group @change="onTypeChange">
|
||
<view class="type-options">
|
||
<label class="type-option" :class="{ active: formData.type === 'part_time' }">
|
||
<radio value="part_time" :checked="formData.type === 'part_time'" />
|
||
<view class="option-content">
|
||
<text class="option-title">兼职分销员</text>
|
||
<text class="option-desc">灵活时间,自由推广</text>
|
||
</view>
|
||
</label>
|
||
|
||
<label class="type-option" :class="{ active: formData.type === 'full_time' }">
|
||
<radio value="full_time" :checked="formData.type === 'full_time'" />
|
||
<view class="option-content">
|
||
<text class="option-title">全职分销员</text>
|
||
<text class="option-desc">专职推广,更高收益</text>
|
||
</view>
|
||
</label>
|
||
</view>
|
||
</radio-group>
|
||
</view>
|
||
|
||
<!-- 推广经验 -->
|
||
<view class="form-section">
|
||
<view class="section-title">推广经验</view>
|
||
|
||
<view class="form-item">
|
||
<text class="label">是否有推广经验</text>
|
||
<radio-group @change="onExperienceChange">
|
||
<view class="radio-group">
|
||
<label class="radio-item">
|
||
<radio value="yes" :checked="formData.hasExperience === 'yes'" />
|
||
<text>有</text>
|
||
</label>
|
||
<label class="radio-item">
|
||
<radio value="no" :checked="formData.hasExperience === 'no'" />
|
||
<text>无</text>
|
||
</label>
|
||
</view>
|
||
</radio-group>
|
||
</view>
|
||
|
||
<view class="form-item" v-if="formData.hasExperience === 'yes'">
|
||
<text class="label">推广经验描述</text>
|
||
<textarea
|
||
class="textarea"
|
||
v-model="formData.experienceDesc"
|
||
placeholder="请简要描述您的推广经验"
|
||
maxlength="500"
|
||
/>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 申请理由 -->
|
||
<view class="form-section">
|
||
<view class="section-title">申请理由</view>
|
||
|
||
<view class="form-item">
|
||
<textarea
|
||
class="textarea"
|
||
v-model="formData.applyReason"
|
||
placeholder="请说明您申请成为分销员的理由(选填)"
|
||
maxlength="500"
|
||
/>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 佣金说明 -->
|
||
<view class="commission-info">
|
||
<view class="info-title">💰 佣金说明</view>
|
||
<view class="info-item">
|
||
<text class="info-label">一级佣金:</text>
|
||
<text class="info-value">10-15%</text>
|
||
</view>
|
||
<view class="info-item">
|
||
<text class="info-label">二级佣金:</text>
|
||
<text class="info-value">5-7%</text>
|
||
</view>
|
||
<view class="info-item">
|
||
<text class="info-label">提现门槛:</text>
|
||
<text class="info-value">满100元可提现</text>
|
||
</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: '',
|
||
idCard: '',
|
||
type: 'part_time',
|
||
hasExperience: 'no',
|
||
experienceDesc: '',
|
||
applyReason: ''
|
||
},
|
||
agreed: false,
|
||
submitting: false
|
||
}
|
||
},
|
||
|
||
methods: {
|
||
onTypeChange(e) {
|
||
this.formData.type = e.detail.value
|
||
},
|
||
|
||
onExperienceChange(e) {
|
||
this.formData.hasExperience = e.detail.value
|
||
if (e.detail.value === 'no') {
|
||
this.formData.experienceDesc = ''
|
||
}
|
||
},
|
||
|
||
onAgreementChange(e) {
|
||
this.agreed = e.detail.value.includes('agree')
|
||
},
|
||
|
||
viewAgreement() {
|
||
uni.navigateTo({
|
||
url: '/pages/distributor/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.agreed) {
|
||
uni.showToast({ title: '请阅读并同意分销员协议', icon: 'none' })
|
||
return false
|
||
}
|
||
|
||
return true
|
||
},
|
||
|
||
async submitForm() {
|
||
if (!this.validateForm()) {
|
||
return
|
||
}
|
||
|
||
this.submitting = true
|
||
|
||
try {
|
||
// 模拟提交
|
||
await new Promise(resolve => setTimeout(resolve, 1500))
|
||
|
||
// 保存申请信息到本地
|
||
const application = {
|
||
...this.formData,
|
||
role: 'distributor',
|
||
status: 'pending',
|
||
applyTime: new Date().toISOString(),
|
||
id: Date.now()
|
||
}
|
||
uni.setStorageSync('distributorApplication', application)
|
||
|
||
uni.showModal({
|
||
title: '提交成功',
|
||
content: '您的申请已提交,我们将在3个工作日内审核。审核通过后,您将获得分销码和推广权限。',
|
||
showCancel: false,
|
||
confirmText: '查看审核状态',
|
||
success: () => {
|
||
uni.redirectTo({
|
||
url: '/pages/auth/application-status?role=distributor'
|
||
})
|
||
}
|
||
})
|
||
} 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;
|
||
}
|
||
|
||
.gradient-bg {
|
||
background: linear-gradient(135deg, #7dd3c0 0%, #5fb8a8 100%);
|
||
}
|
||
|
||
.form-header {
|
||
padding: 40rpx 30rpx;
|
||
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;
|
||
}
|
||
|
||
.type-options {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 20rpx;
|
||
}
|
||
|
||
.type-option {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 20rpx;
|
||
padding: 30rpx;
|
||
background: #f5f5f5;
|
||
border-radius: 16rpx;
|
||
border: 2rpx solid transparent;
|
||
|
||
&.active {
|
||
background: #f0f9f7;
|
||
border-color: #7dd3c0;
|
||
}
|
||
}
|
||
|
||
.option-content {
|
||
flex: 1;
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 10rpx;
|
||
}
|
||
|
||
.option-title {
|
||
font-size: 30rpx;
|
||
font-weight: bold;
|
||
color: #333333;
|
||
}
|
||
|
||
.option-desc {
|
||
font-size: 24rpx;
|
||
color: #999999;
|
||
}
|
||
|
||
.radio-group {
|
||
display: flex;
|
||
gap: 40rpx;
|
||
}
|
||
|
||
.radio-item {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 10rpx;
|
||
font-size: 28rpx;
|
||
color: #666666;
|
||
}
|
||
|
||
.commission-info {
|
||
padding: 30rpx;
|
||
background: #f0f9f7;
|
||
border-radius: 16rpx;
|
||
margin-bottom: 40rpx;
|
||
}
|
||
|
||
.info-title {
|
||
font-size: 30rpx;
|
||
font-weight: bold;
|
||
color: #333333;
|
||
margin-bottom: 20rpx;
|
||
}
|
||
|
||
.info-item {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
padding: 15rpx 0;
|
||
border-bottom: 1rpx solid #e0e0e0;
|
||
|
||
&:last-child {
|
||
border-bottom: none;
|
||
}
|
||
}
|
||
|
||
.info-label {
|
||
font-size: 26rpx;
|
||
color: #666666;
|
||
}
|
||
|
||
.info-value {
|
||
font-size: 28rpx;
|
||
font-weight: bold;
|
||
color: #7dd3c0;
|
||
}
|
||
|
||
.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>
|