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
+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 || '查询失败');