Merge remote-tracking branch 'origin/main'
# Conflicts: # .data/content/contents.sqlite # .output/nitro.json # .output/public/__nuxt_content/docs/sql_dump.txt # .output/server/chunks/build/client.precomputed.mjs # .output/server/chunks/build/database.compressed.mjs # .output/server/chunks/build/server.mjs # .output/server/chunks/build/server.mjs.map # .output/server/chunks/build/styles.mjs # .output/server/chunks/nitro/nitro.mjs # .output/server/package.json # app/config/setting.ts # ecosystem.config.cjs
This commit is contained in:
@@ -21,7 +21,7 @@ export async function getTenantInfo(): Promise<Company> {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取网站信息 https://websopy-api.websoft.top/api
|
||||
* 获取网站信息 https://cms-api.websoft.top/api
|
||||
*/
|
||||
export async function getSiteInfo() {
|
||||
const res = await request.get<ApiResult<AppProduct>>(
|
||||
|
||||
@@ -134,7 +134,7 @@ export async function checkExistence(
|
||||
*/
|
||||
export async function configWebsiteField(params?: WebsiteFieldParam) {
|
||||
const res = await request.get<ApiResult<Config>>(
|
||||
'https://websopy-api.websoft.top/api/cms/cmsWebsite-field/config',
|
||||
'https://cms-api.websoft.top/api/cms/cmsWebsite-field/config',
|
||||
{
|
||||
params,
|
||||
headers: {
|
||||
|
||||
@@ -115,6 +115,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { mainNav } from '@/config/nav'
|
||||
import { useMenu } from '@/composables/useMenu'
|
||||
import { getUserInfo } from '@/api/layout'
|
||||
import type { User } from '@/api/system/user/model'
|
||||
import { getToken, removeToken } from '@/utils/token-util'
|
||||
@@ -122,7 +123,8 @@ import { clearAuthz, setAuthzFromUser } from '@/utils/permission'
|
||||
import { UserOutlined, ProfileOutlined, MessageOutlined } from '@ant-design/icons-vue'
|
||||
|
||||
|
||||
const nav = computed(() => mainNav)
|
||||
const menu = useMenu()
|
||||
const nav = computed(() => menu.value.length ? menu.value : mainNav)
|
||||
const route = useRoute()
|
||||
const open = ref(false)
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
import type { NavItem } from '@/config/nav'
|
||||
import type { CmsNavigation } from '@/api/cms/cmsNavigation/model'
|
||||
|
||||
/**
|
||||
* 获取菜单状态 (响应式)
|
||||
* 与模板项目的 useMenu() 对齐,使用 useState 跨组件共享
|
||||
*/
|
||||
export const useMenu = () => {
|
||||
return useState<NavItem[]>('menu', () => [])
|
||||
}
|
||||
|
||||
/**
|
||||
* 将 CmsNavigation 树映射为 NavItem 树
|
||||
*/
|
||||
export function mapNavItem(tree: CmsNavigation[]): NavItem[] {
|
||||
return (tree || [])
|
||||
.filter(item => !item.hide) // 过滤隐藏项
|
||||
.sort((a, b) => (a.sortNumber ?? 0) - (b.sortNumber ?? 0))
|
||||
.map(item => ({
|
||||
key: item.code || String(item.navigationId),
|
||||
label: item.title || '',
|
||||
to: item.path || '/',
|
||||
href: item.target === '_blank' ? item.path : undefined,
|
||||
badge: undefined, // 后端暂无 badge 字段,按需扩展
|
||||
children: item.children?.length ? mapNavItem(item.children) : undefined,
|
||||
}))
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import { getSiteInfo } from '@/api/cms/cmsWebsite'
|
||||
import { useMenu, mapNavItem } from '@/composables/useMenu'
|
||||
import type { CmsNavigation } from '@/api/cms/cmsNavigation/model'
|
||||
|
||||
/**
|
||||
* 应用启动时获取站点信息(含导航菜单),写入 useMenu() 状态
|
||||
*/
|
||||
export default defineNuxtPlugin(async () => {
|
||||
const menu = useMenu()
|
||||
|
||||
// 如果已有数据,跳过
|
||||
if (menu.value.length) return
|
||||
|
||||
try {
|
||||
const data = await getSiteInfo()
|
||||
// getSiteInfo 返回 CmsWebsite,其中 topNavs 是 CmsNavigation[]
|
||||
const topNavs = (data as any)?.topNavs as CmsNavigation[] | undefined
|
||||
if (topNavs?.length) {
|
||||
menu.value = mapNavItem(topNavs)
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn('[fetch-menu] 获取导航菜单失败', e)
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user