pixelqm
5 years ago
11 changed files with 516 additions and 64 deletions
-
108QMPlusServer/controller/api/menu.go
-
2QMPlusServer/init/registTable/registTable.go
-
12QMPlusServer/model/dbModel/api.go
-
6QMPlusServer/model/dbModel/api_authority.go
-
55QMPlusServer/model/dbModel/baseMenu.go
-
41QMPlusServer/model/dbModel/menu.go
-
75QMPlusServer/model/dbModel/menu_authority.go
-
5QMPlusServer/router/menu.go
-
63QMPlusVuePage/src/api/menu.js
-
25QMPlusVuePage/src/view/layout/index.vue
-
188QMPlusVuePage/src/view/superAdmin/menu/menu.vue
@ -0,0 +1,6 @@ |
|||
package dbModel |
|||
|
|||
type ApiAuthority struct { |
|||
AuthorityId string `json:"-"` |
|||
Api |
|||
} |
@ -0,0 +1,55 @@ |
|||
package dbModel |
|||
|
|||
import ( |
|||
"github.com/jinzhu/gorm" |
|||
"github.com/pkg/errors" |
|||
"main/controller/servers" |
|||
"main/init/qmsql" |
|||
"main/model/modelInterface" |
|||
) |
|||
|
|||
type BaseMenu struct { |
|||
gorm.Model |
|||
MenuLevel uint `json:"-"` |
|||
ParentId string `json:"parentId"` |
|||
Path string `json:"path"` |
|||
Name string `json:"name"` |
|||
Hidden bool `json:"hidden"` |
|||
Component string `json:"component"` |
|||
Meta `json:"meta"` |
|||
NickName string `json:"nickName"` |
|||
Children []BaseMenu `json:"children"` |
|||
} |
|||
|
|||
func (b *BaseMenu) AddBaseMenu() (err error) { |
|||
findOne := qmsql.DEFAULTDB.Where("name = ?", b.Name).Find(&BaseMenu{}).Error |
|||
if findOne != nil { |
|||
b.NickName = b.Title |
|||
err = qmsql.DEFAULTDB.Create(b).Error |
|||
} else { |
|||
err = errors.New("存在重复name,请修改name") |
|||
} |
|||
return err |
|||
} |
|||
|
|||
func (b *BaseMenu) DeleteBaseMenu(name string) (err error) { |
|||
err = qmsql.DEFAULTDB.Where("name = ?", name).Delete(&b).Delete(&Menu{}).Error |
|||
return err |
|||
} |
|||
|
|||
func (b *BaseMenu) UpdataBaseMenu(name string) (err error) { |
|||
err = qmsql.DEFAULTDB.Where("name = ?", name).Update(&b).Update(&Menu{}).Error |
|||
return err |
|||
} |
|||
|
|||
func (b *BaseMenu) GetInfoList(info modelInterface.PageInfo) (err error, list interface{}, total int) { |
|||
// 封装分页方法 调用即可 传入 当前的结构体和分页信息
|
|||
err, db, total := servers.PagingServer(b, info) |
|||
if err != nil { |
|||
return |
|||
} else { |
|||
var menuList []BaseMenu |
|||
err = db.Find(&menuList).Error |
|||
return err, menuList, total |
|||
} |
|||
} |
@ -1,41 +0,0 @@ |
|||
package dbModel |
|||
|
|||
import ( |
|||
"github.com/jinzhu/gorm" |
|||
"main/init/qmsql" |
|||
) |
|||
|
|||
type Menu struct { |
|||
gorm.Model `json:"-"` |
|||
MenuLevel uint `json:"-"` |
|||
AuthorityId uint `json:"-"` |
|||
ParentId uint `json:"parentId"` |
|||
Path string `json:"path"` |
|||
Name string `json:"name"` |
|||
Hidden bool `json:"hidden"` |
|||
Component string `json:"component"` |
|||
Meta `json:"meta"` |
|||
Children []Menu `json:"children"` |
|||
} |
|||
|
|||
type Meta struct { |
|||
Title string `json:"title"` |
|||
Icon string `json:"icon"` |
|||
} |
|||
|
|||
//获取动态路由树
|
|||
func (m *Menu) GetMenuTree(authorityId float64) (err error, menus []Menu) { |
|||
err = qmsql.DEFAULTDB.Where("authority_id = ? AND parent_id = ?", authorityId, 0).Find(&menus).Error |
|||
for i := 0; i < len(menus); i++ { |
|||
err = getChildrenList(&menus[i]) |
|||
} |
|||
return err, menus |
|||
} |
|||
|
|||
func getChildrenList(menu *Menu) (err error) { |
|||
err = qmsql.DEFAULTDB.Where("authority_id = ? AND parent_id = ?", menu.AuthorityId, menu.ID).Find(&menu.Children).Error |
|||
for i := 0; i < len(menu.Children); i++ { |
|||
err = getChildrenList(&menu.Children[i]) |
|||
} |
|||
return err |
|||
} |
@ -0,0 +1,75 @@ |
|||
package dbModel |
|||
|
|||
import ( |
|||
"fmt" |
|||
"main/init/qmsql" |
|||
) |
|||
|
|||
type Menu struct { |
|||
BaseMenu |
|||
MenuId string `json:"menuId"` |
|||
AuthorityId string `json:"-"` |
|||
Children []Menu `json:"children"` |
|||
} |
|||
|
|||
type Meta struct { |
|||
Title string `json:"title"` |
|||
Icon string `json:"icon"` |
|||
} |
|||
|
|||
// 为角色增加menu树
|
|||
func (m *Menu) AddMenuAuthority(menus []BaseMenu, authorityId string) (err error) { |
|||
var menu Menu |
|||
qmsql.DEFAULTDB.Where("authority_id = ? ", authorityId).Unscoped().Delete(&Menu{}) |
|||
for _, v := range menus { |
|||
menu.BaseMenu = v |
|||
menu.AuthorityId = authorityId |
|||
menu.MenuId = fmt.Sprintf("%v", v.ID) |
|||
menu.ID = 0 |
|||
err = qmsql.DEFAULTDB.Create(&menu).Error |
|||
if err != nil { |
|||
return err |
|||
} |
|||
} |
|||
return nil |
|||
} |
|||
|
|||
// 查看当前角色树
|
|||
func (m *Menu) GetMenuAuthority(authorityId string) (err error, menus []Menu) { |
|||
err = qmsql.DEFAULTDB.Where("authority_id = ?", authorityId).Find(&menus).Error |
|||
return err, menus |
|||
} |
|||
|
|||
//获取动态路由树
|
|||
func (m *Menu) GetMenuTree(authorityId float64) (err error, menus []Menu) { |
|||
err = qmsql.DEFAULTDB.Where("authority_id = ? AND parent_id = ?", authorityId, 0).Find(&menus).Error |
|||
for i := 0; i < len(menus); i++ { |
|||
err = getChildrenList(&menus[i]) |
|||
} |
|||
return err, menus |
|||
} |
|||
|
|||
func getChildrenList(menu *Menu) (err error) { |
|||
err = qmsql.DEFAULTDB.Where("authority_id = ? AND parent_id = ?", menu.AuthorityId, menu.MenuId).Find(&menu.Children).Error |
|||
for i := 0; i < len(menu.Children); i++ { |
|||
err = getChildrenList(&menu.Children[i]) |
|||
} |
|||
return err |
|||
} |
|||
|
|||
//获取基础路由树
|
|||
func (m *BaseMenu) GetBaseMenuTree() (err error, menus []BaseMenu) { |
|||
err = qmsql.DEFAULTDB.Where(" parent_id = ?", 0).Find(&menus).Error |
|||
for i := 0; i < len(menus); i++ { |
|||
err = getBaseChildrenList(&menus[i]) |
|||
} |
|||
return err, menus |
|||
} |
|||
|
|||
func getBaseChildrenList(menu *BaseMenu) (err error) { |
|||
err = qmsql.DEFAULTDB.Where("parent_id = ?", menu.ID).Find(&menu.Children).Error |
|||
for i := 0; i < len(menu.Children); i++ { |
|||
err = getBaseChildrenList(&menu.Children[i]) |
|||
} |
|||
return err |
|||
} |
@ -1,14 +1,194 @@ |
|||
<template> |
|||
<div> |
|||
新建菜单 |
|||
<div> |
|||
<div class="button-box clearflex"> |
|||
<el-button @click="addMenu('0')" type="primary">新增根菜单</el-button> |
|||
</div> |
|||
<el-table :data="tableData" border stripe> |
|||
<el-table-column label="ID" min-width="80" prop="ID"></el-table-column> |
|||
<el-table-column label="路径" min-width="180" prop="path"></el-table-column> |
|||
<el-table-column label="名称" min-width="180" prop="name"></el-table-column> |
|||
<el-table-column label="是否隐藏" min-width="180" prop="hidden"></el-table-column> |
|||
<el-table-column label="父节点Id" min-width="180" prop="parentId"></el-table-column> |
|||
<el-table-column label="文件路径" min-width="180" prop="component"></el-table-column> |
|||
<el-table-column label="展示名称" min-width="180" prop="authorityName"> |
|||
<template slot-scope="scope"> |
|||
<span>{{scope.row.meta.title}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="图标" min-width="180" prop="authorityName"> |
|||
<template slot-scope="scope"> |
|||
<span>{{scope.row.meta.icon}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column fixed="right" label="操作" width="100"> |
|||
<template slot-scope="scope"> |
|||
<el-button @click="addMenu(scope.row.ID)" size="small" type="text">添加子菜单</el-button> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<el-pagination |
|||
:current-page="page" |
|||
:page-size="pageSize" |
|||
:page-sizes="[10, 30, 50, 100]" |
|||
:style="{float:'right',padding:'20px'}" |
|||
:total="total" |
|||
@current-change="handleCurrentChange" |
|||
@size-change="handleSizeChange" |
|||
hide-on-single-page |
|||
layout="total, sizes, prev, pager, next, jumper" |
|||
></el-pagination> |
|||
|
|||
<el-dialog :visible.sync="dialogFormVisible" title="新增角色"> |
|||
<el-form :inline="true" :model="form" label-width="80px"> |
|||
<el-form-item label="路径"> |
|||
<el-input autocomplete="off" v-model="form.path"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="名称"> |
|||
<el-input autocomplete="off" v-model="form.name"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="是否隐藏"> |
|||
<el-select placeholder="是否在列表隐藏" v-model="form.hidden"> |
|||
<el-option :value="false" label="否"></el-option> |
|||
<el-option :value="true" label="是"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="父节点Id"> |
|||
<el-input autocomplete="off" disabled v-model="form.parentId"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="文件路径"> |
|||
<el-input autocomplete="off" v-model="form.component"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="展示名称"> |
|||
<el-input autocomplete="off" v-model="form.meta.title"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="图标"> |
|||
<el-input autocomplete="off" v-model="form.meta.icon"></el-input> |
|||
</el-form-item> |
|||
</el-form> |
|||
<div class="dialog-footer" slot="footer"> |
|||
<el-button @click="closeDialog">取 消</el-button> |
|||
<el-button @click="enterDialog" type="primary">确 定</el-button> |
|||
</div> |
|||
</el-dialog> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import { getMenuList, addBaseMenu } from '@/api/menu' |
|||
export default { |
|||
name:"Menus", |
|||
name: 'Menus', |
|||
data() { |
|||
return { |
|||
page: 1, |
|||
total: 10, |
|||
pageSize: 10, |
|||
tableData: [], |
|||
dialogFormVisible: false, |
|||
form: { |
|||
path: '', |
|||
name: '', |
|||
hidden: '', |
|||
parentId: '', |
|||
component: '', |
|||
meta: { |
|||
title: '', |
|||
icon: '' |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
methods: { |
|||
handleSizeChange(val) { |
|||
this.pageSize = val |
|||
this.getMenuList() |
|||
}, |
|||
handleCurrentChange(val) { |
|||
this.page = val |
|||
this.getMenuList() |
|||
}, |
|||
deleteAuth(row) { |
|||
this.$confirm('此操作将永久删除所有角色下该菜单, 是否继续?', '提示', { |
|||
confirmButtonText: '确定', |
|||
cancelButtonText: '取消', |
|||
type: 'warning' |
|||
}) |
|||
.then(async () => { |
|||
try { |
|||
const res = await deleteAuthority({ authorityId: row.authorityId }) |
|||
this.$message({ |
|||
type: 'success', |
|||
message: '删除成功!' |
|||
}) |
|||
this.getAuthList() |
|||
} catch (err) { |
|||
this.$message({ |
|||
type: 'error', |
|||
message: '删除失败!' + err |
|||
}) |
|||
} |
|||
}) |
|||
.catch(() => { |
|||
this.$message({ |
|||
type: 'info', |
|||
message: '已取消删除' |
|||
}) |
|||
}) |
|||
}, |
|||
initForm() { |
|||
this.form = { |
|||
path: '', |
|||
name: '', |
|||
hidden: '', |
|||
parentId: '', |
|||
component: '', |
|||
meta: { |
|||
title: '', |
|||
icon: '' |
|||
} |
|||
} |
|||
}, |
|||
closeDialog() { |
|||
this.initForm() |
|||
this.dialogFormVisible = false |
|||
}, |
|||
async enterDialog() { |
|||
const res = await addBaseMenu(this.form) |
|||
if (res.success) { |
|||
this.$message({ |
|||
type: 'success', |
|||
message: '添加成功!' |
|||
}) |
|||
this.getAuthList() |
|||
this.closeDialog() |
|||
} else { |
|||
this.$message({ |
|||
type: 'error', |
|||
message: '添加失败!' |
|||
}) |
|||
this.closeDialog() |
|||
} |
|||
this.initForm() |
|||
this.dialogFormVisible = false |
|||
}, |
|||
addMenu(id) { |
|||
this.form.parentId = String(id) |
|||
this.dialogFormVisible = true |
|||
}, |
|||
async getMenuList(page = this.page, pageSize = this.pageSize) { |
|||
const table = await getMenuList({ page, pageSize }) |
|||
this.tableData = table.data.menuList |
|||
} |
|||
}, |
|||
created() { |
|||
this.getMenuList() |
|||
} |
|||
} |
|||
</script> |
|||
<style lang="scss"> |
|||
|
|||
.button-box { |
|||
padding: 10px 20px; |
|||
.el-button { |
|||
float: right; |
|||
} |
|||
} |
|||
</style> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue