소스 검색

角色权限

wangji 6 년 전
부모
커밋
87443e0cb8

+ 292 - 2
src/jy/admin/user.go

@@ -6,17 +6,55 @@ import (
 	. "jy/util"
 	"net/http"
 	"time"
-
 	"github.com/gin-gonic/gin"
+	"github.com/gin-contrib/sessions"
+	"strconv"
+	"gopkg.in/mgo.v2/bson"
+	qu "qfw/util"
+	"encoding/json"
 )
 
 func init() {
 	Admin.GET("/index", func(c *gin.Context) {
-		c.HTML(http.StatusOK, "index.html", gin.H{})
+		c.HTML(http.StatusOK, "index.html",nil)
 	})
 	Admin.GET("/user", func(c *gin.Context) {
 		c.HTML(http.StatusOK, "user.html", gin.H{})
 	})
+	Admin.GET("/menu", func(c *gin.Context) {
+		c.HTML(http.StatusOK, "menu.html", gin.H{})
+	})
+	Admin.GET("/role", func(c *gin.Context) {
+		c.HTML(http.StatusOK, "role.html", gin.H{})
+	})
+	Admin.GET("/role/menu", func(c *gin.Context) {
+		role:=c.Query("role")
+		c.HTML(http.StatusOK, "rolemenu.html", gin.H{"role":role})
+	})
+	Admin.GET("/role/secondmenu", func(c *gin.Context) {
+		role:=c.Query("role")
+		_id:=c.Query("_id")
+		c.HTML(http.StatusOK, "rolesecondmenu.html", gin.H{"role":role,"_id":_id})
+	})
+	Admin.GET("/secondmenu", func(c *gin.Context) {
+		_id := c.Query("id")
+		c.HTML(http.StatusOK, "secondmenu.html", gin.H{"_id":_id})
+	})
+	Admin.POST("/menu", Menu)
+	Admin.POST("/menu/save",MenuSave)
+	Admin.POST("/menu/data",MenuData)
+	Admin.POST("/menu/searchbyid", MenuSearchById)
+	Admin.POST("/menu/del", MenuDel)
+	Admin.POST("/role/menu/data",RoleMenuData)
+	Admin.POST("/role/menu/save",RoleMenuSave)
+	Admin.POST("/role/select",RoleSelect)
+	Admin.POST("/role/secondmenu/data",RoleSecondMenuData)
+	Admin.POST("/role/menu/del",RoleMenuDel)
+	Admin.POST("/role/secondmenu/del",RoleSecondMenuDel)
+	Admin.POST("/secondmenu/data",SecondMenuData)
+	Admin.POST("/secondmenu/save",SecondMenuSave)
+	Admin.POST("/secondmenu/searchbyid", SecondMenuSearchById)
+	Admin.POST("/secondmenu/del", SecondMenuDel)
 	Admin.POST("/user/data", User)
 	Admin.POST("/user/save", UserSave)
 	Admin.POST("/user/searchbyid", UserSearchById)
@@ -28,7 +66,197 @@ func User(c *gin.Context) {
 	data, _ := Mgo.Find("user", `{}`, nil, nil, false, -1, -1)
 	c.JSON(200, gin.H{"data": data})
 }
+func MenuData(c *gin.Context) {
+	data, _ := Mgo.Find("menu", `{}`, nil, nil, false, -1, -1)
+	c.JSON(200, gin.H{"data": data})
+}
+func SecondMenuData(c *gin.Context) {
+	_id,_:= c.GetPostForm("_id")
+	maps:=map[string]interface{}{
+		"menuid":_id,
+	}
+	data, _ := Mgo.Find("secondmenu",maps, nil, nil, false, -1, -1)
+	c.JSON(200, gin.H{"data": data})
+}
+func RoleMenuData(c *gin.Context) {
+	role,_:=c.GetPostForm("role")
+	maps := map[string]interface{}{
+		"role."+role: true,
+	}
+	datas, _ := Mgo.Find("menu",maps, nil, nil, false, -1, -1)
+	list:=[]map[string]interface{}{}
+	for _,value:= range *datas{
+		_id:=qu.BsonIdToSId(value["_id"])
+		maps:=map[string]interface{}{
+			"menuid": _id,
+		}
+		count, _ := Mgo.Find("secondmenu",maps, nil, nil, false, -1, -1)
+		if len(*count)!=0{
+			value["secondmenu"]=true
+		}else{
+			value["secondmenu"]=false
+		}
+		list=append(list,value)
+	}
+	c.JSON(200, gin.H{"data": list})
+}
+func RoleMenuSave(c *gin.Context){
+	menu,_:=c.GetPostForm("menu")
+	secondmenuStr, _ := c.GetPostForm("secondmenuStr")
+	role,_:=c.GetPostForm("role")
+	secondmenus := make([]string, 0)
+	err := json.Unmarshal([]byte(secondmenuStr), &secondmenus)
+	if err == nil && len(secondmenus) > 0 {
+		for _, v := range secondmenus {
+			maps:=map[string]interface{}{
+				"_id":bson.ObjectIdHex(v),
+			}
+			data:=map[string]interface{}{
+				"role."+role:true,
+			}
+			data2:=map[string]interface{}{
+				"$set":data,
+			}
+			Mgo.Update("secondmenu", maps, data2, true, false)
+		}
+	}
+	maps:=map[string]interface{}{
+		"_id":bson.ObjectIdHex(menu),
+	}
+	data:=map[string]interface{}{
+		"role."+role:true,
+	}
+	data2:=map[string]interface{}{
+		"$set":data,
+	}
+	b:=Mgo.Update("menu", maps, data2, true, false)
+	c.JSON(200, gin.H{"rep": b})
+}
+func RoleSelect(c *gin.Context){
+	menuid,_:=c.GetPostForm("_id")
+	maps := map[string]interface{}{
+		"menuid":menuid,
+	}
+	datas, _ := Mgo.Find("secondmenu",maps, nil, nil, false, -1, -1)
+	c.JSON(200, gin.H{"data": datas})
+}
+func RoleSecondMenuData(c *gin.Context) {
+	role,_:=c.GetPostForm("role")
+	_id,_:=c.GetPostForm("_id")
+	maps := map[string]interface{}{
+		"menuid":_id,
+		"role."+role: true,
+	}
+	datas, _ := Mgo.Find("secondmenu",maps, nil, nil, false, -1, -1)
 
+	c.JSON(200, gin.H{"data": datas})
+}
+func Menu(c *gin.Context) {
+	//管理员0,审核员1.开发员2,超级管理3
+	session := sessions.Default(c)
+	role:=session.Get("role").(string)
+	maps:=map[string]interface{}{
+	}
+	if role=="3"{
+		maps=map[string]interface{}{
+		}
+	}else {
+		maps = map[string]interface{}{
+			"role." + role: true,
+		}
+	}
+	data, _ := Mgo.Find("menu", maps, nil, nil, false, -1, -1)
+	list:=[]map[string]interface{}{}
+	for _,value:=range *data{
+		_id:=value["_id"]
+		if role=="3"{
+			maps=map[string]interface{}{
+				"menuid":qu.BsonIdToSId(_id),
+			}
+		}else {
+			maps = map[string]interface{}{
+				"role." + role: true,
+				"menuid":qu.BsonIdToSId(_id),
+			}
+		}
+		secdatas, _ := Mgo.Find("secondmenu", maps, nil, nil, false, -1, -1)
+		secmenumap:=map[string]interface{}{}
+		for index,secdata:=range *secdatas{
+			secmenumap[strconv.Itoa(index+1)]=secdata
+		}
+		if len(secmenumap)!=0{
+			value["secondmenu"]=secmenumap
+		}
+		list=append(list,value)
+	}
+	c.JSON(200, gin.H{"data": list,"role":role})
+}
+func MenuSave(c *gin.Context) {
+	name, _ := c.GetPostForm("name")
+	href, _ := c.GetPostForm("href")
+	pic, _ := c.GetPostForm("pic")
+	_id,_:=c.GetPostForm("_id")
+	data := map[string]interface{}{
+	}
+	if _id==""{
+		data = map[string]interface{}{
+			"name": name,
+			"href":   href,
+			"pic":  pic,
+		}
+		b:=Mgo.Save("menu",data)
+		c.JSON(200, gin.H{"rep": b})
+	}else{
+		data = map[string]interface{}{
+			"name": name,
+			"href":   href,
+			"pic":  pic,
+		}
+		data2:=map[string]interface{}{
+			"$set":data,
+		}
+		maps:=map[string]interface{}{
+			"_id":bson.ObjectIdHex(_id),
+		}
+		b := Mgo.Update("menu", maps, data2, true, false)
+		c.JSON(200, gin.H{"rep": b})
+	}
+
+}
+func SecondMenuSave(c *gin.Context) {
+	name, _ := c.GetPostForm("name")
+	href, _ := c.GetPostForm("href")
+	pic, _ := c.GetPostForm("pic")
+	_id, _ := c.GetPostForm("_id")
+	menuid, _ := c.GetPostForm("menuid")
+	data := map[string]interface{}{
+	}
+	if _id==""{
+		data = map[string]interface{}{
+			"name": name,
+			"href":   href,
+			"pic":  pic,
+			"menuid":menuid,
+		}
+		b:=Mgo.Save("secondmenu",data)
+		c.JSON(200, gin.H{"rep": b})
+	}else {
+		data = map[string]interface{}{
+			"name":   name,
+			"href":   href,
+			"pic":    pic,
+		}
+		data2:=map[string]interface{}{
+			"$set":data,
+		}
+		maps:=map[string]interface{}{
+			"_id":bson.ObjectIdHex(_id),
+		}
+		b := Mgo.Update("secondmenu",maps, data2, true, false)
+		c.JSON(200, gin.H{"rep": b})
+	}
+
+}
 func UserSave(c *gin.Context) {
 	email, _ := c.GetPostForm("email")
 	pwd, _ := c.GetPostForm("pwd")
@@ -51,13 +279,75 @@ func UserSearchById(c *gin.Context) {
 	(*data)["pwd"] = Se.DecodeString((*data)["pwd"].(string))
 	c.JSON(200, gin.H{"rep": data})
 }
+func MenuSearchById(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	data, _ := Mgo.FindById("menu", _id, nil)
+	c.JSON(200, gin.H{"rep": data})
+}
+func SecondMenuSearchById(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	data, _ := Mgo.FindById("secondmenu", _id, nil)
+	c.JSON(200, gin.H{"rep": data})
+}
 
 func UserDel(c *gin.Context) {
 	_id, _ := c.GetPostForm("_id")
 	b := Mgo.Del("user", `{"_id":"`+_id+`"}`)
 	c.JSON(200, gin.H{"rep": b})
 }
+func MenuDel(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	b := Mgo.Del("menu", `{"_id":"`+_id+`"}`)
+	c.JSON(200, gin.H{"rep": b})
+}
+func SecondMenuDel(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	b := Mgo.Del("secondmenu", `{"_id":"`+_id+`"}`)
+	c.JSON(200, gin.H{"rep": b})
+}
+func RoleMenuDel(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	role, _ := c.GetPostForm("role")
+	maps:=map[string]interface{}{
+		"_id":bson.ObjectIdHex(_id),
+	}
+	data:=map[string]interface{}{
+		"role."+role:false,
+	}
+	data2:=map[string]interface{}{
+		"$set":data,
+	}
+	b := Mgo.Update("menu", maps, data2, true, false)
+	maps=map[string]interface{}{
+		"menuid":_id,
+	}
+	count,_:=Mgo.Find("secondmenu",maps,nil,nil,false,-1,-1)
+	if len(*count)!=0{
+		for _,c:=range *count{
+			maps=map[string]interface{}{
+				"_id":c["_id"],
+			}
+			Mgo.Update("secondmenu", maps, data2, true, false)
+		}
 
+	}
+	c.JSON(200, gin.H{"rep": b})
+}
+func RoleSecondMenuDel(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	role, _ := c.GetPostForm("role")
+	maps:=map[string]interface{}{
+		"_id":bson.ObjectIdHex(_id),
+	}
+	data:=map[string]interface{}{
+		"role."+role:false,
+	}
+	data2:=map[string]interface{}{
+		"$set":data,
+	}
+	b := Mgo.Update("secondmenu", maps, data2, true, false)
+	c.JSON(200, gin.H{"rep": b})
+}
 func UserUppwd(c *gin.Context) {
 	_id, _ := c.GetPostForm("_id")
 	pwd, _ := c.GetPostForm("pwd")

+ 1 - 0
src/jy/front/front.go

@@ -32,6 +32,7 @@ func Login(c *gin.Context) {
 		(*res)["_id"] = qu.BsonIdToSId((*res)["_id"])
 		session.Set("user", res)
 		session.Set("username", (*res)["name"])
+		session.Set("role", (*res)["role"])
 		session.Save()
 		c.JSON(200, gin.H{"checked": true})
 	} else {

+ 2 - 2
src/web/res/doublebox/css/hdw.css

@@ -1,5 +1,5 @@
 
-#selectclear select { 
+#selectclear select {
 	width:190px; 
 	height:167px;
 	padding:5px;
@@ -17,7 +17,7 @@
 	margin: 1px 0px;
     padding: 4px 6px;
 }
-#selectclear .doublebox { 
+#selectclear .doublebox {
 	text-align:center; 
 }
 

+ 29 - 1
src/web/res/doublebox/js/hdw.js

@@ -34,5 +34,33 @@ $(document).ready(function(){
 	
 	//$("#remove_all").click(function(){
 	//	$("#select2 option").appendTo("#select1");
-	//});	
+	//});
+    $("#selectclear2 #right2").click(function(){
+        $("#select3 option:selected").appendTo("#select4");
+    });
+    //左移
+    $("#selectclear2 #left2").click(function(){
+        $("#select4 option:selected").appendTo("#select3");
+    });
+    //上移下移
+    $("#selectclear2 #up2,#selectclear2 #down2").click(function() {
+        var $opt = $("#select4 option:selected:first");
+        if (!$opt.length){
+            return;
+        }
+        if (this.id == "up2"){
+            $opt.prev().before($opt);
+        }else{
+            $opt.next().after($opt);
+        }
+    });
+
+    //双击右移
+    $("#selectclear2 #select3").dblclick(function(){
+        $("#selectclear2 #select3 option:selected").appendTo("#select4");
+    });
+    //双击左移
+    $("#selectclear2 #select4").dblclick(function(){
+        $("#selectclear2 #select4 option:selected").appendTo("#select3");
+    });
 });

+ 49 - 20
src/web/templates/admin/com_memu.html

@@ -1,10 +1,10 @@
 {{ define "memu" }}
 <aside class="main-sidebar">
     <section class="sidebar">
-      <ul class="sidebar-menu" data-widget="tree">
+      <ul id="menu" class="sidebar-menu" data-widget="tree">
         <li class="header">HEADER</li>
         <!-- Optionally, you can add icons to the links -->
-		<li class="treeview">
+		<!--<li class="treeview">
           	<a href="#"><i class="fa fa-clock-o"></i> <span>任务管理</span>
             <span class="pull-right-container">
                 <i class="fa fa-angle-left pull-right"></i>
@@ -12,22 +12,10 @@
           	</a>
           	<ul class="treeview-menu">
 	            <li><a href="/admin/task"><i class="fa fa-link"></i>抽取任务</a></li>
-				<li><a href="/admin/taskclear"><i class="fa fa-link"></i>清理任务</a></li>
 				<li><a href="/admin/task/export"><i class="fa fa-link"></i>导出任务</a></li>
 			</ul>
-        </li>
-		<li class="treeview">
-          	<a href="#"><i class="fa fa-clock-o"></i> <span>版本管理</span>
-            <span class="pull-right-container">
-                <i class="fa fa-angle-left pull-right"></i>
-            </span>
-          	</a>
-          	<ul class="treeview-menu">
-	            <li><a href="/admin/version"><i class="fa fa-link"></i>抽取版本</a></li>
-				<li><a href="/admin/versionclear"><i class="fa fa-link"></i>清理版本</a></li>
-			</ul>
-        </li>
-		<!--<li><a href="/admin/version"><i class="fa fa-navicon"></i><span>版本管理</span></a></li>-->
+        </li>-->
+		<!--<li><a href="/admin/version"><i class="fa fa-navicon"></i><span>版本管理</span></a></li>
 		<li><a href="/admin/audit/recogfield"><i class="fa fa-navicon"></i><span>质量审核</span></a></li>
 		<li class="treeview">
           	<a href="#"><i class="fa fa-laptop"></i> <span>统计</span>
@@ -41,11 +29,52 @@
         </li>
 		<li><a href="/admin/resulttrack"><i class="fa fa-laptop"></i>结果追踪</a></li>
         <li><a href="/admin/distribution"><i class="fa fa-laptop"></i> <span>分布式抽取</span></a></li>
-		<li><a href="/admin/user"><i class="fa fa-link"></i> <span>人员管理</span></a></li>
+		<li class="treeview">
+			<a href="/admin/user"><i class="fa fa-link"></i> <span>权限管理</span>
+			<span class="pull-right-container">
+                <i class="fa fa-angle-left pull-right"></i>
+            </span></a>
+          	<ul class="treeview-menu">
+	            <li><a href="/admin/user"><i class="fa fa-circle-o"></i>人员管理</a></li>
+				<li><a href="/admin/rule/pre"><i class="fa fa-circle-o"></i>角色管理</a></li>
+				<li><a href="/admin/rule/pre"><i class="fa fa-circle-o"></i>菜单管理</a></li>
+			</ul>
+
+		</li>-->
       </ul>
     </section>
+	<span id="role" class="hidden">{{session "role"}}</span>
 </aside>
 <script>
+$(function () {
+	$.post('/admin/menu','',function (data,status) {
+		for(var a=0;a<data.data.length;a++) {
+            var info=data.data[a]
+            console.log(info)
+		    if (info.secondmenu){
+                var str=""
+                for(var sec=1;sec<=Object.keys(info.secondmenu).length;sec++){
+                    var ro=$("#role").text()
+                    if(ro=="3" || info.secondmenu[sec.toString(10)].role[ro] ) {
+                        str = str + '<li><a href=' + info.secondmenu[sec.toString(10)].href + '><i class="' + info.secondmenu[sec.toString(10)].pic + '"></i>' + info.secondmenu[sec.toString(10)].name + '</a></li>'
+                    }
+                }
+                $('#menu').append('<li class="treeview">\n' +
+                        '          \t<a href="#"><i class="'+info.pic+'"></i> <span>'+info.name+'</span>\n' +
+                        '            <span class="pull-right-container">\n' +
+                        '                <i class="fa fa-angle-left pull-right"></i>\n' +
+                        '            </span>\n' +
+                        '          \t</a>\n' +
+                        '          \t<ul class="treeview-menu">\n' + str+
+                        '\t\t\t</ul>\n' +
+                        '        </li>')
+			}else{
+                $('#menu').append('<li><a href='+info.href+'><i class="'+info.pic+'"></i> <span>'+info.name+'</span></a></li>')
+			}
+
+        }
+    })
+})
 function menuActive(name){
 	$(".sidebar-menu").tree();
 	$(".sidebar-menu").filter(".menu-open").removeClass("menu-open");
@@ -56,9 +85,9 @@ function menuActive(name){
 			a=$(this)
 		}
 	});
-	a.parent().addClass("active");
-	a.parent().parent().parent().addClass("active");
-	a.parent().parent().parent().addClass("menu-open");
+	// a.parent().addClass("active");
+	// a.parent().parent().parent().addClass("active");
+	// a.parent().parent().parent().addClass("menu-open");
 }
 </script>
 {{ end }}

