github.com/kotovmak/go-admin@v1.1.1/plugins/admin/models/menu.go (about) 1 package models 2 3 import ( 4 "encoding/json" 5 "strconv" 6 "time" 7 8 "github.com/kotovmak/go-admin/modules/db" 9 "github.com/kotovmak/go-admin/modules/db/dialect" 10 ) 11 12 // MenuModel is menu model structure. 13 type MenuModel struct { 14 Base 15 16 Id int64 17 Title string 18 ParentId int64 19 Icon string 20 Uri string 21 Header string 22 CreatedAt string 23 UpdatedAt string 24 } 25 26 // Menu return a default menu model. 27 func Menu() MenuModel { 28 return MenuModel{Base: Base{TableName: "goadmin_menu"}} 29 } 30 31 // MenuWithId return a default menu model of given id. 32 func MenuWithId(id string) MenuModel { 33 idInt, _ := strconv.Atoi(id) 34 return MenuModel{Base: Base{TableName: "goadmin_menu"}, Id: int64(idInt)} 35 } 36 37 func (t MenuModel) SetConn(con db.Connection) MenuModel { 38 t.Conn = con 39 return t 40 } 41 42 // Find return a default menu model of given id. 43 func (t MenuModel) Find(id interface{}) MenuModel { 44 item, _ := t.Table(t.TableName).Find(id) 45 return t.MapToModel(item) 46 } 47 48 // New create a new menu model. 49 func (t MenuModel) New(title, icon, uri, header, pluginName string, parentId, order int64) (MenuModel, error) { 50 51 id, err := t.Table(t.TableName).Insert(dialect.H{ 52 "title": title, 53 "parent_id": parentId, 54 "icon": icon, 55 "uri": uri, 56 "order": order, 57 "header": header, 58 "plugin_name": pluginName, 59 }) 60 61 t.Id = id 62 t.Title = title 63 t.ParentId = parentId 64 t.Icon = icon 65 t.Uri = uri 66 t.Header = header 67 68 return t, err 69 } 70 71 // Delete delete the menu model. 72 func (t MenuModel) Delete() { 73 _ = t.Table(t.TableName).Where("id", "=", t.Id).Delete() 74 _ = t.Table("goadmin_role_menu").Where("menu_id", "=", t.Id).Delete() 75 items, _ := t.Table(t.TableName).Where("parent_id", "=", t.Id).All() 76 77 if len(items) > 0 { 78 ids := make([]interface{}, len(items)) 79 for i := 0; i < len(ids); i++ { 80 ids[i] = items[i]["id"] 81 } 82 _ = t.Table("goadmin_role_menu").WhereIn("menu_id", ids).Delete() 83 } 84 85 _ = t.Table(t.TableName).Where("parent_id", "=", t.Id).Delete() 86 } 87 88 // Update update the menu model. 89 func (t MenuModel) Update(title, icon, uri, header, pluginName string, parentId int64) (int64, error) { 90 return t.Table(t.TableName). 91 Where("id", "=", t.Id). 92 Update(dialect.H{ 93 "title": title, 94 "parent_id": parentId, 95 "icon": icon, 96 "plugin_name": pluginName, 97 "uri": uri, 98 "header": header, 99 "updated_at": time.Now().Format("2006-01-02 15:04:05"), 100 }) 101 } 102 103 type OrderItems []OrderItem 104 105 type OrderItem struct { 106 ID uint `json:"id"` 107 Children OrderItems `json:"children"` 108 } 109 110 // ResetOrder update the order of menu models. 111 func (t MenuModel) ResetOrder(data []byte) { 112 113 var items OrderItems 114 _ = json.Unmarshal(data, &items) 115 116 count := 1 117 for _, v := range items { 118 if len(v.Children) > 0 { 119 _, _ = t.Table(t.TableName). 120 Where("id", "=", v.ID). 121 Update(dialect.H{ 122 "order": count, 123 "parent_id": 0, 124 }) 125 126 for _, v2 := range v.Children { 127 if len(v2.Children) > 0 { 128 129 _, _ = t.Table(t.TableName). 130 Where("id", "=", v2.ID). 131 Update(dialect.H{ 132 "order": count, 133 "parent_id": v.ID, 134 }) 135 136 for _, v3 := range v2.Children { 137 _, _ = t.Table(t.TableName). 138 Where("id", "=", v3.ID). 139 Update(dialect.H{ 140 "order": count, 141 "parent_id": v2.ID, 142 }) 143 count++ 144 } 145 } else { 146 _, _ = t.Table(t.TableName). 147 Where("id", "=", v2.ID). 148 Update(dialect.H{ 149 "order": count, 150 "parent_id": v.ID, 151 }) 152 count++ 153 } 154 } 155 } else { 156 _, _ = t.Table(t.TableName). 157 Where("id", "=", v.ID). 158 Update(dialect.H{ 159 "order": count, 160 "parent_id": 0, 161 }) 162 count++ 163 } 164 } 165 } 166 167 // CheckRole check the role if has permission to get the menu. 168 func (t MenuModel) CheckRole(roleId string) bool { 169 checkRole, _ := t.Table("goadmin_role_menu"). 170 Where("role_id", "=", roleId). 171 Where("menu_id", "=", t.Id). 172 First() 173 return checkRole != nil 174 } 175 176 // AddRole add a role to the menu. 177 func (t MenuModel) AddRole(roleId string) (int64, error) { 178 if roleId != "" { 179 if !t.CheckRole(roleId) { 180 return t.Table("goadmin_role_menu"). 181 Insert(dialect.H{ 182 "role_id": roleId, 183 "menu_id": t.Id, 184 }) 185 } 186 } 187 return 0, nil 188 } 189 190 // DeleteRoles delete roles with menu. 191 func (t MenuModel) DeleteRoles() error { 192 return t.Table("goadmin_role_menu"). 193 Where("menu_id", "=", t.Id). 194 Delete() 195 } 196 197 // MapToModel get the menu model from given map. 198 func (t MenuModel) MapToModel(m map[string]interface{}) MenuModel { 199 t.Id = m["id"].(int64) 200 t.Title, _ = m["title"].(string) 201 t.ParentId = m["parent_id"].(int64) 202 t.Icon, _ = m["icon"].(string) 203 t.Uri, _ = m["uri"].(string) 204 t.Header, _ = m["header"].(string) 205 t.CreatedAt, _ = m["created_at"].(string) 206 t.UpdatedAt, _ = m["updated_at"].(string) 207 return t 208 }