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