防止sql注入,xss攻击
diff --git a/payapi/src/main/resources/application.properties b/payapi/src/main/resources/application.properties
index cee20f1..17217f9 100644
--- a/payapi/src/main/resources/application.properties
+++ b/payapi/src/main/resources/application.properties
@@ -23,6 +23,11 @@
 spring.thymeleaf.mode=HTML5
 spring.thymeleaf.cache=false
 spring.thymeleaf.enabled=true
+################## 全局字符编码设置 ######################
+spring.http.encoding.force=true
+spring.http.encoding.charset=UTF-8
+spring.http.encoding.enabled=true
+server.tomcat.uri-encoding=UTF-8
 ##################################################
 ## quartz task scheduler
 shopbalance.updater.cron=10/* * * * *
diff --git a/payapi/src/main/resources/static/custom/module/admin.js b/payapi/src/main/resources/static/custom/module/admin.js
index cbdbc36..1694286 100755
--- a/payapi/src/main/resources/static/custom/module/admin.js
+++ b/payapi/src/main/resources/static/custom/module/admin.js
@@ -1,387 +1,399 @@
-layui.define(['layer'], function (exports) {
-    var layer = layui.layer;
-    var popupRightIndex, popupCenterIndex, popupCenterParam;
-    var baseUrl = window.location.pathname;
-
-    var admin = {
-        isRefresh: false,
-        // 设置侧栏折叠
-        flexible: function (expand) {
-            var isExapnd = $('.layui-layout-admin').hasClass('admin-nav-mini');
-            if (isExapnd == !expand) {
-                return;
-            }
-            if (expand) {
-                $('.layui-layout-admin').removeClass('admin-nav-mini');
-            } else {
-                $('.layui-layout-admin').addClass('admin-nav-mini');
-            }
-        },
-        // 设置导航栏选中
-        activeNav: function (url) {
-            $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child dd').removeClass('layui-this');
-            $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item').removeClass('layui-this');
-            if (url && url != '') {
-                $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item').removeClass('layui-nav-itemed');
-                var $a = $('.layui-layout-admin .layui-side .layui-nav a[href="#!' + url + '"]');
-                $a.parent('li').addClass('layui-this');
-                $a.parent('dd').addClass('layui-this');
-                $a.parent('dd').parent('.layui-nav-child').parent('.layui-nav-item').addClass('layui-nav-itemed');
-            }
-        },
-        // 右侧弹出
-        popupRight: function (path) {
-            var param = new Object();
-            param.path = path;
-            param.id = 'adminPopupR';
-            param.title = false;
-            param.anim = 2;
-            param.isOutAnim = false;
-            param.closeBtn = false;
-            param.offset = 'r';
-            param.shadeClose = true;
-            param.area = '336px';
-            param.skin = 'layui-layer-adminRight';
-            param.end = function () {
-                layer.closeAll('tips');
-            };
-            popupRightIndex = admin.open(param);
-            return popupRightIndex;
-        },
-        // 关闭右侧弹出
-        closePopupRight: function () {
-            layer.close(popupRightIndex);
-        },
-        // 中间弹出
-        popupCenter: function (param) {
-            param.id = 'adminPopupC';
-            popupCenterParam = param;
-            popupCenterIndex = admin.open(param);
-            return popupCenterIndex;
-        },
-        // 关闭中间弹出并且触发finish回调
-        finishPopupCenter: function () {
-            layer.close(popupCenterIndex);
-            popupCenterParam.finish ? popupCenterParam.finish() : '';
-        },
-        // 关闭中间弹出
-        closePopupCenter: function () {
-            layer.close(popupCenterIndex);
-        },
-        // 封装layer.open
-        open: function (param) {
-            var sCallBack = param.success;
-            param.type = 1;
-            param.area = param.area ? param.area : '450px';
-            param.offset = param.offset ? param.offset : '120px';
-            param.resize ? param.resize : false;
-            param.shade ? param.shade : .2;
-            param.success = function (layero, index) {
-                sCallBack ? sCallBack(layero, index) : '';
-                admin.ajax({
-                    url: param.path,
-                    type: 'GET',
-                    dataType: 'html',
-                    success: function (result, status, xhr) {
-                        $(layero).children('.layui-layer-content').html(result);
-                    }
-                });
-            };
-            return layer.open(param);
-        },
-        
-        go:function(url,data,success,error){
-        	  $.ajax({
-        		  url: url,
-        		  data: data,
-        		  async: false,
-        		  dataType: 'json',
-        		  type: 'post',
-        		  success: success,
-                  error:error
-        	  })
-        },
-        dgo:function(url,data,success,error){
-      	  $.ajax({
-      		  url: url,
-      		  data: data,
-      		  async: false,
-      		  dataType: 'json',
-      		  type: 'get',
-      		  success: success,
-              error:error
-      	  })
-      },
-        // 封装ajax请求,返回数据类型为json
-        req: function (url, data, success, method) {
-            admin.ajax({
-                url: url,
-                data: data,
-                async: false,
-                type: method,
-                dataType: 'json',
-                success: success
-            });
-        },
-        // 封装ajax请求
-        ajax: function (param) {
-        	console.log(param);
-            var successCallback = param.success;
-            param.success = function (result, status, xhr) {
-                // 判断登录过期和没有权限
-                var jsonRs;
-                if ('json' == param.dataType.toLowerCase()) {
-                    jsonRs = result;
-                } else if ('html' == param.dataType.toLowerCase() || 'text' == param.dataType.toLowerCase()) {
-                    jsonRs = admin.parseJSON(result);
-                }
-                if (jsonRs) {
-                    if (jsonRs.code == 401) {
-                        layer.msg(jsonRs.msg, {icon: 2, time: 1500}, function () {
-                            location.replace('/login');
-                        }, 1000);
-                        return;
-                    } else if ('html' == param.dataType.toLowerCase() && jsonRs.code == 403) {
-                        layer.msg(jsonRs.msg, {icon: 2});
-                    }
-                }
-                successCallback(result, status, xhr);
-            };
-            param.error = function (xhr) {
-                //{code: xhr.status, msg: xhr.statusText}
-                param.success(xhr.responseText,xhr.status,xhr);
-            };
-            $.ajax(param);
-        },
-        // 显示加载动画
-        showLoading: function (element) {
-            $(element).append('<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop admin-loading"></i>');
-        },
-        // 移除加载动画
-        removeLoading: function (element) {
-            $(element + '>.admin-loading').remove();
-        },
-        // 缓存临时数据
-        putTempData: function (key, value) {
-            if (value) {
-                layui.sessionData('tempData', {key: key, value: value});
-            } else {
-                layui.sessionData('tempData', {key: key, remove: true});
-            }
-        },
-        // 获取缓存临时数据
-        getTempData: function (key) {
-            return layui.sessionData('tempData')[key];
-        },
-        // 滑动选项卡
-        rollPage: function (d) {
-            var $tabTitle = $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title');
-            var left = $tabTitle.scrollLeft();
-            if ('left' === d) {
-                $tabTitle.scrollLeft(left - 120);
-            } else if ('auto' === d) {
-                var autoLeft = 0;
-                $tabTitle.children("li").each(function () {
-                    if ($(this).hasClass('layui-this')) {
-                        return false;
-                    } else {
-                        autoLeft += $(this).outerWidth();
-                    }
-                });
-                $tabTitle.scrollLeft(autoLeft - 47);
-            } else {
-                $tabTitle.scrollLeft(left + 120);
-            }
-        },
-        // 刷新主题部分
-        refresh: function () {
-            admin.isRefresh = true;
-            Q.refresh();
-        },
-        // 判断是否为json
-        parseJSON: function (str) {
-            if (typeof str == 'string') {
-                try {
-                    var obj = JSON.parse(str);
-                    if (typeof obj == 'object' && obj) {
-                        return obj;
-                    }
-                } catch (e) {
-                }
-            }
-        },
-        formatDate:function (str) {
-            if (str == null || str == "") {
-                return;
-            }
-            switch (str.length) {
-                case 8:
-                    str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8);
-                    return str;
-                case 12:
-                    str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10)
-                        + ":" + str.substring(10, 12);
-                    return str;
-                case 14:
-                    str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10)
-                        + ":" + str.substring(10, 12) + ":" + str.substring(12, 14);
-                    return str;
-                default:
-                    return str;
-            }
-        },
-        errorBack: function (err) {
-            layer.closeAll('loading');
-            if (403 == err.status) {
-                layer.msg("无资源权限!", {icon: 2, time: 1500});
-                return;
-            }
-            if (200 == err.status) {
-                layer.msg("请求异常,请刷新页面重新操作", {icon: 2, time: 1500});
-                return;
-            } else {
-                layer.msg("请求服务器失败!", {icon: 2});
-            }
-        }
-    };
-
-    // ewAdmin提供的事件
-    admin.events = {
-        // 折叠侧导航
-        flexible: function (e) {
-            var expand = $('.layui-layout-admin').hasClass('admin-nav-mini');
-            admin.flexible(expand);
-        },
-        // 刷新主体部分
-        refresh: function () {
-            admin.refresh();
-        },
-        //后退
-        back: function () {
-            history.back();
-        },
-        // 设置主题
-        theme: function () {
-            admin.popupRight(baseUrl+'home/theme');
-        },
-        // 全屏
-        fullScreen: function (e) {
-            var ac = 'layui-icon-screen-full', ic = 'layui-icon-screen-restore';
-            var ti = $(this).find('i');
-
-            var isFullscreen = document.fullscreenElement || document.msFullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || false;
-            if (isFullscreen) {
-                var efs = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen;
-                if (efs) {
-                    efs.call(document);
-                } else if (window.ActiveXObject) {
-                    var ws = new ActiveXObject('WScript.Shell');
-                    ws && ws.SendKeys('{F11}');
-                }
-                ti.addClass(ac).removeClass(ic);
-            } else {
-                var el = document.documentElement;
-                var rfs = el.requestFullscreen || el.webkitRequestFullscreen || el.mozRequestFullScreen || el.msRequestFullscreen;
-                if (rfs) {
-                    rfs.call(el);
-                } else if (window.ActiveXObject) {
-                    var ws = new ActiveXObject('WScript.Shell');
-                    ws && ws.SendKeys('{F11}');
-                }
-                ti.addClass(ic).removeClass(ac);
-            }
-        },
-        // 左滑动tab
-        leftPage: function () {
-            admin.rollPage("left");
-        },
-        // 右滑动tab
-        rightPage: function () {
-            admin.rollPage();
-        },
-        // 关闭当前选项卡
-        closeThisTabs: function () {
-            var $title = $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title');
-            if ($title.find('li').first().hasClass('layui-this')) {
-                return;
-            }
-            $title.find('li.layui-this').find(".layui-tab-close").trigger("click");
-        },
-        // 关闭其他选项卡
-        closeOtherTabs: function () {
-            $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:gt(0):not(.layui-this)').find('.layui-tab-close').trigger('click');
-        },
-        // 关闭所有选项卡
-        closeAllTabs: function () {
-            $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:gt(0)').find('.layui-tab-close').trigger('click');
-        },
-        // 关闭所有弹窗
-        closeDialog: function () {
-            layer.closeAll('page');
-        },
-        //刷新字典
-        refreshDict: function (){
-            layer.confirm('确定要刷新数据字典吗?', {
-                    btn: ['确定', '取消']
-                }, function (index, layero) {
-                    layer.closeAll('dialog');  //加入这个信息点击确定 会关闭这个消息框
-                    admin.dgo(baseUrl+"dictrefresh", {}, function (data) {
-                        if (data.code == 200) {
-                            layer.msg("刷新数据字典成功!", {icon: 1, time: 1000});
-                            DictPoolToolkit().initAll(baseUrl+"dictpool");
-                        } 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, time: 1500});
-                        }
-                    }, function () {
-                        layer.msg("数据字典刷新失败,访问服务器失败!", {icon: 2, time: 1500});
-                    });
-                });
-        }
-    };
-
-    // 所有ew-event
-    $('body').on('click', '*[ew-event]', function () {
-        var event = $(this).attr('ew-event');
-        var te = admin.events[event];
-        te && te.call(this, $(this));
-    });
-
-    // 移动设备遮罩层点击事件
-    $('.site-mobile-shade').click(function () {
-        admin.flexible(true);
-    });
-
-    // 侧导航折叠状态下鼠标经过显示提示
-    $('body').on('mouseenter', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {
-        var tipText = $(this).find('cite').text();
-        if (document.body.clientWidth > 750) {
-            layer.tips(tipText, this);
-        }
-    }).on('mouseleave', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {
-        layer.closeAll('tips');
-    });
-
-    // 侧导航折叠状态下点击展开
-    $('body').on('click', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {
-        if (document.body.clientWidth > 750) {
-            layer.closeAll('tips');
-            admin.flexible(true);
-        }
-    });
-
-    // 所有lay-tips处理
-    $('body').on('mouseenter', '*[lay-tips]', function () {
-        var tipText = $(this).attr('lay-tips');
-        var dt = $(this).attr('lay-direction');
-        layer.tips(tipText, this, {tips: dt || 1, time: -1});
-    }).on('mouseleave', '*[lay-tips]', function () {
-        layer.closeAll('tips');
-    });
-
-    exports('admin', admin);
-});
+layui.define(['layer'], function (exports) {

+    var layer = layui.layer;

+    var popupRightIndex, popupCenterIndex, popupCenterParam;

+    var baseUrl = window.location.pathname;

+

+    var admin = {

+        isRefresh: false,

+        // 设置侧栏折叠

+        flexible: function (expand) {

+            var isExapnd = $('.layui-layout-admin').hasClass('admin-nav-mini');

+            if (isExapnd == !expand) {

+                return;

+            }

+            if (expand) {

+                $('.layui-layout-admin').removeClass('admin-nav-mini');

+            } else {

+                $('.layui-layout-admin').addClass('admin-nav-mini');

+            }

+        },

+        // 设置导航栏选中

+        activeNav: function (url) {

+            $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child dd').removeClass('layui-this');

+            $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item').removeClass('layui-this');

+            if (url && url != '') {

+                $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item').removeClass('layui-nav-itemed');

+                var $a = $('.layui-layout-admin .layui-side .layui-nav a[href="#!' + url + '"]');

+                $a.parent('li').addClass('layui-this');

+                $a.parent('dd').addClass('layui-this');

+                $a.parent('dd').parent('.layui-nav-child').parent('.layui-nav-item').addClass('layui-nav-itemed');

+            }

+        },

+        // 右侧弹出

+        popupRight: function (path) {

+            var param = new Object();

+            param.path = path;

+            param.id = 'adminPopupR';

+            param.title = false;

+            param.anim = 2;

+            param.isOutAnim = false;

+            param.closeBtn = false;

+            param.offset = 'r';

+            param.shadeClose = true;

+            param.area = '336px';

+            param.skin = 'layui-layer-adminRight';

+            param.end = function () {

+                layer.closeAll('tips');

+            };

+            popupRightIndex = admin.open(param);

+            return popupRightIndex;

+        },

+        // 关闭右侧弹出

+        closePopupRight: function () {

+            layer.close(popupRightIndex);

+        },

+        // 中间弹出

+        popupCenter: function (param) {

+            param.id = 'adminPopupC';

+            popupCenterParam = param;

+            popupCenterIndex = admin.open(param);

+            return popupCenterIndex;

+        },

+        // 关闭中间弹出并且触发finish回调

+        finishPopupCenter: function () {

+            layer.close(popupCenterIndex);

+            popupCenterParam.finish ? popupCenterParam.finish() : '';

+        },

+        // 关闭中间弹出

+        closePopupCenter: function () {

+            layer.close(popupCenterIndex);

+        },

+        // 封装layer.open

+        open: function (param) {

+            var sCallBack = param.success;

+            param.type = 1;

+            param.area = param.area ? param.area : '450px';

+            param.offset = param.offset ? param.offset : '120px';

+            param.resize ? param.resize : false;

+            param.shade ? param.shade : .2;

+            param.success = function (layero, index) {

+                sCallBack ? sCallBack(layero, index) : '';

+                admin.ajax({

+                    url: param.path,

+                    type: 'GET',

+                    dataType: 'html',

+                    success: function (result, status, xhr) {

+                        $(layero).children('.layui-layer-content').html(result);

+                    }

+                });

+            };

+            return layer.open(param);

+        },

+        

+        go:function(url,data,success,error){

+        	  $.ajax({

+        		  url: url,

+        		  data: data,

+        		  async: false,

+        		  dataType: 'json',

+        		  type: 'post',

+        		  success: success,

+                  error:error

+        	  })

+        },

+        dgo:function(url,data,success,error){

+      	  $.ajax({

+      		  url: url,

+      		  data: data,

+      		  async: false,

+      		  dataType: 'json',

+      		  type: 'get',

+      		  success: success,

+              error:error

+      	  })

+      },

+        // 封装ajax请求,返回数据类型为json

+        req: function (url, data, success, method) {

+            admin.ajax({

+                url: url,

+                data: data,

+                async: false,

+                type: method,

+                dataType: 'json',

+                success: success

+            });

+        },

+        // 封装ajax请求

+        ajax: function (param) {

+        	console.log(param);

+            var successCallback = param.success;

+            param.success = function (result, status, xhr) {

+                // 判断登录过期和没有权限

+                var jsonRs;

+                if ('json' == param.dataType.toLowerCase()) {

+                    jsonRs = result;

+                } else if ('html' == param.dataType.toLowerCase() || 'text' == param.dataType.toLowerCase()) {

+                    jsonRs = admin.parseJSON(result);

+                }

+                if (jsonRs) {

+                    if (jsonRs.code == 401) {

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

+                            location.replace('/login');

+                        }, 1000);

+                        return;

+                    } else if ('html' == param.dataType.toLowerCase() && jsonRs.code == 403) {

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

+                    }

+                }

+

+                if(result.indexOf("<title>统一身份认证</title>")!=-1){

+                    layer.msg("登录过期,请重新登录!", {icon: 2, time: 1500}, function () {

+                        location.replace(baseUrl + 'login');

+                    }, 500);

+                    return;

+                }else if(result.indexOf("<title>403 无权限</title>")!=-1){

+                    layer.close(popupCenterIndex);

+                    layer.msg("无资源权限", {icon: 2, time:2000});

+                    return;

+                }

+

+                successCallback(result, status, xhr);

+            };

+            param.error = function (xhr) {

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

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

+            };

+            $.ajax(param);

+        },

+        // 显示加载动画

+        showLoading: function (element) {

+            $(element).append('<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop admin-loading"></i>');

+        },

+        // 移除加载动画

+        removeLoading: function (element) {

+            $(element + '>.admin-loading').remove();

+        },

+        // 缓存临时数据

+        putTempData: function (key, value) {

+            if (value) {

+                layui.sessionData('tempData', {key: key, value: value});

+            } else {

+                layui.sessionData('tempData', {key: key, remove: true});

+            }

+        },

+        // 获取缓存临时数据

+        getTempData: function (key) {

+            return layui.sessionData('tempData')[key];

+        },

+        // 滑动选项卡

+        rollPage: function (d) {

+            var $tabTitle = $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title');

+            var left = $tabTitle.scrollLeft();

+            if ('left' === d) {

+                $tabTitle.scrollLeft(left - 120);

+            } else if ('auto' === d) {

+                var autoLeft = 0;

+                $tabTitle.children("li").each(function () {

+                    if ($(this).hasClass('layui-this')) {

+                        return false;

+                    } else {

+                        autoLeft += $(this).outerWidth();

+                    }

+                });

+                $tabTitle.scrollLeft(autoLeft - 47);

+            } else {

+                $tabTitle.scrollLeft(left + 120);

+            }

+        },

+        // 刷新主题部分

+        refresh: function () {

+            admin.isRefresh = true;

+            Q.refresh();

+        },

+        // 判断是否为json

+        parseJSON: function (str) {

+            if (typeof str == 'string') {

+                try {

+                    var obj = JSON.parse(str);

+                    if (typeof obj == 'object' && obj) {

+                        return obj;

+                    }

+                } catch (e) {

+                }

+            }

+        },

+        formatDate:function (str) {

+            if (str == null || str == "") {

+                return;

+            }

+            switch (str.length) {

+                case 8:

+                    str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8);

+                    return str;

+                case 12:

+                    str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10)

+                        + ":" + str.substring(10, 12);

+                    return str;

+                case 14:

+                    str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10)

+                        + ":" + str.substring(10, 12) + ":" + str.substring(12, 14);

+                    return str;

+                default:

+                    return str;

+            }

+        },

+        errorBack: function (err) {

+            layer.closeAll('loading');

+            if (403 == err.status) {

+                layer.msg("无资源权限!", {icon: 2, time: 1500});

+                return;

+            }

+            if (200 == err.status) {

+                layer.msg("请求异常,请刷新页面重新操作", {icon: 2, time: 1500});

+                return;

+            } else {

+                layer.msg("请求服务器失败!", {icon: 2});

+            }

+        }

+    };

+

+    // ewAdmin提供的事件

+    admin.events = {

+        // 折叠侧导航

+        flexible: function (e) {

+            var expand = $('.layui-layout-admin').hasClass('admin-nav-mini');

+            admin.flexible(expand);

+        },

+        // 刷新主体部分

+        refresh: function () {

+            admin.refresh();

+        },

+        //后退

+        back: function () {

+            history.back();

+        },

+        // 设置主题

+        theme: function () {

+            admin.popupRight(baseUrl+'home/theme');

+        },

+        // 全屏

+        fullScreen: function (e) {

+            var ac = 'layui-icon-screen-full', ic = 'layui-icon-screen-restore';

+            var ti = $(this).find('i');

+

+            var isFullscreen = document.fullscreenElement || document.msFullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || false;

+            if (isFullscreen) {

+                var efs = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen;

+                if (efs) {

+                    efs.call(document);

+                } else if (window.ActiveXObject) {

+                    var ws = new ActiveXObject('WScript.Shell');

+                    ws && ws.SendKeys('{F11}');

+                }

+                ti.addClass(ac).removeClass(ic);

+            } else {

+                var el = document.documentElement;

+                var rfs = el.requestFullscreen || el.webkitRequestFullscreen || el.mozRequestFullScreen || el.msRequestFullscreen;

+                if (rfs) {

+                    rfs.call(el);

+                } else if (window.ActiveXObject) {

+                    var ws = new ActiveXObject('WScript.Shell');

+                    ws && ws.SendKeys('{F11}');

+                }

+                ti.addClass(ic).removeClass(ac);

+            }

+        },

+        // 左滑动tab

+        leftPage: function () {

+            admin.rollPage("left");

+        },

+        // 右滑动tab

+        rightPage: function () {

+            admin.rollPage();

+        },

+        // 关闭当前选项卡

+        closeThisTabs: function () {

+            var $title = $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title');

+            if ($title.find('li').first().hasClass('layui-this')) {

+                return;

+            }

+            $title.find('li.layui-this').find(".layui-tab-close").trigger("click");

+        },

+        // 关闭其他选项卡

+        closeOtherTabs: function () {

+            $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:gt(0):not(.layui-this)').find('.layui-tab-close').trigger('click');

+        },

+        // 关闭所有选项卡

+        closeAllTabs: function () {

+            $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:gt(0)').find('.layui-tab-close').trigger('click');

+        },

+        // 关闭所有弹窗

+        closeDialog: function () {

+            layer.closeAll('page');

+        },

+        //刷新字典

+        refreshDict: function (){

+            layer.confirm('确定要刷新数据字典吗?', {

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

+                }, function (index, layero) {

+                    layer.closeAll('dialog');  //加入这个信息点击确定 会关闭这个消息框

+                    admin.dgo(baseUrl+"dictrefresh", {}, function (data) {

+                        if (data.code == 200) {

+                            layer.msg("刷新数据字典成功!", {icon: 1, time: 1000});

+                            DictPoolToolkit().initAll(baseUrl+"dictpool");

+                        } 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, time: 1500});

+                        }

+                    }, function () {

+                        layer.msg("数据字典刷新失败,访问服务器失败!", {icon: 2, time: 1500});

+                    });

+                });

+        }

+    };

+

+    // 所有ew-event

+    $('body').on('click', '*[ew-event]', function () {

+        var event = $(this).attr('ew-event');

+        var te = admin.events[event];

+        te && te.call(this, $(this));

+    });

+

+    // 移动设备遮罩层点击事件

+    $('.site-mobile-shade').click(function () {

+        admin.flexible(true);

+    });

+

+    // 侧导航折叠状态下鼠标经过显示提示

+    $('body').on('mouseenter', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {

+        var tipText = $(this).find('cite').text();

+        if (document.body.clientWidth > 750) {

+            layer.tips(tipText, this);

+        }

+    }).on('mouseleave', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {

+        layer.closeAll('tips');

+    });

+

+    // 侧导航折叠状态下点击展开

+    $('body').on('click', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {

+        if (document.body.clientWidth > 750) {

+            layer.closeAll('tips');

+            admin.flexible(true);

+        }

+    });

+

+    // 所有lay-tips处理

+    $('body').on('mouseenter', '*[lay-tips]', function () {

+        var tipText = $(this).attr('lay-tips');

+        var dt = $(this).attr('lay-direction');

+        layer.tips(tipText, this, {tips: dt || 1, time: -1});

+    }).on('mouseleave', '*[lay-tips]', function () {

+        layer.closeAll('tips');

+    });

+

+    exports('admin', admin);

+});
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/index.html b/payapi/src/main/resources/templates/index.html
index bfea46b..302af3a 100755
--- a/payapi/src/main/resources/templates/index.html
+++ b/payapi/src/main/resources/templates/index.html
@@ -3,8 +3,8 @@
 
 <head>
     <title>首页</title>
-    <meta name="_csrf_header" th:content="${_csrf.headerName}" />
-    <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}" />
+    <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+    <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
     <meta charset="utf-8"/>
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
@@ -36,7 +36,7 @@
                 <a ew-event="refreshDict" title="刷新字典"><i class="layui-icon layui-icon-read"></i></a>
             </li>
             <!--<li class="layui-nav-item" lay-unselect>-->
-                <!--<a id="btnMessage" title="消息"><i class="layui-icon layui-icon-notice"></i></a>-->
+            <!--<a id="btnMessage" title="消息"><i class="layui-icon layui-icon-notice"></i></a>-->
             <!--</li>-->
             <li class="layui-nav-item layui-hide-xs" lay-unselect>
                 <a ew-event="fullScreen" title="全屏"><i class="layui-icon layui-icon-screen-full"></i></a>
@@ -50,7 +50,7 @@
                     <dd ay-unselect><a lay-href="/operator/userinfor">基本资料</a></dd>
                     <dd ay-unselect><a lay-href="/operator/setpwd">修改密码</a></dd>
                     <hr>
-                    <dd layadmin-event="logout" style="text-align: center;" ><a th:href="@{/logout}">退出</a></dd>
+                    <dd layadmin-event="logout" style="text-align: center;"><a th:href="@{/logout}">退出</a></dd>
                 </dl>
             </li>
             <li class="layui-nav-item" lay-unselect>
@@ -73,7 +73,7 @@
                                 <dd th:each="temp : ${subMenu.subMenus}"><a th:lay-href="${temp.menuUrl}">
                                     <i th:class="'layui-icon '+${temp.menuIcon}"></i>
                                     [[${temp.menuName}]]
-                                  </a>
+                                </a>
                                 </dd>
                             </dl>
                         </dd>
@@ -81,16 +81,16 @@
                 </li>
 
                 <!--<li class="layui-nav-item">-->
-                    <!--<a href="javascript:;"><i class="layui-icon layui-icon-unlink"></i>&emsp;<cite>多级菜单</cite></a>-->
-                    <!--<dl class="layui-nav-child">-->
-                        <!--<dd>-->
-                            <!--<a href="javascript:;">二级菜单</a>-->
-                            <!--<dl class="layui-nav-child">-->
-                                <!--<dd><a href="javascript:;">三级菜单</a></dd>-->
-                                <!--<dd><a href="javascript:;">三级菜单</a></dd>-->
-                            <!--</dl>-->
-                        <!--</dd>-->
-                    <!--</dl>-->
+                <!--<a href="javascript:;"><i class="layui-icon layui-icon-unlink"></i>&emsp;<cite>多级菜单</cite></a>-->
+                <!--<dl class="layui-nav-child">-->
+                <!--<dd>-->
+                <!--<a href="javascript:;">二级菜单</a>-->
+                <!--<dl class="layui-nav-child">-->
+                <!--<dd><a href="javascript:;">三级菜单</a></dd>-->
+                <!--<dd><a href="javascript:;">三级菜单</a></dd>-->
+                <!--</dl>-->
+                <!--</dd>-->
+                <!--</dl>-->
                 <!--</li>-->
             </ul>
         </div>
@@ -122,7 +122,8 @@
     </div>
 
     <!-- 底部 -->
-    <div class="layui-footer">Copyright © 2018 supwisdom All rights reserved. <span class="pull-right" th:text="${payapiVersion}">Version 1.0</span>
+    <div class="layui-footer">Copyright © 2018 supwisdom All rights reserved. <span class="pull-right"
+                                                                                    th:text="${payapiVersion}">Version 1.0</span>
     </div>
 
     <!-- 手机屏幕遮罩层 -->
@@ -133,6 +134,7 @@
 <script type="text/javascript" th:src="@{/static/libs/q.js}"></script>
 <script type="text/javascript" th:src="@{/static/libs/layui/layui.js}"></script>
 <script type="text/javascript" th:src="@{/static/libs/zTree/js/jquery.ztree.all-3.5.min.js}"></script>
+<script type="text/javascript" th:src="@{/static/libs/moment.js}"></script>
 <script type="text/javascript" th:src="@{/static/libs/custom.js}"></script>
 
 <script>
diff --git a/payapi/src/main/resources/templates/system/shop/index.html b/payapi/src/main/resources/templates/system/shop/index.html
index 5e441ae..0da8653 100644
--- a/payapi/src/main/resources/templates/system/shop/index.html
+++ b/payapi/src/main/resources/templates/system/shop/index.html
@@ -10,8 +10,11 @@
         <div class="layui-row">
             <div class="layui-col-xs5 layui-col-md3">
                 <div class="layui-card">
-                    <div class="layui-card-body layui-show">
-                        <ul id="shoptree" class="ztree" style="background-color: #D7F9F7;max-height: 560px;overflow:auto;"></ul>
+                    <div class="layui-card-header">
+                        商户树<span style="font-size: 12px;">(双击商户进行修改)</span>
+                    </div>
+                    <div class="layui-card-body layui-show" style="margin-bottom: 15px;">
+                        <ul id="shoptree" class="ztree" style="background-color: #D7F9F7;max-height: 527px;overflow:auto;"></ul>
                     </div>
                 </div>
             </div>
@@ -19,61 +22,62 @@
                 <div class="layui-card" style="min-height: 600px;">
                     <div id="shop-info" class="layui-form toolbar" lay-filter="shop-info-form" style="display: none;">
                         <div class="layui-card-header">商户基本信息</div>
+                        <div class="layui-form-item" style="margin-left: 15px;">
+                            <label class="layui-form-label" style="color: red;"><span style="color: red;">*</span>商户类型</label>
+                            <div class="layui-input-inline">
+                                <select name="shoptype" id="shoptype" lay-filter="shoptype-filter" lay-verify="required">
+                                    <option value="0">商户组</option>
+                                    <option value="1">结算商户</option>
+                                </select>
+                            </div>
+                            <div class="layui-form-mid layui-word-aux">
+                                注意:商户组无商户账号,且能创建下级商户。结算商户是叶子商户,会创建商户账号。保存后无法修改!!!
+                            </div>
+                        </div>
                         <div class="layui-card-body">
                             <div class="layui-form-item">
-                                <div class="layui-inline" style="width: 40%;">
+                                <div class="layui-inline">
                                     <label class="layui-form-label">商户号</label>
                                     <div class="layui-input-inline">
-                                        <input type="text" name="shopid" class="layui-input"
+                                        <input type="text" name="shopid" class="layui-input" style="background-color: #f1f1f1;"
                                                readonly="readonly"/>
                                     </div>
                                 </div>
-                                <div class="layui-inline" style="width: 55%;">
-                                    <label class="layui-form-label">商户名</label>
-                                    <div class="layui-input-inline" style="width: 65%;">
-                                        <input type="text" name="shopname" autocomplete="off"
-                                               class="layui-input" maxlength="30" lay-verify="required"/>
-                                    </div>
-                                </div>
-                            </div>
-                            <div class="layui-form-item">
-                                <div class="layui-inline" style="width: 40%;">
-                                    <label class="layui-form-label">上级商户号</label>
-                                    <div class="layui-input-inline">
-                                        <input type="text" name="fshopid" id="fshopid" class="layui-input" autocomplete="off"
-                                               lay-verify="required|number"/>
-                                    </div>
-                                </div>
-                                <div class="layui-inline" style="width: 55%;">
+                                <div class="layui-inline">
                                     <label class="layui-form-label">商户账号</label>
-                                    <div class="layui-input-inline" style="width: 65%;">
-                                        <input type="text" name="shopaccno" autocomplete="off"
+                                    <div class="layui-input-inline">
+                                        <input type="text" name="shopaccno" autocomplete="off" style="background-color: #f1f1f1;"
                                                class="layui-input" readonly="readonly"/>
                                     </div>
                                 </div>
                             </div>
                             <div class="layui-form-item">
-                                <label class="layui-form-label" style="color: red;">商户类型</label>
-                                <div class="layui-input-inline">
-                                    <select name="shoptype" id="shoptype" lay-filter="shoptype-filter" lay-verify="required">
-                                        <option value="0">商户组</option>
-                                        <option value="1">结算商户</option>
-                                    </select>
+                                <div class="layui-inline">
+                                    <label class="layui-form-label"><span style="color: red;">*</span>上级商户号</label>
+                                    <div class="layui-input-inline">
+                                        <input type="text" name="fshopid" id="fshopid" class="layui-input" autocomplete="off"
+                                               lay-verify="required|number"/>
+                                    </div>
                                 </div>
-                                <div class="layui-form-mid layui-word-aux">
-                                    注意:商户组无商户账号,且能创建下级商户。结算商户是叶子商户,会创建商户账号。保存后无法修改!!!
+                                <div class="layui-inline">
+                                    <label class="layui-form-label"><span style="color: red;">*</span>商户名</label>
+                                    <div class="layui-input-inline">
+                                        <input type="text" name="shopname" autocomplete="off"
+                                               class="layui-input" maxlength="30" lay-verify="required"/>
+                                    </div>
                                 </div>
                             </div>
+
                             <div class="layui-form-item">
-                                <div class="layui-inline" style="width: 40%;">
+                                <div class="layui-inline">
                                     <label class="layui-form-label">邮编</label>
                                     <div class="layui-input-inline">
                                         <input type="text" name="zipcode" class="layui-input" autocomplete="off" />
                                     </div>
                                 </div>
-                                <div class="layui-inline" style="width: 55%;">
+                                <div class="layui-inline">
                                     <label class="layui-form-label">地址</label>
-                                    <div class="layui-input-inline" style="width: 65%;">
+                                    <div class="layui-input-inline">
                                         <input type="text" name="addr" class="layui-input" maxlength="40" autocomplete="off" />
                                     </div>
                                 </div>
@@ -82,22 +86,22 @@
                         <div class="layui-card-header">商户联系人信息</div>
                         <div class="layui-card-body">
                             <div class="layui-form-item">
-                                <div class="layui-inline" style="width: 40%;">
+                                <div class="layui-inline">
                                     <label class="layui-form-label">姓名</label>
                                     <div class="layui-input-inline">
                                         <input type="text" name="contactman" class="layui-input" autocomplete="off"/>
                                     </div>
                                 </div>
-                                <div class="layui-inline" style="width: 55%;">
+                                <div class="layui-inline">
                                     <label class="layui-form-label">手机号</label>
-                                    <div class="layui-input-inline" style="width: 65%;">
+                                    <div class="layui-input-inline">
                                         <input type="text" name="mobile" class="layui-input" maxlength="20" autocomplete="off"
                                                lay-verify="mobile" />
                                     </div>
                                 </div>
                             </div>
                             <div class="layui-form-item">
-                                <div class="layui-inline" style="width: 40%;">
+                                <div class="layui-inline" >
                                     <label class="layui-form-label">证件类型</label>
                                     <div class="layui-input-inline">
                                         <select name="idtype" lay-filter="idtype-filter">
@@ -110,23 +114,23 @@
                                         </select>
                                     </div>
                                 </div>
-                                <div class="layui-inline" style="width: 55%;">
+                                <div class="layui-inline">
                                     <label class="layui-form-label">证件号</label>
-                                    <div class="layui-input-inline" style="width: 65%;">
+                                    <div class="layui-input-inline">
                                         <input type="text" name="idno" class="layui-input" maxlength="20" autocomplete="off"/>
                                     </div>
                                 </div>
                             </div>
                             <div class="layui-form-item">
-                                <div class="layui-inline" style="width: 40%;">
+                                <div class="layui-inline">
                                     <label class="layui-form-label">邮箱</label>
                                     <div class="layui-input-inline">
                                         <input type="text" name="email" class="layui-input" autocomplete="off" lay-verify="swEmail"/>
                                     </div>
                                 </div>
-                                <div class="layui-inline" style="width: 55%;">
+                                <div class="layui-inline">
                                     <label class="layui-form-label">电话</label>
-                                    <div class="layui-input-inline" style="width: 65%;">
+                                    <div class="layui-input-inline">
                                         <input type="text" name="tel" class="layui-input" maxlength="20" autocomplete="off" />
                                     </div>
                                 </div>
@@ -136,6 +140,9 @@
                         <div class="layui-form-item" style="padding-bottom: 20px;text-align: center;">
                             <button class="layui-btn" lay-filter="form-submit-shop-btn" lay-submit id="submitbtn-shop-btn">保存</button>
                             <button class="layui-btn layui-btn-primary" type="button" id="cancelbtn">取消</button>
+                            <div class="layui-inline" style="margin-left: 10px;" id="shop-add-hid-div">
+                                <input type="checkbox" id="shop-add-continue-flag" lay-skin="primary" title="继续新增" />
+                            </div>
                         </div>
                     </div>
                 </div>
@@ -149,6 +156,8 @@
         var form = layui.form;
         var table = layui.table;
         var admin = layui.admin;
+        var $ = layui.jquery;
+
         form.render('select');
         form.verify({
             "mobile": function (e) {
@@ -287,7 +296,9 @@
                             zTree.addNodes(ftreeNode, newNode); //新加树节点
                         }
                         layer.msg(result.msg, {icon: 1});
-                        $("#shop-info").hide();
+                        if (!$("#shop-add-continue-flag").is(":checked")) {
+                            $("#shop-info").hide();
+                        }
                     } else if (result.code == 401) {
                         layer.msg(result.msg, {icon: 2, time: 1500}, function () {
                             location.replace('[[@{/login}]]');
@@ -333,6 +344,8 @@
                     $("#shoptype").removeAttr("disabled");
                     form.render('select');
                     $("#submitbtn-shop-btn").text("新增");
+                    $("#shop-add-continue-flag").prop("checked", false);
+                    $("#shop-add-hid-div").show();
                     $("#shop-info").show();
                     return false;
                 });
@@ -350,6 +363,8 @@
                     $("#shoptype").attr('disabled', 'disabled');
                     form.render('select');
                     $("#submitbtn-shop-btn").text("保存");
+                    $("#shop-add-continue-flag").prop("checked", false);
+                    $("#shop-add-hid-div").hide();
                     $("#shop-info").show();
                 } else if (data.code == 401) {
                     layer.msg(data.msg, {icon: 2, time: 1500}, function () {
diff --git a/payapi/src/main/resources/templates/system/user/account.html b/payapi/src/main/resources/templates/system/user/account.html
index 988fa72..8dfc988 100644
--- a/payapi/src/main/resources/templates/system/user/account.html
+++ b/payapi/src/main/resources/templates/system/user/account.html
@@ -31,11 +31,10 @@
             page: true,
             cols: [
                 [
-                    {field: 'accno', title: '账号', fixed: 'left', width: 100},
+                    {field: 'accno', title: '账号', fixed: 'left', width: 300},
                     {
                         field: 'person',
                         title: '名称',
-                        width: 80,
                         fixed: 'left',
                         sort: true,
                         templet: function (item) {
@@ -48,8 +47,9 @@
                     {
                         field: 'transStatus',
                         title: '状态',
-                        fixed: 'left',
-                        width: 80,
+                        align: 'center',
+                        width: 100,
+                        sort: true,
                         templet: function (item) {
                             let desc = getTempDictValue('accountStatusList', item.transStatus)
                             if (item.transStatus === 'normal') {
@@ -63,16 +63,26 @@
                             }
                         }
                     },
-                    {field: 'availbal', title: '可用余额', width: 100, fixed: 'left', sort: true},
-                    {field: 'balance', title: '总余额', width: 100, fixed: 'left', sort: true},
-                    {field: 'frozebal', title: '冻结余额', width: 100, fixed: 'left', sort: true},
-                    {field: 'lasttranstime', title: '最后交易日期', width: 120, fixed: 'left', sort: true},
-                    {field: 'opendate', title: '开户日期', width: 100, fixed: 'left', sort: true},
+                    {field: 'availbal', title: '可用余额', width: 100,  sort: true},
+                    {field: 'balance', title: '总余额', width: 100,  sort: true},
+                    {field: 'frozebal', title: '冻结余额', width: 100,  sort: true},
+                    {
+                        field: 'lasttranstime', title: '最后交易日期', sort: true, templet: function (item) {
+                            var dt = moment(item.lasttranstime);
+                            return dt.format("YYYY-MM-DD HH:mm:ss");
+                        }
+                    },
+                    {
+                        field: 'opendate', title: '开户日期',  width: 120, sort: true, templet: function (item) {
+                            return admin.formatDate(item.opendate);
+                        }
+                    },
                     {
                         field: 'accno',
                         align: 'center',
                         title: '操作',
                         fixed: 'right',
+                        width: 150,
                         templet: function (item) {
                             if (item.transStatus !== 'closed') {
                                 let html = ' <a class="layui-btn  layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>注销</a> ';
diff --git a/payapi/src/main/resources/templates/system/user/add.html b/payapi/src/main/resources/templates/system/user/add.html
index 7badc58..f886aca 100755
--- a/payapi/src/main/resources/templates/system/user/add.html
+++ b/payapi/src/main/resources/templates/system/user/add.html
@@ -2,7 +2,7 @@
 <form id="user-form" lay-filter="user-form" class="layui-form model-form">
     <input name="userid" id="userid" type="hidden"/>
     <div class="layui-form-item">
-        <label class="layui-form-label">姓名*</label>
+        <label class="layui-form-label"><span style="color: red;">*</span>姓名</label>
         <div class="layui-input-block">
             <input name="name" placeholder="请输入名称" type="text" class="layui-input" maxlength="100"
                    lay-verify="required" required/>
@@ -16,7 +16,7 @@
         </div>
     </div>
     <div class="layui-form-item">
-        <label class="layui-form-label">证件类型*</label>
+        <label class="layui-form-label"><span style="color: red;">*</span>证件类型</label>
         <div class="layui-input-block">
             <select name="idtype" id="idtype" lay-verify="required">
                 <option th:each="bean : ${idtypeList}" th:value="${bean.dictval}">[[${bean.dictcaption}]]</option>
@@ -24,7 +24,7 @@
         </div>
     </div>
     <div class="layui-form-item">
-        <label class="layui-form-label">证件号*</label>
+        <label class="layui-form-label"><span style="color: red;">*</span>证件号</label>
         <div class="layui-input-block">
             <input name="idno" placeholder="请输入证件号" type="text" class="layui-input" maxlength="100"
                    lay-verify="required" required/>
@@ -32,7 +32,7 @@
     </div>
 
     <div class="layui-form-item">
-        <label class="layui-form-label">手机号*</label>
+        <label class="layui-form-label"><span style="color: red;">*</span>手机号</label>
         <div class="layui-input-block">
             <input name="mobile" placeholder="请输入手机号" type="text" class="layui-input" maxlength="11"
                    lay-verify="required" required/>