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