From 9d615c8500a446b87f2e3bb9d8a0067552db18d1 Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Thu, 6 Aug 2026 14:54:03 +0800 Subject: [PATCH 01/27] =?UTF-8?q?fix:=20=E8=AE=A2=E5=8D=95=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=95=B0=E6=8D=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/orders/types.ts | 10 +-- .../components/OrderDetailModal.module.less | 17 +--- .../orders/components/OrderDetailModal.tsx | 89 +++++++------------ 3 files changed, 37 insertions(+), 79 deletions(-) diff --git a/src/api/orders/types.ts b/src/api/orders/types.ts index 5040641..6c45c60 100644 --- a/src/api/orders/types.ts +++ b/src/api/orders/types.ts @@ -99,14 +99,8 @@ export interface ApiResult { /** 退款记录 */ export interface InnerRefundInfo { - /** 已退金额;0.00格式 */ - refundedAmount: string; - /** 总退款次数(接口实际返回 string) */ - totalRefundCount: string; /** 退款金额;0.00格式 */ refundAmount: string; - /** 是否全部退款;0=否,1=是(接口实际返回 string) */ - isFullRefund: string; /** 退款方式 */ refundMethod: string; /** 退款申请时间 */ @@ -115,6 +109,10 @@ export interface InnerRefundInfo { refundOutTradeNo: string; /** 退款完成时间 */ refundTime: string; + /** 退款状态;1=退款中,2=退款成功,3=退款失败 */ + refundStatus: string; + /** 退款选手名称合集文字 */ + refundSignupNames: string; } /** 订单详情 */ diff --git a/src/pages/events/orders/components/OrderDetailModal.module.less b/src/pages/events/orders/components/OrderDetailModal.module.less index 05743f2..68f0ac4 100644 --- a/src/pages/events/orders/components/OrderDetailModal.module.less +++ b/src/pages/events/orders/components/OrderDetailModal.module.less @@ -79,11 +79,6 @@ margin-bottom: 12px; } - .tableWrap { - max-height: 200px; - overflow-y: auto; - } - .paginationRow { display: flex; justify-content: flex-end; @@ -160,12 +155,6 @@ font-weight: 500; } - .partialMark { - margin-left: 4px; - color: #fa8c16; - font-size: 12px; - } - .refundEmpty { padding: 32px 0; text-align: center; @@ -176,10 +165,8 @@ border: 1px dashed #e0e0e0; } - .refundPagination { - display: flex; - justify-content: flex-end; - margin-top: 12px; + .refundPlayers { + margin-left: 0; } .modalFooter { diff --git a/src/pages/events/orders/components/OrderDetailModal.tsx b/src/pages/events/orders/components/OrderDetailModal.tsx index 0447451..543c77b 100644 --- a/src/pages/events/orders/components/OrderDetailModal.tsx +++ b/src/pages/events/orders/components/OrderDetailModal.tsx @@ -44,7 +44,13 @@ const PLAYER_COLUMNS = [ customRender: ({ text }: { text: string }) => formatGender(text), }, { title: '手机号', dataIndex: 'phone', key: 'phone', width: 130 }, - { title: '证件号', dataIndex: 'idCard', key: 'idCard', width: 180 }, + { + title: '证件号', + dataIndex: 'idCard', + key: 'idCard', + width: 180, + customRender: ({ text }: { text: string }) => text || '--', + }, { title: '证件图片', key: 'idCardImg', @@ -108,8 +114,9 @@ const PLAYER_COLUMNS = [ ]; const REFUND_STATUS_MAP: Record = { - success: { label: '退款成功', tone: 'success' }, - failed: { label: '退款失败', tone: 'danger' }, + '1': { label: '退款中', tone: 'orange' }, + '2': { label: '退款成功', tone: 'success' }, + '3': { label: '退款失败', tone: 'danger' }, }; export default defineComponent({ @@ -129,8 +136,6 @@ export default defineComponent({ const [playersLoading, setPlayersLoading] = useState(true); const [playerPage, setPlayerPage] = useState(1); const [playerTotal, setPlayerTotal] = useState(0); - const [refundPage, setRefundPage] = useState(1); - const [refundPageSize] = useState(2); const playerPageSize = 5; /** 获取选手列表(分页) */ @@ -158,25 +163,21 @@ export default defineComponent({ const hasRefundFailed = computed(() => { const records = refundRecords.value; if (!records || !records.length) return false; - return records.some((r) => { - if (!r) return false; - const hasRefundAmount = parseFloat(r.refundAmount || '0') > 0; - const hasRefundTime = r.refundTime && r.refundTime !== '--'; - return hasRefundAmount && !hasRefundTime; - }); + return records.some((r) => r?.refundStatus === '3'); }); - const pagedRefunds = computed(() => { - const start = (refundPage.value - 1) * refundPageSize.value; - return refundRecords.value.slice(start, start + refundPageSize.value); - }); + const refundSuccessList = computed(() => + refundRecords.value.filter((r) => r.refundStatus === '2'), + ); const totalRefunded = computed(() => { - const records = refundRecords.value; - if (!records.length) return 0; - return records.reduce((sum, r) => sum + parseFloat(r.refundAmount || '0'), 0); + const list = refundSuccessList.value; + if (!list.length) return 0; + return list.reduce((sum, r) => sum + parseFloat(r.refundAmount || '0'), 0); }); + const refundSuccessCount = computed(() => refundSuccessList.value.length); + const fetchData = async () => { const params = { orderNo: props.orderNo, uniqueId: props.uniqueId }; const [detailRes] = await Promise.all([getOrderDetail(params), fetchPlayers(1)]); @@ -194,10 +195,6 @@ export default defineComponent({ fetchPlayers(page); }; - const handleRefundPageChange = (page: number) => { - setRefundPage(page); - }; - return () => (
选手信息
-
+
@@ -291,28 +288,18 @@ export default defineComponent({ <>
已退金额:{totalRefunded.value.toFixed(2)}元 - 退款次数:{refundRecords.value.length}次 + 退款次数:{refundSuccessCount.value}次
- {pagedRefunds.value.map((r, idx) => { - const realIdx = (refundPage.value - 1) * refundPageSize.value + idx + 1; - const isSuccess = parseFloat(r.refundTime || '') > 0 || !!r.refundTime; - const statusInfo = { - label: isSuccess - ? '退款成功' - : r.isFullRefund === '1' - ? '退款待处理' - : '退款中', - tone: (isSuccess - ? 'success' - : r.isFullRefund === '1' - ? 'warning' - : 'orange') as StatusTagTone, + {refundRecords.value.map((r, idx) => { + const statusInfo = REFUND_STATUS_MAP[r.refundStatus] || { + label: '未知', + tone: 'default' as StatusTagTone, }; return (
- 第{realIdx}次退款 + 第{idx + 1}次退款
@@ -321,37 +308,23 @@ export default defineComponent({ 退款金额: ¥{formatMoney(r.refundAmount)} - {r.isFullRefund === '1' && ( - (全部退款) - )} - {r.isFullRefund === '0' && ( - (部分退款) - )} + {`(${r.refundSignupNames})`}
申请时间:{r.refundApplyTime}
-
完款时间:{r.refundTime || '--'}
+
完成时间:{r.refundTime || '--'}
退款方式:{r.refundMethod}
第三方退款单号:{r.refundOutTradeNo || '--'}
-
已退金额:¥{formatMoney(r.refundedAmount)}
); })} -
- -
) : (
暂无退款记录
-- 2.52.0 From d85333d058ef7400e5e06e14383aa3f19107f09d Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Thu, 6 Aug 2026 15:17:48 +0800 Subject: [PATCH 02/27] =?UTF-8?q?fix:=20=E5=A4=84=E7=90=86=E5=A3=B0?= =?UTF-8?q?=E6=98=8E=E9=97=AE=E9=A2=98,=E4=BC=98=E5=8C=96=E8=B5=9B?= =?UTF-8?q?=E4=BA=8B=E7=94=A8=E6=88=B7=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/events/users/index.tsx | 14 +++++- src/pages/events/users/model/config.ts | 24 +++------ src/pages/events/users/model/services.ts | 5 +- .../{useUserColumns.ts => useUserColumns.tsx} | 49 ++++++++++--------- src/pages/events/users/model/useUserModel.ts | 43 +++++----------- 5 files changed, 60 insertions(+), 75 deletions(-) rename src/pages/events/users/model/{useUserColumns.ts => useUserColumns.tsx} (64%) diff --git a/src/pages/events/users/index.tsx b/src/pages/events/users/index.tsx index 231a01b..5ee1987 100644 --- a/src/pages/events/users/index.tsx +++ b/src/pages/events/users/index.tsx @@ -12,7 +12,7 @@ import pageStyles from '@/assets/styles/pageLayout.module.less'; * 架构分层: * - 数据层:services.ts(API 调用) * - 逻辑层:useUserModel.ts(状态 + 业务逻辑 + 交互处理) - * - 视图层:useUserColumns.ts(表格列配置)+ 本组件(纯 UI 渲染) + * - 视图层:useUserColumns.tsx(表格列配置)+ 本组件(纯 UI 渲染) */ export default defineComponent({ name: 'EventUsers', @@ -46,7 +46,7 @@ export default defineComponent({ loading={togglingId.value === record.id} onClick={() => handleToggleStatus(record)} > - {isActive ? '停用' : '启用'} + {isActive ? '禁用' : '启用'} ); }; @@ -79,6 +79,16 @@ export default defineComponent({ onPressEnter={handleSearch} /> + + (filterForm.phone = val.target?.value ?? val ?? '')} + onPressEnter={handleSearch} + /> +
+ 组别{idx + 1}:{cat.name}({CATEGORY_TYPE_MAP[cat.type] ?? cat.type}) +
{categoryPlayerTotal.value[cat.id] > 0 && (
refundSuccessList.value.length); const fetchData = async () => { - const params = { orderNo: props.orderNo, uniqueId: props.uniqueId }; + const params: OrderDetailQueryParams = {}; + if (props.orderNo) params['orderNo'] = props.orderNo; + else params['uniqueId'] = props.uniqueId; + const [detailRes] = await Promise.all([getOrderDetail(params), fetchPlayers(1)]); if (detailRes.code == 200) { setDetail(detailRes.data); -- 2.52.0 From d2aa4c1207147c10d9f03202701c68c80ed87477 Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Thu, 6 Aug 2026 17:37:37 +0800 Subject: [PATCH 05/27] =?UTF-8?q?fix:=20=E8=B5=9B=E4=BA=8B=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97=E9=A1=B5=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/events/logs/index.tsx | 24 +++++++++++++++---- .../events/users/model/useUserColumns.tsx | 2 ++ src/pages/events/users/model/useUserModel.ts | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/pages/events/logs/index.tsx b/src/pages/events/logs/index.tsx index 087687c..57ea258 100644 --- a/src/pages/events/logs/index.tsx +++ b/src/pages/events/logs/index.tsx @@ -7,7 +7,7 @@ import { Form, Space, Select, - Tooltip, + Modal, Pagination, } from 'ant-design-vue'; import { useLogModel, ACTION_TYPE_OPTIONS, ACTION_SOURCE_OPTIONS } from './model/useLogModel'; @@ -24,6 +24,7 @@ const LogContentCell = defineComponent({ setup(props) { const textRef = ref(null); const [overflow, setOverflow] = useState(false); + const [modalOpen, setModalOpen] = useState(false); const checkOverflow = () => { const el = textRef.value; if (el) setOverflow(el.scrollHeight > el.clientHeight); @@ -47,10 +48,23 @@ const LogContentCell = defineComponent({ {raw}
{overflow.value ? ( - - 查看 - + setModalOpen(true)}> + 查看 + ) : null} + setModalOpen(false)} + > +
+ {raw} +
+
); }; @@ -93,7 +107,7 @@ export default defineComponent({ record: any; index: number; }) => { - if (column.key === 'content') { + if (column.key === 'obj') { const raw = text || ''; return raw ? : --; } diff --git a/src/pages/events/users/model/useUserColumns.tsx b/src/pages/events/users/model/useUserColumns.tsx index 2e7a457..6a11888 100644 --- a/src/pages/events/users/model/useUserColumns.tsx +++ b/src/pages/events/users/model/useUserColumns.tsx @@ -1,4 +1,5 @@ import { Image, Space } from 'ant-design-vue'; +import { EyeOutlined } from '@ant-design/icons-vue'; import { StatusTag } from '@/components'; import { STATUS_MAP } from './config'; @@ -77,6 +78,7 @@ export function useUserColumns() { width={40} height={40} style={{ objectFit: 'cover', borderRadius: '4px', cursor: 'pointer' }} + previewMask={() => } /> ))} diff --git a/src/pages/events/users/model/useUserModel.ts b/src/pages/events/users/model/useUserModel.ts index 06dc821..af393ca 100644 --- a/src/pages/events/users/model/useUserModel.ts +++ b/src/pages/events/users/model/useUserModel.ts @@ -117,7 +117,7 @@ export function useUserModel() { Modal.confirm({ title: `${actionText}确认`, - content: `确认${actionText}用户"${record.realName}"吗?`, + content: `确认${actionText}用户"${record.nickname}"吗?`, okText: '确认', cancelText: '取消', onOk: async () => { -- 2.52.0 From 1cd851ec8ec623283bec793da576bb0ef67e1cc6 Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Thu, 6 Aug 2026 18:32:41 +0800 Subject: [PATCH 06/27] =?UTF-8?q?fix:=20=E9=A1=B5=E9=9D=A2=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/withdraw/types.ts | 2 +- src/pages/events/orders/index.tsx | 1 + .../events/orders/model/useOrderModel.ts | 73 ++++++++++++++++--- .../payments/model/usePaymentsModel.ts | 8 +- .../wallet/components/WalletDetailModal.tsx | 8 +- src/pages/finance/wallet/index.tsx | 30 +++++--- .../withdraw/model/useWithdrawModel.ts | 2 +- src/utils/form.ts | 11 +++ 8 files changed, 105 insertions(+), 30 deletions(-) diff --git a/src/api/withdraw/types.ts b/src/api/withdraw/types.ts index f8c688e..966a018 100644 --- a/src/api/withdraw/types.ts +++ b/src/api/withdraw/types.ts @@ -23,7 +23,7 @@ export interface WithdrawVO { auditStatus: number; /** 到账状态:0=未支付,1=支付成功,2=支付失败 */ payStatus: number; - /** 流水单号 */ + /** 第三方单号 */ serialNumber: string; /** 申请时间 */ createDate: string; diff --git a/src/pages/events/orders/index.tsx b/src/pages/events/orders/index.tsx index 7257675..2b82bb7 100644 --- a/src/pages/events/orders/index.tsx +++ b/src/pages/events/orders/index.tsx @@ -72,6 +72,7 @@ function renderBodyCell({ if (column.dataIndex === 'name') { const maxLen = 15; const raw = text || ''; + if (!raw) return --; const display = raw.length > maxLen ? raw.slice(0, maxLen) + '...' : raw; return raw.length > maxLen ? ( diff --git a/src/pages/events/orders/model/useOrderModel.ts b/src/pages/events/orders/model/useOrderModel.ts index a0fc4f1..101084f 100644 --- a/src/pages/events/orders/model/useOrderModel.ts +++ b/src/pages/events/orders/model/useOrderModel.ts @@ -125,22 +125,77 @@ export function useOrderModel() { }; const columns = [ - { title: '订单编号', dataIndex: 'orderNo', key: 'orderNo', width: 200 }, - { title: '赛事名称', dataIndex: 'name', key: 'name', width: 180 }, - { title: '选手名称', dataIndex: 'realName', key: 'realName', width: 100 }, - { title: '手机号', dataIndex: 'phone', key: 'phone', width: 130 }, - { title: '比赛组别', dataIndex: 'categoryName', key: 'categoryName', width: 120 }, - { title: '报名人', dataIndex: 'creatorName', key: 'creatorName', width: 100 }, - { title: '报名人手机号', dataIndex: 'creatorPhone', key: 'creatorPhone', width: 130 }, + { + title: '订单编号', + dataIndex: 'orderNo', + key: 'orderNo', + width: 200, + customRender: ({ text }: { text: string }) => text || '--', + }, + { + title: '赛事名称', + dataIndex: 'name', + key: 'name', + width: 180, + customRender: ({ text }: { text: string }) => text || '--', + }, + { + title: '选手名称', + dataIndex: 'realName', + key: 'realName', + width: 100, + customRender: ({ text }: { text: string }) => text || '--', + }, + { + title: '手机号', + dataIndex: 'phone', + key: 'phone', + width: 130, + customRender: ({ text }: { text: string }) => text || '--', + }, + { + title: '比赛组别', + dataIndex: 'categoryName', + key: 'categoryName', + width: 120, + customRender: ({ text }: { text: string }) => text || '--', + }, + { + title: '报名人', + dataIndex: 'creatorName', + key: 'creatorName', + width: 100, + customRender: ({ text }: { text: string }) => text || '--', + }, + { + title: '报名人手机号', + dataIndex: 'creatorPhone', + key: 'creatorPhone', + width: 130, + customRender: ({ text }: { text: string }) => text || '--', + }, { title: '报名人数', dataIndex: 'creatorSignupCount', key: 'creatorSignupCount', width: 90, align: 'center' as const, + customRender: ({ text }: { text: number }) => (text != null ? text : '--'), + }, + { + title: '订单时间', + dataIndex: 'orderTime', + key: 'orderTime', + width: 170, + customRender: ({ text }: { text: string }) => text || '--', + }, + { + title: '支付时间', + dataIndex: 'payTime', + key: 'payTime', + width: 170, + customRender: ({ text }: { text: string }) => text || '--', }, - { title: '订单时间', dataIndex: 'orderTime', key: 'orderTime', width: 170 }, - { title: '支付时间', dataIndex: 'payTime', key: 'payTime', width: 170 }, { title: '订单总金额', dataIndex: 'creatorSignupFee', diff --git a/src/pages/finance/payments/model/usePaymentsModel.ts b/src/pages/finance/payments/model/usePaymentsModel.ts index 2c4376f..9ca9a22 100644 --- a/src/pages/finance/payments/model/usePaymentsModel.ts +++ b/src/pages/finance/payments/model/usePaymentsModel.ts @@ -93,7 +93,13 @@ export function usePaymentsModel() { // ===== 表格列(dataIndex 对齐 API) ===== const columns = [ - { title: '流水号', dataIndex: 'serialNo', key: 'serialNo', width: 160 }, + { + title: '第三方流水号', + dataIndex: 'serialNo', + key: 'serialNo', + width: 160, + customRender: ({ text }: { text: string }) => text || '--', + }, { title: '订单编号', dataIndex: 'orderNo', key: 'orderNo', width: 160 }, { title: '类型', diff --git a/src/pages/finance/wallet/components/WalletDetailModal.tsx b/src/pages/finance/wallet/components/WalletDetailModal.tsx index 1c35b01..9a7389a 100644 --- a/src/pages/finance/wallet/components/WalletDetailModal.tsx +++ b/src/pages/finance/wallet/components/WalletDetailModal.tsx @@ -124,13 +124,7 @@ export default defineComponent({ customRender: ({ text }: { text: string }) => { const num = Number(text) || 0; const color = num > 0 ? '#52c41a' : num < 0 ? '#ff4d4f' : 'rgba(0,0,0,0.85)'; - const sign = num > 0 ? '+' : ''; - return ( - - {sign} - {text} - - ); + return {text}; }, }, { diff --git a/src/pages/finance/wallet/index.tsx b/src/pages/finance/wallet/index.tsx index d7e7015..5d5f971 100644 --- a/src/pages/finance/wallet/index.tsx +++ b/src/pages/finance/wallet/index.tsx @@ -1,5 +1,5 @@ import { defineComponent } from 'vue'; -import { Button, Input, Table, Form, Space, Pagination } from 'ant-design-vue'; +import { Button, Input, InputNumber, Table, Form, Space, Pagination } from 'ant-design-vue'; import { WalletOutlined, LockOutlined, RiseOutlined } from '@ant-design/icons-vue'; import { useWalletModel } from './model/useWalletModel'; import { useContainerSize } from '@/hooks'; @@ -156,13 +156,17 @@ export default defineComponent({ - (filterForm.minBalance = val ?? '')} + style={{ width: '140px' }} + value={filterForm.minBalance || undefined} + precision={0} + min={0} + controls={false} + onUpdate:value={(val: any) => + (filterForm.minBalance = val != null ? String(val) : '') + } onPressEnter={handleSearch} - allowClear /> - (filterForm.maxBalance = val ?? '')} + style={{ width: '140px' }} + value={filterForm.maxBalance || undefined} + precision={0} + min={0} + controls={false} + onUpdate:value={(val: any) => + (filterForm.maxBalance = val != null ? String(val) : '') + } onPressEnter={handleSearch} - allowClear /> diff --git a/src/pages/finance/withdraw/model/useWithdrawModel.ts b/src/pages/finance/withdraw/model/useWithdrawModel.ts index e946fda..1573814 100644 --- a/src/pages/finance/withdraw/model/useWithdrawModel.ts +++ b/src/pages/finance/withdraw/model/useWithdrawModel.ts @@ -162,7 +162,7 @@ export function useWithdrawModel() { }, { title: '审核状态', dataIndex: 'auditStatus', key: 'auditStatus', width: 110 }, { title: '到账状态', dataIndex: 'payStatus', key: 'payStatus', width: 110 }, - { title: '流水单号', dataIndex: 'serialNumber', key: 'serialNumber', width: 180 }, + { title: '第三方单号', dataIndex: 'serialNumber', key: 'serialNumber', width: 180 }, { title: '申请时间', dataIndex: 'createDate', key: 'createDate', width: 180 }, ]; diff --git a/src/utils/form.ts b/src/utils/form.ts index e2c0996..e1f1426 100644 --- a/src/utils/form.ts +++ b/src/utils/form.ts @@ -33,6 +33,12 @@ export const REAL_NAME_REGEX = /^[\u4e00-\u9fa5A-Za-z0-9·]{1,8}$/; */ export const IMAGE_TYPE_REGEX = /^image\//; +/** + * 纯数字(整数) + * - 用于过滤非数字字符 + */ +export const INTEGER_ONLY_REGEX = /\D/g; + // ============================================================ // 校验函数 // ============================================================ @@ -56,3 +62,8 @@ export function isValidRealName(value: unknown): boolean { export function isImageFile(file: { type: string }): boolean { return IMAGE_TYPE_REGEX.test(file.type); } + +/** 过滤非数字字符,只保留整数 */ +export function toIntegerOnly(value: unknown): string { + return String(value ?? '').replace(INTEGER_ONLY_REGEX, ''); +} -- 2.52.0 From 3cddae93aac8a375c83c78bf40f4bffbf24db9a0 Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 7 Aug 2026 09:03:49 +0800 Subject: [PATCH 07/27] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=B5=9B?= =?UTF-8?q?=E4=BA=8B=E5=88=97=E8=A1=A8=E8=AF=A6=E6=83=85=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/events/list/components/EventDetailModal.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pages/events/list/components/EventDetailModal.tsx b/src/pages/events/list/components/EventDetailModal.tsx index 57fedca..83ebc9b 100644 --- a/src/pages/events/list/components/EventDetailModal.tsx +++ b/src/pages/events/list/components/EventDetailModal.tsx @@ -162,6 +162,12 @@ export default defineComponent({ } }; + /** 显示报名起止时间 */ + const signupTimeDisplay = (startTime?: string, endTime?: string) => { + if (!startTime || !endTime) return '--'; + return `${startTime} 至 ${endTime}`; + }; + // 弹窗打开且 有 record.id 时自动请求(useEffect 带 immediate: true,兼容 destroyOnClose 重建场景) useEffect(() => { if (props.visible && props.record?.id) { @@ -200,7 +206,7 @@ export default defineComponent({ - {detail.value.signupTimeBegin} 至 {detail.value.signupTimeEnd} + {signupTimeDisplay(detail.value.signupTimeBegin, detail.value.signupTimeEnd)} {detail.value.venueArea} @@ -276,7 +282,7 @@ export default defineComponent({ size="small" pagination={false} bordered - scroll={{ x: 'max-content', y: 200 }} + scroll={{ x: 'max-content' }} /> {categoryPlayerTotal.value[cat.id] > 0 && (
-- 2.52.0 From 530de8b31c3260ee3b6341d795d87ad958444781 Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 7 Aug 2026 09:13:15 +0800 Subject: [PATCH 08/27] =?UTF-8?q?fix:=20api=E5=A3=B0=E6=98=8E=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20=E6=8E=A5=E5=8F=A3=E8=AF=B7=E6=B1=82=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=85=9C=E5=BA=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/banner/types.ts | 2 +- src/api/events/types.ts | 2 +- src/api/login/index.ts | 2 +- src/api/logs/types.ts | 2 +- src/api/orders/types.ts | 2 +- src/api/payments/types.ts | 2 +- src/api/reports/types.ts | 2 +- src/api/roles/types.ts | 2 +- src/api/users/types.ts | 2 +- src/api/wallet/types.ts | 2 +- src/api/withdraw/types.ts | 2 +- src/layouts/BasicLayout.tsx | 2 +- src/pages/events/banner/components/BannerFormModal.tsx | 4 ++-- src/pages/events/banner/model/useBannerModel.ts | 8 ++++---- src/pages/events/list/components/EventAuditModal.tsx | 2 +- src/pages/events/list/components/EventDetailModal.tsx | 4 ++-- src/pages/events/list/components/EventRegulationModal.tsx | 2 +- src/pages/events/list/model/useEventListModel.ts | 4 ++-- src/pages/events/orders/components/OrderDetailModal.tsx | 4 ++-- src/pages/events/orders/index.tsx | 2 +- src/pages/events/users/model/useUserModel.ts | 3 +-- src/pages/finance/reports/model/useReportsModel.ts | 2 +- src/pages/finance/wallet/components/WalletDetailModal.tsx | 2 +- .../finance/withdraw/components/WithdrawDetailModal.tsx | 4 ++-- src/pages/login/model/useLoginModel.ts | 2 +- src/pages/system/roles/components/RoleFormModal.tsx | 2 +- src/pages/system/roles/components/UserListModal.tsx | 2 +- src/pages/system/roles/model/useRoleModel.ts | 4 ++-- src/pages/system/users/components/UserFormModal.tsx | 4 ++-- src/pages/system/users/index.tsx | 4 ++-- src/pages/system/users/model/useUserModel.ts | 2 +- src/utils/request.ts | 2 +- 32 files changed, 43 insertions(+), 44 deletions(-) diff --git a/src/api/banner/types.ts b/src/api/banner/types.ts index d95d867..78784cf 100644 --- a/src/api/banner/types.ts +++ b/src/api/banner/types.ts @@ -47,7 +47,7 @@ export interface BannerActiveParams { } export interface ApiResult { - code: number; + code: string; msg: string; data: T; } diff --git a/src/api/events/types.ts b/src/api/events/types.ts index c2c53a6..899d37f 100644 --- a/src/api/events/types.ts +++ b/src/api/events/types.ts @@ -87,7 +87,7 @@ export interface PageData { /** 统一响应包裹 */ export interface ApiResult { /** 编码:200表示成功,其他值表示失败 */ - code: number; + code: string; /** 消息内容 */ msg: string; /** 响应数据 */ diff --git a/src/api/login/index.ts b/src/api/login/index.ts index 1acfc8a..3e98c80 100644 --- a/src/api/login/index.ts +++ b/src/api/login/index.ts @@ -5,7 +5,7 @@ export type { LoginResult } from './types'; export const login = (params: { phone: string; password: string }) => { return post(`/op/login`, params) as Promise<{ - code: number; + code: string; msg: string; data: LoginResult; }>; diff --git a/src/api/logs/types.ts b/src/api/logs/types.ts index 87cdf03..9c009da 100644 --- a/src/api/logs/types.ts +++ b/src/api/logs/types.ts @@ -57,7 +57,7 @@ export interface PageData { } export interface ApiResult { - code: number; + code: string; msg: string; data: T; } diff --git a/src/api/orders/types.ts b/src/api/orders/types.ts index 349e553..bfd78d1 100644 --- a/src/api/orders/types.ts +++ b/src/api/orders/types.ts @@ -88,7 +88,7 @@ export interface PageData { /** 统一响应包裹 */ export interface ApiResult { - code: number; + code: string; msg: string; data: T; } diff --git a/src/api/payments/types.ts b/src/api/payments/types.ts index 48b433f..ac31087 100644 --- a/src/api/payments/types.ts +++ b/src/api/payments/types.ts @@ -58,7 +58,7 @@ export interface PaymentFlowPageData { } export interface ApiResult { - code: number; + code: string; msg: string; data: T; } diff --git a/src/api/reports/types.ts b/src/api/reports/types.ts index 150473a..709878c 100644 --- a/src/api/reports/types.ts +++ b/src/api/reports/types.ts @@ -42,7 +42,7 @@ export interface ReportQueryParams { } export interface ApiResult { - code: number; + code: string; msg: string; data: T; } diff --git a/src/api/roles/types.ts b/src/api/roles/types.ts index b4b6219..8c04cef 100644 --- a/src/api/roles/types.ts +++ b/src/api/roles/types.ts @@ -59,7 +59,7 @@ export interface PageData { list: T[]; } export interface ApiResult { - code: number; + code: string; msg: string; data: T; } diff --git a/src/api/users/types.ts b/src/api/users/types.ts index 0dbcf4a..3941627 100644 --- a/src/api/users/types.ts +++ b/src/api/users/types.ts @@ -65,7 +65,7 @@ export interface PageData { list: T[]; } export interface ApiResult { - code: number; + code: string; msg: string; data: T; } diff --git a/src/api/wallet/types.ts b/src/api/wallet/types.ts index a0dc2aa..a00aee0 100644 --- a/src/api/wallet/types.ts +++ b/src/api/wallet/types.ts @@ -55,7 +55,7 @@ export interface PageData { list: T[]; } export interface ApiResult { - code: number; + code: string; msg: string; data: T; } diff --git a/src/api/withdraw/types.ts b/src/api/withdraw/types.ts index 966a018..38e53bc 100644 --- a/src/api/withdraw/types.ts +++ b/src/api/withdraw/types.ts @@ -50,7 +50,7 @@ export interface PageData { list: T[]; } export interface ApiResult { - code: number; + code: string; msg: string; data: T; } diff --git a/src/layouts/BasicLayout.tsx b/src/layouts/BasicLayout.tsx index bcbd633..56afa29 100644 --- a/src/layouts/BasicLayout.tsx +++ b/src/layouts/BasicLayout.tsx @@ -136,7 +136,7 @@ export default defineComponent({ password: payload.newPassword, confirmPassword: payload.newPassword, }); - if (res.code == 200) { + if (res.code === '200') { message.success('密码修改成功'); setChangePwdVisible(false); window.setTimeout(() => { diff --git a/src/pages/events/banner/components/BannerFormModal.tsx b/src/pages/events/banner/components/BannerFormModal.tsx index e662968..72f89eb 100644 --- a/src/pages/events/banner/components/BannerFormModal.tsx +++ b/src/pages/events/banner/components/BannerFormModal.tsx @@ -170,7 +170,7 @@ export default defineComponent({ params.areaName = cityName; } const res = await getEventList(params as any); - if (res.code == 200) { + if (res.code === '200') { const list: TournamentAdminVO[] = res.data?.list || []; setEventOptions( list.map((item) => ({ @@ -258,7 +258,7 @@ export default defineComponent({ setEditLoading(true); getEventDetail(eventId) .then((detailRes) => { - if (detailRes.code == 200) { + if (detailRes.code === '200') { const eventName = detailRes.data?.name || eventId; setEventOptions([{ value: eventId, label: eventName }]); } diff --git a/src/pages/events/banner/model/useBannerModel.ts b/src/pages/events/banner/model/useBannerModel.ts index 7adaafc..302d6af 100644 --- a/src/pages/events/banner/model/useBannerModel.ts +++ b/src/pages/events/banner/model/useBannerModel.ts @@ -82,7 +82,7 @@ export function useBannerModel() { loading, run: fetchList, } = useRequest(() => getBannerList(buildQueryParams()), { - formatResult: (res) => (res.code == 200 ? res.data : []), + formatResult: (res) => (res.code === '200' ? res.data : []), }); const allData = computed(() => data.value || []); @@ -198,7 +198,7 @@ export function useBannerModel() { const res = isEdit ? await updateBanner({ ...payload, id: editingRecord.value.id }) : await saveBanner(payload); - if (res.code == 200) { + if (res.code === '200') { message.success(isEdit ? '编辑成功' : '新增成功'); handleCloseModal(); handleSearch(); @@ -216,7 +216,7 @@ export function useBannerModel() { const handleDelete = useThrottleFn(async (record: any) => { try { const res = await delBanner(record.id); - if (res.code == 200) { + if (res.code === '200') { message.success('删除成功'); fetchList(); } else { @@ -233,7 +233,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}成功`); fetchList(); } else { diff --git a/src/pages/events/list/components/EventAuditModal.tsx b/src/pages/events/list/components/EventAuditModal.tsx index 892f4d8..7034f3f 100644 --- a/src/pages/events/list/components/EventAuditModal.tsx +++ b/src/pages/events/list/components/EventAuditModal.tsx @@ -42,7 +42,7 @@ export default defineComponent({ detail.value = null; try { const res = await getEventDetail(id); - if (res.code == 200) { + if (res.code === '200') { detail.value = res.data; } else { message.error(res.msg || '获取赛事详情失败'); diff --git a/src/pages/events/list/components/EventDetailModal.tsx b/src/pages/events/list/components/EventDetailModal.tsx index 83ebc9b..e363338 100644 --- a/src/pages/events/list/components/EventDetailModal.tsx +++ b/src/pages/events/list/components/EventDetailModal.tsx @@ -116,7 +116,7 @@ export default defineComponent({ page: String(page), limit: String(PAGE_SIZE), }); - if (res.code == 200) { + if (res.code === '200') { categoryPlayers.value[categoryId] = res.data.list; categoryPlayers.value = { ...categoryPlayers.value }; categoryPlayerTotal.value[categoryId] = res.data.total; @@ -143,7 +143,7 @@ export default defineComponent({ setDetail(null); try { const res = await getEventDetail(id); - if (res.code == 200 && res.data) { + if (res.code === '200' && res.data) { setDetail(res.data); // 为每个组别加载第一页选手 for (const cat of res.data.categoryList) { diff --git a/src/pages/events/list/components/EventRegulationModal.tsx b/src/pages/events/list/components/EventRegulationModal.tsx index ff09772..c5e4dd5 100644 --- a/src/pages/events/list/components/EventRegulationModal.tsx +++ b/src/pages/events/list/components/EventRegulationModal.tsx @@ -29,7 +29,7 @@ export default defineComponent({ ruleData.value = null; try { const res = await getRuleInfo(id); - if (res.code == 200 && res.data) { + if (res.code === '200' && res.data) { ruleData.value = res.data; } else { ruleData.value = null; diff --git a/src/pages/events/list/model/useEventListModel.ts b/src/pages/events/list/model/useEventListModel.ts index 1e84865..600c528 100644 --- a/src/pages/events/list/model/useEventListModel.ts +++ b/src/pages/events/list/model/useEventListModel.ts @@ -157,14 +157,14 @@ export function useEventListModel() { setTogglingId(record.id); try { const res = await toggleEventOnline({ id: record.id, online: isRemoved ? '1' : '0' }); - if (res.code === 200) { + if (res.code === '200') { message.success(`${actionText}成功`); fetchList(); } else { message.error(res.msg || `${actionText}失败`); } } catch (e: any) { - message.error(e?.message || `${actionText}失败`); + console.error(`${actionText}失败:`, e); } finally { setTogglingId(''); } diff --git a/src/pages/events/orders/components/OrderDetailModal.tsx b/src/pages/events/orders/components/OrderDetailModal.tsx index 42d17d4..645503e 100644 --- a/src/pages/events/orders/components/OrderDetailModal.tsx +++ b/src/pages/events/orders/components/OrderDetailModal.tsx @@ -148,7 +148,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); @@ -184,7 +184,7 @@ export default defineComponent({ else params['uniqueId'] = props.uniqueId; const [detailRes] = await Promise.all([getOrderDetail(params), fetchPlayers(1)]); - if (detailRes.code == 200) { + if (detailRes.code === '200') { setDetail(detailRes.data); } setDetailLoading(false); diff --git a/src/pages/events/orders/index.tsx b/src/pages/events/orders/index.tsx index 2b82bb7..a3cb303 100644 --- a/src/pages/events/orders/index.tsx +++ b/src/pages/events/orders/index.tsx @@ -38,7 +38,7 @@ function promptReRefund(record: any) { onOk: async () => { try { const res = await retryRefundOrder({ payOrderNo: record.orderNo }); - if (res.code == 200) { + if (res.code === '200') { message.success('重新退款提交成功'); } else { message.error(res.msg || '操作失败'); diff --git a/src/pages/events/users/model/useUserModel.ts b/src/pages/events/users/model/useUserModel.ts index af393ca..4fc97bf 100644 --- a/src/pages/events/users/model/useUserModel.ts +++ b/src/pages/events/users/model/useUserModel.ts @@ -124,7 +124,7 @@ export function useUserModel() { setTogglingId(record.id); try { const res = await toggleUserActive({ userId: record.id, status: isActive ? '0' : '1' }); - if (res.code == 200) { + if (res.code === '200') { message.success(`${actionText}成功`); fetchList(); } else { @@ -132,7 +132,6 @@ export function useUserModel() { } } catch (e: any) { console.error(`用户${actionText}失败:`, e); - message.error(`用户${actionText}失败`); } finally { setTogglingId(''); } diff --git a/src/pages/finance/reports/model/useReportsModel.ts b/src/pages/finance/reports/model/useReportsModel.ts index 4916a81..6a83e39 100644 --- a/src/pages/finance/reports/model/useReportsModel.ts +++ b/src/pages/finance/reports/model/useReportsModel.ts @@ -110,7 +110,7 @@ export function useReportsModel() { () => getFinanceReport(buildQueryParams()), { refreshDeps: [dateRange], - formatResult: (res) => (res.code == 200 ? res.data : null), + formatResult: (res) => (res.code === '200' ? res.data : null), }, ); diff --git a/src/pages/finance/wallet/components/WalletDetailModal.tsx b/src/pages/finance/wallet/components/WalletDetailModal.tsx index 9a7389a..890a1c6 100644 --- a/src/pages/finance/wallet/components/WalletDetailModal.tsx +++ b/src/pages/finance/wallet/components/WalletDetailModal.tsx @@ -66,7 +66,7 @@ export default defineComponent({ try { const params = buildQueryParams(); const res = await getWalletTransactionList(params); - if (res.code == 200) { + if (res.code === '200') { dataSource.value = res.data.list; pagination.total = res.data.total; } diff --git a/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx b/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx index 1bd89d2..9bd0629 100644 --- a/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx +++ b/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx @@ -48,7 +48,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 { @@ -136,7 +136,7 @@ export default defineComponent({ checkMsg: auditForm.remark.trim(), checkImg, }); - if (res.code == 200) { + if (res.code === '200') { message.success(auditForm.pass ? '已审核通过' : '已审核驳回'); props.onAudited?.(); props.onClose(); diff --git a/src/pages/login/model/useLoginModel.ts b/src/pages/login/model/useLoginModel.ts index 3f5346c..8bd1e52 100644 --- a/src/pages/login/model/useLoginModel.ts +++ b/src/pages/login/model/useLoginModel.ts @@ -69,7 +69,7 @@ export function useLoginModel() { try { const res = await login({ phone: form.phone, password: form.password }); - if (res.code != 200) { + if (res.code !== '200') { message.error(res.msg || '登录失败'); return; } diff --git a/src/pages/system/roles/components/RoleFormModal.tsx b/src/pages/system/roles/components/RoleFormModal.tsx index 596259a..c132bf2 100644 --- a/src/pages/system/roles/components/RoleFormModal.tsx +++ b/src/pages/system/roles/components/RoleFormModal.tsx @@ -45,7 +45,7 @@ export default defineComponent({ treeLoading.value = true; try { const res = await getPermissionTree(roleId); - if (res.code == 200 && res.data) { + if (res.code === '200' && res.data) { rawApiTree.value = res.data; const result = buildTreeData(res.data); treeData.value = result.treeData; diff --git a/src/pages/system/roles/components/UserListModal.tsx b/src/pages/system/roles/components/UserListModal.tsx index 9370dc1..1604cef 100644 --- a/src/pages/system/roles/components/UserListModal.tsx +++ b/src/pages/system/roles/components/UserListModal.tsx @@ -63,7 +63,7 @@ export default defineComponent({ roleId: String(props.roleId), ...(filterForm.text.trim() ? { text: filterForm.text.trim() } : {}), }); - if (res.code == 200) { + if (res.code === '200') { setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); } else { diff --git a/src/pages/system/roles/model/useRoleModel.ts b/src/pages/system/roles/model/useRoleModel.ts index b972057..0510047 100644 --- a/src/pages/system/roles/model/useRoleModel.ts +++ b/src/pages/system/roles/model/useRoleModel.ts @@ -152,7 +152,7 @@ export function useRoleModel() { menuIds, }); } - if (res.code == 200) { + if (res.code === '200') { message.success(isEdit.value ? '编辑成功' : '新增成功'); handleCloseForm(); fetchList(); @@ -170,7 +170,7 @@ export function useRoleModel() { const handleDelete = useThrottleFn(async (record: any) => { try { const res = await deleteRole(record.roleId); - if (res.code == 200) { + if (res.code === '200') { message.success('删除成功'); fetchList(); } else { diff --git a/src/pages/system/users/components/UserFormModal.tsx b/src/pages/system/users/components/UserFormModal.tsx index 7044d72..790c27d 100644 --- a/src/pages/system/users/components/UserFormModal.tsx +++ b/src/pages/system/users/components/UserFormModal.tsx @@ -71,7 +71,7 @@ export default defineComponent({ try { const params: Record = { page: '1', limit: '999', name: keyword.trim() }; const res = await getRoleList(params); - if (res.code == 200) { + if (res.code === '200') { const list: TournamentAdminRolePageVO[] = res.data?.list || []; setRoleOptions( list.map((item) => ({ @@ -91,7 +91,7 @@ export default defineComponent({ const fetchInitialRoles = async () => { try { const res = await getRoleList({ page: '1', limit: '999' }); - if (res.code == 200) { + if (res.code === '200') { const list: TournamentAdminRolePageVO[] = res.data?.list || []; const opts = list.map((item) => ({ value: String(item.roleId), diff --git a/src/pages/system/users/index.tsx b/src/pages/system/users/index.tsx index 0407f74..065975c 100644 --- a/src/pages/system/users/index.tsx +++ b/src/pages/system/users/index.tsx @@ -114,7 +114,7 @@ export default defineComponent({ userId: record.id, status: isActive ? '0' : '1', }); - if (res.code == 200) { + if (res.code === '200') { message.success(`${actionText}成功`); handleSearch(); } else { @@ -169,7 +169,7 @@ export default defineComponent({ confirmPassword: formPayload.password, }); } - if (res.code == 200) { + if (res.code === '200') { message.success(editingRecord.value ? '编辑成功' : '新增成功'); handleCloseModal(); handleSearch(); diff --git a/src/pages/system/users/model/useUserModel.ts b/src/pages/system/users/model/useUserModel.ts index 3be002d..787c69e 100644 --- a/src/pages/system/users/model/useUserModel.ts +++ b/src/pages/system/users/model/useUserModel.ts @@ -53,7 +53,7 @@ export function useUserModel() { const fetchRoleOptions = async () => { try { const res = await getRoleList({ page: '1', limit: '999' }); - if (res.code == 200) { + if (res.code === '200') { const list: TournamentAdminRolePageVO[] = res.data?.list || []; const opts = list.map((item) => ({ value: String(item.roleId), diff --git a/src/utils/request.ts b/src/utils/request.ts index f89036f..dee3b51 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -94,7 +94,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')); } -- 2.52.0 From 845829d0889dcc039db3d7e15e6e932fb543c57f Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 7 Aug 2026 09:32:26 +0800 Subject: [PATCH 09/27] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=A0=B7=E5=BC=8F=E4=B8=8E=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/events/list/components/EventDetailModal.tsx | 2 ++ src/pages/events/list/model/useEventListModel.ts | 4 ++-- .../events/orders/components/OrderDetailModal.tsx | 10 +++++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/pages/events/list/components/EventDetailModal.tsx b/src/pages/events/list/components/EventDetailModal.tsx index e363338..70288bd 100644 --- a/src/pages/events/list/components/EventDetailModal.tsx +++ b/src/pages/events/list/components/EventDetailModal.tsx @@ -1,6 +1,7 @@ import { defineComponent, computed, reactive, ref } from 'vue'; import { Modal, Descriptions, Image, Table, Pagination, Spin, Space } from 'ant-design-vue'; import { message } from 'ant-design-vue'; +import { EyeOutlined } from '@ant-design/icons-vue'; import { getEventDetail, getSignupList, @@ -43,6 +44,7 @@ const renderIdImages = (imgList: string[], singleImg: string) => { width={40} height={40} style={{ objectFit: 'cover', borderRadius: '4px', cursor: 'pointer' }} + previewMask={() => } /> ))} diff --git a/src/pages/events/list/model/useEventListModel.ts b/src/pages/events/list/model/useEventListModel.ts index 600c528..cda603c 100644 --- a/src/pages/events/list/model/useEventListModel.ts +++ b/src/pages/events/list/model/useEventListModel.ts @@ -145,8 +145,8 @@ export function useEventListModel() { const isRemoved = record.status === '4'; const actionText = isRemoved ? '上架' : '下架'; const descText = isRemoved - ? `确认上架"${record.name}"吗?上架后用户可搜索和报名该赛事。` - : `确认下架"${record.name}"吗?下架后用户将无法搜索和报名该赛事。`; + ? `确认上架"${record.name}"该赛事吗?` + : `确认下架"${record.name}"吗?下架后用户将无法搜索和报名该赛事,已有报名和订单不受影响。`; Modal.confirm({ title: `${actionText}确认`, diff --git a/src/pages/events/orders/components/OrderDetailModal.tsx b/src/pages/events/orders/components/OrderDetailModal.tsx index 645503e..c889e14 100644 --- a/src/pages/events/orders/components/OrderDetailModal.tsx +++ b/src/pages/events/orders/components/OrderDetailModal.tsx @@ -1,5 +1,6 @@ import { defineComponent, computed } from 'vue'; import { Modal, Table, Button, Pagination, Image, Space, Spin } from 'ant-design-vue'; +import { EyeOutlined } from '@ant-design/icons-vue'; import { StatusTag, type StatusTagTone } from '@/components'; import { useState, useEffect } from '@/hooks'; import { @@ -66,7 +67,14 @@ const PLAYER_COLUMNS = [ return ( {urls.map((src) => ( - + } + /> ))} ); -- 2.52.0 From ea24625805dd3d1c8eb58efad9e8ed3e019163bf Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 7 Aug 2026 11:14:16 +0800 Subject: [PATCH 10/27] =?UTF-8?q?fix:=20=E5=A4=84=E7=90=86=E9=83=A8?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E9=9D=A2=E9=98=B2=E6=8A=96=E6=BB=A5=E7=94=A8?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../payments/model/usePaymentsModel.ts | 32 +++++------------- .../finance/wallet/model/useWalletModel.ts | 24 ++++---------- .../withdraw/model/useWithdrawModel.ts | 33 +++++-------------- src/pages/system/logs/model/useLogModel.ts | 22 +++++-------- 4 files changed, 32 insertions(+), 79 deletions(-) diff --git a/src/pages/finance/payments/model/usePaymentsModel.ts b/src/pages/finance/payments/model/usePaymentsModel.ts index 9ca9a22..bbfe61b 100644 --- a/src/pages/finance/payments/model/usePaymentsModel.ts +++ b/src/pages/finance/payments/model/usePaymentsModel.ts @@ -1,12 +1,5 @@ -import { computed, reactive, toRef, Ref, nextTick } from 'vue'; -import { - useDebounce, - useThrottleFn, - useRequest, - usePagination, - useEffect, - syncPaginationTotal, -} from '@/hooks'; +import { computed, reactive, nextTick } from 'vue'; +import { useThrottleFn, useRequest, usePagination, useEffect, syncPaginationTotal } from '@/hooks'; import { getPaymentFlowList, type PaymentFlowVO, type PaymentFlowQueryParams } from './services'; import dayjs from 'dayjs'; @@ -38,15 +31,6 @@ export function usePaymentsModel() { type: '', }); - const { debouncedValue: debouncedNickname } = useDebounce( - toRef(filterForm, 'nickname') as Ref, - { delay: 300 }, - ); - const { debouncedValue: debouncedPhone } = useDebounce( - toRef(filterForm, 'phone') as Ref, - { delay: 300 }, - ); - // ===== 分页 ===== const pagination = usePagination({ defaultCurrent: 1, defaultPageSize: 10 }); @@ -61,8 +45,8 @@ export function usePaymentsModel() { if (start) params.createDateBegin = dayjs(start).format('YYYY-MM-DD'); if (end) params.createDateEnd = dayjs(end).format('YYYY-MM-DD'); } - if (debouncedNickname.value.trim()) params.nickname = debouncedNickname.value.trim(); - if (debouncedPhone.value.trim()) params.phone = debouncedPhone.value.trim(); + if (filterForm.nickname.trim()) params.nickname = filterForm.nickname.trim(); + if (filterForm.phone.trim()) params.phone = filterForm.phone.trim(); if (filterForm.type) params.type = filterForm.type; return params; }; @@ -124,18 +108,18 @@ export function usePaymentsModel() { const hasFilter = computed(() => { return ( filterForm.timeRange !== null || - debouncedNickname.value.trim() !== '' || - debouncedPhone.value.trim() !== '' || + filterForm.nickname.trim() !== '' || + filterForm.phone.trim() !== '' || filterForm.type !== '' ); }); // ===== 方法 ===== - const handleSearch = () => { + const handleSearch = useThrottleFn(() => { pagination.reset(); fetchList(); - }; + }, 300); const handleReset = useThrottleFn(async () => { filterForm.timeRange = null; diff --git a/src/pages/finance/wallet/model/useWalletModel.ts b/src/pages/finance/wallet/model/useWalletModel.ts index d72eedc..e289022 100644 --- a/src/pages/finance/wallet/model/useWalletModel.ts +++ b/src/pages/finance/wallet/model/useWalletModel.ts @@ -1,7 +1,6 @@ -import { computed, reactive, toRef, Ref, nextTick } from 'vue'; +import { computed, reactive, nextTick } from 'vue'; import { useState, - useDebounce, useThrottleFn, useRequest, usePagination, @@ -57,15 +56,6 @@ export function useWalletModel() { maxBalance: '', }); - const { debouncedValue: debouncedNickname } = useDebounce( - toRef(filterForm, 'nickname') as Ref, - { delay: 300 }, - ); - const { debouncedValue: debouncedPhone } = useDebounce( - toRef(filterForm, 'phone') as Ref, - { delay: 300 }, - ); - // ===== 分页 ===== const pagination = usePagination({ defaultCurrent: 1, defaultPageSize: 10 }); @@ -83,8 +73,8 @@ export function useWalletModel() { page: String((pagination as any).current.value), limit: String((pagination as any).pageSize.value), }; - if (debouncedNickname.value.trim()) params.nickname = debouncedNickname.value.trim(); - if (debouncedPhone.value.trim()) params.phone = debouncedPhone.value.trim(); + if (filterForm.nickname.trim()) params.nickname = filterForm.nickname.trim(); + if (filterForm.phone.trim()) params.phone = filterForm.phone.trim(); if (filterForm.minBalance) params.amountBegin = filterForm.minBalance; if (filterForm.maxBalance) params.amountEnd = filterForm.maxBalance; return params; @@ -150,8 +140,8 @@ export function useWalletModel() { // ===== 计算属性 ===== const hasFilter = computed(() => { return ( - debouncedNickname.value.trim() !== '' || - debouncedPhone.value.trim() !== '' || + filterForm.nickname.trim() !== '' || + filterForm.phone.trim() !== '' || filterForm.minBalance !== '' || filterForm.maxBalance !== '' ); @@ -159,10 +149,10 @@ export function useWalletModel() { // ===== 方法 ===== - const handleSearch = () => { + const handleSearch = useThrottleFn(() => { pagination.reset(); fetchList(); - }; + }, 300); const handleReset = useThrottleFn(async () => { filterForm.nickname = ''; diff --git a/src/pages/finance/withdraw/model/useWithdrawModel.ts b/src/pages/finance/withdraw/model/useWithdrawModel.ts index 1573814..7fc9518 100644 --- a/src/pages/finance/withdraw/model/useWithdrawModel.ts +++ b/src/pages/finance/withdraw/model/useWithdrawModel.ts @@ -1,8 +1,7 @@ -import { computed, reactive, toRef, Ref, h, nextTick } from 'vue'; +import { computed, reactive, h, nextTick } from 'vue'; import { StatusTag, type StatusTagTone } from '@/components'; import { useState, - useDebounce, useThrottleFn, useRequest, usePagination, @@ -87,20 +86,6 @@ export function useWithdrawModel() { payStatus: '', }); - // 可搜索字段防抖 - const { debouncedValue: debouncedNickname } = useDebounce( - toRef(filterForm, 'nickname') as Ref, - { delay: 300 }, - ); - const { debouncedValue: debouncedPhone } = useDebounce( - toRef(filterForm, 'phone') as Ref, - { delay: 300 }, - ); - const { debouncedValue: debouncedRealName } = useDebounce( - toRef(filterForm, 'realName') as Ref, - { delay: 300 }, - ); - // ===== 分页 ===== const pagination = usePagination({ defaultCurrent: 1, defaultPageSize: 10 }); @@ -110,9 +95,9 @@ export function useWithdrawModel() { page: String((pagination as any).current.value), limit: String((pagination as any).pageSize.value), }; - if (debouncedNickname.value.trim()) params.nickname = debouncedNickname.value.trim(); - if (debouncedPhone.value.trim()) params.phone = debouncedPhone.value.trim(); - if (debouncedRealName.value.trim()) params.realName = debouncedRealName.value.trim(); + if (filterForm.nickname.trim()) params.nickname = filterForm.nickname.trim(); + if (filterForm.phone.trim()) params.phone = filterForm.phone.trim(); + if (filterForm.realName.trim()) params.realName = filterForm.realName.trim(); if (filterForm.auditStatus) params.auditStatus = filterForm.auditStatus; if (filterForm.payStatus) params.payStatus = filterForm.payStatus; return params; @@ -169,9 +154,9 @@ export function useWithdrawModel() { // ===== 计算属性 ===== const hasFilter = computed(() => { return ( - debouncedNickname.value.trim() !== '' || - debouncedPhone.value.trim() !== '' || - debouncedRealName.value.trim() !== '' || + filterForm.nickname.trim() !== '' || + filterForm.phone.trim() !== '' || + filterForm.realName.trim() !== '' || filterForm.auditStatus !== '' || filterForm.payStatus !== '' ); @@ -179,10 +164,10 @@ export function useWithdrawModel() { // ===== 方法 ===== - const handleSearch = () => { + const handleSearch = useThrottleFn(() => { pagination.reset(); fetchList(); - }; + }, 300); /** 重置(重置后自动查询) */ const handleReset = useThrottleFn(async () => { diff --git a/src/pages/system/logs/model/useLogModel.ts b/src/pages/system/logs/model/useLogModel.ts index 313e56f..9c164b9 100644 --- a/src/pages/system/logs/model/useLogModel.ts +++ b/src/pages/system/logs/model/useLogModel.ts @@ -1,6 +1,6 @@ -import { computed, reactive, toRef, Ref, nextTick } from 'vue'; +import { computed, reactive, nextTick } from 'vue'; import dayjs from 'dayjs'; -import { useDebounce, useThrottleFn } from '@/hooks'; +import { useThrottleFn } from '@/hooks'; import { useRequest } from '@/hooks/useRequest'; import { useEffect } from '@/hooks/useEffect'; import { usePagination, syncPaginationTotal } from '@/hooks/usePagination'; @@ -48,12 +48,6 @@ export function useLogModel() { searchOperator: '', }); - // 操作人字段防抖 300ms - const { debouncedValue: debouncedOperator } = useDebounce( - toRef(filterForm, 'searchOperator') as Ref, - { delay: 300 }, - ); - // ===== 分页 ===== const pagination = usePagination({ defaultCurrent: 1, defaultPageSize: 10 }); @@ -76,9 +70,9 @@ export function useLogModel() { params.type = filterForm.actionType; } - // 操作人昵称(防抖后的值) - if (debouncedOperator.value.trim()) { - params.nickname = debouncedOperator.value.trim(); + // 操作人昵称 + if (filterForm.searchOperator.trim()) { + params.nickname = filterForm.searchOperator.trim(); } return params; @@ -116,16 +110,16 @@ export function useLogModel() { return ( filterForm.actionTimeRange !== null || filterForm.actionType !== '' || - debouncedOperator.value.trim() !== '' + filterForm.searchOperator.trim() !== '' ); }); // ===== 方法 ===== - const handleSearch = () => { + const handleSearch = useThrottleFn(() => { pagination.reset(); fetchList(); - }; + }, 300); /** 重置(重置后自动查询) */ const handleReset = useThrottleFn(async () => { -- 2.52.0 From 05c3d518fac690e30ddd823ad2f33c4277d08158 Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 7 Aug 2026 11:20:30 +0800 Subject: [PATCH 11/27] =?UTF-8?q?fix:=20=E5=85=BC=E5=AE=B9=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=20code=20=E7=B1=BB=E5=9E=8B=E4=B8=8D=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/banner/types.ts | 2 +- src/api/events/types.ts | 2 +- src/api/login/index.ts | 2 +- src/api/logs/types.ts | 2 +- src/api/orders/types.ts | 2 +- src/api/payments/types.ts | 2 +- src/api/reports/types.ts | 2 +- src/api/roles/types.ts | 2 +- src/api/users/types.ts | 2 +- src/api/wallet/types.ts | 2 +- src/api/withdraw/types.ts | 2 +- src/layouts/BasicLayout.tsx | 2 +- src/pages/events/banner/components/BannerFormModal.tsx | 4 ++-- src/pages/events/banner/model/useBannerModel.ts | 8 ++++---- src/pages/events/list/components/EventAuditModal.tsx | 2 +- src/pages/events/list/components/EventDetailModal.tsx | 4 ++-- src/pages/events/list/components/EventRegulationModal.tsx | 2 +- src/pages/events/list/model/useEventListModel.ts | 2 +- src/pages/events/orders/components/OrderDetailModal.tsx | 4 ++-- src/pages/events/orders/index.tsx | 2 +- src/pages/events/users/model/useUserModel.ts | 2 +- src/pages/finance/reports/model/useReportsModel.ts | 2 +- src/pages/finance/wallet/components/WalletDetailModal.tsx | 2 +- .../finance/withdraw/components/WithdrawDetailModal.tsx | 4 ++-- src/pages/login/model/useLoginModel.ts | 2 +- src/pages/system/roles/components/RoleFormModal.tsx | 2 +- src/pages/system/roles/components/UserListModal.tsx | 2 +- src/pages/system/roles/model/useRoleModel.ts | 4 ++-- src/pages/system/users/components/UserFormModal.tsx | 4 ++-- src/pages/system/users/index.tsx | 4 ++-- src/pages/system/users/model/useUserModel.ts | 2 +- src/utils/request.ts | 2 +- 32 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/api/banner/types.ts b/src/api/banner/types.ts index 78784cf..ad2ac86 100644 --- a/src/api/banner/types.ts +++ b/src/api/banner/types.ts @@ -47,7 +47,7 @@ export interface BannerActiveParams { } export interface ApiResult { - code: string; + code: number | string; msg: string; data: T; } diff --git a/src/api/events/types.ts b/src/api/events/types.ts index 899d37f..d7e25cd 100644 --- a/src/api/events/types.ts +++ b/src/api/events/types.ts @@ -87,7 +87,7 @@ export interface PageData { /** 统一响应包裹 */ export interface ApiResult { /** 编码:200表示成功,其他值表示失败 */ - code: string; + code: number | string; /** 消息内容 */ msg: string; /** 响应数据 */ diff --git a/src/api/login/index.ts b/src/api/login/index.ts index 3e98c80..a5f9cb5 100644 --- a/src/api/login/index.ts +++ b/src/api/login/index.ts @@ -5,7 +5,7 @@ export type { LoginResult } from './types'; export const login = (params: { phone: string; password: string }) => { return post(`/op/login`, params) as Promise<{ - code: string; + code: number | string; msg: string; data: LoginResult; }>; diff --git a/src/api/logs/types.ts b/src/api/logs/types.ts index 9c009da..cda14a7 100644 --- a/src/api/logs/types.ts +++ b/src/api/logs/types.ts @@ -57,7 +57,7 @@ export interface PageData { } export interface ApiResult { - code: string; + code: number | string; msg: string; data: T; } diff --git a/src/api/orders/types.ts b/src/api/orders/types.ts index bfd78d1..b83bff0 100644 --- a/src/api/orders/types.ts +++ b/src/api/orders/types.ts @@ -88,7 +88,7 @@ export interface PageData { /** 统一响应包裹 */ export interface ApiResult { - code: string; + code: number | string; msg: string; data: T; } diff --git a/src/api/payments/types.ts b/src/api/payments/types.ts index ac31087..a946cec 100644 --- a/src/api/payments/types.ts +++ b/src/api/payments/types.ts @@ -58,7 +58,7 @@ export interface PaymentFlowPageData { } export interface ApiResult { - code: string; + code: number | string; msg: string; data: T; } diff --git a/src/api/reports/types.ts b/src/api/reports/types.ts index 709878c..d82a477 100644 --- a/src/api/reports/types.ts +++ b/src/api/reports/types.ts @@ -42,7 +42,7 @@ export interface ReportQueryParams { } export interface ApiResult { - code: string; + code: number | string; msg: string; data: T; } diff --git a/src/api/roles/types.ts b/src/api/roles/types.ts index 8c04cef..fc9b4d1 100644 --- a/src/api/roles/types.ts +++ b/src/api/roles/types.ts @@ -59,7 +59,7 @@ export interface PageData { list: T[]; } export interface ApiResult { - code: string; + code: number | string; msg: string; data: T; } diff --git a/src/api/users/types.ts b/src/api/users/types.ts index 3941627..1c8eb6c 100644 --- a/src/api/users/types.ts +++ b/src/api/users/types.ts @@ -65,7 +65,7 @@ export interface PageData { list: T[]; } export interface ApiResult { - code: string; + code: number | string; msg: string; data: T; } diff --git a/src/api/wallet/types.ts b/src/api/wallet/types.ts index a00aee0..b898703 100644 --- a/src/api/wallet/types.ts +++ b/src/api/wallet/types.ts @@ -55,7 +55,7 @@ export interface PageData { list: T[]; } export interface ApiResult { - code: string; + code: number | string; msg: string; data: T; } diff --git a/src/api/withdraw/types.ts b/src/api/withdraw/types.ts index 38e53bc..4143c16 100644 --- a/src/api/withdraw/types.ts +++ b/src/api/withdraw/types.ts @@ -50,7 +50,7 @@ export interface PageData { list: T[]; } export interface ApiResult { - code: string; + code: number | string; msg: string; data: T; } diff --git a/src/layouts/BasicLayout.tsx b/src/layouts/BasicLayout.tsx index 56afa29..bcbd633 100644 --- a/src/layouts/BasicLayout.tsx +++ b/src/layouts/BasicLayout.tsx @@ -136,7 +136,7 @@ export default defineComponent({ password: payload.newPassword, confirmPassword: payload.newPassword, }); - if (res.code === '200') { + if (res.code == 200) { message.success('密码修改成功'); setChangePwdVisible(false); window.setTimeout(() => { diff --git a/src/pages/events/banner/components/BannerFormModal.tsx b/src/pages/events/banner/components/BannerFormModal.tsx index 72f89eb..e662968 100644 --- a/src/pages/events/banner/components/BannerFormModal.tsx +++ b/src/pages/events/banner/components/BannerFormModal.tsx @@ -170,7 +170,7 @@ export default defineComponent({ params.areaName = cityName; } const res = await getEventList(params as any); - if (res.code === '200') { + if (res.code == 200) { const list: TournamentAdminVO[] = res.data?.list || []; setEventOptions( list.map((item) => ({ @@ -258,7 +258,7 @@ export default defineComponent({ setEditLoading(true); getEventDetail(eventId) .then((detailRes) => { - if (detailRes.code === '200') { + if (detailRes.code == 200) { const eventName = detailRes.data?.name || eventId; setEventOptions([{ value: eventId, label: eventName }]); } diff --git a/src/pages/events/banner/model/useBannerModel.ts b/src/pages/events/banner/model/useBannerModel.ts index 302d6af..7adaafc 100644 --- a/src/pages/events/banner/model/useBannerModel.ts +++ b/src/pages/events/banner/model/useBannerModel.ts @@ -82,7 +82,7 @@ export function useBannerModel() { loading, run: fetchList, } = useRequest(() => getBannerList(buildQueryParams()), { - formatResult: (res) => (res.code === '200' ? res.data : []), + formatResult: (res) => (res.code == 200 ? res.data : []), }); const allData = computed(() => data.value || []); @@ -198,7 +198,7 @@ export function useBannerModel() { const res = isEdit ? await updateBanner({ ...payload, id: editingRecord.value.id }) : await saveBanner(payload); - if (res.code === '200') { + if (res.code == 200) { message.success(isEdit ? '编辑成功' : '新增成功'); handleCloseModal(); handleSearch(); @@ -216,7 +216,7 @@ export function useBannerModel() { const handleDelete = useThrottleFn(async (record: any) => { try { const res = await delBanner(record.id); - if (res.code === '200') { + if (res.code == 200) { message.success('删除成功'); fetchList(); } else { @@ -233,7 +233,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}成功`); fetchList(); } else { diff --git a/src/pages/events/list/components/EventAuditModal.tsx b/src/pages/events/list/components/EventAuditModal.tsx index 7034f3f..892f4d8 100644 --- a/src/pages/events/list/components/EventAuditModal.tsx +++ b/src/pages/events/list/components/EventAuditModal.tsx @@ -42,7 +42,7 @@ export default defineComponent({ detail.value = null; try { const res = await getEventDetail(id); - if (res.code === '200') { + if (res.code == 200) { detail.value = res.data; } else { message.error(res.msg || '获取赛事详情失败'); diff --git a/src/pages/events/list/components/EventDetailModal.tsx b/src/pages/events/list/components/EventDetailModal.tsx index 70288bd..a7a0503 100644 --- a/src/pages/events/list/components/EventDetailModal.tsx +++ b/src/pages/events/list/components/EventDetailModal.tsx @@ -118,7 +118,7 @@ export default defineComponent({ page: String(page), limit: String(PAGE_SIZE), }); - if (res.code === '200') { + if (res.code == 200) { categoryPlayers.value[categoryId] = res.data.list; categoryPlayers.value = { ...categoryPlayers.value }; categoryPlayerTotal.value[categoryId] = res.data.total; @@ -145,7 +145,7 @@ export default defineComponent({ setDetail(null); try { const res = await getEventDetail(id); - if (res.code === '200' && res.data) { + if (res.code == 200 && res.data) { setDetail(res.data); // 为每个组别加载第一页选手 for (const cat of res.data.categoryList) { diff --git a/src/pages/events/list/components/EventRegulationModal.tsx b/src/pages/events/list/components/EventRegulationModal.tsx index c5e4dd5..ff09772 100644 --- a/src/pages/events/list/components/EventRegulationModal.tsx +++ b/src/pages/events/list/components/EventRegulationModal.tsx @@ -29,7 +29,7 @@ export default defineComponent({ ruleData.value = null; try { const res = await getRuleInfo(id); - if (res.code === '200' && res.data) { + if (res.code == 200 && res.data) { ruleData.value = res.data; } else { ruleData.value = null; diff --git a/src/pages/events/list/model/useEventListModel.ts b/src/pages/events/list/model/useEventListModel.ts index cda603c..7c7c243 100644 --- a/src/pages/events/list/model/useEventListModel.ts +++ b/src/pages/events/list/model/useEventListModel.ts @@ -157,7 +157,7 @@ export function useEventListModel() { setTogglingId(record.id); try { const res = await toggleEventOnline({ id: record.id, online: isRemoved ? '1' : '0' }); - if (res.code === '200') { + if (res.code == 200) { message.success(`${actionText}成功`); fetchList(); } else { diff --git a/src/pages/events/orders/components/OrderDetailModal.tsx b/src/pages/events/orders/components/OrderDetailModal.tsx index c889e14..0622284 100644 --- a/src/pages/events/orders/components/OrderDetailModal.tsx +++ b/src/pages/events/orders/components/OrderDetailModal.tsx @@ -156,7 +156,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); @@ -192,7 +192,7 @@ export default defineComponent({ else params['uniqueId'] = props.uniqueId; const [detailRes] = await Promise.all([getOrderDetail(params), fetchPlayers(1)]); - if (detailRes.code === '200') { + if (detailRes.code == 200) { setDetail(detailRes.data); } setDetailLoading(false); diff --git a/src/pages/events/orders/index.tsx b/src/pages/events/orders/index.tsx index a3cb303..2b82bb7 100644 --- a/src/pages/events/orders/index.tsx +++ b/src/pages/events/orders/index.tsx @@ -38,7 +38,7 @@ function promptReRefund(record: any) { onOk: async () => { try { const res = await retryRefundOrder({ payOrderNo: record.orderNo }); - if (res.code === '200') { + if (res.code == 200) { message.success('重新退款提交成功'); } else { message.error(res.msg || '操作失败'); diff --git a/src/pages/events/users/model/useUserModel.ts b/src/pages/events/users/model/useUserModel.ts index 4fc97bf..b3ca659 100644 --- a/src/pages/events/users/model/useUserModel.ts +++ b/src/pages/events/users/model/useUserModel.ts @@ -124,7 +124,7 @@ export function useUserModel() { setTogglingId(record.id); try { const res = await toggleUserActive({ userId: record.id, status: isActive ? '0' : '1' }); - if (res.code === '200') { + if (res.code == 200) { message.success(`${actionText}成功`); fetchList(); } else { diff --git a/src/pages/finance/reports/model/useReportsModel.ts b/src/pages/finance/reports/model/useReportsModel.ts index 6a83e39..4916a81 100644 --- a/src/pages/finance/reports/model/useReportsModel.ts +++ b/src/pages/finance/reports/model/useReportsModel.ts @@ -110,7 +110,7 @@ export function useReportsModel() { () => getFinanceReport(buildQueryParams()), { refreshDeps: [dateRange], - formatResult: (res) => (res.code === '200' ? res.data : null), + formatResult: (res) => (res.code == 200 ? res.data : null), }, ); diff --git a/src/pages/finance/wallet/components/WalletDetailModal.tsx b/src/pages/finance/wallet/components/WalletDetailModal.tsx index 890a1c6..9a7389a 100644 --- a/src/pages/finance/wallet/components/WalletDetailModal.tsx +++ b/src/pages/finance/wallet/components/WalletDetailModal.tsx @@ -66,7 +66,7 @@ export default defineComponent({ try { const params = buildQueryParams(); const res = await getWalletTransactionList(params); - if (res.code === '200') { + if (res.code == 200) { dataSource.value = res.data.list; pagination.total = res.data.total; } diff --git a/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx b/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx index 9bd0629..1bd89d2 100644 --- a/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx +++ b/src/pages/finance/withdraw/components/WithdrawDetailModal.tsx @@ -48,7 +48,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 { @@ -136,7 +136,7 @@ export default defineComponent({ checkMsg: auditForm.remark.trim(), checkImg, }); - if (res.code === '200') { + if (res.code == 200) { message.success(auditForm.pass ? '已审核通过' : '已审核驳回'); props.onAudited?.(); props.onClose(); diff --git a/src/pages/login/model/useLoginModel.ts b/src/pages/login/model/useLoginModel.ts index 8bd1e52..3f5346c 100644 --- a/src/pages/login/model/useLoginModel.ts +++ b/src/pages/login/model/useLoginModel.ts @@ -69,7 +69,7 @@ export function useLoginModel() { try { const res = await login({ phone: form.phone, password: form.password }); - if (res.code !== '200') { + if (res.code != 200) { message.error(res.msg || '登录失败'); return; } diff --git a/src/pages/system/roles/components/RoleFormModal.tsx b/src/pages/system/roles/components/RoleFormModal.tsx index c132bf2..596259a 100644 --- a/src/pages/system/roles/components/RoleFormModal.tsx +++ b/src/pages/system/roles/components/RoleFormModal.tsx @@ -45,7 +45,7 @@ export default defineComponent({ treeLoading.value = true; try { const res = await getPermissionTree(roleId); - if (res.code === '200' && res.data) { + if (res.code == 200 && res.data) { rawApiTree.value = res.data; const result = buildTreeData(res.data); treeData.value = result.treeData; diff --git a/src/pages/system/roles/components/UserListModal.tsx b/src/pages/system/roles/components/UserListModal.tsx index 1604cef..9370dc1 100644 --- a/src/pages/system/roles/components/UserListModal.tsx +++ b/src/pages/system/roles/components/UserListModal.tsx @@ -63,7 +63,7 @@ export default defineComponent({ roleId: String(props.roleId), ...(filterForm.text.trim() ? { text: filterForm.text.trim() } : {}), }); - if (res.code === '200') { + if (res.code == 200) { setDataSource(res.data.list); setPagination({ ...pagination.value, total: res.data.total }); } else { diff --git a/src/pages/system/roles/model/useRoleModel.ts b/src/pages/system/roles/model/useRoleModel.ts index 0510047..b972057 100644 --- a/src/pages/system/roles/model/useRoleModel.ts +++ b/src/pages/system/roles/model/useRoleModel.ts @@ -152,7 +152,7 @@ export function useRoleModel() { menuIds, }); } - if (res.code === '200') { + if (res.code == 200) { message.success(isEdit.value ? '编辑成功' : '新增成功'); handleCloseForm(); fetchList(); @@ -170,7 +170,7 @@ export function useRoleModel() { const handleDelete = useThrottleFn(async (record: any) => { try { const res = await deleteRole(record.roleId); - if (res.code === '200') { + if (res.code == 200) { message.success('删除成功'); fetchList(); } else { diff --git a/src/pages/system/users/components/UserFormModal.tsx b/src/pages/system/users/components/UserFormModal.tsx index 790c27d..7044d72 100644 --- a/src/pages/system/users/components/UserFormModal.tsx +++ b/src/pages/system/users/components/UserFormModal.tsx @@ -71,7 +71,7 @@ export default defineComponent({ try { const params: Record = { page: '1', limit: '999', name: keyword.trim() }; const res = await getRoleList(params); - if (res.code === '200') { + if (res.code == 200) { const list: TournamentAdminRolePageVO[] = res.data?.list || []; setRoleOptions( list.map((item) => ({ @@ -91,7 +91,7 @@ export default defineComponent({ const fetchInitialRoles = async () => { try { const res = await getRoleList({ page: '1', limit: '999' }); - if (res.code === '200') { + if (res.code == 200) { const list: TournamentAdminRolePageVO[] = res.data?.list || []; const opts = list.map((item) => ({ value: String(item.roleId), diff --git a/src/pages/system/users/index.tsx b/src/pages/system/users/index.tsx index 065975c..0407f74 100644 --- a/src/pages/system/users/index.tsx +++ b/src/pages/system/users/index.tsx @@ -114,7 +114,7 @@ export default defineComponent({ userId: record.id, status: isActive ? '0' : '1', }); - if (res.code === '200') { + if (res.code == 200) { message.success(`${actionText}成功`); handleSearch(); } else { @@ -169,7 +169,7 @@ export default defineComponent({ confirmPassword: formPayload.password, }); } - if (res.code === '200') { + if (res.code == 200) { message.success(editingRecord.value ? '编辑成功' : '新增成功'); handleCloseModal(); handleSearch(); diff --git a/src/pages/system/users/model/useUserModel.ts b/src/pages/system/users/model/useUserModel.ts index 787c69e..3be002d 100644 --- a/src/pages/system/users/model/useUserModel.ts +++ b/src/pages/system/users/model/useUserModel.ts @@ -53,7 +53,7 @@ export function useUserModel() { const fetchRoleOptions = async () => { try { const res = await getRoleList({ page: '1', limit: '999' }); - if (res.code === '200') { + if (res.code == 200) { const list: TournamentAdminRolePageVO[] = res.data?.list || []; const opts = list.map((item) => ({ value: String(item.roleId), diff --git a/src/utils/request.ts b/src/utils/request.ts index dee3b51..f89036f 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -94,7 +94,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')); } -- 2.52.0 From 117a7f408f1291eb3b4d1fdb6c236d4eddf919c8 Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 7 Aug 2026 11:26:49 +0800 Subject: [PATCH 12/27] =?UTF-8?q?fix:=20=E5=AF=B9=E6=8E=A5=E7=99=BB?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/login/index.ts | 7 +++++++ src/hooks/useAuth.ts | 10 ++++++++-- src/layouts/BasicLayout.tsx | 2 -- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/api/login/index.ts b/src/api/login/index.ts index a5f9cb5..aff4797 100644 --- a/src/api/login/index.ts +++ b/src/api/login/index.ts @@ -10,3 +10,10 @@ export const login = (params: { phone: string; password: string }) => { data: LoginResult; }>; }; + +export const logout = () => { + return post(`/op/logout`) as Promise<{ + code: number | string; + msg: string; + }>; +}; diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts index 8a81d87..093b576 100644 --- a/src/hooks/useAuth.ts +++ b/src/hooks/useAuth.ts @@ -7,6 +7,7 @@ import { usePermissionStore } from '@/stores/permissionStore'; import { useTabsStore } from '@/stores/tabsStore'; import { useUserStore } from '@/stores/userStore'; import { clearAuthDataCache } from '@/api/authCache'; +import { logout as logoutApi } from '@/api/login'; import router from '@/router'; const TOKEN_KEY = 'MY_APP_AUTH_TOKEN'; @@ -66,9 +67,14 @@ function createAuth() { }; /** - * 退出:清除 token → 清除菜单+权限 → 清除动态路由 → 跳转登录页 + * 退出:调用登出接口 → 清除 token → 清除菜单+权限 → 清除动态路由 → 跳转登录页 */ - const logout = () => { + const logout = async () => { + try { + await logoutApi(); + } catch { + // 即使接口失败也要继续清除本地会话 + } clearSession(); router.push('/login'); }; diff --git a/src/layouts/BasicLayout.tsx b/src/layouts/BasicLayout.tsx index bcbd633..ba05f1e 100644 --- a/src/layouts/BasicLayout.tsx +++ b/src/layouts/BasicLayout.tsx @@ -113,8 +113,6 @@ export default defineComponent({ okText: '确认', cancelText: '取消', onOk: () => { - const { clearUser } = useUserStore(); - clearUser(); auth.logout(); }, }); -- 2.52.0 From ba71b504e71673382778d08e8220dc81d52078d9 Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 7 Aug 2026 14:30:54 +0800 Subject: [PATCH 13/27] =?UTF-8?q?fix:=20=E6=9D=82=E9=A1=B9=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wallet/types.ts | 2 ++ src/layouts/BasicLayout.tsx | 6 ++-- .../payments/model/usePaymentsModel.ts | 20 +++++++++---- .../wallet/components/WalletDetailModal.tsx | 8 +++++ .../finance/wallet/model/useWalletModel.ts | 21 ++++++++++++-- .../components/UserListModal.module.less | 5 ++-- .../system/roles/components/UserListModal.tsx | 29 +++++++++---------- src/pages/system/users/index.tsx | 11 ++++--- src/pages/system/users/model/services.ts | 2 +- src/pages/system/users/model/useUserModel.ts | 6 ++-- 10 files changed, 74 insertions(+), 36 deletions(-) diff --git a/src/api/wallet/types.ts b/src/api/wallet/types.ts index b898703..7dba886 100644 --- a/src/api/wallet/types.ts +++ b/src/api/wallet/types.ts @@ -84,6 +84,8 @@ export interface WalletTransactionVO { orderNo: string; /** 时间 */ createDate: string; + /** 状态;1=已解冻,2=冻结中,3=正常 */ + status: number; } /** 交易明细查询参数 */ diff --git a/src/layouts/BasicLayout.tsx b/src/layouts/BasicLayout.tsx index ba05f1e..6e6c1b6 100644 --- a/src/layouts/BasicLayout.tsx +++ b/src/layouts/BasicLayout.tsx @@ -79,7 +79,7 @@ export default defineComponent({ const { menuItems } = useMenuStore(); const { phone, nickname } = useUserStore(); - const displayName = computed(() => nickname.value || phone.value); + const displayName = computed(() => phone.value || nickname.value); const { tabs, cachedViews, @@ -108,8 +108,8 @@ export default defineComponent({ /** ===== 退出登录 ===== */ const handleLogout = () => { Modal.confirm({ - title: '提示', - content: '是否退出登录?', + title: '确认退出', + content: '确认要退出当前账号吗?', okText: '确认', cancelText: '取消', onOk: () => { diff --git a/src/pages/finance/payments/model/usePaymentsModel.ts b/src/pages/finance/payments/model/usePaymentsModel.ts index bbfe61b..78ea579 100644 --- a/src/pages/finance/payments/model/usePaymentsModel.ts +++ b/src/pages/finance/payments/model/usePaymentsModel.ts @@ -1,4 +1,5 @@ -import { computed, reactive, nextTick } from 'vue'; +import { computed, reactive, nextTick, h } from 'vue'; +import { StatusTag, type StatusTagTone } from '@/components'; import { useThrottleFn, useRequest, usePagination, useEffect, syncPaginationTotal } from '@/hooks'; import { getPaymentFlowList, type PaymentFlowVO, type PaymentFlowQueryParams } from './services'; import dayjs from 'dayjs'; @@ -13,11 +14,20 @@ export const PAYMENT_TYPE_OPTIONS = [ { value: '2', label: '取消报名' }, ] as const; -export const PAYMENT_TYPE_MAP: Record = { - 1: '报名', - 2: '取消报名', +export const PAYMENT_TYPE_MAP: Record = { + 1: { label: '报名', tone: 'success' }, + 2: { label: '取消报名', tone: 'default' }, }; +/** 渲染交易类型 StatusTag */ +export function renderPaymentType(type: number) { + const info = PAYMENT_TYPE_MAP[type] || { + label: String(type ?? '--'), + tone: 'default' as const, + }; + return h(StatusTag, { label: info.label, tone: info.tone }); +} + // ============================================================ // Model // ============================================================ @@ -90,7 +100,7 @@ export function usePaymentsModel() { dataIndex: 'type', key: 'type', width: 110, - customRender: ({ text }: { text: number }) => PAYMENT_TYPE_MAP[text] || text || '--', + customRender: ({ text }: { text: number }) => renderPaymentType(text), }, { title: '用户昵称', dataIndex: 'nickname', key: 'nickname', width: 120 }, { title: '手机号', dataIndex: 'phone', key: 'phone', width: 140 }, diff --git a/src/pages/finance/wallet/components/WalletDetailModal.tsx b/src/pages/finance/wallet/components/WalletDetailModal.tsx index 9a7389a..3608c41 100644 --- a/src/pages/finance/wallet/components/WalletDetailModal.tsx +++ b/src/pages/finance/wallet/components/WalletDetailModal.tsx @@ -12,6 +12,7 @@ import { TRANSACTION_STATUS_OPTIONS, TRANSACTION_TYPE_MAP, TRANSACTION_STATUS_LABEL_MAP, + renderTransactionStatus, } from '../model/useWalletModel'; import styles from './WalletDetailModal.module.less'; @@ -151,6 +152,13 @@ export default defineComponent({ align: 'left' as const, customRender: ({ text }: { text: string }) => `¥${text || '0.00'}`, }, + { + title: '状态', + dataIndex: 'status', + key: 'status', + width: 90, + customRender: ({ text }: { text: number }) => renderTransactionStatus(text), + }, { title: '冻结时间', dataIndex: 'freezeTime', diff --git a/src/pages/finance/wallet/model/useWalletModel.ts b/src/pages/finance/wallet/model/useWalletModel.ts index e289022..dbd7912 100644 --- a/src/pages/finance/wallet/model/useWalletModel.ts +++ b/src/pages/finance/wallet/model/useWalletModel.ts @@ -1,4 +1,5 @@ -import { computed, reactive, nextTick } from 'vue'; +import { computed, reactive, nextTick, h } from 'vue'; +import { StatusTag, type StatusTagTone } from '@/components'; import { useState, useThrottleFn, @@ -36,13 +37,29 @@ export const TRANSACTION_TYPE_MAP: Record = { 3: '取消报名退款', }; -/** 交易状态文案映射(弹窗内表格渲染用) */ +/** 交易状态文案映射(筛选下拉用,对应请求参数,值与接口返回一致) */ export const TRANSACTION_STATUS_LABEL_MAP: Record = { 1: '已解冻', 2: '冻结中', 3: '正常', }; +/** 交易状态色调映射(表格 StatusTag 显示用,对应接口返回的 status 值:1=已解冻,2=冻结中,3=正常) */ +const TRANSACTION_STATUS_MAP: Record = { + 1: { label: '已解冻', tone: 'success' }, + 2: { label: '冻结中', tone: 'warning' }, + 3: { label: '正常', tone: 'default' }, +}; + +/** 渲染交易状态 StatusTag(表格列用) */ +export function renderTransactionStatus(status: number) { + const info = TRANSACTION_STATUS_MAP[status] || { + label: String(status ?? '--'), + tone: 'default' as const, + }; + return h(StatusTag, { label: info.label, tone: info.tone }); +} + // ============================================================ // Model // ============================================================ diff --git a/src/pages/system/roles/components/UserListModal.module.less b/src/pages/system/roles/components/UserListModal.module.less index 2486ab0..7ce58a9 100644 --- a/src/pages/system/roles/components/UserListModal.module.less +++ b/src/pages/system/roles/components/UserListModal.module.less @@ -5,7 +5,7 @@ .bottom { display: flex; - justify-content: space-between; + justify-content: flex-end; align-items: center; margin-top: 16px; padding-top: 12px; @@ -19,7 +19,8 @@ .paginationRow { display: flex; - justify-content: flex-end; + align-items: center; + justify-content: space-between; margin-top: 12px; } } diff --git a/src/pages/system/roles/components/UserListModal.tsx b/src/pages/system/roles/components/UserListModal.tsx index 9370dc1..a41e3c4 100644 --- a/src/pages/system/roles/components/UserListModal.tsx +++ b/src/pages/system/roles/components/UserListModal.tsx @@ -152,25 +152,22 @@ export default defineComponent({ rowKey="phone" /> - {/* 底部 */} -
+ {/* 分页 */} +
共 {pagination.value.total} 人
- +
- {/* 分页 */} - {pagination.value.total > pagination.value.pageSize && ( -
- `共 ${total} 条`} - onChange={handlePageChange} - /> -
- )} + {/* 底部 */} +
+ +
); }, diff --git a/src/pages/system/users/index.tsx b/src/pages/system/users/index.tsx index 0407f74..86c1964 100644 --- a/src/pages/system/users/index.tsx +++ b/src/pages/system/users/index.tsx @@ -52,7 +52,7 @@ function renderBodyCell({ )} {canToggleStatus && ( )} @@ -92,17 +92,20 @@ export default defineComponent({ const [editingRecord, setEditingRecord] = useState(null); const [formSubmitting, setFormSubmitting] = useState(false); - // ===== 启用/禁用(使用真实 API) ===== + // ===== 启用/禁用 ===== const handleToggleStatus = useThrottleFn(async (record: any) => { const isActive = record.status === '1'; - const actionText = isActive ? '停用' : '启用'; + const actionText = isActive ? '禁用' : '启用'; Modal.confirm({ - title: `${actionText}确认`, + title: `确认${actionText}`, content: (
确定要{actionText}用户 {record.realName} 吗? +
+ {isActive ? '禁用后该用户将无法登录后台。' : '启用后该用户将恢复登录权限。'} +
), okText: '确认', diff --git a/src/pages/system/users/model/services.ts b/src/pages/system/users/model/services.ts index 6f4b4d3..94665c4 100644 --- a/src/pages/system/users/model/services.ts +++ b/src/pages/system/users/model/services.ts @@ -41,7 +41,7 @@ const userUpdatePwd = '/admin/sys/user/updatepwd'; /** * 用户列表分页 * 接口: GET /admin/sys/user/page - * 参数: page, limit, text(姓名/手机号), roleId(角色ID), status(0=停用,1=正常) + * 参数: page, limit, text(姓名/手机号), roleId(角色ID), status(0=禁用,1=正常) */ export function getUserList( params: UserListQueryParams, diff --git a/src/pages/system/users/model/useUserModel.ts b/src/pages/system/users/model/useUserModel.ts index 3be002d..18a62a2 100644 --- a/src/pages/system/users/model/useUserModel.ts +++ b/src/pages/system/users/model/useUserModel.ts @@ -21,14 +21,14 @@ import { getRoleList, type TournamentAdminRolePageVO } from '../../roles/model/s /** 状态选项(筛选) */ export const USER_STATUS_OPTIONS = [ { value: '', label: '全部' }, - { value: '0', label: '停用' }, + { value: '0', label: '禁用' }, { value: '1', label: '正常' }, ] as const; -/** 状态文本/色调映射(表格渲染),对应 API status 字段:0=停用、1=正常 */ +/** 状态文本/色调映射(表格渲染),对应 API status 字段:0=禁用、1=正常 */ const STATUS_MAP: Record = { '1': { label: '正常', tone: 'success' }, - '0': { label: '停用', tone: 'danger' }, + '0': { label: '禁用', tone: 'danger' }, }; // ============================================================ -- 2.52.0 From 0f611ad9267b4a6a7ebf5541e043e92e665e3dea Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 7 Aug 2026 14:48:25 +0800 Subject: [PATCH 14/27] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/menu.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/api/menu.ts b/src/api/menu.ts index f9be5b1..5fb2961 100644 --- a/src/api/menu.ts +++ b/src/api/menu.ts @@ -18,6 +18,7 @@ export interface AuthData { } const AUTH_FETCH_FAIL_MSG = '账户权限获取失败,请重新登录'; +const AUTH_EMPTY_MSG = '当前账户权限无任何权限,请联系管理员'; function normalizeAuthData(res: any): AuthData { if (res?.code != null && res.code != 200) { @@ -29,7 +30,7 @@ function normalizeAuthData(res: any): AuthData { const permsList = data.permsList || []; if (permsList.length === 0) { - throw new Error(AUTH_FETCH_FAIL_MSG); + throw new Error(AUTH_EMPTY_MSG); } const nickname = data.nickName || ''; @@ -46,9 +47,9 @@ function normalizeAuthData(res: any): AuthData { return { roleList, permsList, nickname, phone }; } -function handleAuthFetchFailure() { +function handleAuthFetchFailure(msg?: string) { clearAuthDataCache(); - forceReLogin(AUTH_FETCH_FAIL_MSG); + forceReLogin(msg); } /** @@ -62,8 +63,8 @@ export function fetchAuthData(): Promise { const promise = get('/op/permission') .then((res) => normalizeAuthData(res)) - .catch((err) => { - handleAuthFetchFailure(); + .catch((err: Error) => { + handleAuthFetchFailure(err.message); throw err; }); -- 2.52.0 From f0f0c88f1838ba55ef3e2eb3bb9c54e021d6101f Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 7 Aug 2026 14:55:45 +0800 Subject: [PATCH 15/27] =?UTF-8?q?fix:=20=E5=B0=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useAuth.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts index 093b576..51efda7 100644 --- a/src/hooks/useAuth.ts +++ b/src/hooks/useAuth.ts @@ -101,7 +101,7 @@ export function forceReLogin(msg = '账户权限获取失败,请重新登录') notification.error({ message: '提示', description: msg, - duration: 2600, + duration: 3, }); auth.clearSession(); router.push('/login'); -- 2.52.0 From 3f47005f76cb4b6f8132175a7d5a694456adaa94 Mon Sep 17 00:00:00 2001 From: ZhuRui Date: Fri, 7 Aug 2026 18:19:14 +0800 Subject: [PATCH 16/27] =?UTF-8?q?fix:=20=E6=96=B0=E5=A2=9E=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=85=8D=E7=BD=AE=E9=A1=B5=E9=9D=A2=20=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=85=B6=E5=AE=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/params/index.ts | 49 ++++ src/api/params/types.ts | 40 +++ src/config/fallbackRoutes.ts | 9 + .../components/ParamFormModal.module.less | 10 + .../params/components/ParamFormModal.tsx | 141 +++++++++ src/pages/system/params/index.module.less | 36 +++ src/pages/system/params/index.tsx | 270 ++++++++++++++++++ src/pages/system/params/model/config.ts | 29 ++ src/pages/system/params/model/form.ts | 19 ++ src/pages/system/params/model/services.ts | 81 ++++++ .../system/params/model/useParamsColumns.ts | 36 +++ .../system/params/model/useParamsModel.ts | 111 +++++++ 12 files changed, 831 insertions(+) create mode 100644 src/api/params/index.ts create mode 100644 src/api/params/types.ts create mode 100644 src/pages/system/params/components/ParamFormModal.module.less create mode 100644 src/pages/system/params/components/ParamFormModal.tsx create mode 100644 src/pages/system/params/index.module.less create mode 100644 src/pages/system/params/index.tsx create mode 100644 src/pages/system/params/model/config.ts create mode 100644 src/pages/system/params/model/form.ts create mode 100644 src/pages/system/params/model/services.ts create mode 100644 src/pages/system/params/model/useParamsColumns.ts create mode 100644 src/pages/system/params/model/useParamsModel.ts diff --git a/src/api/params/index.ts b/src/api/params/index.ts new file mode 100644 index 0000000..593e017 --- /dev/null +++ b/src/api/params/index.ts @@ -0,0 +1,49 @@ +/** + * 参数配置 API + * + * TODO: 等后端接口确定后,替换占位的 URL 和返回类型 + */ +import { get, post, put, del } from '@/utils/request'; +import type { ParamQueryParams, SysParamVO, PageData, ApiResult } from './types'; + +// 类型重导出,方便页面 model 层统一引用 +export type { SysParamVO, ParamQueryParams, PageData, ApiResult } from './types'; + +// ============================================================ +// URL 常量(占位,等后端接口确定后替换) +// ============================================================ + +/** 配置列表分页查询 */ +const PARAM_LIST = '/admin/sys/param/page'; +/** 新增配置 */ +const PARAM_ADD = '/admin/sys/param/add'; +/** 编辑配置 */ +const PARAM_UPDATE = '/admin/sys/param/update'; +/** 删除配置 */ +const PARAM_DELETE = '/admin/sys/param/delete'; + +// ============================================================ +// API 函数(占位) +// ============================================================ + +/** 配置列表分页 */ +export async function getParamList( + params: ParamQueryParams, +): Promise>> { + return get(PARAM_LIST, params as Record); +} + +/** 新增配置 */ +export async function addParam(data: Partial): Promise> { + return post(PARAM_ADD, data); +} + +/** 编辑配置 */ +export async function updateParam(data: Partial): Promise> { + return put(PARAM_UPDATE, data); +} + +/** 删除配置 */ +export async function deleteParam(id: number): Promise> { + return del(`${PARAM_DELETE}`, { id }); +} diff --git a/src/api/params/types.ts b/src/api/params/types.ts new file mode 100644 index 0000000..5a6c40c --- /dev/null +++ b/src/api/params/types.ts @@ -0,0 +1,40 @@ +/** + * 参数配置 — 类型定义 + * + * TODO: 等后端接口确定后,根据实际字段补充完整类型 + */ + +/** 配置项列表项 */ +export interface SysParamVO { + /** 配置项 ID */ + id: number; + /** 配置项 key */ + // paramKey: string; + /** 配置项 value */ + // paramValue: string; + /** 备注 */ + // remark: string; + /** 更新时间 */ + // updateTime: string; +} + +/** 配置列表查询参数 */ +export interface ParamQueryParams { + page?: string; + limit?: string; + /** 搜索关键字 */ + // keyword?: string; +} + +/** 分页数据结构 */ +export interface PageData { + total: number; + list: T[]; +} + +/** API 统一响应格式 */ +export interface ApiResult { + code: number | string; + msg: string; + data: T; +} diff --git a/src/config/fallbackRoutes.ts b/src/config/fallbackRoutes.ts index efe6173..67eb757 100644 --- a/src/config/fallbackRoutes.ts +++ b/src/config/fallbackRoutes.ts @@ -164,6 +164,15 @@ export const FALLBACK_MENU_NODES: MenuNode[] = [ icon: 'AiOutlineSafetyCertificate', permission: 'system.roles.view', }, + { + id: 'system_params', + name: '参数配置', + path: 'system/params', + component: 'system/params', + componentName: 'SystemParams', + icon: 'AiOutlineSetting', + permission: 'system.params.view', + }, { id: 'system_logs', name: '操作日志', diff --git a/src/pages/system/params/components/ParamFormModal.module.less b/src/pages/system/params/components/ParamFormModal.module.less new file mode 100644 index 0000000..d26e83b --- /dev/null +++ b/src/pages/system/params/components/ParamFormModal.module.less @@ -0,0 +1,10 @@ +.paramFormModalMain { + .footer { + display: flex; + justify-content: flex-end; + gap: 8px; + padding-top: 16px; + border-top: 1px solid #f0f0f0; + margin-top: 8px; + } +} diff --git a/src/pages/system/params/components/ParamFormModal.tsx b/src/pages/system/params/components/ParamFormModal.tsx new file mode 100644 index 0000000..ea1485b --- /dev/null +++ b/src/pages/system/params/components/ParamFormModal.tsx @@ -0,0 +1,141 @@ +import { defineComponent, ref, reactive, nextTick } from 'vue'; +import { useEffect } from '@/hooks'; +import { Modal, Form, Input, Button } from 'ant-design-vue'; +import { paramCodeRules, paramValueRules, remarkRules } from '../model/form'; +import type { SysParamsDTO } from '../model/services'; +import styles from './ParamFormModal.module.less'; + +const { TextArea } = Input; + +interface ParamFormModalProps { + visible: boolean; + record: SysParamsDTO | null; + submitting?: boolean; + onClose: () => void; + onSave: (formData: { paramCode: string; paramValue: string; remark: string }) => void; +} + +/** 默认表单数据 */ +const getDefaultForm = () => ({ + paramCode: '', + paramValue: '', + remark: '', +}); + +export default defineComponent({ + name: 'ParamFormModal', + props: { + visible: { type: Boolean, default: false }, + record: { type: Object, default: null }, + submitting: { type: Boolean, default: false }, + onClose: { type: Function, required: true }, + onSave: { type: Function, required: true }, + }, + setup(props: ParamFormModalProps) { + const formRef = ref(); + const formData = reactive(getDefaultForm()); + + /** 根据 record 初始化表单 */ + const initFormFromRecord = (record: SysParamsDTO | null) => { + if (record) { + Object.assign(formData, { + paramCode: record.paramCode || '', + paramValue: record.paramValue || '', + remark: record.remark || '', + }); + } else { + Object.assign(formData, getDefaultForm()); + } + }; + + /** 监听 visible 变化重置表单 */ + useEffect(() => { + if (props.visible) { + initFormFromRecord(props.record); + nextTick().then(() => formRef.value?.clearValidate()); + } + }, [() => props.visible]); + + /** 提交 */ + const handleSubmit = async () => { + try { + await formRef.value?.validate(); + } catch { + return; + } + + props.onSave({ + paramCode: formData.paramCode, + paramValue: formData.paramValue, + remark: formData.remark, + }); + }; + + /** 关闭 */ + const handleClose = () => { + props.onClose(); + }; + + return () => { + const isEdit = !!props.record; + + return ( + +
+ + { + formData.paramCode = val?.target?.value ?? val ?? ''; + }} + placeholder="请输入参数编码" + allowClear + /> + + + + { + formData.paramValue = val?.target?.value ?? val ?? ''; + }} + placeholder="请输入参数值" + allowClear + /> + + + +