+ 203 - 0
src/web/templates/admin/menu.html

@@ -0,0 +1,203 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1>
+            <small><button type="button" class="btn btn-primary" data-toggle="modal" data-target="#modal-info" onclick="formReset()">新增菜单</button></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="/admin/menu"><i class="fa fa-dashboard"></i> 菜单管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>名字</th>
+                                <th>链接</th>
+                                <th>样式</th>
+                                <th>二级菜单</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+<div class="modal fade" id="modal-info">
+    <div class="modal-dialog">
+        <form id="userform" class="form-horizontal" role="form">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">菜单信息</h4>
+                </div>
+                <div class="modal-body">
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">菜单名称:</label>
+                        <div class="col-sm-10">
+                            <input id="name" name="name" type="text" class="form-control" placeholder="请输入名称">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">链接:</label>
+                        <div class="col-sm-10">
+                            <input id="href" name="href" type="text" class="form-control" placeholder="请输入链接">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="site" class="col-sm-2 control-label">样式:</label>
+                        <div class="col-sm-10">
+                            <input id="pic"  name="pic" type="text" class="form-control" placeholder="请输入图标样式" value="fa fa-laptop">
+                        </div>
+                    </div>
+                    <!--<div class="form-group">
+                        <label for="modify" class="col-sm-2 control-label">二级菜单:</label>
+                        <div id="secondmenu" class="col-sm-10">
+                            <input type="button" value="+" onclick="append()"></input>
+                        </div>
+                    </div>-->
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal" onclick="formReset()">取消</button>
+                    <button type="button" class="btn btn-primary" onclick="save()">保存</button>
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </form>
+        <input type="hidden" id="_id">
+
+    </div>
+    <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+    menuActive("user")
+    $(function () {
+        ttable=$('#dataTable').DataTable({
+            "paging"      : true,
+            "lengthChange": false,
+            "searching"   : true,
+            "ordering"    : true,
+            "info"        : true,
+            "autoWidth"   : false,
+            "ajax": {
+                "url": "/admin/menu/data",
+                "type": "post",
+                "data":{}
+            },
+            "language": {
+                "url": "/res/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                { "data": "name",render:function(val,a,row){
+                        return row.name}},
+                { "data": "href",render:function(val,a,row){
+                    if(row.href){
+                        return row.href
+                    }else{
+                        return ""
+                    }
+                }},
+                { "data": "pic"},
+                {"data":"secondmenu",render:function(val,a,row){
+                    return '<a class="btn btn-sm btn-success" href="/admin/secondmenu?id='+row._id+'">进入二级菜单</a>'
+                    }},
+                {"data":"_id",render:function(val,a,row){
+                        return  "<a href='#' onclick='edit(\""+val+"\")'><i class='fa fa-fw fa-edit text-yellow'></i></a> &nbsp;"+
+                                "<a href='#' onclick='del(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+                    }}
+            ]
+        });
+        //ttable.on('init.dt', function () {});
+    })
+
+    function save(){
+        na=$("#name").val()
+        href=$("#href").val()
+        pic=$("#pic").val()
+        if(na==""||pic==""){
+            alert("表单填写不完整!")
+            return false;
+        }
+        _id=$("#_id").val()
+        if (_id){
+            map={"name":na,"href":href,"pic":pic,"_id":_id}
+        }else{
+            map={"name":na,"href":href,"pic":pic}
+        }
+        $.ajax({
+            url:"/admin/menu/save",
+            type:"post",
+            data:map,
+            success:function(r){
+                if(r.rep){
+                    $("#userform")[0].reset();
+                    $("#modal-info").modal("hide");
+                    ttable.ajax.reload();
+                }else{
+                    alert("保存失败");
+                }
+            }
+        })
+    }
+
+    function edit(_id){
+        $.ajax({
+            url:"/admin/menu/searchbyid",
+            type:"post",
+            data:{"_id":_id},
+            success:function(r){
+                if(r.rep){
+                    $("#_id").val(r.rep._id)
+                    $.setForm('#userform',r.rep);
+                    $("#name").attr("disabled",false);
+                }
+            }
+        })
+        $("#modal-info").modal("show");
+    }
+    function del(_id){
+        showConfirm("确定删除?", function() {
+            $.ajax({
+                url:"/admin/menu/del",
+                type:"post",
+                data:{"_id":_id},
+                success:function(r){
+                    if(r.rep){
+                        ttable.ajax.reload();
+                    }else{
+                        showTip("删除失败", 1000, function() {});
+                    }
+                }
+            })
+        });
+    }
+    function formReset(){
+        $("#email").attr("disabled",false);
+        $("#name").attr("disabled",false);
+        $("#userform")[0].reset();
+        $("#_id").removeAttr("value")
+    }
+</script>

