提交 3e967a6d 作者: ZhangLingKun

功能:积分列表

上级 36f0e208
......@@ -649,3 +649,36 @@ export type DistributeMallOrderBonusType = InterFunction<
}>;
}
>;
// 后台管理——积分列表
export type UserPointListType = InterListFunction<
{
nickName?: string;
phoneNum?: string;
},
{
createTime: string;
id: number;
nickName: string;
phoneNum: number;
totalPoints: number;
updateTime: string;
userAccountId: number;
}
>;
// 后台管理——积分详情
export type DetailPointListType = InterListFunction<
{
userAccountId: number;
},
{
createTime: string;
id: number;
nickName: string;
phoneNum: number;
point: number;
pointSource: number;
timeOfRelease: number;
updateTime: string;
userAccountId: number;
}
>;
......@@ -2,6 +2,7 @@ import axios from '../request';
import {
AddAndEditBonusRuleType,
AddConvertRuleType,
UserPointListType,
BonusRuleListQueryType,
CalculateOrderBonusVOType,
CheckUserScoreType,
......@@ -25,6 +26,7 @@ import {
UpdateMallOrderBonusType,
UserScoreDetailsListType,
UserScorePageListType,
DetailPointListType,
} from '../interface/pointManageType';
export class PointManageAPI {
......@@ -127,4 +129,14 @@ export class PointManageAPI {
// 积分管理-订单分成-发放积分
static DistributeMallOrderBonus: DistributeMallOrderBonusType = (params) =>
axios.get('/mallorder/orderBonus/distributeMallOrderBonus', { params });
// 后台管理——积分列表
static UserPointList: UserPointListType = (params) => {
return axios.post('/userapp/userPoint/userPointList', params);
};
// 后台管理——积分详情
static DetailPointList: DetailPointListType = (params) => {
return axios.post('/userapp/userPoint/detailPoint', params);
};
}
import React, { useEffect, useState } from 'react';
import { useEffect, useState } from 'react';
import { Button, message, Table } from 'antd';
import qs from 'query-string';
import { PlusOutlined } from '@ant-design/icons';
import { ColumnsType } from 'antd/es/table';
import { useNavigate } from 'react-router-dom';
import { useLocation, useNavigate } from 'react-router-dom';
import SearchView from '~/components/search-box';
import { UserScoreDetailsListType } from '~/api/interface/pointManageType';
import { DetailPointListType } from '~/api/interface/pointManageType';
import { PointManageAPI } from '~/api';
import { DetailModal } from '../comp/detailModal';
import { DistributionModal } from '~/pages/pointManage/pointList/comp/distributionModal';
import { ApproveModal } from '~/pages/pointManage/pointList/comp/approveModal';
import useOperate from '~/common/hook/optionHook';
import { useSearchParams } from 'react-router-dom';
// import { DetailModal } from '../comp/detailModal';
// import { DistributionModal } from '~/pages/pointManage/pointList/comp/distributionModal';
// import { ApproveModal } from '~/pages/pointManage/pointList/comp/approveModal';
// import useOperate from '~/common/hook/optionHook';
import { InterListType } from '~/api/interface';
// 列表的类型
type TableType = (ReturnType<UserScoreDetailsListType> extends Promise<infer T>
? T
: never)['result']['list']['userScoreList'];
// 后台返回的类型,但不是列表
type ListType = (ReturnType<UserScoreDetailsListType> extends Promise<infer T>
? T
: never)['result']['list'];
type TableType = InterListType<DetailPointListType>;
// 状态类型
const statusList = [
{ value: 0, label: '提现中' },
{ value: 1, label: '提现成功' },
{ value: 2, label: '提现失败' },
];
export function PointDetail(props: any) {
const [searchParams] = useSearchParams();
// const statusList = [
// { value: 0, label: '提现中' },
// { value: 1, label: '提现成功' },
// { value: 2, label: '提现失败' },
// ];
export function PointDetail() {
// 路由钩子
const location = useLocation();
// 返回上一页
const handleBack = () => {
navigate(-1);
};
// 参数解析
const option = qs.parse(props.location.search);
const option = qs.parse(location.search);
// 路由操作
const navigate = useNavigate();
// 金额数据
const [pointData, setPointData] = useState<ListType>();
// const [pointData, setPointData] = useState<ListType>();
// 表格数据
const [tableData, setTableData] = useState<TableType>([]);
// 表格分页配置
......@@ -45,25 +43,25 @@ export function PointDetail(props: any) {
totalPage: 0,
});
// 查看参数
const [recordData, setRecordData] = useState<TableType[0]>();
// const [recordData, setRecordData] = useState<TableType[0]>();
// 显示查看弹窗
const [detailVisible, setDetailVisible] = useState(false);
// const [detailVisible, setDetailVisible] = useState(false);
// 积分发放弹窗
const [distributionVisible, setDistributionVisible] = useState(false);
// const [distributionVisible, setDistributionVisible] = useState(false);
// 审批弹窗
const [approveVisible, setApproveVisible] = useState(false);
// const [approveVisible, setApproveVisible] = useState(false);
// 按钮权限
const isDistributePointBtnShow = useOperate(25101);
// const isDistributePointBtnShow = useOperate(25101);
// +++++++++++++++++++++++++++++++++++++++++++++++++++ //
// 新版通用部分(ES6+ for React) ZhangLK 2022/08/30 Start
// 加载列表
const getTableList = async (value = {}) => {
// 只需要修改这个地方的接口即可
const res = await PointManageAPI.UserScoreDetailsList({
const res = await PointManageAPI.DetailPointList({
pageNo: pagination.current,
pageSize: pagination.pageSize,
...value,
mallUserId: Number(option.id),
userAccountId: Number(option.id),
});
if (res && res.code === '200') {
const { list, pageNo, totalCount, pageSize, totalPage } = res.result; // 解构
......@@ -73,8 +71,8 @@ export function PointDetail(props: any) {
pageSize,
totalPage,
});
setTableData(list.userScoreList);
setPointData(res?.result?.list);
setTableData(list || []);
// setPointData(res?.result?.list);
} else {
message.warning(res.message);
}
......@@ -88,147 +86,135 @@ export function PointDetail(props: any) {
const columns: ColumnsType<TableType[0]> = [
{
title: '积分数值',
dataIndex: 'scoreNum',
align: 'center',
render: (text) => (text > 0 ? `+${text}` : text),
},
{ title: '流通方式', dataIndex: 'type', align: 'center' },
{ title: '兑换比例', dataIndex: 'convertRatio', align: 'center' },
{ title: '领取时间', dataIndex: 'getTime', align: 'center' },
{
title: '使用时间',
dataIndex: 'useTime',
dataIndex: 'point',
align: 'center',
render: (_text, record) => {
if (record?.type === '积分提现' && record?.status === 0) {
return '';
}
if (record?.type === '积分提现' && record?.status === 2) {
return '';
}
if (record?.type === '积分提现' && record?.status === 1) {
return record?.approvalTime;
}
return record?.useTime;
},
},
{
title: '订单编号',
dataIndex: 'orderNo',
align: 'center',
render: (text, record) =>
!!text && (
<Button
type='link'
onClick={() => {
// 跳转到订单列表
navigate({
pathname: '/orderManage/list/detail',
search: qs.stringify({ id: record.orderId, activeTabKey: 1 }),
});
}}
>
{text}
</Button>
),
},
{
title: '状态',
dataIndex: 'status',
align: 'center',
render: (text) => statusList.find((i) => i.value === text)?.label || text,
},
{
title: '操作',
align: 'center',
fixed: 'right',
width: 180,
render: (_text, record) => {
return (
<>
{record.status === 0 && (
<Button
type='link'
onClick={() => {
setRecordData(JSON.parse(JSON.stringify(record)));
setApproveVisible(true);
}}
>
审批
</Button>
)}
<Button
type='link'
onClick={() => {
setRecordData(JSON.parse(JSON.stringify(record)));
setDetailVisible(true);
}}
>
查看
</Button>
</>
);
},
render: (text) => (text < 0 ? `-${text}` : `+${text}`),
},
{ title: '流通方式', dataIndex: 'pointSource', align: 'center' },
// { title: '兑换比例', dataIndex: 'convertRatio', align: 'center' },
{ title: '领取时间', dataIndex: 'createTime', align: 'center' },
{ title: '使用时间', dataIndex: 'updateTime', align: 'center' },
// {
// title: '订单编号',
// dataIndex: 'orderNo',
// align: 'center',
// render: (text, record) =>
// !!text && (
// <Button
// type='link'
// onClick={() => {
// // 跳转到订单列表
// navigate({
// pathname: '/orderManage/list/detail',
// search: qs.stringify({ id: record.orderId, activeTabKey: 1 }),
// });
// }}
// >
// {text}
// </Button>
// ),
// },
// {
// title: '状态',
// dataIndex: 'status',
// align: 'center',
// render: (text) => statusList.find((i) => i.value === text)?.label || text,
// },
// {
// title: '操作',
// align: 'center',
// fixed: 'right',
// width: 180,
// render: (_text, record) => {
// return (
// <>
// {/*{record.status === 0 && (*/}
// {/* <Button*/}
// {/* type='link'*/}
// {/* onClick={() => {*/}
// {/* setRecordData(JSON.parse(JSON.stringify(record)));*/}
// {/* setApproveVisible(true);*/}
// {/* }}*/}
// {/* >*/}
// {/* 审批*/}
// {/* </Button>*/}
// {/*)}*/}
// <Button
// type='link'
// onClick={() => {
// setRecordData(JSON.parse(JSON.stringify(record)));
// setDetailVisible(true);
// }}
// >
// 查看
// </Button>
// </>
// );
// },
// },
];
// 一键关闭全部弹窗
const handleCloseAll = () => {
setDetailVisible(false);
setDistributionVisible(false);
setApproveVisible(false);
setRecordData(undefined);
getTableList().then();
};
// const handleCloseAll = () => {
// setDetailVisible(false);
// setDistributionVisible(false);
// setApproveVisible(false);
// setRecordData(undefined);
// getTableList().then();
// };
// 组件加载
useEffect(() => {
console.log('获取参数 --->', searchParams.get('id'));
(async () => {
await getTableList();
})();
// console.log('获取参数 --->', location);
console.log('获取参数 --->', qs.parse(location.search));
getTableList().then();
}, []);
return (
<>
<SearchView
preFixBtn={
<div>
{pointData?.uid}&nbsp;{pointData?.userName}({pointData?.nickName})
</div>
}
sufFixBtn={
<div className='point-list-head-number'>
<div className='head-number'>
<span className='number-label'>积分总额</span>
<Button type='link'>{pointData?.scoreTotal}</Button>
</div>
<div className='head-number'>
<span className='number-label'>已使用积分</span>
<Button type='link'>{pointData?.useScore}</Button>
</div>
<div className='head-number'>
<span className='number-label'>已兑换积分</span>
<Button type='link'>{pointData?.convertScore}</Button>
</div>
<div className='head-number'>
<Button
type='primary'
icon={<PlusOutlined />}
onClick={() => {
setDistributionVisible(true);
}}
disabled={!isDistributePointBtnShow}
>
积分发放
</Button>
<div style={{ display: 'flex', justifyContent: 'space-between', width: '100%' }}>
<div>
UID{option?.id}&nbsp;&nbsp;{option?.nickName}
</div>
<Button type={'primary'} onClick={handleBack}>
返回
</Button>
</div>
}
// sufFixBtn={
// <div className='point-list-head-number'>
// <div className='head-number'>
// <span className='number-label'>积分总额</span>
// <Button type='link'>{pointData?.scoreTotal}</Button>
// </div>
// <div className='head-number'>
// <span className='number-label'>已使用积分</span>
// <Button type='link'>{pointData?.useScore}</Button>
// </div>
// <div className='head-number'>
// <span className='number-label'>已兑换积分</span>
// <Button type='link'>{pointData?.convertScore}</Button>
// </div>
// <div className='head-number'>
// <Button
// type='primary'
// icon={<PlusOutlined />}
// onClick={() => {
// setDistributionVisible(true);
// }}
// disabled={!isDistributePointBtnShow}
// >
// 积分发放
// </Button>
// </div>
// </div>
// }
/>
<Table
size='small'
dataSource={tableData}
columns={columns}
rowKey='id'
scroll={{ x: 1500 }}
// scroll={{ x: 1500 }}
bordered
pagination={{
total: pagination.total,
......@@ -240,24 +226,24 @@ export function PointDetail(props: any) {
showTotal: (total, range) => `当前 ${range[0]}-${range[1]} 条记录 / 共 ${total} 条数据`,
}}
/>
<DetailModal
open={detailVisible}
data={recordData}
title='查看详情'
closed={handleCloseAll}
/>
<DistributionModal
open={distributionVisible}
data={pointData}
title='发放积分'
closed={handleCloseAll}
/>
<ApproveModal
open={approveVisible}
data={recordData}
title='提现审批'
closed={handleCloseAll}
/>
{/*<DetailModal*/}
{/* open={detailVisible}*/}
{/* data={recordData}*/}
{/* title='查看详情'*/}
{/* closed={handleCloseAll}*/}
{/*/>*/}
{/*<DistributionModal*/}
{/* open={distributionVisible}*/}
{/* data={pointData}*/}
{/* title='发放积分'*/}
{/* closed={handleCloseAll}*/}
{/*/>*/}
{/*<ApproveModal*/}
{/* open={approveVisible}*/}
{/* data={recordData}*/}
{/* title='提现审批'*/}
{/* closed={handleCloseAll}*/}
{/*/>*/}
</>
);
}
import React, { useEffect, useState } from 'react';
import { useEffect, useState } from 'react';
import { Button, message, Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
import SearchView from '~/components/search-box/index';
import { PointManageAPI } from '~/api';
import { UserScorePageListType } from '~/api/interface/pointManageType';
import { UserPointListType } from '~/api/interface/pointManageType';
import { useNavigate } from 'react-router-dom';
import { InterListType, InterReqListType } from '~/api/interface';
import qs from 'query-string';
// 列表的类型
type TableType = (ReturnType<UserScorePageListType> extends Promise<infer T>
? T
: never)['result']['list']['userBasicInfo'];
// 后台返回的类型,但不是列表
type ListType = (ReturnType<UserScorePageListType> extends Promise<infer T>
? T
: never)['result']['list'];
type TableType = InterListType<UserPointListType>;
// 搜索表单的类型
type ReqType = Parameters<UserScorePageListType>[0];
type ReqType = InterReqListType<UserPointListType>;
// 搜索表单的数据
let query: ReqType = {};
export const PointList = () => {
// 路由操作
const navigation = useNavigate();
const navigate = useNavigate();
// 金额数据
const [pointData, setPointData] = useState<ListType>();
// const [pointData, setPointData] = useState<ListType>();
// 表格数据
const [tableData, setTableData] = useState<TableType>([]);
// 表格分页配置
......@@ -34,36 +30,30 @@ export const PointList = () => {
totalPage: 0,
});
// 跳转指定明细详情
const handleDetailList = (type: number) => {
navigation(`/pointManage/pointList/list?type=${type}`);
};
// const handleDetailList = (type: number) => {
// navigation(`/pointManage/pointList/list?type=${type}`);
// };
// +++++++++++++++++++++++++++++++++++++++++++++++++++ //
// 新版通用部分(ES6+ for React) ZhangLK 2022/08/30 Start
// 加载列表
const getTableList = async (value = {}) => {
// 只需要修改这个地方的接口即可
const res = await PointManageAPI.UserScorePageList({
const res = await PointManageAPI.UserPointList({
pageNo: pagination.current,
pageSize: pagination.pageSize,
...value,
...query,
});
if (res && res.code === '200') {
const {
list: { convertScore, releaseScore, userBasicInfo, withdrawScore, withdrawingScore },
pageNo,
totalCount,
pageSize,
totalPage,
} = res.result; // 解构
const { list, pageNo, totalCount, pageSize, totalPage } = res.result; // 解构
setPagination({
total: totalCount,
current: pageNo,
pageSize,
totalPage,
});
setTableData(userBasicInfo);
setPointData(res?.result?.list);
setTableData(list || []);
// setPointData(res?.result?.list);
} else {
message.warning(res.message);
}
......@@ -81,26 +71,28 @@ export const PointList = () => {
// +++++++++++++++++++++++++++++++++++++++++++++++++++ //
// 跳转详情
const handleDetail = (record: TableType[0]) => {
navigation({
pathname: '/pointManage/pointList/detail',
search: `id=${record?.mallUserId}&uid=${record?.uid}`,
});
const search = {
id: record.userAccountId,
totalPoints: record.totalPoints,
nickName: record.nickName || '游客用户',
};
navigate(`/pointManage/pointList/detail?${qs.stringify(search)}`);
};
// 表格结构
const columns: ColumnsType<TableType[0]> = [
{ title: 'UID', dataIndex: 'uid', align: 'center' },
{ title: 'UID', dataIndex: 'userAccountId', align: 'center' },
{
title: '用户名称',
dataIndex: 'userName',
align: 'center',
render: (text, record) => text || record?.nickName || `游客用户`,
},
{
title: '企业名称',
dataIndex: 'entName',
align: 'center',
render: (text: string, record) => text || (record.phoneNum ? '微信用户' : '游客用户'),
},
// {
// title: '企业名称',
// dataIndex: 'entName',
// align: 'center',
// render: (text: string, record) => text || (record.phoneNum ? '微信用户' : '游客用户'),
// },
{
title: '手机号',
dataIndex: 'phoneNum',
......@@ -108,7 +100,7 @@ export const PointList = () => {
},
{
title: '积分总额',
dataIndex: 'score',
dataIndex: 'totalPoints',
align: 'center',
render: (text: string, record) => {
return (
......@@ -132,10 +124,10 @@ export const PointList = () => {
<SearchView
search={[
{
label: '用户UID',
name: 'uid',
label: '微信昵称',
name: 'nickName',
type: 'input',
placeholder: '请输入UID',
placeholder: '请输入微信昵称',
width: 180,
},
{
......@@ -144,42 +136,42 @@ export const PointList = () => {
type: 'input',
placeholder: '请输入手机号',
},
{
label: '企业名称',
name: 'entName',
type: 'input',
placeholder: '请输入企业名称',
},
// {
// label: '企业名称',
// name: 'entName',
// type: 'input',
// placeholder: '请输入企业名称',
// },
]}
searchData={onFinish}
sufFixBtn={
<div className='point-list-head-number'>
<div className='head-number'>
<span className='number-label'>积分发放总额</span>
<Button type='link' onClick={() => handleDetailList(0)}>
{pointData?.releaseScore}
</Button>
</div>
<div className='head-number'>
<span className='number-label'>积分兑换总额</span>
<Button type='link' onClick={() => handleDetailList(1)}>
{pointData?.convertScore}
</Button>
</div>
<div className='head-number'>
<span className='number-label'>积分提现总额</span>
<Button type='link' onClick={() => handleDetailList(2)}>
{pointData?.withdrawScore}
</Button>
</div>
<div className='head-number'>
<span className='number-label'>待处理提现积分</span>
<Button type='link' onClick={() => handleDetailList(2)}>
{pointData?.withdrawingScore}
</Button>
</div>
</div>
}
// sufFixBtn={
// <div className='point-list-head-number'>
// <div className='head-number'>
// <span className='number-label'>积分发放总额</span>
// <Button type='link' onClick={() => handleDetailList(0)}>
// {pointData?.releaseScore}
// </Button>
// </div>
// <div className='head-number'>
// <span className='number-label'>积分兑换总额</span>
// <Button type='link' onClick={() => handleDetailList(1)}>
// {pointData?.convertScore}
// </Button>
// </div>
// <div className='head-number'>
// <span className='number-label'>积分提现总额</span>
// <Button type='link' onClick={() => handleDetailList(2)}>
// {pointData?.withdrawScore}
// </Button>
// </div>
// <div className='head-number'>
// <span className='number-label'>待处理提现积分</span>
// <Button type='link' onClick={() => handleDetailList(2)}>
// {pointData?.withdrawingScore}
// </Button>
// </div>
// </div>
// }
/>
<Table
size='small'
......
......@@ -20,7 +20,7 @@ export const authRouterList = async () => {
const getRouteList = (data: RouteObjectType[]) => {
return data.reduce((pre: RouteObjectType[], cur) => {
const Obj: RouteObjectType = { ...cur };
if (ids.includes(Obj.meta.id) || Obj.meta.hidden) {
if (ids.includes(Obj.meta.id) || Obj.meta.hidden || Obj.meta.develop) {
if (Obj.children) {
Obj.children = [...getRouteList(Obj.children)];
}
......
......@@ -34,6 +34,7 @@ import {
ThunderboltOutlined,
BankOutlined,
VerifiedOutlined,
AccountBookOutlined,
} from '@ant-design/icons';
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
......@@ -43,8 +44,8 @@ import { Spin } from 'antd';
import LoginView from '~/pages/common/login';
// 积分
// import { PointList } from '~/pages/pointManage/pointList';
// import { PointDetail } from '~/pages/pointManage/pointList/detail';
import { PointList } from '~/pages/pointManage/pointList';
import { PointDetail } from '~/pages/pointManage/pointList/detail';
// import { PointRules } from '~/pages/pointManage/pointRules';
// import PointDetailList from '~/pages/pointManage/pointDetail';
// 分成
......@@ -175,6 +176,7 @@ export interface RouteObjectType {
icon: any;
customIcon?: boolean;
title: string;
develop?: boolean;
};
}
// 加载页面
......@@ -854,87 +856,83 @@ export const routerList: Array<RouteObjectType> = [
},
],
},
// {
// path: '/pointManage',
// element: <LayoutView />,
// errorElement: <ErrorPage />,
// meta: {
// id: 25000,
// icon: <AccountBookOutlined />,
// title: '积分管理',
// },
// children: [
// {
// path: '/pointManage/pointList',
// element: withLoadingComponent(<PointList />),
// meta: {
// id: 25100,
// title: '积分列表',
// icon: <MacCommandOutlined />,
// },
// },
// {
// path: '/pointManage/pointList/detail',
// element: withLoadingComponent(
// <PointDetail
// location={{
// search: '',
// }}
// />,
// ),
// meta: {
// id: 25100,
// title: '个人积分明细',
// icon: <MacCommandOutlined />,
// hidden: true,
// },
// },
// {
// path: '/pointManage/pointRule',
// element: withLoadingComponent(<PointRules />),
// meta: {
// id: 25200,
// title: '兑换规则',
// icon: <MacCommandOutlined />,
// },
// },
// {
// path: '/pointManage/pointList/list',
// element: withLoadingComponent(
// <PointDetailList
// location={{
// search: '',
// }}
// />,
// ),
// meta: {
// id: 25100,
// title: '积分明细',
// icon: <MacCommandOutlined />,
// hidden: true,
// },
// },
// {
// path: '/pointManage/divideOrder',
// element: withLoadingComponent(<DivideOrder />),
// meta: {
// id: 25300,
// title: '订单分成',
// icon: <MacCommandOutlined />,
// },
// },
// {
// path: '/pointManage/divideRules',
// element: withLoadingComponent(<DivideRules />),
// meta: {
// id: 25400,
// title: '分成规则',
// icon: <MacCommandOutlined />,
// hidden: true,
// },
// },
// ],
// },
{
path: '/pointManage',
element: <LayoutView />,
errorElement: <ErrorPage />,
meta: {
id: 12000,
icon: <AccountBookOutlined />,
title: '积分管理',
develop: true,
},
children: [
{
path: '/pointManage/pointList',
element: withLoadingComponent(<PointList />),
meta: {
id: 12100,
title: '积分列表',
icon: <MacCommandOutlined />,
develop: true,
},
},
{
path: '/pointManage/pointList/detail',
element: withLoadingComponent(<PointDetail />),
meta: {
id: 12110,
title: '个人积分明细',
icon: <MacCommandOutlined />,
hidden: true,
},
},
// {
// path: '/pointManage/pointRule',
// element: withLoadingComponent(<PointRules />),
// meta: {
// id: 25200,
// title: '兑换规则',
// icon: <MacCommandOutlined />,
// },
// },
// {
// path: '/pointManage/pointList/list',
// element: withLoadingComponent(
// <PointDetailList
// location={{
// search: '',
// }}
// />,
// ),
// meta: {
// id: 25100,
// title: '积分明细',
// icon: <MacCommandOutlined />,
// hidden: true,
// },
// },
// {
// path: '/pointManage/divideOrder',
// element: withLoadingComponent(<DivideOrder />),
// meta: {
// id: 25300,
// title: '订单分成',
// icon: <MacCommandOutlined />,
// },
// },
// {
// path: '/pointManage/divideRules',
// element: withLoadingComponent(<DivideRules />),
// meta: {
// id: 25400,
// title: '分成规则',
// icon: <MacCommandOutlined />,
// hidden: true,
// },
// },
],
},
// {
// path: '/couponManage',
// element: <LayoutView />,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论