peixue-dev/peidu/uniapp/distributor-package/pages/distributor/apply.vue

480 lines
11 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 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>