权限管理
diff --git a/src/main/resources/static/custom/css/admin.css b/src/main/resources/static/custom/css/admin.css
index 608c847..29547ad 100755
--- a/src/main/resources/static/custom/css/admin.css
+++ b/src/main/resources/static/custom/css/admin.css
@@ -702,3 +702,100 @@
     padding: 0;
     overflow: hidden;
 }
+
+@-webkit-keyframes layui-rl {
+    from {
+        -webkit-transform: translate3d(100%,0,0)
+    }
+
+    to {
+        -webkit-transform: translate3d(0,0,0)
+    }
+}
+
+@keyframes layui-rl {
+    from {
+        transform: translate3d(100%,0,0)
+    }
+
+    to {
+        transform: translate3d(0,0,0)
+    }
+}
+
+.layui-anim-rl {
+    -webkit-animation-name: layui-rl;
+    animation-name: layui-rl
+}
+
+@-webkit-keyframes layui-lr {
+    from {
+        -webkit-transform: translate3d(0 0,0);
+        opacity: 1
+    }
+
+    to {
+        -webkit-transform: translate3d(100%,0,0);
+        opacity: 1
+    }
+}
+
+@keyframes layui-lr {
+    from {
+        transform: translate3d(0,0,0)
+    }
+
+    to {
+        transform: translate3d(100%,0,0)
+    }
+}
+
+.layui-anim-lr,.layui-anim-rl.layer-anim-close {
+    -webkit-animation-name: layui-lr;
+    animation-name: layui-lr
+}
+
+.layadmin-tips {
+    margin-top: 30px;
+    text-align: center
+}
+
+.layadmin-tips .layui-icon[face] {
+    display: inline-block;
+    font-size: 300px;
+    color: #393D49
+}
+
+.layadmin-tips .layui-text {
+    width: 500px;
+    margin: 30px auto;
+    padding-top: 20px;
+    border-top: 5px solid #009688;
+    font-size: 16px
+}
+
+.layadmin-tips h1 {
+    font-size: 100px;
+    line-height: 100px;
+    color: #009688
+}
+
+.layadmin-tips .layui-text .layui-anim {
+    display: inline-block
+}
+
+@media screen and (max-width: 768px) {
+    .layadmin-panel-selection {
+        margin:0;
+        width: auto
+    }
+
+    .layui-body .layui-nav .layui-nav-item {
+        display: block
+    }
+
+    .layui-layout-admin .layui-body .layadmin-tabsbody-item {
+        -webkit-overflow-scrolling: touch;
+        overflow: auto
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/static/custom/module/admin.js b/src/main/resources/static/custom/module/admin.js
index 898ce05..344c44d 100755
--- a/src/main/resources/static/custom/module/admin.js
+++ b/src/main/resources/static/custom/module/admin.js
@@ -145,7 +145,8 @@
                 successCallback(result, status, xhr);

             };

             param.error = function (xhr) {

-                param.success({code: xhr.status, msg: xhr.statusText});

+                //{code: xhr.status, msg: xhr.statusText}

+                param.success(xhr.responseText,xhr.status,xhr);

             };

             $.ajax(param);

         },

diff --git a/src/main/resources/templates/error/403.html b/src/main/resources/templates/error/403.html
new file mode 100755
index 0000000..155f35a
--- /dev/null
+++ b/src/main/resources/templates/error/403.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>

+<html xmlns:th="http://www.thymeleaf.org" >

+<head>

+  <meta charset="utf-8">

+  <title>403 无权限</title>

+  <meta name="renderer" content="webkit">

+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">

+  <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}" media="all"/>

+  <link rel="stylesheet" th:href="@{/static/custom/css/admin.css}" media="all"/>

+</head>

+<body>

+<div class="layui-fluid">

+  <div class="layadmin-tips">

+    <i class="layui-icon" face>&#xe664;</i>

+    <div class="layui-text">

+      <p>没有权限</p>

+      <h1>

+        <span class="layui-anim layui-anim-loop layui-anim-">4</span> 

