peixue-dev/peidu/uniapp/common-package/pages/auth/application-status.vue

503 lines
12 KiB
Vue
Raw Normal View History

<template>
<view class="status-page">
<!-- 状态卡片 -->
<view class="status-card" :class="statusClass">
<view class="status-icon">{{ statusIcon }}</view>
<text class="status-title">{{ statusTitle }}</text>
<text class="status-desc">{{ statusDesc }}</text>
<!-- 进度条 -->
<view v-if="application.status === 'pending'" class="progress-bar">
<view class="progress-step" :class="{ active: currentStep >= 1 }">
<view class="step-dot"></view>
<text class="step-text">提交申请</text>
</view>
<view class="progress-line" :class="{ active: currentStep >= 2 }"></view>
<view class="progress-step" :class="{ active: currentStep >= 2 }">
<view class="step-dot"></view>
<text class="step-text">审核中</text>
</view>
<view class="progress-line" :class="{ active: currentStep >= 3 }"></view>
<view class="progress-step" :class="{ active: currentStep >= 3 }">
<view class="step-dot"></view>
<text class="step-text">审核完成</text>
</view>
</view>
</view>
<!-- 申请信息 -->
<view class="info-card">
<view class="card-title">申请信息</view>
<view class="info-item">
<text class="info-label">申请角色</text>
<text class="info-value">{{ roleName }}</text>
</view>
<view class="info-item">
<text class="info-label">申请时间</text>
<text class="info-value">{{ formatTime(application.applyTime) }}</text>
</view>
<view class="info-item">
<text class="info-label">联系电话</text>
<text class="info-value">{{ application.phone }}</text>
</view>
<view v-if="application.status === 'approved' && application.approveTime" class="info-item">
<text class="info-label">审核时间</text>
<text class="info-value">{{ formatTime(application.approveTime) }}</text>
</view>
<view v-if="application.status === 'rejected' && application.rejectReason" class="info-item">
<text class="info-label">拒绝原因</text>
<text class="info-value reject-reason">{{ application.rejectReason }}</text>
</view>
</view>
<!-- 下一步操作 -->
<view v-if="application.status === 'approved'" class="action-card">
<view class="card-title">下一步操作</view>
<!-- 陪伴员培训和考核 -->
<view v-if="role === 'teacher'" class="action-list">
<view class="action-item" @tap="goToTraining">
<view class="action-icon">📚</view>
<view class="action-info">
<text class="action-title">线上培训</text>
<text class="action-desc">学习公司规章制度和服务流程</text>
</view>
<text class="action-arrow"></text>
</view>
<view class="action-item" @tap="goToExam">
<view class="action-icon">📝</view>
<view class="action-info">
<text class="action-title">在线考核</text>
<text class="action-desc">完成培训后参加考核测试</text>
</view>
<text class="action-arrow"></text>
</view>
</view>
<!-- 其他角色直接开始使用 -->
<view v-else class="action-list">
<view class="action-item" @tap="goToHome">
<view class="action-icon">🎉</view>
<view class="action-info">
<text class="action-title">开始使用</text>
<text class="action-desc">审核已通过现在可以开始使用了</text>
</view>
<text class="action-arrow"></text>
</view>
</view>
</view>
<!-- 重新申请 -->
<view v-if="application.status === 'rejected'" class="action-card">
<button class="reapply-btn" @tap="reapply">重新申请</button>
</view>
<!-- 联系客服 -->
<view class="contact-card">
<text class="contact-text">如有疑问请联系客服</text>
<button class="contact-btn" @tap="contactService">
<text class="contact-icon">💬</text>
<text>联系客服</text>
</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
role: '',
application: {},
currentStep: 2, // 当前进度步骤
roleNames: {
teacher: '陪伴员',
manager: '管理师',
distributor: '分销员',
serviceProvider: '专业服务商'
}
}
},
computed: {
roleName() {
return this.roleNames[this.role] || '未知角色'
},
statusClass() {
return {
'status-pending': this.application.status === 'pending',
'status-approved': this.application.status === 'approved',
'status-rejected': this.application.status === 'rejected'
}
},
statusIcon() {
const icons = {
pending: '⏳',
approved: '✅',
rejected: '❌'
}
return icons[this.application.status] || '📋'
},
statusTitle() {
const titles = {
pending: '审核中',
approved: '审核通过',
rejected: '审核未通过'
}
return titles[this.application.status] || '未知状态'
},
statusDesc() {
const descs = {
pending: '您的申请正在审核中预计1-3个工作日内完成',
approved: '恭喜您!您的申请已通过审核',
rejected: '很抱歉,您的申请未通过审核'
}
return descs[this.application.status] || ''
}
},
onLoad(options) {
this.role = options.role || ''
this.loadApplication()
},
methods: {
// 加载申请信息
loadApplication() {
const storageKey = `${this.role}Application`
const application = uni.getStorageSync(storageKey)
if (application) {
this.application = application
} else {
uni.showToast({
title: '未找到申请信息',
icon: 'none',
success: () => {
setTimeout(() => {
uni.navigateBack()
}, 1500)
}
})
}
},
// 格式化时间
formatTime(time) {
if (!time) return '-'
const date = new Date(time)
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`
},
// 前往培训
goToTraining() {
uni.navigateTo({
url: '/pages/teacher/training'
})
},
// 前往考核
goToExam() {
uni.navigateTo({
url: '/pages/teacher/exam-test'
})
},
// 前往首页
goToHome() {
// 保存用户信息
const userInfo = {
id: this.application.id,
phone: this.application.phone,
role: this.role,
name: this.application.name || this.application.teacherName || '用户',
nickname: this.application.name || this.application.teacherName || '用户'
}
uni.setStorageSync('token', 'mock_token_' + Date.now())
uni.setStorageSync('userInfo', userInfo)
uni.switchTab({
url: '/pages/index/index'
})
},
// 重新申请
reapply() {
uni.showModal({
title: '重新申请',
content: '确定要重新提交申请吗?',
success: (res) => {
if (res.confirm) {
// 清除旧的申请信息
const storageKey = `${this.role}Application`
uni.removeStorageSync(storageKey)
// 返回申请页面
uni.navigateBack()
}
}
})
},
// 联系客服
contactService() {
uni.showModal({
title: '联系客服',
content: '客服电话400-XXX-XXXX',
showCancel: true,
cancelText: '取消',
confirmText: '拨打电话',
success: (res) => {
if (res.confirm) {
uni.makePhoneCall({
phoneNumber: '400-XXX-XXXX'
})
}
}
})
}
}
}
</script>
<style scoped>
.status-page {
min-height: 100vh;
background: #f0f9f7;
padding: 30rpx;
}
.status-card {
background: #ffffff;
border-radius: 20rpx;
padding: 50rpx 30rpx;
text-align: center;
margin-bottom: 20rpx;
}
.status-card.status-pending {
border-top: 6rpx solid #ff9800;
}
.status-card.status-approved {
border-top: 6rpx solid #4caf50;
}
.status-card.status-rejected {
border-top: 6rpx solid #f44336;
}
.status-icon {
font-size: 100rpx;
margin-bottom: 20rpx;
}
.status-title {
display: block;
font-size: 36rpx;
font-weight: bold;
color: #333333;
margin-bottom: 15rpx;
}
.status-desc {
display: block;
font-size: 26rpx;
color: #666666;
line-height: 1.6;
}
.progress-bar {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 40rpx;
padding: 0 20rpx;
}
.progress-step {
display: flex;
flex-direction: column;
align-items: center;
gap: 10rpx;
}
.step-dot {
width: 40rpx;
height: 40rpx;
background: #e0e0e0;
border-radius: 50%;
transition: all 0.3s;
}
.progress-step.active .step-dot {
background: #2d9687;
}
.step-text {
font-size: 22rpx;
color: #999999;
}
.progress-step.active .step-text {
color: #2d9687;
font-weight: 500;
}
.progress-line {
flex: 1;
height: 4rpx;
background: #e0e0e0;
margin: 0 10rpx;
margin-bottom: 30rpx;
transition: all 0.3s;
}
.progress-line.active {
background: #2d9687;
}
.info-card,
.action-card,
.contact-card {
background: #ffffff;
border-radius: 20rpx;
padding: 30rpx;
margin-bottom: 20rpx;
}
.card-title {
font-size: 32rpx;
font-weight: bold;
color: #333333;
margin-bottom: 25rpx;
padding-left: 20rpx;
border-left: 6rpx solid #2d9687;
}
.info-item {
display: flex;
padding: 20rpx 0;
border-bottom: 1rpx solid #f0f0f0;
}
.info-item:last-child {
border-bottom: none;
}
.info-label {
width: 180rpx;
font-size: 28rpx;
color: #666666;
}
.info-value {
flex: 1;
font-size: 28rpx;
color: #333333;
}
.reject-reason {
color: #f44336;
}
.action-list {
display: flex;
flex-direction: column;
gap: 15rpx;
}
.action-item {
display: flex;
align-items: center;
padding: 25rpx;
background: #f0f9f7;
border-radius: 16rpx;
transition: all 0.3s;
}
.action-item:active {
transform: scale(0.98);
}
.action-icon {
width: 80rpx;
height: 80rpx;
background: #ffffff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 40rpx;
margin-right: 20rpx;
}
.action-info {
flex: 1;
display: flex;
flex-direction: column;
gap: 8rpx;
}
.action-title {
font-size: 30rpx;
font-weight: 500;
color: #333333;
}
.action-desc {
font-size: 24rpx;
color: #666666;
}
.action-arrow {
font-size: 40rpx;
color: #2d9687;
}
.reapply-btn {
width: 100%;
height: 88rpx;
background: linear-gradient(135deg, #2d9687 0%, #1e7a6d 100%);
color: #ffffff;
font-size: 32rpx;
font-weight: 500;
border-radius: 44rpx;
border: none;
}
.contact-card {
text-align: center;
}
.contact-text {
display: block;
font-size: 26rpx;
color: #666666;
margin-bottom: 20rpx;
}
.contact-btn {
width: 100%;
height: 88rpx;
background: #ffffff;
color: #2d9687;
font-size: 30rpx;
border-radius: 44rpx;
border: 2rpx solid #2d9687;
display: flex;
align-items: center;
justify-content: center;
gap: 10rpx;
}
.contact-icon {
font-size: 32rpx;
}
</style>