大改动

This commit is contained in:
宇阳
2025-01-12 19:57:49 +08:00
parent 7f01194c61
commit 38f171d727
27 changed files with 245 additions and 234 deletions

View File

@@ -6,8 +6,8 @@ import { Form, Input, Button, Tree, Modal, Spin, Dropdown, Card, MenuProps, Popc
import Title from '@/components/Title'; import Title from '@/components/Title';
import "./index.scss" import "./index.scss"
export default () => { const CatePage = () => {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false)
const [btnLoading, setBtnLoading] = useState(false) const [btnLoading, setBtnLoading] = useState(false)
const [editLoading, setEditLoading] = useState(false) const [editLoading, setEditLoading] = useState(false)
@@ -19,56 +19,58 @@ export default () => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const getCateList = async () => { const getCateList = async () => {
const { data } = await getCateListAPI(); setLoading(true)
data.sort((a, b) => a.order - b.order)
setList(data as Cate[]); try {
setLoading(false); const { data } = await getCateListAPI();
data.sort((a, b) => a.order - b.order)
setList(data);
} catch (error) {
setLoading(false)
}
setLoading(false)
}; };
useEffect(() => { useEffect(() => {
setLoading(true); setLoading(true)
getCateList(); getCateList()
}, []); }, []);
const addCateData = (id: number) => { const addCateData = (id: number) => {
setIsMethod("create") setIsMethod("create")
setIsModelOpen(true); setIsModelOpen(true);
setIsCateShow(false) setIsCateShow(false)
form.resetFields(); form.resetFields();
setCate({ ...cate, level: id, type: "cate" }); setCate({ ...cate, level: id, type: "cate" });
}; };
const editCateData = async (id: number) => { const editCateData = async (id: number) => {
setEditLoading(true); setIsMethod("edit");
setIsModelOpen(true);
setEditLoading(true)
try { try {
setIsMethod("edit")
setIsModelOpen(true);
const { data } = await getCateDataAPI(id); const { data } = await getCateDataAPI(id);
setIsCateShow(data.type === "cate" ? false : true);
setCate(data); setCate(data);
form.setFieldsValue(data); form.setFieldsValue(data);
// 判断是分类还是导航
setIsCateShow(data.type === "cate" ? false : true)
} catch (error) { } catch (error) {
setEditLoading(false); setEditLoading(false)
} }
setEditLoading(false); setEditLoading(false)
}; };
const delCateData = async (id: number) => { const delCateData = async (id: number) => {
setLoading(true); setLoading(true)
try { try {
await delCateDataAPI(id); await delCateDataAPI(id);
await getCateList();
message.success('🎉 删除分类成功'); message.success('🎉 删除分类成功');
await getCateList();
} catch (error) { } catch (error) {
setLoading(false); setLoading(false)
} }
}; };
@@ -92,6 +94,7 @@ export default () => {
// 初始化表单状态 // 初始化表单状态
form.resetFields(); form.resetFields();
setCate({} as Cate); setCate({} as Cate);
setIsModelOpen(false); setIsModelOpen(false);
setIsMethod("create") setIsMethod("create")
}) })
@@ -149,7 +152,7 @@ export default () => {
) )
return ( return (
<> <div>
<Title value="分类管理"> <Title value="分类管理">
<Button type="primary" size='large' onClick={() => addCateData(0)}></Button> <Button type="primary" size='large' onClick={() => addCateData(0)}></Button>
</Title> </Title>
@@ -199,6 +202,8 @@ export default () => {
</Form> </Form>
</Modal> </Modal>
</Card> </Card>
</> </div>
); );
}; };
export default CatePage;

View File

