前端重构

This commit is contained in:
Yvan 2026-01-08 12:11:32 +08:00
parent b0eb4c2fc3
commit b988fcc0e1
10 changed files with 105 additions and 71 deletions

View File

@ -41,8 +41,6 @@ const Settings: ProLayoutProps & {
},
// 分割菜单
splitMenus: false,
// 页脚渲染
footerRender: true,
// 菜单头部渲染
menuHeaderRender: true,
};

View File

@ -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,
};
};

View File

@ -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} />;
};

View File

@ -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) {

View File

@ -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();

View File

@ -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);

View File

@ -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 || '初始化失败');

View File

@ -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);

View File

@ -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();

View File

@ -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) {