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:
2026-09-11 12:26:45 +08:00
143 changed files with 81 additions and 12166 deletions
+1 -1
View File
@@ -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>>(
+1 -1
View File
@@ -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: {
+3 -1
View File
@@ -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)
+27
View File
@@ -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,
}))
}
+24
View File
@@ -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)
}
})