+ 56 - 0
src/web/templates/admin/role.html

@@ -0,0 +1,56 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+    <section class="content-header">
+        <ol class="breadcrumb">
+            <li><a href="/admin/role"><i class="fa fa-dashboard"></i> 角色管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <br>
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+
+                            <thead>
+                            <tr>
+                                <th>角色名称</th>
+                                <th>编辑</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                                <tr>
+                                    <td>管理员</td>
+                                    <td><a class="btn btn-sm btn-success" href="/admin/role/menu?role=0">编辑</a></td>
+                                </tr>
+                                <tr>
+                                    <td>审核员</td>
+                                    <td><a class="btn btn-sm btn-success" href="/admin/role/menu?role=1">编辑</a></td>
+                                </tr>
+                                <tr>
+                                    <td>开发员</td>
+                                    <td><a class="btn btn-sm btn-success" href="/admin/role/menu?role=2">编辑</a></td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+<!-- /.modal -->
+
+<!-- footer -->
+{{template "footer"}}

+ 255 - 0
src/web/templates/admin/rolemenu.html

@@ -0,0 +1,255 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+<head>
+    <style>
+
+        #selectclear2 select {
+            width:190px;
+            height:167px;
+            padding:5px;
+        }
+        #selectclear2{
+            display: flex;
+            flex-direction: row;
+        }
+        #selectclear2 .move{
+            display: flex;
+            flex-direction: column;
+            margin: 20px 25px
+        }
+        #selectclear2 .move button{
+            margin: 1px 0px;
+            padding: 4px 6px;
+        }
+        #selectclear2 .doublebox {
+            text-align:center;
+        }
+
+
+    </style>
+</head>
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1>
+            <small><button type="button" class="btn btn-primary" data-toggle="modal" data-target="#modal-info" onclick="formReset()">新增角色菜单</button></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="/admin/role"><i class="fa fa-dashboard"></i> 角色管理</a></li>
+            <li><a href="/admin/rolemenu"><i class="fa fa-dashboard"></i> 角色菜单管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>一级菜单</th>
+                                <th>二级菜单</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+<div class="modal fade" id="modal-info">
+    <div class="modal-dialog">
+        <form id="userform" class="form-horizontal" role="form">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">菜单信息</h4>
+                </div>
+                <div class="modal-body">
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">菜单名称:</label>
+                        <div class="col-sm-10">
+                            <select id="menu2" name="role" class="form-control" onclick="menu()">
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">二级菜单:</label>
+                        <div class="col-sm-10" id="selectclear2">
+                            <div class="doublebox">
+                                <select multiple="multiple" id="select3" style="overflow-x: scroll;"></select>
+                            </div>
+                            <div class="move">
+                                <button type="button" id="up2" class="btn btn-primary">上移</button>
+                                <button type="button" id="right2" class="btn btn-primary">右移</button>
+                                <button type="button" id="left2" class="btn btn-primary">左移</button>
+                                <button type="button" id="down2" class="btn btn-primary">下移</button>
+                            </div>
+                            <div class="doublebox">
+                                <select multiple="multiple" id="select4" style="overflow-x: scroll;"></select>
+                            </div>
+                        </div>
+                    </div>
+                    <!--<div class="form-group">
+                        <label for="modify" class="col-sm-2 control-label">二级菜单:</label>
+                        <div id="secondmenu" class="col-sm-10">
+                            <input type="button" value="+" onclick="append()"></input>
+                        </div>
+                    </div>-->
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal" onclick="formReset()">取消</button>
+                    <button type="button" class="btn btn-primary" onclick="save()">保存</button>
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </form>
+    </div>
+    <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+    menuActive("user")
+    $(function () {
+        ttable=$('#dataTable').DataTable({
+            "paging"      : true,
+            "lengthChange": false,
+            "searching"   : true,
+            "ordering"    : true,
+            "info"        : true,
+            "autoWidth"   : false,
+            "ajax": {
+                "url": "/admin/role/menu/data",
+                "type": "post",
+                "data":{"role":{{.role}}}
+            },
+            "language": {
+                "url": "/res/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                { "data": "name",render:function(val,a,row){
+                        return row.name}},
+                {"data":"_id",render:function (val,a,row) {
+                        if (row.secondmenu) {
+                            role={{.role}}
+                            return '<a class="btn btn-sm btn-success" href="/admin/role/secondmenu?_id=' + row._id + '&role='+role+'">进入二级菜单</a>'
+                        }else{
+                            return "无二级菜单"
+                        }
+                }},
+                {"data":"_id",render:function(val,a,row){
+                        return "<a href='#' onclick='del(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+                    }}
+            ]
+        });
+        //ttable.on('init.dt', function () {});
+    })
+    function menu() {
+        console.log($("#menu2").val())
+        $("#select3").empty();
+        $("#select4").empty();
+        $.post("/admin/role/select",{"_id":$("#menu2").val()},function (data,status) {
+            if(data.data){
+                for(var a=0;a<data.data.length;a++){
+                    $("#select3").append("<option title='"+data.data[a].name+"' value='"+data.data[a]._id+"'>"+data.data[a].name+"</option>");
+                }
+            }
+        })
+    }
+    function save(){
+        menu=$("#menu2").val()
+        var clearArr = [];
+        $("#select4 option").each(function(i,val){
+            clearArr[i] = this.value
+        })
+        var secondmenuStr = JSON.stringify(clearArr)
+        if(menu == ""){
+            alert("表单填写不完整!");
+            return false;
+        }
+        $.ajax({
+            url:"/admin/role/menu/save",
+            type:"post",
+            data:{"role":{{.role}},"menu":menu,"secondmenuStr":secondmenuStr},
+            success:function(r){
+                if(r.rep){
+                    $("#userform")[0].reset();
+                    $("#modal-info").modal("hide");
+                    ttable.ajax.reload();
+                }else{
+                    alert("保存失败");
+                }
+            }
+        })
+    }
+    function del(_id){
+        showConfirm("确定删除?", function() {
+            $.ajax({
+                url:"/admin/role/menu/del",
+                type:"post",
+                data:{"_id":_id,"role":{{.role}}},
+                success:function(r){
+                    if(r.rep){
+                        ttable.ajax.reload();
+                    }else{
+                        showTip("删除失败", 1000, function() {});
+                    }
+                }
+            })
+        });
+    }
+    function formReset(){
+        $("#menu2").empty()
+        $("#select3").empty();
+        $("#select4").empty();
+        $("#menu2").append("<option value=''>--请选择--</option>")
+        $.post("/admin/menu/data",'',function (data,status) {
+            for(var a=0;a<data.data.length;a++) {
+                console.log(a)
+                $("#menu2").append("<option value="+data.data[a]._id+">"+data.data[a].name+"</option>")
+            }
+        })
+        $("#modal-info-addclear").modal("show");
+    }
+    $("#selectclear2 #right2").click(function(){
+        $("#select3 option:selected").appendTo("#select4");
+    });
+    //左移
+    $("#selectclear2 #left2").click(function(){
+        $("#select4 option:selected").appendTo("#select3");
+    });
+    $("#selectclear2 #up2,#selectclear2 #down2").click(function() {
+        var $opt = $("#select4 option:selected:first");
+        if (!$opt.length){
+            return;
+        }
+        if (this.id == "up2"){
+            $opt.prev().before($opt);
+        }else{
+            $opt.next().after($opt);
+        }
+    });
+    //双击右移
+    $("#selectclear2 #select3").dblclick(function(){
+        $("#selectclear2 #select3 option:selected").appendTo("#select4");
+    });
+    //双击左移
+    $("#selectclear2 #select4").dblclick(function(){
+        $("#selectclear2 #select4 option:selected").appendTo("#select3");
+    });
+</script>

