管理中心,栏目管理,及权限设置
管理后台的栏目管理,及权限设置。
栏目列表效果:
功能:添加栏目,修改栏目,搜索栏目,删除栏目
添加栏目效果:
分类:是左侧菜单里面的大分类。无URL,仅为名称,及分类
菜单:是分类下的具有具体功能的 链接
操作:是某个菜单下的,例如添加,删除,修改 等动作,用户权限判断
控制器:admins/controllers/system.go
//菜单列表 func Menus(c *gin.Context) { //搜索 menu_name := c.Query("menu_name") if menu_name != "" { //获取系统设置 treeList := modes.SearchMenuList(menu_name) //显示登录模板 c.HTML(http.StatusOK,"system/menu.html",gin.H{ "treeList":treeList, "sum":len(treeList), "menu_name":menu_name, }) }else{ //获取系统设置 treeList,sum := modes.MenuList() //显示登录模板 c.HTML(http.StatusOK,"system/menu.html",gin.H{ "treeList":treeList, "sum":sum, "menu_name":"", }) } } //新增/编辑菜单 func MenusEdit(c *gin.Context) { //获取分类 treeList,_ := modes.MenuList() menu := modes.SysMenus{} //获取分类 id,_ := strconv.Atoi(c.Query("id")) fmt.Println(id) if id != 0 { menu = modes.MenuItem(id) } //显示登录模板 c.HTML(http.StatusOK,"system/menu_edit.html",gin.H{ "treeList": treeList, "menu":menu, }) } //保存菜单 func MenusSave(c *gin.Context) { var menu modes.SysMenus err := c.ShouldBind(&menu) if err != nil { c.JSON(http.StatusOK, gin.H{ "code": 400, "msg": err.Error(),}) return } res,msg := modes.SaveMenu(&menu) if res != true { c.JSON(http.StatusOK, gin.H{ "code": 400, "msg": msg,}) return } c.JSON(http.StatusOK, gin.H{ "code": 0, "msg": "添加成功",}) } //删除菜单 func MenusDel(c *gin.Context) { //获取系统设置 id := c.PostForm("id") ids,_ :=strconv.Atoi(id) res,msg := modes.DelMenu(ids) if res != true { c.JSON(http.StatusOK, gin.H{ "code": 400, "msg": msg,}) return } c.JSON(http.StatusOK, gin.H{ "code": 0, "msg": msg,}) }
模型:modes/adminsMenusModel.go
type SysMenus struct { Id int `form:"id"` MenuName string `form:"menu_name"` MenuType int `form:"menu_type"` MenuOrder int `form:"menu_order"` MenuPid int `form:"menu_pid"` MenuUrl string `form:"menu_url"` MenuStatus int `form:"menu_status"` AddDatetime string `form:"add_datetime"` } type TreeList struct { Id int `form:"id"` MenuName string `form:"menu_name"` MenuType int `form:"menu_type"` MenuOrder int `form:"menu_order"` MenuPid int `form:"menu_pid"` MenuUrl string `form:"menu_url"` MenuStatus int `form:"menu_status"` AddDatetime string `form:"add_datetime"` Children []*TreeList `form:"children"` } // 搜索 func SearchMenuList(menu_name string) []*TreeList { var menu []SysMenus //获取第一级菜单 DB.Model(SysMenus{}).Where("menu_name like ?", "%"+menu_name+"%").Find(&menu) treeList := []*TreeList{} for _, v := range menu { node := &TreeList{ Id: v.Id, MenuName: v.MenuName, MenuType: v.MenuType, MenuOrder: v.MenuOrder, MenuPid: v.MenuPid, MenuUrl: v.MenuUrl, MenuStatus: v.MenuStatus, AddDatetime: v.AddDatetime, } node.Children = nil treeList = append(treeList, node) } return treeList } // menu单条 func MenuItem(id int) SysMenus { var menu SysMenus DB.Model(SysMenus{}).Where("id=?", id).Find(&menu) return menu } // menu单条 func CurrentMenu(c *gin.Context) SysMenus { var menu SysMenus var url string if strings.Contains(c.Request.RequestURI, "?") { spurl := strings.Split(c.Request.RequestURI, "?") url = spurl[0] } else { url = c.Request.RequestURI } DB.Model(SysMenus{}).Where("menu_url=?", url).Find(&menu) return menu } // menu列表 func MenuList() ([]*TreeList, int) { return getMenu(0) } // 获取菜单 func getMenu(pid int) ([]*TreeList, int) { var menu []SysMenus var count = 0 //获取第一级菜单 DB.Model(SysMenus{}).Where("menu_pid=?", pid).Order("menu_order DESC ").Find(&menu) treeList := []*TreeList{} for _, v := range menu { count++ child, num := getMenu(v.Id) node := &TreeList{ Id: v.Id, MenuName: v.MenuName, MenuType: v.MenuType, MenuOrder: v.MenuOrder, MenuPid: v.MenuPid, MenuUrl: v.MenuUrl, MenuStatus: v.MenuStatus, AddDatetime: v.AddDatetime, } node.Children = child count += num treeList = append(treeList, node) } return treeList, count } // 保存设置 func SaveMenu(menu *SysMenus) (bool, string) { if menu.Id == 0 { menu.AddDatetime = time.Now().Format(common.TimeTem) res := DB.Model(SysMenus{}).Create(menu) if res.Error != nil { return false, res.Error.Error() } return true, "保存成功" } else { res := DB.Model(SysMenus{}).Where("id = ?", menu.Id).Updates(menu) if res.Error != nil { return false, res.Error.Error() } return true, "保存成功" } } // 保存设置 func DelMenu(id int) (bool, string) { var count int64 DB.Model(SysMenus{}).Where("menu_pid = ?", id).Count(&count) if count > 0 { return false, "菜单下有子菜单,删除失败" } res := DB.Delete(SysMenus{}, id) if res.Error != nil { return false, res.Error.Error() } return true, "删除成功" }
菜单列表视图 views/admins/system/menu.html
<div class="cl pd-5 bg-1 bk-gray mt-20"> <span class="l"> {{ $admin_uid := GetAdminId}} <a class="btn btn-primary radius" {{if has_powa $admin_uid "/admin/system_menus_edit"}} style="display:none" {{end}} onclick="system_category_add('添加栏目','/admin/system_menus_edit')" href="javascript:;"><i class="Hui-iconfont"></i> 添加栏目</a></span> <span class="r">共有数据:<strong>{{.sum}}</strong> 条</span> </div> <div class="mt-20"> <table class="table table-border table-bordered table-hover table-bg"> <thead> <tr class="text-c"> <th width="25"><input type="checkbox" name="" value=""></th> <th width="80">ID</th> <th width="80">排序</th> <th width="100">栏目类型</th> <th>栏目名称</th> <th width="250">栏目url</th> <th width="100">状态</th> <th width="150">添加时间</th> <th width="100">操作</th> </tr> </thead> <tbody> {{ range $k,$v1 := .treeList}} <tr class="text-c"> <td><input type="checkbox" name="" value=""></td> <td>{{$v1.Id}}</td> <td>{{$v1.MenuOrder}}</td> <td class="text-l"> {{if eq $v1.MenuType 1}} 一级分类 {{ else if eq $v1.MenuType 2}} --|菜单 {{ else if eq $v1.MenuType 3}} ----|操作 {{ end }} </td> <td class="text-l"> {{if eq $v1.MenuType 1}} {{ else if eq $v1.MenuType 2}} --| {{ else if eq $v1.MenuType 3}} ----| {{ end }} {{$v1.MenuName}} </td> <td>{{$v1.MenuUrl}}</td> <td> {{if eq $v1.MenuStatus 1}} 启用 {{else}} 停用 {{end}} </td> <td>{{$v1.AddDatetime}}</td> <td class="f-14"><a title="编辑" href="javascript:;" onclick="system_category_edit('栏目编辑','/admin/system_menus_edit',{{$v1.Id}},'700','480')" style="text-decoration:none"><i class="Hui-iconfont"></i></a> <a title="删除" href="javascript:;" onclick="article_category_del(this,{{$v1.Id}})" class="ml-5" style="text-decoration:none"><i class="Hui-iconfont"></i></a></td> </tr> {{ range $k2,$v2 := $v1.Children}} <tr class="text-c"> <td><input type="checkbox" name="" value=""></td> <td>{{$v2.Id}}</td> <td>{{$v2.MenuOrder}}</td> <td class="text-l"> {{if eq $v2.MenuType 1}} 一级分类 {{ else if eq $v2.MenuType 2}} --|菜单 {{ else if eq $v2.MenuType 3}} ----|操作 {{ end }} </td> <td class="text-l"> {{if eq $v2.MenuType 1}} {{ else if eq $v2.MenuType 2}} --| {{ else if eq $v2.MenuType 3}} ----| {{ end }} {{$v2.MenuName}} </td> <td>{{$v2.MenuUrl}}</td> <td> {{if eq $v2.MenuStatus 1}} 启用 {{else}} 停用 {{end}} </td> <td>{{$v2.AddDatetime}}</td> <td class="f-14"><a title="编辑" href="javascript:;" onclick="system_category_edit('栏目编辑','/admin/system_menus_edit',{{$v2.Id}},'700','480')" style="text-decoration:none"><i class="Hui-iconfont"></i></a> <a title="删除" href="javascript:;" onclick="article_category_del(this,{{$v2.Id}})" class="ml-5" style="text-decoration:none"><i class="Hui-iconfont"></i></a></td> </tr> {{ range $k3,$v3 := $v2.Children}} <tr class="text-c"> <td><input type="checkbox" name="" value=""></td> <td>{{$v3.Id}}</td> <td>{{$v3.MenuOrder}}</td> <td class="text-l"> {{if eq $v3.MenuType 1}} 一级分类 {{ else if eq $v3.MenuType 2}} --|菜单 {{ else if eq $v3.MenuType 3}} ----|操作 {{ end }} </td> <td class="text-l"> {{if eq $v3.MenuType 1}} {{ else if eq $v3.MenuType 2}} --| {{ else if eq $v3.MenuType 3}} ----| {{ end }} {{$v3.MenuName}} </td> <td>{{$v3.MenuUrl}}</td> <td>{{if eq $v3.MenuStatus 1}} 启用 {{else}} 停用 {{end}} </td> <td>{{$v3.AddDatetime}}</td> <td class="f-14"> <a title="编辑" href="javascript:;" {{if has_powa $admin_uid "/admin/system_menus_edit"}} style="display:none" {{end}} onclick="system_category_edit('栏目编辑','/admin/system_menus_edit',{{$v3.Id}},'700','480')" style="text-decoration:none"><i class="Hui-iconfont"></i></a> <a title="删除" href="javascript:;" {{if has_powa $admin_uid "/admin/system_menus_del"}} style="display:none" {{end}} onclick="article_category_del(this,{{$v3.Id}})" class="ml-5" style="text-decoration:none"><i class="Hui-iconfont"></i></a></td> </tr> {{ end }} {{ end }} {{end}} </tbody> </table> </div> <script type="text/javascript"> $('.table-sort').dataTable({ "aaSorting": [[ 1, "desc" ]],//默认第几个排序 "bStateSave": true,//状态保存 "aoColumnDefs": [ //{"bVisible": false, "aTargets": [ 3 ]} //控制列的隐藏显示 {"orderable":false,"aTargets":[0,4]}// 制定列不参与排序 ] }); /*系统-栏目-添加*/ function system_category_add(title,url,w,h){ layer_show(title,url,w,h); } /*系统-栏目-编辑*/ function system_category_edit(title,url,id,w,h){ layer_show(title,url+"?id="+id,w,h); } /*系统-栏目-删除*/ function article_category_del(obj,id){ layer.confirm('确认要删除吗?',function(index){ $.post("/admin/system_menus_del",{id:id},function(res){ if (res.code==0){ $(obj).parents("tr").remove(); layer.msg('已删除!',{icon:1,time:1000}); }else{ layer.msg(res.msg); } },'json') }); } </script>
添加和编辑视图:views/admins/system/menu_edit.html
<article class="cl pd-20"> <form action="/admin/system_menus_save" method="post" class="form form-horizontal" id="form-member-add"> <div class="row cl"> <label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>栏目/菜单名称:</label> <div class="formControls col-xs-8 col-sm-9"> <input type="text" class="input-text" value="{{.menu.MenuName}}" placeholder="" id="menu_name" name="menu_name"> </div> </div> <div class="row cl"> <label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>栏目/菜单类型:</label> <div class="formControls col-xs-8 col-sm-9 skin-minimal"> <div class="radio-box"> <input name="menu_type" type="radio" id="menu_type-1" value="1" {{if eq .menu.MenuType 1 }}checked{{end}} {{if not .menu.MenuType}}checked{{end}}> <label for="menu_type-1">分类</label> </div> <div class="radio-box"> <input type="radio" id="menu_type-2" name="menu_type" value="2" {{if eq .menu.MenuType 2 }}checked{{end}}> <label for="menu_type-2">菜单</label> </div> <div class="radio-box"> <input type="radio" id="menu_type-3" name="menu_type" value="3" {{if eq .menu.MenuType 3 }}checked{{end}}> <label for="menu_type-3">操作</label> </div> </div> </div> <div class="row cl"> <label class="form-label col-xs-4 col-sm-3">上级菜单:</label> <div class="formControls col-xs-8 col-sm-9"> <span class="select-box"> <select class="select" size="1" name="menu_pid"> <option value="" >顶级分类</option> {{ range $k,$v1 := .treeList}} <option value="{{$v1.Id}}" {{if eq $.menu.MenuPid $v1.Id }}selected{{end}}> -| {{$v1.MenuName}}</option> {{ range $k2,$v2 := $v1.Children}} <option value="{{$v2.Id}}" {{if eq $.menu.MenuPid $v2.Id }}selected{{end}}> --| {{$v2.MenuName}}</option> {{end}} {{end }} </select> </span> </div> </div> <div class="row cl"> <label class="form-label col-xs-4 col-sm-3">菜单/操作URL:</label> <div class="formControls col-xs-8 col-sm-9"> <input type="text" class="input-text" value="{{.menu.MenuUrl}}" placeholder="顶级分类可以为空" id="menu_url" name="menu_url"> </div> </div> <div class="row cl"> <label class="form-label col-xs-4 col-sm-3">排序:</label> <div class="formControls col-xs-8 col-sm-9"> <input type="text" class="input-text" placeholder="数字越大越靠前" value="{{.menu.MenuOrder}}" name="menu_order" id="menu_order"> </div> </div> <div class="row cl"> <label class="form-label col-xs-4 col-sm-3">栏目状态:</label> <div class="formControls col-xs-8 col-sm-9 skin-minimal"> <div class="radio-box"> <input name="menu_status" type="radio" id="menu_status-1" value="1" {{if eq .menu.MenuStatus 1 }}checked{{end}} {{if not .menu.MenuStatus}}checked{{end}}> <label for="menu_status-1">正常</label> </div> <div class="radio-box"> <input type="radio" id="menu_status-2" name="menu_status" value="2" {{if eq .menu.MenuStatus 2 }}checked{{end}}> <label for="menu_type-2">停用</label> </div> </div> </div> <div class="row cl"> <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3"> <input type="hidden" name="id" id="id" value="{{.menu.Id}}" /> <input class="btn btn-primary radius" type="submit" value=" 提交 "> </div> </div> </form> </article> <script type="text/javascript"> $(function(){ $('.skin-minimal input').iCheck({ checkboxClass: 'icheckbox-blue', radioClass: 'iradio-blue', increaseArea: '20%' }); $("#form-member-add").validate({ rules:{ menu_name:{ required:true, minlength:2, maxlength:16 }, }, onkeyup:false, focusCleanup:true, success:"valid", submitHandler:function(form){ $(form).ajaxSubmit(function (data){ if(data.code == 0){ var index = parent.layer.getFrameIndex(window.name); parent.window.location.reload(); parent.layer.close(index); }else{ layer.alert(data.msg) } }); } }); }); </script>
完结
但行好事,莫问前程!
本文来自博客园,作者:yangphp,转载请注明原文链接:https://www.cnblogs.com/ypeih/p/17338626.html