From 3e94ce60ec012b6d10552766d9bb3c7803e41e8d Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 31 Jul 2026 18:15:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BD=91=E7=BB=9C=E5=B1=82=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/logs/index.ts | 4 +- src/api/payments/index.ts | 2 +- src/api/roles/index.ts | 4 +- src/api/wallet/index.ts | 4 +- src/api/withdraw/index.ts | 12 +- src/components/pageTabs/index.tsx | 37 ++++--- src/layouts/BasicLayout.tsx | 2 +- src/pages/events/banner/model/services.ts | 72 ++++++++++++ .../events/banner/model/useBannerModel.ts | 10 +- .../list/components/EventDetailModal.tsx | 6 +- src/pages/events/list/index.tsx | 4 +- src/pages/events/list/model/services.ts | 97 +++++++++++++++++ .../events/list/model/useEventListModel.ts | 6 +- src/pages/events/logs/model/services.ts | 53 +++++++++ src/pages/events/logs/model/useLogModel.ts | 4 +- .../orders/components/OrderDetailModal.tsx | 6 +- src/pages/events/orders/index.tsx | 4 +- src/pages/events/orders/model/services.ts | 103 ++++++++++++++++++ .../events/orders/model/useOrderModel.ts | 4 +- src/pages/events/users/index.tsx | 4 +- src/pages/events/users/model/services.ts | 82 ++++++++++++++ src/pages/events/users/model/useUserModel.ts | 4 +- src/pages/finance/payments/model/services.ts | 44 ++++++++ .../payments/model/usePaymentsModel.ts | 8 +- .../wallet/components/WalletDetailModal.tsx | 4 +- src/pages/finance/wallet/model/services.ts | 63 +++++++++++ .../finance/wallet/model/useWalletModel.ts | 4 +- .../components/WithdrawDetailModal.tsx | 6 +- src/pages/finance/withdraw/model/services.ts | 78 +++++++++++++ .../withdraw/model/useWithdrawModel.ts | 4 +- src/pages/system/logs/model/services.ts | 53 +++++++++ src/pages/system/logs/model/useLogModel.ts | 4 +- .../system/roles/components/RoleFormModal.tsx | 4 +- .../system/roles/components/UserListModal.tsx | 4 +- src/pages/system/roles/controller.ts | 2 +- src/pages/system/roles/model/services.ts | 85 +++++++++++++++ src/pages/system/roles/model/useRoleModel.ts | 6 +- src/pages/system/users/index.tsx | 6 +- src/pages/system/users/model/services.ts | 82 ++++++++++++++ src/pages/system/users/model/useUserModel.ts | 4 +- src/utils/request.ts | 2 +- 41 files changed, 900 insertions(+), 87 deletions(-) create mode 100644 src/pages/events/banner/model/services.ts create mode 100644 src/pages/events/list/model/services.ts create mode 100644 src/pages/events/logs/model/services.ts create mode 100644 src/pages/events/orders/model/services.ts create mode 100644 src/pages/events/users/model/services.ts create mode 100644 src/pages/finance/payments/model/services.ts create mode 100644 src/pages/finance/wallet/model/services.ts create mode 100644 src/pages/finance/withdraw/model/services.ts create mode 100644 src/pages/system/logs/model/services.ts create mode 100644 src/pages/system/roles/model/services.ts create mode 100644 src/pages/system/users/model/services.ts diff --git a/src/api/logs/index.ts b/src/api/logs/index.ts index 2f85c25..ddbf68d 100644 --- a/src/api/logs/index.ts +++ b/src/api/logs/index.ts @@ -42,7 +42,7 @@ export async function getOperationLogList( data: buildMockOperationLogPage(page, limit, pickFilters(params)), }; } - return get('/admin/sys/operation/page', params as Record); + return get('/sys/operation/page', params as Record); } /** GET /admin/tournament/operation/page — 赛事操作日志分页 */ @@ -59,7 +59,7 @@ export async function getOperationLogs( data: buildMockEventOperationLogPage(page, limit, pickFilters(params)), }; } - return get('/admin/tournament/operation/page', params as Record); + return get('/tournament/operation/page', params as Record); } /** @deprecated 使用 getOperationLogList */ diff --git a/src/api/payments/index.ts b/src/api/payments/index.ts index ad6a10c..e5daba7 100644 --- a/src/api/payments/index.ts +++ b/src/api/payments/index.ts @@ -21,5 +21,5 @@ export async function getPaymentFlowList( const limit = Number(params.limit) || 10; return { code: 200, msg: 'success', data: buildMockPaymentFlowPage(page, limit, params) }; } - return get('/admin/finance/paymentFlow/page', params as Record); + return get('/finance/paymentFlow/page', params as Record); } diff --git a/src/api/roles/index.ts b/src/api/roles/index.ts index 9234e90..fcda64f 100644 --- a/src/api/roles/index.ts +++ b/src/api/roles/index.ts @@ -63,10 +63,10 @@ export async function getPermissionTree( const id = Number(roleId) || 0; return { code: 200, msg: 'success', data: buildMockPermissionTree(id) }; } - return get('/admin/sys/role/permissionList', { roleId: String(roleId) }); + return get('/sys/role/permissionList', { roleId: String(roleId) }); } /** POST /admin/sys/role/del — 删除角色 */ export async function deleteRole(id: number): Promise> { - return post('/admin/sys/role/del', { id }); + return post('/sys/role/del', { id }); } diff --git a/src/api/wallet/index.ts b/src/api/wallet/index.ts index 39ec46e..9d605d5 100644 --- a/src/api/wallet/index.ts +++ b/src/api/wallet/index.ts @@ -36,7 +36,7 @@ export async function getWalletList( const limit = Number(params.limit) || 10; return { code: 200, msg: 'success', data: buildMockWalletPage(page, limit, params) }; } - return get('/admin/finance/wallet/summary', params as Record); + return get('/finance/wallet/summary', params as Record); } /** GET /admin/finance/wallet/page — 交易明细分页 */ @@ -49,5 +49,5 @@ export async function getWalletTransactionList( const limit = Number(params.limit) || 10; return { code: 200, msg: 'success', data: buildMockWalletTransactionPage(page, limit, params) }; } - return get('/admin/finance/wallet/page', params as Record); + return get('/finance/wallet/page', params as Record); } diff --git a/src/api/withdraw/index.ts b/src/api/withdraw/index.ts index 39dd0ab..4c2c20b 100644 --- a/src/api/withdraw/index.ts +++ b/src/api/withdraw/index.ts @@ -12,7 +12,7 @@ export type { WithdrawVO, WithdrawInfoVO, WithdrawQueryParams, PageData, ApiResu const delay = (ms: number) => new Promise((r) => setTimeout(r, ms)); -/** GET /admin/finance/withdraw/page — 提现列表分页 */ +/** GET /finance/withdraw/page — 提现列表分页 */ export async function getWithdrawList( params: WithdrawQueryParams, ): Promise>> { @@ -26,16 +26,16 @@ export async function getWithdrawList( data: buildMockWithdrawPage(page, limit, params), }; } - return get('/admin/finance/withdraw/page', params as Record); + return get('/finance/withdraw/page', params as Record); } -/** GET /admin/finance/withdraw/info?id=xxx — 提现详情 */ +/** GET /finance/withdraw/info?id=xxx — 提现详情 */ export async function getWithdrawInfo(id: number): Promise> { if (USE_MOCK) { await delay(MOCK_DELAY); return { code: 200, msg: 'success', data: buildMockWithdrawInfo(id) }; } - return get('/admin/finance/withdraw/info', { id: String(id) }); + return get('/finance/withdraw/info', { id: String(id) }); } /** 提现审核请求参数 */ @@ -50,7 +50,7 @@ export interface WithdrawAuditParams { checkImg: string; } -/** POST /admin/finance/withdraw/audit — 审核提现 */ +/** POST /finance/withdraw/audit — 审核提现 */ export async function postWithdrawAudit(params: WithdrawAuditParams): Promise> { - return post('/admin/finance/withdraw/audit', params); + return post('/finance/withdraw/audit', params); } diff --git a/src/components/pageTabs/index.tsx b/src/components/pageTabs/index.tsx index ff9c669..524bc36 100644 --- a/src/components/pageTabs/index.tsx +++ b/src/components/pageTabs/index.tsx @@ -147,22 +147,27 @@ const PageTabs = defineComponent({ const activeIndex = props.tabs.findIndex((tab) => tab.path === props.activeKey); if (activeIndex === -1) return; - if (key === 'left') { - if (activeIndex === 0) { - message.warning('左侧没有可关闭的标签页'); - return; - } - props.onCloseLeft?.(props.activeKey); - } else if (key === 'right') { - if (activeIndex === props.tabs.length - 1) { - message.warning('右侧没有可关闭的标签页'); - return; - } - props.onCloseRight?.(props.activeKey); - } else if (key === 'other') { - props.onCloseOther?.(props.activeKey); - } else if (key === 'all') { - props.onCloseAll?.(); + switch (key) { + case 'left': + if (activeIndex === 0) { + message.warning('左侧没有可关闭的标签页'); + return; + } + props.onCloseLeft?.(props.activeKey); + break; + case 'right': + if (activeIndex === props.tabs.length - 1) { + message.warning('右侧没有可关闭的标签页'); + return; + } + props.onCloseRight?.(props.activeKey); + break; + case 'other': + props.onCloseOther?.(props.activeKey); + break; + case 'all': + props.onCloseAll?.(); + break; } }; diff --git a/src/layouts/BasicLayout.tsx b/src/layouts/BasicLayout.tsx index ae6b97b..fc6064b 100644 --- a/src/layouts/BasicLayout.tsx +++ b/src/layouts/BasicLayout.tsx @@ -135,7 +135,7 @@ export default defineComponent({ password: payload.newPassword, confirmPassword: payload.newPassword, }); - if (res.code === 200) { + if (res.code == 200) { message.success('密码修改成功'); setChangePwdVisible(false); } else { diff --git a/src/pages/events/banner/model/services.ts b/src/pages/events/banner/model/services.ts new file mode 100644 index 0000000..e3dec86 --- /dev/null +++ b/src/pages/events/banner/model/services.ts @@ -0,0 +1,72 @@ +/** + * Banner 管理 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get, post } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { MOCK_BANNER_LIST } from '@/config/mock/bannerList'; +import type { + BannerListQueryParams, + BannerSaveParams, + BannerDelParams, + BannerActiveParams, + TournamentAdminBannerListVO, + ApiResult, +} from '@/api/banner/types'; + +export type { + TournamentAdminBannerListVO, + BannerListQueryParams, + BannerSaveParams, + BannerDelParams, + BannerActiveParams, + ApiResult, +} from '@/api/banner/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const bannerList = '/manager/banner/list'; +const bannerDel = '/manager/banner/del'; +const bannerSave = '/manager/banner/save'; +const bannerUpdate = '/manager/banner/update'; +const bannerActive = '/manager/banner/active'; + +const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +/** Banner 列表 */ +export async function getBannerList( + params: BannerListQueryParams, +): Promise> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + return { code: 200, msg: 'success', data: MOCK_BANNER_LIST }; + } + return get(bannerList, params as Record); +} + +/** 删除 Banner */ +export function delBanner(id: string): Promise>> { + return post(bannerDel, { id }); +} + +/** 新增 Banner */ +export function saveBanner(params: BannerSaveParams): Promise>> { + return post(bannerSave, params); +} + +/** 编辑 Banner */ +export function updateBanner(params: BannerSaveParams): Promise>> { + return post(bannerUpdate, params); +} + +/** 启用/禁用 Banner */ +export function toggleBannerActive( + params: BannerActiveParams, +): Promise>> { + return post(bannerActive, params); +} diff --git a/src/pages/events/banner/model/useBannerModel.ts b/src/pages/events/banner/model/useBannerModel.ts index 99a67e2..85aa6ee 100644 --- a/src/pages/events/banner/model/useBannerModel.ts +++ b/src/pages/events/banner/model/useBannerModel.ts @@ -10,7 +10,7 @@ import { toggleBannerActive, type TournamentAdminBannerListVO, type BannerListQueryParams, -} from '@/api/banner'; +} from './services'; import { getProvinceCityOptions } from '@/utils/areaData'; // ============================================================ @@ -138,7 +138,7 @@ export function useBannerModel() { console.log('Banner列表查询参数:', queryParams); const res = await getBannerList(queryParams); - if (res.code === 200) { + if (res.code == 200) { setAllData(res.data); setPagination({ current: 1, pageSize: 10, total: res.data.length }); } else { @@ -205,7 +205,7 @@ export function useBannerModel() { const res = isEdit ? await updateBanner({ ...params, id: editingRecord.value.id }) : await saveBanner(params); - if (res.code === 200) { + if (res.code == 200) { message.success(isEdit ? '编辑成功' : '新增成功'); handleCloseModal(); handleSearch(); @@ -224,7 +224,7 @@ export function useBannerModel() { setLoading(true); try { const res = await delBanner(record.id); - if (res.code === 200) { + if (res.code == 200) { message.success('删除成功'); handleSearch(); } else { @@ -244,7 +244,7 @@ export function useBannerModel() { const newStatus = record.status === '1' ? '0' : '1'; const actionText = newStatus === '1' ? '启用' : '禁用'; const res = await toggleBannerActive({ id: record.id, status: newStatus }); - if (res.code === 200) { + if (res.code == 200) { message.success(`${actionText}成功`); handleSearch(); } else { diff --git a/src/pages/events/list/components/EventDetailModal.tsx b/src/pages/events/list/components/EventDetailModal.tsx index 10af427..9bc8816 100644 --- a/src/pages/events/list/components/EventDetailModal.tsx +++ b/src/pages/events/list/components/EventDetailModal.tsx @@ -8,7 +8,7 @@ import { type TournamentAdminInfoVO, type InnerCategoryVO, type TournamentAdminInfoSignupVO, -} from '@/api/events'; +} from '../model/services'; import { useState } from '@/hooks'; import styles from './EventDetailModal.module.less'; @@ -99,7 +99,7 @@ export default defineComponent({ page: String(page), limit: String(PAGE_SIZE), }); - if (res.code === 200) { + if (res.code == 200) { categoryPlayers[categoryId] = res.data.list; categoryPlayerTotal[categoryId] = res.data.total; categoryPlayerPage[categoryId] = page; @@ -127,7 +127,7 @@ export default defineComponent({ } const res = await getEventDetail(String(id)); - if (res.code === 200) { + if (res.code == 200) { setDetail(res.data); // 为每个组别加载第一页选手 for (const cat of res.data.categoryList) { diff --git a/src/pages/events/list/index.tsx b/src/pages/events/list/index.tsx index 4819bad..2251798 100644 --- a/src/pages/events/list/index.tsx +++ b/src/pages/events/list/index.tsx @@ -20,7 +20,7 @@ import { ID_CARD_OPTIONS, ID_CARD_IMAGE_OPTIONS, } from './model/useEventListModel'; -import { toggleEventOnline } from '@/api/events'; +import { toggleEventOnline } from './model/services'; import { regionOptions } from '@/utils/areaData'; import { useContainerSize, useState } from '@/hooks'; import EventRegulationModal from './components/EventRegulationModal'; @@ -152,7 +152,7 @@ export default defineComponent({ const online = isRemoved ? '1' : '0'; try { const res = await toggleEventOnline({ id: record.id, online }); - if (res.code === 200) { + if (res.code == 200) { message.success(`${actionText}成功`); handleSearch(); } else { diff --git a/src/pages/events/list/model/services.ts b/src/pages/events/list/model/services.ts new file mode 100644 index 0000000..03e3d22 --- /dev/null +++ b/src/pages/events/list/model/services.ts @@ -0,0 +1,97 @@ +/** + * 赛事列表 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get, post } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { MOCK_EVENT_DETAIL } from '@/config/mock/eventDetail'; +import { buildMockEventListPage } from '@/config/mock/eventList'; +import { buildMockSignupListPage } from '@/config/mock/eventSignup'; +import type { + EventListQueryParams, + SignupListQueryParams, + ToggleOnlineParams, + ApiResult, + PageData, + TournamentAdminVO, + TournamentAdminInfoVO, + TournamentAdminInfoSignupVO, +} from '@/api/events/types'; + +export type { + TournamentAdminVO, + TournamentAdminInfoVO, + TournamentAdminInfoSignupVO, + InnerCategoryVO, + EventListQueryParams, + SignupListQueryParams, + ToggleOnlineParams, + PageData, + ApiResult, +} from '@/api/events/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const eventList = '/manager/tm/page'; +const eventDetail = '/manager/tm/info'; +const signupList = '/manager/tm/info/signupPage'; +const toggleOnline = '/manager/tm/online'; + +const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +/** 赛事列表 - 列表分页 */ +export async function getEventList( + params: EventListQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { + code: 200, + msg: 'success', + data: buildMockEventListPage(page, limit), + }; + } + return get(eventList, params as Record); +} + +/** 赛事列表 - 赛事详情 */ +export async function getEventDetail(id: string): Promise> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + return { + code: 200, + msg: 'success', + data: { ...MOCK_EVENT_DETAIL }, + }; + } + return get(eventDetail, { id }); +} + +/** 赛事列表 - 赛事详情 - 人员列表 */ +export async function getSignupList( + params: SignupListQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + return { + code: 200, + msg: 'success', + data: buildMockSignupListPage(params), + }; + } + return get(signupList, params as Record); +} + +/** 赛事上架 / 下架 */ +export function toggleEventOnline( + params: ToggleOnlineParams, +): Promise>> { + return post(toggleOnline, params); +} diff --git a/src/pages/events/list/model/useEventListModel.ts b/src/pages/events/list/model/useEventListModel.ts index 5c30fa1..10e1da3 100644 --- a/src/pages/events/list/model/useEventListModel.ts +++ b/src/pages/events/list/model/useEventListModel.ts @@ -2,8 +2,8 @@ import { computed, reactive, toRef, Ref, h } from 'vue'; import { message } from 'ant-design-vue'; import { StatusTag, type StatusTagTone } from '@/components'; import { useState, useDebounce, useThrottleFn } from '@/hooks'; -import type { TournamentAdminVO, EventListQueryParams } from '@/api/events'; -import { getEventList } from '@/api/events'; +import type { TournamentAdminVO, EventListQueryParams } from './services'; +import { getEventList } from './services'; // ============================================================ // 常量 @@ -252,7 +252,7 @@ export function useEventListModel() { console.log('赛事列表查询参数:', queryParams); const res = await getEventList(queryParams); - if (res.code === 200) { + if (res.code == 200) { setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); } else { diff --git a/src/pages/events/logs/model/services.ts b/src/pages/events/logs/model/services.ts new file mode 100644 index 0000000..7102626 --- /dev/null +++ b/src/pages/events/logs/model/services.ts @@ -0,0 +1,53 @@ +/** + * 赛事操作日志 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { buildMockEventOperationLogPage } from '@/config/mock/eventOperationLogs'; +import type { + OperationLogQueryParams, + TournamentAdminOperationPageVO, + PageData, + ApiResult, +} from '@/api/logs/types'; + +export type { + TournamentAdminOperationPageVO, + OperationLogQueryParams, + PageData, + ApiResult, +} from '@/api/logs/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const operationLogs = '/tournament/operation/page'; + +const delay = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +function pickFilters(params: OperationLogQueryParams): OperationLogQueryParams { + const { page: _page, limit: _limit, ...filters } = params; + return filters; +} + +/** 赛事操作日志分页 */ +export async function getOperationLogs( + params: OperationLogQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { + code: 200, + msg: 'success', + data: buildMockEventOperationLogPage(page, limit, pickFilters(params)), + }; + } + return get(operationLogs, params as Record); +} diff --git a/src/pages/events/logs/model/useLogModel.ts b/src/pages/events/logs/model/useLogModel.ts index efe8bb5..a6ce42d 100644 --- a/src/pages/events/logs/model/useLogModel.ts +++ b/src/pages/events/logs/model/useLogModel.ts @@ -5,7 +5,7 @@ import { getOperationLogs, type TournamentAdminOperationPageVO, type OperationLogQueryParams, -} from '@/api/logs'; +} from './services'; // ============================================================ // 常量 @@ -110,7 +110,7 @@ export function useLogModel() { const params = buildQueryParams(); console.log('操作日志查询参数:', params); const res = await getOperationLogs(params); - if (res.code === 200) { + if (res.code == 200) { setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); } else { diff --git a/src/pages/events/orders/components/OrderDetailModal.tsx b/src/pages/events/orders/components/OrderDetailModal.tsx index b94ab68..3c1d666 100644 --- a/src/pages/events/orders/components/OrderDetailModal.tsx +++ b/src/pages/events/orders/components/OrderDetailModal.tsx @@ -8,7 +8,7 @@ import { type TournamentAdminOrderInfoVO, type InnerRefundInfo, type TournamentAdminOrderInfoPageVO, -} from '@/api/orders'; +} from '../model/services'; import styles from './OrderDetailModal.module.less'; interface OrderDetailModalProps { @@ -142,7 +142,7 @@ export default defineComponent({ page: String(page), limit: String(playerPageSize), }); - if (res.code === 200) { + if (res.code == 200) { setPlayers(res.data.list); setPlayerTotal(res.data.total); setPlayerPage(page); @@ -176,7 +176,7 @@ export default defineComponent({ const [detailRes] = await Promise.all([getOrderDetail(params), fetchPlayers(1)]); - if (detailRes.code === 200) { + if (detailRes.code == 200) { setDetail(detailRes.data); } setDetailLoading(false); diff --git a/src/pages/events/orders/index.tsx b/src/pages/events/orders/index.tsx index 804d015..9188d16 100644 --- a/src/pages/events/orders/index.tsx +++ b/src/pages/events/orders/index.tsx @@ -13,7 +13,7 @@ import { message, } from 'ant-design-vue'; import { useOrderModel, ORDER_STATUS_OPTIONS, REFUND_STATUS_OPTIONS } from './model/useOrderModel'; -import { retryRefundOrder } from '@/api/orders'; +import { retryRefundOrder } from './model/services'; import { useContainerSize, useState } from '@/hooks'; import OrderDetailModal from './components/OrderDetailModal'; import pageStyles from '@/assets/styles/pageLayout.module.less'; @@ -37,7 +37,7 @@ function promptReRefund(record: any) { onOk: async () => { try { const res = await retryRefundOrder({ payOrderNo: record.orderNo }); - if (res.code === 200) { + if (res.code == 200) { message.success('重新退款提交成功'); } else { message.error(res.msg || '操作失败'); diff --git a/src/pages/events/orders/model/services.ts b/src/pages/events/orders/model/services.ts new file mode 100644 index 0000000..80ac800 --- /dev/null +++ b/src/pages/events/orders/model/services.ts @@ -0,0 +1,103 @@ +/** + * 订单管理 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get, post } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { buildMockOrderListPage } from '@/config/mock/orderList'; +import { MOCK_ORDER_DETAIL } from '@/config/mock/orderDetail'; +import { buildMockOrderPlayerListPage } from '@/config/mock/orderPlayerList'; +import type { + OrderListQueryParams, + OrderDetailQueryParams, + OrderPlayerListQueryParams, + RetryRefundParams, + TournamentAdminOrderPageVO, + TournamentAdminOrderInfoVO, + TournamentAdminOrderInfoPageVO, + PageData, + ApiResult, +} from '@/api/orders/types'; + +export type { + TournamentAdminOrderPageVO, + TournamentAdminOrderInfoVO, + TournamentAdminOrderInfoPageVO, + InnerRefundInfo, + OrderListQueryParams, + OrderDetailQueryParams, + OrderPlayerListQueryParams, + RetryRefundParams, + PageData, + ApiResult, +} from '@/api/orders/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const orderList = '/manager/order/page'; +const orderDetail = '/manager/order/info'; +const orderPlayerList = '/manager/order/info/page'; +const retryRefund = '/manager/order/retryRefund'; + +const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +/** 订单管理 - 订单分页 */ +export async function getOrderList( + params: OrderListQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { + code: 200, + msg: 'success', + data: buildMockOrderListPage(page, limit), + }; + } + return get(orderList, params as Record); +} + +/** 订单管理 - 订单详情 */ +export async function getOrderDetail( + params: OrderDetailQueryParams, +): Promise> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + return { + code: 200, + msg: 'success', + data: { ...MOCK_ORDER_DETAIL }, + }; + } + return get(orderDetail, params as Record); +} + +/** 订单管理 - 订单详情 - 选手列表 */ +export async function getOrderPlayerList( + params: OrderPlayerListQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { + code: 200, + msg: 'success', + data: buildMockOrderPlayerListPage(page, limit), + }; + } + return get(orderPlayerList, params as Record); +} + +/** 订单管理 - 重新退款 */ +export function retryRefundOrder( + params: RetryRefundParams, +): Promise>> { + return post(retryRefund, params); +} diff --git a/src/pages/events/orders/model/useOrderModel.ts b/src/pages/events/orders/model/useOrderModel.ts index bf163fb..e3d7dc2 100644 --- a/src/pages/events/orders/model/useOrderModel.ts +++ b/src/pages/events/orders/model/useOrderModel.ts @@ -6,7 +6,7 @@ import { getOrderList, type TournamentAdminOrderPageVO, type OrderListQueryParams, -} from '@/api/orders'; +} from './services'; import { MOCK_ORDER_SUMMARY } from '@/config/mock/orderList'; // ============================================================ @@ -228,7 +228,7 @@ export function useOrderModel() { console.log('订单列表查询参数:', queryParams); const res = await getOrderList(queryParams); - if (res.code === 200) { + if (res.code == 200) { setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); } else { diff --git a/src/pages/events/users/index.tsx b/src/pages/events/users/index.tsx index 214199e..f330196 100644 --- a/src/pages/events/users/index.tsx +++ b/src/pages/events/users/index.tsx @@ -11,7 +11,7 @@ import { message, } from 'ant-design-vue'; import { useUserModel, USER_STATUS_OPTIONS, ROLE_OPTIONS } from './model/useUserModel'; -import { toggleUserActive } from '@/api/users'; +import { toggleUserActive } from './model/services'; import { useContainerSize } from '@/hooks'; import pageStyles from '@/assets/styles/pageLayout.module.less'; @@ -41,7 +41,7 @@ export default defineComponent({ onOk: async () => { try { const res = await toggleUserActive({ userId: record.id, status: isActive ? '0' : '1' }); - if (res.code === 200) { + if (res.code == 200) { message.success(`${actionText}成���`); handleSearch(); } else message.error(res.msg || '操作失败'); diff --git a/src/pages/events/users/model/services.ts b/src/pages/events/users/model/services.ts new file mode 100644 index 0000000..91f90a4 --- /dev/null +++ b/src/pages/events/users/model/services.ts @@ -0,0 +1,82 @@ +/** + * 用户列表 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get, post } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { buildMockUserListPage } from '@/config/mock/userList'; +import type { + UserListQueryParams, + UserSaveParams, + UserUpdateParams, + UserActiveParams, + UserUpdatePwdParams, + TournamentAdminUserVO, + PageData, + ApiResult, +} from '@/api/users/types'; + +export type { + TournamentAdminUserVO, + UserListQueryParams, + UserSaveParams, + UserUpdateParams, + UserActiveParams, + UserUpdatePwdParams, + PageData, + ApiResult, +} from '@/api/users/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const userList = '/sys/user/page'; +const userSave = '/sys/user/save'; +const userUpdate = '/sys/user/update'; +const userActive = '/sys/user/active'; +const userUpdatePwd = '/sys/user/updatepwd'; + +const delay = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +/** 用户分页列表 */ +export async function getUserList( + params: UserListQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { code: 200, msg: 'success', data: buildMockUserListPage(page, limit) }; + } + return get(userList, params as Record); +} + +/** 新增用户 */ +export function saveUser(params: UserSaveParams): Promise>> { + if (USE_MOCK) return delay(MOCK_DELAY).then(() => ({ code: 200, msg: 'success', data: {} })); + return post(userSave, params); +} + +/** 更新用户 */ +export function updateUser(params: UserUpdateParams): Promise>> { + if (USE_MOCK) return delay(MOCK_DELAY).then(() => ({ code: 200, msg: 'success', data: {} })); + return post(userUpdate, params); +} + +/** 启用/禁用用户 */ +export function toggleUserActive( + params: UserActiveParams, +): Promise>> { + return post(userActive, params); +} + +/** 修改密码 */ +export function updateUserPwd( + params: UserUpdatePwdParams, +): Promise>> { + return post(userUpdatePwd, params); +} diff --git a/src/pages/events/users/model/useUserModel.ts b/src/pages/events/users/model/useUserModel.ts index 189349d..dbf1458 100644 --- a/src/pages/events/users/model/useUserModel.ts +++ b/src/pages/events/users/model/useUserModel.ts @@ -2,7 +2,7 @@ import { computed, reactive, toRef, Ref, h } from 'vue'; import { message } from 'ant-design-vue'; import { StatusTag, type StatusTagTone } from '@/components'; import { useState, useDebounce, useThrottleFn } from '@/hooks'; -import { getUserList, type TournamentAdminUserVO, type UserListQueryParams } from '@/api/users'; +import { getUserList, type TournamentAdminUserVO, type UserListQueryParams } from './services'; // ============================================================ // 常量 @@ -86,7 +86,7 @@ export function useUserModel() { const params = buildQueryParams(); console.log('用户列表查询参数:', params); const res = await getUserList(params); - if (res.code === 200) { + if (res.code == 200) { setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); } else message.error(res.msg || '查询失败'); diff --git a/src/pages/finance/payments/model/services.ts b/src/pages/finance/payments/model/services.ts new file mode 100644 index 0000000..7b1ced6 --- /dev/null +++ b/src/pages/finance/payments/model/services.ts @@ -0,0 +1,44 @@ +/** + * 支付流水 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { buildMockPaymentFlowPage } from '@/config/mock/paymentFlow'; +import type { + PaymentFlowQueryParams, + PaymentFlowVO, + PageData, + ApiResult, +} from '@/api/payments/types'; + +export type { + PaymentFlowVO, + PaymentFlowQueryParams, + PageData, + ApiResult, +} from '@/api/payments/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const paymentFlowList = '/finance/paymentFlow/page'; + +const delay = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +/** 支付流水分页 */ +export async function getPaymentFlowList( + params: PaymentFlowQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { code: 200, msg: 'success', data: buildMockPaymentFlowPage(page, limit, params) }; + } + return get(paymentFlowList, params as Record); +} diff --git a/src/pages/finance/payments/model/usePaymentsModel.ts b/src/pages/finance/payments/model/usePaymentsModel.ts index 6d4bd84..45ed3ed 100644 --- a/src/pages/finance/payments/model/usePaymentsModel.ts +++ b/src/pages/finance/payments/model/usePaymentsModel.ts @@ -1,10 +1,6 @@ import { computed, reactive, toRef, Ref } from 'vue'; import { useState, useDebounce, useThrottleFn } from '@/hooks'; -import { - getPaymentFlowList, - type PaymentFlowVO, - type PaymentFlowQueryParams, -} from '@/api/payments'; +import { getPaymentFlowList, type PaymentFlowVO, type PaymentFlowQueryParams } from './services'; import dayjs from 'dayjs'; // ============================================================ @@ -110,7 +106,7 @@ export function usePaymentsModel() { const queryParams = buildQueryParams(); console.log('支付流水查询参数:', queryParams); const res = await getPaymentFlowList(queryParams); - if (res.code === 200) { + if (res.code == 200) { console.log('支付流水查询结果:', { total: res.data.total, count: res.data.list.length }); setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); diff --git a/src/pages/finance/wallet/components/WalletDetailModal.tsx b/src/pages/finance/wallet/components/WalletDetailModal.tsx index 65ef92e..a1002c6 100644 --- a/src/pages/finance/wallet/components/WalletDetailModal.tsx +++ b/src/pages/finance/wallet/components/WalletDetailModal.tsx @@ -5,7 +5,7 @@ import { getWalletTransactionList, type WalletTransactionVO, type WalletTransactionQueryParams, -} from '@/api/wallet'; +} from '../model/services'; import { TRANSACTION_TYPE_OPTIONS, TRANSACTION_STATUS_OPTIONS, @@ -65,7 +65,7 @@ export default defineComponent({ try { const params = buildQueryParams(); const res = await getWalletTransactionList(params); - if (res.code === 200) { + if (res.code == 200) { dataSource.value = res.data.list; pagination.total = res.data.total; } diff --git a/src/pages/finance/wallet/model/services.ts b/src/pages/finance/wallet/model/services.ts new file mode 100644 index 0000000..fd431aa --- /dev/null +++ b/src/pages/finance/wallet/model/services.ts @@ -0,0 +1,63 @@ +/** + * 用户钱包 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { buildMockWalletPage } from '@/config/mock/walletList'; +import { buildMockWalletTransactionPage } from '@/config/mock/walletTransactions'; +import type { + WalletQueryParams, + WalletSummaryVO, + WalletTransactionQueryParams, + WalletTransactionVO, + PageData, + ApiResult, +} from '@/api/wallet/types'; + +export type { + WalletSummaryVO, + WalletQueryParams, + WalletTransactionVO, + WalletTransactionQueryParams, + PageData, + ApiResult, +} from '@/api/wallet/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const walletList = '/finance/wallet/summary'; +const walletTransaction = '/finance/wallet/page'; + +const delay = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +/** 钱包列表分页 */ +export async function getWalletList( + params: WalletQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { code: 200, msg: 'success', data: buildMockWalletPage(page, limit, params) }; + } + return get(walletList, params as Record); +} + +/** 交易明细分页 */ +export async function getWalletTransactionList( + params: WalletTransactionQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { code: 200, msg: 'success', data: buildMockWalletTransactionPage(page, limit, params) }; + } + return get(walletTransaction, params as Record); +} diff --git a/src/pages/finance/wallet/model/useWalletModel.ts b/src/pages/finance/wallet/model/useWalletModel.ts index 9b72b61..437496a 100644 --- a/src/pages/finance/wallet/model/useWalletModel.ts +++ b/src/pages/finance/wallet/model/useWalletModel.ts @@ -1,6 +1,6 @@ import { computed, reactive, toRef, Ref } from 'vue'; import { useState, useDebounce, useThrottleFn } from '@/hooks'; -import { getWalletList, type WalletSummaryVO, type WalletQueryParams } from '@/api/wallet'; +import { getWalletList, type WalletSummaryVO, type WalletQueryParams } from './services'; // ============================================================ // 常量(value 对齐 API 数字码) @@ -141,7 +141,7 @@ export function useWalletModel() { const params = buildQueryParams(); console.log('钱包列表查询参数:', params); const res = await getWalletList(params); - if (res.code === 200) { + if (res.code == 200) { console.log('钱包列表查询结果:', { total: res.data.total, count: res.data.list.length }); setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); diff --git a/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx b/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx index faae718..9e83023 100644 --- a/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx +++ b/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx @@ -1,7 +1,7 @@ import { defineComponent, reactive, ref, watch } from 'vue'; import { Modal, Radio, Input, Button, Upload, Image, Spin, message } from 'ant-design-vue'; import { PlusOutlined } from '@ant-design/icons-vue'; -import { getWithdrawInfo, postWithdrawAudit, type WithdrawInfoVO } from '@/api/withdraw'; +import { getWithdrawInfo, postWithdrawAudit, type WithdrawInfoVO } from '../model/services'; import { AUDIT_STATUS_MAP, PAY_STATUS_MAP } from '../model/useWithdrawModel'; import styles from './WithdrawDetailModal.module.less'; @@ -39,7 +39,7 @@ export default defineComponent({ detail.value = null; try { const res = await getWithdrawInfo(id); - if (res.code === 200) detail.value = res.data; + if (res.code == 200) detail.value = res.data; } catch { // 网络层已统一提示 } finally { @@ -92,7 +92,7 @@ export default defineComponent({ checkMsg: auditForm.remark.trim(), checkImg, }); - if (res.code === 200) { + if (res.code == 200) { message.success(auditForm.pass ? '已审核通过' : '已审核驳回'); props.onAudited?.(); props.onClose(); diff --git a/src/pages/finance/withdraw/model/services.ts b/src/pages/finance/withdraw/model/services.ts new file mode 100644 index 0000000..44763cb --- /dev/null +++ b/src/pages/finance/withdraw/model/services.ts @@ -0,0 +1,78 @@ +/** + * 提现管理 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get, post } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { buildMockWithdrawPage } from '@/config/mock/withdrawList'; +import { buildMockWithdrawInfo } from '@/config/mock/withdrawInfo'; +import type { + WithdrawQueryParams, + WithdrawVO, + WithdrawInfoVO, + PageData, + ApiResult, +} from '@/api/withdraw/types'; + +export type { + WithdrawVO, + WithdrawInfoVO, + WithdrawQueryParams, + PageData, + ApiResult, +} from '@/api/withdraw/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const withdrawList = '/finance/withdraw/page'; +const withdrawInfo = '/finance/withdraw/info'; +const withdrawAudit = '/finance/withdraw/audit'; + +const delay = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +/** 提现列表分页 */ +export async function getWithdrawList( + params: WithdrawQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { + code: 200, + msg: 'success', + data: buildMockWithdrawPage(page, limit, params), + }; + } + return get(withdrawList, params as Record); +} + +/** 提现详情 */ +export async function getWithdrawInfo(id: number): Promise> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + return { code: 200, msg: 'success', data: buildMockWithdrawInfo(id) }; + } + return get(withdrawInfo, { id: String(id) }); +} + +/** 审核提现请求参数 */ +export interface WithdrawAuditParams { + id: string; + /** 1=通过,2=驳回 */ + audit: string; + /** 审核内容 */ + checkMsg: string; + /** 审核图片(逗号拼接的 URL) */ + checkImg: string; +} + +/** 审核提现 */ +export function postWithdrawAudit(params: WithdrawAuditParams): Promise> { + return post(withdrawAudit, params); +} diff --git a/src/pages/finance/withdraw/model/useWithdrawModel.ts b/src/pages/finance/withdraw/model/useWithdrawModel.ts index 9726b9e..43410f7 100644 --- a/src/pages/finance/withdraw/model/useWithdrawModel.ts +++ b/src/pages/finance/withdraw/model/useWithdrawModel.ts @@ -1,6 +1,6 @@ import { computed, reactive, toRef, Ref } from 'vue'; import { useState, useDebounce, useThrottleFn } from '@/hooks'; -import { getWithdrawList, type WithdrawVO, type WithdrawQueryParams } from '@/api/withdraw'; +import { getWithdrawList, type WithdrawVO, type WithdrawQueryParams } from './services'; // ============================================================ // 常量 @@ -136,7 +136,7 @@ export function useWithdrawModel() { const queryParams = buildQueryParams(); console.log('提现列表查询参数:', queryParams); const res = await getWithdrawList(queryParams); - if (res.code === 200) { + if (res.code == 200) { console.log('提现列表查询结果:', { total: res.data.total, count: res.data.list.length }); setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); diff --git a/src/pages/system/logs/model/services.ts b/src/pages/system/logs/model/services.ts new file mode 100644 index 0000000..0ae76db --- /dev/null +++ b/src/pages/system/logs/model/services.ts @@ -0,0 +1,53 @@ +/** + * 系统操作日志 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { buildMockOperationLogPage } from '@/config/mock/operationLogs'; +import type { + OperationLogQueryParams, + SysOperationLogVO, + PageData, + ApiResult, +} from '@/api/logs/types'; + +export type { + SysOperationLogVO, + OperationLogQueryParams, + PageData, + ApiResult, +} from '@/api/logs/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const operationLogList = '/sys/operation/page'; + +const delay = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +function pickFilters(params: OperationLogQueryParams): OperationLogQueryParams { + const { page: _page, limit: _limit, ...filters } = params; + return filters; +} + +/** 系统操作日志分页 */ +export async function getOperationLogList( + params: OperationLogQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { + code: 200, + msg: 'success', + data: buildMockOperationLogPage(page, limit, pickFilters(params)), + }; + } + return get(operationLogList, params as Record); +} diff --git a/src/pages/system/logs/model/useLogModel.ts b/src/pages/system/logs/model/useLogModel.ts index 394216c..6a269be 100644 --- a/src/pages/system/logs/model/useLogModel.ts +++ b/src/pages/system/logs/model/useLogModel.ts @@ -5,7 +5,7 @@ import { getOperationLogList, type SysOperationLogVO, type OperationLogQueryParams, -} from '@/api/logs'; +} from './services'; // ============================================================ // 常量 @@ -106,7 +106,7 @@ export function useLogModel() { try { const queryParams = buildQueryParams(); const res = await getOperationLogList(queryParams); - if (res.code === 200) { + if (res.code == 200) { setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); } diff --git a/src/pages/system/roles/components/RoleFormModal.tsx b/src/pages/system/roles/components/RoleFormModal.tsx index 2b65e7e..e1effd5 100644 --- a/src/pages/system/roles/components/RoleFormModal.tsx +++ b/src/pages/system/roles/components/RoleFormModal.tsx @@ -1,7 +1,7 @@ import { defineComponent, ref, reactive, watch } from 'vue'; import { Modal, Form, Input, Tree, Button, Spin, message } from 'ant-design-vue'; import type { TreeProps } from 'ant-design-vue'; -import { getPermissionTree, type PermissionTreeNode } from '@/api/roles'; +import { getPermissionTree, type PermissionTreeNode } from '../model/services'; import { roleNameRules, buildTreeData, @@ -49,7 +49,7 @@ export default defineComponent({ treeLoading.value = true; try { const res = await getPermissionTree(roleId); - if (res.code === 200 && res.data) { + if (res.code == 200 && res.data) { rawApiTree.value = res.data; const result = buildTreeData(res.data); treeData.value = result.treeData; diff --git a/src/pages/system/roles/components/UserListModal.tsx b/src/pages/system/roles/components/UserListModal.tsx index 04ef329..19456cc 100644 --- a/src/pages/system/roles/components/UserListModal.tsx +++ b/src/pages/system/roles/components/UserListModal.tsx @@ -3,7 +3,7 @@ import { Modal, Form, Input, Table, Button, Space, Pagination, message } from 'a import { h } from 'vue'; import { StatusTag, type StatusTagTone } from '@/components'; import { useState, useThrottleFn, useEffect } from '@/hooks'; -import { getRoleUsageUserList, type RoleUsageUserVO } from '@/api/roles'; +import { getRoleUsageUserList, type RoleUsageUserVO } from '../model/services'; import styles from './UserListModal.module.less'; /** 状态映射 */ @@ -60,7 +60,7 @@ export default defineComponent({ roleId: String(props.roleId), ...(filterForm.text.trim() ? { text: filterForm.text.trim() } : {}), }); - if (res.code === 200) { + if (res.code == 200) { setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); } else { diff --git a/src/pages/system/roles/controller.ts b/src/pages/system/roles/controller.ts index 78e1ed2..4c31f20 100644 --- a/src/pages/system/roles/controller.ts +++ b/src/pages/system/roles/controller.ts @@ -4,7 +4,7 @@ * 集中管理角色表单的规则、权限树转换工具。 */ import type { Rule } from 'ant-design-vue/es/form'; -import type { PermissionTreeNode } from '@/api/roles'; +import type { PermissionTreeNode } from './model/services'; // ============================================================ // 规则 diff --git a/src/pages/system/roles/model/services.ts b/src/pages/system/roles/model/services.ts new file mode 100644 index 0000000..8fe963e --- /dev/null +++ b/src/pages/system/roles/model/services.ts @@ -0,0 +1,85 @@ +/** + * 角色权限 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get, post } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { buildMockRoleListPage } from '@/config/mock/roleList'; +import { buildMockRoleUsageUserPage } from '@/config/mock/roleUsageUser'; +import { buildMockPermissionTree } from '@/config/mock/permissionTree'; +import type { + RoleListQueryParams, + RoleUsageUserQueryParams, + TournamentAdminRolePageVO, + RoleUsageUserVO, + PermissionTreeNode, + PageData, + ApiResult, +} from '@/api/roles/types'; + +export type { + TournamentAdminRolePageVO, + RoleUsageUserVO, + RoleListQueryParams, + RoleUsageUserQueryParams, + PermissionTreeNode, + PageData, + ApiResult, +} from '@/api/roles/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const roleList = '/sys/role/page'; +const roleUsageUserList = '/sys/role/usageUserPage'; +const rolePermissionList = '/sys/role/permissionList'; +const roleDelete = '/sys/role/del'; + +const delay = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +/** 角色列表分页 */ +export async function getRoleList( + params: RoleListQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { code: 200, msg: 'success', data: buildMockRoleListPage(page, limit) }; + } + return get(roleList, params as Record); +} + +/** 角色下用户列表分页 */ +export async function getRoleUsageUserList( + params: RoleUsageUserQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { code: 200, msg: 'success', data: buildMockRoleUsageUserPage(page, limit) }; + } + return get(roleUsageUserList, params as Record); +} + +/** 角色权限树 */ +export async function getPermissionTree( + roleId: number | string, +): Promise> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const id = Number(roleId) || 0; + return { code: 200, msg: 'success', data: buildMockPermissionTree(id) }; + } + return get(rolePermissionList, { roleId: String(roleId) }); +} + +/** 删除角色 */ +export function deleteRole(id: number): Promise> { + return post(roleDelete, { id }); +} diff --git a/src/pages/system/roles/model/useRoleModel.ts b/src/pages/system/roles/model/useRoleModel.ts index cad00e3..7355ebe 100644 --- a/src/pages/system/roles/model/useRoleModel.ts +++ b/src/pages/system/roles/model/useRoleModel.ts @@ -6,7 +6,7 @@ import { deleteRole, type TournamentAdminRolePageVO, type RoleListQueryParams, -} from '@/api/roles'; +} from './services'; // ============================================================ // Model @@ -76,7 +76,7 @@ export function useRoleModel() { const queryParams = buildQueryParams(); console.log('角色列表查询参数:', queryParams); const res = await getRoleList(queryParams); - if (res.code === 200) { + if (res.code == 200) { setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); } else { @@ -142,7 +142,7 @@ export function useRoleModel() { setLoading(true); try { const res = await deleteRole(record.roleId); - if (res.code === 200) { + if (res.code == 200) { setDataSource(dataSource.value.filter((item: any) => item.roleId !== record.roleId)); message.success('删除成功'); } else { diff --git a/src/pages/system/users/index.tsx b/src/pages/system/users/index.tsx index 98fdcdb..0eb6caf 100644 --- a/src/pages/system/users/index.tsx +++ b/src/pages/system/users/index.tsx @@ -11,7 +11,7 @@ import { message, } from 'ant-design-vue'; import { useUserModel, ROLE_OPTIONS, USER_STATUS_OPTIONS } from './model/useUserModel'; -import { toggleUserActive, saveUser, updateUser } from '@/api/users'; +import { toggleUserActive, saveUser, updateUser } from './model/services'; import { useState, useThrottleFn, useContainerSize } from '@/hooks'; import UserFormModal from './components/UserFormModal'; import pageStyles from '@/assets/styles/pageLayout.module.less'; @@ -94,7 +94,7 @@ export default defineComponent({ userId: record.id, status: isActive ? '0' : '1', }); - if (res.code === 200) { + if (res.code == 200) { message.success(`${actionText}成功`); handleSearch(); } else { @@ -149,7 +149,7 @@ export default defineComponent({ confirmPassword: formPayload.password, }); } - if (res.code === 200) { + if (res.code == 200) { message.success(editingRecord.value ? '编辑成功' : '新增成功'); handleCloseModal(); handleSearch(); diff --git a/src/pages/system/users/model/services.ts b/src/pages/system/users/model/services.ts new file mode 100644 index 0000000..eef5609 --- /dev/null +++ b/src/pages/system/users/model/services.ts @@ -0,0 +1,82 @@ +/** + * 用户管理 - 接口服务 + * 该页面使用的所有接口集中管理 + */ +import { get, post } from '@/utils/request'; +import { USE_MOCK, MOCK_DELAY } from '@/config/mock'; +import { buildMockUserListPage } from '@/config/mock/userList'; +import type { + UserListQueryParams, + UserSaveParams, + UserUpdateParams, + UserActiveParams, + UserUpdatePwdParams, + TournamentAdminUserVO, + PageData, + ApiResult, +} from '@/api/users/types'; + +export type { + TournamentAdminUserVO, + UserListQueryParams, + UserSaveParams, + UserUpdateParams, + UserActiveParams, + UserUpdatePwdParams, + PageData, + ApiResult, +} from '@/api/users/types'; + +// ============================================================ +// URL 常量 +// ============================================================ +const userList = '/sys/user/page'; +const userSave = '/sys/user/save'; +const userUpdate = '/sys/user/update'; +const userActive = '/sys/user/active'; +const userUpdatePwd = '/sys/user/updatepwd'; + +const delay = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +// ============================================================ +// API 函数 +// ============================================================ + +/** 用户分页列表 */ +export async function getUserList( + params: UserListQueryParams, +): Promise>> { + if (USE_MOCK) { + await delay(MOCK_DELAY); + const page = Number(params.page) || 1; + const limit = Number(params.limit) || 10; + return { code: 200, msg: 'success', data: buildMockUserListPage(page, limit) }; + } + return get(userList, params as Record); +} + +/** 新增用户 */ +export function saveUser(params: UserSaveParams): Promise>> { + if (USE_MOCK) return delay(MOCK_DELAY).then(() => ({ code: 200, msg: 'success', data: {} })); + return post(userSave, params); +} + +/** 更新用户 */ +export function updateUser(params: UserUpdateParams): Promise>> { + if (USE_MOCK) return delay(MOCK_DELAY).then(() => ({ code: 200, msg: 'success', data: {} })); + return post(userUpdate, params); +} + +/** 启用/禁用用户 */ +export function toggleUserActive( + params: UserActiveParams, +): Promise>> { + return post(userActive, params); +} + +/** 修改密码 */ +export function updateUserPwd( + params: UserUpdatePwdParams, +): Promise>> { + return post(userUpdatePwd, params); +} diff --git a/src/pages/system/users/model/useUserModel.ts b/src/pages/system/users/model/useUserModel.ts index 9087c09..16b9c1f 100644 --- a/src/pages/system/users/model/useUserModel.ts +++ b/src/pages/system/users/model/useUserModel.ts @@ -2,7 +2,7 @@ import { computed, reactive, toRef, Ref, h } from 'vue'; import { message } from 'ant-design-vue'; import { StatusTag, type StatusTagTone } from '@/components'; import { useState, useDebounce, useThrottleFn } from '@/hooks'; -import { getUserList, type TournamentAdminUserVO, type UserListQueryParams } from '@/api/users'; +import { getUserList, type TournamentAdminUserVO, type UserListQueryParams } from './services'; // ============================================================ // 常量 @@ -106,7 +106,7 @@ export function useUserModel() { const queryParams = buildQueryParams(); console.log('用户列表查询参数:', queryParams); const res = await getUserList(queryParams); - if (res.code === 200) { + if (res.code == 200) { setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); } else { diff --git a/src/utils/request.ts b/src/utils/request.ts index 92b1385..e386511 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -96,7 +96,7 @@ const request = ( const data = await res.json(); - if (data.code === 401) { + if (data.code == 401) { handleUnauthorized(data.msg); return Promise.reject(new Error(data.msg || 'Unauthorized')); }