+ 123 - 0
src/web/templates/admin/rolesecondmenu.html

@@ -0,0 +1,123 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+    <section class="content-header">
+        <ol class="breadcrumb">
+            <li><a href="/admin/role"><i class="fa fa-dashboard"></i> 角色管理</a></li>
+            <li><a href="/admin/rolemenu"><i class="fa fa-dashboard"></i> 角色菜单管理</a></li>
+            <li><a href="/admin/rolesecondmenu"><i class="fa fa-dashboard"></i> 角色二级菜单管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>名字</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+    menuActive("user")
+    $(function () {
+        ttable=$('#dataTable').DataTable({
+            "paging"      : true,
+            "lengthChange": false,
+            "searching"   : true,
+            "ordering"    : true,
+            "info"        : true,
+            "autoWidth"   : false,
+            "ajax": {
+                "url": "/admin/role/secondmenu/data",
+                "type": "post",
+                "data":{"role":{{.role}},"_id":{{._id}}}
+            },
+            "language": {
+                "url": "/res/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                { "data": "name",render:function(val,a,row){
+                        return row.name}},
+                {"data":"_id",render:function(val,a,row){
+                        return "<a href='#' onclick='del(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+                    }}
+            ]
+        });
+        //ttable.on('init.dt', function () {});
+    })
+
+    function save(){
+        na=$("#name").val()
+        href=$("#href").val()
+        pic=$("#pic").val()
+        if(na==""||pic==""){
+            alert("表单填写不完整!")
+            return false;
+        }
+        _id=$("#_id").val()
+        if (_id){
+            map={"name":na,"href":href,"pic":pic,"_id":_id}
+        }else{
+            map={"name":na,"href":href,"pic":pic}
+        }
+        $.ajax({
+            url:"/admin/menu/save",
+            type:"post",
+            data:map,
+            success:function(r){
+                if(r.rep){
+                    $("#userform")[0].reset();
+                    $("#modal-info").modal("hide");
+                    ttable.ajax.reload();
+                }else{
+                    alert("保存失败");
+                }
+            }
+        })
+    }
+    function del(_id){
+        showConfirm("确定删除?", function() {
+            $.ajax({
+                url:"/admin/role/secondmenu/del",
+                type:"post",
+                data:{"_id":_id,"role":{{.role}}},
+                success:function(r){
+                    if(r.rep){
+                        ttable.ajax.reload();
+                    }else{
+                        showTip("删除失败", 1000, function() {});
+                    }
+                }
+            })
+        });
+    }
+    function formReset(){
+        $("#email").attr("disabled",false);
+        $("#name").attr("disabled",false);
+        $("#userform")[0].reset();
+        $("#_id").removeAttr("value")
+    }
+</script>

