前端重构

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, splitMenus: false,
// 页脚渲染
footerRender: true,
// 菜单头部渲染 // 菜单头部渲染
menuHeaderRender: true, menuHeaderRender: true,
}; };

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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