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

503 lines
12 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="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>