@@ -1,7 +1,8 @@
import { ApexOptions } from 'apexcharts'; import { ApexOptions } from 'apexcharts';
import React, { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import ReactApexChart from 'react-apexcharts'; import ReactApexChart from 'react-apexcharts';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { Spin } from 'antd';
interface ChartThreeState { interface ChartThreeState {
series: number[]; series: number[];
@@ -49,7 +50,9 @@ const options: ApexOptions = {
], ],
}; };
const ChartThree: React.FC = () => { export default () => {
const [loading, setLoading] = useState(true)
const [result, setResult] = useState({ newVisitors: 0, oldVisitors: 0 }) const [result, setResult] = useState({ newVisitors: 0, oldVisitors: 0 })
const [date, setDate] = useState(dayjs(new Date()).format("YYYY/MM/DD")); const [date, setDate] = useState(dayjs(new Date()).format("YYYY/MM/DD"));
@@ -58,18 +61,26 @@ const ChartThree: React.FC = () => {
}); });
const getDataList = async () => { const getDataList = async () => {
const siteId = import.meta.env.VITE_BAIDU_TONGJI_SITE_ID; setLoading(true)
const token = import.meta.env.VITE_BAIDU_TONGJI_ACCESS_TOKEN;
const response = await fetch(`/api/rest/2.0/tongji/report/getData?access_token=${token}&site_id=${siteId}&start_date=${date}&end_date=${date}&metrics=new_visitor_count%2Cnew_visitor_ratio&method=trend%2Ftime%2Fa&gran=day&area=`); try {
const data = await response.json(); const siteId = import.meta.env.VITE_BAIDU_TONGJI_SITE_ID;
const { result } = data; const token = import.meta.env.VITE_BAIDU_TONGJI_ACCESS_TOKEN;
const newVisitors = result.items[1][0][1] !== "--" ? result.items[1][0][1] : 0 const response = await fetch(`/api/rest/2.0/tongji/report/getData?access_token=${token}&site_id=${siteId}&start_date=${date}&end_date=${date}&metrics=new_visitor_count%2Cnew_visitor_ratio&method=trend%2Ftime%2Fa&gran=day&area=`);
const oldVisitors = result.items[1][0][1] !== "--" ? 100 - result.items[1][0][1] : 0 const data = await response.json();
const { result } = data;
setState({ series: [newVisitors, oldVisitors] }) const newVisitors = result.items[1][0][1] !== "--" ? result.items[1][0][1] : 0
setResult({ newVisitors, oldVisitors }) const oldVisitors = result.items[1][0][1] !== "--" ? 100 - result.items[1][0][1] : 0
setState({ series: [newVisitors, oldVisitors] })
setResult({ newVisitors, oldVisitors })
} catch (error) {
setLoading(false)
}
setLoading(false)
} }
useEffect(() => { useEffect(() => {
@@ -77,48 +88,48 @@ const ChartThree: React.FC = () => {
}, []) }, [])
return ( return (
<div className="sm:px-7.5 col-span-12 rounded-lg border border-stroke bg-white px-5 pb-5 pt-7.5 shadow-default dark:border-strokedark dark:bg-boxdark xl:col-span-4"> <Spin spinning={loading}>
<div className="mb-3 justify-between gap-4 sm:flex"> <div className="sm:px-7.5 col-span-12 rounded-lg border border-stroke bg-white px-5 pb-5 pt-7.5 shadow-default dark:border-strokedark dark:bg-boxdark xl:col-span-4">
<div> <div className="mb-3 justify-between gap-4 sm:flex">
<h5 className="text-xl font-semibold text-black dark:text-white"> <div>
访 <h5 className="text-xl font-semibold text-black dark:text-white">
</h5> 访
</div> </h5>
</div>
<div className="mb-2">
<div id="chartThree" className="mx-auto flex justify-center">
<ReactApexChart
options={options}
series={state.series}
type="donut"
/>
</div>
</div>
<div className="-mx-8 mt-8 flex flex-wrap items-center justify-center gap-y-3">
<div className="sm:w-1/2 w-full px-8">
<div className="flex w-full items-center">
<span className="mr-2 block h-3 w-full max-w-3 rounded-full bg-[#91C8EA]"></span>
<p className="flex w-full justify-between text-sm font-medium text-black dark:text-white">
<span> 访 </span>
<span> {result.newVisitors.toFixed(2)}% </span>
</p>
</div> </div>
</div> </div>
<div className="sm:w-1/2 w-full px-8"> <div className="mb-2">
<div className="flex w-full items-center"> <div id="chartThree" className="mx-auto flex justify-center">
<span className="mr-2 block h-3 w-full max-w-3 rounded-full bg-[#727cf5]"></span> <ReactApexChart
<p className="flex w-full justify-between text-sm font-medium text-black dark:text-white"> options={options}
<span> 访 </span> series={state.series}
<span> {result.oldVisitors.toFixed(2)}% </span> type="donut"
</p> />
</div>
</div>
<div className="-mx-8 mt-8 flex flex-wrap items-center justify-center gap-y-3">
<div className="sm:w-1/2 w-full px-8">
<div className="flex w-full items-center">
<span className="mr-2 block h-3 w-full max-w-3 rounded-full bg-[#91C8EA]"></span>
<p className="flex w-full justify-between text-sm font-medium text-black dark:text-white">
<span> 访 </span>
<span> {result.newVisitors.toFixed(2)}% </span>
</p>
</div>
</div>
<div className="sm:w-1/2 w-full px-8">
<div className="flex w-full items-center">
<span className="mr-2 block h-3 w-full max-w-3 rounded-full bg-[#727cf5]"></span>
<p className="flex w-full justify-between text-sm font-medium text-black dark:text-white">
<span> 访 </span>
<span> {result.oldVisitors.toFixed(2)}% </span>
</p>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </Spin>
); );
}; };
export default ChartThree;

View File

