From b988fcc0e1578ca09dac70479c3bce2c2879d41a Mon Sep 17 00:00:00 2001
From: Yvan <8574526@qq,com>
Date: Thu, 8 Jan 2026 12:11:32 +0800
Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E9=87=8D=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
web/config/defaultSettings.ts | 2 -
web/src/app.tsx | 9 ++-
web/src/components/Charts/LineChart.tsx | 83 ++++++++++++++-------
web/src/pages/example/breakpoint/index.tsx | 10 +--
web/src/pages/example/customer/index.tsx | 14 ++--
web/src/pages/example/upload/index.tsx | 20 ++---
web/src/pages/init/index.tsx | 6 +-
web/src/pages/person/index.tsx | 8 +-
web/src/pages/plugin/announcement/index.tsx | 20 ++---
web/src/pages/plugin/email/index.tsx | 4 +-
10 files changed, 105 insertions(+), 71 deletions(-)
diff --git a/web/config/defaultSettings.ts b/web/config/defaultSettings.ts
index fed2469..ce6f7e8 100644
--- a/web/config/defaultSettings.ts
+++ b/web/config/defaultSettings.ts
@@ -41,8 +41,6 @@ const Settings: ProLayoutProps & {
},
// 分割菜单
splitMenus: false,
- // 页脚渲染
- footerRender: true,
// 菜单头部渲染
menuHeaderRender: true,
};
diff --git a/web/src/app.tsx b/web/src/app.tsx
index b269e1b..e759d2c 100644
--- a/web/src/app.tsx
+++ b/web/src/app.tsx
@@ -91,8 +91,13 @@ export async function getInitialState(): Promise<{
*/
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
return {
+ // 先展开 settings,让后面的配置可以覆盖
+ ...initialState?.settings,
+
// 右上角操作区
- actionsRender: () => [],
+ actionsRender: () => {
+ return [];
+ },
// 头像配置
avatarProps: {
@@ -155,8 +160,6 @@ export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) =
>
);
},
-
- ...initialState?.settings,
};
};
diff --git a/web/src/components/Charts/LineChart.tsx b/web/src/components/Charts/LineChart.tsx
index f3ae29d..ca6e6de 100644
--- a/web/src/components/Charts/LineChart.tsx
+++ b/web/src/components/Charts/LineChart.tsx
@@ -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 = ({
data,
+ series,
xAxisData,
title,
smooth = true,
@@ -26,34 +33,60 @@ const LineChart: React.FC = ({
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 ;
};
diff --git a/web/src/pages/example/breakpoint/index.tsx b/web/src/pages/example/breakpoint/index.tsx
index 7c83977..4f27e52 100644
--- a/web/src/pages/example/breakpoint/index.tsx
+++ b/web/src/pages/example/breakpoint/index.tsx
@@ -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) {
diff --git a/web/src/pages/example/customer/index.tsx b/web/src/pages/example/customer/index.tsx
index 827fbb1..4c9fee0 100644
--- a/web/src/pages/example/customer/index.tsx
+++ b/web/src/pages/example/customer/index.tsx
@@ -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();
diff --git a/web/src/pages/example/upload/index.tsx b/web/src/pages/example/upload/index.tsx
index b8a8e89..751927d 100644
--- a/web/src/pages/example/upload/index.tsx
+++ b/web/src/pages/example/upload/index.tsx
@@ -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);
diff --git a/web/src/pages/init/index.tsx b/web/src/pages/init/index.tsx
index 0b7a6af..c3c1f40 100644
--- a/web/src/pages/init/index.tsx
+++ b/web/src/pages/init/index.tsx
@@ -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 || '初始化失败');
diff --git a/web/src/pages/person/index.tsx b/web/src/pages/person/index.tsx
index 158a0e1..3dea611 100644
--- a/web/src/pages/person/index.tsx
+++ b/web/src/pages/person/index.tsx
@@ -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);
diff --git a/web/src/pages/plugin/announcement/index.tsx b/web/src/pages/plugin/announcement/index.tsx
index 64a0275..8b56bc8 100644
--- a/web/src/pages/plugin/announcement/index.tsx
+++ b/web/src/pages/plugin/announcement/index.tsx
@@ -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();
diff --git a/web/src/pages/plugin/email/index.tsx b/web/src/pages/plugin/email/index.tsx
index 3b271a0..e1bc42a 100644
--- a/web/src/pages/plugin/email/index.tsx
+++ b/web/src/pages/plugin/email/index.tsx
@@ -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) {