feat: 网络层优化
This commit is contained in:
@@ -42,7 +42,7 @@ export async function getOperationLogList(
|
|||||||
data: buildMockOperationLogPage(page, limit, pickFilters(params)),
|
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 — 赛事操作日志分页 */
|
/** GET /admin/tournament/operation/page — 赛事操作日志分页 */
|
||||||
@@ -59,7 +59,7 @@ export async function getOperationLogs(
|
|||||||
data: buildMockEventOperationLogPage(page, limit, pickFilters(params)),
|
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 */
|
/** @deprecated 使用 getOperationLogList */
|
||||||
|
|||||||
@@ -21,5 +21,5 @@ export async function getPaymentFlowList(
|
|||||||
const limit = Number(params.limit) || 10;
|
const limit = Number(params.limit) || 10;
|
||||||
return { code: 200, msg: 'success', data: buildMockPaymentFlowPage(page, limit, params) };
|
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;
|
const id = Number(roleId) || 0;
|
||||||
return { code: 200, msg: 'success', data: buildMockPermissionTree(id) };
|
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 — 删除角色 */
|
/** POST /admin/sys/role/del — 删除角色 */
|
||||||
export async function deleteRole(id: number): Promise<ApiResult<null>> {
|
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;
|
const limit = Number(params.limit) || 10;
|
||||||
return { code: 200, msg: 'success', data: buildMockWalletPage(page, limit, params) };
|
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 — 交易明细分页 */
|
/** GET /admin/finance/wallet/page — 交易明细分页 */
|
||||||
@@ -49,5 +49,5 @@ export async function getWalletTransactionList(
|
|||||||
const limit = Number(params.limit) || 10;
|
const limit = Number(params.limit) || 10;
|
||||||
return { code: 200, msg: 'success', data: buildMockWalletTransactionPage(page, limit, params) };
|
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));
|
const delay = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));
|
||||||
|
|
||||||
/** GET /admin/finance/withdraw/page — 提现列表分页 */
|
/** GET /finance/withdraw/page — 提现列表分页 */
|
||||||
export async function getWithdrawList(
|
export async function getWithdrawList(
|
||||||
params: WithdrawQueryParams,
|
params: WithdrawQueryParams,
|
||||||
): Promise<ApiResult<PageData<WithdrawVO>>> {
|
): Promise<ApiResult<PageData<WithdrawVO>>> {
|
||||||
@@ -26,16 +26,16 @@ export async function getWithdrawList(
|
|||||||
data: buildMockWithdrawPage(page, limit, params),
|
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>> {
|
export async function getWithdrawInfo(id: number): Promise<ApiResult<WithdrawInfoVO>> {
|
||||||
if (USE_MOCK) {
|
if (USE_MOCK) {
|
||||||
await delay(MOCK_DELAY);
|
await delay(MOCK_DELAY);
|
||||||
return { code: 200, msg: 'success', data: buildMockWithdrawInfo(id) };
|
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;
|
checkImg: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** POST /admin/finance/withdraw/audit — 审核提现 */
|
/** POST /finance/withdraw/audit — 审核提现 */
|
||||||
export async function postWithdrawAudit(params: WithdrawAuditParams): Promise<ApiResult<null>> {
|
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);
|
const activeIndex = props.tabs.findIndex((tab) => tab.path === props.activeKey);
|
||||||
if (activeIndex === -1) return;
|
if (activeIndex === -1) return;
|
||||||
|
|
||||||
if (key === 'left') {
|
switch (key) {
|
||||||
if (activeIndex === 0) {
|
case 'left':
|
||||||
message.warning('左侧没有可关闭的标签页');
|
if (activeIndex === 0) {
|
||||||
return;
|
message.warning('左侧没有可关闭的标签页');
|
||||||
}
|
return;
|
||||||
props.onCloseLeft?.(props.activeKey);
|
}
|
||||||
} else if (key === 'right') {
|
props.onCloseLeft?.(props.activeKey);
|
||||||
if (activeIndex === props.tabs.length - 1) {
|
break;
|
||||||
message.warning('右侧没有可关闭的标签页');
|
case 'right':
|
||||||
return;
|
if (activeIndex === props.tabs.length - 1) {
|
||||||
}
|
message.warning('右侧没有可关闭的标签页');
|
||||||
props.onCloseRight?.(props.activeKey);
|
return;
|
||||||
} else if (key === 'other') {
|
}
|
||||||
props.onCloseOther?.(props.activeKey);
|
props.onCloseRight?.(props.activeKey);
|
||||||
} else if (key === 'all') {
|
break;
|
||||||
props.onCloseAll?.();
|
case 'other':
|
||||||
|
props.onCloseOther?.(props.activeKey);
|
||||||
|
break;
|
||||||
|
case 'all':
|
||||||
|
props.onCloseAll?.();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ export default defineComponent({
|
|||||||
password: payload.newPassword,
|
password: payload.newPassword,
|
||||||
confirmPassword: payload.newPassword,
|
confirmPassword: payload.newPassword,
|
||||||
});
|
});
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
message.success('密码修改成功');
|
message.success('密码修改成功');
|
||||||
setChangePwdVisible(false);
|
setChangePwdVisible(false);
|
||||||
} else {
|
} 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,
|
toggleBannerActive,
|
||||||
type TournamentAdminBannerListVO,
|
type TournamentAdminBannerListVO,
|
||||||
type BannerListQueryParams,
|
type BannerListQueryParams,
|
||||||
} from '@/api/banner';
|
} from './services';
|
||||||
import { getProvinceCityOptions } from '@/utils/areaData';
|
import { getProvinceCityOptions } from '@/utils/areaData';
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
@@ -138,7 +138,7 @@ export function useBannerModel() {
|
|||||||
console.log('Banner列表查询参数:', queryParams);
|
console.log('Banner列表查询参数:', queryParams);
|
||||||
const res = await getBannerList(queryParams);
|
const res = await getBannerList(queryParams);
|
||||||
|
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setAllData(res.data);
|
setAllData(res.data);
|
||||||
setPagination({ current: 1, pageSize: 10, total: res.data.length });
|
setPagination({ current: 1, pageSize: 10, total: res.data.length });
|
||||||
} else {
|
} else {
|
||||||
@@ -205,7 +205,7 @@ export function useBannerModel() {
|
|||||||
const res = isEdit
|
const res = isEdit
|
||||||
? await updateBanner({ ...params, id: editingRecord.value.id })
|
? await updateBanner({ ...params, id: editingRecord.value.id })
|
||||||
: await saveBanner(params);
|
: await saveBanner(params);
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
message.success(isEdit ? '编辑成功' : '新增成功');
|
message.success(isEdit ? '编辑成功' : '新增成功');
|
||||||
handleCloseModal();
|
handleCloseModal();
|
||||||
handleSearch();
|
handleSearch();
|
||||||
@@ -224,7 +224,7 @@ export function useBannerModel() {
|
|||||||
setLoading(true);
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
const res = await delBanner(record.id);
|
const res = await delBanner(record.id);
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
message.success('删除成功');
|
message.success('删除成功');
|
||||||
handleSearch();
|
handleSearch();
|
||||||
} else {
|
} else {
|
||||||
@@ -244,7 +244,7 @@ export function useBannerModel() {
|
|||||||
const newStatus = record.status === '1' ? '0' : '1';
|
const newStatus = record.status === '1' ? '0' : '1';
|
||||||
const actionText = newStatus === '1' ? '启用' : '禁用';
|
const actionText = newStatus === '1' ? '启用' : '禁用';
|
||||||
const res = await toggleBannerActive({ id: record.id, status: newStatus });
|
const res = await toggleBannerActive({ id: record.id, status: newStatus });
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
message.success(`${actionText}成功`);
|
message.success(`${actionText}成功`);
|
||||||
handleSearch();
|
handleSearch();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
type TournamentAdminInfoVO,
|
type TournamentAdminInfoVO,
|
||||||
type InnerCategoryVO,
|
type InnerCategoryVO,
|
||||||
type TournamentAdminInfoSignupVO,
|
type TournamentAdminInfoSignupVO,
|
||||||
} from '@/api/events';
|
} from '../model/services';
|
||||||
import { useState } from '@/hooks';
|
import { useState } from '@/hooks';
|
||||||
import styles from './EventDetailModal.module.less';
|
import styles from './EventDetailModal.module.less';
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ export default defineComponent({
|
|||||||
page: String(page),
|
page: String(page),
|
||||||
limit: String(PAGE_SIZE),
|
limit: String(PAGE_SIZE),
|
||||||
});
|
});
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
categoryPlayers[categoryId] = res.data.list;
|
categoryPlayers[categoryId] = res.data.list;
|
||||||
categoryPlayerTotal[categoryId] = res.data.total;
|
categoryPlayerTotal[categoryId] = res.data.total;
|
||||||
categoryPlayerPage[categoryId] = page;
|
categoryPlayerPage[categoryId] = page;
|
||||||
@@ -127,7 +127,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const res = await getEventDetail(String(id));
|
const res = await getEventDetail(String(id));
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setDetail(res.data);
|
setDetail(res.data);
|
||||||
// 为每个组别加载第一页选手
|
// 为每个组别加载第一页选手
|
||||||
for (const cat of res.data.categoryList) {
|
for (const cat of res.data.categoryList) {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import {
|
|||||||
ID_CARD_OPTIONS,
|
ID_CARD_OPTIONS,
|
||||||
ID_CARD_IMAGE_OPTIONS,
|
ID_CARD_IMAGE_OPTIONS,
|
||||||
} from './model/useEventListModel';
|
} from './model/useEventListModel';
|
||||||
import { toggleEventOnline } from '@/api/events';
|
import { toggleEventOnline } from './model/services';
|
||||||
import { regionOptions } from '@/utils/areaData';
|
import { regionOptions } from '@/utils/areaData';
|
||||||
import { useContainerSize, useState } from '@/hooks';
|
import { useContainerSize, useState } from '@/hooks';
|
||||||
import EventRegulationModal from './components/EventRegulationModal';
|
import EventRegulationModal from './components/EventRegulationModal';
|
||||||
@@ -152,7 +152,7 @@ export default defineComponent({
|
|||||||
const online = isRemoved ? '1' : '0';
|
const online = isRemoved ? '1' : '0';
|
||||||
try {
|
try {
|
||||||
const res = await toggleEventOnline({ id: record.id, online });
|
const res = await toggleEventOnline({ id: record.id, online });
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
message.success(`${actionText}成功`);
|
message.success(`${actionText}成功`);
|
||||||
handleSearch();
|
handleSearch();
|
||||||
} else {
|
} 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 { message } from 'ant-design-vue';
|
||||||
import { StatusTag, type StatusTagTone } from '@/components';
|
import { StatusTag, type StatusTagTone } from '@/components';
|
||||||
import { useState, useDebounce, useThrottleFn } from '@/hooks';
|
import { useState, useDebounce, useThrottleFn } from '@/hooks';
|
||||||
import type { TournamentAdminVO, EventListQueryParams } from '@/api/events';
|
import type { TournamentAdminVO, EventListQueryParams } from './services';
|
||||||
import { getEventList } from '@/api/events';
|
import { getEventList } from './services';
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// 常量
|
// 常量
|
||||||
@@ -252,7 +252,7 @@ export function useEventListModel() {
|
|||||||
console.log('赛事列表查询参数:', queryParams);
|
console.log('赛事列表查询参数:', queryParams);
|
||||||
const res = await getEventList(queryParams);
|
const res = await getEventList(queryParams);
|
||||||
|
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
setPagination({ ...pagination.value, total: res.data.total });
|
||||||
} else {
|
} 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,
|
getOperationLogs,
|
||||||
type TournamentAdminOperationPageVO,
|
type TournamentAdminOperationPageVO,
|
||||||
type OperationLogQueryParams,
|
type OperationLogQueryParams,
|
||||||
} from '@/api/logs';
|
} from './services';
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// 常量
|
// 常量
|
||||||
@@ -110,7 +110,7 @@ export function useLogModel() {
|
|||||||
const params = buildQueryParams();
|
const params = buildQueryParams();
|
||||||
console.log('操作日志查询参数:', params);
|
console.log('操作日志查询参数:', params);
|
||||||
const res = await getOperationLogs(params);
|
const res = await getOperationLogs(params);
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
setPagination({ ...pagination.value, total: res.data.total });
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
type TournamentAdminOrderInfoVO,
|
type TournamentAdminOrderInfoVO,
|
||||||
type InnerRefundInfo,
|
type InnerRefundInfo,
|
||||||
type TournamentAdminOrderInfoPageVO,
|
type TournamentAdminOrderInfoPageVO,
|
||||||
} from '@/api/orders';
|
} from '../model/services';
|
||||||
import styles from './OrderDetailModal.module.less';
|
import styles from './OrderDetailModal.module.less';
|
||||||
|
|
||||||
interface OrderDetailModalProps {
|
interface OrderDetailModalProps {
|
||||||
@@ -142,7 +142,7 @@ export default defineComponent({
|
|||||||
page: String(page),
|
page: String(page),
|
||||||
limit: String(playerPageSize),
|
limit: String(playerPageSize),
|
||||||
});
|
});
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setPlayers(res.data.list);
|
setPlayers(res.data.list);
|
||||||
setPlayerTotal(res.data.total);
|
setPlayerTotal(res.data.total);
|
||||||
setPlayerPage(page);
|
setPlayerPage(page);
|
||||||
@@ -176,7 +176,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
const [detailRes] = await Promise.all([getOrderDetail(params), fetchPlayers(1)]);
|
const [detailRes] = await Promise.all([getOrderDetail(params), fetchPlayers(1)]);
|
||||||
|
|
||||||
if (detailRes.code === 200) {
|
if (detailRes.code == 200) {
|
||||||
setDetail(detailRes.data);
|
setDetail(detailRes.data);
|
||||||
}
|
}
|
||||||
setDetailLoading(false);
|
setDetailLoading(false);
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import {
|
|||||||
message,
|
message,
|
||||||
} from 'ant-design-vue';
|
} from 'ant-design-vue';
|
||||||
import { useOrderModel, ORDER_STATUS_OPTIONS, REFUND_STATUS_OPTIONS } from './model/useOrderModel';
|
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 { useContainerSize, useState } from '@/hooks';
|
||||||
import OrderDetailModal from './components/OrderDetailModal';
|
import OrderDetailModal from './components/OrderDetailModal';
|
||||||
import pageStyles from '@/assets/styles/pageLayout.module.less';
|
import pageStyles from '@/assets/styles/pageLayout.module.less';
|
||||||
@@ -37,7 +37,7 @@ function promptReRefund(record: any) {
|
|||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
try {
|
try {
|
||||||
const res = await retryRefundOrder({ payOrderNo: record.orderNo });
|
const res = await retryRefundOrder({ payOrderNo: record.orderNo });
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
message.success('重新退款提交成功');
|
message.success('重新退款提交成功');
|
||||||
} else {
|
} else {
|
||||||
message.error(res.msg || '操作失败');
|
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,
|
getOrderList,
|
||||||
type TournamentAdminOrderPageVO,
|
type TournamentAdminOrderPageVO,
|
||||||
type OrderListQueryParams,
|
type OrderListQueryParams,
|
||||||
} from '@/api/orders';
|
} from './services';
|
||||||
import { MOCK_ORDER_SUMMARY } from '@/config/mock/orderList';
|
import { MOCK_ORDER_SUMMARY } from '@/config/mock/orderList';
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
@@ -228,7 +228,7 @@ export function useOrderModel() {
|
|||||||
console.log('订单列表查询参数:', queryParams);
|
console.log('订单列表查询参数:', queryParams);
|
||||||
const res = await getOrderList(queryParams);
|
const res = await getOrderList(queryParams);
|
||||||
|
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
setPagination({ ...pagination.value, total: res.data.total });
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
message,
|
message,
|
||||||
} from 'ant-design-vue';
|
} from 'ant-design-vue';
|
||||||
import { useUserModel, USER_STATUS_OPTIONS, ROLE_OPTIONS } from './model/useUserModel';
|
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 { useContainerSize } from '@/hooks';
|
||||||
import pageStyles from '@/assets/styles/pageLayout.module.less';
|
import pageStyles from '@/assets/styles/pageLayout.module.less';
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ export default defineComponent({
|
|||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
try {
|
try {
|
||||||
const res = await toggleUserActive({ userId: record.id, status: isActive ? '0' : '1' });
|
const res = await toggleUserActive({ userId: record.id, status: isActive ? '0' : '1' });
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
message.success(`${actionText}成���`);
|
message.success(`${actionText}成���`);
|
||||||
handleSearch();
|
handleSearch();
|
||||||
} else message.error(res.msg || '操作失败');
|
} 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 { message } from 'ant-design-vue';
|
||||||
import { StatusTag, type StatusTagTone } from '@/components';
|
import { StatusTag, type StatusTagTone } from '@/components';
|
||||||
import { useState, useDebounce, useThrottleFn } from '@/hooks';
|
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();
|
const params = buildQueryParams();
|
||||||
console.log('用户列表查询参数:', params);
|
console.log('用户列表查询参数:', params);
|
||||||
const res = await getUserList(params);
|
const res = await getUserList(params);
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
setPagination({ ...pagination.value, total: res.data.total });
|
||||||
} else message.error(res.msg || '查询失败');
|
} 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 { computed, reactive, toRef, Ref } from 'vue';
|
||||||
import { useState, useDebounce, useThrottleFn } from '@/hooks';
|
import { useState, useDebounce, useThrottleFn } from '@/hooks';
|
||||||
import {
|
import { getPaymentFlowList, type PaymentFlowVO, type PaymentFlowQueryParams } from './services';
|
||||||
getPaymentFlowList,
|
|
||||||
type PaymentFlowVO,
|
|
||||||
type PaymentFlowQueryParams,
|
|
||||||
} from '@/api/payments';
|
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
@@ -110,7 +106,7 @@ export function usePaymentsModel() {
|
|||||||
const queryParams = buildQueryParams();
|
const queryParams = buildQueryParams();
|
||||||
console.log('支付流水查询参数:', queryParams);
|
console.log('支付流水查询参数:', queryParams);
|
||||||
const res = await getPaymentFlowList(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 });
|
console.log('支付流水查询结果:', { total: res.data.total, count: res.data.list.length });
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
setPagination({ ...pagination.value, total: res.data.total });
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import {
|
|||||||
getWalletTransactionList,
|
getWalletTransactionList,
|
||||||
type WalletTransactionVO,
|
type WalletTransactionVO,
|
||||||
type WalletTransactionQueryParams,
|
type WalletTransactionQueryParams,
|
||||||
} from '@/api/wallet';
|
} from '../model/services';
|
||||||
import {
|
import {
|
||||||
TRANSACTION_TYPE_OPTIONS,
|
TRANSACTION_TYPE_OPTIONS,
|
||||||
TRANSACTION_STATUS_OPTIONS,
|
TRANSACTION_STATUS_OPTIONS,
|
||||||
@@ -65,7 +65,7 @@ export default defineComponent({
|
|||||||
try {
|
try {
|
||||||
const params = buildQueryParams();
|
const params = buildQueryParams();
|
||||||
const res = await getWalletTransactionList(params);
|
const res = await getWalletTransactionList(params);
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
dataSource.value = res.data.list;
|
dataSource.value = res.data.list;
|
||||||
pagination.total = res.data.total;
|
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 { computed, reactive, toRef, Ref } from 'vue';
|
||||||
import { useState, useDebounce, useThrottleFn } from '@/hooks';
|
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 数字码)
|
// 常量(value 对齐 API 数字码)
|
||||||
@@ -141,7 +141,7 @@ export function useWalletModel() {
|
|||||||
const params = buildQueryParams();
|
const params = buildQueryParams();
|
||||||
console.log('钱包列表查询参数:', params);
|
console.log('钱包列表查询参数:', params);
|
||||||
const res = await getWalletList(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 });
|
console.log('钱包列表查询结果:', { total: res.data.total, count: res.data.list.length });
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
setPagination({ ...pagination.value, total: res.data.total });
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { defineComponent, reactive, ref, watch } from 'vue';
|
import { defineComponent, reactive, ref, watch } from 'vue';
|
||||||
import { Modal, Radio, Input, Button, Upload, Image, Spin, message } from 'ant-design-vue';
|
import { Modal, Radio, Input, Button, Upload, Image, Spin, message } from 'ant-design-vue';
|
||||||
import { PlusOutlined } from '@ant-design/icons-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 { AUDIT_STATUS_MAP, PAY_STATUS_MAP } from '../model/useWithdrawModel';
|
||||||
import styles from './WithdrawDetailModal.module.less';
|
import styles from './WithdrawDetailModal.module.less';
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ export default defineComponent({
|
|||||||
detail.value = null;
|
detail.value = null;
|
||||||
try {
|
try {
|
||||||
const res = await getWithdrawInfo(id);
|
const res = await getWithdrawInfo(id);
|
||||||
if (res.code === 200) detail.value = res.data;
|
if (res.code == 200) detail.value = res.data;
|
||||||
} catch {
|
} catch {
|
||||||
// 网络层已统一提示
|
// 网络层已统一提示
|
||||||
} finally {
|
} finally {
|
||||||
@@ -92,7 +92,7 @@ export default defineComponent({
|
|||||||
checkMsg: auditForm.remark.trim(),
|
checkMsg: auditForm.remark.trim(),
|
||||||
checkImg,
|
checkImg,
|
||||||
});
|
});
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
message.success(auditForm.pass ? '已审核通过' : '已审核驳回');
|
message.success(auditForm.pass ? '已审核通过' : '已审核驳回');
|
||||||
props.onAudited?.();
|
props.onAudited?.();
|
||||||
props.onClose();
|
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 { computed, reactive, toRef, Ref } from 'vue';
|
||||||
import { useState, useDebounce, useThrottleFn } from '@/hooks';
|
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();
|
const queryParams = buildQueryParams();
|
||||||
console.log('提现列表查询参数:', queryParams);
|
console.log('提现列表查询参数:', queryParams);
|
||||||
const res = await getWithdrawList(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 });
|
console.log('提现列表查询结果:', { total: res.data.total, count: res.data.list.length });
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
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,
|
getOperationLogList,
|
||||||
type SysOperationLogVO,
|
type SysOperationLogVO,
|
||||||
type OperationLogQueryParams,
|
type OperationLogQueryParams,
|
||||||
} from '@/api/logs';
|
} from './services';
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// 常量
|
// 常量
|
||||||
@@ -106,7 +106,7 @@ export function useLogModel() {
|
|||||||
try {
|
try {
|
||||||
const queryParams = buildQueryParams();
|
const queryParams = buildQueryParams();
|
||||||
const res = await getOperationLogList(queryParams);
|
const res = await getOperationLogList(queryParams);
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
setPagination({ ...pagination.value, total: res.data.total });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { defineComponent, ref, reactive, watch } from 'vue';
|
import { defineComponent, ref, reactive, watch } from 'vue';
|
||||||
import { Modal, Form, Input, Tree, Button, Spin, message } from 'ant-design-vue';
|
import { Modal, Form, Input, Tree, Button, Spin, message } from 'ant-design-vue';
|
||||||
import type { TreeProps } 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 {
|
import {
|
||||||
roleNameRules,
|
roleNameRules,
|
||||||
buildTreeData,
|
buildTreeData,
|
||||||
@@ -49,7 +49,7 @@ export default defineComponent({
|
|||||||
treeLoading.value = true;
|
treeLoading.value = true;
|
||||||
try {
|
try {
|
||||||
const res = await getPermissionTree(roleId);
|
const res = await getPermissionTree(roleId);
|
||||||
if (res.code === 200 && res.data) {
|
if (res.code == 200 && res.data) {
|
||||||
rawApiTree.value = res.data;
|
rawApiTree.value = res.data;
|
||||||
const result = buildTreeData(res.data);
|
const result = buildTreeData(res.data);
|
||||||
treeData.value = result.treeData;
|
treeData.value = result.treeData;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Modal, Form, Input, Table, Button, Space, Pagination, message } from 'a
|
|||||||
import { h } from 'vue';
|
import { h } from 'vue';
|
||||||
import { StatusTag, type StatusTagTone } from '@/components';
|
import { StatusTag, type StatusTagTone } from '@/components';
|
||||||
import { useState, useThrottleFn, useEffect } from '@/hooks';
|
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';
|
import styles from './UserListModal.module.less';
|
||||||
|
|
||||||
/** 状态映射 */
|
/** 状态映射 */
|
||||||
@@ -60,7 +60,7 @@ export default defineComponent({
|
|||||||
roleId: String(props.roleId),
|
roleId: String(props.roleId),
|
||||||
...(filterForm.text.trim() ? { text: filterForm.text.trim() } : {}),
|
...(filterForm.text.trim() ? { text: filterForm.text.trim() } : {}),
|
||||||
});
|
});
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
setPagination({ ...pagination.value, total: res.data.total });
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
* 集中管理角色表单的规则、权限树转换工具。
|
* 集中管理角色表单的规则、权限树转换工具。
|
||||||
*/
|
*/
|
||||||
import type { Rule } from 'ant-design-vue/es/form';
|
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,
|
deleteRole,
|
||||||
type TournamentAdminRolePageVO,
|
type TournamentAdminRolePageVO,
|
||||||
type RoleListQueryParams,
|
type RoleListQueryParams,
|
||||||
} from '@/api/roles';
|
} from './services';
|
||||||
|
|
||||||
// ============================================================
|
// ============================================================
|
||||||
// Model
|
// Model
|
||||||
@@ -76,7 +76,7 @@ export function useRoleModel() {
|
|||||||
const queryParams = buildQueryParams();
|
const queryParams = buildQueryParams();
|
||||||
console.log('角色列表查询参数:', queryParams);
|
console.log('角色列表查询参数:', queryParams);
|
||||||
const res = await getRoleList(queryParams);
|
const res = await getRoleList(queryParams);
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
setPagination({ ...pagination.value, total: res.data.total });
|
||||||
} else {
|
} else {
|
||||||
@@ -142,7 +142,7 @@ export function useRoleModel() {
|
|||||||
setLoading(true);
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
const res = await deleteRole(record.roleId);
|
const res = await deleteRole(record.roleId);
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setDataSource(dataSource.value.filter((item: any) => item.roleId !== record.roleId));
|
setDataSource(dataSource.value.filter((item: any) => item.roleId !== record.roleId));
|
||||||
message.success('删除成功');
|
message.success('删除成功');
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
message,
|
message,
|
||||||
} from 'ant-design-vue';
|
} from 'ant-design-vue';
|
||||||
import { useUserModel, ROLE_OPTIONS, USER_STATUS_OPTIONS } from './model/useUserModel';
|
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 { useState, useThrottleFn, useContainerSize } from '@/hooks';
|
||||||
import UserFormModal from './components/UserFormModal';
|
import UserFormModal from './components/UserFormModal';
|
||||||
import pageStyles from '@/assets/styles/pageLayout.module.less';
|
import pageStyles from '@/assets/styles/pageLayout.module.less';
|
||||||
@@ -94,7 +94,7 @@ export default defineComponent({
|
|||||||
userId: record.id,
|
userId: record.id,
|
||||||
status: isActive ? '0' : '1',
|
status: isActive ? '0' : '1',
|
||||||
});
|
});
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
message.success(`${actionText}成功`);
|
message.success(`${actionText}成功`);
|
||||||
handleSearch();
|
handleSearch();
|
||||||
} else {
|
} else {
|
||||||
@@ -149,7 +149,7 @@ export default defineComponent({
|
|||||||
confirmPassword: formPayload.password,
|
confirmPassword: formPayload.password,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
message.success(editingRecord.value ? '编辑成功' : '新增成功');
|
message.success(editingRecord.value ? '编辑成功' : '新增成功');
|
||||||
handleCloseModal();
|
handleCloseModal();
|
||||||
handleSearch();
|
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 { message } from 'ant-design-vue';
|
||||||
import { StatusTag, type StatusTagTone } from '@/components';
|
import { StatusTag, type StatusTagTone } from '@/components';
|
||||||
import { useState, useDebounce, useThrottleFn } from '@/hooks';
|
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();
|
const queryParams = buildQueryParams();
|
||||||
console.log('用户列表查询参数:', queryParams);
|
console.log('用户列表查询参数:', queryParams);
|
||||||
const res = await getUserList(queryParams);
|
const res = await getUserList(queryParams);
|
||||||
if (res.code === 200) {
|
if (res.code == 200) {
|
||||||
setDataSource(res.data.list);
|
setDataSource(res.data.list);
|
||||||
setPagination({ ...pagination.value, total: res.data.total });
|
setPagination({ ...pagination.value, total: res.data.total });
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ const request = (
|
|||||||
|
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
|
|
||||||
if (data.code === 401) {
|
if (data.code == 401) {
|
||||||
handleUnauthorized(data.msg);
|
handleUnauthorized(data.msg);
|
||||||
return Promise.reject(new Error(data.msg || 'Unauthorized'));
|
return Promise.reject(new Error(data.msg || 'Unauthorized'));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user