From a5725f23d41bc64c3c1e730874eb5e0b31c3362f Mon Sep 17 00:00:00 2001 From: hy Date: Thu, 16 Apr 2026 18:44:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/src/router/routes/modules/app-user.ts | 247 +++++++++++++++++++++ apps/src/router/routes/modules/operate.ts | 199 +---------------- apps/src/views/operate/online-room.vue | 45 +++- apps/src/views/operate/room-profile.vue | 45 +++- apps/src/views/team/team-policy-page.vue | 160 +++++++------ 5 files changed, 434 insertions(+), 262 deletions(-) create mode 100644 apps/src/router/routes/modules/app-user.ts diff --git a/apps/src/router/routes/modules/app-user.ts b/apps/src/router/routes/modules/app-user.ts new file mode 100644 index 0000000..75311d5 --- /dev/null +++ b/apps/src/router/routes/modules/app-user.ts @@ -0,0 +1,247 @@ +import type { RouteRecordRaw } from 'vue-router'; + +const routes: RouteRecordRaw[] = [ + { + meta: { + icon: 'lucide:users', + order: 49.5, + title: 'App用户管理', + }, + name: 'AppUserManager', + path: '/app-user/manager', + redirect: '/app-user/manager/gold-balance', + children: [ + { + name: 'GoldBalance', + path: 'gold-balance', + alias: '/operate/manager/gold-balance', + component: () => import('#/views/operate/gold-balance.vue'), + meta: { title: '金币余额' }, + }, + { + name: 'AutoSalaryPayRecord', + path: 'auto-salary-pay-record', + alias: '/auto-salary-pay-record', + component: () => import('#/views/operate/auto-salary-pay-record.vue'), + meta: { title: '自动发放工资凭据' }, + }, + { + name: 'UserBankWithdrawMoneyApply', + path: 'withdraw-money-apply-page', + alias: '/withdraw-money-apply-page', + component: () => + import('#/views/operate/user-bank-withdraw-money-apply.vue'), + meta: { title: '用户银行卡提现现金申请' }, + }, + { + name: 'UserBankWithdrawDiamondApply', + path: 'withdraw-diamond-apply-page', + alias: '/withdraw-diamond-apply-page', + component: () => + import('#/views/operate/user-bank-withdraw-diamond-apply.vue'), + meta: { title: '用户银行卡提现钻石申请' }, + }, + { + name: 'UserBankWithdrawGoldApply', + path: 'user-bank-withdraw-gold-apply', + alias: '/user-bank-withdraw-gold-apply', + component: () => + import('#/views/operate/user-bank-withdraw-gold-apply.vue'), + meta: { title: '用户银行金币兑换申请' }, + }, + { + name: 'UserBankDiamondWithdrawGoldApply', + path: 'user-bank-diamond-withdraw-gold-apply', + alias: '/user-bank-diamond-withdraw-gold-apply', + component: () => + import('#/views/operate/user-bank-diamond-withdraw-gold-apply.vue'), + meta: { title: '用户银行卡钻石兑换金币申请' }, + }, + { + name: 'UserBankBalance', + path: 'user-bank-balance', + alias: '/user-bank-balance', + component: () => import('#/views/operate/user-bank-balance.vue'), + meta: { title: '用户银行账户' }, + }, + { + name: 'UserBankRunningWater', + path: 'user-running-water', + alias: '/user-running-water', + component: () => import('#/views/operate/user-bank-running-water.vue'), + meta: { title: '用户银行流水' }, + }, + { + name: 'InviteUserLog', + path: 'invite-user-log', + alias: '/operate/manager/invite-user-log', + component: () => import('#/views/operate/invite-user-log.vue'), + meta: { title: '邀请用户日志' }, + }, + { + name: 'SysUserFriendshipCard', + path: 'sys/friendship-card', + alias: '/sys/friendship-card', + component: () => import('#/views/operate/friendship-card.vue'), + meta: { title: '用户友谊卡配置' }, + }, + { + name: 'LotfunInviteUserRule', + path: 'sys/invite-user-rule', + alias: '/sys/invite-user-rule', + component: () => import('#/views/operate/invite-user-rule.vue'), + meta: { title: '邀请用户配置' }, + }, + { + name: 'AswatUserAdvertising', + path: 'sys/user-advertising', + alias: '/sys/user-advertising', + component: () => import('#/views/operate/user-advertising.vue'), + meta: { title: '用户观看广告配置' }, + }, + { + name: 'OperateUserFreight', + path: 'user_freight', + alias: '/operate/manager/user_freight', + component: () => import('#/views/operate/user-freight.vue'), + meta: { title: '货运代理' }, + }, + { + name: 'InviteRewardRecord', + path: 'user/invite-reward', + alias: '/operate/manager/user/invite-reward', + component: () => import('#/views/operate/invite-reward.vue'), + meta: { title: '邀请用户奖励记录' }, + }, + { + name: 'OperateImAccountManager', + path: 'im/account/manager', + alias: '/operate/manager/im/account/manager', + component: () => import('#/views/operate/im-account-manager.vue'), + meta: { title: 'IM账号管理' }, + }, + { + name: 'CheckInLog', + path: 'check/in/log', + alias: '/operate/manager/check/in/log', + component: () => import('#/views/operate/check-in-log.vue'), + meta: { title: '用户签到' }, + }, + { + name: 'OperateUserManage', + path: 'user', + alias: '/operate/manager/user', + component: () => import('#/views/operate/user-manage.vue'), + meta: { title: '用户列表' }, + }, + { + name: 'OperateUserDevice', + path: 'user/user-device', + alias: '/operate/manager/user/user-device', + component: () => import('#/views/operate/user-device-list.vue'), + meta: { title: '用户最新设备列表' }, + }, + { + name: 'OperateUserFreightInfoList', + path: 'user_freight_info_list', + alias: '/operate/manager/user_freight_info_list', + component: () => import('#/views/operate/user-freight-info-list.vue'), + meta: { title: '货运代理流水' }, + }, + { + name: 'OperateQualityUsersList', + path: 'quality_users_list', + alias: '/operate/manager/quality_users_list', + component: () => import('#/views/operate/quality-users-list.vue'), + meta: { title: '高产用户列表' }, + }, + { + name: 'OperateGoldRunningWater', + path: 'running/water', + alias: '/operate/manager/running/water', + component: () => import('#/views/operate/gold-running-water.vue'), + meta: { title: '金币收支记录' }, + }, + { + name: 'OperateInsideOperationGold', + path: 'inside-operation-gold', + alias: '/operate/manager/inside-operation-gold', + component: () => import('#/views/operate/inside-operation-gold.vue'), + meta: { title: '内部操作金币' }, + }, + { + name: 'GameCouponRunningWater', + path: 'game/coupon/running/water', + alias: '/game/coupon/running/water', + component: () => import('#/views/operate/game-coupon-running-water.vue'), + meta: { title: '游戏券收支记录' }, + }, + { + name: 'OperateIntegralStream', + path: 'integral/stream', + alias: '/operate/manager/integral/stream', + component: () => import('#/views/operate/integral-stream.vue'), + meta: { title: '积分收支记录' }, + }, + { + name: 'OperateBadgeConfig', + path: 'badge', + alias: '/operate/manager/badge', + component: () => import('#/views/operate/badge-config.vue'), + meta: { title: '徽章配置管理' }, + }, + { + name: 'OperateGiftHistory', + path: 'gift/history', + alias: '/operate/manager/gift/history', + component: () => import('#/views/operate/gift-history.vue'), + meta: { title: '礼物赠送记录' }, + }, + { + name: 'RunningWaterUserProps', + path: 'running/water/user/props', + alias: '/running/water/user/props', + component: () => import('#/views/operate/user-props-running-water.vue'), + meta: { title: '用户道具流水' }, + }, + { + name: 'UserDiamondBalance', + path: 'user/diamond-balance', + alias: '/user/diamond-balance', + component: () => import('#/views/operate/user-diamond-balance.vue'), + meta: { title: '用户钻石余额列表' }, + }, + { + name: 'UserDiamondRunWater', + path: 'user/diamond-run-water', + alias: '/user/diamond-run-water', + component: () => + import('#/views/operate/user-diamond-running-water.vue'), + meta: { title: '用户钻石流水列表' }, + }, + { + name: 'UserActivityReceive', + path: 'user/user-activity-receive', + alias: '/user/user-activity-receive', + component: () => import('#/views/operate/user-activity-receive.vue'), + meta: { title: '用户活动领奖记录' }, + }, + { + name: 'BeautifulNumberApply', + path: 'user/beautiful-number-apply', + alias: '/user/beautiful-number-apply', + component: () => import('#/views/operate/beautiful-number-apply.vue'), + meta: { title: '用户申请靓号记录' }, + }, + { + name: 'OperateBeautifulNumber', + path: 'beautiful-number', + alias: '/operate/manager/beautiful-number', + component: () => import('#/views/operate/beautiful-number.vue'), + meta: { title: '靓号池管理' }, + }, + ], + }, +]; + +export default routes; diff --git a/apps/src/router/routes/modules/operate.ts b/apps/src/router/routes/modules/operate.ts index e262d9f..f8da530 100644 --- a/apps/src/router/routes/modules/operate.ts +++ b/apps/src/router/routes/modules/operate.ts @@ -9,7 +9,7 @@ const routes: RouteRecordRaw[] = [ }, name: 'OperateManager', path: '/operate/manager', - redirect: '/operate/manager/gold-balance', + redirect: '/operate/manager/agentActivity', children: [ { name: 'AgentActivity', @@ -17,58 +17,6 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/operate/agent-activity.vue'), meta: { title: '代理活动' }, }, - { - name: 'GoldBalance', - path: 'gold-balance', - component: () => import('#/views/operate/gold-balance.vue'), - meta: { title: '金币余额' }, - }, - { - name: 'AutoSalaryPayRecord', - path: '/auto-salary-pay-record', - component: () => import('#/views/operate/auto-salary-pay-record.vue'), - meta: { title: '自动发放工资凭据' }, - }, - { - name: 'UserBankWithdrawMoneyApply', - path: '/withdraw-money-apply-page', - component: () => - import('#/views/operate/user-bank-withdraw-money-apply.vue'), - meta: { title: '用户银行卡提现现金申请' }, - }, - { - name: 'UserBankWithdrawDiamondApply', - path: '/withdraw-diamond-apply-page', - component: () => - import('#/views/operate/user-bank-withdraw-diamond-apply.vue'), - meta: { title: '用户银行卡提现钻石申请' }, - }, - { - name: 'UserBankWithdrawGoldApply', - path: '/user-bank-withdraw-gold-apply', - component: () => - import('#/views/operate/user-bank-withdraw-gold-apply.vue'), - meta: { title: '用户银行金币兑换申请' }, - }, - { - name: 'UserBankDiamondWithdrawGoldApply', - path: '/user-bank-diamond-withdraw-gold-apply', - component: () => - import('#/views/operate/user-bank-diamond-withdraw-gold-apply.vue'), - meta: { title: '用户银行卡钻石兑换金币申请' }, - }, - { - name: 'UserBankBalance', - path: '/user-bank-balance', - component: () => import('#/views/operate/user-bank-balance.vue'), - meta: { title: '用户银行账户' }, - }, - { - name: 'UserBankRunningWater', - path: '/user-running-water', - component: () => import('#/views/operate/user-bank-running-water.vue'), - meta: { title: '用户银行流水' }, - }, { name: 'CustomerService', path: '/customer-service', @@ -87,12 +35,6 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/operate/game-pk.vue'), meta: { title: 'PK记录' }, }, - { - name: 'InviteUserLog', - path: 'invite-user-log', - component: () => import('#/views/operate/invite-user-log.vue'), - meta: { title: '邀请用户日志' }, - }, { name: 'OperateActivityConfig', path: 'activity/cnf', @@ -105,24 +47,6 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/operate/activity-template.vue'), meta: { title: '活动模版' }, }, - { - name: 'SysUserFriendshipCard', - path: '/sys/friendship-card', - component: () => import('#/views/operate/friendship-card.vue'), - meta: { title: '用户友谊卡配置' }, - }, - { - name: 'LotfunInviteUserRule', - path: '/sys/invite-user-rule', - component: () => import('#/views/operate/invite-user-rule.vue'), - meta: { title: '邀请用户配置' }, - }, - { - name: 'AswatUserAdvertising', - path: '/sys/user-advertising', - component: () => import('#/views/operate/user-advertising.vue'), - meta: { title: '用户观看广告配置' }, - }, { name: 'GameLudo', path: '/game-ludo', @@ -189,54 +113,18 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/operate/lottery-wheel-config.vue'), meta: { title: '抽奖品配置' }, }, - { - name: 'OperateUserFreight', - path: 'user_freight', - component: () => import('#/views/operate/user-freight.vue'), - meta: { title: '货运代理' }, - }, { name: 'OperateBusinessDevelopment', path: 'room/business-development', component: () => import('#/views/operate/business-development.vue'), meta: { title: 'BD列表' }, }, - { - name: 'InviteRewardRecord', - path: 'user/invite-reward', - component: () => import('#/views/operate/invite-reward.vue'), - meta: { title: '邀请用户奖励记录' }, - }, - { - name: 'OperateImAccountManager', - path: 'im/account/manager', - component: () => import('#/views/operate/im-account-manager.vue'), - meta: { title: 'IM账号管理' }, - }, - { - name: 'CheckInLog', - path: 'check/in/log', - component: () => import('#/views/operate/check-in-log.vue'), - meta: { title: '用户签到' }, - }, - { - name: 'OperateUserManage', - path: 'user', - component: () => import('#/views/operate/user-manage.vue'), - meta: { title: '用户列表' }, - }, { name: 'OperateAdministrator', path: 'administrator', component: () => import('#/views/operate/app-administrator.vue'), meta: { title: 'APP管理员' }, }, - { - name: 'OperateUserDevice', - path: 'user/user-device', - component: () => import('#/views/operate/user-device-list.vue'), - meta: { title: '用户最新设备列表' }, - }, { name: 'OperateCompensate', path: 'compensate', @@ -255,42 +143,6 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/operate/order-abnormal.vue'), meta: { title: '异常订单' }, }, - { - name: 'OperateUserFreightInfoList', - path: 'user_freight_info_list', - component: () => import('#/views/operate/user-freight-info-list.vue'), - meta: { title: '货运代理流水' }, - }, - { - name: 'OperateQualityUsersList', - path: 'quality_users_list', - component: () => import('#/views/operate/quality-users-list.vue'), - meta: { title: '高产用户列表' }, - }, - { - name: 'OperateGoldRunningWater', - path: 'running/water', - component: () => import('#/views/operate/gold-running-water.vue'), - meta: { title: '金币收支记录' }, - }, - { - name: 'OperateInsideOperationGold', - path: 'inside-operation-gold', - component: () => import('#/views/operate/inside-operation-gold.vue'), - meta: { title: '内部操作金币' }, - }, - { - name: 'GameCouponRunningWater', - path: '/game/coupon/running/water', - component: () => import('#/views/operate/game-coupon-running-water.vue'), - meta: { title: '游戏券收支记录' }, - }, - { - name: 'OperateIntegralStream', - path: 'integral/stream', - component: () => import('#/views/operate/integral-stream.vue'), - meta: { title: '积分收支记录' }, - }, { name: 'OperateOrderDetails', path: 'order/details', @@ -315,18 +167,6 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/operate/game-lottery-config.vue'), meta: { title: '抽奖概率配置' }, }, - { - name: 'OperateBadgeConfig', - path: 'badge', - component: () => import('#/views/operate/badge-config.vue'), - meta: { title: '徽章配置管理' }, - }, - { - name: 'OperateGiftHistory', - path: 'gift/history', - component: () => import('#/views/operate/gift-history.vue'), - meta: { title: '礼物赠送记录' }, - }, { name: 'GameRedPacketRecord', path: '/game/red/packet/record', @@ -441,31 +281,6 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/operate/mike-type-list.vue'), meta: { title: '购买麦位类型流水' }, }, - { - name: 'RunningWaterUserProps', - path: '/running/water/user/props', - component: () => import('#/views/operate/user-props-running-water.vue'), - meta: { title: '用户道具流水' }, - }, - { - name: 'UserDiamondBalance', - path: '/user/diamond-balance', - component: () => import('#/views/operate/user-diamond-balance.vue'), - meta: { title: '用户钻石余额列表' }, - }, - { - name: 'UserDiamondRunWater', - path: '/user/diamond-run-water', - component: () => - import('#/views/operate/user-diamond-running-water.vue'), - meta: { title: '用户钻石流水列表' }, - }, - { - name: 'UserActivityReceive', - path: '/user/user-activity-receive', - component: () => import('#/views/operate/user-activity-receive.vue'), - meta: { title: '用户活动领奖记录' }, - }, { name: 'GameTrumpet', path: '/game/trumpet', @@ -478,18 +293,6 @@ const routes: RouteRecordRaw[] = [ component: () => import('#/views/operate/game-egg.vue'), meta: { title: '砸金蛋' }, }, - { - name: 'BeautifulNumberApply', - path: '/user/beautiful-number-apply', - component: () => import('#/views/operate/beautiful-number-apply.vue'), - meta: { title: '用户申请靓号记录' }, - }, - { - name: 'OperateBeautifulNumber', - path: 'beautiful-number', - component: () => import('#/views/operate/beautiful-number.vue'), - meta: { title: '靓号池管理' }, - }, { name: 'ActivityRoomContribution', path: '/activity/room/contribution', diff --git a/apps/src/views/operate/online-room.vue b/apps/src/views/operate/online-room.vue index 6ff61c2..6403bba 100644 --- a/apps/src/views/operate/online-room.vue +++ b/apps/src/views/operate/online-room.vue @@ -4,15 +4,17 @@ import { computed, reactive, ref } from 'vue'; import { Page } from '@vben/common-ui'; import { useAccessStore } from '@vben/stores'; -import { onlineRoom } from '#/api/legacy/room'; +import { onlineRoom, updateProfile } from '#/api/legacy/room'; import { getAllowedSysOrigins } from '#/views/system/shared'; import { Button, Card, Empty, + Modal, Space, Tag, + message, } from 'antdv-next'; import AccountHandleModal from '#/views/approval/components/account-handle-modal.vue'; @@ -35,6 +37,7 @@ const regionSelectRef = ref | null>(null const loading = ref(false); const searchLoading = ref(false); const list = ref>>([]); +const roomStatusSavingId = ref(''); const membersOpen = ref(false); const accountHandleOpen = ref(false); const roomDetailsOpen = ref(false); @@ -102,6 +105,38 @@ function openRoomDetails(record: Record) { roomDetailsOpen.value = true; } +function isRoomClosed(record: Record) { + return record.profile?.event === 'CLOSE'; +} + +function handleToggleRoomStatus(record: Record) { + const roomId = record.profile?.id; + const userId = record.profile?.userId; + if (!roomId || !userId) { + message.warning('房间信息不完整,无法操作'); + return; + } + const nextEvent = isRoomClosed(record) ? 'AVAILABLE' : 'CLOSE'; + Modal.confirm({ + title: nextEvent === 'CLOSE' ? '是否确认关闭该房间?' : '是否确认恢复该房间?', + async onOk() { + roomStatusSavingId.value = roomId; + try { + await updateProfile({ + event: nextEvent, + id: roomId, + sysOrigin: record.profile?.sysOrigin || query.sysOrigin, + userId, + }); + message.success(nextEvent === 'CLOSE' ? '关闭成功' : '恢复成功'); + await loadData(); + } finally { + roomStatusSavingId.value = ''; + } + }, + }); +} + loadData(); @@ -166,6 +201,14 @@ loadData();
+
diff --git a/apps/src/views/operate/room-profile.vue b/apps/src/views/operate/room-profile.vue index 8653210..3062249 100644 --- a/apps/src/views/operate/room-profile.vue +++ b/apps/src/views/operate/room-profile.vue @@ -55,6 +55,8 @@ function createEditForm() { roomCover: '', roomDesc: '', roomName: '', + sysOrigin: '', + userId: '', }; } @@ -69,6 +71,7 @@ const searchLoading = ref(false); const list = ref>>([]); const listNotData = ref(false); const loadMoreLoading = ref(false); +const roomStatusSavingId = ref(''); const editOpen = ref(false); const uploadLoading = ref(false); @@ -127,7 +130,7 @@ const columns = [ { dataIndex: 'room', key: 'room', title: '封面 / 房间信息', width: 320 }, { dataIndex: 'base', key: 'base', title: '房间信息', width: 180 }, { dataIndex: 'time', key: 'time', title: '时间', width: 220 }, - { dataIndex: 'actions', key: 'actions', title: '操作', width: 260 }, + { dataIndex: 'actions', key: 'actions', title: '操作', width: 320 }, ]; const roomEventSelectOptions = ROOM_EVENT_OPTIONS.map((item) => ({ label: item.name, @@ -247,6 +250,8 @@ function openEdit(record: Record) { roomCover: record.roomCover || '', roomDesc: record.roomDesc || '', roomName: record.roomName || '', + sysOrigin: record.sysOrigin || query.sysOrigin, + userId: record.userId || '', }); editRow.value = record; editOpen.value = true; @@ -300,6 +305,36 @@ async function handleSaveEdit() { } } +function isRoomClosed(record: Record) { + return record.event === 'CLOSE'; +} + +function handleToggleRoomStatus(record: Record) { + if (!record.id || !record.userId) { + message.warning('房间信息不完整,无法操作'); + return; + } + const nextEvent = isRoomClosed(record) ? 'AVAILABLE' : 'CLOSE'; + Modal.confirm({ + title: nextEvent === 'CLOSE' ? '是否确认关闭该房间?' : '是否确认恢复该房间?', + async onOk() { + roomStatusSavingId.value = record.id; + try { + await updateProfile({ + event: nextEvent, + id: record.id, + sysOrigin: record.sysOrigin || query.sysOrigin, + userId: record.userId, + }); + message.success(nextEvent === 'CLOSE' ? '关闭成功' : '恢复成功'); + await loadData(true); + } finally { + roomStatusSavingId.value = ''; + } + }, + }); +} + function openApproval(record: Record, type: string) { approvalType.value = type; approvalRoomId.value = record.id; @@ -494,6 +529,14 @@ async function handleCopy(value: number | string) { + diff --git a/apps/src/views/team/team-policy-page.vue b/apps/src/views/team/team-policy-page.vue index 2fae8ef..d73d1c1 100644 --- a/apps/src/views/team/team-policy-page.vue +++ b/apps/src/views/team/team-policy-page.vue @@ -1,10 +1,9 @@