diff --git a/src/utils/request.js b/src/utils/request.js index bc8e3e5..9be1ea5 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -53,7 +53,7 @@ service.interceptors.response.use( ElMessage.error('没有权限') } } else { - ElMessage.error(error.response.data?.message || '请求失败') + ElMessage.error(error.response.data?.msg || error.response.data?.message || '请求失败') } } else { ElMessage.error('网络错误') diff --git a/src/views/admin/AdminUser.vue b/src/views/admin/AdminUser.vue index c0ea129..8b384d3 100644 --- a/src/views/admin/AdminUser.vue +++ b/src/views/admin/AdminUser.vue @@ -835,6 +835,10 @@ const confirmAddUser = async () => { ElMessage.warning('密码和二级密码至少6位') return } + if (newUserRoleCodes.value.length === 0) { + ElMessage.warning('请至少选择一个角色') + return + } addingUser.value = true try { const res = await request.post('/houtai/tjyhjs', { diff --git a/src/views/assessment/ExamConfig.vue b/src/views/assessment/ExamConfig.vue index 3177156..8c9e405 100644 --- a/src/views/assessment/ExamConfig.vue +++ b/src/views/assessment/ExamConfig.vue @@ -282,7 +282,7 @@ const saveChenghao = async () => { ElMessage.error(res.msg || '操作失败') } } catch (e) { - ElMessage.error('网络错误') + ElMessage.error(e?.response?.data?.msg || e?.message || '网络错误') } finally { saving.value = false } @@ -311,7 +311,7 @@ const deleteChenghao = async () => { ElMessage.error(res.msg || '删除失败') } } catch (e) { - ElMessage.error('网络错误') + ElMessage.error(e?.response?.data?.msg || e?.message || '网络错误') } } diff --git a/src/views/assessment/ExaminerManage.vue b/src/views/assessment/ExaminerManage.vue index 4d06fba..8a6b130 100644 --- a/src/views/assessment/ExaminerManage.vue +++ b/src/views/assessment/ExaminerManage.vue @@ -510,6 +510,7 @@ const closeAddDialog = () => { } const submitAddExaminer = async () => { + if (addSaving.value) return const uid = (addForm.yonghuid || '').trim() if (!uid) { ElMessage.warning('请输入用户ID') @@ -535,7 +536,7 @@ const submitAddExaminer = async () => { ElMessage.error(res.msg || '添加失败') } } catch (e) { - ElMessage.error('网络错误') + ElMessage.error(e?.response?.data?.msg || e?.message || '网络错误') } finally { addSaving.value = false } diff --git a/src/views/user/PlayerDetail.vue b/src/views/user/PlayerDetail.vue index f9556d7..0d8da83 100644 --- a/src/views/user/PlayerDetail.vue +++ b/src/views/user/PlayerDetail.vue @@ -325,6 +325,46 @@ + + + + + 🎁 赠送会员(免费接单) + 送会员 + + 需要打手基础管理或加积分权限 + 与上方购买会员分开;仅用于抢单资格,不写购买表 + + + + + {{ gift.huiyuan_name }} 到期: {{ gift.daoqi_time || '--' }} + + 赠送人 {{ gift.song_ren || '--' }} · {{ gift.song_time || '--' }} + 改期 + 移除 + + 暂无赠送会员 + + + @@ -377,24 +417,64 @@ - + - + - + 取消 - 确认 + 确认 + + + + + + + + + + + + + + + 赠送时若积分不是 10,将自动改成 10 并写入操作日志 + + + 取消 + 确认 @@ -418,6 +498,7 @@ const username = ref(localStorage.getItem('username') || '') const playerInfo = ref({}) const originalInfo = ref({}) const memberList = ref([]) +const giftMemberList = ref([]) const allMembers = ref([]) const isEditMode = ref(false) const editData = ref({}) @@ -427,6 +508,11 @@ const memberDialogVisible = ref(false) const memberForm = reactive({ huiyuan_id: '', days: 30 }) const memberAdding = ref(false) +// 赠送会员弹窗 +const giftDialogVisible = ref(false) +const giftSaving = ref(false) +const giftForm = reactive({ id: null, huiyuan_id: '', daoqi_time: '' }) + // 权限控制 const userPermissions = ref([]) @@ -436,6 +522,14 @@ const hasMemberPermission = computed(() => userPermissions.value.includes('001ff') || userPermissions.value.includes('001gg') ) +const hasGiftPermission = computed(() => + userPermissions.value.includes('000001') || + userPermissions.value.includes('001aa') || + userPermissions.value.includes('001bb') || + userPermissions.value.includes('001cc') || + userPermissions.value.includes('001dd') || + userPermissions.value.includes('001ee') +) const hasChenghaoPermission = computed(() => userPermissions.value.includes('001hh')) const canChangeInviter = computed(() => userPermissions.value.includes('001ee') || userPermissions.value.includes('000001')) @@ -536,6 +630,7 @@ const fetchDetail = async () => { } originalInfo.value = JSON.parse(JSON.stringify(playerInfo.value)) memberList.value = data.member_list || [] + giftMemberList.value = data.gift_member_list || [] allMembers.value = data.all_members || [] userPermissions.value = data.permissions || [] } else if (res.code === 403) { @@ -714,6 +809,82 @@ const removeMember = async (member) => { } // 关键:从路由参数中获取 playerId(参数名必须为 playerId) +const openGiftDialog = (gift = null) => { + if (!hasGiftPermission.value) { + ElMessage.warning('无赠送会员权限') + return + } + if (gift) { + giftForm.id = gift.id + giftForm.huiyuan_id = gift.huiyuan_id + giftForm.daoqi_time = gift.daoqi_time || '' + } else { + giftForm.id = null + giftForm.huiyuan_id = '' + giftForm.daoqi_time = '' + } + giftDialogVisible.value = true +} + +const submitGiftMember = async () => { + if (!giftForm.huiyuan_id) { + ElMessage.warning('请选择会员类型') + return + } + if (!giftForm.daoqi_time) { + ElMessage.warning('请选择到期时间') + return + } + giftSaving.value = true + try { + const payload = { + phone: username.value, + dashou_id: playerId.value, + huiyuan_id: giftForm.huiyuan_id, + daoqi_time: giftForm.daoqi_time, + } + if (giftForm.id) payload.id = giftForm.id + const res = await request.post('/houtai/dszsonghy', payload) + if (res.code === 0) { + ElMessage.success(res.msg || '操作成功') + giftDialogVisible.value = false + await fetchDetail() + } else { + ElMessage.error(res.msg || '操作失败') + } + } catch (e) { + ElMessage.error(e?.response?.data?.msg || '操作失败') + } finally { + giftSaving.value = false + } +} + +const removeGiftMember = async (gift) => { + try { + await ElMessageBox.confirm( + `确定移除赠送会员“${gift.huiyuan_name}”吗?移除后将无法用该赠送资格抢单。`, + '提示', + { type: 'warning' } + ) + } catch { return } + try { + const res = await request.post('/houtai/dsycsonghy', { + phone: username.value, + dashou_id: playerId.value, + id: gift.id, + huiyuan_id: gift.huiyuan_id, + }) + if (res.code === 0) { + ElMessage.success('移除成功') + await fetchDetail() + } else { + ElMessage.error(res.msg || '移除失败') + } + } catch (e) { + ElMessage.error(e?.response?.data?.msg || '移除失败') + } +} + onMounted(() => { playerId.value = route.params.playerId if (!playerId.value) { @@ -737,6 +908,15 @@ onMounted(() => { flex-direction: column; gap: 12px; } +.gift-item { + flex-wrap: wrap; + gap: 6px; +} +.gift-meta { + font-size: 12px; + color: #909399; + margin: 0 4px; +} .member-item { display: flex; justify-content: space-between;