diff --git a/pc/src/api/article.js b/pc/src/api/article.js new file mode 100644 index 0000000..8b59e65 --- /dev/null +++ b/pc/src/api/article.js @@ -0,0 +1,54 @@ +// 文章管理相关API +import request from "@/utils/request"; + +// 获取文章列表 +export function listArticles(params) { + return request({ + url: `/api/articles`, + method: "get", + params, + }); +} + +// 获取文章详情 +export function getArticle(id) { + return request({ + url: `/api/articles/${id}`, + method: "get", + }); +} + +// 创建文章 +export function createArticle(data) { + return request({ + url: `/api/articles`, + method: "post", + data, + }); +} + +// 更新文章 +export function updateArticle(id, data) { + return request({ + url: `/api/articles/${id}`, + method: "put", + data, + }); +} + +// 删除文章 +export function deleteArticle(id) { + return request({ + url: `/api/articles/${id}`, + method: "delete", + }); +} + +// 更新文章状态 +export function updateArticleStatus(id, status) { + return request({ + url: `/api/articles/${id}/status`, + method: "patch", + data: { status }, + }); +} diff --git a/pc/src/components/CommonAside.vue b/pc/src/components/CommonAside.vue index 131fff6..9ffa0e0 100644 --- a/pc/src/components/CommonAside.vue +++ b/pc/src/components/CommonAside.vue @@ -13,6 +13,7 @@ :active-text-color="activeColor" :active-background-color="activeBgColor" class="el-menu-vertical-demo" + :unique-opened="true" @select="handleMenuSelect" :default-active="route.path" > @@ -47,7 +48,7 @@ const loading = computed(() => menuStore.loading); const store = useAllDataStore(); const isCollapse = computed(() => store.state.isCollapse); -const width = computed(() => (store.state.isCollapse ? "64px" : "180px")); +const width = computed(() => (store.state.isCollapse ? "64px" : "200px")); // 使用 Element Plus 的颜色变量,主题切换时会自动适配 // 这些值会被 el-menu 组件使用,el-menu 会自动适配主题 // 计算是否为暗色主题(响应式) @@ -155,12 +156,13 @@ const transformMenuData = (menus) => { }); }; - // 首先映射字段格式,只保留页面菜单(menu_type=1),并过滤掉功能页面和需要隐藏的子菜单 + // 首先映射字段格式,只保留目录(menu_type=1)和页面(menu_type=2),并过滤掉功能页面和需要隐藏的子菜单 + // 按钮类型(menu_type=3)用于权限控制,不在菜单中显示 const allMenus = menus .filter((menu) => { - // 只显示页面菜单,不显示API权限菜单 - if (menu.menuType !== 1 && menu.menuType !== undefined) { - // console.log('过滤掉非页面菜单:', menu); + // 显示目录和页面,不显示按钮 + if (menu.menuType !== 1 && menu.menuType !== 2 && menu.menuType !== undefined) { + // console.log('过滤掉非目录和非页面:', menu); return false; } // 过滤掉功能页面(详情、新增、编辑、删除等) @@ -188,7 +190,7 @@ const transformMenuData = (menus) => { // console.log('过滤后的菜单数据:', allMenus); - // 构建菜单映射表(只包含有效的页面菜单) + // 构建菜单映射表(只包含有效的目录和页面) const menuMap = new Map(); allMenus.forEach((menu) => { menuMap.set(menu.id, menu); @@ -202,7 +204,7 @@ const transformMenuData = (menus) => { // 顶级菜单直接加入 rootMenus.push(menu); } else { - // 检查父菜单是否存在(必须是有效的页面菜单) + // 检查父菜单是否存在(必须是有效的目录) const parent = menuMap.get(menu.parentId); if (parent) { // 父菜单存在,添加到父菜单的children中 @@ -285,30 +287,34 @@ const handleMenuRefresh = () => { fetchMenus(); }; -// 组件挂载时初始化主题监听和获取菜单 -onMounted(() => { - // 初始化主题监听 - themeObserver = new MutationObserver(() => { + // 组件挂载时初始化主题监听和获取菜单 + onMounted(() => { + // 初始化主题监听 + themeObserver = new MutationObserver(() => { + updateTheme(); + }); + + themeObserver.observe(document.documentElement, { + attributes: true, + attributeFilter: ["class"], + }); + + // 初始化时检查一次主题 updateTheme(); + + // 检查菜单是否已加载,如果未加载则获取菜单 + // 这样可以避免在路由初始化后重复请求 + if (!menuStore.menus || menuStore.menus.length === 0) { + // 延迟一点获取菜单,确保主题已初始化 + setTimeout(() => { + fetchMenus(); + }, 100); + } + + // 监听菜单缓存刷新事件 + window.addEventListener("menu-cache-refreshed", handleMenuRefresh); }); - themeObserver.observe(document.documentElement, { - attributes: true, - attributeFilter: ["class"], - }); - - // 初始化时检查一次主题 - updateTheme(); - - // 延迟一点获取菜单,确保主题已初始化 - setTimeout(() => { - fetchMenus(); - }, 100); - - // 监听菜单缓存刷新事件 - window.addEventListener("menu-cache-refreshed", handleMenuRefresh); -}); - // 组件卸载时清理事件监听 onUnmounted(() => { if (themeObserver) { diff --git a/pc/src/components/MenuTreeItem.vue b/pc/src/components/MenuTreeItem.vue index 65f7a72..735ee9d 100644 --- a/pc/src/components/MenuTreeItem.vue +++ b/pc/src/components/MenuTreeItem.vue @@ -11,6 +11,7 @@