diff --git a/lib/EmergencyBaseLib/EmergencyCommon/src/main/java/com/zdxt/common/util/IdCardCryptoUtil.java b/lib/EmergencyBaseLib/EmergencyCommon/src/main/java/com/zdxt/common/util/IdCardCryptoUtil.java index 96d13bb2..0c98d3f5 100644 --- a/lib/EmergencyBaseLib/EmergencyCommon/src/main/java/com/zdxt/common/util/IdCardCryptoUtil.java +++ b/lib/EmergencyBaseLib/EmergencyCommon/src/main/java/com/zdxt/common/util/IdCardCryptoUtil.java @@ -118,7 +118,6 @@ public class IdCardCryptoUtil { .form("userId", userId) .form("userName", userName); request.contentType("application/x-www-form-urlencoded"); - System.out.println(request.execute().body()); JSONObject jsonObject = JSONObject.parseObject(request.execute().body()); String data = jsonObject.getString("data"); return data; diff --git a/lib/EmergencyService/zdxtEmergencyAppService/src/main/java/com/zdxt/app/controller/AppEnforcementCheckStatisticsController.java b/lib/EmergencyService/zdxtEmergencyAppService/src/main/java/com/zdxt/app/controller/AppEnforcementCheckStatisticsController.java index 39be773f..bc34089f 100644 --- a/lib/EmergencyService/zdxtEmergencyAppService/src/main/java/com/zdxt/app/controller/AppEnforcementCheckStatisticsController.java +++ b/lib/EmergencyService/zdxtEmergencyAppService/src/main/java/com/zdxt/app/controller/AppEnforcementCheckStatisticsController.java @@ -56,7 +56,6 @@ public class AppEnforcementCheckStatisticsController extends BaseController { String month1=StringUtils.join(month,","); enforcementCheckStatistics.setYear(year); enforcementCheckStatistics.setMonth(month1); - System.out.println(enforcementCheckStatistics); //查出区下所有区的id List areaAllList = enforcementCheckStatisticsService.selectAllAreaList(); //存放以区id为键,该id下的所有记录为值 diff --git a/lib/EmergencyService/zdxtEmergencyAppService/src/main/java/com/zdxt/app/controller/AppThirdLoginController.java b/lib/EmergencyService/zdxtEmergencyAppService/src/main/java/com/zdxt/app/controller/AppThirdLoginController.java index c6fd52e5..4791a192 100644 --- a/lib/EmergencyService/zdxtEmergencyAppService/src/main/java/com/zdxt/app/controller/AppThirdLoginController.java +++ b/lib/EmergencyService/zdxtEmergencyAppService/src/main/java/com/zdxt/app/controller/AppThirdLoginController.java @@ -136,7 +136,7 @@ public class AppThirdLoginController { public ZDResponse szyptLogin(@PathVariable String code){ System.out.println("====================== code ======================"); - System.out.println(code); + log.info("深政易用户登录code:{}",code); System.out.println("====================== code ======================"); String accessTokenJson = ""; @@ -149,9 +149,7 @@ public class AppThirdLoginController { // 获取 用户Id userJson = HttpUtil.HttpSendGet(szyptUrl + "/cgi-bin/user/getuserinfo?access_token="+token+"&code="+code, null); - System.out.println("====================== userInfo ======================"); - System.out.println(userJson); - System.out.println("====================== userInfo ======================"); + JSONObject userOjb = JSONObject.parseObject(userJson); String userId = userOjb.getString("UserId"); @@ -292,7 +290,7 @@ public class AppThirdLoginController { //锁不存在: //1.加锁限制用户登录并发情况 if(!jedisUtil.exists(redisLock)){ - jedisUtil.isLock(redisLock,100); + jedisUtil.isLock(redisLock,1000); log.info("redis用户登录加锁,加锁用户:{}",userInfo.toJSONString()); //添加深i企用户 Long userId = thirdLoginService.addSiqUser(userInfo); @@ -303,12 +301,10 @@ public class AppThirdLoginController { log.info("================= siqLogin addSiqUser -> userId ================="); //添加深i企用户关联企业信息 thirdLoginService.addSiqUserCompany(userInfo); + return thirdLoginService.siqLogin(userInfo); }else{ log.info("用户正在登录中,用户信息:{}",userInfo.toJSONString()); } - - return thirdLoginService.siqLogin(userInfo); - }catch (Exception e){ e.printStackTrace(); }finally { diff --git a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/framework/config/CorsFilter.java b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/framework/config/CorsFilter.java index 7ae6da80..17c4ac9b 100644 --- a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/framework/config/CorsFilter.java +++ b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/framework/config/CorsFilter.java @@ -32,7 +32,7 @@ public class CorsFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //配置可信域名 String[] authhosts = {"http://10.132.108.3:85","http://jdm.szssfj.cn","http://localhost:85","http://192.168.31.196:3301", - "http://localhost:3301"}; + "http://localhost:3301","http://10.132.108.3:81","http://10.132.108.3:85"}; String authost = ""; HttpServletRequest httprequest = (HttpServletRequest) request; String origin = httprequest.getHeader("Origin"); diff --git a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/framework/shiro/service/LoginService.java b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/framework/shiro/service/LoginService.java index 4dc1640b..c84e9c28 100644 --- a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/framework/shiro/service/LoginService.java +++ b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/framework/shiro/service/LoginService.java @@ -41,11 +41,11 @@ public class LoginService public User login(String username, String password) { // 验证码校验 - if (!StringUtils.isEmpty(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA))) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); - throw new CaptchaException(); - } +// if (!StringUtils.isEmpty(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA))) +// { +// AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); +// throw new CaptchaException(); +// } // 用户名或密码为空 错误 if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { @@ -109,11 +109,11 @@ public class LoginService public User login(String username, String password,Integer userSource) { // 验证码校验 - if (!StringUtils.isEmpty(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA))) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); - throw new CaptchaException(); - } +// if (!StringUtils.isEmpty(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA))) +// { +// AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); +// throw new CaptchaException(); +// } // 用户名或密码为空 错误 if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { diff --git a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/kingdee/controller/KingdeeDataSyncController.java b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/kingdee/controller/KingdeeDataSyncController.java index 6f455117..7e8a21fe 100644 --- a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/kingdee/controller/KingdeeDataSyncController.java +++ b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/kingdee/controller/KingdeeDataSyncController.java @@ -55,7 +55,6 @@ public class KingdeeDataSyncController { @RequestMapping("/syncUser") public Map syncUser(SyncUser syncUser) { try { - System.out.println("接收到推送数据-金蝶用户-----" + DateTime.now() + "----------" + syncUser); return kingdeeDataSyncService.syncUser(syncUser); } catch (Exception e) { HashMap resultData = new HashMap<>(); @@ -75,7 +74,6 @@ public class KingdeeDataSyncController { @RequestMapping("/syncOrg") public Map syncOrg(SyncOrganization syncOrg) { try { - System.out.println("接收到推送数据-金蝶组织结构-----" + DateTime.now() + "----------" + syncOrg); Map objectMap = kingdeeDataSyncService.syncOrg(syncOrg); return objectMap; } catch (Exception e) { diff --git a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/kingdee/service/impl/KingdeeDataSyncServiceImpl.java b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/kingdee/service/impl/KingdeeDataSyncServiceImpl.java index 699f76f1..92aa3e23 100644 --- a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/kingdee/service/impl/KingdeeDataSyncServiceImpl.java +++ b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/kingdee/service/impl/KingdeeDataSyncServiceImpl.java @@ -20,6 +20,8 @@ import com.zdxt.domain.auth.Dept; import com.zdxt.domain.auth.Post; import com.zdxt.domain.auth.User; import com.zdxt.domain.auth.UserPost; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,6 +39,7 @@ import java.util.Map; */ @Service public class KingdeeDataSyncServiceImpl implements KingdeeDataSyncService { + private static final Logger log = LoggerFactory.getLogger(KingdeeDataSyncServiceImpl.class); @Autowired private IUserService userService; @@ -60,7 +63,7 @@ public class KingdeeDataSyncServiceImpl implements KingdeeDataSyncService { @Transactional public Map syncUser(SyncUser syncUser) throws KingdeeDataSyncException { if (StrUtil.isEmpty(syncUser.getId())) { - System.out.println("金蝶用户id不能为空-----" + DateUtil.now()); + log.info("金蝶用户id不能为空-----{}" , DateUtil.now()); throw new KingdeeDataSyncException(500, "金蝶用户id不能为空"); } @@ -77,7 +80,7 @@ public class KingdeeDataSyncServiceImpl implements KingdeeDataSyncService { row = userMapper.insertUser(user); if (row == 0) { - System.out.println("金蝶用户新增失败-----" + DateUtil.now()); + log.info("金蝶用户新增失败-----:{}", DateUtil.now()); resultData.put("msg", "金蝶用户新增失败"); return resultData; } @@ -88,7 +91,7 @@ public class KingdeeDataSyncServiceImpl implements KingdeeDataSyncService { row = userService.deleteUserById(user.getUserId()); if (row == 0) { - System.out.println("金蝶用户删除失败-----" + DateUtil.now()); + log.info("金蝶用户删除失败-----{}" , DateUtil.now()); resultData.put("msg", "金蝶用户删除失败"); return resultData; } @@ -99,7 +102,7 @@ public class KingdeeDataSyncServiceImpl implements KingdeeDataSyncService { row = userMapper.updateUser(user); if (row == 0) { - System.out.println("金蝶用户更新失败-----" + DateUtil.now()); + log.info("金蝶用户更新失败-----{}" , DateUtil.now()); resultData.put("msg", "金蝶用户更新失败"); return resultData; } @@ -108,7 +111,6 @@ public class KingdeeDataSyncServiceImpl implements KingdeeDataSyncService { } resultData.put("result", true); - System.out.println("金蝶组织用户数据同步成功-----" + DateTime.now() + "----------" + syncUser); return resultData; } @@ -232,7 +234,6 @@ public class KingdeeDataSyncServiceImpl implements KingdeeDataSyncService { } resultData.put("result", true); - System.out.println("金蝶组织结构数据同步成功-----" + DateTime.now() + "----------" + syncOrg); return resultData; } diff --git a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/system/dept/controller/DeptController.java b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/system/dept/controller/DeptController.java index fc15c7e2..4130cb4a 100644 --- a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/system/dept/controller/DeptController.java +++ b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/system/dept/controller/DeptController.java @@ -74,6 +74,15 @@ public class DeptController extends BaseController { return deptList; } + @PostMapping("/listChild") + @ResponseBody + public List listChild(Dept dept) + { + List deptList = deptService.selectDeptList(dept); + return deptList; + } + + /** * 新增部门 */ @@ -100,6 +109,7 @@ public class DeptController extends BaseController { return toAjax(deptService.insertDept(dept)); } + /** * 修改 */ @@ -303,4 +313,5 @@ public class DeptController extends BaseController { public String toUserCheckOptSelect() { return prefix + "/userCheckOpt"; } + } diff --git a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/system/user/service/UserServiceImpl.java b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/system/user/service/UserServiceImpl.java index ea94a44b..6a837b72 100644 --- a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/system/user/service/UserServiceImpl.java +++ b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/java/com/zdxt/auth/project/system/user/service/UserServiceImpl.java @@ -763,7 +763,6 @@ public class UserServiceImpl implements IUserService { insertNum += rowNum; } } - } catch (Exception e) { continue; } diff --git a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/DeptMapper.xml b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/DeptMapper.xml index eb9475c5..adf2253f 100644 --- a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/DeptMapper.xml +++ b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/DeptMapper.xml @@ -164,7 +164,10 @@ AND d.tenant_code = #{tenantCode} - ${params.dataScope} + + ${params.dataScope} + + order by d.parent_id, d.order_num diff --git a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/UserMapper.xml b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/UserMapper.xml index be67c698..569e98ac 100644 --- a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/UserMapper.xml +++ b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/UserMapper.xml @@ -152,8 +152,10 @@ AND u.tenant_code = #{tenantCode} - - ${params.dataScope} + + + ${params.dataScope} + diff --git a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/oracle/RoleOracleDao.xml b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/oracle/RoleOracleDao.xml index a307aafd..aa12881a 100644 --- a/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/oracle/RoleOracleDao.xml +++ b/lib/EmergencyService/zdxtEmergencyAuthService/src/main/resources/mapper/system/oracle/RoleOracleDao.xml @@ -55,7 +55,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and r.create_time <= to_date(#{params.endTime},'yyyy-MM-dd HH24:mi:ss') - ${params.dataScope} + + + ${params.dataScope} + '+t.title+""):(i=e('
  • "),n.hiddenColumns.push(t.field)),o.append(i)}}),d.append(o),i.append(d),j()}else{e.each(a.columns,function(e,a){"selectItem"!=a.field&&void 0!==a.visible&&1!=a.visible&&n.hiddenColumns.push(a.field)})}},d=function(){e.each(n.hiddenColumns,function(e,a){n.find("."+a+"_cls").hide()})},o=function(){var t=e("");e.each(a.columns,function(a,i){var s=null;0==a&&"selectItem"==i.field?(n.hasSelectItem=!0,s=e('')):(s=e(''),i.align&&s.css("text-align",i.align)),!n.isFixWidth&&i.width&&(n.isFixWidth=i.width.indexOf("px")>-1?!0:!1),s.html(i.title),t.append(s)});var i=e('');i.append(t),n.append(i)},r=function(){var t=e('');if(n.append(t),a.height&&t.css("height",a.height),a.pagination){var i=e('
    ');n.append(i)}},p=function(t){if(a.pagination&&((void 0==t||null==t)&&(t={}),t[a.parentCode]=a.rootIdValue),n.data_list={},n.data_obj={},a.pagination){var i={};i.offset=a.pageSize*(a.pageNumber-1),i.limit=a.pageSize;var s={pageSize:i.limit,pageNum:i.offset/i.limit+1};t=e.extend(s,t)}var l=n.find("tbody"),d='
    姝e湪鍔姏鍦板姞杞芥暟鎹腑锛岃绋嶅€欌€︹€�
    ';l.html(d),a.url?e.ajax({type:a.type,url:a.url,data:e.extend(t,a.ajaxParams),dataType:"json",success:function(e,t,n){e=N(a,a.responseHandler,[e],e),c(e),N(a,a.onLoadSuccess,[e],e)},error:function(e,t){var n='
    '+e.responseText+"
    ";l.html(n)}}):c(a.data)},c=function(t){var i,s=0,l=0;a.pagination?(i=t.rows,l=a.pageNumber,s=~~((t.total-1)/a.pageSize)+1,n.totalPages=s,n.totalRows=t.total):i=t,t=i;var o=n.find("tbody");if(o.html(""),!t||t.length<=0){var r='
    娌℃湁鎵惧埌鍖归厤鐨勮褰�
    ';return o.html(r),a.pageNumber=1,void u(0,0)}m(t);var p=n.data_list._root_;p&&e.each(p,function(e,t){var n="row_id_"+e;w(t,1,n,"row_root",t[a.code])}),e.each(t,function(e,t){if(!t.isShow){var n=_(t,!1,1,"","",a.pagination,t[a.code]);o.append(n)}}),S(),T(),d(),C(),a.pagination&&u(s,l);var c=e(n).parent(".treetable-table"),f=c.outerWidth();if(e.common.isMobile()||769>f){var h="width: "+f+"px;overflow: auto;position: relative;";c.attr("style",h);var b=0;e.each(a.columns,function(e,a){b+=0==e&&"selectItem"==a.field?36:200}),e(n).attr("style","width:"+b+"px")}},u=function(t,i){var s=n.find(".fixed-table-pagination");s.empty();var l=[],d=(a.pageNumber-1)*a.pageSize+1,o=a.pageNumber*a.pageSize;o>n.totalRows&&(o=n.totalRows),d>o&&(d=o),l.push('
    '),l.push(''+E(d,o,n.totalRows)+"");var r=!1;if(e.each(a.pageList,function(e,a){n.totalRows>a&&(r=!0)}),r){var p=[];p.push(''),p.push(''),p.push('"),p.push('"),p.push(""),l.push(I(p.join(""))),l.push("")}if(l.push("
    "),t>1){l.push('")}s.append(l.join(""));var m=s.find(".page-list a"),w=s.find(".page-pre"),_=s.find(".page-next"),y=s.find(".page-number"),k=s.find(".page-first"),j=s.find(".page-last");w.off("click").on("click",e.proxy(h,this)),m.off("click").on("click",e.proxy(f,this)),y.off("click").on("click",e.proxy(b,this)),k.off("click").on("click",e.proxy(v,this)),j.off("click").on("click",e.proxy(g,this)),_.off("click").on("click",e.proxy(x,this))},f=function(t){var i=e(t.currentTarget);i.parent().addClass("active").siblings().removeClass("active");var s=n.find(".fixed-table-pagination");a.pageSize=i.text().toUpperCase()===n.totalRows?n.totalRows:+i.text(),n.totalRowsn.totalPages?a.pageNumber=1:a.pageNumber++,p()},C=function(t){if(a.height>0){var i=n.find("thead"),s=n.find("tbody"),l=parseInt(n.css("border-left-width"))+parseInt(n.css("border-right-width"));if(i.css("width",s.children(":first").width()),t){var d=!1;e(window).resize(function(){d||(d=!0,setTimeout(function(){n.isFixWidth||s.css("width",n.parent().width()-l),i.css("width",s.children(":first").width()),d=!1},300))})}}},m=function(t){var i=a.rootIdValue?a.rootIdValue:null,s=[],l=!1;e.each(t,function(t,n){-1==e.inArray(n[a.parentCode],s)&&s.push(n[a.parentCode])}),e.each(t,function(t,d){d.isShow=!1,a.pagination&&(void 0==d.isTreeLeaf||null==d.isTreeLeaf?d.isTreeLeaf=!1:d.isTreeLeaf=!((1==d.isTreeLeaf?0:1)&&("true"==d.isTreeLeaf||1==d.isTreeLeaf?0:1)));var o="0"==d[a.parentCode]||0==d[a.parentCode]||null==d[a.parentCode]||""==d[a.parentCode]||e.inArray(d[a.code],s)>0&&!l;!d[a.parentCode]||(i?d[a.parentCode]==a.rootIdValue:o)?(l=!0,n.data_list._root_||(n.data_list._root_=[]),n.data_obj["id_"+d[a.code]]||n.data_list._root_.push(d)):(n.data_list["_n_"+d[a.parentCode]]||(n.data_list["_n_"+d[a.parentCode]]=[]),n.data_obj["id_"+d[a.code]]||n.data_list["_n_"+d[a.parentCode]].push(d)),n.data_obj["id_"+d[a.code]]=d})},w=function(t,i,s,l,d){var o=n.find("tbody"),r=n.data_list["_n_"+t[a.code]],p=_(t,r?!0:!1,i,s,l,a.pagination,d);o.append(p),r&&e.each(r,function(e,t){var n=s+"_"+e;w(t,i+1,n,s,t[a.code])})},_=function(t,i,s,l,d,o,r){t.isShow=!0,t.row_id=l,t.p_id=d,t.lv=s;var p=e(''),c=a.expanderCollapsedClass;return a.expandAll?(p.css("display","table"),c=a.expanderExpandedClass):1==s?(p.css("display","table"),c=a.expandFirst?a.expanderExpandedClass:a.expanderCollapsedClass):2==s?(a.expandFirst?p.css("display","table"):p.css("display","none"),c=a.expanderCollapsedClass):o?t.isTreeLeaf&&(c=a.expanderCollapsedClass):(p.css("display","none"),c=a.expanderCollapsedClass),e.each(a.columns,function(l,d){if("selectItem"==d.field){n.hasSelectItem=!0;var r=e('');if(d.radio){var u=e('');r.append(u)}if(d.checkbox){var u=e('');r.append(u)}p.append(r)}else{var r=e('');if(d.width&&r.css("width",d.width+(d.widthUnit?d.widthUnit:"px")),d.align&&r.css("text-align",d.align),a.expandColumn==l&&r.css("text-align","left"),d.valign&&r.css("vertical-align",d.valign),a.showTitle&&r.addClass("ellipsis"),d.formatter?r.html(d.formatter.call(this,R(t,d.field),t,l)):(a.showTitle&&r.attr("title",t[d.field]),r.text(R(t,d.field))),a.expandColumn==l){o?t.isTreeLeaf?r.prepend(''):r.prepend(''):i?r.prepend(''):r.prepend('');for(var f=0;f')}}p.append(r)}}),p},y=function(a){e(a).off("click").on("click",function(){e(".search-collapse").slideToggle()})},k=function(a){e(a).off("click").on("click",function(){n.refresh()})},j=function(){e(".bootstrap-tree-table .treetable-bars .columns label input").off("click").on("click",function(){var a=e(this);a.prop("checked")?n.showColumn(e(this).val()):n.hideColumn(e(this).val())})},T=function(){n.find("tbody").find("tr").unbind(),n.find("tbody").find("tr").click(function(){if(n.hasSelectItem){var t=e(this).find("input[name='select_item']");"radio"==t.attr("type")?(t.prop("checked",!0),n.find("tbody").find("tr").removeClass("treetable-selected"),e(this).addClass("treetable-selected")):"checkbox"==t.attr("type")?t.prop("checked")?(t.prop("checked",!0),n.find("tbody").find("tr").removeClass("treetable-selected"),e(this).addClass("treetable-selected")):(t.prop("checked",!1),n.find("tbody").find("tr").removeClass("treetable-selected")):t.prop("checked")?(t.prop("checked",!1),e(this).removeClass("treetable-selected")):(t.prop("checked",!0),e(this).addClass("treetable-selected"));var i=n.data_obj["id_"+e(this).data("id")];N(a,a.onClickRow,[i],i)}})},S=function(){n.find("tbody").find("tr").find(".treetable-expander").unbind(),n.find("tbody").find("tr").find(".treetable-expander").click(function(){var t=e(this).hasClass(a.expanderExpandedClass),i=e(this).hasClass(a.expanderCollapsedClass);if(t||i){var s=e(this).parent().parent(),l=s.attr("id"),d=s.attr("pid"),o=s.attr("data-id"),r=n.find("tbody").find("tr[id^='"+l+"_']");if(a.pagination){var r=n.find("tbody").find("tr[id^='"+l+"_']");if(r&&r.length>0){t?"row_root"==d?(e('table tr[id^="'+l+'_"]').css("display","none"),e('table tr[id^="'+l+'_"]').each(function(t,n){var i=e(n).find(".treetable-expander").hasClass(a.expanderExpandedClass);i&&e(n).find(".treetable-expander").trigger("click")})):e.each(r,function(t,n){e(n).css("display","none");var i=e(n).find(".treetable-expander").hasClass(a.expanderExpandedClass);i&&e(n).find(".treetable-expander").trigger("click")}):"row_root"==d?e('table tr[pid="'+l+'"]').css("display","table"):e.each(r,function(t,n){var i=e("#"+e(n).attr("pid")).children().eq(a.expandColumn).find(".treetable-expander");i.hasClass(a.expanderExpandedClass),i.hasClass(a.expanderCollapsedClass);l==e(n).attr("pid")&&e(n).css("display","table")})}else{if(a.pagination){var p={};p[a.parentCode]=o,a.dataUrl&&e.ajax({type:a.type,url:a.dataUrl,data:p,dataType:"json",success:function(a,t,i){e("#"+l+"_load").remove();var s=a;a=s,n.appendData(a)},error:function(t,n){var i='
    '+t.responseText+"
    ";e("#"+l).after(i)}})}}t?(e(this).removeClass(a.expanderExpandedClass),e(this).addClass(a.expanderCollapsedClass)):(e(this).removeClass(a.expanderCollapsedClass),e(this).addClass(a.expanderExpandedClass))}else{t?(e(this).removeClass(a.expanderExpandedClass),e(this).addClass(a.expanderCollapsedClass),r&&r.length>0&&e.each(r,function(a,t){e(t).css("display","none")})):(e(this).removeClass(a.expanderCollapsedClass),e(this).addClass(a.expanderExpandedClass),r&&r.length>0&&e.each(r,function(t,n){var i=e("#"+e(n).attr("pid")).children().eq(a.expandColumn).find(".treetable-expander"),s=e("#"+e(n).attr("pid")).css("display");i.hasClass(a.expanderExpandedClass)&&"table"==s&&e(n).css("display","table")}))}}})};n.refresh=function(e){e&&(n.lastAjaxParams=e),p(n.lastAjaxParams)},n.appendData=function(t){t.reverse(),e.each(t,function(t,i){a.pagination&&(i.__nodes=!((1==i.nodes?0:1)&&("true"==i.nodes||1==i.nodes?0:1)));var s,l=n.data_obj["id_"+i[a.code]],d=n.data_obj["id_"+i[a.parentCode]],o=n.data_list["_n_"+i[a.parentCode]],r="",p="",c=1;if(l&&l.row_id&&""!=l.row_id&&(r=l.row_id),d){if(p=d.row_id,""==r){var u=0;o&&o.length>0&&(u=o.length),r=d.row_id+"_"+u}c=d.lv+1,s=_(i,!0,c,r,p,a.pagination,i[a.code]);var f=e("#"+d.row_id).children().eq(a.expandColumn).find(".treetable-expander"),h=f.hasClass(a.expanderExpandedClass),b=f.hasClass(a.expanderCollapsedClass);if(h||b?h&&s.css("display","table"):f.addClass(a.expanderCollapsedClass),l){e("#"+l.row_id).before(s),e("#"+l.row_id).remove()}else{var v=d.row_id.split("_");d.row_id.substring(0,d.row_id.length-(v[v.length-1]+"").length)+(parseInt(v[v.length-1])+1);e("#"+d.row_id).after(s)}}else{if(s=_(i,!1,c,r,p,a.pagination,i[a.code]),l){e("#"+l.row_id).before(s),e("#"+l.row_id).remove()}else{var g=n.find("tbody");g.append(s)}}i.isShow=!0,m([i])}),S(),T(),d()},n.toggleRow=function(a){var t=n.data_obj["id_"+a],i=e("#"+t.row_id).find(".treetable-expander");i.trigger("click")},n.expandRow=function(a){var t=n.data_obj["id_"+a],i=e("#"+t.row_id).find(".treetable-expander"),s=i.hasClass(n.options.expanderCollapsedClass);s&&i.trigger("click")},n.collapseRow=function(a){var t=n.data_obj["id_"+a],i=e("#"+t.row_id).find(".treetable-expander"),s=i.hasClass(n.options.expanderExpandedClass);s&&i.trigger("click")},n.expandAll=function(){n.find("tbody").find("tr").find(".treetable-expander").each(function(t,n){var i=e(n).hasClass(a.expanderCollapsedClass);i&&e(n).trigger("click")})},n.collapseAll=function(){n.find("tbody").find("tr").find(".treetable-expander").each(function(t,n){var i=e(n).hasClass(a.expanderExpandedClass);i&&e(n).trigger("click")})},n.showColumn=function(t,i){var s=e.inArray(t,n.hiddenColumns);if(s>-1&&n.hiddenColumns.splice(s,1),n.find("."+t+"_cls").show(),i&&a.showColumns){var l=e(".bootstrap-tree-table .treetable-bars .columns label").find("input[value='"+t+"']");l.prop("checked","checked")}},n.hideColumn=function(t,i){if(n.hiddenColumns.push(t),n.find("."+t+"_cls").hide(),i&&a.showColumns){var s=e(".bootstrap-tree-table .treetable-bars .columns label").find("input[value='"+t+"']");s.prop("checked","")}};var R=function(e,a){var t=e;if("string"!=typeof a||e.hasOwnProperty(a)){return e[a]}var n=a.split(".");for(var i in n){t=t&&t[n[i]]}return t},N=function(a,t,n,i){var s=t;if("string"==typeof t){var l=t.split(".");l.length>1?(s=window,e.each(l,function(e,a){s=s[a]})):s=window[t]}return"object"==typeof s?s:"function"==typeof s?s.apply(a,n):!s&&"string"==typeof t&&sprintf.apply(this,[t].concat(n))?sprintf.apply(this,[t].concat(n)):i},I=function(e){return"姣忛〉鏄剧ず "+e+" 鏉¤褰�"},E=function(e,a,t){return"鏄剧ず绗� "+e+" 鍒扮 "+a+" 鏉¤褰曪紝鎬诲叡 "+t+" 鏉¤褰曘€�"};return i(),n},e.fn.bootstrapTreeTable.methods={getSelections:function(a,t){var n=a.find("tbody").find("tr").find("input[name='select_item']:checked"),i=[];if("radio"==n.attr("type")){var s=a.data_obj["id_"+n.val()];i.push(s)}else{n.each(function(t,n){var s=a.data_obj["id_"+e(n).val()];i.push(s)})}return i},refresh:function(e,a){a?e.refresh(a):e.refresh()},appendData:function(e,a){a&&e.appendData(a)},toggleRow:function(e,a){e.toggleRow(a)},expandRow:function(e,a){e.expandRow(a)},collapseRow:function(e,a){e.collapseRow(a)},expandAll:function(e){e.expandAll()},collapseAll:function(e){e.collapseAll()},showColumn:function(e,a){e.showColumn(a,!0)},hideColumn:function(e,a){e.hideColumn(a,!0)}},e.fn.bootstrapTreeTable.defaults={code:"code",parentCode:"parentCode",rootIdValue:0,data:null,type:"GET",url:null,ajaxParams:{},expandColumn:1,expandAll:!1,expandFirst:!0,striped:!1,bordered:!1,hover:!0,condensed:!1,columns:[],toolbar:null,height:0,pagination:!1,dataUrl:null,pageNumber:1,pageSize:10,onClickRow:null,pageList:[10,25,50],showTitle:!0,showSearch:!0,showColumns:!0,showRefresh:!0,paginationPreText:"‹",paginationNextText:"›",expanderExpandedClass:"glyphicon glyphicon-chevron-down",expanderCollapsedClass:"glyphicon glyphicon-chevron-right",responseHandler:function(e){return !1},onLoadSuccess:function(e){return !1}}}(jQuery); \ No newline at end of file diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/img/profile-guo.jpg b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/img/profile-guo.jpg new file mode 100644 index 00000000..d7b1a2fb Binary files /dev/null and b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/img/profile-guo.jpg differ diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/img/profile.jpg b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/img/profile.jpg index d7b1a2fb..2d87b3af 100644 Binary files a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/img/profile.jpg and b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/img/profile.jpg differ diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/js/purify/purify.js b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/js/purify/purify.js new file mode 100644 index 00000000..2c0961ae --- /dev/null +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/js/purify/purify.js @@ -0,0 +1,1340 @@ +/*! @license DOMPurify 3.2.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.3/LICENSE */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory()); +})(this, (function () { 'use strict'; + + const { + entries, + setPrototypeOf, + isFrozen, + getPrototypeOf, + getOwnPropertyDescriptor + } = Object; + let { + freeze, + seal, + create + } = Object; // eslint-disable-line import/no-mutable-exports + let { + apply, + construct + } = typeof Reflect !== 'undefined' && Reflect; + if (!freeze) { + freeze = function freeze(x) { + return x; + }; + } + if (!seal) { + seal = function seal(x) { + return x; + }; + } + if (!apply) { + apply = function apply(fun, thisValue, args) { + return fun.apply(thisValue, args); + }; + } + if (!construct) { + construct = function construct(Func, args) { + return new Func(...args); + }; + } + const arrayForEach = unapply(Array.prototype.forEach); + const arrayPop = unapply(Array.prototype.pop); + const arrayPush = unapply(Array.prototype.push); + const stringToLowerCase = unapply(String.prototype.toLowerCase); + const stringToString = unapply(String.prototype.toString); + const stringMatch = unapply(String.prototype.match); + const stringReplace = unapply(String.prototype.replace); + const stringIndexOf = unapply(String.prototype.indexOf); + const stringTrim = unapply(String.prototype.trim); + const objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty); + const regExpTest = unapply(RegExp.prototype.test); + const typeErrorCreate = unconstruct(TypeError); + /** + * Creates a new function that calls the given function with a specified thisArg and arguments. + * + * @param func - The function to be wrapped and called. + * @returns A new function that calls the given function with a specified thisArg and arguments. + */ + function unapply(func) { + return function (thisArg) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return apply(func, thisArg, args); + }; + } + /** + * Creates a new function that constructs an instance of the given constructor function with the provided arguments. + * + * @param func - The constructor function to be wrapped and called. + * @returns A new function that constructs an instance of the given constructor function with the provided arguments. + */ + function unconstruct(func) { + return function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + return construct(func, args); + }; + } + /** + * Add properties to a lookup table + * + * @param set - The set to which elements will be added. + * @param array - The array containing elements to be added to the set. + * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set. + * @returns The modified set with added elements. + */ + function addToSet(set, array) { + let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase; + if (setPrototypeOf) { + // Make 'in' and truthy checks like Boolean(set.constructor) + // independent of any properties defined on Object.prototype. + // Prevent prototype setters from intercepting set as a this value. + setPrototypeOf(set, null); + } + let l = array.length; + while (l--) { + let element = array[l]; + if (typeof element === 'string') { + const lcElement = transformCaseFunc(element); + if (lcElement !== element) { + // Config presets (e.g. tags.js, attrs.js) are immutable. + if (!isFrozen(array)) { + array[l] = lcElement; + } + element = lcElement; + } + } + set[element] = true; + } + return set; + } + /** + * Clean up an array to harden against CSPP + * + * @param array - The array to be cleaned. + * @returns The cleaned version of the array + */ + function cleanArray(array) { + for (let index = 0; index < array.length; index++) { + const isPropertyExist = objectHasOwnProperty(array, index); + if (!isPropertyExist) { + array[index] = null; + } + } + return array; + } + /** + * Shallow clone an object + * + * @param object - The object to be cloned. + * @returns A new object that copies the original. + */ + function clone(object) { + const newObject = create(null); + for (const [property, value] of entries(object)) { + const isPropertyExist = objectHasOwnProperty(object, property); + if (isPropertyExist) { + if (Array.isArray(value)) { + newObject[property] = cleanArray(value); + } else if (value && typeof value === 'object' && value.constructor === Object) { + newObject[property] = clone(value); + } else { + newObject[property] = value; + } + } + } + return newObject; + } + /** + * This method automatically checks if the prop is function or getter and behaves accordingly. + * + * @param object - The object to look up the getter function in its prototype chain. + * @param prop - The property name for which to find the getter function. + * @returns The getter function found in the prototype chain or a fallback function. + */ + function lookupGetter(object, prop) { + while (object !== null) { + const desc = getOwnPropertyDescriptor(object, prop); + if (desc) { + if (desc.get) { + return unapply(desc.get); + } + if (typeof desc.value === 'function') { + return unapply(desc.value); + } + } + object = getPrototypeOf(object); + } + function fallbackValue() { + return null; + } + return fallbackValue; + } + + const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']); + const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']); + const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']); + // List of SVG elements that are disallowed by default. + // We still need to know them so that we can do namespace + // checks properly in case one wants to add them to + // allow-list. + const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']); + const mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']); + // Similarly to SVG, we want to know all MathML elements, + // even those that we disallow by default. + const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']); + const text = freeze(['#text']); + + const html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']); + const svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']); + const mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']); + const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']); + + // eslint-disable-next-line unicorn/better-regex + const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode + const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm); + const TMPLIT_EXPR = seal(/\$\{[\w\W]*}/gm); // eslint-disable-line unicorn/better-regex + const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]+$/); // eslint-disable-line no-useless-escape + const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape + const IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i // eslint-disable-line no-useless-escape + ); + const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i); + const ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex + ); + const DOCTYPE_NAME = seal(/^html$/i); + const CUSTOM_ELEMENT = seal(/^[a-z][.\w]*(-[.\w]+)+$/i); + + var EXPRESSIONS = /*#__PURE__*/Object.freeze({ + __proto__: null, + ARIA_ATTR: ARIA_ATTR, + ATTR_WHITESPACE: ATTR_WHITESPACE, + CUSTOM_ELEMENT: CUSTOM_ELEMENT, + DATA_ATTR: DATA_ATTR, + DOCTYPE_NAME: DOCTYPE_NAME, + ERB_EXPR: ERB_EXPR, + IS_ALLOWED_URI: IS_ALLOWED_URI, + IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA, + MUSTACHE_EXPR: MUSTACHE_EXPR, + TMPLIT_EXPR: TMPLIT_EXPR + }); + + /* eslint-disable @typescript-eslint/indent */ + // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType + const NODE_TYPE = { + element: 1, + attribute: 2, + text: 3, + cdataSection: 4, + entityReference: 5, + // Deprecated + entityNode: 6, + // Deprecated + progressingInstruction: 7, + comment: 8, + document: 9, + documentType: 10, + documentFragment: 11, + notation: 12 // Deprecated + }; + const getGlobal = function getGlobal() { + return typeof window === 'undefined' ? null : window; + }; + /** + * Creates a no-op policy for internal use only. + * Don't export this function outside this module! + * @param trustedTypes The policy factory. + * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix). + * @return The policy created (or null, if Trusted Types + * are not supported or creating the policy failed). + */ + const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) { + if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') { + return null; + } + // Allow the callers to control the unique policy name + // by adding a data-tt-policy-suffix to the script element with the DOMPurify. + // Policy creation with duplicate names throws in Trusted Types. + let suffix = null; + const ATTR_NAME = 'data-tt-policy-suffix'; + if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) { + suffix = purifyHostElement.getAttribute(ATTR_NAME); + } + const policyName = 'dompurify' + (suffix ? '#' + suffix : ''); + try { + return trustedTypes.createPolicy(policyName, { + createHTML(html) { + return html; + }, + createScriptURL(scriptUrl) { + return scriptUrl; + } + }); + } catch (_) { + // Policy creation failed (most likely another DOMPurify script has + // already run). Skip creating the policy, as this will only cause errors + // if TT are enforced. + console.warn('TrustedTypes policy ' + policyName + ' could not be created.'); + return null; + } + }; + const _createHooksMap = function _createHooksMap() { + return { + afterSanitizeAttributes: [], + afterSanitizeElements: [], + afterSanitizeShadowDOM: [], + beforeSanitizeAttributes: [], + beforeSanitizeElements: [], + beforeSanitizeShadowDOM: [], + uponSanitizeAttribute: [], + uponSanitizeElement: [], + uponSanitizeShadowNode: [] + }; + }; + function createDOMPurify() { + let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal(); + const DOMPurify = root => createDOMPurify(root); + DOMPurify.version = '3.2.3'; + DOMPurify.removed = []; + if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document) { + // Not running in a browser, provide a factory function + // so that you can pass your own Window + DOMPurify.isSupported = false; + return DOMPurify; + } + let { + document + } = window; + const originalDocument = document; + const currentScript = originalDocument.currentScript; + const { + DocumentFragment, + HTMLTemplateElement, + Node, + Element, + NodeFilter, + NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap, + HTMLFormElement, + DOMParser, + trustedTypes + } = window; + const ElementPrototype = Element.prototype; + const cloneNode = lookupGetter(ElementPrototype, 'cloneNode'); + const remove = lookupGetter(ElementPrototype, 'remove'); + const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling'); + const getChildNodes = lookupGetter(ElementPrototype, 'childNodes'); + const getParentNode = lookupGetter(ElementPrototype, 'parentNode'); + // As per issue #47, the web-components registry is inherited by a + // new document created via createHTMLDocument. As per the spec + // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries) + // a new empty registry is used when creating a template contents owner + // document, so we use that as our parent document to ensure nothing + // is inherited. + if (typeof HTMLTemplateElement === 'function') { + const template = document.createElement('template'); + if (template.content && template.content.ownerDocument) { + document = template.content.ownerDocument; + } + } + let trustedTypesPolicy; + let emptyHTML = ''; + const { + implementation, + createNodeIterator, + createDocumentFragment, + getElementsByTagName + } = document; + const { + importNode + } = originalDocument; + let hooks = _createHooksMap(); + /** + * Expose whether this browser supports running the full DOMPurify. + */ + DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined; + const { + MUSTACHE_EXPR, + ERB_EXPR, + TMPLIT_EXPR, + DATA_ATTR, + ARIA_ATTR, + IS_SCRIPT_OR_DATA, + ATTR_WHITESPACE, + CUSTOM_ELEMENT + } = EXPRESSIONS; + let { + IS_ALLOWED_URI: IS_ALLOWED_URI$1 + } = EXPRESSIONS; + /** + * We consider the elements and attributes below to be safe. Ideally + * don't add any new ones but feel free to remove unwanted ones. + */ + /* allowed element names */ + let ALLOWED_TAGS = null; + const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]); + /* Allowed attribute names */ + let ALLOWED_ATTR = null; + const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]); + /* + * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements. + * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements) + * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list) + * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`. + */ + let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, { + tagNameCheck: { + writable: true, + configurable: false, + enumerable: true, + value: null + }, + attributeNameCheck: { + writable: true, + configurable: false, + enumerable: true, + value: null + }, + allowCustomizedBuiltInElements: { + writable: true, + configurable: false, + enumerable: true, + value: false + } + })); + /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */ + let FORBID_TAGS = null; + /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */ + let FORBID_ATTR = null; + /* Decide if ARIA attributes are okay */ + let ALLOW_ARIA_ATTR = true; + /* Decide if custom data attributes are okay */ + let ALLOW_DATA_ATTR = true; + /* Decide if unknown protocols are okay */ + let ALLOW_UNKNOWN_PROTOCOLS = false; + /* Decide if self-closing tags in attributes are allowed. + * Usually removed due to a mXSS issue in jQuery 3.0 */ + let ALLOW_SELF_CLOSE_IN_ATTR = true; + /* Output should be safe for common template engines. + * This means, DOMPurify removes data attributes, mustaches and ERB + */ + let SAFE_FOR_TEMPLATES = false; + /* Output should be safe even for XML used within HTML and alike. + * This means, DOMPurify removes comments when containing risky content. + */ + let SAFE_FOR_XML = true; + /* Decide if document with ... should be returned */ + let WHOLE_DOCUMENT = false; + /* Track whether config is already set on this instance of DOMPurify. */ + let SET_CONFIG = false; + /* Decide if all elements (e.g. style, script) must be children of + * document.body. By default, browsers might move them to document.head */ + let FORCE_BODY = false; + /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html + * string (or a TrustedHTML object if Trusted Types are supported). + * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead + */ + let RETURN_DOM = false; + /* Decide if a DOM `DocumentFragment` should be returned, instead of a html + * string (or a TrustedHTML object if Trusted Types are supported) */ + let RETURN_DOM_FRAGMENT = false; + /* Try to return a Trusted Type object instead of a string, return a string in + * case Trusted Types are not supported */ + let RETURN_TRUSTED_TYPE = false; + /* Output should be free from DOM clobbering attacks? + * This sanitizes markups named with colliding, clobberable built-in DOM APIs. + */ + let SANITIZE_DOM = true; + /* Achieve full DOM Clobbering protection by isolating the namespace of named + * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules. + * + * HTML/DOM spec rules that enable DOM Clobbering: + * - Named Access on Window (§7.3.3) + * - DOM Tree Accessors (§3.1.5) + * - Form Element Parent-Child Relations (§4.10.3) + * - Iframe srcdoc / Nested WindowProxies (§4.8.5) + * - HTMLCollection (§4.2.10.2) + * + * Namespace isolation is implemented by prefixing `id` and `name` attributes + * with a constant string, i.e., `user-content-` + */ + let SANITIZE_NAMED_PROPS = false; + const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-'; + /* Keep element content when removing element? */ + let KEEP_CONTENT = true; + /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead + * of importing it into a new Document and returning a sanitized copy */ + let IN_PLACE = false; + /* Allow usage of profiles like html, svg and mathMl */ + let USE_PROFILES = {}; + /* Tags to ignore content of when KEEP_CONTENT is true */ + let FORBID_CONTENTS = null; + const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']); + /* Tags that are safe for data: URIs */ + let DATA_URI_TAGS = null; + const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']); + /* Attributes safe for values like "javascript:" */ + let URI_SAFE_ATTRIBUTES = null; + const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']); + const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; + const SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; + const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; + /* Document namespace */ + let NAMESPACE = HTML_NAMESPACE; + let IS_EMPTY_INPUT = false; + /* Allowed XHTML+XML namespaces */ + let ALLOWED_NAMESPACES = null; + const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString); + let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']); + let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']); + // Certain elements are allowed in both SVG and HTML + // namespace. We need to specify them explicitly + // so that they don't get erroneously deleted from + // HTML namespace. + const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']); + /* Parsing of strict XHTML documents */ + let PARSER_MEDIA_TYPE = null; + const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html']; + const DEFAULT_PARSER_MEDIA_TYPE = 'text/html'; + let transformCaseFunc = null; + /* Keep a reference to config to pass to hooks */ + let CONFIG = null; + /* Ideally, do not touch anything below this line */ + /* ______________________________________________ */ + const formElement = document.createElement('form'); + const isRegexOrFunction = function isRegexOrFunction(testValue) { + return testValue instanceof RegExp || testValue instanceof Function; + }; + /** + * _parseConfig + * + * @param cfg optional config literal + */ + // eslint-disable-next-line complexity + const _parseConfig = function _parseConfig() { + let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + if (CONFIG && CONFIG === cfg) { + return; + } + /* Shield configuration object from tampering */ + if (!cfg || typeof cfg !== 'object') { + cfg = {}; + } + /* Shield configuration object from prototype pollution */ + cfg = clone(cfg); + PARSER_MEDIA_TYPE = + // eslint-disable-next-line unicorn/prefer-includes + SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE; + // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is. + transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase; + /* Set configuration parameters */ + ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS; + ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR; + ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES; + URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES; + DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS; + FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS; + FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {}; + FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {}; + USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false; + ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true + ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true + ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false + ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true + SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false + SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true + WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false + RETURN_DOM = cfg.RETURN_DOM || false; // Default false + RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false + RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false + FORCE_BODY = cfg.FORCE_BODY || false; // Default false + SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true + SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false + KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true + IN_PLACE = cfg.IN_PLACE || false; // Default false + IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI; + NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE; + MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS; + HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS; + CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {}; + if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) { + CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck; + } + if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) { + CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck; + } + if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') { + CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements; + } + if (SAFE_FOR_TEMPLATES) { + ALLOW_DATA_ATTR = false; + } + if (RETURN_DOM_FRAGMENT) { + RETURN_DOM = true; + } + /* Parse profile info */ + if (USE_PROFILES) { + ALLOWED_TAGS = addToSet({}, text); + ALLOWED_ATTR = []; + if (USE_PROFILES.html === true) { + addToSet(ALLOWED_TAGS, html$1); + addToSet(ALLOWED_ATTR, html); + } + if (USE_PROFILES.svg === true) { + addToSet(ALLOWED_TAGS, svg$1); + addToSet(ALLOWED_ATTR, svg); + addToSet(ALLOWED_ATTR, xml); + } + if (USE_PROFILES.svgFilters === true) { + addToSet(ALLOWED_TAGS, svgFilters); + addToSet(ALLOWED_ATTR, svg); + addToSet(ALLOWED_ATTR, xml); + } + if (USE_PROFILES.mathMl === true) { + addToSet(ALLOWED_TAGS, mathMl$1); + addToSet(ALLOWED_ATTR, mathMl); + addToSet(ALLOWED_ATTR, xml); + } + } + /* Merge configuration parameters */ + if (cfg.ADD_TAGS) { + if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) { + ALLOWED_TAGS = clone(ALLOWED_TAGS); + } + addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc); + } + if (cfg.ADD_ATTR) { + if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) { + ALLOWED_ATTR = clone(ALLOWED_ATTR); + } + addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc); + } + if (cfg.ADD_URI_SAFE_ATTR) { + addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc); + } + if (cfg.FORBID_CONTENTS) { + if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) { + FORBID_CONTENTS = clone(FORBID_CONTENTS); + } + addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc); + } + /* Add #text in case KEEP_CONTENT is set to true */ + if (KEEP_CONTENT) { + ALLOWED_TAGS['#text'] = true; + } + /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */ + if (WHOLE_DOCUMENT) { + addToSet(ALLOWED_TAGS, ['html', 'head', 'body']); + } + /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */ + if (ALLOWED_TAGS.table) { + addToSet(ALLOWED_TAGS, ['tbody']); + delete FORBID_TAGS.tbody; + } + if (cfg.TRUSTED_TYPES_POLICY) { + if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') { + throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.'); + } + if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') { + throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.'); + } + // Overwrite existing TrustedTypes policy. + trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY; + // Sign local variables required by `sanitize`. + emptyHTML = trustedTypesPolicy.createHTML(''); + } else { + // Uninitialized policy, attempt to initialize the internal dompurify policy. + if (trustedTypesPolicy === undefined) { + trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript); + } + // If creating the internal policy succeeded sign internal variables. + if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') { + emptyHTML = trustedTypesPolicy.createHTML(''); + } + } + // Prevent further manipulation of configuration. + // Not available in IE8, Safari 5, etc. + if (freeze) { + freeze(cfg); + } + CONFIG = cfg; + }; + /* Keep track of all possible SVG and MathML tags + * so that we can perform the namespace checks + * correctly. */ + const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]); + const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]); + /** + * @param element a DOM element whose namespace is being checked + * @returns Return false if the element has a + * namespace that a spec-compliant parser would never + * return. Return true otherwise. + */ + const _checkValidNamespace = function _checkValidNamespace(element) { + let parent = getParentNode(element); + // In JSDOM, if we're inside shadow DOM, then parentNode + // can be null. We just simulate parent in this case. + if (!parent || !parent.tagName) { + parent = { + namespaceURI: NAMESPACE, + tagName: 'template' + }; + } + const tagName = stringToLowerCase(element.tagName); + const parentTagName = stringToLowerCase(parent.tagName); + if (!ALLOWED_NAMESPACES[element.namespaceURI]) { + return false; + } + if (element.namespaceURI === SVG_NAMESPACE) { + // The only way to switch from HTML namespace to SVG + // is via . If it happens via any other tag, then + // it should be killed. + if (parent.namespaceURI === HTML_NAMESPACE) { + return tagName === 'svg'; + } + // The only way to switch from MathML to SVG is via` + // svg if parent is either or MathML + // text integration points. + if (parent.namespaceURI === MATHML_NAMESPACE) { + return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]); + } + // We only allow elements that are defined in SVG + // spec. All others are disallowed in SVG namespace. + return Boolean(ALL_SVG_TAGS[tagName]); + } + if (element.namespaceURI === MATHML_NAMESPACE) { + // The only way to switch from HTML namespace to MathML + // is via . If it happens via any other tag, then + // it should be killed. + if (parent.namespaceURI === HTML_NAMESPACE) { + return tagName === 'math'; + } + // The only way to switch from SVG to MathML is via + // and HTML integration points + if (parent.namespaceURI === SVG_NAMESPACE) { + return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName]; + } + // We only allow elements that are defined in MathML + // spec. All others are disallowed in MathML namespace. + return Boolean(ALL_MATHML_TAGS[tagName]); + } + if (element.namespaceURI === HTML_NAMESPACE) { + // The only way to switch from SVG to HTML is via + // HTML integration points, and from MathML to HTML + // is via MathML text integration points + if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) { + return false; + } + if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) { + return false; + } + // We disallow tags that are specific for MathML + // or SVG and should never appear in HTML namespace + return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]); + } + // For XHTML and XML documents that support custom namespaces + if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) { + return true; + } + // The code should never reach this place (this means + // that the element somehow got namespace that is not + // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES). + // Return false just in case. + return false; + }; + /** + * _forceRemove + * + * @param node a DOM node + */ + const _forceRemove = function _forceRemove(node) { + arrayPush(DOMPurify.removed, { + element: node + }); + try { + // eslint-disable-next-line unicorn/prefer-dom-node-remove + getParentNode(node).removeChild(node); + } catch (_) { + remove(node); + } + }; + /** + * _removeAttribute + * + * @param name an Attribute name + * @param element a DOM node + */ + const _removeAttribute = function _removeAttribute(name, element) { + try { + arrayPush(DOMPurify.removed, { + attribute: element.getAttributeNode(name), + from: element + }); + } catch (_) { + arrayPush(DOMPurify.removed, { + attribute: null, + from: element + }); + } + element.removeAttribute(name); + // We void attribute values for unremovable "is" attributes + if (name === 'is') { + if (RETURN_DOM || RETURN_DOM_FRAGMENT) { + try { + _forceRemove(element); + } catch (_) {} + } else { + try { + element.setAttribute(name, ''); + } catch (_) {} + } + } + }; + /** + * _initDocument + * + * @param dirty - a string of dirty markup + * @return a DOM, filled with the dirty markup + */ + const _initDocument = function _initDocument(dirty) { + /* Create a HTML document */ + let doc = null; + let leadingWhitespace = null; + if (FORCE_BODY) { + dirty = '' + dirty; + } else { + /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */ + const matches = stringMatch(dirty, /^[\r\n\t ]+/); + leadingWhitespace = matches && matches[0]; + } + if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) { + // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict) + dirty = '' + dirty + ''; + } + const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty; + /* + * Use the DOMParser API by default, fallback later if needs be + * DOMParser not work for svg when has multiple root element. + */ + if (NAMESPACE === HTML_NAMESPACE) { + try { + doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE); + } catch (_) {} + } + /* Use createHTMLDocument in case DOMParser is not available */ + if (!doc || !doc.documentElement) { + doc = implementation.createDocument(NAMESPACE, 'template', null); + try { + doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload; + } catch (_) { + // Syntax error if dirtyPayload is invalid xml + } + } + const body = doc.body || doc.documentElement; + if (dirty && leadingWhitespace) { + body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null); + } + /* Work on whole document or just its body */ + if (NAMESPACE === HTML_NAMESPACE) { + return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0]; + } + return WHOLE_DOCUMENT ? doc.documentElement : body; + }; + /** + * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document. + * + * @param root The root element or node to start traversing on. + * @return The created NodeIterator + */ + const _createNodeIterator = function _createNodeIterator(root) { + return createNodeIterator.call(root.ownerDocument || root, root, + // eslint-disable-next-line no-bitwise + NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null); + }; + /** + * _isClobbered + * + * @param element element to check for clobbering attacks + * @return true if clobbered, false if safe + */ + const _isClobbered = function _isClobbered(element) { + return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function'); + }; + /** + * Checks whether the given object is a DOM node. + * + * @param value object to check whether it's a DOM node + * @return true is object is a DOM node + */ + const _isNode = function _isNode(value) { + return typeof Node === 'function' && value instanceof Node; + }; + function _executeHooks(hooks, currentNode, data) { + arrayForEach(hooks, hook => { + hook.call(DOMPurify, currentNode, data, CONFIG); + }); + } + /** + * _sanitizeElements + * + * @protect nodeName + * @protect textContent + * @protect removeChild + * @param currentNode to check for permission to exist + * @return true if node was killed, false if left alive + */ + const _sanitizeElements = function _sanitizeElements(currentNode) { + let content = null; + /* Execute a hook if present */ + _executeHooks(hooks.beforeSanitizeElements, currentNode, null); + /* Check if element is clobbered or can clobber */ + if (_isClobbered(currentNode)) { + _forceRemove(currentNode); + return true; + } + /* Now let's check the element's type and name */ + const tagName = transformCaseFunc(currentNode.nodeName); + /* Execute a hook if present */ + _executeHooks(hooks.uponSanitizeElement, currentNode, { + tagName, + allowedTags: ALLOWED_TAGS + }); + /* Detect mXSS attempts abusing namespace confusion */ + if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) { + _forceRemove(currentNode); + return true; + } + /* Remove any occurrence of processing instructions */ + if (currentNode.nodeType === NODE_TYPE.progressingInstruction) { + _forceRemove(currentNode); + return true; + } + /* Remove any kind of possibly harmful comments */ + if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\w]/g, currentNode.data)) { + _forceRemove(currentNode); + return true; + } + /* Remove element if anything forbids its presence */ + if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) { + /* Check if we have a custom element to handle */ + if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) { + if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) { + return false; + } + if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) { + return false; + } + } + /* Keep content except for bad-listed elements */ + if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) { + const parentNode = getParentNode(currentNode) || currentNode.parentNode; + const childNodes = getChildNodes(currentNode) || currentNode.childNodes; + if (childNodes && parentNode) { + const childCount = childNodes.length; + for (let i = childCount - 1; i >= 0; --i) { + const childClone = cloneNode(childNodes[i], true); + childClone.__removalCount = (currentNode.__removalCount || 0) + 1; + parentNode.insertBefore(childClone, getNextSibling(currentNode)); + } + } + } + _forceRemove(currentNode); + return true; + } + /* Check whether element has a valid namespace */ + if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) { + _forceRemove(currentNode); + return true; + } + /* Make sure that older browsers don't get fallback-tag mXSS */ + if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\/no(script|embed|frames)/i, currentNode.innerHTML)) { + _forceRemove(currentNode); + return true; + } + /* Sanitize element content to be template-safe */ + if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) { + /* Get the element's text content */ + content = currentNode.textContent; + arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { + content = stringReplace(content, expr, ' '); + }); + if (currentNode.textContent !== content) { + arrayPush(DOMPurify.removed, { + element: currentNode.cloneNode() + }); + currentNode.textContent = content; + } + } + /* Execute a hook if present */ + _executeHooks(hooks.afterSanitizeElements, currentNode, null); + return false; + }; + /** + * _isValidAttribute + * + * @param lcTag Lowercase tag name of containing element. + * @param lcName Lowercase attribute name. + * @param value Attribute value. + * @return Returns true if `value` is valid, otherwise false. + */ + // eslint-disable-next-line complexity + const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) { + /* Make sure attribute cannot clobber */ + if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) { + return false; + } + /* Allow valid data-* attributes: At least one character after "-" + (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes) + XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804) + We don't need to check the value; it's always URI safe. */ + if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) { + if ( + // First condition does a very basic check if a) it's basically a valid custom element tagname AND + // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck + // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck + _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) || + // Alternative, second condition checks if it's an `is`-attribute, AND + // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck + lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else { + return false; + } + /* Check value is safe. First, is attr inert? If so, is safe */ + } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) { + return false; + } else ; + return true; + }; + /** + * _isBasicCustomElement + * checks if at least one dash is included in tagName, and it's not the first char + * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name + * + * @param tagName name of the tag of the node to sanitize + * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false. + */ + const _isBasicCustomElement = function _isBasicCustomElement(tagName) { + return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT); + }; + /** + * _sanitizeAttributes + * + * @protect attributes + * @protect nodeName + * @protect removeAttribute + * @protect setAttribute + * + * @param currentNode to sanitize + */ + const _sanitizeAttributes = function _sanitizeAttributes(currentNode) { + /* Execute a hook if present */ + _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null); + const { + attributes + } = currentNode; + /* Check if we have attributes; if not we might have a text node */ + if (!attributes || _isClobbered(currentNode)) { + return; + } + const hookEvent = { + attrName: '', + attrValue: '', + keepAttr: true, + allowedAttributes: ALLOWED_ATTR, + forceKeepAttr: undefined + }; + let l = attributes.length; + /* Go backwards over all attributes; safely remove bad ones */ + while (l--) { + const attr = attributes[l]; + const { + name, + namespaceURI, + value: attrValue + } = attr; + const lcName = transformCaseFunc(name); + let value = name === 'value' ? attrValue : stringTrim(attrValue); + /* Execute a hook if present */ + hookEvent.attrName = lcName; + hookEvent.attrValue = value; + hookEvent.keepAttr = true; + hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set + _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent); + value = hookEvent.attrValue; + /* Full DOM Clobbering protection via namespace isolation, + * Prefix id and name attributes with `user-content-` + */ + if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) { + // Remove the attribute with this value + _removeAttribute(name, currentNode); + // Prefix the value and later re-create the attribute with the sanitized value + value = SANITIZE_NAMED_PROPS_PREFIX + value; + } + /* Work around a security issue with comments inside attributes */ + if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|title)/i, value)) { + _removeAttribute(name, currentNode); + continue; + } + /* Did the hooks approve of the attribute? */ + if (hookEvent.forceKeepAttr) { + continue; + } + /* Remove attribute */ + _removeAttribute(name, currentNode); + /* Did the hooks approve of the attribute? */ + if (!hookEvent.keepAttr) { + continue; + } + /* Work around a security issue in jQuery 3.0 */ + if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\/>/i, value)) { + _removeAttribute(name, currentNode); + continue; + } + /* Sanitize attribute content to be template-safe */ + if (SAFE_FOR_TEMPLATES) { + arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { + value = stringReplace(value, expr, ' '); + }); + } + /* Is `value` valid for this attribute? */ + const lcTag = transformCaseFunc(currentNode.nodeName); + if (!_isValidAttribute(lcTag, lcName, value)) { + continue; + } + /* Handle attributes that require Trusted Types */ + if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') { + if (namespaceURI) ; else { + switch (trustedTypes.getAttributeType(lcTag, lcName)) { + case 'TrustedHTML': + { + value = trustedTypesPolicy.createHTML(value); + break; + } + case 'TrustedScriptURL': + { + value = trustedTypesPolicy.createScriptURL(value); + break; + } + } + } + } + /* Handle invalid data-* attribute set by try-catching it */ + try { + if (namespaceURI) { + currentNode.setAttributeNS(namespaceURI, name, value); + } else { + /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */ + currentNode.setAttribute(name, value); + } + if (_isClobbered(currentNode)) { + _forceRemove(currentNode); + } else { + arrayPop(DOMPurify.removed); + } + } catch (_) {} + } + /* Execute a hook if present */ + _executeHooks(hooks.afterSanitizeAttributes, currentNode, null); + }; + /** + * _sanitizeShadowDOM + * + * @param fragment to iterate over recursively + */ + const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) { + let shadowNode = null; + const shadowIterator = _createNodeIterator(fragment); + /* Execute a hook if present */ + _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null); + while (shadowNode = shadowIterator.nextNode()) { + /* Execute a hook if present */ + _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null); + /* Sanitize tags and elements */ + _sanitizeElements(shadowNode); + /* Check attributes next */ + _sanitizeAttributes(shadowNode); + /* Deep shadow DOM detected */ + if (shadowNode.content instanceof DocumentFragment) { + _sanitizeShadowDOM(shadowNode.content); + } + } + /* Execute a hook if present */ + _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null); + }; + // eslint-disable-next-line complexity + DOMPurify.sanitize = function (dirty) { + let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let body = null; + let importedNode = null; + let currentNode = null; + let returnNode = null; + /* Make sure we have a string to sanitize. + DO NOT return early, as this will return the wrong type if + the user has requested a DOM object rather than a string */ + IS_EMPTY_INPUT = !dirty; + if (IS_EMPTY_INPUT) { + dirty = ''; + } + /* Stringify, in case dirty is an object */ + if (typeof dirty !== 'string' && !_isNode(dirty)) { + if (typeof dirty.toString === 'function') { + dirty = dirty.toString(); + if (typeof dirty !== 'string') { + throw typeErrorCreate('dirty is not a string, aborting'); + } + } else { + throw typeErrorCreate('toString is not a function'); + } + } + /* Return dirty HTML if DOMPurify cannot run */ + if (!DOMPurify.isSupported) { + return dirty; + } + /* Assign config vars */ + if (!SET_CONFIG) { + _parseConfig(cfg); + } + /* Clean up removed elements */ + DOMPurify.removed = []; + /* Check if dirty is correctly typed for IN_PLACE */ + if (typeof dirty === 'string') { + IN_PLACE = false; + } + if (IN_PLACE) { + /* Do some early pre-sanitization to avoid unsafe root nodes */ + if (dirty.nodeName) { + const tagName = transformCaseFunc(dirty.nodeName); + if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) { + throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place'); + } + } + } else if (dirty instanceof Node) { + /* If dirty is a DOM element, append to an empty document to avoid + elements being stripped by the parser */ + body = _initDocument(''); + importedNode = body.ownerDocument.importNode(dirty, true); + if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') { + /* Node is already a body, use as is */ + body = importedNode; + } else if (importedNode.nodeName === 'HTML') { + body = importedNode; + } else { + // eslint-disable-next-line unicorn/prefer-dom-node-append + body.appendChild(importedNode); + } + } else { + /* Exit directly if we have nothing to do */ + if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && + // eslint-disable-next-line unicorn/prefer-includes + dirty.indexOf('<') === -1) { + return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty; + } + /* Initialize the document to work on */ + body = _initDocument(dirty); + /* Check we have a DOM node from the data */ + if (!body) { + return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : ''; + } + } + /* Remove first element node (ours) if FORCE_BODY is set */ + if (body && FORCE_BODY) { + _forceRemove(body.firstChild); + } + /* Get node iterator */ + const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body); + /* Now start iterating over the created document */ + while (currentNode = nodeIterator.nextNode()) { + /* Sanitize tags and elements */ + _sanitizeElements(currentNode); + /* Check attributes next */ + _sanitizeAttributes(currentNode); + /* Shadow DOM detected, sanitize it */ + if (currentNode.content instanceof DocumentFragment) { + _sanitizeShadowDOM(currentNode.content); + } + } + /* If we sanitized `dirty` in-place, return it. */ + if (IN_PLACE) { + return dirty; + } + /* Return sanitized string or DOM */ + if (RETURN_DOM) { + if (RETURN_DOM_FRAGMENT) { + returnNode = createDocumentFragment.call(body.ownerDocument); + while (body.firstChild) { + // eslint-disable-next-line unicorn/prefer-dom-node-append + returnNode.appendChild(body.firstChild); + } + } else { + returnNode = body; + } + if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) { + /* + AdoptNode() is not used because internal state is not reset + (e.g. the past names map of a HTMLFormElement), this is safe + in theory but we would rather not risk another attack vector. + The state that is cloned by importNode() is explicitly defined + by the specs. + */ + returnNode = importNode.call(originalDocument, returnNode, true); + } + return returnNode; + } + let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML; + /* Serialize doctype if allowed */ + if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) { + serializedHTML = '\n' + serializedHTML; + } + /* Sanitize final string template-safe */ + if (SAFE_FOR_TEMPLATES) { + arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => { + serializedHTML = stringReplace(serializedHTML, expr, ' '); + }); + } + return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML; + }; + DOMPurify.setConfig = function () { + let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + _parseConfig(cfg); + SET_CONFIG = true; + }; + DOMPurify.clearConfig = function () { + CONFIG = null; + SET_CONFIG = false; + }; + DOMPurify.isValidAttribute = function (tag, attr, value) { + /* Initialize shared config vars if necessary. */ + if (!CONFIG) { + _parseConfig({}); + } + const lcTag = transformCaseFunc(tag); + const lcName = transformCaseFunc(attr); + return _isValidAttribute(lcTag, lcName, value); + }; + DOMPurify.addHook = function (entryPoint, hookFunction) { + if (typeof hookFunction !== 'function') { + return; + } + arrayPush(hooks[entryPoint], hookFunction); + }; + DOMPurify.removeHook = function (entryPoint) { + return arrayPop(hooks[entryPoint]); + }; + DOMPurify.removeHooks = function (entryPoint) { + hooks[entryPoint] = []; + }; + DOMPurify.removeAllHooks = function () { + hooks = _createHooksMap(); + }; + return DOMPurify; + } + var purify = createDOMPurify(); + + return purify; + +})); +//# sourceMappingURL=purify.js.map \ No newline at end of file diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/ruoyi/js/ry-ui.js b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/ruoyi/js/ry-ui.js index 4da5b6cb..6318c584 100644 --- a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/ruoyi/js/ry-ui.js +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/static/ruoyi/js/ry-ui.js @@ -10,12 +10,12 @@ var table = { options: {}, // 设置实例配置 set: function(id) { - if($.common.getLength(table.config) > 1) { - var tableId = $.common.isEmpty(id) ? $(event.currentTarget).parents(".bootstrap-table").find(".table").attr("id") : id; + if ($.common.getLength(table.config) > 1 && $.common.isNotEmpty(event)) { + var tableId = $.common.isEmpty(id) ? $(event.currentTarget).parents(".bootstrap-table").find("table.table").attr("id") || $(event.currentTarget).parents(".bootstrap-tree-table").find("table.table").attr("id") : id; if ($.common.isNotEmpty(tableId)) { table.options = table.get(tableId); } - } + } }, // 获取实例配置 get: function(id) { @@ -28,154 +28,172 @@ var table = { }; (function ($) { - $.ajaxSetup({ - cache: true, - headers: { - "token": window.parent.token - }, - }); $.extend({ - _tree: {}, - bttTable: {}, - // 表格封装处理 - table: { + _tree: {}, + bttTable: {}, + // 表格封装处理 + table: { // 初始化表格参数 init: function(options) { - var defaults = { - id: "bootstrap-table", - type: 0, // 0 代表bootstrapTable 1代表bootstrapTreeTable - height:$(window).height()-$(".search-collapse").height()-$("#toolbar").height(), - // height: undefined, - sidePagination: "server", - sortName: "", - sortOrder: "asc", - pagination: true, - pageSize: 10, - pageList: [10, 25, 50], - toolbar: "toolbar", - striped: false, - escape: false, - firstLoad: true, - showFooter: false, - search: false, + var defaults = { + id: "bootstrap-table", + type: 0, // 0 代表bootstrapTable 1代表bootstrapTreeTable + method: 'post', + height: undefined, + sidePagination: "server", + undefinedText: '-', + sortName: undefined, + sortOrder: "asc", + pagination: true, + paginationLoop: false, + pageSize: 10, + pageNumber: 1, + pageList: [10, 25, 50, 100], + toolbar: "toolbar", + loadingFontSize: 13, + striped: false, + escape: true, + firstLoad: true, + showFooter: false, + search: false, showSearch: true, showPageGo: false, showRefresh: true, showColumns: true, showToggle: true, showExport: false, + showPrint: false, + exportDataType: 'all', + exportTypes: ['csv', 'txt', 'doc', 'excel'], clickToSelect: false, singleSelect: false, mobileResponsive: true, + maintainSelected: false, rememberSelected: false, - fixedColumns: false, - fixedNumber: 0, - rightFixedColumns: false, - rightFixedNumber: 0, - queryParams: $.table.queryParams, - rowStyle: {}, - }; - var options = $.extend(defaults, options); - table.options = options; - table.config[options.id] = options; + fixedColumns: false, + fixedNumber: 0, + fixedRightNumber: 0, + queryParams: $.table.queryParams, + rowStyle: undefined + }; + var options = $.extend(defaults, options); + table.options = options; + table.config[options.id] = options; $.table.initEvent(); $('#' + options.id).bootstrapTable({ - id: options.id, + id: options.id, url: options.url, // 请求后台的URL(*) contentType: "application/x-www-form-urlencoded", // 编码类型 - method: 'post', // 请求方式(*) + method: options.method, // 请求方式(*) cache: false, // 是否使用缓存 height: options.height, // 表格的高度 striped: options.striped, // 是否显示行间隔色 + undefinedText: options.undefinedText, // 数据值为空时显示的内容 sortable: true, // 是否启用排序 sortStable: true, // 设置为 true 将获得稳定的排序 sortName: options.sortName, // 排序列名称 sortOrder: options.sortOrder, // 排序方式 asc 或者 desc pagination: options.pagination, // 是否显示分页(*) + paginationLoop: options.paginationLoop, // 是否启用分页条无限循环的功能 pageNumber: 1, // 初始化加载第一页,默认第一页 - pageSize: options.pageSize, // 每页的记录行数(*) + pageSize: options.pageSize, // 每页的记录行数(*) pageList: options.pageList, // 可供选择的每页的行数(*) firstLoad: options.firstLoad, // 是否首次请求加载数据,对于数据较大可以配置false escape: options.escape, // 转义HTML字符串 showFooter: options.showFooter, // 是否显示表尾 iconSize: 'outline', // 图标大小:undefined默认的按钮尺寸 xs超小按钮sm小按钮lg大按钮 toolbar: '#' + options.toolbar, // 指定工作栏 + virtualScroll: options.virtualScroll, // 是否启动虚拟滚动(大量数据纯展示时使用) + loadingFontSize: options.loadingFontSize, // 自定义加载文本的字体大小 sidePagination: options.sidePagination, // server启用服务端分页client客户端分页 search: options.search, // 是否显示搜索框功能 searchText: options.searchText, // 搜索框初始显示的内容,默认为空 showSearch: options.showSearch, // 是否显示检索信息 - showPageGo: options.showPageGo, // 是否显示跳转页 + showPageGo: options.showPageGo, // 是否显示跳转页 showRefresh: options.showRefresh, // 是否显示刷新按钮 showColumns: options.showColumns, // 是否显示隐藏某列下拉框 showToggle: options.showToggle, // 是否显示详细视图和列表视图的切换按钮 showExport: options.showExport, // 是否支持导出文件 - uniqueId: options.uniqueId, // 唯 一的标识符 - clickToSelect: options.clickToSelect, // 是否启用点击选中行 + showPrint: options.showPrint, // 是否支持打印页面 + showHeader: options.showHeader, // 是否显示表头 + showFullscreen: options.showFullscreen, // 是否显示全屏按钮 + uniqueId: options.uniqueId, // 唯一的标识符 + clickToSelect: options.clickToSelect, // 是否启用点击选中行 singleSelect: options.singleSelect, // 是否单选checkbox mobileResponsive: options.mobileResponsive, // 是否支持移动端适配 + cardView: options.cardView, // 是否启用显示卡片视图 detailView: options.detailView, // 是否启用显示细节视图 + onCheck: options.onCheck, // 当选择此行时触发 + onUncheck: options.onUncheck, // 当取消此行时触发 + onCheckAll: options.onCheckAll, // 当全选行时触发 + onUncheckAll: options.onUncheckAll, // 当取消全选行时触发 onClickRow: options.onClickRow, // 点击某行触发的事件 onDblClickRow: options.onDblClickRow, // 双击某行触发的事件 onClickCell: options.onClickCell, // 单击某格触发的事件 onDblClickCell: options.onDblClickCell, // 双击某格触发的事件 onEditableSave: options.onEditableSave, // 行内编辑保存的事件 onExpandRow: options.onExpandRow, // 点击详细视图的事件 + onPostBody: options.onPostBody, // 渲染完成后执行的事件 + maintainSelected: options.maintainSelected, // 前端翻页时保留所选行 rememberSelected: options.rememberSelected, // 启用翻页记住前面的选择 fixedColumns: options.fixedColumns, // 是否启用冻结列(左侧) fixedNumber: options.fixedNumber, // 列冻结的个数(左侧) - rightFixedColumns: options.rightFixedColumns, // 是否启用冻结列(右侧) - rightFixedNumber: options.rightFixedNumber, // 列冻结的个数(右侧) + fixedRightNumber: options.fixedRightNumber, // 列冻结的个数(右侧) onReorderRow: options.onReorderRow, // 当拖拽结束后处理函数 queryParams: options.queryParams, // 传递参数(*) rowStyle: options.rowStyle, // 通过自定义函数设置行样式 + footerStyle: options.footerStyle, // 通过自定义函数设置页脚样式 + headerStyle: options.headerStyle, // 通过自定义函数设置标题样式 columns: options.columns, // 显示列信息(*) + data: options.data, // 被加载的数据 responseHandler: $.table.responseHandler, // 在加载服务器发送来的数据之前处理函数 onLoadSuccess: $.table.onLoadSuccess, // 当所有数据被加载时触发处理函数 exportOptions: options.exportOptions, // 前端导出忽略列索引 + exportDataType: options.exportDataType, // 导出方式(默认all:导出所有数据;basic:导出当前页的数据;selected:导出选中的数据) + exportTypes: options.exportTypes, // 导出文件类型 (json、xml、png、csv、txt、sql、doc、excel、xlsx、powerpoint、pdf) + printPageBuilder: options.printPageBuilder, // 自定义打印页面模板 detailFormatter: options.detailFormatter, // 在行下面展示其他数据列表 - showCustomImport:options.showCustomImport, //导入 - customImportFunction:options.customImportFunction, //当showCustomExport为true 这个方法为导入 - showCustomExport:options.showCustomExport, - customExportFunction:options.customExportFunction, }); }, // 获取实例ID,如存在多个返回#id1,#id2 delimeter分隔符 getOptionsIds: function(separator) { - var _separator = $.common.isEmpty(separator) ? "," : separator; - var optionsIds = ""; - $.each(table.config, function(key, value){ - optionsIds += "#" + key + _separator; - }); - return optionsIds.substring(0, optionsIds.length - 1); + var _separator = $.common.isEmpty(separator) ? "," : separator; + var optionsIds = ""; + $.each(table.config, function(key, value){ + optionsIds += "#" + key + _separator; + }); + return optionsIds.substring(0, optionsIds.length - 1); }, // 查询条件 queryParams: function(params) { - var curParams = { - // 传递参数查询参数 - pageSize: params.limit, - pageNum: params.offset / params.limit + 1, - searchValue: params.search, - orderByColumn: params.sort, - isAsc: params.order - }; - var currentId = $.common.isEmpty(table.options.formId) ? $('form').attr('id') : table.options.formId; - return $.extend(curParams, $.common.formToJSON(currentId)); + table.set(); + var curParams = { + // 传递参数查询参数 + pageSize: params.limit, + pageNum: params.offset / params.limit + 1, + searchValue: params.search, + orderByColumn: params.sort, + isAsc: params.order + }; + var currentId = $.common.isEmpty(table.options.formId) ? $('form').attr('id') : table.options.formId; + return $.extend(curParams, $.common.formToJSON(currentId)); }, // 请求获取数据后处理回调函数 responseHandler: function(res) { - if (typeof table.options.responseHandler == "function") { - table.options.responseHandler(res); + if (typeof table.get(this.id).responseHandler == "function") { + table.get(this.id).responseHandler(res); } - if (res.code == 0) { - if ($.common.isNotEmpty(table.options.sidePagination) && table.options.sidePagination == 'client') { - return res.rows; + var thisOptions = table.config[this.id]; + if (res.code == web_status.SUCCESS) { + if ($.common.isNotEmpty(thisOptions.sidePagination) && thisOptions.sidePagination == 'client') { + return res.rows; } else { - if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) { - var column = $.common.isEmpty(table.options.uniqueId) ? table.options.columns[1].field : table.options.uniqueId; - $.each(res.rows, function(i, row) { - row.state = $.inArray(row[column], table.rememberSelectedIds[table.options.id]) !== -1; + if ($.common.isNotEmpty(thisOptions.rememberSelected) && thisOptions.rememberSelected) { + var column = $.common.isEmpty(thisOptions.uniqueId) ? thisOptions.columns[1].field : thisOptions.uniqueId; + $.each(res.rows, function(i, row) { + row.state = $.inArray(row[column], table.rememberSelectedIds[thisOptions.id]) !== -1; }) - } + } return { rows: res.rows, total: res.total }; } } else { @@ -185,558 +203,660 @@ var table = { }, // 初始化事件 initEvent: function() { - // 实例ID信息 - var optionsIds = $.table.getOptionsIds(); - // 监听事件处理 - $(optionsIds).on(TABLE_EVENTS, function () { - table.set($(this).attr("id")); - }); - // 选中、取消、全部选中、全部取消(事件) - $(optionsIds).on("check.bs.table check-all.bs.table uncheck.bs.table uncheck-all.bs.table", function (e, rows) { - // 复选框分页保留保存选中数组 - var rowIds = $.table.affectedRowIds(rows); - if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) { - func = $.inArray(e.type, ['check', 'check-all']) > -1 ? 'union' : 'difference'; - var selectedIds = table.rememberSelectedIds[table.options.id]; - if($.common.isNotEmpty(selectedIds)) { - table.rememberSelectedIds[table.options.id] = _[func](selectedIds, rowIds); - } else { - table.rememberSelectedIds[table.options.id] = _[func]([], rowIds); - } - var selectedRows = table.rememberSelecteds[table.options.id]; - if($.common.isNotEmpty(selectedRows)) { - table.rememberSelecteds[table.options.id] = _[func](selectedRows, rows); - } else { - table.rememberSelecteds[table.options.id] = _[func]([], rows); - } - } - }); - // 加载成功、选中、取消、全部选中、全部取消(事件) - $(optionsIds).on("check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table load-success.bs.table", function () { - var toolbar = table.options.toolbar; - var uniqueId = table.options.uniqueId; - // 工具栏按钮控制 - var rows = $.common.isEmpty(uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(uniqueId); - // 非多个禁用 - $('#' + toolbar + ' .multiple').toggleClass('disabled', !rows.length); - // 非单个禁用 - $('#' + toolbar + ' .single').toggleClass('disabled', rows.length!=1); - }); - // 图片预览事件 - $(optionsIds).off("click").on("click", '.img-circle', function() { - var src = $(this).attr('src'); - var target = $(this).data('target'); - var height = $(this).data('height'); - var width = $(this).data('width'); - if($.common.equals("self", target)) { - layer.open({ - title: false, - type: 1, - closeBtn: true, - shadeClose: true, - area: ['auto', 'auto'], - content: "" - }); - } else if ($.common.equals("blank", target)) { - window.open(src); - } - }); - // 单击tooltip事件 - $(optionsIds).on("click", '.tooltip-show', function() { - var target = $(this).data('target'); - var input = $(this).prev(); - if ($.common.equals("copy", target)) { - input.select(); - document.execCommand("copy"); - } else if ($.common.equals("open", target)) { - parent.layer.alert(input.val(), { - title: "信息内容", - shadeClose: true, - btn: ['确认'], - btnclass: ['btn btn-primary'], - }); - } - }); + // 实例ID信息 + var optionsIds = $.table.getOptionsIds(); + // 监听事件处理 + $(optionsIds).on(TABLE_EVENTS, function () { + table.set($(this).attr("id")); + }); + // 在表格体渲染完成,并在 DOM 中可见后触发(事件) + $(optionsIds).on("post-body.bs.table", function (e, args) { + // 浮动提示框特效 + $(".table [data-toggle='tooltip']").tooltip(); + // 气泡弹出框特效 + $('.table [data-toggle="popover"]').popover(); + }); + // 选中、取消、全部选中、全部取消(事件) + $(optionsIds).on("check.bs.table check-all.bs.table uncheck.bs.table uncheck-all.bs.table", function (e, rowsAfter, rowsBefore) { + // 复选框分页保留保存选中数组 + var rows = $.common.equals("uncheck-all", e.type) ? rowsBefore : rowsAfter; + var rowIds = $.table.affectedRowIds(rows); + if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) { + func = $.inArray(e.type, ['check', 'check-all']) > -1 ? 'union' : 'difference'; + var selectedIds = table.rememberSelectedIds[table.options.id]; + if ($.common.isNotEmpty(selectedIds)) { + table.rememberSelectedIds[table.options.id] = _[func](selectedIds, rowIds); + } else { + table.rememberSelectedIds[table.options.id] = _[func]([], rowIds); + } + var selectedRows = table.rememberSelecteds[table.options.id]; + if ($.common.isNotEmpty(selectedRows)) { + table.rememberSelecteds[table.options.id] = _[func](selectedRows, rows); + } else { + table.rememberSelecteds[table.options.id] = _[func]([], rows); + } + } + }); + // 加载成功、选中、取消、全部选中、全部取消(事件) + $(optionsIds).on("check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table load-success.bs.table", function () { + var toolbar = table.options.toolbar; + var uniqueId = table.options.uniqueId; + // 工具栏按钮控制 + var rows = $.common.isEmpty(uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(uniqueId); + // 非多个禁用 + $('#' + toolbar + ' .multiple').toggleClass('disabled', !rows.length); + // 非单个禁用 + $('#' + toolbar + ' .single').toggleClass('disabled', rows.length!=1); + }); + // 图片预览事件 + $(optionsIds).off("click").on("click", '.img-circle', function() { + var src = $(this).attr('src'); + var target = $(this).data('target'); + if ($.common.equals("self", target)) { + var height = $(this).data('height'); + var width = $(this).data('width'); + top.layer.open({ + title: false, + type: 1, + closeBtn: true, + shadeClose: true, + content: "" + }); + } else if ($.common.equals("blank", target)) { + window.open(src); + } + }); + // 单击tooltip事件 + $(optionsIds).on("click", '.tooltip-show', function() { + var target = $(this).data('target'); + var input = $(this).prev(); + if ($.common.equals("copy", target)) { + input.select(); + document.execCommand("copy"); + } else if ($.common.equals("open", target)) { + top.layer.alert(input.val(), { + title: "信息内容", + shadeClose: true, + btn: ['确认'], + btnclass: ['btn btn-primary'], + }); + } + }); }, // 当所有数据被加载时触发 onLoadSuccess: function(data) { - if (typeof table.options.onLoadSuccess == "function") { - table.options.onLoadSuccess(data); - } - // 浮动提示框特效 - $("[data-toggle='tooltip']").tooltip(); + if (typeof table.options.onLoadSuccess == "function") { + table.options.onLoadSuccess(data); + } }, // 表格销毁 destroy: function (tableId) { - var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; - $("#" + currentId).bootstrapTable('destroy'); - }, + var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; + $("#" + currentId).bootstrapTable('destroy'); + delete table.rememberSelectedIds[currentId]; + delete table.rememberSelecteds[currentId]; + }, // 序列号生成 serialNumber: function (index, tableId) { - var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; - var tableParams = $("#" + currentId).bootstrapTable('getOptions'); - var pageSize = tableParams.pageSize; - var pageNumber = tableParams.pageNumber; - return pageSize * (pageNumber - 1) + index + 1; - }, - // 列超出指定长度浮动提示 target(copy单击复制文本 open弹窗打开文本) - tooltip: function (value, length, target) { - var _length = $.common.isEmpty(length) ? 20 : length; - var _text = ""; - var _value = $.common.nullToStr(value); - var _target = $.common.isEmpty(target) ? 'copy' : target; - if (_value.length > _length) { - _text = _value.substr(0, _length) + "..."; - _value = _value.replace(/\'/g,"'"); - _value = _value.replace(/\"/g,"""); - var actions = []; - actions.push($.common.sprintf('', _value)); - actions.push($.common.sprintf('%s', _target, _value, _text)); - return actions.join(''); - } else { - _text = _value; - return _text; - } - }, - // 下拉按钮切换 - dropdownToggle: function (value) { - var actions = []; - actions.push('
    '); - actions.push(''); - actions.push(''); - actions.push('
    '); - return actions.join(''); - }, - // 图片预览 - imageView: function (value, height, width, target) { - if ($.common.isEmpty(width)) { - width = 'auto'; + var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; + var tableParams = $("#" + currentId).bootstrapTable('getOptions'); + var pageSize = $.common.isNotEmpty(tableParams.pageSize) ? tableParams.pageSize: table.options.pageSize; + var pageNumber = $.common.isNotEmpty(tableParams.pageNumber) ? tableParams.pageNumber: table.options.pageNumber; + if (table.options.sidePagination == 'client') { + return index + 1; + } + return pageSize * (pageNumber - 1) + index + 1; + }, + // 列超出指定长度浮动提示 target(copy单击复制文本 open弹窗打开文本) + tooltip: function (value, length, target) { + var _length = $.common.isEmpty(length) ? 20 : length; + var _text = ""; + var _value = $.common.nullToStr(value); + var _target = $.common.isEmpty(target) ? 'copy' : target; + if (_value.length > _length) { + _text = _value.substr(0, _length) + "..."; + _value = _value.replace(/\'/g,"'"); + _value = _value.replace(/\"/g,"""); + var actions = []; + actions.push($.common.sprintf('', _value)); + actions.push($.common.sprintf('%s', _target, _value, _text)); + return actions.join(''); + } else { + _text = _value; + return _text; + } + }, + // 下拉按钮切换 + dropdownToggle: function (value) { + var actions = []; + actions.push('
    '); + actions.push(''); + actions.push(''); + actions.push('
    '); + return actions.join(''); + }, + // 图片预览 + imageView: function (value, height, width, target) { + if ($.common.isEmpty(width)) { + width = 'auto'; } if ($.common.isEmpty(height)) { - height = 'auto'; - } - // blank or self - var _target = $.common.isEmpty(target) ? 'self' : target; - if ($.common.isNotEmpty(value)) { - return $.common.sprintf("", height, width, _target, value); - } else { - return $.common.nullToStr(value); - } - }, + height = 'auto'; + } + // blank or self + var _target = $.common.isEmpty(target) ? 'self' : target; + if ($.common.isNotEmpty(value)) { + return $.common.sprintf("", height, width, _target, value); + } else { + return $.common.nullToStr(value); + } + }, // 搜索-默认第一个form - search: function(formId, tableId, data) { - table.set(tableId); - var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; - var params = $.common.isEmpty(tableId) ? $("#" + table.options.id).bootstrapTable('getOptions') : $("#" + tableId).bootstrapTable('getOptions'); - params.queryParams = function(params) { - var search = $.common.formToJSON(currentId); - if($.common.isNotEmpty(data)){ - $.each(data, function(key) { - search[key] = data[key]; - }); - } - search.pageSize = params.limit; - search.pageNum = params.offset / params.limit + 1; - search.searchValue = params.search; - search.orderByColumn = params.sort; - search.isAsc = params.order; - return search; - } - if($.common.isNotEmpty(tableId)){ - $("#" + tableId).bootstrapTable('refresh', params); - } else{ - $("#" + table.options.id).bootstrapTable('refresh', params); - } - data = {}; - }, - // 导出数据 - exportExcel: function(formId) { - table.set(); - $.modal.confirm("确定导出所有" + table.options.modalName + "吗?", function() { - var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; - var params = $("#" + table.options.id).bootstrapTable('getOptions'); - var dataParam = $("#" + currentId).serializeArray(); - dataParam.push({ "name": "orderByColumn", "value": params.sortName }); - dataParam.push({ "name": "isAsc", "value": params.sortOrder }); - $.modal.loading("正在导出数据,请稍后..."); - $.post(table.options.exportUrl, dataParam, function(result) { - if (result.code == web_status.SUCCESS) { - window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true; - } else if (result.code == web_status.WARNING) { - $.modal.alertWarning(result.msg) - } else { - $.modal.alertError(result.msg); - } - $.modal.closeLoading(); - }); - }); - }, - // 下载模板 - importTemplate: function() { - table.set(); - $.get(table.options.importTemplateUrl, function(result) { - if (result.code == web_status.SUCCESS) { - window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true; - } else if (result.code == web_status.WARNING) { + search: function(formId, tableId, pageNumber, pageSize) { + table.set(tableId); + table.options.formId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; + var params = $.common.isEmpty(tableId) ? $("#" + table.options.id).bootstrapTable('getOptions') : $("#" + tableId).bootstrapTable('getOptions'); + if ($.common.isNotEmpty(pageNumber)) { + params.pageNumber = pageNumber; + } + if ($.common.isNotEmpty(pageSize)) { + params.pageSize = pageSize; + } + if ($.common.isNotEmpty(tableId)) { + $("#" + tableId).bootstrapTable('refresh', params); + } else{ + $("#" + table.options.id).bootstrapTable('refresh', params); + } + }, + // 导出数据 + exportExcel: function(formId) { + table.set(); + $.modal.confirm("确定导出所有" + table.options.modalName + "吗?", function() { + var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; + var params = $("#" + table.options.id).bootstrapTable('getOptions'); + var dataParam = $("#" + currentId).serializeArray(); + dataParam.push({ "name": "orderByColumn", "value": params.sortName }); + dataParam.push({ "name": "isAsc", "value": params.sortOrder }); + $.modal.loading("正在导出数据,请稍候..."); + $.post(table.options.exportUrl, dataParam, function(result) { + if (result.code == web_status.SUCCESS) { + window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true; + } else if (result.code == web_status.WARNING) { + $.modal.alertWarning(result.msg) + } else { + $.modal.alertError(result.msg); + } + $.modal.closeLoading(); + }); + }); + }, + // 下载模板 + importTemplate: function() { + $.get(activeWindow().table.options.importTemplateUrl, function(result) { + if (result.code == web_status.SUCCESS) { + window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true; + } else if (result.code == web_status.WARNING) { $.modal.alertWarning(result.msg) } else { - $.modal.alertError(result.msg); - } - }); + $.modal.alertError(result.msg); + } + }); }, // 导入数据 - importExcel: function(formId) { - table.set(); - var currentId = $.common.isEmpty(formId) ? 'importTpl' : formId; - layer.open({ - type: 1, - area: ['400px', '230px'], - fix: false, - //不固定 - maxmin: true, - shade: 0.3, - title: '导入' + table.options.modalName + '数据', - content: $('#' + currentId).html(), - btn: [' 导入', ' 取消'], - // 弹层外区域关闭 - shadeClose: true, - btn1: function(index, layero){ - var file = layero.find('#file').val(); - if (file == '' || (!$.common.endWith(file, '.xls') && !$.common.endWith(file, '.xlsx'))){ - $.modal.msgWarning("请选择后缀为 “xls”或“xlsx”的文件。"); - return false; - } - var index = layer.load(2, {shade: false}); - $.modal.disable(); - var formData = new FormData(layero.find('form')[0]); - $.ajax({ - url: table.options.importUrl, - data: formData, - cache: false, - contentType: false, - processData: false, - type: 'POST', - success: function (result) { - if (result.code == web_status.SUCCESS) { - $.modal.closeAll(); - $.modal.alertSuccess(result.msg); - $.table.refresh(); - } else if (result.code == web_status.WARNING) { - layer.close(index); - $.modal.enable(); - $.modal.alertWarning(result.msg) - } else { - layer.close(index); - $.modal.enable(); - $.modal.alertError(result.msg); - } - } - }); - } - }); + importExcel: function(formId, width, height) { + table.set(); + var currentId = $.common.isEmpty(formId) ? 'importTpl' : formId; + var _width = $.common.isEmpty(width) ? "400" : width; + var _height = $.common.isEmpty(height) ? "230" : height; + top.layer.open({ + type: 1, + area: [_width + 'px', _height + 'px'], + fix: false, + //不固定 + maxmin: true, + shade: 0.3, + title: '导入' + table.options.modalName + '数据', + content: $('#' + currentId).html(), + btn: [' 导入', ' 取消'], + // 弹层外区域关闭 + shadeClose: true, + btn1: function(index, layero){ + var file = layero.find('#file').val(); + if (file == '' || (!$.common.endWith(file, '.xls') && !$.common.endWith(file, '.xlsx'))) { + $.modal.msgWarning("请选择后缀为 “xls”或“xlsx”的文件。"); + return false; + } + var index = top.layer.load(2, {shade: false}); + $.modal.disable(); + var formData = new FormData(layero.find('form')[0]); + $.ajax({ + url: table.options.importUrl, + data: formData, + cache: false, + contentType: false, + processData: false, + type: 'POST', + success: function (result) { + if (result.code == web_status.SUCCESS) { + $.modal.close(index); + $.modal.closeAll(); + $.modal.alertSuccess(result.msg); + $.table.refresh(); + } else if (result.code == web_status.WARNING) { + $.modal.close(index); + $.modal.enable(); + $.modal.alertWarning(result.msg) + } else { + $.modal.close(index); + $.modal.enable(); + $.modal.alertError(result.msg); + } + }, + complete: function () { + layero.find('#file').val(''); + } + }); + } + }); }, // 刷新表格 - refresh: function(tableId) { - var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; - $("#" + currentId).bootstrapTable('refresh', { - silent: true + refresh: function(tableId, pageNumber, pageSize, url) { + var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; + var params = $("#" + currentId).bootstrapTable('getOptions'); + if ($.common.isEmpty(pageNumber)) { + pageNumber = params.pageNumber; + } + if ($.common.isEmpty(pageSize)) { + pageSize = params.pageSize; + } + if ($.common.isEmpty(url)) { + url = $.common.isEmpty(url) ? params.url : url; + } + $("#" + currentId).bootstrapTable('refresh', { + silent: true, + url: url, + pageNumber: pageNumber, + pageSize: pageSize }); }, - // 查询表格指定列值 - selectColumns: function(column) { - var rows = $.map($("#" + table.options.id).bootstrapTable('getSelections'), function (row) { - return row[column]; - }); - if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) { - var selectedRows = table.rememberSelecteds[table.options.id]; - if($.common.isNotEmpty(selectedRows)) { - rows = $.map(table.rememberSelecteds[table.options.id], function (row) { - return row[column]; - }); - } - } - return $.common.uniqueFn(rows); + // 刷新options配置 + refreshOptions: function(options, tableId) { + var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; + $("#" + currentId).bootstrapTable('refreshOptions', options); + }, + // 查询表格指定列值 deDuplication( true去重、false不去重) + selectColumns: function(column, deDuplication) { + var distinct = $.common.isEmpty(deDuplication) ? true : deDuplication; + var rows = $.map($("#" + table.options.id).bootstrapTable('getSelections'), function (row) { + return $.common.getItemField(row, column); + }); + if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) { + var selectedRows = table.rememberSelecteds[table.options.id]; + if ($.common.isNotEmpty(selectedRows)) { + rows = $.map(table.rememberSelecteds[table.options.id], function (row) { + return $.common.getItemField(row, column); + }); + } + } + return distinct ? $.common.uniqueFn(rows) : rows; }, // 获取当前页选中或者取消的行ID affectedRowIds: function(rows) { - var column = $.common.isEmpty(table.options.uniqueId) ? table.options.columns[1].field : table.options.uniqueId; - var rowIds; - if ($.isArray(rows)) { - rowIds = $.map(rows, function(row) { - return row[column]; - }); - } else { - rowIds = [rows[column]]; - } - return rowIds; - }, - // 查询表格首列值 - selectFirstColumns: function() { - var rows = $.map($("#" + table.options.id).bootstrapTable('getSelections'), function (row) { - return row[table.options.columns[1].field]; - }); - if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) { - var selectedRows = table.rememberSelecteds[table.options.id]; - if($.common.isNotEmpty(selectedRows)) { - rows = $.map(selectedRows, function (row) { - return row[table.options.columns[1].field]; + var column = $.common.isEmpty(table.options.uniqueId) ? table.options.columns[1].field : table.options.uniqueId; + var rowIds; + if ($.isArray(rows)) { + rowIds = $.map(rows, function(row) { + return $.common.getItemField(row, column); + }); + } else { + rowIds = [rows[column]]; + } + return rowIds; + }, + // 查询表格首列值deDuplication( true去重、false不去重) + selectFirstColumns: function(deDuplication) { + var distinct = $.common.isEmpty(deDuplication) ? true : deDuplication; + var rows = $.map($("#" + table.options.id).bootstrapTable('getSelections'), function (row) { + return $.common.getItemField(row, table.options.columns[1].field); + }); + if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) { + var selectedRows = table.rememberSelecteds[table.options.id]; + if ($.common.isNotEmpty(selectedRows)) { + rows = $.map(selectedRows, function (row) { + return $.common.getItemField(row, table.options.columns[1].field); }); - } - } - return $.common.uniqueFn(rows); + } + } + return distinct ? $.common.uniqueFn(rows) : rows; }, // 回显数据字典 selectDictLabel: function(datas, value) { - var actions = []; + if ($.common.isEmpty(datas) || $.common.isEmpty(value)) { + return ''; + } + var actions = []; $.each(datas, function(index, dict) { if (dict.dictValue == ('' + value)) { - var listClass = $.common.equals("default", dict.listClass) || $.common.isEmpty(dict.listClass) ? "" : "badge badge-" + dict.listClass; - actions.push($.common.sprintf("%s", listClass, dict.dictLabel)); + var listClass = $.common.equals("default", dict.listClass) || $.common.isEmpty(dict.listClass) ? "" : "badge badge-" + dict.listClass; + var cssClass = $.common.isNotEmpty(dict.cssClass) ? dict.cssClass : listClass; + actions.push($.common.sprintf("%s", cssClass, dict.dictLabel)); return false; } }); + if (actions.length === 0) { + actions.push($.common.sprintf("%s", value)) + } + return actions.join(''); + }, + // 回显数据字典(字符串数组) + selectDictLabels: function(datas, value, separator) { + if ($.common.isEmpty(datas) || $.common.isEmpty(value)) { + return ''; + } + var currentSeparator = $.common.isEmpty(separator) ? "," : separator; + var actions = []; + $.each(value.split(currentSeparator), function(i, val) { + var match = false; + $.each(datas, function(index, dict) { + if (dict.dictValue == ('' + val)) { + var listClass = $.common.equals("default", dict.listClass) || $.common.isEmpty(dict.listClass) ? "" : "badge badge-" + dict.listClass; + actions.push($.common.sprintf("%s", listClass, dict.dictLabel)); + match = true; + return false; + } + }); + if (!match) { + actions.push($.common.sprintf(" %s ", val)); + } + }); return actions.join(''); }, // 显示表格指定列 showColumn: function(column, tableId) { - var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; - $("#" + currentId).bootstrapTable('showColumn', column); + var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; + $("#" + currentId).bootstrapTable('showColumn', column); }, // 隐藏表格指定列 hideColumn: function(column, tableId) { - var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; - $("#" + currentId).bootstrapTable('hideColumn', column); + var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; + $("#" + currentId).bootstrapTable('hideColumn', column); + }, + // 显示所有表格列 + showAllColumns: function(tableId) { + var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; + $("#" + currentId).bootstrapTable('showAllColumns'); + }, + // 隐藏所有表格列 + hideAllColumns: function(tableId) { + var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId; + $("#" + currentId).bootstrapTable('hideAllColumns'); } }, // 表格树封装处理 treeTable: { // 初始化表格 init: function(options) { - var defaults = { - id: "bootstrap-tree-table", + var defaults = { + id: "bootstrap-tree-table", type: 1, // 0 代表bootstrapTable 1代表bootstrapTreeTable - height: 0, - rootIdValue: null, - ajaxParams: {}, - toolbar: "toolbar", - striped: false, - expandColumn: 1, - showSearch: true, - showRefresh: true, - showColumns: true, - expandAll: false, - expandFirst: true - }; - var options = $.extend(defaults, options); - table.options = options; - table.config[options.id] = options; + height: 0, + rootIdValue: 0, + ajaxParams: {}, + toolbar: "toolbar", + striped: false, + pagination: false, + pageSize: 10, + pageList: [10, 25, 50], + expandColumn: 1, + showSearch: true, + showRefresh: true, + showColumns: true, + expandAll: true, + expandFirst: true + }; + var options = $.extend(defaults, options); + table.options = options; + table.config[options.id] = options; + debugger + console.log(1111); + $.table.initEvent(); $.bttTable = $('#' + options.id).bootstrapTreeTable({ - code: options.code, // 用于设置父子关系 - parentCode: options.parentCode, // 用于设置父子关系 - type: 'post', // 请求方式(*) - url: options.url, // 请求后台的URL(*) - data: options.data, // 无url时用于渲染的数据 - ajaxParams: options.ajaxParams, // 请求数据的ajax的data属性 - rootIdValue: options.rootIdValue, // 设置指定根节点id值 - height: options.height, // 表格树的高度 - expandColumn: options.expandColumn, // 在哪一列上面显示展开按钮 - striped: options.striped, // 是否显示行间隔色 - bordered: false, // 是否显示边框 - toolbar: '#' + options.toolbar, // 指定工作栏 - showSearch: options.showSearch, // 是否显示检索信息 - showRefresh: options.showRefresh, // 是否显示刷新按钮 - showColumns: options.showColumns, // 是否显示隐藏某列下拉框 - expandAll: options.expandAll, // 是否全部展开 - expandFirst: options.expandFirst, // 是否默认第一级展开--expandAll为false时生效 - columns: options.columns, // 显示列信息(*) - responseHandler: $.treeTable.responseHandler // 当所有数据被加载时触发处理函数 - }); + code: options.code, // 用于设置父子关系 + parentCode: options.parentCode, // 用于设置父子关系 + type: 'post', // 请求方式(*) + url: options.url, // 请求后台的URL(*) + data: options.data, // 无url时用于渲染的数据 + ajaxParams: options.ajaxParams, // 请求数据的ajax的data属性 + rootIdValue: options.rootIdValue, // 设置指定根节点id值 + height: options.height, // 表格树的高度 + pagination: options.pagination, // 是否显示分页 + dataUrl: options.dataUrl, // 加载子节点异步请求数据url + pageSize: options.pageSize, // 每页的记录行数 + pageList: options.pageList, // 可供选择的每页的行数 + expandColumn: options.expandColumn, // 在哪一列上面显示展开按钮 + striped: options.striped, // 是否显示行间隔色 + bordered: options.bordered, // 是否显示边框 + toolbar: '#' + options.toolbar, // 指定工作栏 + showSearch: options.showSearch, // 是否显示检索信息 + showRefresh: options.showRefresh, // 是否显示刷新按钮 + showColumns: options.showColumns, // 是否显示隐藏某列下拉框 + expandAll: options.expandAll, // 是否全部展开 + expandFirst: options.expandFirst, // 是否默认第一级展开--expandAll为false时生效 + columns: options.columns, // 显示列信息(*) + onClickRow: options.onClickRow, // 单击某行事件 + responseHandler: $.treeTable.responseHandler, // 在加载服务器发送来的数据之前处理函数 + onLoadSuccess: $.treeTable.onLoadSuccess // 当所有数据被加载时触发处理函数 + }); }, // 条件查询 search: function(formId) { - var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; - var params = $.common.formToJSON(currentId); - $.bttTable.bootstrapTreeTable('refresh', params); + var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; + var params = $.common.formToJSON(currentId); + $.bttTable.bootstrapTreeTable('refresh', $.extend(params, table.options.ajaxParams)); }, // 刷新 refresh: function() { - $.bttTable.bootstrapTreeTable('refresh'); + $.bttTable.bootstrapTreeTable('refresh'); }, - // 查询表格树指定列值 - selectColumns: function(column) { - var rows = $.map($.bttTable.bootstrapTreeTable('getSelections'), function (row) { - return row[column]; - }); - return $.common.uniqueFn(rows); + // 查询表格树指定列值deDuplication( true去重、false不去重) + selectColumns: function(column, deDuplication) { + var distinct = $.common.isEmpty(deDuplication) ? true : deDuplication; + var rows = $.map($.bttTable.bootstrapTreeTable('getSelections'), function (row) { + return $.common.getItemField(row, column); + }); + return distinct ? $.common.uniqueFn(rows) : rows; }, // 请求获取数据后处理回调函数,校验异常状态提醒 responseHandler: function(res) { - if (typeof table.options.responseHandler == "function") { - table.options.responseHandler(res); + if (typeof table.options.responseHandler == "function") { + table.options.responseHandler(res); } - if (res.code != undefined && res.code != 0) { - $.modal.alertWarning(res.msg); - return []; + if (res.code != undefined && res.code != web_status.SUCCESS) { + $.modal.alertWarning(res.msg); + return []; } else { return res; } }, + // 当所有数据被加载时触发 + onLoadSuccess: function(data) { + if (typeof table.options.onLoadSuccess == "function") { + table.options.onLoadSuccess(data); + } + $(".table [data-toggle='tooltip']").tooltip(); + }, }, // 表单封装处理 - form: { - // 表单重置 - reset: function(formId, tableId) { - table.set(tableId); - var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; - $("#" + currentId)[0].reset(); - if (table.options.type == table_type.bootstrapTable) { - if($.common.isEmpty(tableId)){ - $("#" + table.options.id).bootstrapTable('refresh'); - } else{ - $("#" + tableId).bootstrapTable('refresh'); - } - } else if (table.options.type == table_type.bootstrapTreeTable) { - if($.common.isEmpty(tableId)){ - $("#" + table.options.id).bootstrapTreeTable('refresh', []); - } else{ - $("#" + tableId).bootstrapTreeTable('refresh', []); - } - } + form: { + // 表单重置 + reset: function(formId, tableId, pageNumber, pageSize) { + table.set(tableId); + formId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; + $("#" + formId)[0].reset(); + var tableId = $.common.isEmpty(tableId) ? table.options.id : tableId; + if (table.options.type == table_type.bootstrapTable) { + var params = $("#" + tableId).bootstrapTable('getOptions'); + params.pageNumber = 1; + if ($.common.isNotEmpty(pageSize)) { + params.pageSize = pageSize; + } + $("#" + tableId).bootstrapTable('refresh', params); + } else if (table.options.type == table_type.bootstrapTreeTable) { + $("#" + tableId).bootstrapTreeTable('refresh', table.options.ajaxParams); + } + resetDate(); }, // 获取选中复选框项 selectCheckeds: function(name) { - var checkeds = ""; - $('input:checkbox[name="' + name + '"]:checked').each(function(i) { - if (0 == i) { - checkeds = $(this).val(); - } else { - checkeds += ("," + $(this).val()); - } - }); - return checkeds; + var checkeds = ""; + $('input:checkbox[name="' + name + '"]:checked').each(function(i) { + if (0 == i) { + checkeds = $(this).val(); + } else { + checkeds += ("," + $(this).val()); + } + }); + return checkeds; }, // 获取选中下拉框项 selectSelects: function(name) { - var selects = ""; - $('#' + name + ' option:selected').each(function (i) { - if (0 == i) { - selects = $(this).val(); - } else { - selects += ("," + $(this).val()); - } - }); - return selects; + var selects = ""; + $('#' + name + ' option:selected').each(function (i) { + if (0 == i) { + selects = $(this).val(); + } else { + selects += ("," + $(this).val()); + } + }); + return selects; } }, // 弹出层封装处理 - modal: { - // 显示图标 - icon: function(type) { - var icon = ""; - if (type == modal_status.WARNING) { - icon = 0; - } else if (type == modal_status.SUCCESS) { - icon = 1; - } else if (type == modal_status.FAIL) { - icon = 2; - } else { - icon = 3; - } - return icon; - }, - // 消息提示 + modal: { + // 显示图标 + icon: function(type) { + var icon = ""; + if (type == modal_status.WARNING) { + icon = 0; + } else if (type == modal_status.SUCCESS) { + icon = 1; + } else if (type == modal_status.FAIL) { + icon = 2; + } else { + icon = 3; + } + return icon; + }, + // 消息提示 msg: function(content, type) { - if (type != undefined) { - layer.msg(content, { icon: $.modal.icon(type), time: 1000, shift: 5 }); + if (type != undefined) { + top.layer.msg(content, { icon: $.modal.icon(type), time: 1000, shift: 5 }); } else { - layer.msg(content); + top.layer.msg(content); } }, // 错误消息 msgError: function(content) { - $.modal.msg(content, modal_status.FAIL); + $.modal.msg(content, modal_status.FAIL); }, // 成功消息 msgSuccess: function(content) { - $.modal.msg(content, modal_status.SUCCESS); + $.modal.msg(content, modal_status.SUCCESS); }, // 警告消息 msgWarning: function(content) { - $.modal.msg(content, modal_status.WARNING); + $.modal.msg(content, modal_status.WARNING); }, - // 弹出提示 + // 弹出提示 alert: function(content, type) { - layer.alert(content, { - icon: $.modal.icon(type), - title: "系统提示", - btn: ['确认'], - btnclass: ['btn btn-primary'], - }); - }, - // 消息提示并刷新父窗体 - msgReload: function(msg, type) { - layer.msg(msg, { - icon: $.modal.icon(type), - time: 500, - shade: [0.1, '#8F8F8F'] - }, - function() { - $.modal.reload(); - }); + top.layer.alert(content, { + icon: $.modal.icon(type), + title: "系统提示", + btn: ['确认'], + btnclass: ['btn btn-primary'], + }); }, // 错误提示 alertError: function(content) { - $.modal.alert(content, modal_status.FAIL); + $.modal.alert(content, modal_status.FAIL); }, // 成功提示 alertSuccess: function(content) { - $.modal.alert(content, modal_status.SUCCESS); + $.modal.alert(content, modal_status.SUCCESS); }, // 警告提示 alertWarning: function(content) { - $.modal.alert(content, modal_status.WARNING); + $.modal.alert(content, modal_status.WARNING); + }, + // 消息提示,重新加载页面 + msgReload: function(msg, type) { + top.layer.msg(msg, { + icon: $.modal.icon(type), + time: 500, + shade: [0.1, '#8F8F8F'] + }, + function() { + $.modal.reload(); + }); + }, + // 消息提示成功并刷新父窗体 + msgSuccessReload: function(msg) { + $.modal.msgReload(msg, modal_status.SUCCESS); + }, + // 获取iframe页的DOM + getChildFrame: function (index) { + if ($.common.isEmpty(index)) { + var index = parent.layer.getFrameIndex(window.name); + return parent.layer.getChildFrame('body', index); + } else { + return top.layer.getChildFrame('body', index); + } }, // 关闭窗体 - close: function () { - var index = parent.layer.getFrameIndex(window.name); - parent.layer.close(index); + close: function (index) { + if ($.common.isEmpty(index)) { + var index = parent.layer.getFrameIndex(window.name); + parent.layer.close(index); + } else { + top.layer.close(index); + } }, // 关闭全部窗体 closeAll: function () { - layer.closeAll(); + top.layer.closeAll(); }, // 确认窗体 confirm: function (content, callBack) { - layer.confirm(content, { - icon: 3, - title: "系统提示", - btn: ['确认', '取消'] - }, function (index) { - layer.close(index); - callBack(true); - }); + top.layer.confirm(content, { + icon: 3, + title: "系统提示", + btn: ['确认', '取消'] + }, function (index) { + $.modal.close(index); + callBack(true); + }); }, // 弹出层指定宽度 open: function (title, url, width, height, callback) { - //如果是移动端,就使用自适应大小弹窗 - if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) { - width = 'auto'; - height = 'auto'; - } - if ($.common.isEmpty(title)) { + // 如果是移动端,就使用自适应大小弹窗 + if ($.common.isMobile()) { + width = 'auto'; + height = 'auto'; + } + if ($.common.isEmpty(title)) { title = false; } if ($.common.isEmpty(url)) { url = "/404.html"; } if ($.common.isEmpty(width)) { - width = 800; + width = 800; } if ($.common.isEmpty(height)) { - height = ($(window).height() - 50); + height = ($(window).height() - 50); } if ($.common.isEmpty(callback)) { callback = function(index, layero) { @@ -744,578 +864,465 @@ var table = { iframeWin.contentWindow.submitHandler(index, layero); } } - layer.open({ - type: 2, - area: [width + 'px', height + 'px'], - fix: false, - //不固定 - maxmin: true, - shade: 0.3, - title: title, - content: url, - btn: ['确定', '关闭'], - // 弹层外区域关闭 - shadeClose: true, - yes: callback, - cancel: function(index) { - return true; - } - }); + top.layer.open({ + type: 2, + area: [width + 'px', height + 'px'], + fix: false, + //不固定 + maxmin: true, + shade: 0.3, + title: title, + content: url, + btn: ['确定', '关闭'], + // 弹层外区域关闭 + shadeClose: true, + yes: callback, + cancel: function(index) { + return true; + }, + success: function () { + $(':focus').blur(); + } + }); }, // 弹出层指定参数选项 openOptions: function (options) { - var _url = $.common.isEmpty(options.url) ? "/404.html" : options.url; - var _title = $.common.isEmpty(options.title) ? "系统窗口" : options.title; - var _width = $.common.isEmpty(options.width) ? "800" : options.width; + var _url = $.common.isEmpty(options.url) ? "/404.html" : options.url; + var _title = $.common.isEmpty(options.title) ? "系统窗口" : options.title; + var _width = $.common.isEmpty(options.width) ? "800" : options.width; var _height = $.common.isEmpty(options.height) ? ($(window).height() - 50) : options.height; var _btn = [' 确认', ' 关闭']; + // 如果是移动端,就使用自适应大小弹窗 + if ($.common.isMobile()) { + _width = 'auto'; + _height = 'auto'; + } if ($.common.isEmpty(options.yes)) { - options.yes = function(index, layero) { - options.callBack(index, layero); + options.yes = function(index, layero) { + options.callBack(index, layero); + } + } + var btnCallback = {}; + if (options.btn instanceof Array){ + for (var i = 1, len = options.btn.length; i < len; i++) { + var btn = options["btn" + (i + 1)]; + if (btn) { + btnCallback["btn" + (i + 1)] = btn; + } } } - layer.open({ + var index = top.layer.open($.extend({ + id: options.id, // 唯一id + anim: options.anim, // 弹出动画 0-6 type: 2, - maxmin: true, + maxmin: $.common.isEmpty(options.maxmin) ? true : options.maxmin, shade: 0.3, title: _title, fix: false, area: [_width + 'px', _height + 'px'], content: _url, + closeBtn: $.common.isEmpty(options.closeBtn) ? 1 : options.closeBtn, shadeClose: $.common.isEmpty(options.shadeClose) ? true : options.shadeClose, skin: options.skin, + // options.btn设置为0表示不显示按钮 btn: $.common.isEmpty(options.btn) ? _btn : options.btn, yes: options.yes, cancel: function () { return true; + }, + success: function () { + $(':focus').blur(); } - }); + }, btnCallback)); + if ($.common.isNotEmpty(options.full) && options.full === true) { + top.layer.full(index); + } }, // 弹出层全屏 openFull: function (title, url, width, height) { - //如果是移动端,就使用自适应大小弹窗 - if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) { - width = 'auto'; - height = 'auto'; - } - if ($.common.isEmpty(title)) { + // 如果是移动端,就使用自适应大小弹窗 + if ($.common.isMobile()) { + width = 'auto'; + height = 'auto'; + } + if ($.common.isEmpty(title)) { title = false; } if ($.common.isEmpty(url)) { url = "/404.html"; } if ($.common.isEmpty(width)) { - width = 800; + width = 800; } if ($.common.isEmpty(height)) { - height = ($(window).height() - 50); - } - var index = layer.open({ - type: 2, - area: [width + 'px', height + 'px'], - fix: false, - //不固定 - maxmin: true, - shade: 0.3, - title: title, - content: url, - btn: ['确定', '关闭'], - // 弹层外区域关闭 - shadeClose: true, - yes: function(index, layero) { - var iframeWin = layero.find('iframe')[0]; - iframeWin.contentWindow.submitHandler(index, layero); - }, - cancel: function(index) { - return true; - } - }); - layer.full(index); + height = ($(window).height() - 50); + } + var index = top.layer.open({ + type: 2, + area: [width + 'px', height + 'px'], + fix: false, + //不固定 + maxmin: true, + shade: 0.3, + title: title, + content: url, + btn: ['确定', '关闭'], + // 弹层外区域关闭 + shadeClose: true, + yes: function(index, layero) { + var iframeWin = layero.find('iframe')[0]; + iframeWin.contentWindow.submitHandler(index, layero); + }, + cancel: function(index) { + return true; + }, + success: function () { + $(':focus').blur(); + } + }); + top.layer.full(index); }, // 选卡页方式打开 - openTab: function (title, url) { - createMenuItem(url, title); + openTab: function (title, url, isRefresh) { + createMenuItem(url, title, isRefresh); }, // 选卡页同一页签打开 parentTab: function (title, url) { - var dataId = window.frameElement.getAttribute('data-id'); - createMenuItem(url, title); - closeItem(dataId); + var dataId = window.frameElement.getAttribute('data-id'); + createMenuItem(url, title); + closeItem(dataId); + }, + // 右侧弹出窗口打开 + popupRight: function(title, url){ + var width = 150; + if (top.location !== self.location) { + if ($(top.window).outerWidth() < 400) { + width = 50; + } + } + top.layer.open({ + type: 2, + offset: 'r', + anim: 'slideLeft', + move: false, + title: title, + shade: 0.3, + shadeClose: true, + area: [($(window).outerWidth() - width) + 'px', '100%'], + content: url + }); }, // 关闭选项卡 closeTab: function (dataId) { - closeItem(dataId); + closeItem(dataId); }, // 禁用按钮 disable: function() { - var doc = window.top == window.parent ? window.document : window.parent.document; - $("a[class*=layui-layer-btn]", doc).addClass("layer-disabled"); + var doc = window.top == window.parent ? top.window.document : window.parent.document; + $("a[class*=layui-layer-btn]", doc).addClass("layer-disabled"); }, // 启用按钮 enable: function() { - var doc = window.top == window.parent ? window.document : window.parent.document; - $("a[class*=layui-layer-btn]", doc).removeClass("layer-disabled"); + var doc = window.top == window.parent ? top.window.document : window.parent.document; + $("a[class*=layui-layer-btn]", doc).removeClass("layer-disabled"); }, // 打开遮罩层 loading: function (message) { - $.blockUI({ message: '
    ' + message + '
    ' }); + $.blockUI({ message: '
    ' + message + '
    ' }); }, // 关闭遮罩层 closeLoading: function () { - setTimeout(function(){ - $.unblockUI(); - }, 50); + setTimeout(function(){ + $.unblockUI(); + }, 50); }, // 重新加载 reload: function () { - parent.location.reload(); - }, - // 弹出层全屏 - openFullClose: function (title, url, width, height) { - //如果是移动端,就使用自适应大小弹窗 - if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) { - width = 'auto'; - height = 'auto'; - } - if ($.common.isEmpty(title)) { - title = false; - } - if ($.common.isEmpty(url)) { - url = "/404.html"; - } - if ($.common.isEmpty(width)) { - width = 800; - } - if ($.common.isEmpty(height)) { - height = ($(window).height() - 50); - } - var index = layer.open({ - type: 2, - area: [width + 'px', height + 'px'], - fix: false, - //不固定 - maxmin: true, - shade: 0.3, - title: title, - content: url, - btn: ['关闭'], - // 弹层外区域关闭 - shadeClose: true, - yes: function(index, layero) { - var iframeWin = layero.find('iframe')[0]; - iframeWin.contentWindow.submitHandler(index, layero); - }, - cancel: function(index) { - return true; - } - }); - layer.full(index); - }, - openClose: function (title, url, width, height, callback) { - //如果是移动端,就使用自适应大小弹窗 - if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) { - width = 'auto'; - height = 'auto'; - } - if ($.common.isEmpty(title)) { - title = false; - } - if ($.common.isEmpty(url)) { - url = "/404.html"; - } - if ($.common.isEmpty(width)) { - width = 800; - } - if ($.common.isEmpty(height)) { - height = ($(window).height() - 50); - } - if ($.common.isEmpty(callback)) { - callback = function(index, layero) { - var iframeWin = layero.find('iframe')[0]; - iframeWin.contentWindow.submitHandler(index, layero); - } - } - layer.open({ - type: 2, - area: [width + 'px', height + 'px'], - fix: false, - //不固定 - maxmin: true, - shade: 0.3, - title: title, - content: url, - btn: ['关闭'], - // 弹层外区域关闭 - shadeClose: true, - yes: function (index, layero) { - layer.close(index); - } - // , - // cancel: function(index) { - // return true; - // } - }); - }, + parent.location.reload(); + } }, // 操作封装处理 operate: { - // 提交数据 - submit: function(url, type, dataType, data, callback) { - var config = { - url: url, - type: type, - dataType: dataType, - data: data, - beforeSend: function () { - $.modal.loading("正在处理中,请稍后..."); - }, - success: function(result) { - if (typeof callback == "function") { - callback(result); - } - $.operate.ajaxSuccess(result); - } - }; - $.ajax(config) + // 提交数据 + submit: function(url, type, dataType, data, callback) { + var config = { + url: url, + type: type, + dataType: dataType, + data: data, + beforeSend: function () { + $.modal.loading("正在处理中,请稍候..."); + }, + success: function(result) { + if (typeof callback == "function") { + callback(result); + } + $.operate.ajaxSuccess(result); + } + }; + $.ajax(config) }, // post请求传输 post: function(url, data, callback) { - $.operate.submit(url, "post", "json", data, callback); + $.operate.submit(url, "post", "json", data, callback); }, // get请求传输 get: function(url, callback) { - $.operate.submit(url, "get", "json", "", callback); + $.operate.submit(url, "get", "json", "", callback); }, // 详细信息 detail: function(id, width, height) { - table.set(); - var _url = $.operate.detailUrl(id); - var _width = $.common.isEmpty(width) ? "800" : width; - var _height = $.common.isEmpty(height) ? ($(window).height() - 50) : height; - //如果是移动端,就使用自适应大小弹窗 - if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) { - _width = 'auto'; - _height = 'auto'; - } - var options = { - title: table.options.modalName + "详细", - width: _width, - height: _height, - url: _url, - skin: 'layui-layer-gray', - btn: ['关闭'], - yes: function (index, layero) { - layer.close(index); + table.set(); + var _url = $.operate.detailUrl(id); + var options = { + title: table.options.modalName + "详细", + width: width, + height: height, + url: _url, + btn: 0, + yes: function (index, layero) { + $.modal.close(index); } - }; - $.modal.openOptions(options); + }; + $.modal.openOptions(options); + }, + // 详细信息,以tab页展现 + detailTab: function(id) { + table.set(); + $.modal.openTab("详细" + table.options.modalName, $.operate.detailUrl(id)); }, // 详细访问地址 detailUrl: function(id) { - var url = "/404.html"; - if ($.common.isNotEmpty(id)) { - url = table.options.detailUrl.replace("{id}", id); - } else { - var id = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId); - if (id.length == 0) { - $.modal.alertWarning("请至少选择一条记录"); - return; - } - url = table.options.detailUrl.replace("{id}", id); - } + var url = "/404.html"; + if ($.common.isNotEmpty(id)) { + url = table.options.detailUrl.replace("{id}", id); + } else { + var id = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId); + if (id.length == 0) { + $.modal.alertWarning("请至少选择一条记录"); + return; + } + url = table.options.detailUrl.replace("{id}", id); + } return url; }, - detailTask: function(id) { - table.set(); - var url = "/404.html"; - if ($.common.isNotEmpty(id)) { - url = table.options.updateUrl.replace("{id}", id); - } else { - if(table.options.type == table_type.bootstrapTreeTable) { - var row = $("#" + table.options.id).bootstrapTreeTable('getSelections')[0]; - if ($.common.isEmpty(row)) { - $.modal.alertWarning("请至少选择一条记录"); - return; - } - url = table.options.updateUrl.replace("{id}", row[table.options.uniqueId]); - } else { - var row = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId); - url = table.options.updateUrl.replace("{id}", row); - } - } - $.modal.openFull("执行明细", url); - }, // 删除信息 remove: function(id) { - table.set(); - $.modal.confirm("确定删除该条" + table.options.modalName + "信息吗?", function() { + table.set(); + $.modal.confirm("确定删除该条" + table.options.modalName + "信息吗?", function() { var url = $.common.isEmpty(id) ? table.options.removeUrl : table.options.removeUrl.replace("{id}", id); - if(table.options.type == table_type.bootstrapTreeTable) { - $.operate.get(url); + if (table.options.type == table_type.bootstrapTreeTable) { + $.operate.get(url); } else { - var data = { "ids": id }; - $.operate.submit(url, "post", "json", data); - } - }); - + var data = { "ids": id }; + $.operate.submit(url, "post", "json", data); + } + }); }, // 批量删除信息 removeAll: function() { - table.set(); - var rows = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId); - if (rows.length == 0) { - $.modal.alertWarning("请至少选择一条记录"); - return; - } - $.modal.confirm("确认要删除选中的" + rows.length + "条数据吗?", function() { - var url = table.options.removeUrl; - var data = { "ids": rows.join() }; - $.operate.submit(url, "post", "json", data); - }); + table.set(); + var rows = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId); + if (rows.length == 0) { + $.modal.alertWarning("请至少选择一条记录"); + return; + } + $.modal.confirm("确认要删除选中的" + rows.length + "条数据吗?", function() { + var url = table.options.removeUrl; + var data = { "ids": rows.join() }; + $.operate.submit(url, "post", "json", data); + }); }, - - startTask: function(id) { - table.set(); - $.modal.confirm("确定执行该" + table.options.modalName + "任务吗?", function() { - var url = $.common.isEmpty(id) ? table.options.startUrl : table.options.startUrl.replace("{id}", id); - if(table.options.type == table_type.bootstrapTreeTable) { - $.operate.get(url); - } else { - var data = { "id": id }; - $.operate.submit(url, "get", "json", null); - } - }); - - }, - - stopTask: function(id) { - table.set(); - $.modal.confirm("确定停止" + table.options.modalName + "任务吗?", function() { - var url = $.common.isEmpty(id) ? table.options.stopUrl : table.options.stopUrl.replace("{id}", id); - if(table.options.type == table_type.bootstrapTreeTable) { - $.operate.get(url); - } else { - var data = { "id": id }; - $.operate.submit(url, "get", "json", null); - } - }); - - }, - - quartzTask: function(id) { - table.set(); - if($.common.isEmpty(id) && table.options.type == table_type.bootstrapTreeTable) { - var row = $("#" + table.options.id).bootstrapTreeTable('getSelections')[0]; - if ($.common.isEmpty(row)) { - $.modal.alertWarning("请至少选择一条记录"); - return; - } - var url = table.options.quartzUrl.replace("{id}", row[table.options.uniqueId]); - $.modal.open("修改" + table.options.modalName, url); - } else { - var url = $.common.isEmpty(id) ? table.options.quartzUrl : table.options.quartzUrl.replace("{id}", id); - $.modal.open("修改" + table.options.modalName, url); - } - }, // 清空信息 clean: function() { - table.set(); - $.modal.confirm("确定清空所有" + table.options.modalName + "吗?", function() { - var url = table.options.cleanUrl; - $.operate.submit(url, "post", "json", ""); - }); + table.set(); + $.modal.confirm("确定清空所有" + table.options.modalName + "吗?", function() { + var url = table.options.cleanUrl; + $.operate.submit(url, "post", "json", ""); + }); }, // 添加信息 add: function(id) { - table.set(); - $.modal.open("添加" + table.options.modalName, $.operate.addUrl(id)); - }, - add: function(id,width, height) { table.set(); - $.modal.open("添加" + table.options.modalName, $.operate.addUrl(id),width, height); + $.modal.open("添加" + table.options.modalName, $.operate.addUrl(id)); }, // 添加信息,以tab页展现 addTab: function (id) { - table.set(); + table.set(); $.modal.openTab("添加" + table.options.modalName, $.operate.addUrl(id)); }, // 添加信息 全屏 addFull: function(id) { - table.set(); - var url = $.common.isEmpty(id) ? table.options.createUrl : table.options.createUrl.replace("{id}", id); - $.modal.openFull("添加" + table.options.modalName, url); + table.set(); + $.modal.openFull("添加" + table.options.modalName, $.operate.addUrl(id)); }, // 添加访问地址 addUrl: function(id) { - var url = $.common.isEmpty(id) ? table.options.createUrl.replace("{id}", "") : table.options.createUrl.replace("{id}", id); + var url = $.common.isEmpty(id) ? table.options.createUrl.replace("{id}", "") : table.options.createUrl.replace("{id}", id); return url; }, // 修改信息 edit: function(id) { - table.set(); - if($.common.isEmpty(id) && table.options.type == table_type.bootstrapTreeTable) { - var row = $("#" + table.options.id).bootstrapTreeTable('getSelections')[0]; - if ($.common.isEmpty(row)) { - $.modal.alertWarning("请至少选择一条记录"); - return; - } - var url = table.options.updateUrl.replace("{id}", row[table.options.uniqueId]); - $.modal.open("修改" + table.options.modalName, url); - } else { - $.modal.open("修改" + table.options.modalName, $.operate.editUrl(id)); - } - }, - // 修改信息 - edit: function(id,width, height) { - table.set(); - var row=""; - if($.common.isEmpty(id)){ - if(table.options.type == table_type.bootstrapTreeTable) { - row= $("#" + table.options.id).bootstrapTreeTable('getSelections')[0]; - }else if(table.options.type == table_type.bootstrapTable){ - row= $("#" + table.options.id).bootstrapTable('getSelections')[0]; - } + table.set(); + if ($.common.isEmpty(id) && table.options.type == table_type.bootstrapTreeTable) { + var row = $("#" + table.options.id).bootstrapTreeTable('getSelections')[0]; if ($.common.isEmpty(row)) { $.modal.alertWarning("请至少选择一条记录"); return; } var url = table.options.updateUrl.replace("{id}", row[table.options.uniqueId]); $.modal.open("修改" + table.options.modalName, url); - }else{ - $.modal.open("修改" + table.options.modalName, $.operate.editUrl(id),width, height); - } - }, + } else { + $.modal.open("修改" + table.options.modalName, $.operate.editUrl(id)); + } + }, // 修改信息,以tab页展现 editTab: function(id) { - table.set(); - $.modal.openTab("修改" + table.options.modalName, $.operate.editUrl(id)); + table.set(); + $.modal.openTab("修改" + table.options.modalName, $.operate.editUrl(id)); }, // 修改信息 全屏 editFull: function(id) { - table.set(); - var url = "/404.html"; - if ($.common.isNotEmpty(id)) { - url = table.options.updateUrl.replace("{id}", id); - } else { - var row = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId); - url = table.options.updateUrl.replace("{id}", row); - } - $.modal.openFull("修改" + table.options.modalName, url); + table.set(); + var url = "/404.html"; + if ($.common.isNotEmpty(id)) { + url = table.options.updateUrl.replace("{id}", id); + } else { + if (table.options.type == table_type.bootstrapTreeTable) { + var row = $("#" + table.options.id).bootstrapTreeTable('getSelections')[0]; + if ($.common.isEmpty(row)) { + $.modal.alertWarning("请至少选择一条记录"); + return; + } + url = table.options.updateUrl.replace("{id}", row[table.options.uniqueId]); + } else { + var row = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId); + url = table.options.updateUrl.replace("{id}", row); + } + } + $.modal.openFull("修改" + table.options.modalName, url); }, // 修改访问地址 editUrl: function(id) { - var url = "/404.html"; - if ($.common.isNotEmpty(id)) { - url = table.options.updateUrl.replace("{id}", id); - } else { - var id = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId); - if (id.length == 0) { - $.modal.alertWarning("请至少选择一条记录"); - return; - } - url = table.options.updateUrl.replace("{id}", id); - } + var url = "/404.html"; + if ($.common.isNotEmpty(id)) { + url = table.options.updateUrl.replace("{id}", id); + } else { + var id = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId); + if (id.length == 0) { + $.modal.alertWarning("请至少选择一条记录"); + return; + } + url = table.options.updateUrl.replace("{id}", id); + } return url; }, + // 右侧弹出详情 + view: function(id){ + table.set(); + var url = table.options.viewUrl.replace("{id}", id); + $.modal.popupRight(table.options.modalName + "信息详情", url); + }, // 保存信息 刷新表格 save: function(url, data, callback) { - var config = { - url: url, - type: "post", - dataType: "json", - data: data, - beforeSend: function () { - $.modal.loading("正在处理中,请稍后..."); - $.modal.disable(); - }, - success: function(result) { - if (typeof callback == "function") { - callback(result); - } - $.operate.successCallback(result); - } - }; - $.ajax(config) - }, - // 保存信息 弹出提示框 + var config = { + url: url, + type: "post", + dataType: "json", + data: data, + beforeSend: function () { + $.modal.loading("正在处理中,请稍候..."); + $.modal.disable(); + }, + success: function(result) { + if (typeof callback == "function") { + callback(result); + } + $.operate.successCallback(result); + } + }; + $.ajax(config) + }, + // 保存信息 弹出结果提示框 saveModal: function(url, data, callback) { - var config = { - url: url, - type: "post", - dataType: "json", - data: data, - beforeSend: function () { - $.modal.loading("正在处理中,请稍后..."); - }, - success: function(result) { - if (typeof callback == "function") { - callback(result); - } - if (result.code == web_status.SUCCESS) { - $.modal.alertSuccess(result.msg) - } else if (result.code == web_status.WARNING) { - $.modal.alertWarning(result.msg) - } else { - $.modal.alertError(result.msg); - } - $.modal.closeLoading(); - } - }; - $.ajax(config) + var config = { + url: url, + type: "post", + dataType: "json", + data: data, + beforeSend: function () { + $.modal.loading("正在处理中,请稍候..."); + }, + success: function(result) { + if (typeof callback == "function") { + callback(result); + } + if (result.code == web_status.SUCCESS) { + $.modal.alertSuccess(result.msg) + } else if (result.code == web_status.WARNING) { + $.modal.alertWarning(result.msg) + } else { + $.modal.alertError(result.msg); + } + $.modal.closeLoading(); + } + }; + $.ajax(config) }, // 保存选项卡信息 saveTab: function(url, data, callback) { - var config = { - url: url, - type: "post", - dataType: "json", - data: data, - beforeSend: function () { - $.modal.loading("正在处理中,请稍后..."); - }, - success: function(result) { - if (typeof callback == "function") { - callback(result); - } - $.operate.successTabCallback(result); - } - }; - $.ajax(config) + var config = { + url: url, + type: "post", + dataType: "json", + data: data, + beforeSend: function () { + $.modal.loading("正在处理中,请稍候..."); + }, + success: function(result) { + if (typeof callback == "function") { + callback(result); + } + $.operate.successTabCallback(result); + } + }; + $.ajax(config) }, // 保存结果弹出msg刷新table表格 ajaxSuccess: function (result) { - if (result.code == web_status.SUCCESS && table.options.type == table_type.bootstrapTable) { - $.modal.msgSuccess(result.msg); - $.table.refresh(); + if (result.code == web_status.SUCCESS && table.options.type == table_type.bootstrapTable) { + $.modal.msgSuccess(result.msg); + $.table.refresh(); } else if (result.code == web_status.SUCCESS && table.options.type == table_type.bootstrapTreeTable) { - $.modal.msgSuccess(result.msg); - $.treeTable.refresh(); - }else if (result.code == web_status.SUCCESS) { - $.modal.msgSuccess(result.msg) - $.table.refresh(); - } else if (result.code == web_status.WARNING) { + $.modal.msgSuccess(result.msg); + $.treeTable.refresh(); + } else if (result.code == web_status.SUCCESS && $.common.isEmpty(table.options.type)) { + $.modal.msgSuccess(result.msg) + } else if (result.code == web_status.WARNING) { $.modal.alertWarning(result.msg) - } else { - $.modal.alertError(result.msg); + } else { + $.modal.alertError(result.msg); } - $.modal.closeLoading(); + $.modal.closeLoading(); }, - // 成功结果提示msg(父窗体全局更新) - saveSuccess: function (result) { - if (result.code == web_status.SUCCESS) { - $.modal.msgReload("保存成功,正在刷新数据请稍后……", modal_status.SUCCESS); + // 保存结果重新加载页面 + saveReload: function (result) { + if (result.code == web_status.SUCCESS) { + $.modal.msgSuccessReload(result.msg); } else if (result.code == web_status.WARNING) { $.modal.alertWarning(result.msg) } else { - $.modal.alertError(result.msg); + $.modal.alertError(result.msg); } - $.modal.closeLoading(); + $.modal.closeLoading(); }, // 成功回调执行事件(父窗体静默更新) successCallback: function(result) { if (result.code == web_status.SUCCESS) { - var parent = window.parent; - if (parent.table.options.type == table_type.bootstrapTable) { + var parent = activeWindow(); + if ($.common.isEmpty(parent.table)) { + $.modal.msgSuccessReload(result.msg); + } else if (parent.table.options.type == table_type.bootstrapTable) { $.modal.close(); parent.$.modal.msgSuccess(result.msg); parent.$.table.refresh(); @@ -1323,8 +1330,6 @@ var table = { $.modal.close(); parent.$.modal.msgSuccess(result.msg); parent.$.treeTable.refresh(); - } else { - $.modal.msgReload("保存成功,正在刷新数据请稍后……", modal_status.SUCCESS); } } else if (result.code == web_status.WARNING) { $.modal.alertWarning(result.msg) @@ -1337,18 +1342,23 @@ var table = { // 选项卡成功回调执行事件(父窗体静默更新) successTabCallback: function(result) { if (result.code == web_status.SUCCESS) { - var topWindow = $(window.parent.document); - var currentId = $('.page-tabs-content', topWindow).find('.active').attr('data-panel'); - var $contentWindow = $('.RuoYi_iframe[data-id="' + currentId + '"]', topWindow)[0].contentWindow; - $.modal.close(); - $contentWindow.$.modal.msgSuccess(result.msg); - $contentWindow.$(".layui-layer-padding").removeAttr("style"); - if ($contentWindow.table.options.type == table_type.bootstrapTable) { - $contentWindow.$.table.refresh(); - } else if ($contentWindow.table.options.type == table_type.bootstrapTreeTable) { - $contentWindow.$.treeTable.refresh(); + var topWindow = $(window.parent.document); + var currentId = $('.page-tabs-content', topWindow).find('.active').attr('data-panel'); + var topWindow = $('.RuoYi_iframe[data-id="' + currentId + '"]', topWindow)[0]; + if ($.common.isNotEmpty(topWindow) && $.common.isNotEmpty(currentId)) { + var $contentWindow = topWindow.contentWindow; + $contentWindow.$.modal.msgSuccess(result.msg); + $contentWindow.$(".layui-layer-padding").removeAttr("style"); + if ($contentWindow.table.options.type == table_type.bootstrapTable) { + $contentWindow.$.table.refresh(); + } else if ($contentWindow.table.options.type == table_type.bootstrapTreeTable) { + $contentWindow.$.treeTable.refresh(); + } + } else { + $.modal.msgSuccess(result.msg); } - $.modal.closeTab(); + $.modal.close(); + $.modal.closeTab(); } else if (result.code == web_status.WARNING) { $.modal.alertWarning(result.msg) } else { @@ -1359,216 +1369,218 @@ var table = { }, // 校验封装处理 validate: { - // 判断返回标识是否唯一 false 不存在 true 存在 - unique: function (value) { - if (value == "0") { - return true; - } - return false; - }, // 表单验证 form: function (formId) { - var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; + var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; return $("#" + currentId).validate().form(); }, // 重置表单验证(清除提示信息) reset: function (formId) { - var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; + var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId; return $("#" + currentId).validate().resetForm(); } }, // 树插件封装处理 tree: { - _option: {}, - _lastValue: {}, - // 初始化树结构 - init: function(options) { - var defaults = { - id: "tree", // 属性ID - expandLevel: 0, // 展开等级节点 - - view: { - selectedMulti: false, // 设置是否允许同时选中多个节点 - nameIsHTML: true // 设置 name 属性是否支持 HTML 脚本 - }, - check: { - enable: false, // 置 zTree 的节点上是否显示 checkbox / radio - nocheckInherit: true, // 设置子节点是否自动继承 - }, - data: { - key: { - title: "title" // 节点数据保存节点提示信息的属性名称 - }, - simpleData: { - enable: true // true / false 分别表示 使用 / 不使用 简单数据模式 - } - }, - }; - var options = $.extend(defaults, options); - $.tree._option = options; - // 树结构初始化加载 - var setting = { - callback: { - onClick: options.onClick, // 用于捕获节点被点击的事件回调函数 - onCheck: options.onCheck, // 用于捕获 checkbox / radio 被勾选 或 取消勾选的事件回调函数 - onDblClick: options.onDblClick // 用于捕获鼠标双击之后的事件回调函数 - }, - check: options.check, - view: options.view, - data: options.data - }; - $.get(options.url, function(data) { - var treeId = $("#treeId").val(); - tree = $.fn.zTree.init($("#" + options.id), setting, data); - $._tree = tree; - var nodes = tree.getNodesByParam("level", options.expandLevel - 1); - for (var i = 0; i < nodes.length; i++) { - tree.expandNode(nodes[i], true, false, false); - } - var node = tree.getNodesByParam("id", treeId, null)[0]; - $.tree.selectByIdName(treeId, node); - }); - }, - // 搜索节点 - searchNode: function() { - // 取得输入的关键字的值 - var value = $.common.trim($("#keyword").val()); - if ($.tree._lastValue == value) { - return; - } - // 保存最后一次搜索名称 - $.tree._lastValue = value; - var nodes = $._tree.getNodes(); - // 如果要查空字串,就退出不查了。 - if (value == "") { - $.tree.showAllNode(nodes); - return; - } - $.tree.hideAllNode(nodes); - // 根据搜索值模糊匹配 - $.tree.updateNodes($._tree.getNodesByParamFuzzy("name", value)); - }, - // 根据Id和Name选中指定节点 - selectByIdName: function(treeId, node) { - if ($.common.isNotEmpty(treeId) && treeId == node.id) { - $._tree.selectNode(node, true); - } - }, - // 显示所有节点 - showAllNode: function(nodes) { - nodes = $._tree.transformToArray(nodes); - for (var i = nodes.length - 1; i >= 0; i--) { - if (nodes[i].getParentNode() != null) { - $._tree.expandNode(nodes[i], true, false, false, false); - } else { - $._tree.expandNode(nodes[i], true, true, false, false); - } - $._tree.showNode(nodes[i]); - $.tree.showAllNode(nodes[i].children); - } - }, - // 隐藏所有节点 - hideAllNode: function(nodes) { - var tree = $.fn.zTree.getZTreeObj("tree"); - var nodes = $._tree.transformToArray(nodes); - for (var i = nodes.length - 1; i >= 0; i--) { - $._tree.hideNode(nodes[i]); - } - }, - // 显示所有父节点 - showParent: function(treeNode) { - var parentNode; - while ((parentNode = treeNode.getParentNode()) != null) { - $._tree.showNode(parentNode); - $._tree.expandNode(parentNode, true, false, false); - treeNode = parentNode; - } - }, - // 显示所有孩子节点 - showChildren: function(treeNode) { - if (treeNode.isParent) { - for (var idx in treeNode.children) { - var node = treeNode.children[idx]; - $._tree.showNode(node); - $.tree.showChildren(node); - } - } - }, - // 更新节点状态 - updateNodes: function(nodeList) { - $._tree.showNodes(nodeList); - for (var i = 0, l = nodeList.length; i < l; i++) { - var treeNode = nodeList[i]; - $.tree.showChildren(treeNode); - $.tree.showParent(treeNode) - } - }, - // 获取当前被勾选集合 - getCheckedNodes: function(column) { - var _column = $.common.isEmpty(column) ? "id" : column; - var nodes = $._tree.getCheckedNodes(true); - return $.map(nodes, function (row) { - return row[_column]; - }).join(); - }, - // 不允许根父节点选择 - notAllowParents: function(_tree) { - var nodes = _tree.getSelectedNodes(); - if(nodes.length == 0){ + _option: {}, + _lastValue: {}, + // 初始化树结构 + init: function(options) { + var defaults = { + id: "tree", // 属性ID + expandLevel: 0, // 展开等级节点 + view: { + selectedMulti: false, // 设置是否允许同时选中多个节点 + nameIsHTML: true // 设置 name 属性是否支持 HTML 脚本 + }, + check: { + enable: false, // 置 zTree 的节点上是否显示 checkbox / radio + nocheckInherit: true, // 设置子节点是否自动继承 + chkboxType: { "Y": "ps", "N": "ps" } // 父子节点的关联关系 + }, + data: { + key: { + title: "title" // 节点数据保存节点提示信息的属性名称 + }, + simpleData: { + enable: true // true / false 分别表示 使用 / 不使用 简单数据模式 + } + }, + }; + var options = $.extend(defaults, options); + $.tree._option = options; + // 树结构初始化加载 + var setting = { + callback: { + onClick: options.onClick, // 用于捕获节点被点击的事件回调函数 + onCheck: options.onCheck, // 用于捕获 checkbox / radio 被勾选 或 取消勾选的事件回调函数 + onDblClick: options.onDblClick // 用于捕获鼠标双击之后的事件回调函数 + }, + check: options.check, + view: options.view, + data: options.data + }; + $.get(options.url, function(data) { + var treeId = $("#treeId").val(); + tree = $.fn.zTree.init($("#" + options.id), setting, data); + $._tree = tree; + for (var i = 0; i < options.expandLevel; i++) { + var nodes = tree.getNodesByParam("level", i); + for (var j = 0; j < nodes.length; j++) { + tree.expandNode(nodes[j], true, false, false); + } + } + var node = tree.getNodesByParam("id", treeId, null)[0]; + $.tree.selectByIdName(treeId, node); + // 回调tree方法 + if (typeof(options.callBack) === "function"){ + options.callBack(tree); + } + }); + }, + // 搜索节点 + searchNode: function() { + // 取得输入的关键字的值 + var value = $.common.trim($("#keyword").val()); + if ($.tree._lastValue == value) { + return; + } + // 保存最后一次搜索名称 + $.tree._lastValue = value; + var nodes = $._tree.getNodes(); + // 如果要查空字串,就退出不查了。 + if (value == "") { + $.tree.showAllNode(nodes); + return; + } + $.tree.hideAllNode(nodes); + // 根据搜索值模糊匹配 + $.tree.updateNodes($._tree.getNodesByParamFuzzy("name", value)); + }, + // 根据Id和Name选中指定节点 + selectByIdName: function(treeId, node) { + if ($.common.isNotEmpty(treeId) && node && treeId == node.id) { + $._tree.selectNode(node, true); + } + }, + // 显示所有节点 + showAllNode: function(nodes) { + nodes = $._tree.transformToArray(nodes); + for (var i = nodes.length - 1; i >= 0; i--) { + if (nodes[i].getParentNode() != null) { + $._tree.expandNode(nodes[i], true, false, false, false); + } else { + $._tree.expandNode(nodes[i], true, true, false, false); + } + $._tree.showNode(nodes[i]); + $.tree.showAllNode(nodes[i].children); + } + }, + // 隐藏所有节点 + hideAllNode: function(nodes) { + var nodes = $._tree.transformToArray(nodes); + for (var i = nodes.length - 1; i >= 0; i--) { + $._tree.hideNode(nodes[i]); + } + }, + // 显示所有父节点 + showParent: function(treeNode) { + var parentNode; + while ((parentNode = treeNode.getParentNode()) != null) { + $._tree.showNode(parentNode); + $._tree.expandNode(parentNode, true, false, false); + treeNode = parentNode; + } + }, + // 显示所有孩子节点 + showChildren: function(treeNode) { + if (treeNode.isParent) { + for (var idx in treeNode.children) { + var node = treeNode.children[idx]; + $._tree.showNode(node); + $.tree.showChildren(node); + } + } + }, + // 更新节点状态 + updateNodes: function(nodeList) { + $._tree.showNodes(nodeList); + for (var i = 0, l = nodeList.length; i < l; i++) { + var treeNode = nodeList[i]; + $.tree.showChildren(treeNode); + $.tree.showParent(treeNode) + } + }, + // 获取当前被勾选集合 + getCheckedNodes: function(column) { + var _column = $.common.isEmpty(column) ? "id" : column; + var nodes = $._tree.getCheckedNodes(true); + return $.map(nodes, function (row) { + return row[_column]; + }).join(); + }, + // 不允许根父节点选择 + notAllowParents: function(_tree) { + var nodes = _tree.getSelectedNodes(); + if (nodes.length == 0){ $.modal.msgError("请选择节点后提交"); return false; - } - for (var i = 0; i < nodes.length; i++) { - if (nodes[i].level == 0) { - $.modal.msgError("不能选择根节点(" + nodes[i].name + ")"); - return false; - } - if (nodes[i].isParent) { - $.modal.msgError("不能选择父节点(" + nodes[i].name + ")"); - return false; - } - } - return true; - }, - // 不允许最后层级节点选择 - notAllowLastLevel: function(_tree) { - var nodes = _tree.getSelectedNodes(); - for (var i = 0; i < nodes.length; i++) { + } + for (var i = 0; i < nodes.length; i++) { + if (nodes[i].level == 0) { + $.modal.msgError("不能选择根节点(" + nodes[i].name + ")"); + return false; + } + if (nodes[i].isParent) { + $.modal.msgError("不能选择父节点(" + nodes[i].name + ")"); + return false; + } + } + return true; + }, + // 不允许最后层级节点选择 + notAllowLastLevel: function(_tree) { + var nodes = _tree.getSelectedNodes(); + for (var i = 0; i < nodes.length; i++) { if (!nodes[i].isParent) { - $.modal.msgError("不能选择最后层级节点(" + nodes[i].name + ")"); - return false; - } - } - return true; - }, - // 隐藏/显示搜索栏 - toggleSearch: function() { - $('#search').slideToggle(200); - $('#btnShow').toggle(); - $('#btnHide').toggle(); - $('#keyword').focus(); - }, - // 折叠 - collapse: function() { - $._tree.expandAll(false); - }, - // 展开 - expand: function() { - $._tree.expandAll(true); - } + $.modal.msgError("不能选择最后层级节点(" + nodes[i].name + ")"); + return false; + } + } + return true; + }, + // 隐藏/显示搜索栏 + toggleSearch: function() { + $('#search').slideToggle(200); + $('#btnShow').toggle(); + $('#btnHide').toggle(); + $('#keyword').focus(); + }, + // 折叠 + collapse: function() { + $._tree.expandAll(false); + }, + // 展开 + expand: function() { + $._tree.expandAll(true); + } }, // 通用方法封装处理 - common: { - // 判断字符串是否为空 + common: { + // 判断字符串是否为空 isEmpty: function (value) { - if (value == null || this.trim(value) == "") { + if (value == null || this.trim(value) == "" || value == undefined || value == "undefined") { return true; } return false; }, // 判断一个字符串是否为非空串 isNotEmpty: function (value) { - return !$.common.isEmpty(value); + return !$.common.isEmpty(value); + }, + // 如果值是空,则返回指定默认字符串,否则返回字符串本身 + nullToDefault: function (value, defaultValue) { + return $.common.isEmpty(value) ? defaultValue : value; }, // 空对象转字符串 nullToStr: function(value) { @@ -1593,19 +1605,19 @@ var table = { }, // 比较两个字符串(大小写敏感) equals: function (str, that) { - return str == that; + return str == that; }, // 比较两个字符串(大小写不敏感) equalsIgnoreCase: function (str, that) { - return String(str).toUpperCase() === String(that).toUpperCase(); + return String(str).toUpperCase() === String(that).toUpperCase(); }, // 将字符串按指定字符分割 split: function (str, sep, maxLen) { - if ($.common.isEmpty(str)) { - return null; - } - var value = String(str).split(sep); - return maxLen ? value.slice(0, maxLen - 1) : value; + if ($.common.isEmpty(str)) { + return null; + } + var value = String(str).split(sep); + return maxLen ? value.slice(0, maxLen - 1) : value; }, // 字符串格式化(%s ) sprintf: function (str) { @@ -1616,10 +1628,55 @@ var table = { flag = false; return ''; } - return arg; + return arg == null ? '' : arg; }); return flag ? str : ''; }, + // 日期格式化 时间戳 -> yyyy-MM-dd HH-mm-ss + dateFormat: function(date, format) { + var that = this; + if (that.isEmpty(date)) return ""; + if (!date) return; + if (!format) format = "yyyy-MM-dd"; + switch (typeof date) { + case "string": + date = new Date(date.replace(/-/g, "/")); + break; + case "number": + date = new Date(date); + break; + } + if (!date instanceof Date) return; + var dict = { + "yyyy": date.getFullYear(), + "M": date.getMonth() + 1, + "d": date.getDate(), + "H": date.getHours(), + "m": date.getMinutes(), + "s": date.getSeconds(), + "MM": ("" + (date.getMonth() + 101)).substr(1), + "dd": ("" + (date.getDate() + 100)).substr(1), + "HH": ("" + (date.getHours() + 100)).substr(1), + "mm": ("" + (date.getMinutes() + 100)).substr(1), + "ss": ("" + (date.getSeconds() + 100)).substr(1) + }; + return format.replace(/(yyyy|MM?|dd?|HH?|ss?|mm?)/g, + function() { + return dict[arguments[0]]; + }); + }, + // 获取节点数据,支持多层级访问 + getItemField: function (item, field) { + var value = item; + if (typeof field !== 'string' || item.hasOwnProperty(field)) { + return item[field]; + } + var props = field.split('.'); + for (var p in props) { + value = value && value[props[p]]; + } + return value; + }, // 指定随机数返回 random: function (min, max) { return Math.floor((Math.random() * max) + min); @@ -1648,33 +1705,71 @@ var table = { }, // 数组中的所有元素放入一个字符串 join: function(array, separator) { - if ($.common.isEmpty(array)) { - return null; - } + if ($.common.isEmpty(array)) { + return null; + } return array.join(separator); }, // 获取form下所有的字段并转换为json对象 formToJSON: function(formId) { - var json = {}; - $.each($("#" + formId).serializeArray(), function(i, field) { - if(json[field.name]) { - json[field.name] += ("," + field.value); - } else { - json[field.name] = field.value; - } - }); - return json; + var json = {}; + $.each($("#" + formId).serializeArray(), function(i, field) { + if (json[field.name]) { + json[field.name] += ("," + field.value); + } else { + json[field.name] = field.value; + } + }); + return json; + }, + // 数据字典转下拉框 + dictToSelect: function(datas, value, name) { + var actions = []; + actions.push($.common.sprintf("'); + return actions.join(''); }, // 获取obj对象长度 getLength: function(obj) { - var count = 0;   + var count = 0; for (var i in obj) { if (obj.hasOwnProperty(i)) { count++; - }   + } } return count; - } + }, + // 判断移动端 + isMobile: function () { + return navigator.userAgent.match(/(Android|iPhone|SymbianOS|Windows Phone|iPad|iPod)/i); + }, + // 数字正则表达式,只能为0-9数字 + numValid : function(text){ + var patten = new RegExp(/^[0-9]+$/); + return patten.test(text); + }, + // 英文正则表达式,只能为a-z和A-Z字母 + enValid : function(text){ + var patten = new RegExp(/^[a-zA-Z]+$/); + return patten.test(text); + }, + // 英文、数字正则表达式,必须包含(字母,数字) + enNumValid : function(text){ + var patten = new RegExp(/^(?=.*[a-zA-Z]+)(?=.*[0-9]+)[a-zA-Z0-9]+$/); + return patten.test(text); + }, + // 英文、数字、特殊字符正则表达式,必须包含(字母,数字,特殊字符!@#$%^&*()-=_+) + charValid : function(text){ + var patten = new RegExp(/^(?=.*[A-Za-z])(?=.*\d)(?=.*[~!@#\$%\^&\*\(\)\-=_\+])[A-Za-z\d~!@#\$%\^&\*\(\)\-=_\+]{6,}$/); + return patten.test(text); + }, } }); })(jQuery); diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/include.html b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/include.html index 6049fb09..ee8a1198 100644 --- a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/include.html +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/include.html @@ -30,7 +30,8 @@ - + + diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/index_t.html b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/index_t.html index ceef867f..c5d3b6d4 100644 --- a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/index_t.html +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/index_t.html @@ -350,6 +350,7 @@ + @@ -357,7 +358,7 @@ @@ -145,14 +145,14 @@ /*登录*/ $("#login").click(function(){ login(); - }) + }); $(document).keypress(function (e) { if (e.keyCode == 13){ login(); } }) - }) + }); /** * 登录 diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/login.html b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/login.html index a7ae91d8..1f8ca386 100644 --- a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/login.html +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/login.html @@ -87,15 +87,15 @@ -
    -
    验证码
    - -
    - - - -
    -
    + + + + + + + + +
    记住密码 diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/login_v1.html b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/login_v1.html index 8971e6f5..2da179df 100644 --- a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/login_v1.html +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/login_v1.html @@ -18,7 +18,7 @@ diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/project/code/audit/add.html b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/project/code/audit/add.html index 574d66f3..3db00b3d 100644 --- a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/project/code/audit/add.html +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/project/code/audit/add.html @@ -40,14 +40,14 @@ \ No newline at end of file diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/user/user.html b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/user/user.html index 6a178044..06ceab20 100644 --- a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/user/user.html +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/user/user.html @@ -129,9 +129,9 @@ function queryUserList() { var importb = [[${@permission.hasPermi('system:user:import')}]]; - var importboolen = (importb==""?true:false) + var importboolen = (importb==""?true:false); var exportb = [[${@permission.hasPermi('system:user:export')}]]; - var exportboolen = (exportb==""?true:false) + var exportboolen = (exportb==""?true:false); // alert($(window).height()-$(".search-collapse").height()-$("#toolbar").height()) // alert($(".select-table").height()) var options = { @@ -205,10 +205,10 @@ title: '邮箱', visible: false },*/ - { - field: 'phonenumber', - title: '手机号码' - }, + // { + // field: 'phonenumber', + // title: '手机号码' + // }, { visible: editFlag == 'hidden' ? false : true, title: '用户状态', @@ -375,7 +375,7 @@ var nodes = $._tree.getNodes(); if (nodes.length > 0) { console.log("sss"); - $._tree.selectNode(nodes[0]) + $._tree.selectNode(nodes[0]); $("#deptId").val(nodes[0].id); $("#parentId").val(nodes[0].pId); $.table.search(); diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/userAssist/user.html b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/userAssist/user.html index 6b83e22f..cdc0c14b 100644 --- a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/userAssist/user.html +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/userAssist/user.html @@ -126,9 +126,9 @@ function queryUserList() { var importb = [[${@permission.hasPermi('system:user:import')}]]; - var importboolen = (importb == "" ? true : false) + var importboolen = (importb == "" ? true : false); var exportb = [[${@permission.hasPermi('system:user:export')}]]; - var exportboolen = (exportb == "" ? true : false) + var exportboolen = (exportb == "" ? true : false); var options = { url: prefix + "/list", createUrl: prefix + "/add", @@ -195,10 +195,10 @@ return po; } }, - { - field: 'phonenumber', - title: '手机号码' - }, + // { + // field: 'phonenumber', + // title: '手机号码' + // }, { visible: editFlag == 'hidden' ? false : true, title: '用户状态', @@ -357,7 +357,7 @@ var nodes = $._tree.getNodes(); if (nodes.length > 0) { console.log("sss"); - $._tree.selectNode(nodes[0]) + $._tree.selectNode(nodes[0]); $("#deptId").val(nodes[0].id); $("#parentId").val(nodes[0].pId); $.table.search(); diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/video/video.html b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/video/video.html index 7a3ab33c..bf1992c9 100644 --- a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/video/video.html +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/system/video/video.html @@ -132,7 +132,7 @@ html+='
    '; html+='
    '; } - $("#videoList").html(html); + $("#videoList").html(DOMPurify.sanitize(html)); }); }, //发布 @@ -191,7 +191,7 @@ uploadFiles: function () { $.modal.open("上传文件", prefix + "add",800,650) } - } + }; videoUtil.init(); diff --git a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/zdxtInclude.html b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/zdxtInclude.html index be2b2973..767a19e5 100644 --- a/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/zdxtInclude.html +++ b/lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/zdxtInclude.html @@ -41,6 +41,7 @@ + diff --git a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/controller/ComplaintStaticController.java b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/controller/ComplaintStaticController.java index 4bab44e9..cc9b1f78 100644 --- a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/controller/ComplaintStaticController.java +++ b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/controller/ComplaintStaticController.java @@ -118,6 +118,7 @@ public class ComplaintStaticController extends BaseController { }else { model.addAttribute("dou", "0.00%"); } + model.addAttribute("total",complaintStatisticsAllList.size()); return prefix+"/complaintB"; } @RequiresPermissions("code:complaintStatic:list") @@ -186,7 +187,7 @@ public class ComplaintStaticController extends BaseController { font2.setFontName("微软雅黑"); font2.setBold(true); font2.setFontHeightInPoints((short) 11); - HSSFCellStyle styleRow2=workbook.createCellStyle(); + HSSFCellStyle styleRow2=workbook.createCellStyle(); styleRow2.setWrapText(true);//换行 styleRow2.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); styleRow2.setFillPattern(FillPatternType.SOLID_FOREGROUND); diff --git a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/service/impl/EnforcementRegistrationServiceImpl.java b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/service/impl/EnforcementRegistrationServiceImpl.java index e2f38f18..66bb07b5 100644 --- a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/service/impl/EnforcementRegistrationServiceImpl.java +++ b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/service/impl/EnforcementRegistrationServiceImpl.java @@ -246,6 +246,7 @@ public class EnforcementRegistrationServiceImpl implements IEnforcementRegistrat enforcementRegistrationMapper.selectEnforcementRegistrationList1(enforcementRegistration); return enforcementRegistrations; } + @DataScope(deptAlias = "r",userAlias = "r") @Override public List selectEnforcementRegistrationAndAddressList(EnforcementRegistration enforcementRegistration) { List enforcementRegistrations = @@ -542,6 +543,7 @@ public class EnforcementRegistrationServiceImpl implements IEnforcementRegistrat enforcementRegistrationMapper.staticEnforcementRegistration(enforcementRegistrationDto); return enforcementRegistrationDtos; } + @DataScope(deptAlias = "r",userAlias = "r") @Override public List staticEnforcementRegistrationLI(EnforcementRegistrationDto enforcementRegistrationDto) { if(enforcementRegistrationDto.getQy()!=null&&!"".equals(enforcementRegistrationDto.getQy())){ diff --git a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/service/impl/ThirdLoginServiceImpl.java b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/service/impl/ThirdLoginServiceImpl.java index b57af4de..2f9c91c9 100644 --- a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/service/impl/ThirdLoginServiceImpl.java +++ b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/service/impl/ThirdLoginServiceImpl.java @@ -317,7 +317,7 @@ public class ThirdLoginServiceImpl implements ThirdLoginService { //证件号解密 String s = IdCardCryptoUtil.symmetricDecryptIdCard(srzSecretKey, userIdCard); System.out.println("======身份证解密========"); - System.out.println(s); + log.info(s); System.out.println("=============="); List zfryjdm2405301s = xzjcjbxx025711Mapper.queryZFRYByIdCard(s); System.out.println("======解密后查询========"); diff --git a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/utils/HttpUtil.java b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/utils/HttpUtil.java index 97b8ed8b..3a4559ee 100644 --- a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/utils/HttpUtil.java +++ b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/utils/HttpUtil.java @@ -216,7 +216,7 @@ public class HttpUtil { response.append(inputLine); } in.close(); - System.out.println(response.toString()); + log.info(response.toString()); System.out.println("请求成功"); return response.toString(); }else{ diff --git a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/utils/ZwSmsClient.java b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/utils/ZwSmsClient.java index c57a7f64..5e734a16 100644 --- a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/utils/ZwSmsClient.java +++ b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/java/com/zdxt/code/utils/ZwSmsClient.java @@ -71,7 +71,6 @@ public class ZwSmsClient { call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING); String result = (String) call.invoke(new Object[]{username, password, "2409", sendbody}); - System.out.println(result);//打印返回的结果 return result; } diff --git a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/EnforcementCheckStatisticsMapper.xml b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/EnforcementCheckStatisticsMapper.xml index 634ef0d2..0e7065fc 100644 --- a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/EnforcementCheckStatisticsMapper.xml +++ b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/EnforcementCheckStatisticsMapper.xml @@ -25,7 +25,7 @@ and find_in_set(#{deptId},s.ancestors) and (year(e.create_time)=#{year}) - and (month(e.create_time)in(${month})) + and (month(e.create_time)in(#{month})) order by e.enterprise_name @@ -38,7 +38,7 @@ and !find_in_set((select dept_id from sys_dept where dept_name="区"),s.ancestors) and (year(e.create_time)=#{year}) - and (month(e.create_time)in(${month})) + and (month(e.create_time)in(#{month})) order by e.enterprise_name @@ -48,26 +48,26 @@ @@ -262,6 +264,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND DATE_FORMAT(r.create_time, '%m') = #{month} + + + + ${params.dataScope} + order by r.create_time desc @@ -341,7 +348,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and enforcement_time <= #{params.endTime} - ${params.dataScope} + + + ${params.dataScope} + GROUP BY IFNULL(unite_check, RAND()) order by enforcement_time desc @@ -703,6 +713,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and DATE_FORMAT(r.create_time,'%Y-%m-%d') <= STR_TO_DATE(#{endTime},'%Y-%m-%d') + + + ${params.dataScope} + ORDER BY r.create_time DESC LIMIT 1000000000 ) t GROUP BY diff --git a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/LinkageDictMapper.xml b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/LinkageDictMapper.xml index f192db07..c515746c 100755 --- a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/LinkageDictMapper.xml +++ b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/LinkageDictMapper.xml @@ -39,7 +39,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and creator = #{creator} and updator = #{updator} - ${params.dataScope} + + + ${params.dataScope} + or dept_id is null @@ -49,7 +52,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and parent_id = #{parentId} - ${params.dataScope} + + + ${params.dataScope} + @@ -69,8 +75,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select t1.id, t1.title, t1.`value`, t1.parent_id, t1.`desc`, t1.srot, t1.`status`, t1.`domain`, t1.dept, t1.dept_id, t1.demand, t1.basis, t1.creator, t1.create_time, t1.updator, t1.update_time from linkage_dict t1 LEFT JOIN linkage_dict t2 on t2.id = t1.parent_id - where t2.`value` = #{value} - ${params.dataScope} + + and t2.`value` = #{value} + + + ${params.dataScope} + + diff --git a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/StatisticalMapper.xml b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/StatisticalMapper.xml index da9b6033..ceedba32 100644 --- a/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/StatisticalMapper.xml +++ b/lib/EmergencyService/zdxtLawEnforcementCodeService/src/main/resources/mapper/StatisticalMapper.xml @@ -77,9 +77,13 @@ @@ -162,8 +168,10 @@ AND ei.industry = #{industry} - - ${params.dataScope} + + + ${params.dataScope} + GROUP BY er.law_enforcer_id ORDER BY total DESC limit 100 @@ -187,8 +195,10 @@ AND ei.industry = #{industry} - - ${params.dataScope} + + + ${params.dataScope} + GROUP BY d.id ORDER BY total DESC limit 100 @@ -209,8 +219,10 @@ AND i.industry = #{industry} - - ${params.dataScope} + + + ${params.dataScope} + GROUP BY i.company_org_type ORDER BY total DESC limit 100 @@ -233,8 +245,10 @@ AND check_category = #{checkCategory} - - ${params.dataScope} + + + ${params.dataScope} + GROUP BY DATE_FORMAT(enforcement_time, '%Y-%m-%d') ORDER BY enforcement_time ASC @@ -256,8 +270,10 @@ AND check_category = #{checkCategory} - - ${params.dataScope} + + + ${params.dataScope} + GROUP BY enterprise_number ORDER BY total desc @@ -277,8 +293,10 @@ AND DATE_FORMAT(er.enforcement_time, '%Y-%m') = #{params.yearMonth} - - ${params.dataScope} + + + ${params.dataScope} + GROUP BY DATE_FORMAT(enforcement_time, '%Y-%m-%d'), er.enterprise_number ORDER BY total DESC limit 100