沈阳玫苑物业管理后端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

374 lines
11 KiB

package models
import (
"lapp_-wy/db"
"lapp_-wy/utils"
"errors"
glog "lapp_-wy/web/middleware/glog"
)
/***
*CreateBy:lou
*Date:2020/5/15
*TableName:菜单表
**********/
type Menu struct {
MenuId int `form:"menu_id" json:"menu_id"`
MenuName string `xorm:"comment('菜单标题') VARCHAR(40)" form:"menu_name" json:"menu_name"`
Title string `xorm:"comment('菜单标题') VARCHAR(40)" form:"title" json:"title"`
Icon string `xorm:"comment('菜单标题') VARCHAR(40)" form:"icon" json:"icon"`
Path string `xorm:"comment('菜单标题') VARCHAR(128)" form:"path" json:"path"`
Paths string `xorm:"comment('菜单标题') VARCHAR(128)" form:"paths" json:"paths"`
MenuType string `xorm:"comment('菜单标题') VARCHAR(1)" form:"menu_type" json:"menu_type"`
Action string `xorm:"comment('菜单标题') VARCHAR(16)" form:"action" json:"action"`
Permission string `xorm:"comment('菜单标题') VARCHAR(32)" form:"permission" json:"permission"`
ParentId int `xorm:"comment('菜单ID') int(0)" form:"parent_id" json:"parent_id"`
NoCache string `xorm:"comment('菜单标题') VARCHAR(1)" form:"no_cache" json:"no_cache"`
Breadcrumb string `xorm:"comment('菜单标题') VARCHAR(32)" form:"breadcrumb" json:"breadcrumb"`
Component string `xorm:"comment('菜单标题') VARCHAR(32)" form:"component" json:"component"`
Sort int `xorm:"comment('菜单标题') int(4)" form:"sort" json:"sort"`
Visible string `xorm:"comment('菜单标题') VARCHAR(1)" form:"visible" json:"visible"`
CreateBy string `xorm:"comment('菜单标题') VARCHAR(128)" form:"create_by" json:"create_by"`
UpdateBy string `xorm:"comment('菜单标题') VARCHAR(128)" form:"update_by" json:"update_by"`
IsFrame string `xorm:"comment('菜单ID') int(0)" form:"is_frame" json:"is_frame"`
DataScope string `json:"dataScope" xorm:"-"`
Params string `json:"params" xorm:"-"`
RoleId int `xorm:"-" form:"role_id" json:"role_id"`
Children []Menu `json:"children" xorm:"-"`
IsSelect bool `json:"is_select" xorm:"-"`
}
type MenuB struct {
MenuName string `form:"menu_name" json:"menu_name"`
Title string `form:"title" json:"title"`
Icon string `form:"icon" json:"icon"`
Path string `form:"path" json:"path"`
Paths string `form:"paths" json:"paths"`
MenuType string `form:"menu_type" json:"menu_type"`
Action string `form:"action" json:"action"`
Permission string `form:"permission" json:"permission"`
ParentId int `form:"parent_id" json:"parent_id"`
NoCache string `form:"no_cache" json:"no_cache"`
Breadcrumb string `form:"breadcrumb" json:"breadcrumb"`
Component string `form:"component" json:"component"`
Sort int `form:"sort" json:"sort"`
Visible string `form:"visible" json:"visible"`
CreateBy string `form:"create_by" json:"create_by"`
UpdateBy string `form:"update_by" json:"update_by"`
IsFrame string `form:"is_frame" json:"is_frame"`
}
type MenuLable struct {
Id int `json:"id" xorm:"-"`
Label string `json:"label" xorm:"-"`
Children []MenuLable `json:"children" xorm:"-"`
}
type Menus struct {
MenuId int `json:"menu_id" xorm:"column:menu_id"`
MenuName string `json:"menu_name" xorm:"column:menu_name"`
Title string `json:"title" xorm:"column:title"`
Icon string `json:"icon" xorm:"column:icon"`
Path string `json:"path" xorm:"column:path"`
MenuType string `json:"menu_type" xorm:"column:menu_type"`
Action string `json:"action" xorm:"column:action"`
Permission string `json:"permission" xorm:"column:permission"`
ParentId int `json:"parent_id" xorm:"column:parent_id"`
NoCache bool `json:"no_cache" xorm:"column:no_cache"`
Breadcrumb string `json:"breadcrumb" xorm:"column:breadcrumb"`
Component string `json:"component" xorm:"column:component"`
Sort int `json:"sort" xorm:"column:sort"`
Visible string `json:"visible" xorm:"column:visible"`
Children []Menu `json:"children" xorm:"-"`
CreateBy string `json:"create_by" xorm:"column:create_by"`
UpdateBy string `json:"update_by" xorm:"column:update_by"`
DataScope string `json:"dataScope" xorm:"-"`
Params string `json:"params" xorm:"-"`
}
func (t *Menu) TableName() string {
return "menu"
}
type MenuRole struct {
Menus
IsSelect bool `json:"is_select" gorm:"-"`
}
type MS []Menu
// 清除string字段的右侧空格
func (t *Menu) Clipped() {
utils.TrimStruct(t, *t)
}
//根据菜单id,查询菜单
func (t *Menu) GetByMenuId() (Menu Menu, err error) {
e := db.MasterEngine()
_, err = e.Table(t.TableName()).Where("menu_id = ?", t.MenuId).Get(&Menu)
if err != nil {
return
}
return
}
func (t *Menu) SetMenu() (m []Menu, err error) {
menulist, err := t.GetPage()
m = make([]Menu, 0)
for i := 0; i < len(menulist); i++ {
menulist[i].Clipped()
if menulist[i].ParentId != 0 {
continue
}
menusInfo := DiguiMenu(&menulist, menulist[i])
m = append(m, menusInfo)
}
return
}
func DiguiMenu(menulist *[]Menu, menu Menu) Menu {
list := *menulist
min := make([]Menu, 0)
for j := 0; j < len(list); j++ {
if menu.MenuId != list[j].ParentId {
continue
}
mi := Menu{}
mi.MenuId = list[j].MenuId
mi.MenuName = list[j].MenuName
mi.Title = list[j].Title
mi.Icon = list[j].Icon
mi.Path = list[j].Path
mi.MenuType = list[j].MenuType
mi.Action = list[j].Action
mi.Permission = list[j].Permission
mi.ParentId = list[j].ParentId
mi.NoCache = list[j].NoCache
mi.Breadcrumb = list[j].Breadcrumb
mi.Component = list[j].Component
mi.Sort = list[j].Sort
mi.Visible = list[j].Visible
mi.Children = []Menu{}
utils.TrimStruct(&mi, mi)
if mi.MenuType != "F" {
ms := DiguiMenu(menulist, mi)
utils.TrimStruct(&ms, ms)
min = append(min, ms)
} else {
min = append(min, mi)
}
}
menu.Children = min
return menu
}
func (t *Menu) SetMenuRole(rolename string) (m []Menu, err error) {
menulist := t.GetByRoleName(rolename)
for i := 0; i < len(menulist); i++ {
if menulist[i].ParentId != 0 {
continue
}
menusInfo := DiguiMenu(&menulist, menulist[i])
utils.TrimStruct(&menusInfo, menusInfo)
m = append(m, menusInfo)
}
return
}
func (t *Menu) GetByRoleName(rolename string) []Menu {
menus := make([]Menu, 0)
e := db.MasterEngine()
err := e.SQL("select menu.* from menu left join role_menu on role_menu.menu_id=menu.menu_id where role_menu.role_name=? and menu_type in ('M','C') order by sort asc", rolename).Find(&menus)
if err != nil {
return nil
}
return menus
}
func (t *Menu) SetMenuLable() (m []MenuLable, err error) {
menulist, err := t.Get()
m = make([]MenuLable, 0)
for i := 0; i < len(menulist); i++ {
menulist[i].Clipped()
if menulist[i].ParentId != 0 {
continue
}
e := MenuLable{}
e.Id = menulist[i].MenuId
e.Label = menulist[i].Title
menusInfo := DiguiMenuLable(&menulist, e)
m = append(m, menusInfo)
}
return
}
func DiguiMenuLable(menulist *[]Menu, menu MenuLable) MenuLable {
list := *menulist
min := make([]MenuLable, 0)
for j := 0; j < len(list); j++ {
list[j].Clipped()
if menu.Id != list[j].ParentId {
continue
}
mi := MenuLable{}
mi.Id = list[j].MenuId
mi.Label = list[j].Title
mi.Children = []MenuLable{}
if list[j].MenuType != "F" {
ms := DiguiMenuLable(menulist, mi)
min = append(min, ms)
} else {
min = append(min, mi)
}
}
menu.Children = min
return menu
}
func (t *MenuRole) Get() (Menus []MenuRole, err error) {
e := db.MasterEngine()
table := e.Table("menu")
if t.MenuName != "" {
table = table.Where("menu_name = ?", t.MenuName)
}
if err = table.OrderBy("sort").Find(&Menus); err != nil {
return
}
return
}
func (t *Menu) Get() (Menus []Menu, err error) {
e := db.MasterEngine()
table := e.Table(t.TableName()).Where("1=1")
if t.MenuName != "" {
table = table.And("menu_name = ?", t.MenuName)
}
if t.Path != "" {
table = table.And("path = ?", t.Path)
}
if t.Action != "" {
table = table.And("action = ?", t.Action)
}
if t.MenuType != "" {
table = table.And("menu_type = ?", t.MenuType)
}
if err = table.OrderBy("sort").Find(&Menus); err != nil {
return
}
return
}
func (t *Menu) GetPage() (Menus []Menu, err error) {
e := db.MasterEngine()
table := e.Table(t.TableName()).Where("1=1")
if t.MenuName != "" {
table = table.And("menu_name = ?", t.MenuName)
}
if t.Title != "" {
table = table.And("title = ?", t.Title)
}
if t.Visible != "" {
table = table.And("visible = ?", t.Visible)
}
table = table.And("menu_type in ('M','C','F')")
if err = table.OrderBy("sort").Find(&Menus); err != nil {
return
}
return
}
func (t *Menu) Create() (id int, err error) {
e := db.MasterEngine()
rows, err := e.Exec("INSERT INTO "+t.TableName()+" (sort, visible,breadcrumb,action,no_cache,component,update_by,create_by,icon,menu_name,menu_type,path,permission,parent_id,title) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", t.Sort, t.Visible,t.Breadcrumb,t.Action,t.NoCache,t.Component,t.UpdateBy,t.CreateBy,t.Icon,t.MenuName,t.MenuType,t.Path,t.Permission,t.ParentId,t.Title)
if err != nil {
glog.InfoExtf("菜单测试", "err2:%v", err)
return
}
lastInsertId,err := rows.LastInsertId()
if err != nil {
return
}
t.MenuId = int(lastInsertId)
err = InitPaths(t)
if err != nil {
return
}
id = t.MenuId
return
}
func InitPaths(menu *Menu) (err error) {
e := db.MasterEngine()
parentMenu := new(Menu)
if int(menu.ParentId) != 0 {
e.Table("menu").Where("menu_id = ?", menu.ParentId).Get(parentMenu)
if parentMenu.Paths == "" {
err = errors.New("父级paths异常,请尝试对当前节点父级菜单进行更新操作!")
return
}
menu.Paths = parentMenu.Paths + "/" + utils.ValueToString(menu.MenuId, "")
} else {
menu.Paths = "/0/" + utils.ValueToString(menu.MenuId, "")
}
e.Table("menu").Where("menu_id = ?", menu.MenuId).Update(map[string]interface{}{"paths":menu.Paths})
return
}
func (t *Menu) Update(id int) (err error) {
e := db.MasterEngine()
var upmenu Menu
upmenu.Permission = t.Permission
upmenu.ParentId = t.ParentId
upmenu.Title = t.Title
upmenu.Paths = t.Paths
upmenu.Path = t.Path
upmenu.MenuType = t.MenuType
upmenu.MenuName = t.MenuName
upmenu.IsFrame = t.IsFrame
upmenu.Icon = t.Icon
upmenu.CreateBy = t.CreateBy
upmenu.UpdateBy = t.UpdateBy
upmenu.Component = t.Component
upmenu.Action = t.Action
upmenu.Breadcrumb = t.Breadcrumb
upmenu.Visible = t.Visible
upmenu.Sort = t.Sort
//参数1:是要修改的数据
columns := []string{"permission", "parent_id", "title",
"paths", "path", "menu_type", "menu_name", "icon", "breadcrumb", "visible", "sort",
"create_by", "update_by", "component", "action"}
//参数2:是修改的数据
if _, err = e.Table(t.TableName()).Where("menu_id = ?",id).MustCols(columns...).Update(&upmenu); err != nil {
glog.InfoExtf("菜单测试", "update1 err:%v", err)
return
}
err = InitPaths(t)
if err != nil {
glog.InfoExtf("菜单测试", "update2 err:%v", err)
return
}
return
}
func (t *Menu) Delete(id int) (success bool, err error) {
e := db.MasterEngine()
if _, err = e.Table(t.TableName()).Where("menu_id = ?", id).Delete(&Menu{}); err != nil {
success = false
return
}
success = true
return
}