+ 194 - 0
src/web/templates/admin/secondmenu.html

@@ -0,0 +1,194 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1>
+            <small><button type="button" class="btn btn-primary" data-toggle="modal" data-target="#modal-info" onclick="formReset()">新增二级菜单</button></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="/admin/secondmenu?id={{._id}}"><i class="fa fa-dashboard"></i> 二级菜单管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>名字</th>
+                                <th>链接</th>
+                                <th>样式</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+<div class="modal fade" id="modal-info">
+    <div class="modal-dialog">
+        <form id="userform" class="form-horizontal" role="form">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">二级菜单信息</h4>
+                </div>
+                <div class="modal-body">
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">菜单名称:</label>
+                        <div class="col-sm-10">
+                            <input id="name" name="name" type="text" class="form-control" placeholder="请输入名称">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">链接:</label>
+                        <div class="col-sm-10">
+                            <input id="href" name="href" type="text" class="form-control" placeholder="请输入链接">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="site" class="col-sm-2 control-label">样式:</label>
+                        <div class="col-sm-10">
+                            <input id="pic"  name="pic" type="text" class="form-control" placeholder="请输入图标样式" value="fa fa-circle-o">
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal" onclick="formReset()">取消</button>
+                    <button type="button" class="btn btn-primary" onclick="save()">保存</button>
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </form>
+        <input type="hidden" id="_id">
+    </div>
+    <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+    menuActive("user")
+    $(function () {
+        ttable=$('#dataTable').DataTable({
+            "paging"      : true,
+            "lengthChange": false,
+            "searching"   : true,
+            "ordering"    : true,
+            "info"        : true,
+            "autoWidth"   : false,
+            "ajax": {
+                "url": "/admin/secondmenu/data",
+                "type": "post",
+                "data":{"_id":{{._id}}}
+            },
+            "language": {
+                "url": "/res/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                { "data": "name",render:function(val,a,row){
+                        return row.name}},
+                { "data": "href",render:function(val,a,row){
+                        if(row.href){
+                            return row.href
+                        }else{
+                            return ""
+                        }
+                    }},
+                { "data": "pic"},
+                {"data":"_id",render:function(val,a,row){
+                        return  "<a href='#' onclick='edit(\""+val+"\")'><i class='fa fa-fw fa-edit text-yellow'></i></a> &nbsp;"+
+                                "<a href='#' onclick='del(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+                    }}
+
+            ]
+        });
+        //ttable.on('init.dt', function () {});
+    })
+    count=0
+
+    function save(){
+        na=$("#name").val()
+        href=$("#href").val()
+        pic=$("#pic").val()
+        if(na==""||href==""||pic==""){
+            alert("表单填写不完整!")
+            return false;
+        }
+        _id=$("#_id").val()
+        if (_id){
+            map={"name":na,"href":href,"pic":pic,"_id":_id,"menuid":{{._id}}}
+        }else{
+            map={"name":na,"href":href,"pic":pic,"menuid":{{._id}}}
+        }
+        $.ajax({
+            url:"/admin/secondmenu/save",
+            type:"post",
+            data:map,
+            success:function(r){
+                if(r.rep){
+                    $("#userform")[0].reset();
+                    $("#modal-info").modal("hide");
+                    ttable.ajax.reload();
+                }else{
+                    alert("保存失败");
+                }
+            }
+        })
+    }
+
+    function edit(_id){
+        $.ajax({
+            url:"/admin/secondmenu/searchbyid",
+            type:"post",
+            data:{"_id":_id},
+            success:function(r){
+                if(r.rep){
+                    $("#_id").val(r.rep._id)
+                    $.setForm('#userform',r.rep);
+                    $("#name").attr("disabled",false);
+                }
+            }
+        })
+        $("#modal-info").modal("show");
+    }
+    function del(_id){
+        showConfirm("确定删除?", function() {
+            $.ajax({
+                url:"/admin/secondmenu/del",
+                type:"post",
+                data:{"_id":_id},
+                success:function(r){
+                    if(r.rep){
+                        ttable.ajax.reload();
+                    }else{
+                        showTip("删除失败", 1000, function() {});
+                    }
+                }
+            })
+        });
+    }
+    function formReset(){
+        $("#email").attr("disabled",false);
+        $("#name").attr("disabled",false);
+        $("#userform")[0].reset();
+        $("#_id").removeAttr("value")
+    }
+</script>

+ 6 - 4
src/web/templates/admin/user.html

@@ -124,8 +124,10 @@ $(function () {
 					role="开发员"
 				}else if(val==1){
 					role="审核员"
-				}else{
-					role="管理员"
+				}else if(val==0){
+                    role="管理员"
+                }else{
+					role="超级管理员"
 				}
 				return role
 			}},
@@ -140,9 +142,9 @@ $(function () {
 function save(){
 	email=$("#email").val()
 	pwd=$("#pwd").val()
-	name=$("#name").val()
+	na=$("#name").val()
 	role=$("#role").val()
-	if(email==""||name==""||role==""||pwd==""){
+	if(email==""||na==""||role==""||pwd==""){
 		alert("表单填写不完整!")
 		return false;
 	}