@@ -6,12 +6,13 @@ import { MonthlySums, ChartOneState } from './type';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { Result } from '../../type'; import { Result } from '../../type';
const VisitorsStatisChat = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false);
const [result, setResult] = useState<Result | null>(null); const [result, setResult] = useState<Result | null>(null);
const [scope, setScope] = useState<"day" | "month" | "year">("day"); const [scope, setScope] = useState<"day" | "month" | "year">("day");
const [startDate, setStartDate] = useState(dayjs(new Date()).subtract(7, "day").format("YYYY/MM/DD")); const [startDate, setStartDate] = useState(dayjs(new Date()).subtract(7, "day").format("YYYY/MM/DD"));
const [endDate, setEndDate] = useState(dayjs(new Date()).format("YYYY/MM/DD")); const [endDate, setEndDate] = useState(dayjs(new Date()).format("YYYY/MM/DD"));
const [loading, setLoading] = useState<boolean>(false);
// 图表相关配置 // 图表相关配置
const [options, setOptions] = useState<ApexOptions>({ const [options, setOptions] = useState<ApexOptions>({
@@ -123,15 +124,19 @@ const VisitorsStatisChat = () => {
// 获取统计数据 // 获取统计数据
const getDataList = useCallback(async () => { const getDataList = useCallback(async () => {
setLoading(true); setLoading(true)
const siteId = import.meta.env.VITE_BAIDU_TONGJI_SITE_ID; try {
const token = import.meta.env.VITE_BAIDU_TONGJI_ACCESS_TOKEN; const siteId = import.meta.env.VITE_BAIDU_TONGJI_SITE_ID;
const token = import.meta.env.VITE_BAIDU_TONGJI_ACCESS_TOKEN;
const response = await fetch(`/api/rest/2.0/tongji/report/getData?access_token=${token}&site_id=${siteId}&start_date=${startDate}&end_date=${endDate}&metrics=pv_count%2Cip_count&method=overview%2FgetTimeTrendRpt`); const response = await fetch(`/api/rest/2.0/tongji/report/getData?access_token=${token}&site_id=${siteId}&start_date=${startDate}&end_date=${endDate}&metrics=pv_count%2Cip_count&method=overview%2FgetTimeTrendRpt`);
const data = await response.json(); const data = await response.json();
const { result } = data; const { result } = data;
setResult(result); setResult(result);
} catch (error) {
setLoading(false)
}
setLoading(false); setLoading(false);
}, [startDate, endDate]); }, [startDate, endDate]);
@@ -142,6 +147,8 @@ const VisitorsStatisChat = () => {
// 切换不同范围的数据 // 切换不同范围的数据
const scopeData = useMemo(() => { const scopeData = useMemo(() => {
setLoading(true)
if (!result?.items?.length) return { categories: [], series: [[], []] }; if (!result?.items?.length) return { categories: [], series: [[], []] };
let categories = []; let categories = [];
@@ -231,6 +238,7 @@ const VisitorsStatisChat = () => {
// 当数据发生变化时,更新图表选项和状态 // 当数据发生变化时,更新图表选项和状态
useEffect(() => { useEffect(() => {
setLoading(true)
setOptions((data) => ({ setOptions((data) => ({
...data, ...data,
xaxis: { ...options.xaxis, categories: scopeData.categories || [] } xaxis: { ...options.xaxis, categories: scopeData.categories || [] }
@@ -249,6 +257,8 @@ const VisitorsStatisChat = () => {
}, },
], ],
})); }));
setLoading(false)
}, [scopeData]); }, [scopeData]);
// 处理范围变更并相应地更新日期范围 // 处理范围变更并相应地更新日期范围
@@ -323,5 +333,3 @@ const VisitorsStatisChat = () => {
</div> </div>
); );
}; };
export default VisitorsStatisChat;

View File

@@ -1,11 +1,11 @@
import { useEffect, useState } from "react"
import { Spin } from "antd";
import VisitorsStatisChat from "./components/VisitorsStatisChat" import VisitorsStatisChat from "./components/VisitorsStatisChat"
import NewOldVisitors from './components/NewOldVisitors' import NewOldVisitors from './components/NewOldVisitors'
import CardDataStats from "@/components/CardDataStats" import CardDataStats from "@/components/CardDataStats"
import { AiOutlineEye, AiOutlineMeh, AiOutlineStock, AiOutlineFieldTime } from "react-icons/ai"; import { AiOutlineEye, AiOutlineMeh, AiOutlineStock, AiOutlineFieldTime } from "react-icons/ai";
import { useEffect, useState } from "react"
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { Spin } from "antd";
export default () => { export default () => {
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)

View File

@@ -2,16 +2,14 @@ import { Card } from 'antd';
import HeaderInfo from './components/HeaderInfo'; import HeaderInfo from './components/HeaderInfo';
import Stats from './components/Stats'; import Stats from './components/Stats';
const Home = () => { export default () => {
return ( return (
<> <div>
<Card className='[&>.ant-card-body]:!p-3'> <Card className='[&>.ant-card-body]:!p-3'>
<HeaderInfo /> <HeaderInfo />
</Card> </Card>
<Stats /> <Stats />
</> </div>
); );
}; };
export default Home;

View File

@@ -13,11 +13,12 @@ import { useWebStore } from '@/stores';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
export default () => { export default () => {
const [loading, setLoading] = useState<boolean>(false);
const navigate = useNavigate() const navigate = useNavigate()
const web = useWebStore(state => state.web) const web = useWebStore(state => state.web)
const [current, setCurrent] = useState<number>(1); const [current, setCurrent] = useState<number>(1);
const [loading, setLoading] = useState<boolean>(false);
const [articleList, setArticleList] = useState<Article[]>([]); const [articleList, setArticleList] = useState<Article[]>([]);
const [form] = Form.useForm(); const [form] = Form.useForm();
@@ -156,7 +157,7 @@ export default () => {
]; ];
return ( return (
<> <div>
<Title value="回收站" /> <Title value="回收站" />
<Card className={`${titleSty} mt-2 min-h-[calc(100vh-180px)]`}> <Card className={`${titleSty} mt-2 min-h-[calc(100vh-180px)]`}>
@@ -164,7 +165,6 @@ export default () => {
rowKey="id" rowKey="id"
dataSource={articleList} dataSource={articleList}
columns={columns as any} columns={columns as any}
loading={loading}
scroll={{ x: 'max-content' }} scroll={{ x: 'max-content' }}
pagination={{ pagination={{
position: ['bottomCenter'], position: ['bottomCenter'],
@@ -174,8 +174,9 @@ export default () => {
setCurrent(current) setCurrent(current)
} }
}} }}
loading={loading}
/> />
</Card> </Card>
</> </div>
); );
}; };

View File

@@ -12,10 +12,11 @@ import type { Article } from '@/types/app/article';
import { useWebStore } from '@/stores'; import { useWebStore } from '@/stores';
export default () => { export default () => {
const [loading, setLoading] = useState<boolean>(false);
const web = useWebStore(state => state.web) const web = useWebStore(state => state.web)
const [current, setCurrent] = useState<number>(1); const [current, setCurrent] = useState<number>(1);
const [loading, setLoading] = useState<boolean>(false);
const [articleList, setArticleList] = useState<Article[]>([]); const [articleList, setArticleList] = useState<Article[]>([]);
const [form] = Form.useForm(); const [form] = Form.useForm();
@@ -110,7 +111,7 @@ export default () => {
]; ];
return ( return (
<> <div>
<Title value="草稿箱" /> <Title value="草稿箱" />
<Card className={`${titleSty} mt-2 min-h-[calc(100vh-180px)]`}> <Card className={`${titleSty} mt-2 min-h-[calc(100vh-180px)]`}>
@@ -130,6 +131,6 @@ export default () => {
}} }}
/> />
</Card> </Card>
</> </div>
); );
}; };

View File

@@ -21,6 +21,8 @@ const breakpointColumnsObj = {
export default () => { export default () => {
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const [btnLoading, setBtnLoading] = useState(false)
const [downloadLoading, setDownloadLoading] = useState(false)
const [openUploadModalOpen, setOpenUploadModalOpen] = useState(false); const [openUploadModalOpen, setOpenUploadModalOpen] = useState(false);
const [openFileInfoDrawer, setOpenFileInfoDrawer] = useState(false); const [openFileInfoDrawer, setOpenFileInfoDrawer] = useState(false);
@@ -34,6 +36,8 @@ export default () => {
// 获取目录列表 // 获取目录列表
const getDirList = async () => { const getDirList = async () => {
setLoading(true)
try { try {
const { data } = await getDirListAPI() const { data } = await getDirListAPI()
setDirList(data) setDirList(data)
@@ -46,44 +50,59 @@ export default () => {
// 获取指定目录的文件列表 // 获取指定目录的文件列表
const getFileList = async (dir: string) => { const getFileList = async (dir: string) => {
const { data } = await getFileListAPI(dir) setLoading(true)
if (!fileList.length && !(data as File[]).length) message.error("该目录中没有文件") try {
const { data } = await getFileListAPI(dir)
if (!fileList.length && !data.length) message.error("该目录中没有文件")
setFileList(data)
} catch (error) {
setLoading(false)
}
setFileList(data as File[])
setLoading(false) setLoading(false)
} }
// 删除图片 // 删除图片
const onDeleteImage = async (data: File) => { const onDeleteImage = async (data: File) => {
setLoading(true) setBtnLoading(true)
try { try {
await delFileDataAPI(data.url) await delFileDataAPI(data.url)
await getFileList(dirName)
message.success("🎉 删除图片成功") message.success("🎉 删除图片成功")
getFileList(dirName)
setFile({} as File) setFile({} as File)
setOpenFileInfoDrawer(false) setOpenFileInfoDrawer(false)
setOpenFilePreviewDrawer(false) setOpenFilePreviewDrawer(false)
} catch (error) { } catch (error) {
setLoading(false) setBtnLoading(false)
} }
setBtnLoading(false)
} }
// 下载图片 // 下载图片
const onDownloadImage = (data: File) => { const onDownloadImage = (data: File) => {
fetch(data.url) setDownloadLoading(true)
.then((response) => response.blob())
.then((blob) => { try {
const url = URL.createObjectURL(new Blob([blob])); fetch(data.url)
const link = document.createElement<'a'>('a'); .then((response) => response.blob())
link.href = url; .then((blob) => {
link.download = data.name; const url = URL.createObjectURL(new Blob([blob]));
document.body.appendChild(link); const link = document.createElement<'a'>('a');
link.click(); link.href = url;
URL.revokeObjectURL(url); link.download = data.name;
link.remove(); document.body.appendChild(link);
}); link.click();
URL.revokeObjectURL(url);
link.remove();
});
} catch (error) {
setDownloadLoading(false)
}
setDownloadLoading(false)
}; };
// 打开目录 // 打开目录
@@ -93,18 +112,17 @@ export default () => {
} }
useEffect(() => { useEffect(() => {
setLoading(true)
getDirList() getDirList()
}, []) }, [])
// 查看文件信息 // 查看文件信息
const viewOpenFileInfo = (item: File) => { const viewOpenFileInfo = (record: File) => {
setOpenFileInfoDrawer(true) setOpenFileInfoDrawer(true)
setFile(item) setFile(record)
} }
return ( return (
<> <div>
<Title value='文件管理' /> <Title value='文件管理' />
<Card className='FilePage mt-2 min-h-[calc(100vh-180px)]'> <Card className='FilePage mt-2 min-h-[calc(100vh-180px)]'>
@@ -244,7 +262,7 @@ export default () => {
}} /> }} />
<Divider orientation="center"></Divider> <Divider orientation="center"></Divider>
<Button type='primary' className='w-full mb-2' onClick={() => onDownloadImage(file)}></Button> <Button type='primary' loading={downloadLoading} onClick={() => onDownloadImage(file)} className='w-full mb-2'></Button>
<Popconfirm <Popconfirm
title="警告" title="警告"
description="删除后无法恢复,确定要删除吗" description="删除后无法恢复,确定要删除吗"
@@ -252,9 +270,9 @@ export default () => {
okText="删除" okText="删除"
cancelText="取消" cancelText="取消"
> >
<Button type='primary' danger className='w-full'></Button> <Button type='primary' danger loading={btnLoading} className='w-full'></Button>
</Popconfirm> </Popconfirm>
</Drawer> </Drawer>
</> </div>
) )
} }

View File

@@ -9,7 +9,7 @@ import { IoSearch } from "react-icons/io5";
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import axios from 'axios'; import axios from 'axios';
const FootprintPage = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [btnLoading, setBtnLoading] = useState(false) const [btnLoading, setBtnLoading] = useState(false)
const [editLoading, setEditLoading] = useState(false) const [editLoading, setEditLoading] = useState(false)
@@ -165,8 +165,8 @@ const FootprintPage = () => {
message.success('🎉 新增足迹成功'); message.success('🎉 新增足迹成功');
} }
await getFootprintList();
reset() reset()
getFootprintList();
}); });
} catch (error) { } catch (error) {
setBtnLoading(false) setBtnLoading(false)
@@ -225,11 +225,11 @@ const FootprintPage = () => {
setEditLoading(false) setEditLoading(false)
} }
setEditLoading(false)
}; };
return ( return (
<> <div>
<Title value="足迹管理"> <Title value="足迹管理">
<Button type="primary" size='large' onClick={addFootprintData}></Button> <Button type="primary" size='large' onClick={addFootprintData}></Button>
</Title> </Title>
@@ -303,8 +303,6 @@ const FootprintPage = () => {
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>
</> </div>
); );
}; };
export default FootprintPage;

