diff --git a/src/App.tsx b/src/App.tsx index 49fa8ba..da9614c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,6 +5,7 @@ import Loader from './common/Loader'; import PageTitle from './components/PageTitle'; import ECommerce from './pages/Dashboard/ECommerce'; import Create from './pages/Create'; +import Cate from './pages/Cate'; import DefaultLayout from './layout/DefaultLayout'; import { ConfigProvider } from 'antd'; @@ -53,6 +54,16 @@ function App() { } /> + + + + + + } + /> diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx index 773c634..d8a026f 100644 --- a/src/components/Sidebar/index.tsx +++ b/src/components/Sidebar/index.tsx @@ -122,6 +122,18 @@ const Sidebar = ({ sidebarOpen, setSidebarOpen }: SidebarProps) => { +
  • + + + 分类 + +
  • + { + const [loading, setLoading] = useState(false); + const [model, setModel] = useState(false); + const [cate, setCate] = useState({ name: '', mark: '', url: '', icon: '', level: 0 }); + const [list, setList] = useState([]); + const formRef = useRef(null); + + useEffect(() => { + getCateList(); + }, []); + + const getCateList = async () => { + setLoading(true); + const { data } = await getCateListAPI(); + setList(data as Cate[]); + setLoading(false); + }; + + const addCateData = (id: number) => { + setModel(true); + setCate({ ...cate, level: id }); + }; + + const editCateData = async (id: number) => { + setLoading(true); + setModel(true); + const { data } = await getCateDataAPI(id); + setCate(data); + setLoading(false); + }; + + const submit = async () => { + formRef.current + .validateFields() + .then(async (values: any) => { + if (cate.id) { + await editCateDataAPI({ ...cate, ...values }); + notification.success({ message: '🎉 修改分类成功' }); + } else { + await addCateDataAPI({ ...cate, ...values }); + notification.success({ message: '🎉 新增分类成功' }); + } + formRef.current.resetFields(); + setCate({ name: '', mark: '', url: '', icon: '', level: 0 }); + setModel(false); + getCateList(); + }) + .catch((errorInfo: any) => { + console.error('Validate Failed:', errorInfo); + }); + }; + + const delCateData = (id: number) => { + // whetherToDelete(async () => { + // await delCateDataAPI(id); + // notification.success({ message: '🎉 删除分类成功' }); + // getCateList(); + // }, '分类'); + }; + + const close = () => { + setModel(false); + formRef.current.resetFields(); + }; + + const renderTreeNodes = (data: Cate[]) => + data.map(item => ( + + {item.children ? renderTreeNodes(item.children) : null} + + )); + + const menu = (data: Cate) => ( + + addCateData(data.id!)}>新增 + editCateData(data.id!)}>编辑 + delCateData(data.id!)}>删除 + + ); + + return ( + } className='border-stroke dark:border-strokedark [&>.ant-card-head]:border-stroke [&>.ant-card-head]:dark:border-strokedark dark:bg-boxdark [&>.ant-card-body]:pt-2'> +
    + +
    + + + {renderTreeNodes(list)} + + + +
    + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + ); +}; + +export default CateManager; diff --git a/src/pages/Create/index.tsx b/src/pages/Create/index.tsx index 74dfa5d..4094d37 100644 --- a/src/pages/Create/index.tsx +++ b/src/pages/Create/index.tsx @@ -6,6 +6,8 @@ import VditorEditor from './components/VditorMD'; import PublishForm from './components/PublishForm'; import { useEffect, useState } from 'react'; +import { addCateDataAPI, delCateDataAPI, editCateDataAPI, getCateDataAPI, getCateListAPI } from '@/api/Cate' + const Create = () => { const [content, setContent] = useState(''); const [publishOpen, setPublishOpen] = useState(false) @@ -17,6 +19,9 @@ const Create = () => { useEffect(() => { console.log(content); + getCateListAPI().then(async res => { + console.log(await res); + }) }, [content]) return ( diff --git a/src/types/Article.d.ts b/src/types/Article.d.ts index ecd5ba7..f47995a 100644 --- a/src/types/Article.d.ts +++ b/src/types/Article.d.ts @@ -1,4 +1,4 @@ -interface Article { +export interface Article { id?: number, title: string, description: string, diff --git a/src/types/Comment.d.ts b/src/types/Comment.d.ts index 3e0fe05..2ebb21d 100644 --- a/src/types/Comment.d.ts +++ b/src/types/Comment.d.ts @@ -1,4 +1,4 @@ -interface Comment { +export interface Comment { aid: number, avatar: string, content: string, @@ -11,7 +11,7 @@ interface Comment { audit: number } -interface Info { +export interface Info { tab: string, loading: boolean, list: Comment[], diff --git a/src/types/File.d.ts b/src/types/File.d.ts index f2ec2ab..364e4b6 100644 --- a/src/types/File.d.ts +++ b/src/types/File.d.ts @@ -1,4 +1,4 @@ -interface File { +export interface File { children: Child[]; list: string[]; name: string; diff --git a/src/types/Link.d.ts b/src/types/Link.d.ts index 9366413..f4f24f4 100644 --- a/src/types/Link.d.ts +++ b/src/types/Link.d.ts @@ -1,4 +1,4 @@ -interface Link { +export interface Link { id?: number; title: string; description: string; diff --git a/src/types/Swiper.d.ts b/src/types/Swiper.d.ts index 7558364..bc50788 100644 --- a/src/types/Swiper.d.ts +++ b/src/types/Swiper.d.ts @@ -1,4 +1,4 @@ -interface Swiper { +export interface Swiper { id?: number, title: string, description: string, diff --git a/src/types/System.d.ts b/src/types/System.d.ts index 6061517..89dc724 100644 --- a/src/types/System.d.ts +++ b/src/types/System.d.ts @@ -1,5 +1,5 @@ // 磁盘 -interface Disk { +export interface Disk { diskFree: number; diskPercent: number; diskTotal: number; @@ -7,7 +7,7 @@ interface Disk { } // 内存 -interface Memory { +export interface Memory { memoryAvailable: number; memoryPercent: number; memoryTotal: number; @@ -15,7 +15,7 @@ interface Memory { } // 系统信息 -interface System { +export interface System { boot_time: string; cpu: number; disk: Disk; @@ -26,7 +26,7 @@ interface System { } // 网站信息 -interface Web { +export interface Web { url: string, title: string, subhead: string, @@ -41,11 +41,11 @@ interface Web { covers: string[] } -type ArticleLayout = "classics" | "card" | "waterfall" | "" -type RightSidebar = "author" | "hotArticle" | "randomArticle" | "newComments" +export type ArticleLayout = "classics" | "card" | "waterfall" | "" +export type RightSidebar = "author" | "hotArticle" | "randomArticle" | "newComments" // 布局配置 -interface Layout { +export interface Layout { isArticleLayout: ArticleLayout, rightSidebar: RightSidebar[], swiperImage: string, diff --git a/src/types/Tag.d.ts b/src/types/Tag.d.ts index 22ee303..ba13900 100644 --- a/src/types/Tag.d.ts +++ b/src/types/Tag.d.ts @@ -1,4 +1,4 @@ -interface Tag { +export interface Tag { id?: number, name: string } diff --git a/src/types/brand.ts b/src/types/brand.d.ts similarity index 100% rename from src/types/brand.ts rename to src/types/brand.d.ts diff --git a/src/types/Cate..d.ts b/src/types/cate.d.ts similarity index 86% rename from src/types/Cate..d.ts rename to src/types/cate.d.ts index aa5075b..4553086 100644 --- a/src/types/Cate..d.ts +++ b/src/types/cate.d.ts @@ -1,4 +1,4 @@ -interface Cate { +export interface Cate { id?: number, name: string, mark: string, diff --git a/src/types/chat.ts b/src/types/chat.d.ts similarity index 100% rename from src/types/chat.ts rename to src/types/chat.d.ts diff --git a/src/types/package.ts b/src/types/package.d.ts similarity index 100% rename from src/types/package.ts rename to src/types/package.d.ts diff --git a/src/types/product.ts b/src/types/product.d.ts similarity index 100% rename from src/types/product.ts rename to src/types/product.d.ts diff --git a/src/types/user.d.ts b/src/types/user.d.ts index 0e624bf..555ffb6 100644 --- a/src/types/user.d.ts +++ b/src/types/user.d.ts @@ -1,9 +1,9 @@ -interface Login { +export interface Login { username: string, password: string } -interface UserInfo { +export interface UserInfo { id?: number, name: string, email: string, @@ -12,14 +12,14 @@ interface UserInfo { role?: string } -type User = Login & UserInfo +export type User = Login & UserInfo -interface account { +export interface account { token: string, user: User } -interface editUser { +export interface editUser { username: string, oldPassword: string, newPassword: string diff --git a/src/utils/authHelper.ts b/src/utils/authHelper.ts new file mode 100644 index 0000000..00b8299 --- /dev/null +++ b/src/utils/authHelper.ts @@ -0,0 +1,9 @@ +import { useUserStore } from "@/stores"; + +export const getToken = () => { + return useUserStore.getState().token; +}; + +export const quitLogin = () => { + return useUserStore.getState().quitLogin; +}; \ No newline at end of file diff --git a/src/utils/request.ts b/src/utils/request.ts index c7a88bb..d8a919c 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -1,9 +1,10 @@ import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from "axios"; -import { useUserStore } from "@/stores"; import { Modal, notification } from "antd"; +import { useUserStore } from "@/stores"; // 配置项目API域名 -export const baseURL = "http://localhost:5000/api"; +export const baseURL = "http://localhost:9999/api"; +// export const baseURL = "http://82.157.186.125:5000/api"; // 创建 axios 实例 export const instance = axios.create({ @@ -13,10 +14,12 @@ export const instance = axios.create({ timeout: 5000, }); +const store = useUserStore.getState() + // 请求拦截 instance.interceptors.request.use( (config: InternalAxiosRequestConfig) => { - const token = useUserStore((state) => state.token) + const token = store.token // 如果有token就把赋值给请求头 if (token) config.headers["Authorization"] = `Bearer ${token}`; @@ -38,14 +41,12 @@ instance.interceptors.response.use( (res: AxiosResponse) => { // 如果code为401就证明认证失败 if (res.data.code === 401) { - const quitLogin = useUserStore((state) => state.quitLogin) - return Modal.error({ title: '暂无权限', content: '🔒️ 登录已过期,是否重新登录?', okText: "去登录", onOk: () => { - quitLogin(); + store.quitLogin() } }); }