From 09cbd721a0ba5d92d78b0dd77a743a8e447f3111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E5=BC=BA?= <357099073@qq.com> Date: Mon, 5 Jan 2026 17:38:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0cms=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc/src/api/article.js | 54 ++ pc/src/components/CommonAside.vue | 62 +- pc/src/components/MenuTreeItem.vue | 1 + pc/src/router/dynamicRoutes.js | 2 +- pc/src/stores/menu.js | 10 +- .../apps/cms/articles/components/edit.vue | 220 +++++ .../apps/cms/articles/components/preview.vue | 234 +++++ pc/src/views/apps/cms/articles/index.vue | 466 ++++++++++ pc/src/views/apps/cms/index.vue | 8 + pc/src/views/apps/cms/workbench/index.vue | 278 ++++++ pc/src/views/apps/knowledge/index.vue | 862 +----------------- .../views/apps/knowledge/workbench/index.vue | 861 +++++++++++++++++ pc/src/views/dashboard/index.vue | 161 +++- pc/src/views/system/menus/manager.vue | 73 +- pc/src/views/system/permissions/index.vue | 11 +- server/controllers/articles.go | 451 +++++++++ server/controllers/auth.go | 1 + server/controllers/user.go | 4 + server/migrate_add_uid.sql | 79 ++ server/models/articles.go | 32 + server/models/user.go | 2 + server/routers/router.go | 5 + server/services/articles.go | 217 +++++ server/services/user.go | 19 +- 24 files changed, 3158 insertions(+), 955 deletions(-) create mode 100644 pc/src/api/article.js create mode 100644 pc/src/views/apps/cms/articles/components/edit.vue create mode 100644 pc/src/views/apps/cms/articles/components/preview.vue create mode 100644 pc/src/views/apps/cms/articles/index.vue create mode 100644 pc/src/views/apps/cms/index.vue create mode 100644 pc/src/views/apps/cms/workbench/index.vue create mode 100644 pc/src/views/apps/knowledge/workbench/index.vue create mode 100644 server/controllers/articles.go create mode 100644 server/migrate_add_uid.sql create mode 100644 server/models/articles.go create mode 100644 server/services/articles.go 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 @@