View File

@@ -11,7 +11,7 @@ interface Commit {
} }
} }
const Home = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false) const [loading, setLoading] = useState<boolean>(false)
const [year, setYear] = useState<number>(new Date().getFullYear()) const [year, setYear] = useState<number>(new Date().getFullYear())
@@ -77,7 +77,7 @@ const Home = () => {
}, []) }, [])
return ( return (
<> <div>
<Title value='项目迭代记录'></Title> <Title value='项目迭代记录'></Title>
<Spin spinning={loading}> <Spin spinning={loading}>
@@ -118,8 +118,6 @@ const Home = () => {
</div> </div>
</Card> </Card>
</Spin> </Spin>
</> </div>
); );
}; };
export default Home;

View File

@@ -6,7 +6,7 @@ import { UserOutlined, LockOutlined, EyeOutlined, EyeInvisibleOutlined } from '@
import { loginDataAPI } from '@/api/User'; import { loginDataAPI } from '@/api/User';
import { useUserStore } from '@/stores'; import { useUserStore } from '@/stores';
const LoginPage = () => { export default () => {
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
const [form] = useForm(); const [form] = useForm();
@@ -87,5 +87,3 @@ const LoginPage = () => {
</div> </div>
); );
}; };
export default LoginPage;

View File

@@ -6,7 +6,7 @@ import Title from '@/components/Title';
import type { ColumnsType } from 'antd/es/table'; import type { ColumnsType } from 'antd/es/table';
import { titleSty } from '@/styles/sty'; import { titleSty } from '@/styles/sty';
const StoragePage = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [btnLoading, setBtnLoading] = useState(false); const [btnLoading, setBtnLoading] = useState(false);
const [editLoading, setEditLoading] = useState(false) const [editLoading, setEditLoading] = useState(false)
@@ -187,7 +187,7 @@ const StoragePage = () => {
}; };
return ( return (
<> <div>
<Title value="存储管理"> <Title value="存储管理">
<Button type="primary" size='large' onClick={addOssData}></Button> <Button type="primary" size='large' onClick={addOssData}></Button>
</Title> </Title>
@@ -291,8 +291,6 @@ const StoragePage = () => {
</Form.Item> </Form.Item>
</Form> </Form>
</Modal > </Modal >
</> </div>
); );
}; };
export default StoragePage;

