feat: 网络层优化

This commit is contained in:
ZhuRui
2026-07-31 18:15:24 +08:00
parent 3b107e8d52
commit 3e94ce60ec
41 changed files with 900 additions and 87 deletions
+2 -2
View File
@@ -42,7 +42,7 @@ export async function getOperationLogList(
data: buildMockOperationLogPage(page, limit, pickFilters(params)),
};
}
return get('/admin/sys/operation/page', params as Record<string, any>);
return get('/sys/operation/page', params as Record<string, any>);
}
/** 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<string, any>);
return get('/tournament/operation/page', params as Record<string, any>);
}
/** @deprecated 使用 getOperationLogList */
+1 -1
View File
@@ -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<string, any>);
return get('/finance/paymentFlow/page', params as Record<string, any>);
}
+2 -2
View File
@@ -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<ApiResult<null>> {
return post('/admin/sys/role/del', { id });
return post('/sys/role/del', { id });
}
+2 -2
View File
@@ -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<string, any>);
return get('/finance/wallet/summary', params as Record<string, any>);
}
/** 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<string, any>);
return get('/finance/wallet/page', params as Record<string, any>);
}
+6 -6
View File
@@ -12,7 +12,7 @@ export type { WithdrawVO, WithdrawInfoVO, WithdrawQueryParams, PageData, ApiResu
const delay = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));
/** GET /admin/finance/withdraw/page — 提现列表分页 */
/** GET /finance/withdraw/page — 提现列表分页 */
export async function getWithdrawList(
params: WithdrawQueryParams,
): Promise<ApiResult<PageData<WithdrawVO>>> {
@@ -26,16 +26,16 @@ export async function getWithdrawList(
data: buildMockWithdrawPage(page, limit, params),
};
}
return get('/admin/finance/withdraw/page', params as Record<string, any>);
return get('/finance/withdraw/page', params as Record<string, any>);
}
/** GET /admin/finance/withdraw/info?id=xxx — 提现详情 */
/** GET /finance/withdraw/info?id=xxx — 提现详情 */
export async function getWithdrawInfo(id: number): Promise<ApiResult<WithdrawInfoVO>> {
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<ApiResult<null>> {
return post('/admin/finance/withdraw/audit', params);
return post('/finance/withdraw/audit', params);
}
+21 -16
View File
@@ -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;
}
};
+1 -1
View File
@@ -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 {
+72
View File
@@ -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<void>((resolve) => setTimeout(resolve, ms));
// ============================================================
// API 函数
// ============================================================
/** Banner 列表 */
export async function getBannerList(
params: BannerListQueryParams,
): Promise<ApiResult<TournamentAdminBannerListVO[]>> {
if (USE_MOCK) {
await delay(MOCK_DELAY);
return { code: 200, msg: 'success', data: MOCK_BANNER_LIST };
}
return get(bannerList, params as Record<string, any>);
}
/** 删除 Banner */
export function delBanner(id: string): Promise<ApiResult<Record<string, never>>> {
return post(bannerDel, { id });
}
/** 新增 Banner */
export function saveBanner(params: BannerSaveParams): Promise<ApiResult<Record<string, never>>> {
return post(bannerSave, params);
}
/** 编辑 Banner */
export function updateBanner(params: BannerSaveParams): Promise<ApiResult<Record<string, never>>> {
return post(bannerUpdate, params);
}
/** 启用/禁用 Banner */
export function toggleBannerActive(
params: BannerActiveParams,
): Promise<ApiResult<Record<string, never>>> {
return post(bannerActive, params);
}
@@ -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 {
@@ -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) {
+2 -2
View File
@@ -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 {
+97
View File
@@ -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<void>((resolve) => setTimeout(resolve, ms));
// ============================================================
// API 函数
// ============================================================
/** 赛事列表 - 列表分页 */
export async function getEventList(
params: EventListQueryParams,
): Promise<ApiResult<PageData<TournamentAdminVO>>> {
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<string, any>);
}
/** 赛事列表 - 赛事详情 */
export async function getEventDetail(id: string): Promise<ApiResult<TournamentAdminInfoVO>> {
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<ApiResult<PageData<TournamentAdminInfoSignupVO>>> {
if (USE_MOCK) {
await delay(MOCK_DELAY);
return {
code: 200,
msg: 'success',
data: buildMockSignupListPage(params),
};
}
return get(signupList, params as Record<string, any>);
}
/** 赛事上架 / 下架 */
export function toggleEventOnline(
params: ToggleOnlineParams,
): Promise<ApiResult<Record<string, never>>> {
return post(toggleOnline, params);
}
@@ -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 {
+53
View File
@@ -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<void>((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<ApiResult<PageData<TournamentAdminOperationPageVO>>> {
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<string, any>);
}
+2 -2
View File
@@ -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 {
@@ -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);
+2 -2
View File
@@ -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 || '操作失败');
+103
View File
@@ -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<void>((resolve) => setTimeout(resolve, ms));
// ============================================================
// API 函数
// ============================================================
/** 订单管理 - 订单分页 */
export async function getOrderList(
params: OrderListQueryParams,
): Promise<ApiResult<PageData<TournamentAdminOrderPageVO>>> {
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<string, any>);
}
/** 订单管理 - 订单详情 */
export async function getOrderDetail(
params: OrderDetailQueryParams,
): Promise<ApiResult<TournamentAdminOrderInfoVO>> {
if (USE_MOCK) {
await delay(MOCK_DELAY);
return {
code: 200,
msg: 'success',
data: { ...MOCK_ORDER_DETAIL },
};
}
return get(orderDetail, params as Record<string, any>);
}
/** 订单管理 - 订单详情 - 选手列表 */
export async function getOrderPlayerList(
params: OrderPlayerListQueryParams,
): Promise<ApiResult<PageData<TournamentAdminOrderInfoPageVO>>> {
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<string, any>);
}
/** 订单管理 - 重新退款 */
export function retryRefundOrder(
params: RetryRefundParams,
): Promise<ApiResult<Record<string, never>>> {
return post(retryRefund, params);
}
@@ -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 {
+2 -2
View File
@@ -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 || '操作失败');
+82
View File
@@ -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<void>((r) => setTimeout(r, ms));
// ============================================================
// API 函数
// ============================================================
/** 用户分页列表 */
export async function getUserList(
params: UserListQueryParams,
): Promise<ApiResult<PageData<TournamentAdminUserVO>>> {
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<string, any>);
}
/** 新增用户 */
export function saveUser(params: UserSaveParams): Promise<ApiResult<Record<string, never>>> {
if (USE_MOCK) return delay(MOCK_DELAY).then(() => ({ code: 200, msg: 'success', data: {} }));
return post(userSave, params);
}
/** 更新用户 */
export function updateUser(params: UserUpdateParams): Promise<ApiResult<Record<string, never>>> {
if (USE_MOCK) return delay(MOCK_DELAY).then(() => ({ code: 200, msg: 'success', data: {} }));
return post(userUpdate, params);
}
/** 启用/禁用用户 */
export function toggleUserActive(
params: UserActiveParams,
): Promise<ApiResult<Record<string, never>>> {
return post(userActive, params);
}
/** 修改密码 */
export function updateUserPwd(
params: UserUpdatePwdParams,
): Promise<ApiResult<Record<string, never>>> {
return post(userUpdatePwd, params);
}
+2 -2
View File
@@ -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 || '查询失败');
@@ -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<void>((r) => setTimeout(r, ms));
// ============================================================
// API 函数
// ============================================================
/** 支付流水分页 */
export async function getPaymentFlowList(
params: PaymentFlowQueryParams,
): Promise<ApiResult<PageData<PaymentFlowVO>>> {
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<string, any>);
}
@@ -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 });
@@ -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;
}
@@ -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<void>((r) => setTimeout(r, ms));
// ============================================================
// API 函数
// ============================================================
/** 钱包列表分页 */
export async function getWalletList(
params: WalletQueryParams,
): Promise<ApiResult<PageData<WalletSummaryVO>>> {
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<string, any>);
}
/** 交易明细分页 */
export async function getWalletTransactionList(
params: WalletTransactionQueryParams,
): Promise<ApiResult<PageData<WalletTransactionVO>>> {
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<string, any>);
}
@@ -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 });
@@ -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();
@@ -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<void>((r) => setTimeout(r, ms));
// ============================================================
// API 函数
// ============================================================
/** 提现列表分页 */
export async function getWithdrawList(
params: WithdrawQueryParams,
): Promise<ApiResult<PageData<WithdrawVO>>> {
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<string, any>);
}
/** 提现详情 */
export async function getWithdrawInfo(id: number): Promise<ApiResult<WithdrawInfoVO>> {
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<ApiResult<null>> {
return post(withdrawAudit, params);
}
@@ -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 });
+53
View File
@@ -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<void>((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<ApiResult<PageData<SysOperationLogVO>>> {
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<string, any>);
}
+2 -2
View File
@@ -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 });
}
@@ -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;
@@ -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 {
+1 -1
View File
@@ -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';
// ============================================================
// 规则
+85
View File
@@ -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<void>((r) => setTimeout(r, ms));
// ============================================================
// API 函数
// ============================================================
/** 角色列表分页 */
export async function getRoleList(
params: RoleListQueryParams,
): Promise<ApiResult<PageData<TournamentAdminRolePageVO>>> {
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<string, any>);
}
/** 角色下用户列表分页 */
export async function getRoleUsageUserList(
params: RoleUsageUserQueryParams,
): Promise<ApiResult<PageData<RoleUsageUserVO>>> {
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<string, any>);
}
/** 角色权限树 */
export async function getPermissionTree(
roleId: number | string,
): Promise<ApiResult<PermissionTreeNode[]>> {
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<ApiResult<null>> {
return post(roleDelete, { id });
}
+3 -3
View File
@@ -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 {
+3 -3
View File
@@ -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();
+82
View File
@@ -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<void>((r) => setTimeout(r, ms));
// ============================================================
// API 函数
// ============================================================
/** 用户分页列表 */
export async function getUserList(
params: UserListQueryParams,
): Promise<ApiResult<PageData<TournamentAdminUserVO>>> {
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<string, any>);
}
/** 新增用户 */
export function saveUser(params: UserSaveParams): Promise<ApiResult<Record<string, never>>> {
if (USE_MOCK) return delay(MOCK_DELAY).then(() => ({ code: 200, msg: 'success', data: {} }));
return post(userSave, params);
}
/** 更新用户 */
export function updateUser(params: UserUpdateParams): Promise<ApiResult<Record<string, never>>> {
if (USE_MOCK) return delay(MOCK_DELAY).then(() => ({ code: 200, msg: 'success', data: {} }));
return post(userUpdate, params);
}
/** 启用/禁用用户 */
export function toggleUserActive(
params: UserActiveParams,
): Promise<ApiResult<Record<string, never>>> {
return post(userActive, params);
}
/** 修改密码 */
export function updateUserPwd(
params: UserUpdatePwdParams,
): Promise<ApiResult<Record<string, never>>> {
return post(userUpdatePwd, params);
}
+2 -2
View File
@@ -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 {
+1 -1
View File
@@ -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'));
}