+        <span class="layui-anim layui-anim-loop layui-anim-rotate">0</span> 

+        <span class="layui-anim layui-anim-loop layui-anim-">3</span>

+      </h1>

+    </div>

+  </div>

+</div>

+</body>

+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/error/404.html b/src/main/resources/templates/error/404.html
new file mode 100755
index 0000000..89144f5
--- /dev/null
+++ b/src/main/resources/templates/error/404.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>

+<html xmlns:th="http://www.thymeleaf.org" >

+<head>

+  <meta charset="utf-8">

+  <title>404 页面不存在</title>

+  <meta name="renderer" content="webkit">

+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">

+  <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}" media="all"/>

+  <link rel="stylesheet" th:href="@{/static/custom/css/admin.css}" media="all"/>

+</head>

+<body>

+

+<div class="layui-fluid">

+  <div class="layadmin-tips">

+    <i class="layui-icon" face>&#xe664;</i>

+    <div class="layui-text">

+      <p>页面不存在</p>

+      <h1>

+        <span class="layui-anim layui-anim-loop layui-anim-">4</span> 

+        <span class="layui-anim layui-anim-loop layui-anim-rotate">0</span> 

+        <span class="layui-anim layui-anim-loop layui-anim-">4</span>

+      </h1>

+    </div>

+  </div>

+</div>

+</body>

+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/error/500.html b/src/main/resources/templates/error/500.html
new file mode 100755
index 0000000..c46acd2
--- /dev/null
+++ b/src/main/resources/templates/error/500.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>

+<html xmlns:th="http://www.thymeleaf.org" >

+<head>

+  <meta charset="utf-8">

+  <title>500 服务出错</title>

+  <meta name="renderer" content="webkit">

+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">

+  <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}" media="all"/>

+  <link rel="stylesheet" th:href="@{/static/custom/css/admin.css}" media="all"/>

+</head>

+<body>

+

+<div class="layui-fluid">

+  <div class="layadmin-tips">

+    <i class="layui-icon" face>&#xe664;</i>

+    <div class="layui-text">

+      <p>服务器出错了</p>

+      <h1>

+        <span class="layui-anim layui-anim-loop layui-anim-">5</span>

+        <span class="layui-anim layui-anim-loop layui-anim-rotate">0</span> 

+        <span class="layui-anim layui-anim-loop layui-anim-">0</span>

+      </h1>

+    </div>

+  </div>

+</div>

+</body>

+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html
index a66007c..7dec8c5 100755
--- a/src/main/resources/templates/index.html
+++ b/src/main/resources/templates/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html>

-<html xmlns:th="http://www.thymeleaf.org">

+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

 

 <head>

     <title>首页</title>

@@ -73,7 +73,10 @@
                         <dd th:each="subMenu : ${menu.subMenus}">

                             <a th:lay-href="${subMenu.menuUrl}">[[${subMenu.menuName}]]</a>

                             <dl class="layui-nav-child" th:if="${subMenu.subMenus.size()} > 0">

-                                <dd th:each="temp : ${subMenu.subMenus}"><a th:lay-href="${temp.menuUrl}">[[${temp.menuName}]]</a>

+                                <dd th:each="temp : ${subMenu.subMenus}"><a th:lay-href="${temp.menuUrl}">

+                                    <i th:class="'layui-icon '+${temp.menuIcon}"></i>

+                                    [[${temp.menuName}]]

+                                  </a>

                                 </dd>

                             </dl>

                         </dd>

@@ -144,7 +147,6 @@
     });

 </script>

 