View File

@@ -14,7 +14,7 @@ export interface FilterForm {
createTime: Date[] createTime: Date[]
} }
const RecordPage = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [recordList, setRecordList] = useState<Record[]>([]); const [recordList, setRecordList] = useState<Record[]>([]);
@@ -135,7 +135,7 @@ const RecordPage = () => {
} }
return ( return (
<> <div>
<Title value="说说管理" /> <Title value="说说管理" />
<Card className='my-2 overflow-scroll'> <Card className='my-2 overflow-scroll'>
@@ -167,8 +167,6 @@ const RecordPage = () => {
}} }}
/> />
</Card> </Card>
</> </div>
); );
}; };
export default RecordPage;

View File

@@ -7,7 +7,7 @@ import Title from '@/components/Title';
import { ColumnsType } from 'antd/es/table'; import { ColumnsType } from 'antd/es/table';
import "./index.scss" import "./index.scss"
const RolePage = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [btnLoading, setBtnLoading] = useState(false) const [btnLoading, setBtnLoading] = useState(false)
const [editLoading, setEditLoading] = useState<boolean>(false); const [editLoading, setEditLoading] = useState<boolean>(false);
@@ -15,7 +15,6 @@ const RolePage = () => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const [id, setId] = useState(0)
const [role, setRole] = useState<Role>({} as Role); const [role, setRole] = useState<Role>({} as Role);
const [roleList, setRoleList] = useState<Role[]>([]); const [roleList, setRoleList] = useState<Role[]>([]);
const [routeList, setRouteList] = useState<{ key: number, title: string }[]>([]); const [routeList, setRouteList] = useState<{ key: number, title: string }[]>([]);
@@ -44,12 +43,6 @@ const RolePage = () => {
} }
]; ];
// 获取指定角色的路由列表
const getRoleRouteList = async (id: number) => {
const { data } = await getRoleRouteListAPI(id);
setTargetKeys(data.map(item => item.id) as number[])
};
// 获取路由列表 // 获取路由列表
const getRouteList = async () => { const getRouteList = async () => {
const { data } = await getRouteListAPI(); const { data } = await getRouteListAPI();
@@ -74,11 +67,19 @@ const RolePage = () => {
getRouteList() getRouteList()
}, []); }, []);
// 绑定路由 // 获取指定角色的路由列表
const bindingRoute = (record: Role) => { const bindingRoute = async (record: Role) => {
setIsModalOpen(true) setEditLoading(true)
getRoleRouteList(record.id)
setId(record.id) try {
setIsModalOpen(true)
const { data } = await getRoleRouteListAPI(record.id);
setTargetKeys(data.map(item => item.id) as number[])
} catch (error) {
setEditLoading(false)
}
setEditLoading(false)
} }
const editRoleData = async (record: Role) => { const editRoleData = async (record: Role) => {
@@ -140,7 +141,7 @@ const RolePage = () => {
setBindingLoading(true); setBindingLoading(true);
try { try {
await bindingRouteAPI(id, targetKeys) await bindingRouteAPI(role.id, targetKeys)
message.success('🎉 绑定成功'); message.success('🎉 绑定成功');
// 刷新页面 // 刷新页面
window.location.reload() window.location.reload()
@@ -153,7 +154,7 @@ const RolePage = () => {
const [n, setN] = useState(0) const [n, setN] = useState(0)
return ( return (
<> <div>
<Title value="角色管理" /> <Title value="角色管理" />
<div className='flex md:justify-between flex-col md:flex-row mx-auto mt-2 min-h-[calc(100vh-180px)]'> <div className='flex md:justify-between flex-col md:flex-row mx-auto mt-2 min-h-[calc(100vh-180px)]'>
@@ -216,8 +217,6 @@ const RolePage = () => {
<Button type='primary' className='w-full mt-2' loading={bindingLoading} onClick={onBindingRouteSubmit}></Button> <Button type='primary' className='w-full mt-2' loading={bindingLoading} onClick={onBindingRouteSubmit}></Button>
</Modal> </Modal>
</> </div>
); );
}; };
export default RolePage;

View File

@@ -5,7 +5,7 @@ import { Route } from '@/types/app/route';
import Title from '@/components/Title'; import Title from '@/components/Title';
import { ColumnsType } from 'antd/es/table'; import { ColumnsType } from 'antd/es/table';
const RoutePage = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [btnLoading, setBtnLoading] = useState(false) const [btnLoading, setBtnLoading] = useState(false)
@@ -102,7 +102,7 @@ const RoutePage = () => {
}; };
return ( return (
<> <div>
<Title value="路由管理" /> <Title value="路由管理" />
<div className='flex md:justify-between flex-col md:flex-row mx-auto mt-2 min-h-[calc(100vh-180px)]'> <div className='flex md:justify-between flex-col md:flex-row mx-auto mt-2 min-h-[calc(100vh-180px)]'>
@@ -143,8 +143,6 @@ const RoutePage = () => {
/> />
</Card> </Card>
</div> </div>
</> </div>
); );
}; };
export default RoutePage;

View File

@@ -35,7 +35,7 @@ export default () => {
}, []); }, []);
return ( return (
<> <div>
<Title value='订阅中心' /> <Title value='订阅中心' />
<Spin spinning={loading}> <Spin spinning={loading}>
@@ -70,6 +70,6 @@ export default () => {
/> />
</Card> </Card>
</Spin> </Spin>
</> </div>
); );
}; };

View File

@@ -11,7 +11,7 @@ interface UserForm {
info: string; info: string;
} }
const UserPage = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [form] = Form.useForm<UserForm>(); const [form] = Form.useForm<UserForm>();
@@ -95,11 +95,9 @@ const UserPage = () => {
</Form.Item> </Form.Item>
<Form.Item> <Form.Item>
<Button type="primary" htmlType="submit" className="w-full" loading={loading}></Button> <Button type="primary" htmlType="submit" loading={loading} className="w-full"></Button>
</Form.Item> </Form.Item>
</Form> </Form>
</div> </div>
); );
}; };
export default UserPage;

View File

@@ -1,4 +1,4 @@
import { Form, Input, Button, notification, Modal } from 'antd'; import { Form, Input, Button, Modal } from 'antd';
import { useUserStore } from '@/stores'; import { useUserStore } from '@/stores';
import { editAdminPassAPI } from '@/api/User'; import { editAdminPassAPI } from '@/api/User';
import { EditUser } from '@/types/app/user' import { EditUser } from '@/types/app/user'
@@ -6,7 +6,7 @@ import { useState } from 'react';
const { confirm } = Modal; const { confirm } = Modal;
const SystemPage = () => { export default () => {
const store = useUserStore(); const store = useUserStore();
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
@@ -97,5 +97,3 @@ const SystemPage = () => {
</div> </div>
); );
}; };
export default SystemPage;

