feat: 网络层优化
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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>);
|
||||
}
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
|
||||
@@ -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>);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>);
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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 || '操作失败');
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 || '操作失败');
|
||||
|
||||
@@ -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,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 });
|
||||
|
||||
@@ -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>);
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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';
|
||||
|
||||
// ============================================================
|
||||
// 规则
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,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 {
|
||||
|
||||
@@ -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'));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user