-

 <script>

     layui.use(['index'], function () {

         var index = layui.index;

diff --git a/src/main/resources/templates/system/function/form.html b/src/main/resources/templates/system/function/form.html
new file mode 100755
index 0000000..cd67f9f
--- /dev/null
+++ b/src/main/resources/templates/system/function/form.html
@@ -0,0 +1,43 @@
+<div class="layui-form" lay-filter="layuiadmin-form-role" id="function-form" style="padding: 20px 30px 0 0;">

+    <div class="layui-form-item">

+        <label class="layui-form-label">角色</label>

+        <div class="layui-input-block">

+            <select name="rolename">

+                <option value="0">管理员</option>

+                <option value="1">超级管理员</option>

+                <option value="2">纠错员</option>

+                <option value="3">采购员</option>

+                <option value="4">推销员</option>

+                <option value="5">运营人员</option>

+                <option value="6">编辑</option>

+            </select>

+        </div>

+    </div>

+    <div class="layui-form-item">

+        <label class="layui-form-label">权限范围</label>

+        <div class="layui-input-block">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="内容系统">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="社区系统">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="用户">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="角色">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="评论审核">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="发货">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="采购">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="系统设置">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="发邮件">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="发短信">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="审核">

+            <input type="checkbox" name="limits[]" lay-skin="primary" title="删库跑路">

+        </div>

+    </div>

+    <div class="layui-form-item">

+        <label class="layui-form-label">具体描述</label>

+        <div class="layui-input-block">

+            <textarea type="text" name="descr" lay-verify="required" autocomplete="off"

+                      class="layui-textarea"></textarea>

+        </div>

+    </div>

+    <div class="layui-form-item layui-hide">

+        <button class="layui-btn" lay-submit lay-filter="LAY-user-role-submit" id="LAY-user-role-submit">提交</button>

+    </div>

+</div>

diff --git a/src/main/resources/templates/system/function/index.html b/src/main/resources/templates/system/function/index.html
new file mode 100755
index 0000000..afcda4c
--- /dev/null
+++ b/src/main/resources/templates/system/function/index.html
@@ -0,0 +1,170 @@
+<div class="layui-card">

+    <div class="layui-card-header">

+        <h2 class="header-title">功能维护</h2>

+        <span class="layui-breadcrumb pull-right">

+          <a href="#!_operator_index">系统中心</a>

+          <a><cite>功能维护</cite></a>

+        </span>

+    </div>

+    <div class="layui-card-body">

+        <div class="layui-form toolbar">

+            搜索:

+            <input id="search-value" class="layui-input search-input" type="text" placeholder="输入功能名称"/>&emsp;

+            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索</button>

+            <button id="btn-add" class="layui-btn icon-btn" data-type="add" ><i class="layui-icon"></i>添加

+            </button>

+        </div>

+        <table class="layui-table" id="table"></table>

+    </div>

+</div>

+

+<!-- 表格操作列 -->

+<script type="text/html" id="table-bar">

+    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a>

+    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-set-sm"></i>维护资源</a>

+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>

+</script>

+

+<script>

+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {

+        var form = layui.form;

+        var table = layui.table;

+        var layer = layui.layer;

+        var admin = layui.admin;

+        var element = layui.element;

+

+        form.render('select');

+

+        // 渲染表格

+        table.render({

+            elem: '#table',

+            url: '/function/list',

+            page: true,

+            cols: [

+                [

+                    {field: 'id', title: '功能ID', fixed: 'left', sort: true},

+                    {field: 'name', title: '功能名称', sort: true},

+                    {

+                        field: 'isLeaf', title: '节点', sort: true, width: 80, align: 'center', templet: function (item) {

+                            if (item.isLeaf == 0) {

+                                return '<span class="layui-badge ">父</span>'

+                            } else if (item.isLeaf == 1) {

+                                return '<span class="layui-badge layui-bg-green">子</span>'

+                            } else {

+                                return ''

+                            }

+                        }

+                    },

+                    {field: 'menuUrl', title: '路径'},

+                    {field: 'orderNum', sort: true, title: '序号'},

+                    {field: 'menuIcon', title: '图标',align: 'center', templet: function (item) {

+                            return '<i class="layui-icon '+item.menuIcon+'"></i> '

+                        }

+                    },

+                    {field:'id',align: 'center', toolbar: '#table-bar', title: '操作', fixed: 'right'}

+                ]

+            ]

+        });

+        // 搜索按钮点击事件

+        $('#btn-search').click(function () {

+            var key = $('#search-value').val();

+            table.reload('table', {where: {searchkey: key}, page: {curr: 1}});

+        });

+        $('#btn-add').click(function () {

+            layer.open({

+                type: 1

+                ,title: '添加功能'

+                ,content: 'form.html'

+                ,maxmin: true

+                ,area: ['500px', '450px']

+                ,btn: ['确定', '取消']

+                ,yes: function(index, layero){

+                    var iframeWindow = window['layui-layer-iframe'+ index]

+                        ,submitID = 'LAY-user-front-submit'

+                        ,submit = layero.find('iframe').contents().find('#'+ submitID);

+

+                    //监听提交

+                    iframeWindow.layui.form.on('submit('+ submitID +')', function(data){

+                        var field = data.field; //获取提交的字段

+                        //提交 Ajax 成功后,静态更新表格中的数据

+                        //$.ajax({});

+                        table.reload('table');

+                        layer.close(index); //关闭弹层

+                    });

+

+                    submit.trigger('click');

+                }

+            });

+        });

+        // 显示表单弹窗

+        var showEditModel = function (data) {

+            var title = data ? '修改用户' : '添加用户';

+            admin.putTempData('t_user', data);

+            admin.popupCenter({

+                title: title,

+                path: '/operator/load4add',

+                finish: function () {

+                    table.reload('oper-table', {});

+                }

+            });

+        };

+

+        // 工具条点击事件

+        table.on('tool(user-table)', function (obj) {

+            console.log(obj);

+            var data = obj.data;

+            var layEvent = obj.event;

+

+            if (layEvent === 'edit') { // 修改

+                showEditModel(data);

+            } else if (layEvent === 'reset') { // 重置密码

+                layer.confirm('确定重置此用户的密码吗?', function (i) {

+                    layer.close(i);

+                    layer.load(2);

+                    admin.go('/system/user/restPsw', {

+                        userId: obj.data.userId

+                    }, function (data) {

+                        console.log(data.code);

+                        layer.closeAll('loading');

+                        if (data.code == 200) {

+                            layer.msg(data.msg, {icon: 1});

+                        } else if (data.code == 401) {

+                            layer.msg(data.msg, {icon: 2, time: 1500}, function () {

+                                location.replace('/login');

+                            }, 1000);

+                            return;

+                        }

+                        else {

+                            layer.msg(data.msg, {icon: 2});

+                        }

+                    });

+                });

+            }

+        });

+

+        // 修改user状态

+        form.on('switch(user-tpl-state)', function (obj) {

+            layer.load(2);

+            admin.go('/system/user/updateState', {

+                userId: obj.elem.value,

+                state: obj.elem.checked ? 0 : 1

+            }, function (data) {

+                layer.closeAll('loading');

+                if (data.code == 200) {

+                    layer.msg(data.msg, {icon: 1});

+                    //table.reload('table-user', {});

+                } else if (data.code == 401) {

+                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {

+                        location.replace('/login');

+                    }, 1000);

+                    return;

+                } else {

+                    layer.msg(data.msg, {icon: 2});

+                    $(obj.elem).prop('checked', !obj.elem.checked);

+                    form.render('checkbox');

+                }

+            });

+        });

+

+    });

+</script>

diff --git a/src/main/resources/templates/system/operator/index.html b/src/main/resources/templates/system/operator/index.html
index 279a2ed..1f6dad4 100644
--- a/src/main/resources/templates/system/operator/index.html
+++ b/src/main/resources/templates/system/operator/index.html
@@ -17,7 +17,8 @@
             </select>&emsp;
             <input id="oper-search-value" class="layui-input search-input" type="text" placeholder="输入关键字"/>&emsp;
             <button id="oper-btn-search" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索</button>
-            <button id="oper-btn-add" class="layui-btn icon-btn" lay-tips="新用户密码为123456"><i
+            <button id="oper-btn-add" class="layui-btn icon-btn" lay-tips="新用户密码为123456"
+                    sec:authorize="hasPermission('/operator/load4add','query')" ><i
                     class="layui-icon">&#xe654;</i>添加
             </button>
         </div>