View File

@@ -3,11 +3,11 @@ import { Segmented } from 'antd';
import SynthesisTheme from './components/SynthesisTheme'; import SynthesisTheme from './components/SynthesisTheme';
import RecordTheme from './components/RecordTheme'; import RecordTheme from './components/RecordTheme';
const ThemePage = () => { export default () => {
const [current, setCurrent] = useState<string>("综合配置"); const [current, setCurrent] = useState<string>("综合配置");
return ( return (
<> <div>
<Segmented<string> <Segmented<string>
size="large" size="large"
options={['综合配置', '说说配置']} options={['综合配置', '说说配置']}
@@ -22,8 +22,6 @@ const ThemePage = () => {
{current === "说说配置" && ( {current === "说说配置" && (
<RecordTheme /> <RecordTheme />
)} )}
</> </div>
); );
}; };
export default ThemePage;

View File

@@ -4,7 +4,7 @@ import { editConfigDataAPI } from '@/api/Project';
import { Web } from '@/types/app/project' import { Web } from '@/types/app/project'
import { useWebStore } from '@/stores'; import { useWebStore } from '@/stores';
const WebPage = () => { export default () => {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [form] = Form.useForm(); const [form] = Form.useForm();
@@ -102,5 +102,3 @@ const WebPage = () => {
</div> </div>
); );
}; };
export default WebPage;

View File

@@ -18,7 +18,7 @@ interface Setup {
key: string; key: string;
} }
const SetupPage = () => { export default () => {
const [active, setActive] = useState("system"); const [active, setActive] = useState("system");
const iconSty = "w-5 h-8 mr-1" const iconSty = "w-5 h-8 mr-1"
@@ -57,7 +57,7 @@ const SetupPage = () => {
]; ];
return ( return (
<> <div>
<Title value="项目配置" /> <Title value="项目配置" />
<Card className='mt-2 min-h-[calc(100vh-180px)]'> <Card className='mt-2 min-h-[calc(100vh-180px)]'>
@@ -87,8 +87,6 @@ const SetupPage = () => {
</div> </div>
</div> </div>
</Card> </Card>
</> </div>
); );
}; };
export default SetupPage;

