前端重构
This commit is contained in:
parent
b0eb4c2fc3
commit
b988fcc0e1
|
|
@ -41,8 +41,6 @@ const Settings: ProLayoutProps & {
|
||||||
},
|
},
|
||||||
// 分割菜单
|
// 分割菜单
|
||||||
splitMenus: false,
|
splitMenus: false,
|
||||||
// 页脚渲染
|
|
||||||
footerRender: true,
|
|
||||||
// 菜单头部渲染
|
// 菜单头部渲染
|
||||||
menuHeaderRender: true,
|
menuHeaderRender: true,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -91,8 +91,13 @@ export async function getInitialState(): Promise<{
|
||||||
*/
|
*/
|
||||||
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
|
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
|
||||||
return {
|
return {
|
||||||
|
// 先展开 settings,让后面的配置可以覆盖
|
||||||
|
...initialState?.settings,
|
||||||
|
|
||||||
// 右上角操作区
|
// 右上角操作区
|
||||||
actionsRender: () => [<Question key="doc" />],
|
actionsRender: () => {
|
||||||
|
return [<Question key="doc" />];
|
||||||
|
},
|
||||||
|
|
||||||
// 头像配置
|
// 头像配置
|
||||||
avatarProps: {
|
avatarProps: {
|
||||||
|
|
@ -155,8 +160,6 @@ export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) =
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
...initialState?.settings,
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,14 @@ import React, { useMemo } from 'react';
|
||||||
import BaseChart from './BaseChart';
|
import BaseChart from './BaseChart';
|
||||||
import type { EChartsOption } from 'echarts';
|
import type { EChartsOption } from 'echarts';
|
||||||
|
|
||||||
|
interface SeriesItem {
|
||||||
|
name: string;
|
||||||
|
data: number[];
|
||||||
|
}
|
||||||
|
|
||||||
interface LineChartProps {
|
interface LineChartProps {
|
||||||
data: { name: string; value: number }[];
|
data?: { name: string; value: number }[];
|
||||||
|
series?: SeriesItem[];
|
||||||
xAxisData?: string[];
|
xAxisData?: string[];
|
||||||
title?: string;
|
title?: string;
|
||||||
smooth?: boolean;
|
smooth?: boolean;
|
||||||
|
|
@ -18,6 +24,7 @@ interface LineChartProps {
|
||||||
|
|
||||||
const LineChart: React.FC<LineChartProps> = ({
|
const LineChart: React.FC<LineChartProps> = ({
|
||||||
data,
|
data,
|
||||||
|
series,
|
||||||
xAxisData,
|
xAxisData,
|
||||||
title,
|
title,
|
||||||
smooth = true,
|
smooth = true,
|
||||||
|
|
@ -26,34 +33,60 @@ const LineChart: React.FC<LineChartProps> = ({
|
||||||
height = 300,
|
height = 300,
|
||||||
loading,
|
loading,
|
||||||
}) => {
|
}) => {
|
||||||
const option: EChartsOption = useMemo(() => ({
|
const option: EChartsOption = useMemo(() => {
|
||||||
title: title ? { text: title, left: 'center' } : undefined,
|
// 支持两种数据格式
|
||||||
tooltip: {
|
let seriesData: any[];
|
||||||
trigger: 'axis',
|
let xData: string[];
|
||||||
},
|
|
||||||
xAxis: {
|
if (series && series.length > 0) {
|
||||||
type: 'category',
|
// 使用 series 格式
|
||||||
data: xAxisData || data.map((item) => item.name),
|
seriesData = series.map((s) => ({
|
||||||
boundaryGap: false,
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
type: 'value',
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
type: 'line',
|
type: 'line',
|
||||||
data: data.map((item) => item.value),
|
name: s.name,
|
||||||
|
data: s.data,
|
||||||
smooth,
|
smooth,
|
||||||
areaStyle: areaStyle ? {} : undefined,
|
areaStyle: areaStyle ? {} : undefined,
|
||||||
|
}));
|
||||||
|
xData = xAxisData || [];
|
||||||
|
} else if (data && data.length > 0) {
|
||||||
|
// 使用 data 格式
|
||||||
|
seriesData = [
|
||||||
|
{
|
||||||
|
type: 'line',
|
||||||
|
data: data.map((item) => item.value),
|
||||||
|
smooth,
|
||||||
|
areaStyle: areaStyle ? {} : undefined,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
xData = xAxisData || data.map((item) => item.name);
|
||||||
|
} else {
|
||||||
|
seriesData = [];
|
||||||
|
xData = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: title ? { text: title, left: 'center' } : undefined,
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
},
|
},
|
||||||
],
|
legend: series && series.length > 1 ? { data: series.map((s) => s.name) } : undefined,
|
||||||
grid: {
|
xAxis: {
|
||||||
left: '3%',
|
type: 'category',
|
||||||
right: '4%',
|
data: xData,
|
||||||
bottom: '3%',
|
boundaryGap: false,
|
||||||
containLabel: true,
|
},
|
||||||
},
|
yAxis: {
|
||||||
}), [data, xAxisData, title, smooth, areaStyle]);
|
type: 'value',
|
||||||
|
},
|
||||||
|
series: seriesData,
|
||||||
|
grid: {
|
||||||
|
left: '3%',
|
||||||
|
right: '4%',
|
||||||
|
bottom: '3%',
|
||||||
|
containLabel: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}, [data, series, xAxisData, title, smooth, areaStyle]);
|
||||||
|
|
||||||
return <BaseChart option={option} width={width} height={height} loading={loading} />;
|
return <BaseChart option={option} width={width} height={height} loading={loading} />;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -85,8 +85,8 @@ const BreakpointUpload: React.FC = () => {
|
||||||
chunkTotal: slices.length,
|
chunkTotal: slices.length,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
const fileInfo = res.data.data?.file;
|
const fileInfo = res.data?.file;
|
||||||
if (fileInfo?.IsFinish) {
|
if (fileInfo?.IsFinish) {
|
||||||
setWaitUpload([]);
|
setWaitUpload([]);
|
||||||
setPercentage(100);
|
setPercentage(100);
|
||||||
|
|
@ -132,7 +132,7 @@ const BreakpointUpload: React.FC = () => {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await breakpointContinue(item.formData);
|
const res = await breakpointContinue(item.formData);
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
uploadedCount++;
|
uploadedCount++;
|
||||||
setPercentage(Math.floor((uploadedCount / formDataList.length) * 100));
|
setPercentage(Math.floor((uploadedCount / formDataList.length) * 100));
|
||||||
}
|
}
|
||||||
|
|
@ -149,13 +149,13 @@ const BreakpointUpload: React.FC = () => {
|
||||||
fileMd5: fileMd5,
|
fileMd5: fileMd5,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (finishRes.data?.code === 0) {
|
if (finishRes.code === 0) {
|
||||||
message.success('上传成功');
|
message.success('上传成功');
|
||||||
// 删除缓存切片
|
// 删除缓存切片
|
||||||
await removeChunk({
|
await removeChunk({
|
||||||
fileName: file.name,
|
fileName: file.name,
|
||||||
fileMd5: fileMd5,
|
fileMd5: fileMd5,
|
||||||
filePath: finishRes.data.data?.filePath,
|
filePath: finishRes.data?.filePath,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
||||||
|
|
@ -31,9 +31,9 @@ const CustomerPage: React.FC = () => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
const res = await getExaCustomerList({ page, pageSize });
|
const res = await getExaCustomerList({ page, pageSize });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
setTableData(res.data.data?.list || []);
|
setTableData(res.data?.list || []);
|
||||||
setTotal(res.data.data?.total || 0);
|
setTotal(res.data?.total || 0);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取客户列表失败:', error);
|
console.error('获取客户列表失败:', error);
|
||||||
|
|
@ -57,9 +57,9 @@ const CustomerPage: React.FC = () => {
|
||||||
const handleEdit = async (record: Customer) => {
|
const handleEdit = async (record: Customer) => {
|
||||||
try {
|
try {
|
||||||
const res = await getExaCustomer({ ID: record.ID! });
|
const res = await getExaCustomer({ ID: record.ID! });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
setEditType('update');
|
setEditType('update');
|
||||||
form.setFieldsValue(res.data.data?.customer);
|
form.setFieldsValue(res.data?.customer);
|
||||||
setDrawerVisible(true);
|
setDrawerVisible(true);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -77,7 +77,7 @@ const CustomerPage: React.FC = () => {
|
||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
try {
|
try {
|
||||||
const res = await deleteExaCustomer({ ID: record.ID! });
|
const res = await deleteExaCustomer({ ID: record.ID! });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('删除成功');
|
message.success('删除成功');
|
||||||
// 如果当前页只有一条数据且不是第一页,则回到上一页
|
// 如果当前页只有一条数据且不是第一页,则回到上一页
|
||||||
if (tableData.length === 1 && page > 1) {
|
if (tableData.length === 1 && page > 1) {
|
||||||
|
|
@ -109,7 +109,7 @@ const CustomerPage: React.FC = () => {
|
||||||
} else {
|
} else {
|
||||||
res = await updateExaCustomer(values);
|
res = await updateExaCustomer(values);
|
||||||
}
|
}
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success(editType === 'create' ? '创建成功' : '更新成功');
|
message.success(editType === 'create' ? '创建成功' : '更新成功');
|
||||||
closeDrawer();
|
closeDrawer();
|
||||||
getTableData();
|
getTableData();
|
||||||
|
|
|
||||||
|
|
@ -44,8 +44,8 @@ const UploadPage: React.FC = () => {
|
||||||
const fetchCategories = async () => {
|
const fetchCategories = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await getCategoryList();
|
const res = await getCategoryList();
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
const data = res.data.data || [];
|
const data = res.data || [];
|
||||||
setCategories([{ ID: 0, name: '全部分类', pid: 0, children: [] }, ...data]);
|
setCategories([{ ID: 0, name: '全部分类', pid: 0, children: [] }, ...data]);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -58,9 +58,9 @@ const UploadPage: React.FC = () => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
const res = await getFileList({ page, pageSize, keyword, classId });
|
const res = await getFileList({ page, pageSize, keyword, classId });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
setTableData(res.data.data?.list || []);
|
setTableData(res.data?.list || []);
|
||||||
setTotal(res.data.data?.total || 0);
|
setTotal(res.data?.total || 0);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取文件列表失败:', error);
|
console.error('获取文件列表失败:', error);
|
||||||
|
|
@ -101,7 +101,7 @@ const UploadPage: React.FC = () => {
|
||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
try {
|
try {
|
||||||
const res = await deleteFile(record);
|
const res = await deleteFile(record);
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('删除成功!');
|
message.success('删除成功!');
|
||||||
if (tableData.length === 1 && page > 1) {
|
if (tableData.length === 1 && page > 1) {
|
||||||
setPage(page - 1);
|
setPage(page - 1);
|
||||||
|
|
@ -146,7 +146,7 @@ const UploadPage: React.FC = () => {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const res = await editFileName(record);
|
const res = await editFileName(record);
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('编辑成功!');
|
message.success('编辑成功!');
|
||||||
getTableData();
|
getTableData();
|
||||||
}
|
}
|
||||||
|
|
@ -211,7 +211,7 @@ const UploadPage: React.FC = () => {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await importURL(importData);
|
const res = await importURL(importData);
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('导入成功!');
|
message.success('导入成功!');
|
||||||
getTableData();
|
getTableData();
|
||||||
}
|
}
|
||||||
|
|
@ -247,7 +247,7 @@ const UploadPage: React.FC = () => {
|
||||||
const handleDeleteCategory = async (id: number) => {
|
const handleDeleteCategory = async (id: number) => {
|
||||||
try {
|
try {
|
||||||
const res = await deleteCategory({ id });
|
const res = await deleteCategory({ id });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('删除成功');
|
message.success('删除成功');
|
||||||
fetchCategories();
|
fetchCategories();
|
||||||
}
|
}
|
||||||
|
|
@ -261,7 +261,7 @@ const UploadPage: React.FC = () => {
|
||||||
try {
|
try {
|
||||||
const values = await form.validateFields();
|
const values = await form.validateFields();
|
||||||
const res = await addCategory({ ...categoryFormData, ...values });
|
const res = await addCategory({ ...categoryFormData, ...values });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('操作成功');
|
message.success('操作成功');
|
||||||
fetchCategories();
|
fetchCategories();
|
||||||
setCategoryModalVisible(false);
|
setCategoryModalVisible(false);
|
||||||
|
|
|
||||||
|
|
@ -179,8 +179,8 @@ const InitPage: React.FC = () => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
try {
|
try {
|
||||||
const res = await initDB(values);
|
const res = await initDB(values);
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success(res.data?.msg || '初始化成功');
|
message.success(res.msg || '初始化成功');
|
||||||
|
|
||||||
Modal.confirm({
|
Modal.confirm({
|
||||||
title: '配置完成',
|
title: '配置完成',
|
||||||
|
|
@ -197,7 +197,7 @@ const InitPage: React.FC = () => {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
message.error(res.data?.msg || '初始化失败');
|
message.error(res.msg || '初始化失败');
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
message.error(error?.message || '初始化失败');
|
message.error(error?.message || '初始化失败');
|
||||||
|
|
|
||||||
|
|
@ -144,7 +144,7 @@ const PersonPage: React.FC = () => {
|
||||||
const handleSaveNickName = async () => {
|
const handleSaveNickName = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await setSelfInfo({ nickName });
|
const res = await setSelfInfo({ nickName });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
setUserInfo({ nickName });
|
setUserInfo({ nickName });
|
||||||
message.success('修改成功');
|
message.success('修改成功');
|
||||||
setEditNickName(false);
|
setEditNickName(false);
|
||||||
|
|
@ -166,7 +166,7 @@ const PersonPage: React.FC = () => {
|
||||||
password: values.password,
|
password: values.password,
|
||||||
newPassword: values.newPassword,
|
newPassword: values.newPassword,
|
||||||
});
|
});
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('修改密码成功');
|
message.success('修改密码成功');
|
||||||
setPasswordModal(false);
|
setPasswordModal(false);
|
||||||
passwordForm.resetFields();
|
passwordForm.resetFields();
|
||||||
|
|
@ -181,7 +181,7 @@ const PersonPage: React.FC = () => {
|
||||||
try {
|
try {
|
||||||
const values = await phoneForm.validateFields();
|
const values = await phoneForm.validateFields();
|
||||||
const res = await setSelfInfo({ phone: values.phone });
|
const res = await setSelfInfo({ phone: values.phone });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
setUserInfo({ phone: values.phone });
|
setUserInfo({ phone: values.phone });
|
||||||
message.success('修改成功');
|
message.success('修改成功');
|
||||||
setPhoneModal(false);
|
setPhoneModal(false);
|
||||||
|
|
@ -197,7 +197,7 @@ const PersonPage: React.FC = () => {
|
||||||
try {
|
try {
|
||||||
const values = await emailForm.validateFields();
|
const values = await emailForm.validateFields();
|
||||||
const res = await setSelfInfo({ email: values.email });
|
const res = await setSelfInfo({ email: values.email });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
setUserInfo({ email: values.email });
|
setUserInfo({ email: values.email });
|
||||||
message.success('修改成功');
|
message.success('修改成功');
|
||||||
setEmailModal(false);
|
setEmailModal(false);
|
||||||
|
|
|
||||||
|
|
@ -54,8 +54,8 @@ const AnnouncementPage: React.FC = () => {
|
||||||
const fetchDataSource = async () => {
|
const fetchDataSource = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await getInfoDataSource();
|
const res = await getInfoDataSource();
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
setDataSource(res.data.data || { userID: [] });
|
setDataSource(res.data || { userID: [] });
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取数据源失败:', error);
|
console.error('获取数据源失败:', error);
|
||||||
|
|
@ -72,9 +72,9 @@ const AnnouncementPage: React.FC = () => {
|
||||||
pageSize,
|
pageSize,
|
||||||
...searchValues,
|
...searchValues,
|
||||||
});
|
});
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
setTableData(res.data.data?.list || []);
|
setTableData(res.data?.list || []);
|
||||||
setTotal(res.data.data?.total || 0);
|
setTotal(res.data?.total || 0);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取公告列表失败:', error);
|
console.error('获取公告列表失败:', error);
|
||||||
|
|
@ -115,9 +115,9 @@ const AnnouncementPage: React.FC = () => {
|
||||||
const handleEdit = async (record: AnnouncementItem) => {
|
const handleEdit = async (record: AnnouncementItem) => {
|
||||||
try {
|
try {
|
||||||
const res = await findInfo({ ID: record.ID });
|
const res = await findInfo({ ID: record.ID });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
setEditType('update');
|
setEditType('update');
|
||||||
editForm.setFieldsValue(res.data.data);
|
editForm.setFieldsValue(res.data);
|
||||||
setDrawerVisible(true);
|
setDrawerVisible(true);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -133,7 +133,7 @@ const AnnouncementPage: React.FC = () => {
|
||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
try {
|
try {
|
||||||
const res = await deleteInfo({ ID: record.ID });
|
const res = await deleteInfo({ ID: record.ID });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('删除成功');
|
message.success('删除成功');
|
||||||
if (tableData.length === 1 && page > 1) {
|
if (tableData.length === 1 && page > 1) {
|
||||||
setPage(page - 1);
|
setPage(page - 1);
|
||||||
|
|
@ -160,7 +160,7 @@ const AnnouncementPage: React.FC = () => {
|
||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
try {
|
try {
|
||||||
const res = await deleteInfoByIds({ IDs: selectedRowKeys as number[] });
|
const res = await deleteInfoByIds({ IDs: selectedRowKeys as number[] });
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('删除成功');
|
message.success('删除成功');
|
||||||
setSelectedRowKeys([]);
|
setSelectedRowKeys([]);
|
||||||
if (tableData.length === selectedRowKeys.length && page > 1) {
|
if (tableData.length === selectedRowKeys.length && page > 1) {
|
||||||
|
|
@ -192,7 +192,7 @@ const AnnouncementPage: React.FC = () => {
|
||||||
} else {
|
} else {
|
||||||
res = await updateInfo(values);
|
res = await updateInfo(values);
|
||||||
}
|
}
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('操作成功');
|
message.success('操作成功');
|
||||||
closeDrawer();
|
closeDrawer();
|
||||||
getTableData();
|
getTableData();
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ const EmailPage: React.FC = () => {
|
||||||
const handleSendTestEmail = async () => {
|
const handleSendTestEmail = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await emailTest();
|
const res = await emailTest();
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('发送成功');
|
message.success('发送成功');
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -26,7 +26,7 @@ const EmailPage: React.FC = () => {
|
||||||
try {
|
try {
|
||||||
const values = await form.validateFields();
|
const values = await form.validateFields();
|
||||||
const res = await sendEmailApi(values);
|
const res = await sendEmailApi(values);
|
||||||
if (res.data?.code === 0) {
|
if (res.code === 0) {
|
||||||
message.success('发送成功,请查收');
|
message.success('发送成功,请查收');
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue