feat(menu.vue):添加菜单模块

This commit is contained in:
有来技术
2021-12-11 22:00:15 +08:00
parent f94e14e61c
commit 556cd58f5f
8 changed files with 197 additions and 22 deletions

View File

@@ -1,8 +1,95 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getRouteList() { /**
* 获取路由列表
*/
export function listRoutes() {
return request({ return request({
url: '/youlai-admin/api/v2/menus/route', url: '/youlai-admin/api/v2/menus/route',
method: 'get' method: 'get'
}) })
} }
/**
* 获取(表格)菜单列表
*
* @param queryParams
*/
export function listTableMenus(queryParams: object) {
return request({
url: '/youlai-admin/api/v1/menus/table',
method: 'get',
params: queryParams
})
}
/**
* 获取(下拉)菜单列表
*/
export function listSelectMenus() {
return request({
url: '/youlai-admin/api/v1/menus/select',
method: 'get'
})
}
/**
* 获取(树形下拉)菜单列表
*/
export function listTreeSelectMenus() {
return request({
url: '/youlai-admin/api/v1/menus/tree-select',
method: 'get'
})
}
/**
* 获取菜单详情
* @param id
*/
export function getMenuDetail(id: number) {
return request({
url: '/youlai-admin/api/v1/menus/' + id,
method: 'get'
})
}
/**
* 添加菜单
*
* @param data
*/
export function addMenu(data: object) {
return request({
url: '/youlai-admin/api/v1/menus',
method: 'post',
data: data
})
}
/**
* 修改菜单
*
* @param id
* @param data
*/
export function updateMenu(id: number, data: object) {
return request({
url: '/youlai-admin/api/v1/menus/' + id,
method: 'put',
data: data
})
}
/**
* 批量删除菜单
*
* @param ids 菜单ID多个以英文逗号(,)分割
*/
export function deleteMenu(ids: string) {
return request({
url: '/youlai-admin/api/v1/menus/' + ids,
method: 'delete'
})
}

View File

@@ -2,7 +2,7 @@ import {Module} from "vuex";
import {PermissionState, RootStateTypes} from "@store/interface"; import {PermissionState, RootStateTypes} from "@store/interface";
import {RouteRecordRaw} from 'vue-router' import {RouteRecordRaw} from 'vue-router'
import {constantRoutes} from '@/router' import {constantRoutes} from '@/router'
import {getRouteList} from "@/api/system/menu"; import {listRoutes} from "@/api/system/menu";
const modules = import.meta.glob("../../views/**/**.vue"); const modules = import.meta.glob("../../views/**/**.vue");
export const Layout = () => import( '@/layout/index.vue') export const Layout = () => import( '@/layout/index.vue')
@@ -64,7 +64,7 @@ const permissionModule: Module<PermissionState, RootStateTypes> = {
actions: { actions: {
generateRoutes({commit}, roles: string[]) { generateRoutes({commit}, roles: string[]) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getRouteList().then(response => { listRoutes().then(response => {
const asyncRoutes = response.data const asyncRoutes = response.data
let accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) let accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
commit('SET_ROUTES', accessedRoutes) commit('SET_ROUTES', accessedRoutes)

View File

@@ -48,7 +48,12 @@
box-sizing: content-box; box-sizing: content-box;
} }
// select row color // 选中行背景色值
.el-table__body tr.current-row td { .el-table__body tr.current-row td {
background-color: #e1f3d8b5 !important; background-color: #e1f3d8b5 !important;
} }
// card 的header统一高度
.el-card__header{
height: 61px!important;
}

View File

@@ -158,6 +158,7 @@ const state = reactive({
}) })
function handleQuery() { function handleQuery() {
emit('dictClick',{})
state.loading = true state.loading = true
listDictWithPage(state.queryParams).then(response => { listDictWithPage(state.queryParams).then(response => {
const {data, total} = response as any const {data, total} = response as any

View File

@@ -3,9 +3,10 @@
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="12" :xs="24"> <el-col :span="12" :xs="24">
<el-card class="box-card"> <el-card class="box-card">
<div class="clearfix" slot="header"> <template #header>
<b>字典列表</b> <svg-icon color="#000" icon-class="dict"/>
</div> 字典列表
</template>
<!-- 字典列表子组件 --> <!-- 字典列表子组件 -->
<dict @dictClick="handleDictClick"/> <dict @dictClick="handleDictClick"/>
</el-card> </el-card>
@@ -13,12 +14,13 @@
<el-col :span="12" :xs="24"> <el-col :span="12" :xs="24">
<el-card class="box-card"> <el-card class="box-card">
<div class="clearfix" slot="header"> <template #header>
<b v-if=" state.dictCode" style="margin-right: 5px">字典</b> <svg-icon color="#333" v-if=" state.dictCode" icon-class="education" />
<el-tag type="success" v-if=" state.dictCode" ><b>{{ state.dictName }}</b></el-tag> <span v-if=" state.dictCode" style="margin:0 5px;">字典</span>
<b v-if=" state.dictCode" style="margin-left: 5px">数据项</b> <el-tag type="primary" v-if=" state.dictCode" size="small">{{ state.dictName }}</el-tag>
<el-tag type="warning" v-if=" !state.dictCode">未选择字典</el-tag> <span v-if=" state.dictCode" style="margin-left: 5px">数据项</span>
</div> <el-tag type="warning" v-if=" !state.dictCode" size="small">未选择字典</el-tag>
</template>
<!-- 字典项组件 --> <!-- 字典项组件 -->
<dict-item :dictName="state.dictName" :dictCode='state.dictCode'/> <dict-item :dictName="state.dictName" :dictCode='state.dictCode'/>
</el-card> </el-card>
@@ -28,6 +30,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import SvgIcon from '@/components/SvgIcon/index.vue';
import Dict from './components/Dict.vue' import Dict from './components/Dict.vue'
import DictItem from './components/DictItem.vue' import DictItem from './components/DictItem.vue'
@@ -39,12 +42,12 @@ const state = reactive({
}) })
const handleDictClick = (dictRow: any) => { const handleDictClick = (dictRow: any) => {
state.dictName = dictRow.name if(dictRow){
state.dictCode = dictRow.code state.dictName = dictRow.name
state.dictCode = dictRow.code
}else{
state.dictName = ''
state.dictCode = ''
}
} }
</script> </script>
<style scoped>
</style>

View File

@@ -0,0 +1,18 @@
<template>
<div>
<el-form>
123
</el-form>
</div>
</template>
<script>
export default {
name: "Menu"
}
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,13 @@
<template>
</template>
<script>
export default {
name: "Perm"
}
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,48 @@
<template>
<div class="app-container">
<el-row :gutter="10">
<el-col :span="10" :xs="24">
<el-card class="box-card" shadow="always">
<template #header>
<svg-icon color="#000" icon-class="menu"/> 菜单列表
</template>
<menu-table @menuClick="handleMenuClick"/>
</el-card>
</el-col>
<el-col :span="14" :xs="24">
<el-card class="box-card" shadow="always">
<div slot="header">
<b v-if=" state.dictCode" style="margin-right: 5px">菜单</b>
<el-tag type="success" v-if=" state.dictCode"><b>{{ state.dictName }}</b></el-tag>
<b v-if=" state.dictCode" style="margin-left: 5px">数据权限</b>
<el-tag type="warning" v-if=" !state.dictCode">未选择菜单</el-tag>
</div>
<perm-table :menuId="state.menuId" :menuName="state.menuName"/>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script setup lang="ts">
import SvgIcon from '@/components/SvgIcon/index.vue';
import MenuTable from './components/Menu.vue'
import PermTable from './components/Perm.vue'
import {reactive} from 'vue'
const state = reactive({
menuId: undefined,
menuName: ''
})
const handleMenuClick = (menuRow: any) => {
state.menuId = menuRow.id
state.menuName = menuRow.name
}
</script>
<style scoped>
</style>