View File

@@ -7,7 +7,7 @@ import { ColumnsType } from 'antd/es/table';
import { CloudUploadOutlined, PictureOutlined } from '@ant-design/icons'; import { CloudUploadOutlined, PictureOutlined } from '@ant-design/icons';
import FileUpload from '@/components/FileUpload'; import FileUpload from '@/components/FileUpload';
const SwiperPage = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [btnLoading, setBtnLoading] = useState(false) const [btnLoading, setBtnLoading] = useState(false)
const [editLoading, setEditLoading] = useState(false) const [editLoading, setEditLoading] = useState(false)
@@ -180,7 +180,7 @@ const SwiperPage = () => {
]; ];
return ( return (
<> <div>
<Title value="轮播图管理" /> <Title value="轮播图管理" />
<Card className="[&>.ant-card-body]:!pt-0 mt-2 min-h-[calc(100vh-180px)]"> <Card className="[&>.ant-card-body]:!pt-0 mt-2 min-h-[calc(100vh-180px)]">
@@ -193,8 +193,6 @@ const SwiperPage = () => {
onSuccess={(url: string[]) => form.setFieldValue("image", url.join("\n"))} onSuccess={(url: string[]) => form.setFieldValue("image", url.join("\n"))}
onCancel={() => setIsModalOpen(false)} onCancel={() => setIsModalOpen(false)}
/> />
</> </div>
); );
}; };
export default SwiperPage;

View File

@@ -5,7 +5,7 @@ import { Tag } from '@/types/app/tag';
import Title from '@/components/Title'; import Title from '@/components/Title';
import { ColumnsType } from 'antd/es/table'; import { ColumnsType } from 'antd/es/table';
const TagPage = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [btnLoading, setBtnLoading] = useState(false) const [btnLoading, setBtnLoading] = useState(false)
@@ -139,5 +139,3 @@ const TagPage = () => {
</div> </div>
); );
}; };
export default TagPage;

View File

@@ -14,7 +14,7 @@ import Title from '@/components/Title';
import logo from '@/images/logo/logo.png'; import logo from '@/images/logo/logo.png';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
const UserPage = () => { export default () => {
const [loading, setLoading] = useState<boolean>(false); const [loading, setLoading] = useState<boolean>(false);
const [btnLoading, setBtnLoading] = useState(false) const [btnLoading, setBtnLoading] = useState(false)
const [editLoading, setEditLoading] = useState(false) const [editLoading, setEditLoading] = useState(false)
@@ -211,7 +211,7 @@ const UserPage = () => {
} }
return ( return (
<> <div>
<Title value="用户管理"> <Title value="用户管理">
<Button type="primary" size='large' onClick={() => setDrawerVisible(true)}></Button> <Button type="primary" size='large' onClick={() => setDrawerVisible(true)}></Button>
</Title> </Title>
@@ -318,8 +318,6 @@ const UserPage = () => {
</Form.Item> </Form.Item>
</Form> </Form>
</Drawer> </Drawer>
</> </div>
); );
}; };
export default UserPage;

View File

@@ -7,7 +7,7 @@ import Title from '@/components/Title';
import type { Cate, Wall, FilterForm, FilterWall } from '@/types/app/wall'; import type { Cate, Wall, FilterForm, FilterWall } from '@/types/app/wall';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
const WallPage = () => { export default () => {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [wall, setWall] = useState<Wall>({} as Wall); const [wall, setWall] = useState<Wall>({} as Wall);
@@ -138,7 +138,7 @@ const WallPage = () => {
} }
return ( return (
<> <div>
<Title value='留言管理' /> <Title value='留言管理' />
<Card className='my-2 overflow-scroll'> <Card className='my-2 overflow-scroll'>
@@ -188,8 +188,6 @@ const WallPage = () => {
<div><b></b> {wall?.content}</div> <div><b></b> {wall?.content}</div>
</div> </div>
</Modal> </Modal>
</> </div>
); );
}; };
export default WallPage;

View File

@@ -238,12 +238,12 @@ export default () => {
]; ];
return ( return (
<> <div>
<Title value="网站管理" /> <Title value="网站管理" />
<Card className="WebPage mt-2 min-h-[calc(100vh-180px)]"> <Card className="WebPage mt-2 min-h-[calc(100vh-180px)]">
<Tabs activeKey={tab} tabPosition="top" onChange={handleTabChange} items={tabItems} /> <Tabs activeKey={tab} tabPosition="top" onChange={handleTabChange} items={tabItems} />
</Card> </Card>
</> </div>
); );
}; };

View File

@@ -59,7 +59,7 @@ export default () => {
}; };
return ( return (
<> <div>
<Title value="工作台" /> <Title value="工作台" />
<Card className="mt-2 min-h-[calc(100vh-180px)]"> <Card className="mt-2 min-h-[calc(100vh-180px)]">
@@ -89,6 +89,6 @@ export default () => {
</div> </div>
</Card> </Card>
</> </div>
); );
} }