Update: menu management
This commit is contained in:
parent
7ddcb4cfa6
commit
5da7981066
@ -65,7 +65,6 @@ async def create_user(
|
||||
async def update_user(
|
||||
user_in: UserUpdate,
|
||||
) -> BaseResponse:
|
||||
print(user_in.dict())
|
||||
user_controller = UserController()
|
||||
user = await user_controller.update(obj_in=user_in)
|
||||
await user_controller.update_roles(user, user_in.roles)
|
||||
|
||||
@ -80,7 +80,7 @@ async def init_menus():
|
||||
parent_menu = await Menu.create(
|
||||
menu_type=MenuType.CATALOG,
|
||||
name="系统管理",
|
||||
path="/system",
|
||||
path="system",
|
||||
order=1,
|
||||
parent_id=0,
|
||||
icon="carbon:gui-management",
|
||||
|
||||
@ -35,12 +35,11 @@ export async function addDynamicRoutes() {
|
||||
router.addRoute(EMPTY_ROUTE)
|
||||
return
|
||||
}
|
||||
|
||||
// 有token的情况
|
||||
const userStore = useUserStore()
|
||||
const permissionStore = usePermissionStore()
|
||||
!userStore.userId && (await userStore.getUserInfo())
|
||||
try {
|
||||
const userStore = useUserStore()
|
||||
const permissionStore = usePermissionStore()
|
||||
!userStore.userId && (await userStore.getUserInfo())
|
||||
const accessRoutes = await permissionStore.generateRoutes()
|
||||
await permissionStore.getAccessApis()
|
||||
accessRoutes.forEach((route) => {
|
||||
@ -49,6 +48,7 @@ export async function addDynamicRoutes() {
|
||||
router.hasRoute(EMPTY_ROUTE.name) && router.removeRoute(EMPTY_ROUTE.name)
|
||||
router.addRoute(NOT_FOUND_ROUTE)
|
||||
} catch (error) {
|
||||
console.error('error', error)
|
||||
const userStore = useUserStore()
|
||||
await userStore.logout()
|
||||
}
|
||||
|
||||
@ -8,7 +8,7 @@ import api from '@/api'
|
||||
function buildRoutes(routes = []) {
|
||||
return routes.map((e) => ({
|
||||
name: e.name,
|
||||
path: e.component !== 'Layout' ? '/' : e.path, // 处理目录是一级菜单的情况
|
||||
path: e.component !== 'Layout' ? '/' : '/' + e.path, // 处理目录是一级菜单的情况
|
||||
component: shallowRef(Layout), // ? 不使用 shallowRef 控制台会有 warning
|
||||
isHidden: e.is_hidden,
|
||||
redirect: e.redirect,
|
||||
|
||||
@ -54,7 +54,6 @@
|
||||
|
||||
<script setup>
|
||||
import { lStorage, setToken } from '@/utils'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
import bgImg from '@/assets/images/login_bg.webp'
|
||||
import api from '@/api'
|
||||
import { addDynamicRoutes } from '@/router'
|
||||
@ -79,7 +78,6 @@ function initLoginInfo() {
|
||||
}
|
||||
}
|
||||
|
||||
const isRemember = useStorage('isRemember', false)
|
||||
const loading = ref(false)
|
||||
async function handleLogin() {
|
||||
const { username, password } = loginInfo.value
|
||||
@ -93,14 +91,10 @@ async function handleLogin() {
|
||||
const res = await api.login({ username, password: password.toString() })
|
||||
$message.success('登录成功')
|
||||
setToken(res.data.access_token)
|
||||
if (isRemember.value) {
|
||||
lStorage.set('loginInfo', { username, password })
|
||||
} else {
|
||||
lStorage.remove('loginInfo')
|
||||
}
|
||||
await addDynamicRoutes()
|
||||
if (query.redirect) {
|
||||
const path = query.redirect
|
||||
console.log('path', { path, query })
|
||||
Reflect.deleteProperty(query, 'redirect')
|
||||
router.push({ path, query })
|
||||
} else {
|
||||
|
||||
@ -7,9 +7,6 @@ import {
|
||||
NInput,
|
||||
NInputNumber,
|
||||
NPopconfirm,
|
||||
NRadio,
|
||||
NRadioGroup,
|
||||
NSpace,
|
||||
NSwitch,
|
||||
NTreeSelect,
|
||||
} from 'naive-ui'
|
||||
@ -29,6 +26,7 @@ defineOptions({ name: '菜单管理' })
|
||||
const $table = ref(null)
|
||||
const queryItems = ref({})
|
||||
const vPermission = resolveDirective('permission')
|
||||
const menuDisabled = ref(false)
|
||||
|
||||
// 表单初始化内容
|
||||
const initForm = {
|
||||
@ -133,6 +131,7 @@ const columns = [
|
||||
initForm.parent_id = row.id
|
||||
initForm.menu_type = 'menu'
|
||||
showMenuType.value = false
|
||||
menuDisabled.value = false
|
||||
handleAdd()
|
||||
},
|
||||
},
|
||||
@ -189,7 +188,7 @@ const columns = [
|
||||
},
|
||||
},
|
||||
]
|
||||
// 修改是否隐藏
|
||||
// 修改是否keepalive
|
||||
async function handleUpdateKeepalive(row) {
|
||||
if (!row.id) return
|
||||
row.publishing = true
|
||||
@ -217,6 +216,7 @@ function handleClickAdd() {
|
||||
initForm.order = 1
|
||||
initForm.keepalive = true
|
||||
showMenuType.value = true
|
||||
menuDisabled.value = true
|
||||
handleAdd()
|
||||
}
|
||||
|
||||
@ -233,7 +233,7 @@ async function getTreeSelect() {
|
||||
<CommonPage show-footer title="菜单列表">
|
||||
<template #action>
|
||||
<NButton v-permission="'post/api/v1/menu/create'" type="primary" @click="handleClickAdd">
|
||||
<TheIcon icon="material-symbols:add" :size="18" class="mr-5" />新建菜单
|
||||
<TheIcon icon="material-symbols:add" :size="18" class="mr-5" />新建根菜单
|
||||
</NButton>
|
||||
</template>
|
||||
|
||||
@ -245,7 +245,6 @@ async function getTreeSelect() {
|
||||
:columns="columns"
|
||||
:get-data="api.getMenus"
|
||||
:single-line="true"
|
||||
default-expand-all="true"
|
||||
>
|
||||
</CrudTable>
|
||||
|
||||
@ -264,14 +263,6 @@ async function getTreeSelect() {
|
||||
:label-width="80"
|
||||
:model="modalForm"
|
||||
>
|
||||
<NFormItem v-if="showMenuType" label="菜单类型" path="type">
|
||||
<NRadioGroup v-model:value="modalForm.menu_type" name="radiogroup">
|
||||
<NSpace>
|
||||
<NRadio value="catalog"> 目录 </NRadio>
|
||||
<NRadio value="menu"> 菜单 </NRadio>
|
||||
</NSpace>
|
||||
</NRadioGroup>
|
||||
</NFormItem>
|
||||
<NFormItem label="上级菜单" path="parent_id">
|
||||
<NTreeSelect
|
||||
v-model:value="modalForm.parent_id"
|
||||
@ -279,6 +270,7 @@ async function getTreeSelect() {
|
||||
label-field="name"
|
||||
:options="menuOptions"
|
||||
default-expand-all="true"
|
||||
:disabled="menuDisabled"
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem
|
||||
@ -286,11 +278,11 @@ async function getTreeSelect() {
|
||||
path="name"
|
||||
:rule="{
|
||||
required: true,
|
||||
message: '请输入菜单名称',
|
||||
message: '请输入唯一菜单名称',
|
||||
trigger: ['input', 'blur'],
|
||||
}"
|
||||
>
|
||||
<NInput v-model:value="modalForm.name" placeholder="请输入菜单名称" />
|
||||
<NInput v-model:value="modalForm.name" placeholder="请输入唯一菜单名称" />
|
||||
</NFormItem>
|
||||
<NFormItem
|
||||
label="访问路径"
|
||||
@ -298,19 +290,24 @@ async function getTreeSelect() {
|
||||
:rule="{
|
||||
required: true,
|
||||
message: '请输入访问路径',
|
||||
trigger: ['input', 'blur'],
|
||||
trigger: ['blur'],
|
||||
}"
|
||||
>
|
||||
<NInput v-model:value="modalForm.path" placeholder="请输入访问路径" />
|
||||
</NFormItem>
|
||||
<NFormItem v-if="modalForm.menu_type === 'menu'" label="组件路径" path="component">
|
||||
<NInput v-model:value="modalForm.component" placeholder="请输入组件路径" />
|
||||
<NInput
|
||||
v-model:value="modalForm.component"
|
||||
placeholder="请输入组件路径,例如:/system/user"
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="跳转路径" path="redirect">
|
||||
<NInput
|
||||
v-model:value="modalForm.redirect"
|
||||
:disabled="modalForm.parent_id !== 0"
|
||||
placeholder="只有一级菜单可以设置跳转路径"
|
||||
:placeholder="
|
||||
modalForm.parent_id !== 0 ? '只有一级菜单可以设置跳转路径' : '请输入跳转路径'
|
||||
"
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="菜单图标" path="icon">
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user