防止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> <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> <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/>