mirror of
https://github.com/continew-org/continew-admin-ui.git
synced 2025-11-03 02:57:09 +08:00
feat(menu): 路由菜单组件路径新增下拉选择
This commit is contained in:
36
src/hooks/modules/useComponentPaths.ts
Normal file
36
src/hooks/modules/useComponentPaths.ts
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import { onMounted, ref } from 'vue'
|
||||||
|
import { Message } from '@arco-design/web-vue'
|
||||||
|
|
||||||
|
interface ComponentOption {
|
||||||
|
label: string
|
||||||
|
value: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useComponentPaths = () => {
|
||||||
|
const componentOptions = ref<ComponentOption[]>([])
|
||||||
|
|
||||||
|
const loadComponentPaths = async () => {
|
||||||
|
try {
|
||||||
|
const modules = import.meta.glob('@/views/**/index.vue')
|
||||||
|
const paths = Object.keys(modules)
|
||||||
|
componentOptions.value = paths.map((path) => {
|
||||||
|
// 格式转化
|
||||||
|
path = path.replace('/src/views/', '')
|
||||||
|
const label = `@view/${path}`
|
||||||
|
const value = path.split('.vue')[0]
|
||||||
|
return { label, value }
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
Message.error('加载组件路径失败')
|
||||||
|
console.error('加载组件路径失败:', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
await loadComponentPaths()
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
componentOptions,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -51,10 +51,11 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item v-if="form.type === 2" label="组件路径" field="component">
|
<a-form-item v-if="form.type === 2" label="组件路径" field="component">
|
||||||
<a-input v-if="form.isExternal" v-model.trim="form.component" placeholder="请输入组件路径" allow-clear />
|
<a-input v-if="form.isExternal" v-model.trim="form.component" placeholder="请输入组件路径" allow-clear />
|
||||||
<a-input v-else v-model.trim="form.component" placeholder="请输入组件路径" allow-clear>
|
<a-select v-else v-model="form.component" placeholder="请选择组件路径" allow-clear allow-create :options="componentOptions">
|
||||||
<template #prepend>@/views/</template>
|
<template #label="{ data }">
|
||||||
<template #append>.vue</template>
|
{{ data?.value }}
|
||||||
</a-input>
|
</template>
|
||||||
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item v-if="form.type === 3" label="权限标识" field="permission">
|
<a-form-item v-if="form.type === 3" label="权限标识" field="permission">
|
||||||
<a-input v-model.trim="form.permission" placeholder="system:user:add" allow-clear />
|
<a-input v-model.trim="form.permission" placeholder="system:user:add" allow-clear />
|
||||||
@@ -121,6 +122,7 @@ import { mapTree } from 'xe-utils'
|
|||||||
import { type MenuResp, addMenu, getMenu, updateMenu } from '@/apis/system/menu'
|
import { type MenuResp, addMenu, getMenu, updateMenu } from '@/apis/system/menu'
|
||||||
import { useResetReactive } from '@/hooks'
|
import { useResetReactive } from '@/hooks'
|
||||||
import { filterTree, transformPathToName } from '@/utils'
|
import { filterTree, transformPathToName } from '@/utils'
|
||||||
|
import { useComponentPaths } from '@/hooks/modules/useComponentPaths'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
menus: MenuResp[]
|
menus: MenuResp[]
|
||||||
@@ -152,6 +154,8 @@ const [form, resetForm] = useResetReactive({
|
|||||||
|
|
||||||
const componentName = computed(() => transformPathToName(form.path))
|
const componentName = computed(() => transformPathToName(form.path))
|
||||||
|
|
||||||
|
const { componentOptions } = useComponentPaths()
|
||||||
|
|
||||||
const rules: FormInstance['rules'] = {
|
const rules: FormInstance['rules'] = {
|
||||||
parentId: [{ required: true, message: '请选择上级菜单' }],
|
parentId: [{ required: true, message: '请选择上级菜单' }],
|
||||||
title: [{ required: true, message: '请输入菜单标题' }],
|
title: [{ required: true, message: '请输入菜单标题' }],
|
||||||
|
|||||||
Reference in New Issue
Block a user