Compare commits
2 Commits
a7e31613c5
...
1cd851ec8e
| Author | SHA1 | Date | |
|---|---|---|---|
| 1cd851ec8e | |||
| d2aa4c1207 |
@@ -23,7 +23,7 @@ export interface WithdrawVO {
|
||||
auditStatus: number;
|
||||
/** 到账状态:0=未支付,1=支付成功,2=支付失败 */
|
||||
payStatus: number;
|
||||
/** 流水单号 */
|
||||
/** 第三方单号 */
|
||||
serialNumber: string;
|
||||
/** 申请时间 */
|
||||
createDate: string;
|
||||
|
||||
@@ -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<HTMLElement | null>(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}
|
||||
</div>
|
||||
{overflow.value ? (
|
||||
<Tooltip title={raw} placement="topLeft">
|
||||
<span class="log-content-view">查看</span>
|
||||
</Tooltip>
|
||||
<span class="log-content-view" onClick={() => setModalOpen(true)}>
|
||||
查看
|
||||
</span>
|
||||
) : null}
|
||||
<Modal
|
||||
visible={modalOpen.value}
|
||||
title="操作内容"
|
||||
footer={null}
|
||||
width={600}
|
||||
centered
|
||||
destroyOnClose
|
||||
onCancel={() => setModalOpen(false)}
|
||||
>
|
||||
<div style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-all', lineHeight: 1.8 }}>
|
||||
{raw}
|
||||
</div>
|
||||
</Modal>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -93,7 +107,7 @@ export default defineComponent({
|
||||
record: any;
|
||||
index: number;
|
||||
}) => {
|
||||
if (column.key === 'content') {
|
||||
if (column.key === 'obj') {
|
||||
const raw = text || '';
|
||||
return raw ? <LogContentCell text={raw} /> : <span>--</span>;
|
||||
}
|
||||
|
||||
@@ -72,6 +72,7 @@ function renderBodyCell({
|
||||
if (column.dataIndex === 'name') {
|
||||
const maxLen = 15;
|
||||
const raw = text || '';
|
||||
if (!raw) return <span>--</span>;
|
||||
const display = raw.length > maxLen ? raw.slice(0, maxLen) + '...' : raw;
|
||||
return raw.length > maxLen ? (
|
||||
<Tooltip title={raw}>
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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={() => <EyeOutlined />}
|
||||
/>
|
||||
))}
|
||||
</Space>
|
||||
|
||||
@@ -117,7 +117,7 @@ export function useUserModel() {
|
||||
|
||||
Modal.confirm({
|
||||
title: `${actionText}确认`,
|
||||
content: `确认${actionText}用户"${record.realName}"吗?`,
|
||||
content: `确认${actionText}用户"${record.nickname}"吗?`,
|
||||
okText: '确认',
|
||||
cancelText: '取消',
|
||||
onOk: async () => {
|
||||
|
||||
@@ -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: '类型',
|
||||
|
||||
@@ -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 (
|
||||
<span style={{ color, fontWeight: 500 }}>
|
||||
{sign}
|
||||
{text}
|
||||
</span>
|
||||
);
|
||||
return <span style={{ color, fontWeight: 500 }}>{text}</span>;
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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({
|
||||
</Form.Item>
|
||||
<Form.Item label="余额筛选">
|
||||
<Space.Compact>
|
||||
<Input
|
||||
<InputNumber
|
||||
placeholder="请输入"
|
||||
style={{ width: '130px' }}
|
||||
value={filterForm.minBalance}
|
||||
onUpdate:value={(val: any) => (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
|
||||
/>
|
||||
<Input
|
||||
style={{
|
||||
@@ -175,13 +179,17 @@ export default defineComponent({
|
||||
value="至"
|
||||
disabled
|
||||
/>
|
||||
<Input
|
||||
<InputNumber
|
||||
placeholder="请输入"
|
||||
style={{ width: '130px' }}
|
||||
value={filterForm.maxBalance}
|
||||
onUpdate:value={(val: any) => (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
|
||||
/>
|
||||
</Space.Compact>
|
||||
</Form.Item>
|
||||
|
||||
@@ -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 },
|
||||
];
|
||||
|
||||
|
||||
@@ -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, '');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user