| |
| |
| |
|
|
| package menu |
|
|
| import ( |
| "html/template" |
| "regexp" |
| "strconv" |
| "strings" |
|
|
| "github.com/GoAdminGroup/go-admin/modules/db/dialect" |
|
|
| "github.com/GoAdminGroup/go-admin/modules/db" |
| "github.com/GoAdminGroup/go-admin/modules/language" |
| "github.com/GoAdminGroup/go-admin/plugins/admin/models" |
| ) |
|
|
| |
| type Item struct { |
| Name string `json:"name"` |
| ID string `json:"id"` |
| Url string `json:"url"` |
| IsLinkUrl bool `json:"isLinkUrl"` |
| Icon string `json:"icon"` |
| Header string `json:"header"` |
| Active string `json:"active"` |
| ChildrenList []Item `json:"childrenList"` |
| } |
|
|
| |
| type Menu struct { |
| List []Item `json:"list"` |
| Options []map[string]string `json:"options"` |
| MaxOrder int64 `json:"maxOrder"` |
| PluginName string `json:"pluginName"` |
| ForceUpdate bool `json:"forceUpdate"` |
| } |
|
|
| func (menu *Menu) GetUpdateJS(updateFlag bool) template.JS { |
| if !updateFlag { |
| return "" |
| } |
|
|
| forceUpdate := "false" |
| if menu.ForceUpdate { |
| forceUpdate = "true" |
| } |
| return template.JS(`$(function () { |
| let curMenuPlug = $(".main-sidebar section.sidebar ul.sidebar-menu").attr("data-plug"); |
| if (curMenuPlug !== '` + menu.PluginName + `' || ` + forceUpdate + `) { |
| $(".main-sidebar section.sidebar").html($("#sidebar-menu-tmpl").html()) |
| } |
| });`) |
| } |
|
|
| |
| func (menu *Menu) SetMaxOrder(order int64) { |
| menu.MaxOrder = order |
| } |
|
|
| |
| func (menu *Menu) AddMaxOrder() { |
| menu.MaxOrder++ |
| } |
|
|
| |
| func (menu *Menu) SetActiveClass(path string) *Menu { |
|
|
| reg, _ := regexp.Compile(`\?(.*)`) |
| path = reg.ReplaceAllString(path, "") |
|
|
| for i := 0; i < len(menu.List); i++ { |
| menu.List[i].Active = "" |
| } |
|
|
| for i := 0; i < len(menu.List); i++ { |
| if menu.List[i].Url == path && len(menu.List[i].ChildrenList) == 0 { |
| menu.List[i].Active = "active" |
| return menu |
| } |
|
|
| for j := 0; j < len(menu.List[i].ChildrenList); j++ { |
| if menu.List[i].ChildrenList[j].Url == path { |
| menu.List[i].Active = "active" |
| menu.List[i].ChildrenList[j].Active = "active" |
| return menu |
| } |
|
|
| menu.List[i].Active = "" |
| menu.List[i].ChildrenList[j].Active = "" |
| } |
| } |
|
|
| return menu |
| } |
|
|
| |
| func (menu Menu) FormatPath() template.HTML { |
| res := template.HTML(``) |
| for i := 0; i < len(menu.List); i++ { |
| if menu.List[i].Active != "" { |
| if menu.List[i].Url != "#" && menu.List[i].Url != "" && len(menu.List[i].ChildrenList) > 0 { |
| res += template.HTML(`<li><a href="` + menu.List[i].Url + `">` + menu.List[i].Name + `</a></li>`) |
| } else { |
| res += template.HTML(`<li>` + menu.List[i].Name + `</li>`) |
| if len(menu.List[i].ChildrenList) == 0 { |
| return res |
| } |
| } |
| for j := 0; j < len(menu.List[i].ChildrenList); j++ { |
| if menu.List[i].ChildrenList[j].Active != "" { |
| return res + template.HTML(`<li>`+menu.List[i].ChildrenList[j].Name+`</li>`) |
| } |
| } |
| } |
| } |
| return res |
| } |
|
|
| |
| func (menu *Menu) GetEditMenuList() []Item { |
| return menu.List |
| } |
|
|
| type NewMenuData struct { |
| ParentId int64 `json:"parent_id"` |
| Type int64 `json:"type"` |
| Order int64 `json:"order"` |
| Title string `json:"title"` |
| Icon string `json:"icon"` |
| PluginName string `json:"plugin_name"` |
| Uri string `json:"uri"` |
| Header string `json:"header"` |
| Uuid string `json:"uuid"` |
| } |
|
|
| func NewMenu(conn db.Connection, data NewMenuData) (int64, error) { |
| maxOrder := data.Order |
| checkOrder, _ := db.WithDriver(conn).Table("goadmin_menu"). |
| Where("plugin_name", "=", data.PluginName). |
| OrderBy("order", "desc"). |
| First() |
|
|
| if checkOrder != nil { |
| maxOrder = checkOrder["order"].(int64) |
| } |
|
|
| id, err := db.WithDriver(conn).Table("goadmin_menu"). |
| Insert(dialect.H{ |
| "parent_id": data.ParentId, |
| "type": data.Type, |
| "order": maxOrder, |
| "title": data.Title, |
| "uuid": data.Uuid, |
| "icon": data.Icon, |
| "plugin_name": data.PluginName, |
| "uri": data.Uri, |
| "header": data.Header, |
| }) |
| if !db.CheckError(err, db.INSERT) { |
| return id, nil |
| } |
| return id, err |
| } |
|
|
| |
| func GetGlobalMenu(user models.UserModel, conn db.Connection, lang string, pluginNames ...string) *Menu { |
|
|
| var ( |
| menus []map[string]interface{} |
| menuOption = make([]map[string]string, 0) |
| plugName = "" |
| ) |
|
|
| if len(pluginNames) > 0 { |
| plugName = pluginNames[0] |
| } |
|
|
| user.WithRoles().WithMenus() |
|
|
| if user.IsSuperAdmin() { |
| menus, _ = db.WithDriver(conn).Table("goadmin_menu"). |
| Where("id", ">", 0). |
| Where("plugin_name", "=", plugName). |
| OrderBy("order", "asc"). |
| All() |
| } else { |
|
|
| var ids []interface{} |
| for i := 0; i < len(user.MenuIds); i++ { |
| ids = append(ids, user.MenuIds[i]) |
| } |
|
|
| menus, _ = db.WithDriver(conn).Table("goadmin_menu"). |
| WhereIn("id", ids). |
| Where("plugin_name", "=", plugName). |
| OrderBy("order", "asc"). |
| All() |
| } |
|
|
| var title string |
| for i := 0; i < len(menus); i++ { |
|
|
| title = language.GetWithLang(menus[i]["title"].(string), lang) |
| menuOption = append(menuOption, map[string]string{ |
| "id": strconv.FormatInt(menus[i]["id"].(int64), 10), |
| "title": title, |
| }) |
| } |
|
|
| menuList := constructMenuTree(menus, 0, lang) |
| maxOrder := int64(0) |
| if len(menus) > 0 { |
| maxOrder = menus[len(menus)-1]["parent_id"].(int64) |
| } |
|
|
| return &Menu{ |
| List: menuList, |
| Options: menuOption, |
| MaxOrder: maxOrder, |
| PluginName: plugName, |
| } |
| } |
|
|
| func constructMenuTree(menus []map[string]interface{}, parentID int64, lang string) []Item { |
|
|
| branch := make([]Item, 0) |
|
|
| var title string |
| for j := 0; j < len(menus); j++ { |
| if parentID == menus[j]["parent_id"].(int64) { |
| if menus[j]["type"].(int64) == 1 { |
| title = language.Get(menus[j]["title"].(string)) |
| } else { |
| title = menus[j]["title"].(string) |
| } |
|
|
| header, _ := menus[j]["header"].(string) |
|
|
| uri := menus[j]["uri"].(string) |
|
|
| if lang != "" { |
| if strings.Contains(uri, "?") { |
| uri += "&__ga_lang=" + lang |
| } else { |
| uri += "?__ga_lang=" + lang |
| } |
| } |
|
|
| child := Item{ |
| Name: title, |
| ID: strconv.FormatInt(menus[j]["id"].(int64), 10), |
| Url: uri, |
| Icon: menus[j]["icon"].(string), |
| Header: header, |
| Active: "", |
| ChildrenList: constructMenuTree(menus, menus[j]["id"].(int64), lang), |
| } |
|
|
| branch = append(branch, child) |
| } |
| } |
|
|
| return branch |
| } |
|
|