diff --git a/src/api/account/quick.ts b/src/api/account/quick.ts new file mode 100644 index 0000000..76fb99c --- /dev/null +++ b/src/api/account/quick.ts @@ -0,0 +1,68 @@ +import request from "@/utils/request"; +import { Account_BaseUrl } from "@/api/config"; +const baseURL = Account_BaseUrl + "/admin/quick"; +const API = { + getList(data: any) { + return request({ + url: `${baseURL}`, + method: "get", + params: data + }); + }, + add(data: any) { + return request({ + url: `${baseURL}`, + method: "post", + data: data, + }); + }, + delete(ids: [string | number]) { + return request({ + url: `${baseURL}`, + method: "delete", + data: ids, + }); + }, + edit(data: any) { + return request({ + url: `${baseURL}`, + method: "put", + data: data, + }); + }, +} +export default API; + + + +/** + * 悬浮窗配置 实体类。 + * + * QuickMenu + */ +export interface QuickMenu { + createTime?: string; + id?: number; + /** + * 菜单Id + */ + menuId: number; + /** + * 店铺Id + */ + shopId?: number; + /** + * 排序 + */ + sort?: number; + /** + * 状态 1-启用 0-禁用 + */ + status?: number; + updateTime?: string; + /** + * 菜单图标 + */ + url?: string; + [property: string]: any; +} diff --git a/src/assets/images/close.png b/src/assets/images/close.png new file mode 100644 index 0000000..70a30a6 Binary files /dev/null and b/src/assets/images/close.png differ diff --git a/src/assets/images/plus.png b/src/assets/images/plus.png new file mode 100644 index 0000000..6fae75f Binary files /dev/null and b/src/assets/images/plus.png differ diff --git a/src/components/FastMenuConfig/dialog-add.vue b/src/components/FastMenuConfig/dialog-add.vue new file mode 100644 index 0000000..1e71b00 --- /dev/null +++ b/src/components/FastMenuConfig/dialog-add.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/src/components/FastMenuConfig/index.vue b/src/components/FastMenuConfig/index.vue new file mode 100644 index 0000000..dbec7fa --- /dev/null +++ b/src/components/FastMenuConfig/index.vue @@ -0,0 +1,183 @@ + + + + diff --git a/src/layout/components/FastMenu/index.vue b/src/layout/components/FastMenu/index.vue new file mode 100644 index 0000000..992a7a0 --- /dev/null +++ b/src/layout/components/FastMenu/index.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/layout/index.vue b/src/layout/index.vue index b75e210..51d4a0a 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -27,10 +27,11 @@ + - + @@ -42,11 +43,15 @@ + - + + + + @@ -105,6 +110,7 @@ function handleOutsideClick() { function toggleSidebar() { appStore.toggleSidebar(); } +function showFastMenu() {} const route = useRoute(); watch(route, () => { diff --git a/src/store/index.ts b/src/store/index.ts index a36e43d..a2020d9 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -14,5 +14,6 @@ export * from "./modules/settings"; export * from "./modules/tags-view"; export * from "./modules/user"; export * from "./modules/dict"; +export * from "./modules/quick"; export { store }; diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index b90fc9f..3f22d9a 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -16,6 +16,7 @@ export const usePermissionStore = defineStore("permission", () => { // 路由是否加载完成 const isRoutesLoaded = ref(false); + const menus = ref([]) /** @@ -31,10 +32,9 @@ export const usePermissionStore = defineStore("permission", () => { } MenuAPI.getRoutes() .then((data) => { + menus.value = data if (!isTest) { const dynamicRoutes = parseDynamicRoutes(data.filter(v => v.type == 0)); - console.log('dynamicRoutes') - console.log(dynamicRoutes) dynamicRoutes.forEach((route) => { //过滤出可见子节点 let onlyOneChild = null @@ -95,8 +95,60 @@ export const usePermissionStore = defineStore("permission", () => { }); isRoutesLoaded.value = false; }; + function getMenuMap() { + // 初始化Map + const map = new Map(); + + // 定义递归函数处理菜单节点 + function processMenuNode(menuNode) { + // 将当前节点存入Map + map.set(menuNode.menuId, menuNode); + + // 如果有子节点且子节点数组不为空,则递归处理每个子节点 + if (menuNode.children && Array.isArray(menuNode.children) && menuNode.children.length > 0) { + menuNode.children.forEach((childNode) => { + processMenuNode(childNode); + }); + } + } + + // 遍历根级菜单,逐个处理 + if (menus.value && Array.isArray(menus.value)) { + menus.value.forEach((rootMenu) => { + processMenuNode(rootMenu); + }); + } + + return map; + } + + function returnMenuName(menuId: number | string) { + const menu = menusIdMap.value.get(`${menuId}`); + return menu ? menu.title : ''; + } + const menusIdMap = computed(() => { + const map = getMenuMap(); + return map; + }); + + function menuJump(menuId: number | string) { + const menu = menusIdMap.value.get(`${menuId}`); + console.log('menu', menu); + if (menu) { + if (menu.name) { + router.push({ name: menu.name as string }) + + } else { + router.push({ path: menu.path as string }) + + } + } + } return { + menuJump, + returnMenuName, + menus, routes, mixedLayoutLeftRoutes, isRoutesLoaded, diff --git a/src/store/modules/quick.ts b/src/store/modules/quick.ts new file mode 100644 index 0000000..e08f465 --- /dev/null +++ b/src/store/modules/quick.ts @@ -0,0 +1,37 @@ + +import { store } from "@/store"; +import quickApi, { type QuickMenu } from "@/api/account/quick"; +import { usePermissionStoreHook } from "@/store/modules/permission"; + + +export const useQuickStore = defineStore("quick", () => { + const quickMenus = ref([]); + + async function getQuickMenus() { + const res = await quickApi.getList({ isEdit: 0 }); + const obj: any = {} + let arr = [] + for (let menu of res) { + if (obj.hasOwnProperty(menu.menuId) || menu.status != 1 || !usePermissionStoreHook().returnMenuName(menu.menuId)) { + continue; + } else { + obj[menu.menuId] = true; + arr.push(menu) + } + } + quickMenus.value = arr; + } + getQuickMenus() + return { + quickMenus, getQuickMenus + }; +}); + +/** + * 用于在组件外部(如在Pinia Store 中)使用 Pinia 提供的 store 实例。 + * 官方文档解释了如何在组件外部使用 Pinia Store: + * https://pinia.vuejs.org/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component + */ +export function useQuickStoreHook() { + return useQuickStore(store); +} diff --git a/src/views/admin/system/commonlyUsedMenu/index.vue b/src/views/admin/system/commonlyUsedMenu/index.vue new file mode 100644 index 0000000..63a05ba --- /dev/null +++ b/src/views/admin/system/commonlyUsedMenu/index.vue @@ -0,0 +1,5 @@ + diff --git a/src/views/shop/commonlyUsedMenu/index.vue b/src/views/shop/commonlyUsedMenu/index.vue new file mode 100644 index 0000000..63a05ba --- /dev/null +++ b/src/views/shop/commonlyUsedMenu/index.vue @@ -0,0 +1,5 @@ + diff --git a/src/views/tool/Instead/components/carts/list.vue b/src/views/tool/Instead/components/carts/list.vue index 84fdc76..2a61a85 100644 --- a/src/views/tool/Instead/components/carts/list.vue +++ b/src/views/tool/Instead/components/carts/list.vue @@ -4,22 +4,38 @@
以下是优惠菜品
- +
@@ -50,9 +74,14 @@
- + @@ -131,7 +187,7 @@ import { useUserStore } from "@/store/modules/user"; function isEmptyObject(obj) { // 步骤1:排除null和非对象类型 - if (obj === null || typeof obj !== 'object') { + if (obj === null || typeof obj !== "object") { return false; } // 步骤2:排除数组(数组也是对象,需单独判断) @@ -313,4 +369,4 @@ defineExpose({ margin-left: 10px; } } - \ No newline at end of file +