8.0 KiB
8.0 KiB
🚀 立即修复 - 家长端日历按钮显示问题
日期: 2026-01-24
问题: 家长端订单详情显示"开始服务"等陪伴员专属按钮
🔍 问题分析
当前问题:
- ❌ 家长端订单详情页面显示"开始服务"按钮
- ❌ 没有根据用户角色(userType)区分显示内容
- ❌ 家长端和陪伴员端使用相同的订单详情页面
根本原因:
- 订单详情页面(
order-package/pages/order/detail.vue)没有判断用户角色 - 所有用户看到的操作按钮都一样
✅ 解决方案
方案: 在订单详情页面添加用户角色判断
修改文件: peidu/uniapp/src/order-package/pages/order/detail.vue
1. 添加用户角色获取逻辑
data() {
return {
orderId: null,
userType: null, // ✅ 新增:用户角色
order: {
// ... 现有字段
}
}
},
onLoad(options) {
// ✅ 获取用户角色
const userInfo = uni.getStorageSync('userInfo')
this.userType = userInfo?.userType || 'parent'
this.orderId = parseId(options.id)
if (!validateId(this.orderId, '订单ID')) {
setTimeout(() => uni.navigateBack(), 1500)
return
}
this.loadOrderDetail()
}
2. 修改底部操作栏显示逻辑
<!-- 底部操作栏 -->
<view class="bottom-bar" v-if="order.status !== null">
<!-- ========== 家长端按钮 ========== -->
<template v-if="userType === 'parent' || userType === 'user'">
<!-- 待支付 (status=0) -->
<template v-if="order.status === 0">
<button class="btn-secondary" @click="cancelOrder">取消订单</button>
<button class="btn-primary" @click="handlePay">立即支付</button>
</template>
<!-- 待接单 (status=1) -->
<template v-else-if="order.status === 1">
<button class="btn-secondary" @click="goBack">返回</button>
<button class="btn-primary" @click="contactService">联系客服</button>
</template>
<!-- 待服务 (status=2) -->
<template v-else-if="order.status === 2">
<button class="btn-secondary" @click="goBack">返回</button>
<button class="btn-primary" @click="contactTeacher" v-if="order.teacherPhone">联系陪伴员</button>
</template>
<!-- 服务中 (status=3) -->
<template v-else-if="order.status === 3">
<button class="btn-secondary" @click="goBack">返回</button>
<button class="btn-primary" @click="contactTeacher" v-if="order.teacherPhone">联系陪伴员</button>
</template>
<!-- 已完成 (status=4) -->
<template v-else-if="order.status === 4">
<button class="btn-secondary" @click="goBack">返回</button>
<button class="btn-primary" @click="goReview" v-if="!order.reviewed">去评价</button>
<button class="btn-primary" @click="rebuy" v-else>再次预约</button>
</template>
<!-- 已取消 (status=-1) -->
<template v-else-if="order.status === -1">
<button class="btn-secondary" @click="goBack">返回</button>
<button class="btn-primary" @click="rebuy">重新预约</button>
</template>
</template>
<!-- ========== 陪伴员端按钮 ========== -->
<template v-else-if="userType === 'teacher'">
<!-- 待接单 (status=1) -->
<template v-if="order.status === 1">
<button class="btn-secondary" @click="rejectOrder">拒绝接单</button>
<button class="btn-primary" @click="acceptOrder">接受订单</button>
</template>
<!-- 待服务 (status=2) -->
<template v-else-if="order.status === 2">
<button class="btn-secondary" @click="goBack">返回</button>
<button class="btn-primary" @click="startService">开始服务</button>
</template>
<!-- 服务中 (status=3) -->
<template v-else-if="order.status === 3">
<button class="btn-secondary" @click="goBack">返回</button>
<button class="btn-primary" @click="endService">结束服务</button>
</template>
<!-- 已完成 (status=4) -->
<template v-else-if="order.status === 4">
<button class="btn-secondary" @click="goBack">返回</button>
<button class="btn-primary" @click="viewFeedback">查看反馈</button>
</template>
<!-- 其他状态 -->
<template v-else>
<button class="btn-secondary" @click="goBack">返回</button>
</template>
</template>
<!-- ========== 其他角色默认按钮 ========== -->
<template v-else>
<button class="btn-secondary" @click="goBack">返回</button>
</template>
</view>
3. 添加陪伴员专属方法
methods: {
// ... 现有方法
// ========== 陪伴员专属方法 ==========
// 接受订单
async acceptOrder() {
try {
uni.showLoading({ title: '处理中...' })
await api.teacherApi.acceptOrder(this.orderId)
uni.hideLoading()
uni.showToast({ title: '接单成功', icon: 'success' })
setTimeout(() => this.loadOrderDetail(), 1500)
} catch (error) {
uni.hideLoading()
uni.showToast({ title: error.message || '接单失败', icon: 'none' })
}
},
// 拒绝订单
async rejectOrder() {
const [err, res] = await uni.showModal({
title: '拒绝接单',
content: '确定要拒绝这个订单吗?',
placeholderText: '请输入拒绝原因'
})
if (!res.confirm) return
try {
uni.showLoading({ title: '处理中...' })
await api.teacherApi.rejectOrder(this.orderId, {
reason: '陪伴员拒绝接单'
})
uni.hideLoading()
uni.showToast({ title: '已拒绝', icon: 'success' })
setTimeout(() => uni.navigateBack(), 1500)
} catch (error) {
uni.hideLoading()
uni.showToast({ title: error.message || '操作失败', icon: 'none' })
}
},
// 开始服务
startService() {
uni.navigateTo({
url: `/teacher-package/pages/service/checkin?orderId=${this.orderId}`
})
},
// 结束服务
endService() {
uni.navigateTo({
url: `/teacher-package/pages/service/checkout?orderId=${this.orderId}`
})
},
// 查看反馈
viewFeedback() {
uni.navigateTo({
url: `/teacher-package/pages/service/feedback?orderId=${this.orderId}`
})
}
}
📋 修改文件清单
需要修改的文件:
- ✅
peidu/uniapp/src/order-package/pages/order/detail.vue- 添加userType字段
- 修改底部操作栏显示逻辑
- 添加陪伴员专属方法
🧪 测试要点
家长端测试:
- ✅ 待支付订单: 显示"取消订单"、"立即支付"
- ✅ 待接单订单: 显示"返回"、"联系客服"
- ✅ 待服务订单: 显示"返回"、"联系陪伴员"
- ✅ 服务中订单: 显示"返回"、"联系陪伴员"
- ✅ 已完成订单: 显示"返回"、"去评价"或"再次预约"
- ❌ 不显示"开始服务"、"结束服务"等陪伴员按钮
陪伴员端测试:
- ✅ 待接单订单: 显示"拒绝接单"、"接受订单"
- ✅ 待服务订单: 显示"返回"、"开始服务"
- ✅ 服务中订单: 显示"返回"、"结束服务"
- ✅ 已完成订单: 显示"返回"、"查看反馈"
- ❌ 不显示"去评价"等家长专属按钮
🎯 实施步骤
1. 修改订单详情页面
文件: peidu/uniapp/src/order-package/pages/order/detail.vue
2. 重新编译前端
# 在HBuilderX中
# 1. 点击"运行" -> "运行到浏览器"
# 2. 或点击"发行" -> "小程序-微信"
3. 测试验证
- 使用家长账号登录,查看订单详情
- 使用陪伴员账号登录,查看订单详情
- 确认按钮显示正确
💡 扩展优化
后续可以优化的点:
-
统一角色管理
- 使用Vuex统一管理用户角色
- 避免每个页面都获取一次
-
权限指令
- 创建v-permission指令
- 简化权限判断代码
-
组件级权限
- 创建权限组件
- 自动根据角色显示/隐藏
📝 总结
这次修复的核心是:
- ✅ 添加用户角色判断
- ✅ 根据角色显示不同的操作按钮
- ✅ 家长端不再显示陪伴员专属功能
修复后,家长端日历和订单详情将只显示家长相关的操作,不会再出现"开始服务"等混淆的按钮。