refactor: 将 payapi 移到子目录下
diff --git a/payapi/build.gradle b/payapi/build.gradle
new file mode 100644
index 0000000..9d339e7
--- /dev/null
+++ b/payapi/build.gradle
@@ -0,0 +1,117 @@
+plugins {
+ id 'java'
+ id 'org.springframework.boot' version '2.1.6.RELEASE'
+ id 'org.jetbrains.kotlin.jvm' version '1.3.31'
+ id 'org.jetbrains.kotlin.plugin.jpa' version '1.3.31'
+ id 'org.jetbrains.kotlin.plugin.spring' version '1.3.31'
+ id "com.palantir.git-version" version "0.12.0-rc2"
+ id 'com.palantir.docker' version '0.22.1'
+}
+
+apply plugin: 'java'
+apply plugin: 'io.spring.dependency-management'
+
+payapiVersion = gitVersion()
+
+group = 'com.supwisdom'
+version = '1'
+sourceCompatibility = jdkVersion
+def startClass = 'com.supwisdom.dlpay.PayApiApplicationKt'
+
+println("Build version: $payapiVersion")
+allprojects {
+ repositories {
+ jcenter()
+ mavenCentral()
+ }
+}
+
+subprojects {
+ version = '1.0'
+}
+
+bootJar {
+ mainClassName = startClass
+ manifest {
+ attributes('Payapi-Version': payapiVersion)
+ }
+}
+
+jar {
+ baseName = 'payapi'
+}
+
+docker {
+ name 'harbor.supwisdom.com/dali/payapi:' + version
+ println(jar.archivePath)
+ files jar.archivePath
+}
+
+docker.dependsOn(jar)
+
+dependencies {
+ implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
+ implementation 'org.springframework.boot:spring-boot-starter-data-redis'
+ implementation 'org.springframework.boot:spring-boot-starter-web'
+ implementation 'org.springframework.boot:spring-boot-starter-security'
+ implementation 'org.springframework.boot:spring-boot-starter-cache'
+ implementation 'org.springframework.boot:spring-boot-autoconfigure'
+ implementation 'org.springframework.security:spring-security-oauth2-jose'
+ implementation 'org.springframework.security:spring-security-oauth2-client'
+ implementation 'org.springframework.security:spring-security-oauth2-jose'
+ implementation 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.1.5.RELEASE'
+ implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
+ implementation 'org.springframework.session:spring-session-data-redis'
+ implementation 'org.springframework.boot:spring-boot-starter-cache'
+ implementation 'org.springframework.social:spring-social-web:1.1.6.RELEASE'
+ implementation 'org.jetbrains.kotlin:kotlin-reflect'
+ implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
+ implementation 'commons-codec:commons-codec:1.12'
+
+ implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery:2.1.2.RELEASE'
+
+ implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
+
+ runtime("org.springframework.boot:spring-boot-devtools")
+
+ implementation 'org.postgresql:postgresql:42.2.5'
+ implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
+ implementation 'com.jcabi:jcabi-manifests:1.1'
+ implementation 'org.bitbucket.b_c:jose4j:0.6.3'
+ implementation 'io.github.microutils:kotlin-logging:1.6.26'
+ implementation 'org.slf4j:slf4j-parent:1.7.26'
+ implementation 'com.github.penggle:kaptcha:2.3.2'
+ implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
+ implementation group: 'com.sun.jersey', name: 'jersey-client', version: '1.19'
+ implementation group: 'javax.servlet', name: 'jstl', version: '1.2'
+ implementation group: 'taglibs', name: 'standard', version: '1.1.2'
+ implementation group: 'commons-codec', name: 'commons-codec', version: '1.6'
+ implementation files('libs/ojdbc6.jar')
+ implementation 'commons-dbcp:commons-dbcp:1.4'
+
+ implementation project(':common')
+
+ annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
+ annotationProcessor 'org.projectlombok:lombok:1.18.8'
+ compileOnly 'org.projectlombok:lombok:1.18.8'
+
+// providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
+ testImplementation 'org.springframework.boot:spring-boot-starter-test'
+ testImplementation 'io.rest-assured:rest-assured:3.3.0'
+ testImplementation 'io.rest-assured:spring-mock-mvc:3.3.0'
+ testImplementation 'org.hamcrest:hamcrest:2.1'
+}
+
+compileKotlin {
+ kotlinOptions {
+ freeCompilerArgs = ['-Xjsr305=strict']
+ jvmTarget = jdkVersion
+ }
+}
+
+compileTestKotlin {
+ kotlinOptions {
+ freeCompilerArgs = ['-Xjsr305=strict']
+ jvmTarget = jdkVersion
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java b/payapi/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java
new file mode 100644
index 0000000..0ccb0eb
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay;
+
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.event.EventListener;
+
+//@Configuration
+public class AppPreparedEvent {
+
+ public AppPreparedEvent() {
+
+ }
+
+ @EventListener(ApplicationReadyEvent.class)
+ public void setupDictPool() {
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/ServletInitializer.kt b/payapi/src/main/java/com/supwisdom/dlpay/ServletInitializer.kt
new file mode 100644
index 0000000..b03a1dc
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/ServletInitializer.kt
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay
+
+import org.springframework.boot.builder.SpringApplicationBuilder
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
+
+class ServletInitializer : SpringBootServletInitializer() {
+
+ override fun configure(application: SpringApplicationBuilder): SpringApplicationBuilder {
+ return application.sources(PayApiApplication::class.java)
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/BaseResp.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/BaseResp.java
new file mode 100644
index 0000000..afe4165
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/BaseResp.java
@@ -0,0 +1,38 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.util.Code;
+
+public class BaseResp {
+ private String retcode;
+ private String retmsg;
+ private Object data;
+
+ public String getRetcode() {
+ return retcode;
+ }
+
+ public void setRetcode(String retcode) {
+ this.retcode = retcode;
+ }
+
+ public String getRetmsg() {
+ return retmsg;
+ }
+
+ public void setRetmsg(String retmsg) {
+ this.retmsg = retmsg;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+ public void setData(Object data) {
+ this.data = data;
+ }
+
+ public void setCode(Code code) {
+ this.retcode = code.getCode();
+ this.retmsg = code.getRetmsg();
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java
new file mode 100644
index 0000000..3678cc0
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java
@@ -0,0 +1,48 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class DlpayReq {
+ private static final String prefix = "<?xml version=\"1.0\" encoding=\"GBK\"?>";
+
+ //HEAD
+ private String jkdm; //<JKDM>接口代码</JKDM>
+ private String jgdm; //<JGDM>结果代码</JGDM>
+ private String fsdw; //<FSDW>发送单位</FSDW>
+ private String jsdw; //<JSDW>接收单位</JSDW>
+ private String czyh; //<CZYH>操作员号</CZYH>
+ private String jyxh; //<JYXH>交易序号</JYXH>
+ private String jyqd; //<JYQD>交易渠道</JYQD>
+ private String yhxx; //<YHXX>安全用户信息</YHXX>
+ private String klxx; //<KLXX>安全口令信息</KLXX>
+
+ //DATA业务参数 <KEY>key值</KEY>
+
+
+ private String getPayXml() {
+ StringBuffer xml = new StringBuffer();
+ xml.append(prefix)
+ .append("<FORMDATA>")
+ //HEAD
+ .append("<HEAD>")
+ .append("<JKDM>").append(jkdm).append("</JKDM>")
+ .append("<JGDM>").append("000000").append("</JGDM>") //发送时填充000000
+ .append("<FSDW>").append(fsdw).append("</FSDW>")
+ .append("<JSDW>").append(jsdw).append("</JSDW>")
+ .append("<CZYH>").append(czyh).append("</CZYH>")
+ .append("<JYXH>").append(jyxh).append("</JYXH>")
+ .append("<JYQD>").append(jyqd).append("</JYQD>")
+ .append("<YHXX>").append(yhxx).append("</YHXX>")
+ .append("<KLXX>").append(klxx).append("</KLXX>")
+ .append("</HEAD>")
+ //DATA
+ .append("<DATA>")
+// .append("<REFNO>").append("201906211124000011").append("</REFNO>")
+ .append("</DATA>")
+ .append("</FORMDATA>");
+ return String.format("%08d", xml.toString().length()) + xml.toString();
+ }
+
+
+
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/JsonResult.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/JsonResult.java
new file mode 100755
index 0000000..dafde31
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/JsonResult.java
@@ -0,0 +1,78 @@
+package com.supwisdom.dlpay.api.bean;
+
+import java.util.HashMap;
+
+public class JsonResult extends HashMap<String, Object> {
+ public JsonResult() {
+ }
+
+ /**
+ * 返回成功
+ */
+ public static JsonResult ok() {
+ return ok("操作成功");
+ }
+
+ /**
+ * 返回成功
+ */
+ public static JsonResult ok(String message) {
+ return ok(200, message);
+ }
+
+ /**
+ * 返回成功
+ */
+ public static JsonResult ok(int code, String message) {
+ JsonResult jsonResult = new JsonResult();
+ jsonResult.put("code", code);
+ jsonResult.put("msg", message);
+ return jsonResult;
+ }
+
+ /**
+ * 返回失败
+ */
+ public static JsonResult error() {
+ return error("操作失败");
+ }
+
+ /**
+ * 返回失败
+ */
+ public static JsonResult error(String messag) {
+ return error(500, messag);
+ }
+
+ /**
+ * 返回失败
+ */
+ public static JsonResult error(int code, String message) {
+ return ok(code, message);
+ }
+
+ /**
+ * 设置code
+ */
+ public JsonResult setCode(int code) {
+ super.put("code", code);
+ return this;
+ }
+
+ /**
+ * 设置message
+ */
+ public JsonResult setMessage(String message) {
+ super.put("msg", message);
+ return this;
+ }
+
+ /**
+ * 放入object
+ */
+ @Override
+ public JsonResult put(String key, Object object) {
+ super.put(key, object);
+ return this;
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/ReqParam.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/ReqParam.java
new file mode 100644
index 0000000..49fb0ee
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/ReqParam.java
@@ -0,0 +1,147 @@
+package com.supwisdom.dlpay.api.bean;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public class ReqParam {
+ /**
+ * 交易流水号
+ * */
+ private String refno;
+ /**
+ * 交易金额(分)
+ * */
+ private Integer amount;
+ /**
+ * 支付渠道
+ * */
+ private String paytype;
+ /**
+ * 订单信息
+ * */
+ private String payinfo;
+ /**
+ * 订单详细
+ * */
+ private String transdesc;
+ /**
+ * 交易日期
+ * */
+ private String transdate;
+ /**
+ * 交易时间
+ * */
+ private String transtime;
+ /**
+ * 账号
+ * */
+ private String accno;
+ /**
+ * 商户号
+ * */
+ private String shopaccno;
+ /**
+ * 签名
+ * */
+ private String sign;
+
+
+ private String yktshopid;
+ private String devphyid;
+
+ public String getYktshopid() {
+ return yktshopid;
+ }
+
+ public void setYktshopid(String yktshopid) {
+ this.yktshopid = yktshopid;
+ }
+
+ public String getDevphyid() {
+ return devphyid;
+ }
+
+ public void setDevphyid(String devphyid) {
+ this.devphyid = devphyid;
+ }
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public Integer getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Integer amount) {
+ this.amount = amount;
+ }
+
+ public String getPaytype() {
+ return paytype;
+ }
+
+ public void setPaytype(String paytype) {
+ this.paytype = paytype;
+ }
+
+ public String getPayinfo() {
+ return payinfo;
+ }
+
+ public void setPayinfo(String payinfo) {
+ this.payinfo = payinfo;
+ }
+
+ public String getTransdesc() {
+ return transdesc;
+ }
+
+ public void setTransdesc(String transdesc) {
+ this.transdesc = transdesc;
+ }
+
+ public String getTransdate() {
+ return transdate;
+ }
+
+ public void setTransdate(String transdate) {
+ this.transdate = transdate;
+ }
+
+ public String getTranstime() {
+ return transtime;
+ }
+
+ public void setTranstime(String transtime) {
+ this.transtime = transtime;
+ }
+
+ public String getAccno() {
+ return accno;
+ }
+
+ public void setAccno(String accno) {
+ this.accno = accno;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getSign() {
+ return sign;
+ }
+
+ public void setSign(String sign) {
+ this.sign = sign;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/SupStatusRevResp.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/SupStatusRevResp.java
new file mode 100644
index 0000000..6baae72
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/SupStatusRevResp.java
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.api.bean;
+
+/**
+ * Created by shuwei on 2018/10/18.
+ */
+public class SupStatusRevResp {
+ private Integer status;
+ private Boolean revflag;
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+ public Boolean getRevflag() {
+ return revflag;
+ }
+
+ public void setRevflag(Boolean revflag) {
+ this.revflag = revflag;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/SupYktResp.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/SupYktResp.java
new file mode 100644
index 0000000..bd9ea93
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/SupYktResp.java
@@ -0,0 +1,92 @@
+package com.supwisdom.dlpay.api.bean;
+
+/**
+ * Created by shuwei on 2018/8/28.
+ */
+public class SupYktResp {
+ private String retcode;
+ private String retmsg;
+ private String tradeno;
+ private String refno;
+ private String sign;
+ private String timestamp;
+ private String sign_method;
+ private Integer balance;
+ private String other;
+
+ public String getOther() {
+ return other;
+ }
+
+ public void setOther(String other) {
+ this.other = other;
+ }
+
+ public String getRetcode() {
+ return retcode;
+ }
+
+ public void setRetcode(String retcode) {
+ this.retcode = retcode;
+ }
+
+ public String getRetmsg() {
+ return retmsg;
+ }
+
+ public void setRetmsg(String retmsg) {
+ this.retmsg = retmsg;
+ }
+
+ public String getTradeno() {
+ return tradeno;
+ }
+
+ public void setTradeno(String tradeno) {
+ this.tradeno = tradeno;
+ }
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public String getSign() {
+ return sign;
+ }
+
+ public void setSign(String sign) {
+ this.sign = sign;
+ }
+
+ public String getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(String timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public String getSign_method() {
+ return sign_method;
+ }
+
+ public void setSign_method(String sign_method) {
+ this.sign_method = sign_method;
+ }
+
+ public Integer getBalance() {
+ return balance;
+ }
+
+ public void setBalance(Integer balance) {
+ this.balance = balance;
+ }
+
+ public boolean checkSign(String appid,String key){
+ return true;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/WechatReqResp.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/WechatReqResp.java
new file mode 100644
index 0000000..f69eb68
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/WechatReqResp.java
@@ -0,0 +1,472 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.framework.util.MD5;
+import com.supwisdom.dlpay.framework.util.RandomUtils;
+
+/**
+ * Created by shuwei on 17/6/12.
+ */
+public class WechatReqResp {
+ private int retcode;
+ private String retmsg;
+
+ private String nonce_str;
+ private String appid;
+ private String body;
+ private String mch_id;
+ private String openid;
+ private String out_trade_no;
+ private String spbill_create_ip;
+ private String trade_type;
+ private String key;
+ private String sign;
+ private int total_fee;
+ private String timestamp;
+ private String auth_code;
+
+ private String out_refund_no;
+ private int refund_fee;
+ private String refund_desc;
+
+ private String notify_url;
+ private String prepay_id;
+ private String wpackage;
+
+ private String scene_info;
+
+ private String mweb_url;
+
+ public String getScene_info() {
+ return scene_info;
+ }
+
+ public void setScene_info(String scene_info) {
+ this.scene_info = scene_info;
+ }
+
+ public String getMweb_url() {
+ return mweb_url;
+ }
+
+ public void setMweb_url(String mweb_url) {
+ this.mweb_url = mweb_url;
+ }
+
+ public String getNonce_str() {
+ return nonce_str;
+ }
+
+ public void setNonce_str(String nonce_str) {
+ this.nonce_str = nonce_str;
+ }
+
+ public String getAppid() {
+ return appid;
+ }
+
+ public void setAppid(String appid) {
+ this.appid = appid;
+ }
+
+ public String getBody() {
+ return body;
+ }
+
+ public void setBody(String body) {
+ this.body = body;
+ }
+
+ public String getMch_id() {
+ return mch_id;
+ }
+
+ public void setMch_id(String mch_id) {
+ this.mch_id = mch_id;
+ }
+
+ public String getOpenid() {
+ return openid;
+ }
+
+ public void setOpenid(String openid) {
+ this.openid = openid;
+ }
+
+ public String getOut_trade_no() {
+ return out_trade_no;
+ }
+
+ public void setOut_trade_no(String out_trade_no) {
+ this.out_trade_no = out_trade_no;
+ }
+
+ public String getSpbill_create_ip() {
+ return spbill_create_ip;
+ }
+
+ public void setSpbill_create_ip(String spbill_create_ip) {
+ this.spbill_create_ip = spbill_create_ip;
+ }
+
+ public String getTrade_type() {
+ return trade_type;
+ }
+
+ public void setTrade_type(String trade_type) {
+ this.trade_type = trade_type;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getSign() {
+ return sign;
+ }
+
+ public void setSign(String sign) {
+ this.sign = sign;
+ }
+
+ public int getTotal_fee() {
+ return total_fee;
+ }
+
+ public void setTotal_fee(int total_fee) {
+ this.total_fee = total_fee;
+ }
+
+ public String getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(String timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public String getAuth_code() {
+ return auth_code;
+ }
+
+ public void setAuth_code(String auth_code) {
+ this.auth_code = auth_code;
+ }
+
+
+ public String getNotify_url() {
+ return notify_url;
+ }
+
+ public void setNotify_url(String notify_url) {
+ this.notify_url = notify_url;
+ }
+
+ public String getPrepay_id() {
+ return prepay_id;
+ }
+
+ public void setPrepay_id(String prepay_id) {
+ this.prepay_id = prepay_id;
+ }
+
+ public String getWpackage() {
+ return wpackage;
+ }
+
+ public void setWpackage(String wpackage) {
+ this.wpackage = wpackage;
+ }
+
+ public int getRetcode() {
+ return retcode;
+ }
+
+ public void setRetcode(int retcode) {
+ this.retcode = retcode;
+ }
+
+ public String getRetmsg() {
+ return retmsg;
+ }
+
+ public void setRetmsg(String retmsg) {
+ this.retmsg = retmsg;
+ }
+
+ public String getOut_refund_no() {
+ return out_refund_no;
+ }
+
+ public void setOut_refund_no(String out_refund_no) {
+ this.out_refund_no = out_refund_no;
+ }
+
+ public int getRefund_fee() {
+ return refund_fee;
+ }
+
+ public void setRefund_fee(int refund_fee) {
+ this.refund_fee = refund_fee;
+ }
+
+ public String getRefund_desc() {
+ return refund_desc;
+ }
+
+ public void setRefund_desc(String refund_desc) {
+ this.refund_desc = refund_desc;
+ }
+
+ public String generalPaySign() {
+ this.nonce_str = RandomUtils.getRandomString(30);
+ StringBuffer str = new StringBuffer()
+ .append("appid=").append(this.appid)
+ .append("&auth_code=").append(this.auth_code)
+ .append("&body=").append(this.body)
+ .append("&mch_id=").append(this.mch_id)
+ .append("&nonce_str=").append(nonce_str)
+ .append("&out_trade_no=").append(this.out_trade_no)
+ .append("&spbill_create_ip=").append(this.spbill_create_ip)
+ .append("&total_fee=").append(this.total_fee)
+ ;
+ str.append("&key=").append(this.key);
+ this.sign = MD5.encodeByMD5(str.toString());
+ return sign;
+ }
+ public String generalCheckSign(){
+ this.nonce_str = RandomUtils.getRandomString(30);
+ StringBuffer str = new StringBuffer()
+ .append("appid=").append(this.appid)
+ .append("&auth_code=").append(this.auth_code)
+ .append("&mch_id=").append(this.mch_id)
+ .append("&nonce_str=").append(nonce_str);
+ str.append("&key=").append(this.key);
+ this.sign = MD5.encodeByMD5(str.toString());
+ return sign;
+ }
+ public String generalCheckXML(){
+ StringBuffer requestStr = new StringBuffer();
+ requestStr
+ .append("<xml>")
+ .append("<appid>")
+ .append(this.appid)
+ .append("</appid>")
+ .append("<auth_code>")
+ .append(this.auth_code)
+ .append("</auth_code>")
+ .append("<mch_id>")
+ .append(this.mch_id)
+ .append("</mch_id>")
+ .append("<nonce_str>")
+ .append(this.nonce_str)
+ .append("</nonce_str>")
+ ;
+ requestStr.append("<sign>")
+ .append(this.sign)
+ .append("</sign>")
+ .append("</xml>");
+ return requestStr.toString();
+ }
+
+
+ public String generaPayXML() {
+ StringBuffer requestStr = new StringBuffer();
+ requestStr
+ .append("<xml>")
+ .append("<appid>")
+ .append(this.appid)
+ .append("</appid>")
+ .append("<auth_code>")
+ .append(this.auth_code)
+ .append("</auth_code>")
+ .append("<body>")
+ .append(this.body)
+ .append("</body>")
+ .append("<mch_id>")
+ .append(this.mch_id)
+ .append("</mch_id>")
+ .append("<nonce_str>")
+ .append(this.nonce_str)
+ .append("</nonce_str>")
+ .append("<out_trade_no>")
+ .append(this.out_trade_no)
+ .append("</out_trade_no>")
+ .append("<spbill_create_ip>")
+ .append(this.spbill_create_ip)
+ .append("</spbill_create_ip>")
+ .append("<total_fee>")
+ .append(this.total_fee)
+ .append("</total_fee>")
+ ;
+
+ requestStr.append("<sign>")
+ .append(this.sign)
+ .append("</sign>")
+ .append("</xml>");
+ return requestStr.toString();
+ }
+ public String generaSign() {
+ this.nonce_str = RandomUtils.getRandomString(30);
+ StringBuffer str = new StringBuffer()
+ .append("appid=").append(this.appid)
+ .append("&body=").append(this.body)
+ .append("&mch_id=").append(this.mch_id)
+ .append("&nonce_str=").append(nonce_str)
+ .append("¬ify_url=").append(this.notify_url);
+ if ("JSAPI".equals(this.trade_type)) {
+ str.append("&openid=").append(this.openid);
+ }
+ str.append("&out_trade_no=").append(this.out_trade_no);
+ if ("MWEB".equals(this.trade_type)) {
+ str.append("&scene_info=").append(this.scene_info);
+ }
+ str.append("&spbill_create_ip=").append(this.spbill_create_ip)
+ .append("&total_fee=").append(this.total_fee)
+ .append("&trade_type=").append(this.trade_type);
+ str.append("&key=").append(this.key);
+ this.sign = MD5.encodeByMD5(str.toString());
+ return sign;
+ }
+ public String generaReverseSign() {
+ this.nonce_str = RandomUtils.getRandomString(30);
+ StringBuffer str = new StringBuffer()
+ .append("appid=").append(this.appid)
+ .append("&mch_id=").append(this.mch_id)
+ .append("&nonce_str=").append(nonce_str)
+ .append("¬ify_url=").append(this.notify_url)
+ .append("&out_refund_no=").append(this.out_refund_no)
+ .append("&out_trade_no=").append(this.out_trade_no)
+ .append("&refund_desc=").append(this.refund_desc)
+ .append("&refund_fee=").append(this.refund_fee)
+ .append("&total_fee=").append(this.total_fee)
+ ;
+ str.append("&key=").append(this.key);
+ this.sign = MD5.encodeByMD5(str.toString());
+ return sign;
+ }
+ public String generaXML() {
+ StringBuffer requestStr = new StringBuffer();
+ requestStr
+ .append("<xml>")
+ .append("<appid>")
+ .append(this.appid)
+ .append("</appid>")
+ .append("<body>")
+ .append(this.body)
+ .append("</body>")
+ .append("<mch_id>")
+ .append(this.mch_id)
+ .append("</mch_id>")
+ .append("<nonce_str>")
+ .append(this.nonce_str)
+ .append("</nonce_str>")
+ .append("<notify_url>")
+ .append(this.notify_url)
+ .append("</notify_url>")
+ .append("<out_trade_no>")
+ .append(this.out_trade_no)
+ .append("</out_trade_no>")
+ .append("<spbill_create_ip>")
+ .append(this.spbill_create_ip)
+ .append("</spbill_create_ip>")
+ .append("<total_fee>")
+ .append(this.total_fee)
+ .append("</total_fee>")
+ .append("<trade_type>")
+ .append(this.trade_type)
+ .append("</trade_type>")
+ ;
+ if ("JSAPI".equals(this.trade_type)) {
+ requestStr.append("<openid>")
+ .append(this.openid)
+ .append("</openid>");
+ }
+ if ("MWEB".equals(this.trade_type)) {
+ requestStr.append("<scene_info>")
+ .append(this.scene_info)
+ .append("</scene_info>");
+ }
+ requestStr.append("<sign>")
+ .append(this.sign)
+ .append("</sign>")
+ .append("</xml>");
+ return requestStr.toString();
+ }
+
+ public String generaReverseXML() {
+ StringBuffer requestStr = new StringBuffer();
+ requestStr
+ .append("<xml>")
+ .append("<appid>")
+ .append(this.appid)
+ .append("</appid>")
+ .append("<mch_id>")
+ .append(this.mch_id)
+ .append("</mch_id>")
+ .append("<nonce_str>")
+ .append(this.nonce_str)
+ .append("</nonce_str>")
+ .append("<notify_url>")
+ .append(this.notify_url)
+ .append("</notify_url>")
+ .append("<out_refund_no>")
+ .append(this.out_refund_no)
+ .append("</out_refund_no>")
+ .append("<out_trade_no>")
+ .append(this.out_trade_no)
+ .append("</out_trade_no>")
+ .append("<refund_desc>")
+ .append(this.refund_desc)
+ .append("</refund_desc>")
+ .append("<refund_fee>")
+ .append(this.refund_fee)
+ .append("</refund_fee>")
+ .append("<total_fee>")
+ .append(this.total_fee)
+ .append("</total_fee>")
+ ;
+ requestStr.append("<sign>")
+ .append(this.sign)
+ .append("</sign>")
+ .append("</xml>");
+ return requestStr.toString();
+ }
+
+
+ public String generaAPPSign() {
+ String signTemp = "appid=" + this.appid
+ + "&nonce_str=" + this.nonce_str
+ + "&package=" + this.wpackage
+ + "&partnerid=" + this.mch_id
+ + "&prepayid=" + this.prepay_id
+ + "×tamp=" + this.timestamp
+ + "&key=" + this.key;
+ this.sign = MD5.encodeByMD5(signTemp);
+ return sign;
+ }
+
+ public String generaJSAPISign() {
+ String signTemp = "appId=" + this.appid
+ + "&nonceStr=" + this.nonce_str
+ + "&package=prepay_id=" + this.prepay_id
+ + "&signType=MD5"
+ + "&timeStamp=" + this.timestamp
+ + "&key=" + this.key;
+ this.sign = MD5.encodeByMD5(signTemp);
+ return sign;
+ }
+
+ public String generaJSAPIParamters() {
+ String json = "{\"appId\":\"" + this.appid + "\","
+ + "\"nonceStr\":\"" + this.nonce_str + "\","
+ + "\"packages\":\"prepay_id=" + this.prepay_id + "\","
+ + "\"signType\":\"MD5\","
+ + "\"timeStamp\":\"" + this.timestamp + "\","
+ + "\"paySign\":\"" + this.sign + "\"}";
+ return json;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/controller/TestAction.java b/payapi/src/main/java/com/supwisdom/dlpay/api/controller/TestAction.java
new file mode 100644
index 0000000..9a2d51b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/controller/TestAction.java
@@ -0,0 +1,28 @@
+package com.supwisdom.dlpay.api.controller;
+
+import com.supwisdom.dlpay.api.bean.BaseResp;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller //将所有方法标识@ResponseBody注解
+@RequestMapping("/test")
+public class TestAction {
+ @Autowired
+ private SystemUtilService systemUtilService;
+
+ @RequestMapping("/demo")
+ @ResponseBody
+ public BaseResp test() {
+ SystemDateTime dt = systemUtilService.getSysdatetime();
+
+ BaseResp resp = new BaseResp();
+ resp.setRetcode("0");
+ resp.setRetmsg("OK");
+ resp.setData("hostdate=["+dt.getHostdate()+"],hosttime=["+dt.getHosttime()+"],hostdatetime=["+dt.getHostdatetime()+"],date=["+dt.getSysdate()+"]");
+ return resp;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
new file mode 100644
index 0000000..91c7bac
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TAccount;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.QueryHints;
+import org.springframework.data.repository.query.Param;
+
+import javax.persistence.LockModeType;
+import javax.persistence.QueryHint;
+
+public interface AccountDao extends JpaRepository<TAccount, String> {
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query("select a from TAccount a where a.accno = ?1")
+ TAccount getByAccnoForUpdate(String accno);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
+ @Query("select a from TAccount a where a.accno = ?1")
+ TAccount getByAccnoForUpdateNowait(String accno);
+
+ TAccount findByUserid(String userid);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query("select a from TAccount a where a.userid = ?1")
+ TAccount getByUseridForUpdate(String userid);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
+ @Query("select a from TAccount a where a.userid = ?1")
+ TAccount getByUseridForUpdateNowait(String userid);
+
+ @Query("select a from TAccount a where a.userid = ?1 and a.subjno=?2")
+ TAccount findByUseridAndSubjno(String userid, String subjno);
+
+ @Query("select a from TAccount a where a.person.name like CONCAT('%',:accname,'%') ")
+ Page<TAccount> findAllByAccnameContaining(@Param("accname") String accname, Pageable pageable);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/DebitCreditDtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/DebitCreditDtlDao.java
new file mode 100644
index 0000000..0b5e733
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/DebitCreditDtlDao.java
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TDebitCreditDtl;
+import com.supwisdom.dlpay.api.domain.TDebitCreditDtlPK;
+import com.supwisdom.dlpay.framework.data.VoucherTemp;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface DebitCreditDtlDao extends JpaRepository<TDebitCreditDtl, TDebitCreditDtlPK> {
+
+ @Query(value = "select a.drsubjno,case when a.drsubjno='220201' then '220201' else a.draccno end as draccno, a.crsubjno,case when a.crsubjno='220201' then '220201' else a.craccno end as craccno," +
+ "a.summary,count(distinct a.refno) as transcnt,sum(a.amount) as transamt " +
+ "from TB_USERDTL_DEBITCREDIT a left join TB_TRANSACTIONMAIN b on a.refno=b.refno " +
+ "where b.status='success' and b.accdate=:settledate " +
+ "group by a.drsubjno,case when a.drsubjno='220201' then '220201' else a.draccno end,a.crsubjno,case when a.crsubjno='220201' then '220201' else a.craccno end,a.summary ", nativeQuery = true)
+ List<VoucherTemp> getVoucherData(@Param("settledate") String settledate);
+
+ List<TDebitCreditDtl> findByRefno(String refno);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java
new file mode 100644
index 0000000..50cf1e1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java
@@ -0,0 +1,20 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.api.domain.TPaytypeConfigPK;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Repository
+public interface PaytypeConfigDao extends JpaRepository<TPaytypeConfig, TPaytypeConfigPK> {
+ List<TPaytypeConfig> getByPaytype(String paytype);
+
+ TPaytypeConfig getByPaytypeAndAndConfigid(String paytype, String configid);
+
+ List<TPaytypeConfig> getByPaytypeOrderByConfigid(String paytype);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
new file mode 100644
index 0000000..988afaa
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TPerson;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+
+/**
+ * Created by shuwei on 2019/4/12.
+ */
+@Repository
+public interface PersonDao extends JpaRepository<TPerson, String> {
+ @Query(value = "from TPerson where idtype=?1 and idno=?2 ")
+ TPerson findByIdentity(String idtype, String idno);
+
+ TPerson findByUserid(String userid);
+
+ Page<TPerson> findAllByNameContaining(String name, Pageable pageable);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
new file mode 100644
index 0000000..6ee3e99
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TPersonIdentity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PersonIdentityDao extends JpaRepository<TPersonIdentity, String> {
+ TPersonIdentity getByThirdUid(String thirdUid);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
new file mode 100644
index 0000000..f516373
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TPersondtl;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PersondtlDao extends JpaRepository<TPersondtl, String>,JpaSpecificationExecutor<TPersondtl> {
+ Page<TPersondtl> findByUseridAndStatus(String userid,String status, Pageable pageable);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PointsAccountDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PointsAccountDao.java
new file mode 100644
index 0000000..96940b9
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PointsAccountDao.java
@@ -0,0 +1,18 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PointsAccountDao extends JpaRepository<TPointsAccount, String> {
+ TPointsAccount findByUserid(String userid);
+
+ @Query("select a from TPointsAccount a where a.person.name like CONCAT('%',:name,'%') ")
+ Page<TPointsAccount> findAllByNameContaining(@Param("name") String name, Pageable pageable);
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PointsTransdtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PointsTransdtlDao.java
new file mode 100644
index 0000000..cf3c404
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PointsTransdtlDao.java
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TPointsTransdtl;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PointsTransdtlDao extends JpaRepository<TPointsTransdtl, String> {
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeConfigDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeConfigDao.java
new file mode 100644
index 0000000..a7164c8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeConfigDao.java
@@ -0,0 +1,17 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TShopPaytypeConfig;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ShopPaytypeConfigDao extends JpaRepository<TShopPaytypeConfig, String> {
+ @Query("select a from TShopPaytypeConfig a where a.paytype=?1 and a.shopaccno=?2 ")
+ List<TShopPaytypeConfig> getShopPaytypeConfigs(String paytype, String shopaccno);
+
+ @Query("select a from TShopPaytypeConfig a where a.shopaccno=?1 and a.paytype=?2 and a.configid=?3 ")
+ TShopPaytypeConfig getShopPaytypeConfigById(String shopaccno,String paytype, String configid);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeDao.java
new file mode 100644
index 0000000..03196e1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeDao.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TShopPaytype;
+import com.supwisdom.dlpay.api.domain.TShopPaytypePK;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ShopPaytypeDao extends JpaRepository<TShopPaytype, TShopPaytypePK>, JpaSpecificationExecutor<TShopPaytype> {
+ @Query("select a from TShopPaytype a where a.paytype=?1 and a.shopaccno=?2 ")
+ TShopPaytype getById(String paytype, String shopaccno);
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java
new file mode 100644
index 0000000..0e49580
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ShopdtlDao.java
@@ -0,0 +1,19 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TShopdtl;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+import java.util.List;
+
+@Repository
+public interface ShopdtlDao extends JpaRepository<TShopdtl, String>, JpaSpecificationExecutor<TShopdtl> {
+ @Lock(LockModeType.OPTIMISTIC)
+ TShopdtl findTShopdtlByRefno(String refno);
+
+ @Lock(LockModeType.OPTIMISTIC)
+ List<TShopdtl> findAllByStatusAndUpdateBala(String status, Boolean flag);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeDao.java
new file mode 100644
index 0000000..b823f3d
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeDao.java
@@ -0,0 +1,23 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Repository
+public interface SourceTypeDao extends JpaRepository<TSourceType, String> {
+ TSourceType getBySourceType(String paytype);
+
+ Page<TSourceType> findBySourceTypeContaining(String paytype, Pageable pageable);
+
+ @Query("select t from TSourceType t")
+ List<TSourceType> getConsumeSourceTypes();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SubjectdtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SubjectdtlDao.java
new file mode 100644
index 0000000..968a031
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SubjectdtlDao.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TSubjectdtl;
+import org.springframework.data.repository.CrudRepository;
+
+public interface SubjectdtlDao extends CrudRepository<TSubjectdtl, String> {
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionMainDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionMainDao.java
new file mode 100644
index 0000000..476a1fa
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionMainDao.java
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TTransactionMain;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.QueryHints;
+import org.springframework.data.repository.CrudRepository;
+
+import javax.persistence.LockModeType;
+import javax.persistence.QueryHint;
+
+public interface TransactionMainDao extends CrudRepository<TTransactionMain, String> {
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
+ @Query(value = "select t from TTransactionMain t where t.refno = ?1")
+ TTransactionMain findByRefnoForUpdate(String refno);
+
+
+ TTransactionMain findByRefno(String refno);
+
+ @Query("select t from TTransactionMain t where t.outTradeNo=?1 and t.outId=?2")
+ TTransactionMain findByBillno(String billno, String outid);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java
new file mode 100644
index 0000000..c019cee
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java
@@ -0,0 +1,316 @@
+package com.supwisdom.dlpay.api.domain;
+
+import com.supwisdom.dlpay.framework.util.MD5;
+import com.supwisdom.dlpay.framework.util.MoneyUtil;
+import com.supwisdom.dlpay.framework.util.TradeDict;
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "TB_ACCOUNT",
+ indexes = {@Index(name = "acc_userid_idx", columnList = "userid"),
+ @Index(name = "acc_status_idx", columnList = "TRANS_STATUS"),
+ @Index(name = "acc_subjno_uk", unique = true, columnList = "subjno,userid")})
+public class TAccount implements Serializable {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "ACCNO", nullable = false, length = 32)
+ private String accno; //账号
+
+ @Column(name = "ACCNAME", length = 100)
+ private String accname; //账户名
+
+ @Column(name = "SUBJNO", length = 10)
+ private String subjno; //科目号
+
+ @Column(name = "USERID", length = 32)
+ @NotNull
+ private String userid; //用户ID
+
+ @Column(name = "TRANS_STATUS", length = 20)
+ @NotNull
+ private String transStatus = TradeDict.STATUS_NORMAL; //状态:normal-正常;closed-注销;locked-冻结
+
+ @Column(name = "BALANCE", precision = 15, scale = 2)
+ @NotNull
+ private Double balance; //总余额
+
+ @Column(name = "AVAILBAL", precision = 15, scale = 2)
+ @NotNull
+ private Double availbal; //可用余额
+
+ @Column(name = "FROZEBAL", precision = 15, scale = 2)
+ @NotNull
+ private Double frozebal; //冻结金额
+
+ @Column(name = "LOWFREE_FLAG", precision = 1, scale = 0)
+ @NotNull
+ private Boolean lowfreeFlag; //低额免密开关
+
+ @Column(name = "LOWFREE_LIMIT", precision = 9, scale = 2)
+ private Double lowfreeLimit; //免密额度
+
+ @Column(name = "DAY_LIMIT", precision = 9, scale = 2)
+ private Double daylimit; // 日累计消费额度
+
+ @Column(name = "MAX_BAL", precision = 15, scale = 2)
+ private Double maxbal; // 最大余额限制
+
+ @Version
+ @Column(name = "LAST_TRANSTIME")
+ private Timestamp lasttranstime; //最后交易日期
+
+ @Column(name = "LASTDAY_TRANSAMT", precision = 9, scale = 2)
+ private Double lastdayTransamt; //最后一天消费金额
+
+ @Column(name = "LASTDAY_DPSAMT", precision = 9, scale = 2)
+ private Double lastdayDpsamt; //最后一天充值金额
+
+ @Column(name = "TAC", length = 32)
+ private String tac; //校验
+
+ @Column(name = "OPENDATE", length = 8)
+ @NotNull
+ private String opendate;
+
+ @Column(name = "CLOSEDATE", length = 8)
+ private String closedate;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ @OneToOne
+ @JoinColumn(name = "USERID", insertable = false, updatable = false)
+ private TPerson person;
+
+ public TAccount() {
+ }
+
+ public TAccount(String accname, String subjno, String userid, String transStatus, Double balance, Double availbal, Double frozebal, Boolean lowfreeFlag, Double lowfreeLimit, Double daylimit, Double maxbal, Timestamp lasttranstime, Double lastdayTransamt, Double lastdayDpsamt, String tac, String opendate, String closedate) {
+ this.accname = accname;
+ this.subjno = subjno;
+ this.userid = userid;
+ this.transStatus = transStatus;
+ this.balance = balance;
+ this.availbal = availbal;
+ this.frozebal = frozebal;
+ this.lowfreeFlag = lowfreeFlag;
+ this.lowfreeLimit = lowfreeLimit;
+ this.daylimit = daylimit;
+ this.maxbal = maxbal;
+ this.lasttranstime = lasttranstime;
+ this.lastdayTransamt = lastdayTransamt;
+ this.lastdayDpsamt = lastdayDpsamt;
+ this.tac = tac;
+ this.opendate = opendate;
+ this.closedate = closedate;
+ }
+
+ public String getAccno() {
+ return accno;
+ }
+
+ public void setAccno(String accno) {
+ this.accno = accno;
+ }
+
+ public String getAccname() {
+ return accname;
+ }
+
+ public void setAccname(String accname) {
+ this.accname = accname;
+ }
+
+ public String getSubjno() {
+ return subjno;
+ }
+
+ public void setSubjno(String subjno) {
+ this.subjno = subjno;
+ }
+
+ public String getUserid() {
+ return userid;
+ }
+
+ public void setUserid(String userid) {
+ this.userid = userid;
+ }
+
+ public String getTransStatus() {
+ return transStatus;
+ }
+
+ public void setTransStatus(String transStatus) {
+ this.transStatus = transStatus;
+ }
+
+ public Double getBalance() {
+ return balance;
+ }
+
+ public void setBalance(Double balance) {
+ this.balance = balance;
+ }
+
+ public Double getAvailbal() {
+ return availbal;
+ }
+
+ public void setAvailbal(Double availbal) {
+ this.availbal = availbal;
+ }
+
+ public Double getFrozebal() {
+ return frozebal;
+ }
+
+ public void setFrozebal(Double frozebal) {
+ this.frozebal = frozebal;
+ }
+
+ public Boolean getLowfreeFlag() {
+ return lowfreeFlag;
+ }
+
+ public void setLowfreeFlag(Boolean lowfreeFlag) {
+ this.lowfreeFlag = lowfreeFlag;
+ }
+
+ public Double getLowfreeLimit() {
+ return lowfreeLimit;
+ }
+
+ public void setLowfreeLimit(Double lowfreeLimit) {
+ this.lowfreeLimit = lowfreeLimit;
+ }
+
+ public Double getDaylimit() {
+ return daylimit;
+ }
+
+ public void setDaylimit(Double daylimit) {
+ this.daylimit = daylimit;
+ }
+
+ public Double getMaxbal() {
+ return maxbal;
+ }
+
+ public void setMaxbal(Double maxbal) {
+ this.maxbal = maxbal;
+ }
+
+ public Timestamp getLasttranstime() {
+ return lasttranstime;
+ }
+
+ public void setLasttranstime(Timestamp lasttranstime) {
+ this.lasttranstime = lasttranstime;
+ }
+
+ public Double getLastdayTransamt() {
+ return lastdayTransamt;
+ }
+
+ public void setLastdayTransamt(Double lastdayTransamt) {
+ this.lastdayTransamt = lastdayTransamt;
+ }
+
+ public Double getLastdayDpsamt() {
+ return lastdayDpsamt;
+ }
+
+ public void setLastdayDpsamt(Double lastdayDpsamt) {
+ this.lastdayDpsamt = lastdayDpsamt;
+ }
+
+ public String getTac() {
+ return tac;
+ }
+
+ public void setTac(String tac) {
+ this.tac = tac;
+ }
+
+ public String getOpendate() {
+ return opendate;
+ }
+
+ public void setOpendate(String opendate) {
+ this.opendate = opendate;
+ }
+
+ public String getClosedate() {
+ return closedate;
+ }
+
+ public void setClosedate(String closedate) {
+ this.closedate = closedate;
+ }
+
+ public String generateTac() {
+ String data = this.accno + MoneyUtil.YuanToFen(this.availbal) + MoneyUtil.YuanToFen(this.balance) + MoneyUtil.YuanToFen(this.frozebal);
+ return MD5.generatePassword(data, this.accno);
+ }
+
+ public boolean tacCheck() {
+ String tac_c = generateTac();
+ if (tac_c.equalsIgnoreCase(this.tac) || this.tac == null) {
+ return true;
+ }
+ return false;
+ }
+
+ public void addAmount(double amount) {
+ this.balance = this.balance + amount;
+ this.availbal = this.availbal + amount;
+ this.tac = this.generateTac();
+ }
+
+ public boolean checkOverflow() {
+ if (null != this.maxbal && this.maxbal > 0) {
+ if (MoneyUtil.moneyCompare(this.balance, this.maxbal) > 0) {
+ return true; //超出账户最大值
+ }
+ }
+ return false;
+ }
+
+ public boolean checkOverdraft() {
+ if (MoneyUtil.moneyCompare(this.balance, 0) < 0) {
+ return true; //欠费透支
+ }
+ return false;
+ }
+
+ public boolean checkOverdraft(double limit) {
+ if (MoneyUtil.moneyCompare(this.balance, limit) < 0) {
+ return true; //余额低于某阀值
+ }
+ return false;
+ }
+
+ public TPerson getPerson() {
+ return person;
+ }
+
+ public void setPerson(TPerson person) {
+ this.person = person;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBal.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBal.java
new file mode 100644
index 0000000..c34fa33
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBal.java
@@ -0,0 +1,105 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "tb_accountdaybal")
+@IdClass(TAccountDayBalPk.class)
+public class TAccountDayBal implements Serializable {
+ @Id
+ @Column(name = "accno", length = 32, nullable = false)
+ private String accno; //账号
+
+ @Id
+ @Column(name = "accdate", length = 8, nullable = false)
+ private String accdate; //记账日期
+
+ @Column(name = "amount", precision = 15, scale = 2)
+ private Double amount;
+
+ @Version
+ @Column(name = "update_time")
+ @NotNull
+ private Timestamp updateTime;
+
+ @Column(name = "lastRefno", length = 32)
+ @NotNull
+ private String lastRefno;
+
+ @Column(name = "remark", length = 250)
+ private String remark;
+
+ @Column(name = "checked")
+ private Boolean checked;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ public String getAccno() {
+ return accno;
+ }
+
+ public void setAccno(String accno) {
+ this.accno = accno;
+ }
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ public Double getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Double amount) {
+ this.amount = amount;
+ }
+
+ public Timestamp getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Timestamp updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public String getLastRefno() {
+ return lastRefno;
+ }
+
+ public void setLastRefno(String lastRefno) {
+ this.lastRefno = lastRefno;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public Boolean getChecked() {
+ return checked;
+ }
+
+ public void setChecked(Boolean checked) {
+ this.checked = checked;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBalPk.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBalPk.java
new file mode 100644
index 0000000..d811471
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccountDayBalPk.java
@@ -0,0 +1,46 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+import java.util.Objects;
+
+public class TAccountDayBalPk implements Serializable {
+ @Id
+ @Column(name = "accno", length = 32, nullable = false)
+ private String accno; //账号
+
+ @Id
+ @Column(name = "accdate", length = 8, nullable = false)
+ private String accdate; //记账日期
+
+ public String getAccno() {
+ return accno;
+ }
+
+ public void setAccno(String accno) {
+ this.accno = accno;
+ }
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TAccountDayBalPk that = (TAccountDayBalPk) o;
+ return Objects.equals(accno, that.accno) &&
+ Objects.equals(accdate, that.accdate);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(accno, accdate);
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtl.java
new file mode 100644
index 0000000..b9cfdc8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtl.java
@@ -0,0 +1,131 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.Digits;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_USERDTL_DEBITCREDIT")
+@IdClass(TDebitCreditDtlPK.class)
+public class TDebitCreditDtl {
+
+ @Id
+ @Column(name = "REFNO", nullable = false, length = 32)
+ private String refno;
+
+ @Id
+ @Column(name = "SEQNO", nullable = false, precision = 2)
+ private Integer seqno;
+
+ @Column(name = "settledate", length = 8)
+ @Digits(integer = 8, fraction = 0)
+ private String settleDate;
+
+ @Column(name = "DRSUBJNO", length = 10)
+ @NotNull
+ private String drsubjno; //借方科目
+
+ @Column(name = "DRACCNO", length = 32)
+ @NotNull
+ private String draccno; //借方账号
+
+ @Column(name = "AMOUNT", precision = 9, scale = 2)
+ @NotNull
+ private Double amount; //金额
+
+ @Column(name = "CRSUBJNO", length = 10)
+ @NotNull
+ private String crsubjno; //贷方科目
+
+ @Column(name = "CRACCNO", length = 32)
+ @NotNull
+ private String craccno; //贷方账号
+
+ @Column(name = "SUMMARY", length = 240)
+ private String summary; //摘要
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public Integer getSeqno() {
+ return seqno;
+ }
+
+ public void setSeqno(Integer seqno) {
+ this.seqno = seqno;
+ }
+
+ public String getDrsubjno() {
+ return drsubjno;
+ }
+
+ public void setDrsubjno(String drsubjno) {
+ this.drsubjno = drsubjno;
+ }
+
+ public String getDraccno() {
+ return draccno;
+ }
+
+ public void setDraccno(String draccno) {
+ this.draccno = draccno;
+ }
+
+ public Double getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Double amount) {
+ this.amount = amount;
+ }
+
+ public String getCrsubjno() {
+ return crsubjno;
+ }
+
+ public void setCrsubjno(String crsubjno) {
+ this.crsubjno = crsubjno;
+ }
+
+ public String getCraccno() {
+ return craccno;
+ }
+
+ public void setCraccno(String craccno) {
+ this.craccno = craccno;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public String getSettleDate() {
+ return settleDate;
+ }
+
+ public void setSettleDate(String settleDate) {
+ this.settleDate = settleDate;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtlPK.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtlPK.java
new file mode 100644
index 0000000..5a0a48b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TDebitCreditDtlPK.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+public class TDebitCreditDtlPK implements Serializable {
+ @Id
+ @Column(name = "REFNO", nullable = false, length = 32)
+ private String refno;
+
+ @Id
+ @Column(name = "SEQNO", nullable = false, precision = 2)
+ private Integer seqno;
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public Integer getSeqno() {
+ return seqno;
+ }
+
+ public void setSeqno(Integer seqno) {
+ this.seqno = seqno;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TDebitCreditDtlPK tDebitCreditDtlPK = (TDebitCreditDtlPK) o;
+ if (refno != null ? !refno.equals(tDebitCreditDtlPK.getRefno()) : refno != null)
+ return false;
+ if (seqno != null ? !seqno.equals(tDebitCreditDtlPK.getSeqno()) : seqno != null)
+ return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = refno != null ? refno.hashCode() : 0;
+ result = 31 * result + (seqno != null ? seqno.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java
new file mode 100644
index 0000000..b310480
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java
@@ -0,0 +1,70 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Entity
+@Table(name = "TB_PAYTYPE_CONFIG")
+@IdClass(TPaytypeConfigPK.class)
+public class TPaytypeConfig implements Serializable {
+ @Id
+ @Column(name = "PAYTYPE", nullable = false, length = 20)
+ private String paytype;
+ @Id
+ @Column(name = "CONFIGID", nullable = false, length = 40)
+ private String configid;
+
+ @Column(name = "CONFIG_VALUE", length = 2000)
+ private String configValue;
+
+ @Column(name = "CONFIG_NAME", length = 200)
+ private String configName;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ public String getPaytype() {
+ return paytype;
+ }
+
+ public void setPaytype(String paytype) {
+ this.paytype = paytype;
+ }
+
+ public String getConfigid() {
+ return configid;
+ }
+
+ public void setConfigid(String configid) {
+ this.configid = configid;
+ }
+
+ public String getConfigValue() {
+ return configValue;
+ }
+
+ public void setConfigValue(String configValue) {
+ this.configValue = configValue;
+ }
+
+ public String getConfigName() {
+ return configName;
+ }
+
+ public void setConfigName(String configName) {
+ this.configName = configName;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfigPK.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfigPK.java
new file mode 100644
index 0000000..8f7e46f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfigPK.java
@@ -0,0 +1,53 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Embeddable
+public class TPaytypeConfigPK implements Serializable {
+ @Id
+ @Column(name = "PAYTYPE", nullable = false, length = 20)
+ private String paytype;
+ @Id
+ @Column(name = "CONFIGID", nullable = false, length = 40)
+ private String configid;
+
+ public String getPaytype() {
+ return paytype;
+ }
+
+ public void setPaytype(String paytype) {
+ this.paytype = paytype;
+ }
+
+ public String getConfigid() {
+ return configid;
+ }
+
+ public void setConfigid(String configid) {
+ this.configid = configid;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ TPaytypeConfigPK that = (TPaytypeConfigPK) o;
+
+ if (!paytype.equals(that.paytype)) return false;
+ return configid.equals(that.configid);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = paytype.hashCode();
+ result = 31 * result + configid.hashCode();
+ return result;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
new file mode 100644
index 0000000..75fa85a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
@@ -0,0 +1,202 @@
+package com.supwisdom.dlpay.api.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_PERSON",
+ indexes = {@Index(name = "person_name_idx", columnList = "name"),
+ @Index(name = "person_idno_uk", unique = true, columnList = "idtype,idno")})
+public class TPerson {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "USERID", nullable = false, length = 32)
+ private String userid;
+
+ @Column(name = "NAME", length = 200)
+ private String name;
+
+ @Column(name = "SEX", length = 10)
+ private String sex;
+
+ @Column(name = "STATUS", length = 10)
+ @NotNull
+ private String status;
+
+ @Column(name = "IDTYPE", length = 20)
+ private String idtype;
+
+ @Column(name = "IDNO", length = 30)
+ private String idno;
+
+ @Column(name = "COUNTRY", length = 3)
+ private String country;
+
+ @Column(name = "NATION", length = 3)
+ private String nation;
+
+ @Column(name = "EMAIL", length = 60)
+ private String email;
+
+ @Column(name = "TEL", length = 20)
+ private String tel;
+
+ @Column(name = "MOBILE", length = 30)
+ private String mobile;
+
+ @Column(name = "ADDR", length = 240)
+ private String addr;
+
+ @Column(name = "ZIPCODE", length = 10)
+ private String zipcode;
+
+ @Column(name = "LASTSAVED", length = 14)
+ private String lastsaved;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ public TPerson() {
+ }
+
+ public TPerson(String name, String sex, String status, String idtype, String idno, String country, String nation, String email, String tel, String mobile, String addr, String zipcode, String lastsaved) {
+ this.name = name;
+ this.sex = sex;
+ this.status = status;
+ this.idtype = idtype;
+ this.idno = idno;
+ this.country = country;
+ this.nation = nation;
+ this.email = email;
+ this.tel = tel;
+ this.mobile = mobile;
+ this.addr = addr;
+ this.zipcode = zipcode;
+ this.lastsaved = lastsaved;
+ }
+
+
+ public String getUserid() {
+ return userid;
+ }
+
+ public void setUserid(String userid) {
+ this.userid = userid;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSex() {
+ return sex;
+ }
+
+ public void setSex(String sex) {
+ this.sex = sex;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getIdtype() {
+ return idtype;
+ }
+
+ public void setIdtype(String idtype) {
+ this.idtype = idtype;
+ }
+
+ public String getIdno() {
+ return idno;
+ }
+
+ public void setIdno(String idno) {
+ this.idno = idno;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public String getNation() {
+ return nation;
+ }
+
+ public void setNation(String nation) {
+ this.nation = nation;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getTel() {
+ return tel;
+ }
+
+ public void setTel(String tel) {
+ this.tel = tel;
+ }
+
+ public String getMobile() {
+ return mobile;
+ }
+
+ public void setMobile(String mobile) {
+ this.mobile = mobile;
+ }
+
+ public String getAddr() {
+ return addr;
+ }
+
+ public void setAddr(String addr) {
+ this.addr = addr;
+ }
+
+ public String getZipcode() {
+ return zipcode;
+ }
+
+ public void setZipcode(String zipcode) {
+ this.zipcode = zipcode;
+ }
+
+ public String getLastsaved() {
+ return lastsaved;
+ }
+
+ public void setLastsaved(String lastsaved) {
+ this.lastsaved = lastsaved;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
new file mode 100644
index 0000000..805a984
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
@@ -0,0 +1,115 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_PERSON_IDENTITY")
+public class TPersonIdentity {
+ @Id
+ @Column(name = "THIRD_UID", nullable = false, length = 60)
+ private String thirdUid;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "USERID")
+ private TPerson person; //绑定的系统用户
+
+ @Column(name = "STATUS", length = 20)
+ @NotNull
+ private String status;
+
+ @Column(name = "LOSSFLAG", precision = 1)
+ @NotNull
+ private Integer lossflag = 0;
+
+ @Column(name = "LOCKFLAG", precision = 1)
+ @NotNull
+ private Integer lockflag = 0;
+
+ @Column(name = "CREATETIME", length = 14)
+ private String createtime;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ @Column(name = "ISSIGNED", length = 20)
+ private String issigned;
+
+ public TPersonIdentity() {
+ }
+
+ public TPersonIdentity(String thirdUid, TPerson person, String status, Integer lossflag, Integer lockflag, String createtime,String issigned) {
+ this.thirdUid = thirdUid;
+ this.person = person;
+ this.status = status;
+ this.lossflag = lossflag;
+ this.lockflag = lockflag;
+ this.createtime = createtime;
+ this.issigned = issigned;
+ }
+
+ public String getIssigned() {
+ return issigned;
+ }
+
+ public void setIssigned(String issigned) {
+ this.issigned = issigned;
+ }
+
+ public String getThirdUid() {
+ return thirdUid;
+ }
+
+ public void setThirdUid(String thirdUid) {
+ this.thirdUid = thirdUid;
+ }
+
+ public TPerson getPerson() {
+ return person;
+ }
+
+ public void setPerson(TPerson person) {
+ this.person = person;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public Integer getLossflag() {
+ return lossflag;
+ }
+
+ public void setLossflag(Integer lossflag) {
+ this.lossflag = lossflag;
+ }
+
+ public Integer getLockflag() {
+ return lockflag;
+ }
+
+ public void setLockflag(Integer lockflag) {
+ this.lockflag = lockflag;
+ }
+
+ public String getCreatetime() {
+ return createtime;
+ }
+
+ public void setCreatetime(String createtime) {
+ this.createtime = createtime;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java
new file mode 100644
index 0000000..303ea2e
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersondtl.java
@@ -0,0 +1,290 @@
+package com.supwisdom.dlpay.api.domain;
+
+import com.supwisdom.dlpay.framework.util.TradeDict;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_PERSONDTL",
+ indexes = {@Index(name = "prsndtl_transdate_idx", columnList = "transdate"),
+ @Index(name = "prsndtl_accdate_idx", columnList = "accdate"),
+ @Index(name = "prsndtl_status_idx", columnList = "status"),
+ @Index(name = "prsndtl_reverse_idx", columnList = "REVERSE_FLAG")})
+public class TPersondtl {
+
+ @Id
+ @Column(name = "REFNO", nullable = false, length = 32)
+ private String refno; //流水号
+
+ @Column(name = "ACCDATE", length = 8)
+ @NotNull
+ private String accdate; //记账日期
+
+ @Column(name = "USERID", length = 32)
+ @NotNull
+ private String userid; //用户ID,或账号
+
+ @Column(name = "ACCNO", length = 32)
+ private String accountNo;
+
+ @Column(name = "USERNAME", length = 200)
+ private String userName;
+
+ @Column(name = "TRANSDATE", length = 8)
+ @NotNull
+ private String transdate;
+
+ @Column(name = "TRANSTIME", length = 6)
+ @NotNull
+ private String transtime;
+
+ @Column(name = "STATUS", length = 20)
+ @NotNull
+ private String status = TradeDict.DTL_STATUS_NONE;
+
+ @Column(name = "BEFBAL", precision = 9, scale = 2)
+ private Double befbal;
+
+ @Column(name = "amount", precision = 9, scale = 2)
+ @NotNull
+ private Double amount; //实际付款金额
+
+ @Column(name = "SOURCETYPE", length = 20)
+ private String sourceType; //支付方式 balance,wechat,alipay
+
+ @Column(name = "PAYINFO", length = 200)
+ private String payinfo; //记录支付信息备用字段
+
+ @Column(name = "TRANSCODE", precision = 4)
+ @NotNull
+ private Integer transcode;
+
+ @Column(name = "TRANSDESC", length = 240)
+ private String transdesc; //交易描述
+
+ @Column(name = "OUTTRADENO", length = 60)
+ private String outtradeno; //第三方流水号
+
+ @Column(name = "OPPOSITEACCNO", length = 20)
+ private String oppositeAccNo;
+
+ @Column(name = "OPPOSITEACCNAME", length = 200)
+ private String oppositeAccName;
+
+ @Column(name = "OPERID", precision = 9)
+ private Integer operid; //操作员ID
+
+ @Column(name = "REVERSE_FLAG", length = 10)
+ @NotNull
+ private String reverseFlag = "none"; //none, cancel, reversed
+
+ @Column(name = "REVERSE_AMOUNT", precision = 9, scale = 2)
+ private Double reverseAmount = 0D; //撤销金额填写
+
+ @Column(name = "TRADEFLAG", length = 10)
+ @NotNull
+ private String tradeflag; // out - 支出,in - 收入
+
+ @Column(name = "REMARK", length = 240)
+ private String remark;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ @Column(name = "DTLTYPE", length = 20)
+ private String dtltype;
+
+ public String getDtltype() {
+ return dtltype;
+ }
+
+ public void setDtltype(String dtltype) {
+ this.dtltype = dtltype;
+ }
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ public String getUserid() {
+ return userid;
+ }
+
+ public void setUserid(String userid) {
+ this.userid = userid;
+ }
+
+ public String getTransdate() {
+ return transdate;
+ }
+
+ public void setTransdate(String transdate) {
+ this.transdate = transdate;
+ }
+
+ public String getTranstime() {
+ return transtime;
+ }
+
+ public void setTranstime(String transtime) {
+ this.transtime = transtime;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public Double getBefbal() {
+ return befbal;
+ }
+
+ public void setBefbal(Double befbal) {
+ this.befbal = befbal;
+ }
+
+ public Double getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Double amount) {
+ this.amount = amount;
+ }
+
+ public String getSourceType() {
+ return sourceType;
+ }
+
+ public void setSourceType(String sourceType) {
+ this.sourceType = sourceType;
+ }
+
+ public String getPayinfo() {
+ return payinfo;
+ }
+
+ public void setPayinfo(String payinfo) {
+ this.payinfo = payinfo;
+ }
+
+ public Integer getTranscode() {
+ return transcode;
+ }
+
+ public void setTranscode(Integer transcode) {
+ this.transcode = transcode;
+ }
+
+ public String getTransdesc() {
+ return transdesc;
+ }
+
+ public void setTransdesc(String transdesc) {
+ this.transdesc = transdesc;
+ }
+
+ public String getOuttradeno() {
+ return outtradeno;
+ }
+
+ public void setOuttradeno(String outtradeno) {
+ this.outtradeno = outtradeno;
+ }
+
+ public String getOppositeAccNo() {
+ return oppositeAccNo;
+ }
+
+ public void setOppositeAccNo(String oppositeAccNo) {
+ this.oppositeAccNo = oppositeAccNo;
+ }
+
+ public Integer getOperid() {
+ return operid;
+ }
+
+ public void setOperid(Integer operid) {
+ this.operid = operid;
+ }
+
+ public String getReverseFlag() {
+ return reverseFlag;
+ }
+
+ public void setReverseFlag(String reverseFlag) {
+ this.reverseFlag = reverseFlag;
+ }
+
+ public Double getReverseAmount() {
+ return reverseAmount;
+ }
+
+ public void setReverseAmount(Double reverseAmount) {
+ this.reverseAmount = reverseAmount;
+ }
+
+ public String getTradeflag() {
+ return tradeflag;
+ }
+
+ public void setTradeflag(String tradeflag) {
+ this.tradeflag = tradeflag;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getOppositeAccName() {
+ return oppositeAccName;
+ }
+
+ public void setOppositeAccName(String oppositeAccName) {
+ this.oppositeAccName = oppositeAccName;
+ }
+
+ public String getAccountNo() {
+ return accountNo;
+ }
+
+ public void setAccountNo(String accountNo) {
+ this.accountNo = accountNo;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPointsAccount.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPointsAccount.java
new file mode 100644
index 0000000..b023c38
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPointsAccount.java
@@ -0,0 +1,155 @@
+package com.supwisdom.dlpay.api.domain;
+
+import com.supwisdom.dlpay.framework.util.MD5;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 积分账户表
+ */
+@Entity
+@Table(name = "TB_POINTS_ACCOUNT")
+public class TPointsAccount {
+ @Id
+ @Column(name = "USERID", length = 32)
+ private String userid;
+
+ @Column(name = "POINTS", precision = 15)
+ @NotNull
+ private Long points; //积分
+
+ @Column(name = "ACCUMPOINTS", precision = 15)
+ private Long accumPoints; //历史累计获取的积分
+
+ @Column(name = "SUMPAYPOINTS", precision = 15)
+ private Long sumpayPoints; //历史累计消费的积分
+
+ @Column(name = "TAC", precision = 15)
+ private String tac;
+
+ @Column(name = "LASTSAVED", precision = 15)
+ private String lastsaved;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ @OneToOne
+ @JoinColumn(name = "USERID", insertable = false, updatable = false)
+ private TPerson person;
+
+ public TPerson getPerson() {
+ return person;
+ }
+
+ public void setPerson(TPerson person) {
+ this.person = person;
+ }
+
+ public TPointsAccount() {
+ }
+
+ public TPointsAccount(String userid, Long points, Long accumPoints, Long sumpayPoints, String tac, String lastsaved) {
+ this.userid = userid;
+ this.points = points;
+ this.accumPoints = accumPoints;
+ this.sumpayPoints = sumpayPoints;
+ this.tac = tac;
+ this.lastsaved = lastsaved;
+ }
+
+ public String getUserid() {
+ return userid;
+ }
+
+ public void setUserid(String userid) {
+ this.userid = userid;
+ }
+
+ public Long getPoints() {
+ return points;
+ }
+
+ public void setPoints(Long points) {
+ this.points = points;
+ }
+
+ public Long getAccumPoints() {
+ return accumPoints;
+ }
+
+ public void setAccumPoints(Long accumPoints) {
+ this.accumPoints = accumPoints;
+ }
+
+ public Long getSumpayPoints() {
+ return sumpayPoints;
+ }
+
+ public void setSumpayPoints(Long sumpayPoints) {
+ this.sumpayPoints = sumpayPoints;
+ }
+
+ public String getTac() {
+ return tac;
+ }
+
+ public void setTac(String tac) {
+ this.tac = tac;
+ }
+
+ public String getLastsaved() {
+ return lastsaved;
+ }
+
+ public void setLastsaved(String lastsaved) {
+ this.lastsaved = lastsaved;
+ }
+
+ public String generateTac() {
+ String data = this.userid + this.points;
+ return MD5.generatePassword(data, this.userid);
+ }
+
+ public boolean tacCheck() {
+ String tac_c = generateTac();
+ if (tac_c.equalsIgnoreCase(this.tac) || this.tac == null) {
+ return true;
+ }
+ return false;
+ }
+
+ public void addPoints(int points) {
+ this.points = this.points + points;
+ if (points > 0) {
+ this.accumPoints = ((this.accumPoints == null ? 0 : this.accumPoints) + Math.abs(points)); //获得积分累加
+ } else {
+ this.sumpayPoints = ((this.sumpayPoints == null ? 0 : this.sumpayPoints) + Math.abs(points)); //消费积分累加
+ }
+ this.tac = this.generateTac();
+ }
+
+ public void addPoints(int points, boolean revflag) {
+ if (revflag) {
+ //冲正返回积分
+ this.points = this.points + points;
+ if (points > 0) {
+ this.sumpayPoints = ((this.sumpayPoints == null ? 0 : this.sumpayPoints) - Math.abs(points)); //消费积分累计冲正
+ } else {
+ this.accumPoints = ((this.accumPoints == null ? 0 : this.accumPoints) - Math.abs(points)); //获得积分累计冲正
+ }
+ this.tac = this.generateTac();
+ } else {
+ this.addPoints(points);
+ }
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPointsTransdtl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPointsTransdtl.java
new file mode 100644
index 0000000..778b9b2
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPointsTransdtl.java
@@ -0,0 +1,156 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 积分流水表
+ */
+@Entity
+@Table(name = "TB_POINTS_TRANSDTL",
+ indexes = {@Index(name = "points_transdtl_idx", columnList = "billno")})
+public class TPointsTransdtl {
+ @Id
+ @Column(name = "REFNO", nullable = false, length = 32)
+ private String refno;
+
+ @Column(name = "USERID", length = 32)
+ @NotNull
+ private String userid;
+
+ @Column(name = "ACCDATE", length = 8)
+ @NotNull
+ private String accdate;
+
+ @Column(name = "POINTS", length = 15)
+ @NotNull
+ private Long points;
+
+ @Column(name = "BEFPOINTS", length = 15)
+ private Long befpoints;
+
+ @Column(name = "AFTPOINTS", length = 15)
+ private Long aftpoints;
+
+ @Column(name = "STATUS", length = 15)
+ private String status;
+
+ @Column(name = "BILLNO", length = 32)
+ private String billno; //关联的消费流水号
+
+ @Column(name = "TRANSDATE", length = 8)
+ @NotNull
+ private String transdate;
+
+ @Column(name = "TRANSTIME", length = 9)
+ @NotNull
+ private String transtime;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ public TPointsTransdtl() {
+ }
+
+ public TPointsTransdtl(String refno, String userid, String accdate, Long points, Long befpoints, Long aftpoints, String status, String billno, String transdate, String transtime) {
+ this.refno = refno;
+ this.userid = userid;
+ this.accdate = accdate;
+ this.points = points;
+ this.befpoints = befpoints;
+ this.aftpoints = aftpoints;
+ this.status = status;
+ this.billno = billno;
+ this.transdate = transdate;
+ this.transtime = transtime;
+ }
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public String getUserid() {
+ return userid;
+ }
+
+ public void setUserid(String userid) {
+ this.userid = userid;
+ }
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ public Long getPoints() {
+ return points;
+ }
+
+ public void setPoints(Long points) {
+ this.points = points;
+ }
+
+ public Long getBefpoints() {
+ return befpoints;
+ }
+
+ public void setBefpoints(Long befpoints) {
+ this.befpoints = befpoints;
+ }
+
+ public Long getAftpoints() {
+ return aftpoints;
+ }
+
+ public void setAftpoints(Long aftpoints) {
+ this.aftpoints = aftpoints;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getBillno() {
+ return billno;
+ }
+
+ public void setBillno(String billno) {
+ this.billno = billno;
+ }
+
+ public String getTransdate() {
+ return transdate;
+ }
+
+ public void setTransdate(String transdate) {
+ this.transdate = transdate;
+ }
+
+ public String getTranstime() {
+ return transtime;
+ }
+
+ public void setTranstime(String transtime) {
+ this.transtime = transtime;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytype.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytype.java
new file mode 100644
index 0000000..0310592
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytype.java
@@ -0,0 +1,92 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SHOP_PAYTYPE")
+@IdClass(TShopPaytypePK.class)
+public class TShopPaytype {
+ @Id
+ @Column(name = "SHOPACCNO", nullable = false, length = 10)
+ private String shopaccno;
+
+ @Id
+ @Column(name = "PAYTYPE", nullable = false, length = 20)
+ private String paytype;
+
+ @Column(name = "CONSUME_ENABLE", length = 10)
+ @NotNull
+ private boolean consumeEnable; //该商户下,此支付方式能否消费
+
+ @Column(name = "ANONYMOUS_ENABLE", length = 10)
+ @NotNull
+ private boolean anonymousEnable; //该商户下,此支付方式能否匿名消费
+
+ @Column(name = "REVERSE_ENABLE", length = 10)
+ @NotNull
+ private boolean reverseEnable; //该商户下,此支付方式能否冲正
+
+ @Column(name = "CREATETIME", length = 14)
+ private String createtime;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getPaytype() {
+ return paytype;
+ }
+
+ public void setPaytype(String paytype) {
+ this.paytype = paytype;
+ }
+
+ public boolean getConsumeEnable() {
+ return consumeEnable;
+ }
+
+ public void setConsumeEnable(boolean consumeEnable) {
+ this.consumeEnable = consumeEnable;
+ }
+
+ public boolean getAnonymousEnable() {
+ return anonymousEnable;
+ }
+
+ public void setAnonymousEnable(boolean anonymousEnable) {
+ this.anonymousEnable = anonymousEnable;
+ }
+
+ public boolean getReverseEnable() {
+ return reverseEnable;
+ }
+
+ public void setReverseEnable(boolean reverseEnable) {
+ this.reverseEnable = reverseEnable;
+ }
+
+ public String getCreatetime() {
+ return createtime;
+ }
+
+ public void setCreatetime(String createtime) {
+ this.createtime = createtime;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypeConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypeConfig.java
new file mode 100644
index 0000000..a86da1c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypeConfig.java
@@ -0,0 +1,105 @@
+package com.supwisdom.dlpay.api.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SHOP_PAYTYPE_CONFIG", indexes = {@Index(name = "shop_paytype_config_uk", unique = true, columnList = "shopaccno,paytype,configid")})
+public class TShopPaytypeConfig {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "CFGID", nullable = false, length = 32)
+ private String cfgid;
+
+ @Column(name = "SHOPACCNO", length = 10)
+ @NotNull
+ private String shopaccno;
+
+ @Column(name = "PAYTYPE", length = 20)
+ @NotNull
+ private String paytype;
+
+ @Column(name = "CONFIGID", length = 40)
+ @NotNull
+ private String configid;
+
+ @Column(name = "CONFIG_VALUE", length = 2000)
+ private String configValue;
+
+ @Column(name = "CONFIG_NAME", length = 200)
+ private String configName;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ public TShopPaytypeConfig() {
+ }
+
+ public TShopPaytypeConfig(String shopaccno, String paytype, String configid, String configValue, String configName) {
+ this.shopaccno = shopaccno;
+ this.paytype = paytype;
+ this.configid = configid;
+ this.configValue = configValue;
+ this.configName = configName;
+ }
+
+ public String getCfgid() {
+ return cfgid;
+ }
+
+ public void setCfgid(String cfgid) {
+ this.cfgid = cfgid;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getPaytype() {
+ return paytype;
+ }
+
+ public void setPaytype(String paytype) {
+ this.paytype = paytype;
+ }
+
+ public String getConfigid() {
+ return configid;
+ }
+
+ public void setConfigid(String configid) {
+ this.configid = configid;
+ }
+
+ public String getConfigValue() {
+ return configValue;
+ }
+
+ public void setConfigValue(String configValue) {
+ this.configValue = configValue;
+ }
+
+ public String getConfigName() {
+ return configName;
+ }
+
+ public void setConfigName(String configName) {
+ this.configName = configName;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypePK.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypePK.java
new file mode 100644
index 0000000..4196b55
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypePK.java
@@ -0,0 +1,61 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+@Embeddable
+public class TShopPaytypePK implements Serializable {
+ @Id
+ @Column(name = "SHOPACCNO", nullable = false, length = 10)
+ private String shopaccno;
+
+ @Id
+ @Column(name = "PAYTYPE", nullable = false, length = 20)
+ private String paytype;
+
+ public TShopPaytypePK() {
+ }
+
+ public TShopPaytypePK(String shopaccno, String paytype) {
+ this.shopaccno = shopaccno;
+ this.paytype = paytype;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getPaytype() {
+ return paytype;
+ }
+
+ public void setPaytype(String paytype) {
+ this.paytype = paytype;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TShopPaytypePK tShopPaytypePK = (TShopPaytypePK) o;
+ if (shopaccno != null ? !shopaccno.equals(tShopPaytypePK.getShopaccno()) : shopaccno != null)
+ return false;
+ if (paytype != null ? !paytype.equals(tShopPaytypePK.getPaytype()) : paytype != null)
+ return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = shopaccno != null ? shopaccno.hashCode() : 0;
+ result = 31 * result + (paytype != null ? paytype.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java
new file mode 100644
index 0000000..6e5c7bc
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TShopdtl.java
@@ -0,0 +1,242 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SHOPDTL",
+ indexes = {@Index(name = "shopdtl_accdate", columnList = "accdate"),
+ @Index(name = "shopdtl_shopaccno", columnList = "shopaccno"),
+ @Index(name = "shopdtl_transdate", columnList = "transdate"),
+ @Index(name = "shopdtl_updateflag", columnList = "updatebala")})
+public class TShopdtl {
+ @Id
+ @Column(name = "REFNO", length = 32, nullable = false)
+ private String refno;
+
+ @Column(name = "ACCDATE", length = 8)
+ @NotNull
+ private String accdate;
+
+ @Column(name = "SHOPACCNO", length = 10)
+ @NotNull
+ private String shopaccno;
+
+ @Column(name = "SHOPNAME", length = 200)
+ private String shopname;
+
+ @Column(name = "AMOUNT", scale = 2, precision = 15)
+ @NotNull
+ private Double amount;
+
+ @Column(name = "TRANSDATE", length = 8)
+ @NotNull
+ private String transdate;
+
+ @Column(name = "TRANSTIME", length = 6)
+ @NotNull
+ private String transtime;
+
+ @Column(name = "TRANSCODE", precision = 8)
+ private Integer transcode;
+
+ @Column(name = "SOURCETYPE", length = 20)
+ private String sourceType;
+
+ @Column(name = "PAYINFO", length = 200)
+ private String payInfo;
+
+ @Column(name = "TRADEFLAG", length = 6)
+ @NotNull
+ private String tradeflag; // out - 支出 , in - 收入
+
+ @Column(name = "TRANSDESC", length = 240)
+ private String transdesc; //交易描述
+
+ @Column(name = "REVERSEFLAG", length = 10)
+ private String reverseFlag;
+
+ @Column(name = "STATUS", length = 20)
+ @NotNull
+ private String status;
+
+ @Column(name = "updatebala")
+ @NotNull
+ private Boolean updateBala = false;
+
+ @Column(name = "OPPOSITEACCNO", length = 64)
+ private String oppositeAccNo;
+
+ @Column(name = "OPPOSITEACCNAME", length = 200)
+ private String oppositeAccName;
+
+ @Column(name = "REMARK", length = 240)
+ private String remark;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ @Column(name = "DTLTYPE", length = 20)
+ private String dtltype;
+
+ public String getDtltype() {
+ return dtltype;
+ }
+
+ public void setDtltype(String dtltype) {
+ this.dtltype = dtltype;
+ }
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getShopname() {
+ return shopname;
+ }
+
+ public void setShopname(String shopname) {
+ this.shopname = shopname;
+ }
+
+ public Double getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Double amount) {
+ this.amount = amount;
+ }
+
+ public String getTransdate() {
+ return transdate;
+ }
+
+ public void setTransdate(String transdate) {
+ this.transdate = transdate;
+ }
+
+ public String getTranstime() {
+ return transtime;
+ }
+
+ public void setTranstime(String transtime) {
+ this.transtime = transtime;
+ }
+
+ public Integer getTranscode() {
+ return transcode;
+ }
+
+ public void setTranscode(Integer transcode) {
+ this.transcode = transcode;
+ }
+
+ public String getSourceType() {
+ return sourceType;
+ }
+
+ public void setSourceType(String sourceType) {
+ this.sourceType = sourceType;
+ }
+
+ public String getPayInfo() {
+ return payInfo;
+ }
+
+ public void setPayInfo(String payInfo) {
+ this.payInfo = payInfo;
+ }
+
+ public String getTradeflag() {
+ return tradeflag;
+ }
+
+ public void setTradeflag(String tradeflag) {
+ this.tradeflag = tradeflag;
+ }
+
+ public String getTransdesc() {
+ return transdesc;
+ }
+
+ public void setTransdesc(String transdesc) {
+ this.transdesc = transdesc;
+ }
+
+ public String getReverseFlag() {
+ return reverseFlag;
+ }
+
+ public void setReverseFlag(String reverseFlag) {
+ this.reverseFlag = reverseFlag;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getOppositeAccNo() {
+ return oppositeAccNo;
+ }
+
+ public void setOppositeAccNo(String oppositeAccNo) {
+ this.oppositeAccNo = oppositeAccNo;
+ }
+
+ public String getOppositeAccName() {
+ return oppositeAccName;
+ }
+
+ public void setOppositeAccName(String oppositeAccName) {
+ this.oppositeAccName = oppositeAccName;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public Boolean getUpdateBala() {
+ return updateBala;
+ }
+
+ public void setUpdateBala(Boolean updateBala) {
+ this.updateBala = updateBala;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java
new file mode 100644
index 0000000..1748dc5
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java
@@ -0,0 +1,134 @@
+package com.supwisdom.dlpay.api.domain;
+
+import com.supwisdom.dlpay.framework.domain.DictionaryTable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Entity
+@Table(name = "TB_SOURCETYPE")
+public class TSourceType implements DictionaryTable, Serializable {
+ @Id
+ @Column(name = "SOURCETYPE", nullable = false, length = 20)
+ private String sourceType;
+
+ @Column(name = "ENABLE", length = 20)
+ @NotNull
+ private Boolean enable;
+
+ @Column(name = "CHARGE_ENABLE", length = 10)
+ @NotNull
+ private Boolean chargeEnable; //充值总开关
+
+ @Column(name = "CONSUME_ENABLE", length = 10)
+ @NotNull
+ private Boolean consumeEnable; //消费总开关
+
+ @Column(name = "ANONYMOUS_ENABLE", length = 10)
+ @NotNull
+ private Boolean anonymousEnable; //匿名消费总开关
+
+ @Column(name = "reversable")
+ @NotNull
+ private Boolean reversable;
+
+ @Column(name = "checkable")
+ @NotNull
+ private Boolean checkable; // 是否需要清算
+
+ @Column(name = "PAYDESC", length = 200)
+ private String paydesc;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ public String getSourceType() {
+ return sourceType;
+ }
+
+ public void setSourceType(String sourceType) {
+ this.sourceType = sourceType;
+ }
+
+ public Boolean getEnable() {
+ return enable;
+ }
+
+ public void setEnable(Boolean enable) {
+ this.enable = enable;
+ }
+
+ public Boolean getChargeEnable() {
+ return chargeEnable;
+ }
+
+ public void setChargeEnable(Boolean chargeEnable) {
+ this.chargeEnable = chargeEnable;
+ }
+
+ public Boolean getConsumeEnable() {
+ return consumeEnable;
+ }
+
+ public void setConsumeEnable(Boolean consumeEnable) {
+ this.consumeEnable = consumeEnable;
+ }
+
+ public Boolean getAnonymousEnable() {
+ return anonymousEnable;
+ }
+
+ public void setAnonymousEnable(Boolean anonymousEnable) {
+ this.anonymousEnable = anonymousEnable;
+ }
+
+ public String getPaydesc() {
+ return paydesc;
+ }
+
+ public void setPaydesc(String paydesc) {
+ this.paydesc = paydesc;
+ }
+
+ public Boolean getCheckable() {
+ return checkable;
+ }
+
+ public void setCheckable(Boolean checkable) {
+ this.checkable = checkable;
+ }
+
+ public Boolean getReversable() {
+ return reversable;
+ }
+
+ public void setReversable(Boolean reversable) {
+ this.reversable = reversable;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+
+ @Override
+ public String getDictKey() {
+ return this.sourceType;
+ }
+
+ @Override
+ public Object getDictValue() {
+ return this.paydesc;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java
new file mode 100644
index 0000000..ba51cfd
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java
@@ -0,0 +1,173 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SUBJECTDTL",
+ indexes = {@Index(name = "subjdtl_accdate", columnList = "accdate"),
+ @Index(name = "subjdtl_subjno", columnList = "subjno")})
+public class TSubjectdtl {
+ @Id
+ @Column(name = "refno", length = 32, nullable = false)
+ private String refno;
+
+ @Column(name = "accdate", length = 8)
+ @NotNull
+ private String accdate;
+
+ @Column(name = "subjno", length = 10)
+ @NotNull
+ private String subjectno;
+
+ @Column(name = "subjname", length = 200)
+ private String subjectName;
+
+ @Column(name = "amount", scale = 2, precision = 15)
+ @NotNull
+ private Double amount;
+
+ @Column(name = "tradecode", precision = 8)
+ @NotNull
+ private Integer tradeCode;
+
+ @Column(name = "transdate", length = 8)
+ @NotNull
+ private String transDate;
+
+ @Column(name = "transtime", length = 6)
+ @NotNull
+ private String transTime;
+
+ @Column(name = "paytype", length = 20)
+ private String payType;
+
+ @Column(name = "payinfo", length = 200)
+ private String payInfo;
+
+ @Column(name = "OPPOSITEACCNO", length = 20)
+ private String oppositeAccNo;
+
+ @Column(name = "OPPOSITEACCNAME", length = 200)
+ private String oppositeAccName;
+
+ @Column(name = "status", length = 20)
+ @NotNull
+ private String status;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ public String getSubjectno() {
+ return subjectno;
+ }
+
+ public void setSubjectno(String subjectno) {
+ this.subjectno = subjectno;
+ }
+
+ public String getSubjectName() {
+ return subjectName;
+ }
+
+ public void setSubjectName(String subjectName) {
+ this.subjectName = subjectName;
+ }
+
+ public Double getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Double amount) {
+ this.amount = amount;
+ }
+
+ public String getTransDate() {
+ return transDate;
+ }
+
+ public void setTransDate(String transDate) {
+ this.transDate = transDate;
+ }
+
+ public String getTransTime() {
+ return transTime;
+ }
+
+ public void setTransTime(String transTime) {
+ this.transTime = transTime;
+ }
+
+ public String getPayType() {
+ return payType;
+ }
+
+ public void setPayType(String payType) {
+ this.payType = payType;
+ }
+
+ public String getPayInfo() {
+ return payInfo;
+ }
+
+ public void setPayInfo(String payInfo) {
+ this.payInfo = payInfo;
+ }
+
+ public String getOppositeAccNo() {
+ return oppositeAccNo;
+ }
+
+ public void setOppositeAccNo(String oppositeAccNo) {
+ this.oppositeAccNo = oppositeAccNo;
+ }
+
+ public String getOppositeAccName() {
+ return oppositeAccName;
+ }
+
+ public void setOppositeAccName(String oppositeAccName) {
+ this.oppositeAccName = oppositeAccName;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public Integer getTradeCode() {
+ return tradeCode;
+ }
+
+ public void setTradeCode(Integer tradeCode) {
+ this.tradeCode = tradeCode;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
new file mode 100644
index 0000000..474d5cc
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
@@ -0,0 +1,368 @@
+package com.supwisdom.dlpay.api.domain;
+
+import com.supwisdom.dlpay.framework.util.Subject;
+import com.supwisdom.dlpay.framework.util.TradeDict;
+
+import javax.persistence.*;
+import javax.validation.constraints.Digits;
+import javax.validation.constraints.NotNull;
+import java.sql.Timestamp;
+import java.util.List;
+
+import static javax.persistence.FetchType.LAZY;
+
+@Entity
+@Table(name = "TB_TRANSACTIONMAIN",
+ indexes = {@Index(name = "transmain_accdate", columnList = "accdate"),
+ @Index(name = "transmain_status", columnList = "status"),
+ @Index(name = "transmain_outtrade", unique = true, columnList = "outid, outtradeno")})
+@SequenceGenerator(name = "seq_refno", allocationSize = 100)
+public class TTransactionMain {
+ @Id
+ @Column(name = "refno", nullable = false, length = 32)
+ private String refno;
+
+ @Column(name = "accdate", length = 8)
+ @NotNull
+ @Digits(integer = 8, fraction = 0)
+ private String accdate;
+
+ @Column(name = "checkable")
+ @NotNull
+ private Boolean checkable; // 是否需要清算的交易
+
+ @Column(name = "checkdate", length = 8)
+ private String checkDate;
+
+ @Column(name = "transcode")
+ @NotNull
+ private Integer transCode;
+
+ @Column(name = "person")
+ @NotNull
+ private Boolean person = false;
+
+ @Column(name = "shop")
+ @NotNull
+ private Boolean shop = false;
+
+ @Column(name = "subject")
+ @NotNull
+ private Boolean subject = false;
+
+ @Column(name = "status", length = 20)
+ @NotNull
+ private String status = TradeDict.DTL_STATUS_NONE;
+
+ @Column(name = "sourcetype", length = 20)
+ private String sourceType = "";
+
+ @Column(name = "outtradeno", length = 60)
+ private String outTradeNo = "";
+
+ @Column(name = "outid", length = 60)
+ private String outId;
+
+ @Column(name = "OPERID", precision = 9)
+ private String operid; //操作员ID
+
+ @Column(name = "OPERTYPE", length = 10)
+ private String opertype; // person - 个人, shop - 商户, operator - 操作员
+
+ @Column(name = "settledate", length = 8)
+ private String settleDate;
+
+ @Column(name = "create_time")
+ @NotNull
+ private Timestamp createTime;
+
+ @Column(name = "end_time")
+ private Timestamp endTime;
+
+ @Column(name = "reverse_type", nullable = false, length = 10)
+ @NotNull
+ private String reverseType = TradeDict.REVERSE_FLAG_NONE; // 流水标识, none - 正常交易流水, cancel - 撤销流水, refund - 退款流水
+
+ // 撤销、退款原流水参考号
+ @Column(name = "reverse_refno")
+ private String reverseRefno = "";
+
+ @Column(name = "reverse_flag", nullable = false, length = 10)
+ @NotNull
+ private String reverseFlag = TradeDict.REVERSE_FLAG_NONE; // 冲正标识, none - 未冲正, refund - 被退款, cancel - 被冲正
+
+ @Column(name = "refund_amount", nullable = false)
+ private Double refundAmount = 0.0;
+
+ @OneToOne(targetEntity = TPersondtl.class, fetch = LAZY, cascade = CascadeType.ALL)
+ @JoinColumn(name = "refno", referencedColumnName = "refno")
+ private TPersondtl personDtl;
+
+ @OneToOne(targetEntity = TShopdtl.class, fetch = LAZY, cascade = CascadeType.ALL)
+ @JoinColumn(name = "refno", referencedColumnName = "refno")
+ private TShopdtl shopDtl;
+
+ @OneToOne(targetEntity = TSubjectdtl.class, fetch = LAZY, cascade = CascadeType.ALL)
+ @JoinColumn(name = "refno", referencedColumnName = "refno")
+ private TSubjectdtl subjectDtl;
+
+ @OneToMany(targetEntity = TDebitCreditDtl.class, fetch = LAZY, cascade = CascadeType.ALL)
+ @JoinColumn(name = "refno", referencedColumnName = "refno")
+ private List<TDebitCreditDtl> details;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantid = "";
+
+ @Column(name = "DTLTYPE", length = 20)
+ private String dtltype;
+
+ public String getDtltype() {
+ return dtltype;
+ }
+
+ public void setDtltype(String dtltype) {
+ this.dtltype = dtltype;
+ }
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+
+ public Boolean getPerson() {
+ return person;
+ }
+
+ public void setPerson(Boolean person) {
+ this.person = person;
+ }
+
+ public Boolean getShop() {
+ return shop;
+ }
+
+ public void setShop(Boolean shop) {
+ this.shop = shop;
+ }
+
+ public Boolean getSubject() {
+ return subject;
+ }
+
+ public void setSubject(Boolean subject) {
+ this.subject = subject;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getOutTradeNo() {
+ return outTradeNo;
+ }
+
+ public void setOutTradeNo(String outTradeNo) {
+ this.outTradeNo = outTradeNo;
+ }
+
+ public String getOutId() {
+ return outId;
+ }
+
+ public void setOutId(String outId) {
+ this.outId = outId;
+ }
+
+ public String getReverseFlag() {
+ return reverseFlag;
+ }
+
+ public void setReverseFlag(String reverseFlag) {
+ this.reverseFlag = reverseFlag;
+ }
+
+ public TPersondtl getPersonDtl() {
+ return personDtl;
+ }
+
+ public TShopdtl getShopDtl() {
+ return shopDtl;
+ }
+
+ public TSubjectdtl getSubjectDtl() {
+ return subjectDtl;
+ }
+
+ public List<TDebitCreditDtl> getDetails() {
+ return details;
+ }
+
+ public void setPersonDtl(TPersondtl personDtl) {
+ this.personDtl = personDtl;
+ }
+
+ public void setShopDtl(TShopdtl shopDtl) {
+ this.shopDtl = shopDtl;
+ }
+
+ public void setSubjectDtl(TSubjectdtl subjectDtl) {
+ this.subjectDtl = subjectDtl;
+ }
+
+ public void setDetails(List<TDebitCreditDtl> details) {
+ this.details = details;
+ }
+
+ public Timestamp getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Timestamp createTime) {
+ this.createTime = createTime;
+ }
+
+ public Timestamp getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Timestamp endTime) {
+ this.endTime = endTime;
+ }
+
+ public String getOperid() {
+ return operid;
+ }
+
+ public void setOperid(String operid) {
+ this.operid = operid;
+ }
+
+ public String getOpertype() {
+ return opertype;
+ }
+
+ public void setOpertype(String opertype) {
+ this.opertype = opertype;
+ }
+
+ public String getCheckDate() {
+ return checkDate;
+ }
+
+ public void setCheckDate(String checkDate) {
+ this.checkDate = checkDate;
+ }
+
+ public Boolean getCheckable() {
+ return checkable;
+ }
+
+ public void setCheckable(Boolean checkable) {
+ this.checkable = checkable;
+ }
+
+ public String getSettleDate() {
+ return settleDate;
+ }
+
+ public void setSettleDate(String settleDate) {
+ this.settleDate = settleDate;
+ }
+
+ public String getSourceType() {
+ return sourceType;
+ }
+
+ public void setSourceType(String sourceType) {
+ this.sourceType = sourceType;
+ }
+
+ public Integer getTransCode() {
+ return transCode;
+ }
+
+ public void setTransCode(Integer transCode) {
+ this.transCode = transCode;
+ }
+
+ public String getReverseType() {
+ return reverseType;
+ }
+
+ public void setReverseType(String reverseType) {
+ this.reverseType = reverseType;
+ }
+
+ public String getReverseRefno() {
+ return reverseRefno;
+ }
+
+ public void setReverseRefno(String reverseRefno) {
+ this.reverseRefno = reverseRefno;
+ }
+
+ public Double getRefundAmount() {
+ return refundAmount;
+ }
+
+ public void setRefundAmount(Double refundAmount) {
+ this.refundAmount = refundAmount;
+ }
+
+ public Double sumAmountByAccno(String accno, String subjno,
+ String debitOrCredit) {
+ Double debitSum = 0.0;
+ Double creditSum = 0.0;
+ for (TDebitCreditDtl dtl : getDetails()) {
+ if (dtl.getDraccno().equals(accno) && dtl.getDrsubjno().equals(subjno)) {
+ debitSum += dtl.getAmount();
+ }
+ if (dtl.getCraccno().equals(accno) && dtl.getCrsubjno().equals(subjno)) {
+ creditSum += dtl.getAmount();
+ }
+ }
+ if (Subject.SUBJNO_MACHANT_INCOME.equals(subjno)
+ || Subject.SUBJNO_PERSONAL_DEPOSIT.equals(subjno)) {
+ if ("debit".equals(debitOrCredit)) {
+ return -debitSum;
+ } else if ("credit".equals(debitOrCredit)) {
+ return creditSum;
+ } else {
+ return debitSum - creditSum;
+ }
+ } else if (subjno.startsWith("1")) {
+ if ("debit".equals(debitOrCredit)) {
+ return debitSum;
+ } else if ("credit".equals(debitOrCredit)) {
+ return -creditSum;
+ } else {
+ return creditSum - debitSum;
+ }
+ }
+ return 0.0;
+ }
+
+ public String getTenantid() {
+ return tenantid;
+ }
+
+ public void setTenantid(String tenantid) {
+ this.tenantid = tenantid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/repositories/AccountService.java b/payapi/src/main/java/com/supwisdom/dlpay/api/repositories/AccountService.java
new file mode 100644
index 0000000..6f414a5
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/repositories/AccountService.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.api.repositories;
+
+import com.supwisdom.dlpay.api.domain.TPersondtl;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface AccountService {
+
+ @Transactional
+ void recalcAccountBalance(TPersondtl dtl, Double amount, boolean overdraft);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/repositories/ShopaccService.java b/payapi/src/main/java/com/supwisdom/dlpay/api/repositories/ShopaccService.java
new file mode 100644
index 0000000..2d8ebcf
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/repositories/ShopaccService.java
@@ -0,0 +1,18 @@
+package com.supwisdom.dlpay.api.repositories;
+
+import com.supwisdom.dlpay.api.domain.TShopdtl;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface ShopaccService {
+ @Transactional(isolation = Isolation.READ_COMMITTED)
+ void recalcShopBalance(TShopdtl dtl, Double amount, boolean overdraft);
+
+ @Transactional(isolation = Isolation.READ_COMMITTED)
+ void recalcShopBalance(String refno, boolean overdraft);
+
+ @Transactional
+ List<TShopdtl> findUnupdatedShopDtl(int maxCount);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/service/SourceTypeService.java b/payapi/src/main/java/com/supwisdom/dlpay/api/service/SourceTypeService.java
new file mode 100644
index 0000000..86a9841
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/service/SourceTypeService.java
@@ -0,0 +1,21 @@
+package com.supwisdom.dlpay.api.service;
+
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Map;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public interface SourceTypeService {
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ TSourceType getByPaytype(String paytype);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ Map<String, String> getPaytypeConfigByPaytype(String pattype);
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/service/impl/SourceTypeServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/service/impl/SourceTypeServiceImpl.java
new file mode 100644
index 0000000..60cf1a5
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/service/impl/SourceTypeServiceImpl.java
@@ -0,0 +1,44 @@
+package com.supwisdom.dlpay.api.service.impl;
+
+import com.supwisdom.dlpay.api.dao.PaytypeConfigDao;
+import com.supwisdom.dlpay.api.dao.SourceTypeDao;
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.api.service.SourceTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheConfig;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Service
+@CacheConfig(cacheNames = "sourcetypeCache")
+public class SourceTypeServiceImpl implements SourceTypeService {
+ @Autowired
+ private SourceTypeDao paytypeDao;
+ @Autowired
+ private PaytypeConfigDao paytypeConfigDao;
+
+ @Override
+ @Cacheable
+ public TSourceType getByPaytype(String paytype) {
+ return paytypeDao.getOne(paytype);
+ }
+
+ @Override
+ @Cacheable
+ public Map<String, String> getPaytypeConfigByPaytype(String pattype) {
+ List<TPaytypeConfig> list = paytypeConfigDao.getByPaytype(pattype);
+ Map<String, String> map = new HashMap<>(list.size());
+ for (TPaytypeConfig paytypeConfig : list) {
+ map.put(paytypeConfig.getConfigid(), paytypeConfig.getConfigValue());
+ }
+ return map;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckException.java b/payapi/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckException.java
new file mode 100644
index 0000000..87b9ad1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckException.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.exception;
+
+public class TransactionCheckException extends TransactionException {
+ public TransactionCheckException(int code, String message) {
+ super(code, String.format("C - %d, %s", code, message));
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/exception/TransactionException.java b/payapi/src/main/java/com/supwisdom/dlpay/exception/TransactionException.java
new file mode 100644
index 0000000..e84657e
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/exception/TransactionException.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.exception;
+
+public class TransactionException extends Exception {
+ private int errCode;
+
+ public TransactionException(int code, String message) {
+ super(message);
+ errCode = code;
+ }
+
+ public int code() {
+ return this.errCode;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessException.java b/payapi/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessException.java
new file mode 100644
index 0000000..aac9273
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessException.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.exception;
+
+public class TransactionProcessException extends TransactionException {
+ public TransactionProcessException(int errCode, String message) {
+ super(errCode, String.format("E-%d : %s", errCode, message));
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/exception/ValidateCodeException.java b/payapi/src/main/java/com/supwisdom/dlpay/exception/ValidateCodeException.java
new file mode 100755
index 0000000..98ea42b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/exception/ValidateCodeException.java
@@ -0,0 +1,23 @@
+/**
+ *
+ */
+package com.supwisdom.dlpay.exception;
+
+import org.springframework.security.core.AuthenticationException;
+
+/**
+ * @author lenovo
+ *
+ */
+public class ValidateCodeException extends AuthenticationException {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1170189980006964105L;
+
+
+ public ValidateCodeException(String msg) {
+ super(msg);
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/KaptchaConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/KaptchaConfig.java
new file mode 100644
index 0000000..c69dc38
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/KaptchaConfig.java
@@ -0,0 +1,29 @@
+package com.supwisdom.dlpay.framework;
+
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+@Configuration
+public class KaptchaConfig {
+ @Bean
+ public DefaultKaptcha getDefaultKaptcha(){
+ DefaultKaptcha captchaProducer = new DefaultKaptcha();
+ Properties properties = new Properties();
+ properties.setProperty("kaptcha.border", "yes");
+ properties.setProperty("kaptcha.border.color", "105,179,90");
+ properties.setProperty("kaptcha.textproducer.font.color", "blue");
+ properties.setProperty("kaptcha.image.width", "110");
+ properties.setProperty("kaptcha.image.height", "40");
+ properties.setProperty("kaptcha.textproducer.font.size", "30");
+ properties.setProperty("kaptcha.session.key", "code");
+ properties.setProperty("kaptcha.textproducer.char.length", "4");
+ properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
+ Config config = new Config(properties);
+ captchaProducer.setConfig(config);
+ return captchaProducer;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DatabaseConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DatabaseConfig.java
new file mode 100644
index 0000000..99bb014
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DatabaseConfig.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.framework.core;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class DatabaseConfig {
+ @Value("${spring.datasource.platform}")
+ private String platform;
+
+ public String getPlatform() {
+ return platform;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
new file mode 100644
index 0000000..de2afe3
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
@@ -0,0 +1,110 @@
+package com.supwisdom.dlpay.framework.core;
+
+import com.supwisdom.dlpay.framework.domain.TSettleLog;
+import com.supwisdom.dlpay.framework.domain.TTaskLock;
+import com.supwisdom.dlpay.framework.service.DayendSettleService;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DayendSettleTask {
+ @Autowired
+ private SystemUtilService systemUtilService;
+ @Autowired
+ private DayendSettleService dayendSettleService;
+
+ private TSettleLog settleLog;
+
+ private static final Logger logger = LoggerFactory.getLogger(DayendSettleTask.class);
+
+ @Scheduled(cron="${dayend.settletask.cron}")
+ public void doSettleTask() {
+ if (logger.isDebugEnabled()) logger.debug("进入日结算任务!");
+
+ TTaskLock lock = null;
+ try {
+ try {
+ lock = systemUtilService.doLockTask("DAYENDSETTLETASK", 30, "日终结算");
+ if (lock == null) {
+ if (logger.isDebugEnabled()) logger.debug("日终结算正在其他服务器上执行");
+ return;
+ }
+ } catch (Exception e) {
+ return;
+ }
+
+ settleLog = dayendSettleService.doCreateSettleLog(); //记录日志
+
+ //step1: 账户校验(fixme: 清算任务?)
+ long t1 = System.currentTimeMillis();
+ if (!checkAccounts()) {
+ logger.error("账户余额校验出错,退出结算!");
+ return;
+ }
+ long t2 = System.currentTimeMillis();
+ logger.info("===== step1: 日终结算【账户校验】耗时 " + (t2 - t1) + " ms");
+
+ //step2: 对账判断(fixme: 清算任务?)
+ long t3 = System.currentTimeMillis();
+ if (!checkChkfiles()) {
+ logger.error("对账未完成,退出结算!");
+ return;
+ }
+ long t4 = System.currentTimeMillis();
+ logger.info("===== step2: 日终结算【对账判断】耗时 " + (t4 - t3) + " ms");
+
+ //step3: 日结
+ long t5 = System.currentTimeMillis();
+ if (!doSettleProcess()) {
+ logger.error("日结出错:" + settleLog.getErrmsg());
+ return;
+ }
+ long t6 = System.currentTimeMillis();
+ logger.info("===== step3: 日终结算【日结】耗时 " + (t6 - t5) + " ms");
+
+
+ } catch (Exception e) {
+ logger.error("日终结算报错:" + (!StringUtil.isEmpty(e.getMessage()) ? e.getMessage() : e.getClass().getName()));
+ e.printStackTrace();
+ } finally {
+ if (null != lock) {
+ lock.setTaskstatus(0);
+ lock.setTasktime(systemUtilService.getSysdatetime().getHostdatetime());
+ systemUtilService.updateTaskLock(lock);
+ }
+ }
+ }
+
+ private boolean checkAccounts() {
+ //TODO: 账户余额校验,生成账户日结表数据
+ return true;
+ }
+
+ private boolean checkChkfiles() {
+ //TODO: 结算前是否要求所有对账完成
+ return true;
+ }
+
+ private boolean doSettleProcess() {
+ try {
+ boolean ret = dayendSettleService.doDayendSettle();
+ if (ret) {
+ dayendSettleService.doUpdateSettleLog(settleLog.update("0", "成功结算"));
+ }
+ return ret;
+ } catch (Exception e) {
+ if (!StringUtil.isEmpty(e.getMessage())) {
+ dayendSettleService.doUpdateSettleLog(settleLog.update("-9", e.getMessage()));
+ } else {
+ e.printStackTrace();
+ dayendSettleService.doUpdateSettleLog(settleLog.update("-8", e.getClass().getName()));
+ }
+ return false;
+ }
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtConfig.java
new file mode 100644
index 0000000..fbaa21c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtConfig.java
@@ -0,0 +1,36 @@
+package com.supwisdom.dlpay.framework.core;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class JwtConfig {
+ @Value("${jwt.secret}")
+ private String secret;
+ @Value("${jwt.expiration:3600}")
+ private Long expiration = 3600L;
+ @Value("${jwt.header:Authorization}")
+ private String header = "Authorization";
+ @Value("${jwt.token_header:Bearer }")
+ private String tokenHeader = "Bearer";
+
+ public String getSecret() {
+ return secret;
+ }
+
+ public Long getExpiration() {
+ return expiration;
+ }
+
+ public String getHeader() {
+ return header;
+ }
+
+ public String getTokenHeader() {
+ return tokenHeader;
+ }
+
+ public void setExpiration(Long expiration) {
+ this.expiration = expiration;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtToken.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtToken.java
new file mode 100644
index 0000000..072ea5d
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtToken.java
@@ -0,0 +1,39 @@
+package com.supwisdom.dlpay.framework.core;
+
+import org.jose4j.jwt.NumericDate;
+
+public class JwtToken {
+ private String jti;
+ private NumericDate expiration;
+ private String jwtToken;
+
+ public JwtToken(String jti, String jwtToken, NumericDate exp) {
+ this.jti = jti;
+ this.jwtToken = jwtToken;
+ this.expiration = exp;
+ }
+
+ public String getJti() {
+ return jti;
+ }
+
+ public void setJti(String jti) {
+ this.jti = jti;
+ }
+
+ public String getJwtToken() {
+ return jwtToken;
+ }
+
+ public void setJwtToken(String jwtToken) {
+ this.jwtToken = jwtToken;
+ }
+
+ public NumericDate getExpiration() {
+ return expiration;
+ }
+
+ public void setExpiration(NumericDate expiration) {
+ this.expiration = expiration;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java
new file mode 100644
index 0000000..71f65bf
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java
@@ -0,0 +1,96 @@
+package com.supwisdom.dlpay.framework.core;
+
+import com.supwisdom.dlpay.framework.util.Constants;
+import org.jose4j.jwa.AlgorithmConstraints;
+import org.jose4j.jwk.JsonWebKey;
+import org.jose4j.jws.AlgorithmIdentifiers;
+import org.jose4j.jws.JsonWebSignature;
+import org.jose4j.jwt.JwtClaims;
+import org.jose4j.jwt.MalformedClaimException;
+import org.jose4j.jwt.consumer.InvalidJwtException;
+import org.jose4j.jwt.consumer.JwtConsumer;
+import org.jose4j.jwt.consumer.JwtConsumerBuilder;
+import org.jose4j.lang.JoseException;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class JwtTokenUtil {
+ private JwtConfig jwtConfig;
+
+ public JwtTokenUtil(JwtConfig config) {
+ this.jwtConfig = config;
+ }
+
+ public String getHeader() {
+ return jwtConfig.getHeader();
+ }
+
+ public JwtToken generateToken(Map<String, Object> params) throws JoseException, MalformedClaimException {
+ JwtClaims claims = new JwtClaims();
+ claims.setIssuer(params.get("issuer").toString()); // who creates the token and signs it
+ if (params.get("audience") != null) {
+ claims.setAudience(params.get("audience").toString());
+ }
+ claims.setExpirationTimeMinutesInTheFuture(jwtConfig.getExpiration() / 60); // time when the token will expire (10 minutes from now)
+ claims.setGeneratedJwtId();
+ claims.setIssuedAtToNow(); // when the token was issued/created (now)
+ claims.setNotBeforeMinutesInThePast(2); // time before which the token is not yet valid (2 minutes ago)
+ if (params.get("subject") != null) {
+ claims.setSubject(params.get("subject").toString()); // the subject/principal is whom the token is about
+ }
+ if (params.get(Constants.JWT_CLAIM_AUTHORITIES) != null) {
+ claims.setClaim(Constants.JWT_CLAIM_AUTHORITIES, params.get(Constants.JWT_CLAIM_AUTHORITIES));
+ }
+ if (params.get(Constants.JWT_CLAIM_UID) != null) {
+ claims.setClaim(Constants.JWT_CLAIM_UID, params.get(Constants.JWT_CLAIM_UID));
+ }
+ if (params.get(Constants.JWT_CLAIM_TENANTID) != null) {
+ claims.setClaim(Constants.JWT_CLAIM_TENANTID, params.get(Constants.JWT_CLAIM_TENANTID));
+ }
+ /*
+ claims.setClaim("email", "mail@example.com"); // additional claims/attributes about the subject can be added
+ List<String> groups = Arrays.asList("group-one", "other-group", "group-three");
+ claims.setStringListClaim("groups", groups); // multi-valued claims work too and will end up as a JSON array
+ */
+
+ Map<String, Object> keySpec = new HashMap<>();
+ keySpec.put("kty", "oct");
+ keySpec.put("k", jwtConfig.getSecret());
+ JsonWebKey key = JsonWebKey.Factory.newJwk(keySpec);
+ JsonWebSignature jws = new JsonWebSignature();
+ jws.setPayload(claims.toJson());
+ jws.setKey(key.getKey());
+ jws.setKeyIdHeaderValue(key.getKeyId());
+ jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256);
+ return new JwtToken(claims.getJwtId(), jws.getCompactSerialization(), claims.getExpirationTime());
+ }
+
+ public JwtToken generateToken(UserDetails userDetails) throws JoseException, MalformedClaimException {
+ Map<String, Object> claims = new HashMap<>();
+ claims.put("uid", userDetails.getUsername());
+ return generateToken(claims);
+ }
+
+ public Map<String, Object> verifyToken(String token) throws JoseException, InvalidJwtException {
+ Map<String, Object> keySpec = new HashMap<>();
+ keySpec.put("kty", "oct");
+ keySpec.put("k", jwtConfig.getSecret());
+ JsonWebKey key = JsonWebKey.Factory.newJwk(keySpec);
+ JwtConsumer jwtConsumer = new JwtConsumerBuilder()
+ .setRequireExpirationTime() // the JWT must have an expiration time
+ .setAllowedClockSkewInSeconds(30) // allow some leeway in validating time based claims to account for clock skew
+ .setVerificationKey(key.getKey()) // verify the signature with the public key
+ .setSkipDefaultAudienceValidation()
+ .setJwsAlgorithmConstraints( // only allow the expected signature algorithm(s) in the given context
+ new AlgorithmConstraints(org.jose4j.jwa.AlgorithmConstraints.ConstraintType.WHITELIST, // which is only RS256 here
+ AlgorithmIdentifiers.HMAC_SHA256))
+ .build(); // create the JwtConsumer instance
+
+ // Validate the JWT and process it to the Claims
+ JwtClaims jwtClaims = jwtConsumer.processToClaims(token);
+ return jwtClaims.getClaimsMap();
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/PasswordBCryptConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/PasswordBCryptConfig.java
new file mode 100644
index 0000000..1743e2e
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/PasswordBCryptConfig.java
@@ -0,0 +1,28 @@
+package com.supwisdom.dlpay.framework.core;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class PasswordBCryptConfig {
+ @Value("${auth.password.bcrypt.length:10}")
+ private Integer length;
+ @Value("${auth.password.bcrypt.seed}")
+ private String seed = "";
+
+ public Integer getLength() {
+ return length;
+ }
+
+ public void setLength(Integer length) {
+ this.length = length;
+ }
+
+ public String getSeed() {
+ return seed;
+ }
+
+ public void setSeed(String seed) {
+ this.seed = seed;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java
new file mode 100644
index 0000000..3875703
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TApiClient;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ApiClientDao extends JpaRepository<TApiClient, String> {
+ TApiClient findByAppid(String appid);
+
+ Page<TApiClient> findByAppidContaining(String appid, Pageable pageable);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/BusinessparaDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/BusinessparaDao.java
new file mode 100644
index 0000000..8f8be9c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/BusinessparaDao.java
@@ -0,0 +1,29 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TBusinesspara;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.QueryHints;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+import javax.persistence.QueryHint;
+
+@Repository
+public interface BusinessparaDao extends JpaRepository<TBusinesspara, String> {
+ TBusinesspara findByParakey(String parakey);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query(value = " from TBusinesspara where parakey=?1 ")
+ TBusinesspara findByParakeyForUpdate(String parakey);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="0")})
+ @Query(value = " from TBusinesspara where parakey=?1 ")
+ TBusinesspara findByParakeyForUpdateNowait(String parakey);
+
+ Page<TBusinesspara> findAllByParakeyContaining(String parakey, Pageable pageable);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java
new file mode 100644
index 0000000..efdd384
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TDictionary;
+import com.supwisdom.dlpay.framework.domain.TDictionaryPK;
+import org.springframework.cache.annotation.CacheConfig;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface DictionaryDao extends JpaRepository<TDictionary, TDictionaryPK> {
+ List<TDictionary> findAllByDicttype(String dicttype);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/FeetypeConfigDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/FeetypeConfigDao.java
new file mode 100644
index 0000000..b626087
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/FeetypeConfigDao.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TFeetypeConfig;
+import com.supwisdom.dlpay.framework.domain.TFeetypeConfigPK;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface FeetypeConfigDao extends JpaRepository<TFeetypeConfig, TFeetypeConfigPK> {
+ @Query("select a from TFeetypeConfig a where a.feetype=?1 and a.paytype=?2 ")
+ TFeetypeConfig getById(String feetype, String paytype);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
new file mode 100644
index 0000000..1e08ccb
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TFunction;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface FunctionDao extends JpaRepository<TFunction, Integer> {
+ @Query("select distinct t from TFunction t,TRoleFunction a, TOperRole b where t.id=a.functionId and a.roleId=b.roleId and b.operid=?1 order by t.orderNum ")
+ List<TFunction> getTFunctionsByOperid(String operid);
+
+ Page<TFunction> findAllByNameContaining(String name, Pageable pageable);
+
+ TFunction findByName(String name);
+
+ TFunction findByNameAndIdNot(String name, Integer id);
+
+ List<TFunction> findByParentId(Integer parentId);
+
+ List<TFunction> findByIsLeaf(Integer isLeaf);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperLogDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperLogDao.java
new file mode 100644
index 0000000..e8fa58e
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperLogDao.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TOperLog;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface OperLogDao extends JpaRepository<TOperLog, String> {
+ Page<TOperLog> findAllByOpernameContaining(String opername, Pageable pageable);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperRoleDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperRoleDao.java
new file mode 100644
index 0000000..fa3dd5a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperRoleDao.java
@@ -0,0 +1,21 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TOperRole;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface OperRoleDao extends JpaRepository<TOperRole, String> {
+
+ @Query(value = "select distinct rolecode from TB_OPER_ROLE a,TB_ROLE b where a.roleid=b.roleid and a.operid=?1", nativeQuery = true)
+ List<String> getRolecodeByOperid(String operid);
+
+ void deleteByRoleId(String roleId);
+
+ List<TOperRole> findAllByOperid(String operid);
+
+ void deleteByOperid(String operid);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
new file mode 100644
index 0000000..27b511f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface OperatorDao extends JpaRepository<TOperator, String>, JpaSpecificationExecutor<TOperator> {
+ TOperator findByOpercode(String opercode);
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java
new file mode 100644
index 0000000..aa05bd7
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java
@@ -0,0 +1,21 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TPeriod;
+import com.supwisdom.dlpay.framework.domain.TPeriodPK;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+
+@Repository
+public interface PeriodDao extends JpaRepository<TPeriod, TPeriodPK> {
+ @Query(value = "from TPeriod t where t.periodYear=:periodyear and t.periodMonth=:periodmonth ")
+ TPeriod getPeriod(@Param("periodyear") Integer periodyear, @Param("periodmonth") Integer periodmonth);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query(value = "from TPeriod t where t.periodYear=:periodyear and t.periodMonth=:periodmonth ")
+ TPeriod getTPeriodWithLock(@Param("periodyear") Integer periodyear, @Param("periodmonth") Integer periodmonth);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java
new file mode 100644
index 0000000..af782a8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PermissionDao.java
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TPermission;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface PermissionDao extends JpaRepository<TPermission, String> {
+
+ TPermission findByRoleIdAndResid(String roleId, Integer resid);
+
+ void deleteByRoleId(String roleId);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java
new file mode 100644
index 0000000..d5a81c8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ResourceDao.java
@@ -0,0 +1,19 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TResource;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ResourceDao extends JpaRepository<TResource, Integer> {
+ TResource findByUri(String uri);
+
+ List<TResource> findByFunctionId(Integer functionId);
+
+ TResource findByUriAndIdNot(String uri, Integer id);
+
+ void deleteByFunctionId(Integer functionId);
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
new file mode 100644
index 0000000..9ccc7c9
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/RoleDao.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TRole;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface RoleDao extends JpaRepository<TRole, String> {
+ @Query("from TRole order by createtime asc ")
+ List<TRole> getAllRoles();
+
+ TRole findByRoleCode(String roleCode);
+
+ Page<TRole> findAllByRoleNameContaining(String roleName, Pageable pageable);
+
+ TRole findByRoleNameAndRoleIdNot(String roleName, String roleId);
+
+ TRole findByRoleCodeAndRoleIdNot(String roleCode, String roleId);
+
+ TRole findByRoleName(String roleName);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java
new file mode 100644
index 0000000..e125f7a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.data.NodeData;
+import com.supwisdom.dlpay.framework.domain.TRoleFunction;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface RoleFunctionDao extends JpaRepository<TRoleFunction, String> {
+
+ TRoleFunction findByRoleIdAndFunctionId(String roleId, Integer functionId);
+
+ void deleteByFunctionId(Integer functionId);
+
+ List<TRoleFunction> findByRoleId(String roleId);
+
+ @Query(value = "select tt.id,tt.pid,tt.name,tt.checked,tt.open from " +
+ " ( select f.id||'' as id ,f.parentid||'' as pid,f.name,case when rf.id is null then 0 else 1 end as checked,case when f.parentid=-1 then 1 else 0 end as open from tb_function f " +
+ " left join tb_role_function rf on rf.functionid = f.id and rf.roleid=?1 " +
+ " union all " +
+ " select r.id||'_res' as id,r.function_id||'' as pid,r.name,case when p.id is null then 0 else 1 end as checked,0 as open from tb_resource r " +
+ " left join tb_permission p on p.resid = r.id and p.roleid=?1 ) tt order by tt.id " , nativeQuery = true)
+ List<NodeData> findByRoleIdNative(String roleId);
+
+ void deleteByRoleId(String roleId);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
new file mode 100644
index 0000000..ec8fadc
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TSettlectl;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+
+@Repository
+public interface SettleCtlDao extends JpaRepository<TSettlectl, Integer> {
+ @Lock(value = LockModeType.PESSIMISTIC_WRITE)
+ TSettlectl findByBooksetno(Integer booksetno);
+
+ @Lock(value = LockModeType.PESSIMISTIC_WRITE)
+ @Query(value = "from TSettlectl where booksetno=:booksetno ")
+ TSettlectl findByBooksetnoWithLock(@Param("booksetno") Integer booksetno);
+
+ @Modifying(clearAutomatically = true)
+ @Query(value = "update TB_SETTLECTL set PERIODYEAR=:peridyear,PERIODMONTH=:peridmonth where BOOKSETNO=1 ", nativeQuery = true)
+ void updateSettlePeriod(@Param("peridyear") int peridyear, @Param("peridmonth") int peridmonth);
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleLogDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleLogDao.java
new file mode 100644
index 0000000..30de1ae
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleLogDao.java
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TSettleLog;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SettleLogDao extends JpaRepository<TSettleLog, String> {
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopDao.java
new file mode 100644
index 0000000..e7cc15f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopDao.java
@@ -0,0 +1,33 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TShop;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.persistence.LockModeType;
+import java.util.List;
+
+/**
+ * Created by shuwei on 2019/4/15.
+ */
+public interface ShopDao extends JpaRepository<TShop, Integer> {
+ TShop getByThirdUniqueIdenty(String thirdUniqueIdenty);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query("select a from TShop a where a.thirdUniqueIdenty=?1")
+ TShop getByThirdUniqueIdentyForUpdate(String thirdUniqueIdenty);
+
+ TShop getTShopByShopid(Integer shopid);
+
+ TShop getTShopByShopaccno(String shopaccno);
+
+ @Query("from TShop where status='normal' and fshopid=?1 ")
+ List<TShop> getChildShopsByShopid(Integer shopid);
+
+ @Query(value = "select count(t.shopid) from TB_SHOP t where t.status='normal' and t.shopname=?1 and t.fshopid=?2 and t.shopid!=?3", nativeQuery = true)
+ long checkShopnameExist(String shopname, int fshopid, int oldShopid);
+
+ @Query("from TShop where status='normal' order by shopid asc ")
+ List<TShop> getNormalShops();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
new file mode 100644
index 0000000..303a3b0
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
@@ -0,0 +1,47 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TShopacc;
+import org.springframework.data.jpa.repository.*;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.LockModeType;
+
+import javax.persistence.QueryHint;
+import java.util.List;
+
+@Repository
+public interface ShopaccDao extends JpaRepository<TShopacc, String> {
+
+ @Query(value = "select t.SHOPACCNO from TB_SHOPACC t left join TB_SHOPACCDAY a on t.SHOPACCNO=a.SHOPACCNO and a.accdate=:lastsettday where a.SHOPACCNO is null ", nativeQuery = true)
+ List<String> getNewShopacc(@Param("lastsettday") String lastsettday);
+
+
+ @Query(value = "select shopname from TShopacc where shopaccno=:shopaccno ")
+ String getShopname(@Param("shopaccno") String shopaccno);
+
+ @Query(value = "select t.SHOPACCNO as accno from TB_SHOPACC t left join TB_SHOPACCBAL a on t.SHOPACCNO=a.SHOPACCNO where a.SHOPACCNO is null and t.opendate>=:settday ", nativeQuery = true)
+ List<String> getNewAddShopacc(@Param("settday") String settday);
+
+ TShopacc findByShopid(Integer shopid);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
+ @Query("select a from TShopacc a where a.shopid=?1")
+ TShopacc getShopaccWithLockNowait(Integer shopid);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query("select a from TShopacc a where a.shopid=?1")
+ TShopacc getShopaccWithLock(Integer shopid);
+
+ TShopacc getByShopaccno(String shopaccno);
+
+ @Transactional
+ @Modifying(clearAutomatically = true)
+ @Query("update TShopacc set shopname=?1 where shopaccno=?2")
+ void updateShopnameByShopaccno(String shopname, String shopaccno);
+
+
+ TShopacc findByShopaccno(String acc);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccdayDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccdayDao.java
new file mode 100644
index 0000000..ddc0265
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccdayDao.java
@@ -0,0 +1,29 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TShopaccday;
+import com.supwisdom.dlpay.framework.domain.TShopaccdayPK;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ShopaccdayDao extends JpaRepository<TShopaccday, TShopaccdayPK> {
+
+ @Query(value = "from TShopaccday t where t.accdate=:accdate ")
+ List<TShopaccday> getShopaccdayByAccdate(@Param("accdate") String accdate);
+
+ @Query(value = "from TShopaccday t where t.accdate=:accdate and t.shopaccno=:shopaccno ")
+ TShopaccday getTShopaccdayById(@Param("accdate") String accdate, @Param("shopaccno") String shopaccno);
+
+ @Modifying(clearAutomatically = true)
+ @Query(value = "update TB_SHOPACCDAY set balance=beginbal-dramt+cramt,updtime=:updtime where accdate=:accdate ", nativeQuery = true)
+ void updateShopaccdayBalance(@Param("accdate") String accdate,@Param("updtime")String updtime);
+
+ @Query(value = "select sum(balance) as amount from TShopaccday where accdate=:accdate ")
+ Double getSumBalance(@Param("accdate") String accdate);
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectDao.java
new file mode 100644
index 0000000..f88623d
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectDao.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.data.ExistBean;
+import com.supwisdom.dlpay.framework.domain.TSubject;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SubjectDao extends JpaRepository<TSubject, String> {
+
+ @Query(value = "select t.SUBJNO from TB_SUBJECT t left join TB_SUBJECTBAL a on t.SUBJNO=a.SUBJNO where t.ENDFLAG=1 and a.SUBJNO is null ", nativeQuery = true)
+ List<String> getNewSubject();
+
+ @Query(value = "select count(t.subjno) as existed from TB_SUBJECT t left join TB_SUBJECTBAL a on t.SUBJNO=a.SUBJNO where t.ENDFLAG=1 and a.SUBJNO is null ", nativeQuery = true)
+ ExistBean checkSettleSubject();
+
+ @Query(value = "select a.subjno as accno from TB_SUBJECT a left join (select subjno from TB_SUBJECTDAY where accdate =:accdate ) b on a.subjno=b.subjno where a.subjlevel=1 and b.subjno is null ", nativeQuery = true)
+ List<String> getNewSubjnos(@Param("accdate") String accdate);
+
+ @Query(value = "select subjname from TSubject where subjno=:subjno ")
+ String getSubjectname(@Param("subjno") String subjno);
+
+ TSubject findBySubjno(String subjno);
+
+ @Query("from TSubject where displayflag='y' order by subjno ")
+ List<TSubject> findAllDisplaySubjects();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
new file mode 100644
index 0000000..73b01cf
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
@@ -0,0 +1,33 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.data.MerchBean;
+import com.supwisdom.dlpay.framework.data.SubjectInfoBean;
+import com.supwisdom.dlpay.framework.domain.TSubjectbal;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+import java.util.List;
+
+@Repository
+public interface SubjectbalDao extends JpaRepository<TSubjectbal, String> {
+
+ @Query(value = "select t.* from TB_SUBJECTBAL t left join ( select subjno from TB_SUBJECTDAY where accdate =:lastsettday) a on t.subjno=a.subjno where a.subjno is null ", nativeQuery = true)
+ List<TSubjectbal> getUnsettleSubjectbal(@Param("lastsettday") String lastsettday);
+
+ @Query(value = "select sum(BEGINDRBAL) as dramt,sum(BEGINCRBAL) as cramt from TB_SUBJECTBAL where SUBJNO in (select SUBJNO from TB_SUBJECT where fsubjno=:fsubjno) ", nativeQuery = true)
+ MerchBean getSubjectInfo(@Param("fsubjno") String fsubjno);
+
+ @Query(value = "select sa.subjno,sa.drbal,crbal,sb.subjtype,sb.balflag from TB_SUBJECTBAL sa,TB_SUBJECT sb where sa.subjno=sb.subjno and sb.endflag=1 order by sa.subjno ", nativeQuery = true)
+ List<SubjectInfoBean> getSubjectbalAndFlag();
+
+ @Query(value = "select case when :balflag=1 then sum(drbal) else sum(crbal) end as amount from tb_subjectbal where subjno in (select subjno from tb_subject where endflag=1 and balflag=:balflag )",nativeQuery = true)
+ Double getSumEndsubjectBalByEndflag(@Param("balflag")Integer balflag);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query("from TSubjectbal where subjno=:subjno ")
+ TSubjectbal getTSubjectbalBySubjnoWithLock(@Param("subjno")String subjno);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java
new file mode 100644
index 0000000..9a6a92c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java
@@ -0,0 +1,48 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.data.FSubjectInfoBean;
+import com.supwisdom.dlpay.framework.data.MerchBean;
+import com.supwisdom.dlpay.framework.domain.TSubjectday;
+import com.supwisdom.dlpay.framework.domain.TSubjectdayPK;
+import com.supwisdom.dlpay.system.bean.SubjectDayInfo;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SubjectdayDao extends JpaRepository<TSubjectday, TSubjectdayPK> {
+
+ @Query(value = "from TSubjectday where accdate=:accdate ")
+ List<TSubjectday> getAllByAccdate(@Param("accdate") String accdate);
+
+ @Query(value = "select a.subjno as shopaccno,a.begindrbal as dramt,a.begincrbal as cramt from TB_SUBJECTDAY a left join (select subjno from TB_SUBJECT where endflag=1) b on a.subjno=b.subjno where a.accdate=:accdate and b.subjno is not null ", nativeQuery = true)
+ List<MerchBean> getEndSubjectbalInfos(@Param("accdate") String accdate);
+
+ @Query(value = "from TSubjectday where accdate=:accdate and subjno=:subjno")
+ TSubjectday getSubjectDayById(@Param("accdate") String accdate, @Param("subjno") String subjno);
+
+ @Query(value = "from TSubjectday t where t.accdate=:accdate and t.subjno in (select subjno from TSubject where subjlevel=1 and endflag=0 ) ")
+ List<TSubjectday> getParentSubjectday(@Param("accdate") String accdate);
+
+ @Query(value = "select sum(sb.begindrbal) as begindrbal,sum(sb.begincrbal) as begincrbal,sum(sb.dramt) as dramt,sum(sb.cramt) as cramt,sum(sb.drbal) as drbal,sum(sb.crbal) as crbal " +
+ "from TB_SUBJECTDAY sb, TB_SUBJECT s " +
+ "where sb.accdate =:accdate and sb.subjno=s.subjno and s.subjlevel=2 and s.fsubjno=:fsubjno ", nativeQuery = true)
+ FSubjectInfoBean getParentSumInfo(@Param("accdate") String accdate, @Param("fsubjno") String fsubjno);
+
+ @Query(value = "select sum(begindrbal) as begindrbal,sum(begincrbal) as begincrbal,sum(dramt) as dramt,sum(cramt) as cramt,sum(drbal) as drbal,sum(crbal) as crbal " +
+ "from tb_subjectday where accdate=:accdate and subjno in (select subjno from tb_subject where subjlevel=1) ", nativeQuery = true)
+ FSubjectInfoBean getAllParentSubjectSumInfo(@Param("accdate") String accdate);
+
+ @Query(value = "SELECT t.subjno AS subjno, t.subjname AS subjname,t.fsubjno AS fsubjno,t.subjlevel AS subjlevel,t.displayflag, " +
+ "a.begindrbal AS lastdaydrbal,a.begincrbal AS lastdaycrbal, " +
+ "b.dramt AS dramt,b.cramt AS cramt,c.drbal AS drbal,c.crbal AS crbal " +
+ "FROM tb_subject t " +
+ "left join (SELECT t1.subjno,t1.begindrbal,t1.begincrbal FROM tb_subjectday t1 WHERE t1.accdate = :startdate ) a on t.subjno=a.subjno " +
+ "left join (SELECT t2.subjno,SUM(t2.dramt) dramt,SUM(t2.cramt) cramt FROM tb_subjectday t2 WHERE t2.accdate>=:startdate and t2.accdate<=:enddate GROUP BY t2.subjno) b on t.subjno=b.subjno " +
+ "left join (SELECT t3.subjno, t3.drbal, t3.crbal FROM tb_subjectday t3 WHERE t3.accdate = :enddate) c on t.subjno=c.subjno " +
+ "ORDER BY t.subjno asc ", nativeQuery = true)
+ List<SubjectDayInfo> getAllTSubjectday(@Param("startdate") String startdate, @Param("enddate") String enddate);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SysparaDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SysparaDao.java
new file mode 100644
index 0000000..b4f5da3
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SysparaDao.java
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TSyspara;
+import org.springframework.data.jpa.repository.*;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+import javax.persistence.QueryHint;
+
+@Repository
+public interface SysparaDao extends JpaRepository<TSyspara, Integer>, JpaSpecificationExecutor<TSyspara> {
+ TSyspara findByParaid(int paraid);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query(value = "from TSyspara where paraid=?1 ")
+ TSyspara findByParaidWithLock(int paraid);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="0")})
+ @Query(value = "from TSyspara where paraid=?1 ")
+ TSyspara findByParaidWithLockNowait(int paraid);
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TaskLockDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TaskLockDao.java
new file mode 100644
index 0000000..e1343d4
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TaskLockDao.java
@@ -0,0 +1,36 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.domain.TTaskLock;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+import javax.persistence.SequenceGenerator;
+
+@Repository
+public interface TaskLockDao extends JpaRepository<TTaskLock, String> {
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query("select a from TTaskLock a where a.taskcode=:taskcode")
+ TTaskLock getTaskLockWithLock(@Param("taskcode") String taskcode);
+
+ //================= database=Oracle =================//
+ @Query(value = "select to_char(sysdate,'yyyymmdd') as hostdate,to_char(sysdate,'hh24miss') as hosttime,to_char(sysdate,'yyyymmddhh24miss') as hostdatetime, sysdate from dual", nativeQuery = true)
+ SystemDateTime getOracleDatetime();
+
+ @Query(value = "select to_char(CURRENT_TIMESTAMP,'yyyymmdd') as hostdate," + "" +
+ "to_char(CURRENT_TIMESTAMP,'hh24miss') as hosttime,to_char(CURRENT_TIMESTAMP,'yyyymmddhh24miss') as hostdatetime," +
+ " CURRENT_TIMESTAMP as sysdate", nativeQuery = true)
+ SystemDateTime getPGDatetime();
+
+ @Query(value = " select to_char(sysdate,'yyyyMMddhh24miss')||to_char(SEQ_REFNO.nextval,'FM000000') as billno from dual ", nativeQuery = true)
+ String getOracleRefno();
+
+ //================= database=PG =================//
+ @Query(value = " select to_char(CURRENT_TIMESTAMP,'yyyyMMddhh24miss')||to_char(nextval('SEQ_REFNO'),'FM000000') as billno ", nativeQuery = true)
+ String getPgRefno();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TenantConfigDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TenantConfigDao.java
new file mode 100644
index 0000000..b52710e
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TenantConfigDao.java
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TTenantConfig;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TenantConfigDao extends CrudRepository<TTenantConfig, String> {
+ @Query("select t from TTenantConfig t where t.cfgid='main'")
+ TTenantConfig getDefault();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java
new file mode 100644
index 0000000..d40f266
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TTranscode;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TranscodeDao extends JpaRepository<TTranscode, Integer> {
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranstypeDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranstypeDao.java
new file mode 100644
index 0000000..a276c61
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranstypeDao.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TTranstype;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TranstypeDao extends JpaRepository<TTranstype, Integer> {
+ TTranstype findByTranstype(Integer transtype);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java
new file mode 100644
index 0000000..02f5bad
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java
@@ -0,0 +1,54 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.data.ExistBean;
+import com.supwisdom.dlpay.framework.data.MerchBean;
+import com.supwisdom.dlpay.framework.domain.TVoucher;
+import com.supwisdom.dlpay.system.bean.ShopBusinessInfo;
+import com.supwisdom.dlpay.system.bean.SubjectDetailShowBean;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+import java.util.List;
+
+@Repository
+public interface VoucherDao extends JpaRepository<TVoucher, Integer> {
+
+ @Query(value = "select count(t.voucherid) as existed from TB_VOUCHER t where t.POSTFLAG=0 ", nativeQuery = true)
+ ExistBean checkExistUnpostVouhcer();
+
+ @Modifying
+ @Query(value="delete from TB_VOUCHER where POSTFLAG=0 ",nativeQuery = true)
+ void deleteUnpostVoucher();
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query(value = "from TVoucher where postflag=0 order by voucherid ")
+ List<TVoucher> getSettleVouchers();
+
+ @Query(value="select va.accno as shopaccno,sum(va.dramt) as dramt,sum(va.cramt) as cramt " +
+ "from tb_voucherentry va,tb_voucher vb " +
+ "where va.voucherid=vb.voucherid and vb.voucherdate=:settledate and va.subjno='2004' and va.accno is not null " +
+ "group by va.accno order by va.accno ", nativeQuery = true)
+ List<MerchBean> getShopVoucherByAccdate(@Param("settledate")Integer settledate);
+
+ @Query(value = "select sum(va.dramt) as dramt, sum(va.cramt) as cramt from TB_VOUCHERENTRY va,TB_VOUCHER vb where va.voucherid=vb.voucherid and vb.voucherdate=:voucherdate and va.subjno=:subjno ", nativeQuery = true)
+ MerchBean getSettleSuminfo(@Param("voucherdate") Integer voucherdate, @Param("subjno") String subjno);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query(value = "from TVoucher where voucherid=:voucherid ")
+ TVoucher findByVoucheridWithLock(@Param("voucherid") Integer voucherid);
+
+ @Query(value = "select new com.supwisdom.dlpay.system.bean.SubjectDetailShowBean(a.voucherdate,a.voucherno,b.subjno,b.summary,b.dramt,b.cramt,b.balflag,b.balance,b.oppname) " +
+ "from TVoucher a,TVoucherEntry b where a.voucherid=b.voucherid and a.postflag=1 and a.voucherdate>=:startdate and a.voucherdate<=:enddate and b.subjno=:subjno order by a.voucherdate,a.voucherno ",
+ countQuery = "select count(a.voucherdate) from TVoucher a,TVoucherEntry b where a.voucherid=b.voucherid and a.postflag=1 and a.voucherdate>=:startdate and a.voucherdate<=:enddate and b.subjno=:subjno ")
+ Page<SubjectDetailShowBean> getSubjectDetailInfos(@Param("startdate") Integer startdate, @Param("enddate") Integer enddate, @Param("subjno") String subjno, Pageable pageable);
+
+ @Query("select new com.supwisdom.dlpay.system.bean.ShopBusinessInfo(b.accno,b.summary,sum(a.transcnt),sum(b.dramt),sum(b.cramt)) from TVoucher a,TVoucherEntry b where a.voucherid=b.voucherid and a.postflag=1 and a.sourcetype<>'jiekuan' and b.subjno='2004' and a.voucherdate>=:startdate and a.voucherdate<=:enddate group by b.accno,b.summary ")
+ List<ShopBusinessInfo> getShopBusinessInfos(@Param("startdate") Integer startdate, @Param("enddate") Integer enddate);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java
new file mode 100644
index 0000000..cfb8cfd
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TVoucherEntry;
+import com.supwisdom.dlpay.framework.domain.TVoucherEntryPK;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+import javax.persistence.LockModeType;
+import java.util.List;
+
+@Repository
+public interface VoucherEntryDao extends JpaRepository<TVoucherEntry,TVoucherEntryPK> {
+ @Modifying
+ @Query(value = "delete from TB_VOUCHERENTRY where VOUCHERID in (select VOUCHERID from TB_VOUCHER where POSTFLAG=0)", nativeQuery = true)
+ void deleteUnpostVoucherentry();
+
+ @Query(value = "from TVoucherEntry where voucherid in (select voucherid from TVoucher where voucherdate=:voucherdate) order by subjno,accno,voucherid ")
+ List<TVoucherEntry> getVoucherEntryByVoucherdate(@Param("voucherdate") Integer voucherdate);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query(value = "from TVoucherEntry t where t.voucherid=:voucherid ")
+ List<TVoucherEntry> getVoucherEntryByVoucherid(@Param("voucherid")Integer voucherid);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VouchernoCtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VouchernoCtlDao.java
new file mode 100644
index 0000000..7f81bf9
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VouchernoCtlDao.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TVouchernoCtl;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+
+@Repository
+public interface VouchernoCtlDao extends JpaRepository<TVouchernoCtl, Integer> {
+ @Modifying(clearAutomatically = true)
+ @Query(value = "update TB_VOUCHERNOCTL set PERIODMONTH=:peridmonth,VOUCHERNO=:voucherno where VOUCHERTYPE=1 ", nativeQuery = true)
+ void updateVoucherno(@Param("peridmonth") int peridmonth, @Param("voucherno") int voucherno);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query(value = "from TVouchernoCtl where vouchertype=1 ")
+ TVouchernoCtl getVoucherno();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/data/ExistBean.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/ExistBean.java
new file mode 100644
index 0000000..a7691fc
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/ExistBean.java
@@ -0,0 +1,5 @@
+package com.supwisdom.dlpay.framework.data;
+
+public interface ExistBean {
+ Integer getExisted();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/data/FSubjectInfoBean.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/FSubjectInfoBean.java
new file mode 100644
index 0000000..9de8cfd
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/FSubjectInfoBean.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.framework.data;
+
+public interface FSubjectInfoBean {
+ Double getBegindrbal();
+
+ Double getBegincrbal();
+
+ Double getDramt();
+
+ Double getCramt();
+
+ Double getDrbal();
+
+ Double getCrbal();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/data/MerchBean.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/MerchBean.java
new file mode 100644
index 0000000..daa74f1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/MerchBean.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.framework.data;
+
+public interface MerchBean {
+
+ String getShopaccno();
+
+ Double getDramt();
+
+ Double getCramt();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/data/NodeData.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/NodeData.java
new file mode 100644
index 0000000..8f4975a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/NodeData.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.data;
+
+public interface NodeData {
+ String getId();
+
+ String getPid();
+
+ String getName();
+
+ Integer getOpen();
+
+ Integer getChecked();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/data/SubjectInfoBean.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/SubjectInfoBean.java
new file mode 100644
index 0000000..aab4056
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/SubjectInfoBean.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.data;
+
+public interface SubjectInfoBean {
+ String getSubjno();
+
+ Double getDrbal();
+
+ Double getCrbal();
+
+ Integer getSubjtype();
+
+ Integer getBalflag();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
new file mode 100644
index 0000000..b876d9d
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.framework.data;
+
+import java.sql.Timestamp;
+
+public interface SystemDateTime {
+ String getHostdate();
+
+ String getHosttime();
+
+ String getHostdatetime();
+
+ Timestamp getSysdate();
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/data/VoucherTemp.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/VoucherTemp.java
new file mode 100644
index 0000000..ee4e4d4
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/VoucherTemp.java
@@ -0,0 +1,17 @@
+package com.supwisdom.dlpay.framework.data;
+
+public interface VoucherTemp {
+ String getDrsubjno();
+
+ String getDraccno();
+
+ String getCrsubjno();
+
+ String getCraccno();
+
+ String getSummary();
+
+ Integer getTranscnt();
+
+ Double getTransamt();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java
new file mode 100644
index 0000000..2904156
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java
@@ -0,0 +1,59 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.redis.core.RedisHash;
+
+
+@RedisHash("app_client")
+public class ApiClientRedis {
+ private @Id
+ String id;
+
+ String token;
+
+ String roles;
+
+ String loginTimestamp;
+
+ String tenantId;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getToken() {
+ return token;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+
+ public String getLoginTimestamp() {
+ return loginTimestamp;
+ }
+
+ public void setLoginTimestamp(String loginTimestamp) {
+ this.loginTimestamp = loginTimestamp;
+ }
+
+ public String getRoles() {
+ return roles;
+ }
+
+ public void setRoles(String roles) {
+ this.roles = roles;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/DictionaryTable.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/DictionaryTable.java
new file mode 100644
index 0000000..7d1d36a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/DictionaryTable.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.framework.domain;
+
+public interface DictionaryTable {
+ String getDictKey();
+
+ Object getDictValue();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java
new file mode 100644
index 0000000..d32ff8e
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.redis.core.RedisHash;
+import org.springframework.data.redis.core.TimeToLive;
+
+
+@RedisHash(value = "api_jwt")
+public class JwtRedis {
+ @Id
+ String jti;
+
+ String status;
+
+ String uid;
+
+ @TimeToLive
+ Long expiration;
+
+ public String getJti() {
+ return jti;
+ }
+
+ public void setJti(String jti) {
+ this.jti = jti;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public Long getExpiration() {
+ return expiration;
+ }
+
+ public void setExpiration(Long expiration) {
+ this.expiration = expiration;
+ }
+
+ public String getUid() {
+ return uid;
+ }
+
+ public void setUid(String uid) {
+ this.uid = uid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/PersonRedis.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/PersonRedis.java
new file mode 100644
index 0000000..623e55a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/PersonRedis.java
@@ -0,0 +1,58 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.redis.core.RedisHash;
+
+@RedisHash("person")
+public class PersonRedis {
+ @Id
+ String id;
+
+ String loginTimestamp;
+
+ String roles;
+
+ Boolean isAdmin;
+
+ String accessToken;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getLoginTimestamp() {
+ return loginTimestamp;
+ }
+
+ public void setLoginTimestamp(String loginTimestamp) {
+ this.loginTimestamp = loginTimestamp;
+ }
+
+ public String getRoles() {
+ return roles;
+ }
+
+ public void setRoles(String roles) {
+ this.roles = roles;
+ }
+
+ public Boolean getAdmin() {
+ return isAdmin;
+ }
+
+ public void setAdmin(Boolean admin) {
+ isAdmin = admin;
+ }
+
+ public String getAccessToken() {
+ return accessToken;
+ }
+
+ public void setAccessToken(String accessToken) {
+ this.accessToken = accessToken;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TApiClient.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TApiClient.java
new file mode 100644
index 0000000..9ffe634
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TApiClient.java
@@ -0,0 +1,90 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_APICLIENT")
+public class TApiClient {
+ @Id
+ @Column(name = "appid", nullable = false, length = 20)
+ private String appid;
+
+ @Column(name = "secret", nullable = false, length = 64)
+ private String secret;
+
+ @Column(name = "status", nullable = false, length = 10)
+ private String status;
+
+ @Column(name = "roles", length = 300)
+ private String roles;
+
+ @Column(name = "BCRYPT_SECRET", nullable = false, length = 64)
+ private String bcryptSecret;
+
+ @Column(name = "THIRDURL", length = 200)
+ private String thirdurl;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+
+ public String getAppid() {
+ return appid;
+ }
+
+ public void setAppid(String appid) {
+ this.appid = appid;
+ }
+
+ public String getSecret() {
+ return secret;
+ }
+
+ public void setSecret(String secret) {
+ this.secret = secret;
+ this.bcryptSecret = new BCryptPasswordEncoder().encode(secret);
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getRoles() {
+ return roles;
+ }
+
+ public void setRoles(String roles) {
+ this.roles = roles;
+ }
+
+ public String getBcryptSecret() {
+ return bcryptSecret;
+ }
+
+ public String getThirdurl() {
+ return thirdurl;
+ }
+
+ public void setThirdurl(String thirdurl) {
+ this.thirdurl = thirdurl;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java
new file mode 100644
index 0000000..a1e1209
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java
@@ -0,0 +1,54 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_BUSINESSPARA")
+public class TBusinesspara {
+ @Id
+ @Column(name="PARAKEY", nullable = false, length = 60)
+ private String parakey;
+
+ @Column(name="PARAVAL", length = 1000)
+ private String paraval;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public TBusinesspara() {
+ }
+
+ public TBusinesspara(String parakey, String paraval) {
+ this.parakey = parakey;
+ this.paraval = paraval;
+ }
+
+ public String getParakey() {
+ return parakey;
+ }
+
+ public void setParakey(String parakey) {
+ this.parakey = parakey;
+ }
+
+ public String getParaval() {
+ return paraval;
+ }
+
+ public void setParaval(String paraval) {
+ this.paraval = paraval;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionary.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionary.java
new file mode 100644
index 0000000..16c4a9a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionary.java
@@ -0,0 +1,70 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "TB_DICTIONARY")
+@IdClass(TDictionaryPK.class)
+public class TDictionary implements DictionaryTable, Serializable {
+ @Id
+ @Column(name = "DICTTYPE", nullable = false)
+ private String dicttype;
+
+ @Id
+ @Column(name = "DICTVAL", nullable = false, length = 30)
+ private String dictval;
+
+ @Column(name = "DICTTYPENAME", length = 60)
+ private String dicttypename;
+
+ @Column(name = "DICTCAPTION", length = 60)
+ private String dictcaption;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public String getDicttype() {
+ return dicttype;
+ }
+
+ public void setDicttype(String dicttype) {
+ this.dicttype = dicttype;
+ }
+
+ public String getDictval() {
+ return dictval;
+ }
+
+ public void setDictval(String dictval) {
+ this.dictval = dictval;
+ }
+
+ public String getDicttypename() {
+ return dicttypename;
+ }
+
+ public void setDicttypename(String dicttypename) {
+ this.dicttypename = dicttypename;
+ }
+
+ public String getDictcaption() {
+ return dictcaption;
+ }
+
+ public void setDictcaption(String dictcaption) {
+ this.dictcaption = dictcaption;
+ }
+
+ @Override
+ public String getDictKey() {
+ return this.dictval;
+ }
+
+ @Override
+ public Object getDictValue() {
+ return this.dictcaption;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionaryPK.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionaryPK.java
new file mode 100644
index 0000000..1dbb4c8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionaryPK.java
@@ -0,0 +1,50 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+public class TDictionaryPK implements Serializable {
+ @Id
+ @Column(name = "DICTTYPE", nullable = false)
+ private String dicttype;
+
+ @Id
+ @Column(name = "DICTVAL", nullable = false, length = 30)
+ private String dictval;
+
+ public String getDicttype() {
+ return dicttype;
+ }
+
+ public void setDicttype(String dicttype) {
+ this.dicttype = dicttype;
+ }
+
+ public String getDictval() {
+ return dictval;
+ }
+
+ public void setDictval(String dictval) {
+ this.dictval = dictval;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TDictionaryPK tDictionaryPK = (TDictionaryPK) o;
+ if (dicttype != null ? !dicttype.equals(tDictionaryPK.getDicttype()) : dicttype != null)
+ return false;
+ if (dictval != null ? !dictval.equals(tDictionaryPK.getDictval()) : dictval != null)
+ return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = dicttype != null ? dicttype.hashCode() : 0;
+ result = 31 * result + (dictval != null ? dictval.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TFeetypeConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TFeetypeConfig.java
new file mode 100644
index 0000000..ef85c21
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TFeetypeConfig.java
@@ -0,0 +1,70 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_FEETYPE_CONFIG")
+@IdClass(TFeetypeConfigPK.class)
+public class TFeetypeConfig {
+ @Id
+ @Column(name = "FEETYPE", nullable = false, length = 20)
+ private String feetype;
+
+ @Id
+ @Column(name = "PAYTYPE", nullable = false, length = 20)
+ private String paytype;
+
+ @Column(name = "DRSUBJNO", length = 10)
+ private String drsubjno;
+
+ @Column(name = "CRSUBJNO", length = 10)
+ private String crsubjno;
+
+ @Column(name = "SUMMARY", length = 200)
+ private String summary;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public String getFeetype() {
+ return feetype;
+ }
+
+ public void setFeetype(String feetype) {
+ this.feetype = feetype;
+ }
+
+ public String getPaytype() {
+ return paytype;
+ }
+
+ public void setPaytype(String paytype) {
+ this.paytype = paytype;
+ }
+
+ public String getDrsubjno() {
+ return drsubjno;
+ }
+
+ public void setDrsubjno(String drsubjno) {
+ this.drsubjno = drsubjno;
+ }
+
+ public String getCrsubjno() {
+ return crsubjno;
+ }
+
+ public void setCrsubjno(String crsubjno) {
+ this.crsubjno = crsubjno;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TFeetypeConfigPK.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TFeetypeConfigPK.java
new file mode 100644
index 0000000..92fbf6a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TFeetypeConfigPK.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+public class TFeetypeConfigPK implements Serializable {
+ @Id
+ @Column(name = "FEETYPE", nullable = false, length = 20)
+ private String feetype;
+
+ @Id
+ @Column(name = "PAYTYPE", nullable = false, length = 20)
+ private String paytype;
+
+ public String getFeetype() {
+ return feetype;
+ }
+
+ public void setFeetype(String feetype) {
+ this.feetype = feetype;
+ }
+
+ public String getPaytype() {
+ return paytype;
+ }
+
+ public void setPaytype(String paytype) {
+ this.paytype = paytype;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TFeetypeConfigPK tFeetypeConfigPK = (TFeetypeConfigPK) o;
+ if (feetype != null ? !feetype.equals(tFeetypeConfigPK.getFeetype()) : feetype != null)
+ return false;
+ if (paytype != null ? !paytype.equals(tFeetypeConfigPK.getPaytype()) : paytype != null)
+ return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = feetype != null ? feetype.hashCode() : 0;
+ result = 31 * result + (paytype != null ? paytype.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
new file mode 100644
index 0000000..594a258
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
@@ -0,0 +1,126 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "TB_FUNCTION")
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
+@SequenceGenerator(name = "SEQ_FUNC", sequenceName = "SEQ_FUNC", allocationSize = 1, initialValue = 1000)
+public class TFunction implements Serializable {
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_FUNC")
+ @Column(name = "ID", nullable = false)
+ private Integer id;
+
+ @Column(name = "PARENTID")
+ private Integer parentId;
+
+ @Column(name = "NAME", length = 32)
+ private String name;
+
+ @Column(name = "MENUURL", nullable = false, length = 60)
+ private String menuUrl; //菜单url
+
+ @Column(name = "ISLEAF", nullable = false, precision = 1)
+ private Integer isLeaf;
+
+ @Column(name = "ORDERNUM", precision = 9)
+ private Integer orderNum;
+
+ @Column(name = "MENUICON", precision = 9)
+ private String menuIcon;
+
+ @Column(name = "CREATETIME", length = 14)
+ private String createtime;
+
+ @Column(name = "LASTSAVED", length = 14)
+ private String lastsaved;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getParentId() {
+ return parentId;
+ }
+
+ public void setParentId(Integer parentId) {
+ this.parentId = parentId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getMenuUrl() {
+ return menuUrl;
+ }
+
+ public void setMenuUrl(String menuUrl) {
+ this.menuUrl = menuUrl;
+ }
+
+ public Integer getIsLeaf() {
+ return isLeaf;
+ }
+
+ public void setIsLeaf(Integer isLeaf) {
+ this.isLeaf = isLeaf;
+ }
+
+ public Integer getOrderNum() {
+ return orderNum;
+ }
+
+ public void setOrderNum(Integer orderNum) {
+ this.orderNum = orderNum;
+ }
+
+ public String getMenuIcon() {
+ return menuIcon;
+ }
+
+ public void setMenuIcon(String menuIcon) {
+ this.menuIcon = menuIcon;
+ }
+
+ public String getCreatetime() {
+ return createtime;
+ }
+
+ public void setCreatetime(String createtime) {
+ this.createtime = createtime;
+ }
+
+ public String getLastsaved() {
+ return lastsaved;
+ }
+
+ public void setLastsaved(String lastsaved) {
+ this.lastsaved = lastsaved;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperLog.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperLog.java
new file mode 100644
index 0000000..5fad64a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperLog.java
@@ -0,0 +1,112 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_OPER_LOG")
+public class TOperLog {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "ID", nullable = false, length = 32)
+ private String id;
+
+ @Column(name = "OPERID", nullable = false, length = 32)
+ private String operid;
+ @Column(name = "OPERNAME")
+ private String opername;
+
+ @Column(name = "RESNAME")
+ private String resname;
+
+ @Column(name = "RESPATH")
+ private String respath;
+
+ @Column(name = "LOGDATE")
+ private String logdate;
+
+ @Column(name = "FUNCTIONID")
+ private Integer functionid;
+
+ @Column(name = "FUNCTIONNAME")
+ private String functionname;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public Integer getFunctionid() {
+ return functionid;
+ }
+
+ public void setFunctionid(Integer functionid) {
+ this.functionid = functionid;
+ }
+
+ public String getFunctionname() {
+ return functionname;
+ }
+
+ public void setFunctionname(String functionname) {
+ this.functionname = functionname;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getOperid() {
+ return operid;
+ }
+
+ public void setOperid(String operid) {
+ this.operid = operid;
+ }
+
+ public String getOpername() {
+ return opername;
+ }
+
+ public void setOpername(String opername) {
+ this.opername = opername;
+ }
+
+ public String getResname() {
+ return resname;
+ }
+
+ public void setResname(String resname) {
+ this.resname = resname;
+ }
+
+ public String getRespath() {
+ return respath;
+ }
+
+ public void setRespath(String respath) {
+ this.respath = respath;
+ }
+
+ public String getLogdate() {
+ return logdate;
+ }
+
+ public void setLogdate(String logdate) {
+ this.logdate = logdate;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperRole.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperRole.java
new file mode 100644
index 0000000..54df513
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperRole.java
@@ -0,0 +1,61 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_OPER_ROLE",
+ indexes = {@Index(name = "operrole_operid_idx", columnList = "operid")})
+public class TOperRole {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "ID", nullable = false, length = 32)
+ private String id;
+
+ @Column(name = "ROLEID", length = 32)
+ @NotNull
+ private String roleId;
+
+ @Column(name = "OPERID", length = 32)
+ @NotNull
+ private String operid;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRoleId() {
+ return roleId;
+ }
+
+ public void setRoleId(String roleId) {
+ this.roleId = roleId;
+ }
+
+ public String getOperid() {
+ return operid;
+ }
+
+ public void setOperid(String operid) {
+ this.operid = operid;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
new file mode 100644
index 0000000..22fadc9
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
@@ -0,0 +1,243 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import com.supwisdom.dlpay.framework.util.TradeDict;
+import org.hibernate.annotations.GenericGenerator;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.util.Collection;
+
+@Entity
+@Table(name = "TB_OPERATOR",
+ indexes = {@Index(name = "opercode_idx", columnList = "OPERCODE", unique = true)})
+public class TOperator implements UserDetails {
+ private static final long serialVersionUID = 2148742269021236587L;
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "OPERID", nullable = false, length = 32)
+ private String operid;
+
+ @Column(name = "OPERCODE", length = 20)
+ @NotNull
+ private String opercode;
+
+ @Column(name = "OPERTYPE", length = 20)
+ @NotNull
+ private String opertype;
+
+ @Column(name = "OPERNAME", length = 100)
+ @NotNull
+ private String opername;
+
+ @Column(name = "OPERPWD", length = 80)
+ @NotNull
+ private String operpwd;
+
+ @Column(name = "STATUS", length = 32)
+ @NotNull
+ private String status;
+
+ @Column(name = "SEX", length = 10)
+ private String sex;
+
+ @Column(name = "MOBILE", length = 20)
+ private String mobile;
+
+ @Column(name = "EMAIL", length = 60)
+ private String email;
+
+ @Column(name = "OPENDATE", length = 8)
+ private String opendate;
+
+ @Column(name = "CLOSEDATE", length = 8)
+ private String closedate;
+ @Transient
+ private String roleids;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ @Column(name = "thirdadmin", length = 20)
+ @NotNull
+ private String thirdadmin;
+
+ @Transient
+ private Collection<? extends GrantedAuthority> authorities; //权限
+
+ public TOperator() {
+ }
+
+ public TOperator(String opercode, String opername) {
+ this.opercode = opercode;
+ this.opername = opername;
+ }
+
+ public TOperator(String opercode, String opertype, String opername, String operpwd, String status, String sex, String mobile, String email, String opendate, String closedate, Collection<? extends GrantedAuthority> authorities) {
+ this.opercode = opercode;
+ this.opertype = opertype;
+ this.opername = opername;
+ this.operpwd = operpwd;
+ this.status = status;
+ this.sex = sex;
+ this.mobile = mobile;
+ this.email = email;
+ this.opendate = opendate;
+ this.closedate = closedate;
+ this.authorities = authorities;
+ }
+
+ public String getOperid() {
+ return operid;
+ }
+
+ public void setOperid(String operid) {
+ this.operid = operid;
+ }
+
+ public String getOpercode() {
+ return opercode;
+ }
+
+ public void setOpercode(String opercode) {
+ this.opercode = opercode;
+ }
+
+ public String getOpertype() {
+ return opertype;
+ }
+
+ public void setOpertype(String opertype) {
+ this.opertype = opertype;
+ }
+
+ public String getOpername() {
+ return opername;
+ }
+
+ public void setOpername(String opername) {
+ this.opername = opername;
+ }
+
+ public String getOperpwd() {
+ return operpwd;
+ }
+
+ public void setOperpwd(String operpwd) {
+ this.operpwd = operpwd;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getSex() {
+ return sex;
+ }
+
+ public void setSex(String sex) {
+ this.sex = sex;
+ }
+
+ public String getMobile() {
+ return mobile;
+ }
+
+ public void setMobile(String mobile) {
+ this.mobile = mobile;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getOpendate() {
+ return opendate;
+ }
+
+ public void setOpendate(String opendate) {
+ this.opendate = opendate;
+ }
+
+ public String getClosedate() {
+ return closedate;
+ }
+
+ public void setClosedate(String closedate) {
+ this.closedate = closedate;
+ }
+
+ public void setAuthorities(Collection<? extends GrantedAuthority> authorities) {
+ this.authorities = authorities;
+ }
+
+ @Override
+ public Collection<? extends GrantedAuthority> getAuthorities() {
+ return this.authorities;
+ }
+
+ @Override
+ public String getPassword() {
+ return this.operpwd;
+ }
+
+ @Override
+ public String getUsername() {
+ return this.opercode;
+ }
+
+ @Override
+ public boolean isAccountNonExpired() {
+ return true; //账户不会过期
+ }
+
+ @Override
+ public boolean isAccountNonLocked() {
+ return !TradeDict.STATUS_LOCKED.equals(this.status); //true - 没锁定
+ }
+
+ @Override
+ public boolean isCredentialsNonExpired() {
+ return true; //TODO:密码是否未过期
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return !TradeDict.STATUS_CLOSED.equals(this.status); //注销操作员不启用
+ }
+
+ public String getRoleids() {
+ return roleids;
+ }
+
+ public void setRoleids(String roleids) {
+ this.roleids = roleids;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+
+ public String getThirdadmin() {
+ return thirdadmin;
+ }
+
+ public void setThirdadmin(String thirdadmin) {
+ this.thirdadmin = thirdadmin;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java
new file mode 100644
index 0000000..5d54268
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java
@@ -0,0 +1,81 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_PERIOD")
+@IdClass(TPeriodPK.class)
+public class TPeriod {
+ @Id
+ @Column(name = "PERIOD_YEAR", nullable = false, precision = 4)
+ private Integer periodYear;
+
+ @Id
+ @Column(name = "PERIOD_MONTH", nullable = false, precision = 2)
+ private Integer periodMonth;
+
+ @Column(name = "STARTDATE", length = 8)
+ @NotNull
+ private String startdate;
+
+ @Column(name = "ENDDATE", length = 8)
+ @NotNull
+ private String enddate;
+
+ @Column(name = "SETTLEFLAG", precision = 1)
+ @NotNull
+ private Integer settleflag = 0;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public Integer getPeriodYear() {
+ return periodYear;
+ }
+
+ public void setPeriodYear(Integer periodYear) {
+ this.periodYear = periodYear;
+ }
+
+ public Integer getPeriodMonth() {
+ return periodMonth;
+ }
+
+ public void setPeriodMonth(Integer periodMonth) {
+ this.periodMonth = periodMonth;
+ }
+
+ public String getStartdate() {
+ return startdate;
+ }
+
+ public void setStartdate(String startdate) {
+ this.startdate = startdate;
+ }
+
+ public String getEnddate() {
+ return enddate;
+ }
+
+ public void setEnddate(String enddate) {
+ this.enddate = enddate;
+ }
+
+ public Integer getSettleflag() {
+ return settleflag;
+ }
+
+ public void setSettleflag(Integer settleflag) {
+ this.settleflag = settleflag;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriodPK.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriodPK.java
new file mode 100644
index 0000000..e307db3
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriodPK.java
@@ -0,0 +1,52 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+public class TPeriodPK implements Serializable {
+
+ @Id
+ @Column(name="PERIOD_YEAR", nullable = false, precision = 4)
+ private Integer periodYear;
+
+ @Id
+ @Column(name="PERIOD_MONTH", nullable = false, precision = 2)
+ private Integer periodMonth;
+
+ public Integer getPeriodYear() {
+ return periodYear;
+ }
+
+ public void setPeriodYear(Integer periodYear) {
+ this.periodYear = periodYear;
+ }
+
+ public Integer getPeriodMonth() {
+ return periodMonth;
+ }
+
+ public void setPeriodMonth(Integer periodMonth) {
+ this.periodMonth = periodMonth;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TPeriodPK tPeriodPK = (TPeriodPK) o;
+ if (periodYear != null ? !periodYear.equals(tPeriodPK.getPeriodYear()) : periodYear != null)
+ return false;
+ if (periodMonth != null ? !periodMonth.equals(tPeriodPK.getPeriodMonth()) : periodMonth != null)
+ return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = periodYear != null ? periodYear.hashCode() : 0;
+ result = 31 * result + (periodMonth != null ? periodMonth.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java
new file mode 100644
index 0000000..e6fd9e1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java
@@ -0,0 +1,71 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_PERMISSION")
+public class TPermission {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "ID", nullable = false, length = 32)
+ private String id;
+
+ @Column(name = "ROLE_FUNC_ID", length = 32)
+ private String roleFuncId;
+
+ @Column(name = "RESID")
+ @NotNull
+ private Integer resid;
+
+ @Column(name = "ROLEID", length = 32)
+ @NotNull
+ private String roleId;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public String getRoleId() {
+ return roleId;
+ }
+
+ public void setRoleId(String roleId) {
+ this.roleId = roleId;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRoleFuncId() {
+ return roleFuncId;
+ }
+
+ public void setRoleFuncId(String roleFuncId) {
+ this.roleFuncId = roleFuncId;
+ }
+
+ public Integer getResid() {
+ return resid;
+ }
+
+ public void setResid(Integer resid) {
+ this.resid = resid;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
new file mode 100644
index 0000000..9658a21
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
@@ -0,0 +1,80 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_RESOURCE")
+@SequenceGenerator(name = "SEQ_RES", sequenceName = "SEQ_RES", allocationSize = 1)
+public class TResource {
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_RES")
+ @Column(name = "ID", nullable = false, length = 9)
+ private Integer id;
+
+ @Column(name = "CODE", length = 32)
+ @NotNull
+ private String code;
+
+ @Column(name = "NAME", length = 32)
+ private String name;
+
+ @Column(name = "URI", length = 32)
+ private String uri;
+
+ @Column(name = "FUNCTION_ID", length = 32)
+ @NotNull
+ private Integer functionId;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getUri() {
+ return uri;
+ }
+
+ public void setUri(String uri) {
+ this.uri = uri;
+ }
+
+ public Integer getFunctionId() {
+ return functionId;
+ }
+
+ public void setFunctionId(Integer functionId) {
+ this.functionId = functionId;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TRole.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TRole.java
new file mode 100644
index 0000000..1ee94c3
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TRole.java
@@ -0,0 +1,106 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_ROLE")
+public class TRole {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "ROLEID", nullable = false, length = 32)
+ private String roleId;
+
+ @Column(name = "ROLENAME", length = 60)
+ @NotNull
+ private String roleName;
+
+ @Column(name = "ROLECODE", length = 20)
+ @NotNull
+ private String roleCode;
+
+ @Column(name = "ROLEDESC", length = 60)
+ private String roleDesc;
+
+ @Column(name = "EDITFLAG", length = 60)
+ @NotNull
+ private Integer editflag;
+
+ @Column(name = "CREATETIME", length = 14)
+ @NotNull
+ private String createtime;
+
+ @Column(name = "LASTSAVED", length = 14)
+ private String lastsaved;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public String getRoleId() {
+ return roleId;
+ }
+
+ public void setRoleId(String roleId) {
+ this.roleId = roleId;
+ }
+
+ public String getRoleName() {
+ return roleName;
+ }
+
+ public void setRoleName(String roleName) {
+ this.roleName = roleName;
+ }
+
+ public String getRoleCode() {
+ return roleCode;
+ }
+
+ public void setRoleCode(String roleCode) {
+ this.roleCode = roleCode;
+ }
+
+ public String getRoleDesc() {
+ return roleDesc;
+ }
+
+ public void setRoleDesc(String roleDesc) {
+ this.roleDesc = roleDesc;
+ }
+
+ public Integer getEditflag() {
+ return editflag;
+ }
+
+ public void setEditflag(Integer editflag) {
+ this.editflag = editflag;
+ }
+
+ public String getCreatetime() {
+ return createtime;
+ }
+
+ public void setCreatetime(String createtime) {
+ this.createtime = createtime;
+ }
+
+ public String getLastsaved() {
+ return lastsaved;
+ }
+
+ public void setLastsaved(String lastsaved) {
+ this.lastsaved = lastsaved;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java
new file mode 100644
index 0000000..911ca71
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java
@@ -0,0 +1,71 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_ROLE_FUNCTION")
+public class TRoleFunction {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "ID", nullable = false, length = 32)
+ private String id;
+
+ @Column(name = "ROLEID", length = 32)
+ @NotNull
+ private String roleId;
+
+ @Column(name = "FUNCTIONID", length = 32)
+ @NotNull
+ private Integer functionId;
+
+ @Column(name = "PERMISSIONS", length = 200)
+ private String permissions;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRoleId() {
+ return roleId;
+ }
+
+ public void setRoleId(String roleId) {
+ this.roleId = roleId;
+ }
+
+ public Integer getFunctionId() {
+ return functionId;
+ }
+
+ public void setFunctionId(Integer functionId) {
+ this.functionId = functionId;
+ }
+
+ public String getPermissions() {
+ return permissions;
+ }
+
+ public void setPermissions(String permissions) {
+ this.permissions = permissions;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettleLog.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettleLog.java
new file mode 100644
index 0000000..1953d2f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettleLog.java
@@ -0,0 +1,86 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SETTLE_LOG")
+public class TSettleLog {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "ID", nullable = false, length = 32)
+ private String id;
+
+ @Column(name = "STARTTIME", length = 14)
+ private String starttime;
+
+ @Column(name = "ENDTIME", length = 14)
+ private String endtime;
+
+ @Column(name = "ERRCODE", length = 10)
+ private String errcode;
+
+ @Column(name = "ERRMSG", length = 600)
+ private String errmsg;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getStarttime() {
+ return starttime;
+ }
+
+ public void setStarttime(String starttime) {
+ this.starttime = starttime;
+ }
+
+ public String getEndtime() {
+ return endtime;
+ }
+
+ public void setEndtime(String endtime) {
+ this.endtime = endtime;
+ }
+
+ public String getErrcode() {
+ return errcode;
+ }
+
+ public void setErrcode(String errcode) {
+ this.errcode = errcode;
+ }
+
+ public String getErrmsg() {
+ return errmsg;
+ }
+
+ public void setErrmsg(String errmsg) {
+ this.errmsg = errmsg;
+ }
+
+ public TSettleLog update(String errcode, String errmsg) {
+ this.errcode = errcode;
+ this.errmsg = errmsg;
+ return this;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
new file mode 100644
index 0000000..aa0a515
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
@@ -0,0 +1,101 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SETTLECTL")
+public class TSettlectl {
+ @Id
+ @Column(name="BOOKSETNO", nullable = false, precision = 2)
+ private Integer booksetno;
+
+ @Column(name="PERIODYEAR", nullable = false, precision = 4)
+ private Integer periodYear;
+
+ @Column(name="PERIODMONTH", nullable = false, precision = 2)
+ private Integer periodMonth;
+
+ @Column(name="STATDATE", precision = 8)
+ private Integer statdate;
+
+ @Column(name="SETTLEDATE",nullable = false, precision = 8)
+ private Integer settledate;
+
+ @Column(name="STATUS", nullable = false, precision = 1)
+ private Integer status;
+
+ @Column(name="UPDTIME", length = 14)
+ private String updtime;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public Integer getBooksetno() {
+ return booksetno;
+ }
+
+ public void setBooksetno(Integer booksetno) {
+ this.booksetno = booksetno;
+ }
+
+ public Integer getPeriodYear() {
+ return periodYear;
+ }
+
+ public void setPeriodYear(Integer periodYear) {
+ this.periodYear = periodYear;
+ }
+
+ public Integer getPeriodMonth() {
+ return periodMonth;
+ }
+
+ public void setPeriodMonth(Integer periodMonth) {
+ this.periodMonth = periodMonth;
+ }
+
+ public Integer getStatdate() {
+ return statdate;
+ }
+
+ public void setStatdate(Integer statdate) {
+ this.statdate = statdate;
+ }
+
+ public Integer getSettledate() {
+ return settledate;
+ }
+
+ public void setSettledate(Integer settledate) {
+ this.settledate = settledate;
+ }
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+ public String getUpdtime() {
+ return updtime;
+ }
+
+ public void setUpdtime(String updtime) {
+ this.updtime = updtime;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShop.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShop.java
new file mode 100644
index 0000000..49b5df7
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShop.java
@@ -0,0 +1,238 @@
+package com.supwisdom.dlpay.framework.domain;
+
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SHOP",
+ indexes = {@Index(name = "shop_shopaccno_idx", columnList = "shopaccno")})
+public class TShop {
+ @Id
+ @SequenceGenerator(name = "shopid", sequenceName = "SEQ_SHOP", allocationSize = 1, initialValue = 10)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "shopid")
+ @Column(name = "SHOPID", nullable = false, precision = 9)
+ private Integer shopid;
+
+ @Column(name = "FSHOPID", precision = 9)
+ private Integer fshopid;
+
+ @Column(name = "SHOPNAME", length = 200)
+ private String shopname;
+
+ @Column(name = "SHOPTYPE", precision = 1)
+ private Integer shoptype;
+
+ @Column(name = "STATUS", length = 20)
+ @NotNull
+ private String status;
+
+ @Column(name = "SHOPACCNO", length = 20)
+ private String shopaccno;
+
+ @Column(name = "CONTACTMAN", length = 60)
+ private String contactman;
+
+ @Column(name = "IDTYPE", length = 1)
+ private String idtype;
+
+ @Column(name = "IDNO", length = 60)
+ private String idno;
+
+ @Column(name = "TEL", length = 20)
+ private String tel;
+
+ @Column(name = "MOBILE", length = 30)
+ private String mobile;
+
+ @Column(name = "EMAIL", length = 60)
+ private String email;
+
+ @Column(name = "ADDR", length = 240)
+ private String addr;
+
+ @Column(name = "ZIPCODE", length = 10)
+ private String zipcode;
+
+ @Column(name = "OPENDATE", length = 8)
+ private String opendate;
+
+ @Column(name = "CLOSEDATE", length = 8)
+ private String closedate;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ /**
+ * 第三方唯一ID
+ */
+ @Column(name = "THIRD_UNIQUE_IDENTY", length = 200)
+ private String thirdUniqueIdenty;
+
+ public TShop() {
+ }
+
+ public TShop(Integer fshopid, String shopname, Integer shoptype, String status, String shopaccno, String contactman, String idtype, String idno, String tel, String mobile, String email, String addr, String zipcode, String opendate, String closedate, String thirdUniqueIdenty) {
+ this.fshopid = fshopid;
+ this.shopname = shopname;
+ this.shoptype = shoptype;
+ this.status = status;
+ this.shopaccno = shopaccno;
+ this.contactman = contactman;
+ this.idtype = idtype;
+ this.idno = idno;
+ this.tel = tel;
+ this.mobile = mobile;
+ this.email = email;
+ this.addr = addr;
+ this.zipcode = zipcode;
+ this.opendate = opendate;
+ this.closedate = closedate;
+ this.thirdUniqueIdenty = thirdUniqueIdenty;
+ }
+
+ public String getThirdUniqueIdenty() {
+ return thirdUniqueIdenty;
+ }
+
+ public void setThirdUniqueIdenty(String thirdUniqueIdenty) {
+ this.thirdUniqueIdenty = thirdUniqueIdenty;
+ }
+
+ public Integer getShopid() {
+ return shopid;
+ }
+
+ public void setShopid(Integer shopid) {
+ this.shopid = shopid;
+ }
+
+ public Integer getFshopid() {
+ return fshopid;
+ }
+
+ public void setFshopid(Integer fshopid) {
+ this.fshopid = fshopid;
+ }
+
+ public String getShopname() {
+ return shopname;
+ }
+
+ public void setShopname(String shopname) {
+ this.shopname = shopname;
+ }
+
+ public Integer getShoptype() {
+ return shoptype;
+ }
+
+ public void setShoptype(Integer shoptype) {
+ this.shoptype = shoptype;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getContactman() {
+ return contactman;
+ }
+
+ public void setContactman(String contactman) {
+ this.contactman = contactman;
+ }
+
+ public String getIdtype() {
+ return idtype;
+ }
+
+ public void setIdtype(String idtype) {
+ this.idtype = idtype;
+ }
+
+ public String getIdno() {
+ return idno;
+ }
+
+ public void setIdno(String idno) {
+ this.idno = idno;
+ }
+
+ public String getTel() {
+ return tel;
+ }
+
+ public void setTel(String tel) {
+ this.tel = tel;
+ }
+
+ public String getMobile() {
+ return mobile;
+ }
+
+ public void setMobile(String mobile) {
+ this.mobile = mobile;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getAddr() {
+ return addr;
+ }
+
+ public void setAddr(String addr) {
+ this.addr = addr;
+ }
+
+ public String getZipcode() {
+ return zipcode;
+ }
+
+ public void setZipcode(String zipcode) {
+ this.zipcode = zipcode;
+ }
+
+ public String getOpendate() {
+ return opendate;
+ }
+
+ public void setOpendate(String opendate) {
+ this.opendate = opendate;
+ }
+
+ public String getClosedate() {
+ return closedate;
+ }
+
+ public void setClosedate(String closedate) {
+ this.closedate = closedate;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShopacc.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShopacc.java
new file mode 100644
index 0000000..fe9c1d1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShopacc.java
@@ -0,0 +1,142 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "TB_SHOPACC")
+public class TShopacc {
+ @Id
+ @Column(name = "SHOPACCNO", length = 10)
+ private String shopaccno;
+
+ @Column(name = "SHOPID", precision = 9)
+ private Integer shopid;
+
+ @Column(name = "SHOPNAME", length = 200)
+ private String shopname;
+
+ @Column(name = "SUBJNO", length = 10)
+ @NotNull
+ private String subjno;
+
+ @Column(name = "STATUS", length = 20)
+ @NotNull
+ private String status;
+
+ @Column(name = "OPENDATE", length = 8)
+ @NotNull
+ private String opendate;
+
+ @Column(name = "CLOSEDATE", length = 8)
+ private String closedate;
+
+ @Column(name = "BALANCE", length = 15, precision = 2)
+ @NotNull
+ private Double balance = 0.0;
+
+ @Version
+ @Column(name = "LASTUPDATE", nullable = false)
+ private Timestamp lastUpdate = new Timestamp(System.currentTimeMillis());
+
+ @Column(name = "MAC")
+ private String mac;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public Integer getShopid() {
+ return shopid;
+ }
+
+ public void setShopid(Integer shopid) {
+ this.shopid = shopid;
+ }
+
+ public String getShopname() {
+ return shopname;
+ }
+
+ public void setShopname(String shopname) {
+ this.shopname = shopname;
+ }
+
+ public String getSubjno() {
+ return subjno;
+ }
+
+ public void setSubjno(String subjno) {
+ this.subjno = subjno;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getOpendate() {
+ return opendate;
+ }
+
+ public void setOpendate(String opendate) {
+ this.opendate = opendate;
+ }
+
+ public String getClosedate() {
+ return closedate;
+ }
+
+ public void setClosedate(String closedate) {
+ this.closedate = closedate;
+ }
+
+ public void setBalance(Double balance) {
+ this.balance = balance;
+ }
+
+ public Double getBalance() {
+ return balance;
+ }
+
+ public String getMac() {
+ return mac;
+ }
+
+ public void setMac(String mac) {
+ this.mac = mac;
+ }
+
+ public void incrOrDecrBalance(Double amount) {
+ this.balance += amount;
+ this.lastUpdate = new Timestamp(System.currentTimeMillis());
+ }
+
+ public Timestamp getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(Timestamp lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShopaccday.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShopaccday.java
new file mode 100644
index 0000000..d08d22f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShopaccday.java
@@ -0,0 +1,148 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SHOPACCDAY")
+@IdClass(TShopaccdayPK.class)
+public class TShopaccday {
+ @Id
+ @Column(name="ACCDATE", nullable = false, length = 8)
+ private String accdate;
+
+ @Id
+ @Column(name="SHOPACCNO", nullable = false, length = 10)
+ private String shopaccno;
+
+ @Column(name="PERIOD_YEAR", precision = 8)
+ private Integer periodYear;
+
+ @Column(name="PERIOD_MONTH", precision = 2)
+ private Integer periodMonth;
+
+ @Column(name="BEGINBAL", precision = 15, scale = 2)
+ private Double beginbal;
+
+ @Column(name="DRAMT", precision = 15, scale = 2)
+ private Double dramt;
+
+ @Column(name="CRAMT", precision = 15, scale = 2)
+ private Double cramt;
+
+ @Column(name="BALANCE", precision = 15, scale = 2)
+ private Double balance;
+
+ @Column(name="UPDTIME", precision = 15, scale = 2)
+ private String updtime;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public TShopaccday() {
+ }
+
+ public TShopaccday(String accdate, String shopaccno, Integer periodYear, Integer periodMonth, Double beginbal, Double dramt, Double cramt, Double balance) {
+ this.accdate = accdate;
+ this.shopaccno = shopaccno;
+ this.periodYear = periodYear;
+ this.periodMonth = periodMonth;
+ this.beginbal = beginbal;
+ this.dramt = dramt;
+ this.cramt = cramt;
+ this.balance = balance;
+ }
+
+ public TShopaccday(String accdate, String shopaccno, Integer periodYear, Integer periodMonth, Double beginbal, Double dramt, Double cramt, Double balance, String updtime) {
+ this.accdate = accdate;
+ this.shopaccno = shopaccno;
+ this.periodYear = periodYear;
+ this.periodMonth = periodMonth;
+ this.beginbal = beginbal;
+ this.dramt = dramt;
+ this.cramt = cramt;
+ this.balance = balance;
+ this.updtime = updtime;
+ }
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public Integer getPeriodYear() {
+ return periodYear;
+ }
+
+ public void setPeriodYear(Integer periodYear) {
+ this.periodYear = periodYear;
+ }
+
+ public Integer getPeriodMonth() {
+ return periodMonth;
+ }
+
+ public void setPeriodMonth(Integer periodMonth) {
+ this.periodMonth = periodMonth;
+ }
+
+ public Double getBeginbal() {
+ return beginbal;
+ }
+
+ public void setBeginbal(Double beginbal) {
+ this.beginbal = beginbal;
+ }
+
+ public Double getDramt() {
+ return dramt;
+ }
+
+ public void setDramt(Double dramt) {
+ this.dramt = dramt;
+ }
+
+ public Double getCramt() {
+ return cramt;
+ }
+
+ public void setCramt(Double cramt) {
+ this.cramt = cramt;
+ }
+
+ public Double getBalance() {
+ return balance;
+ }
+
+ public void setBalance(Double balance) {
+ this.balance = balance;
+ }
+
+ public String getUpdtime() {
+ return updtime;
+ }
+
+ public void setUpdtime(String updtime) {
+ this.updtime = updtime;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShopaccdayPK.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShopaccdayPK.java
new file mode 100644
index 0000000..8ebf93b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShopaccdayPK.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+public class TShopaccdayPK implements Serializable {
+ @Id
+ @Column(name="ACCDATE", nullable = false, length = 8)
+ private String accdate;
+
+ @Id
+ @Column(name="SHOPACCNO", nullable = false, length = 10)
+ private String shopaccno;
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TShopaccdayPK tShopaccdayPK = (TShopaccdayPK) o;
+ if (accdate != null ? !accdate.equals(tShopaccdayPK.getAccdate()) : accdate != null)
+ return false;
+ if (shopaccno != null ? !shopaccno.equals(tShopaccdayPK.getShopaccno()) : shopaccno != null)
+ return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = accdate != null ? accdate.hashCode() : 0;
+ result = 31 * result + (shopaccno != null ? shopaccno.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubject.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubject.java
new file mode 100644
index 0000000..fa1554c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubject.java
@@ -0,0 +1,124 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SUBJECT")
+public class TSubject {
+ @Id
+ @Column(name = "SUBJNO", nullable = false, length = 10)
+ private String subjno;
+
+ @Column(name = "SUBJNAME", length = 60)
+ @NotNull
+ private String subjname;
+
+ @Column(name = "SUBJTYPE", precision = 1)
+ private Integer subjtype;
+
+ @Column(name = "BALFLAG", precision = 1)
+ private Integer balflag;
+
+ @Column(name = "FSUBJNO", length = 10)
+ private String fsubjno;
+
+ @Column(name = "SUBJLEVEL", precision = 1)
+ private Integer subjlevel;
+
+ @Column(name = "ENDFLAG", precision = 1)
+ private Integer endflag;
+
+ @Column(name = "OPENDATE", precision = 8)
+ private Integer opendate;
+
+ @Column(name = "DISPLAYFLAG", length = 1)
+ private String displayflag;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public String getSubjno() {
+ return subjno;
+ }
+
+ public void setSubjno(String subjno) {
+ this.subjno = subjno;
+ }
+
+ public String getSubjname() {
+ return subjname;
+ }
+
+ public void setSubjname(String subjname) {
+ this.subjname = subjname;
+ }
+
+ public Integer getSubjtype() {
+ return subjtype;
+ }
+
+ public void setSubjtype(Integer subjtype) {
+ this.subjtype = subjtype;
+ }
+
+ public Integer getBalflag() {
+ return balflag;
+ }
+
+ public void setBalflag(Integer balflag) {
+ this.balflag = balflag;
+ }
+
+ public String getFsubjno() {
+ return fsubjno;
+ }
+
+ public void setFsubjno(String fsubjno) {
+ this.fsubjno = fsubjno;
+ }
+
+ public Integer getSubjlevel() {
+ return subjlevel;
+ }
+
+ public void setSubjlevel(Integer subjlevel) {
+ this.subjlevel = subjlevel;
+ }
+
+ public Integer getEndflag() {
+ return endflag;
+ }
+
+ public void setEndflag(Integer endflag) {
+ this.endflag = endflag;
+ }
+
+ public Integer getOpendate() {
+ return opendate;
+ }
+
+ public void setOpendate(Integer opendate) {
+ this.opendate = opendate;
+ }
+
+ public String getDisplayflag() {
+ return displayflag;
+ }
+
+ public void setDisplayflag(String displayflag) {
+ this.displayflag = displayflag;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectbal.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectbal.java
new file mode 100644
index 0000000..f58c591
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectbal.java
@@ -0,0 +1,186 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SUBJECTBAL")
+public class TSubjectbal {
+ @Id
+ @Column(name = "SUBJNO", nullable = false, length = 10)
+ private String subjno;
+
+ @Column(name = "ACCUMDRAMT", precision = 15, scale = 2)
+ private Double accumdramt;
+
+ @Column(name = "ACCUMCRAMT", precision = 15, scale = 2)
+ private Double accumcramt;
+
+ @Column(name = "BEGINDRBAL", precision = 15, scale = 2)
+ private Double begindrbal;
+
+ @Column(name = "BEGINCRBAL", precision = 15, scale = 2)
+ private Double begincrbal;
+
+ @Column(name = "DRAMT", precision = 15, scale = 2)
+ private Double dramt;
+
+ @Column(name = "CRAMT", precision = 15, scale = 2)
+ private Double cramt;
+
+ @Column(name = "DRBAL", precision = 15, scale = 2)
+ private Double drbal;
+
+ @Column(name = "CRBAL", precision = 15, scale = 2)
+ private Double crbal;
+
+ @Column(name = "UPDTIME", length = 14)
+ private String updtime;
+
+ @Column(name = "LASTSETTLEDAY", length = 8)
+ private Integer lastsettleday;
+
+ @Column(name = "ACCUMSETTLEAMT", precision = 15, scale = 2)
+ private Double accumsettleamt;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public TSubjectbal() {
+ }
+
+ public TSubjectbal(String subjno) {
+ this.subjno = subjno;
+ this.accumdramt = 0D;
+ this.accumcramt = 0D;
+ this.begindrbal = 0D;
+ this.begincrbal = 0D;
+ this.dramt = 0D;
+ this.cramt = 0D;
+ this.drbal = 0D;
+ this.crbal = 0D;
+ }
+
+ public TSubjectbal(String subjno, Double accumdramt, Double accumcramt, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String updtime, Integer lastsettleday, Double accumsettleamt) {
+ this.subjno = subjno;
+ this.accumdramt = accumdramt;
+ this.accumcramt = accumcramt;
+ this.begindrbal = begindrbal;
+ this.begincrbal = begincrbal;
+ this.dramt = dramt;
+ this.cramt = cramt;
+ this.drbal = drbal;
+ this.crbal = crbal;
+ this.updtime = updtime;
+ this.lastsettleday = lastsettleday;
+ this.accumsettleamt = accumsettleamt;
+ }
+
+ public String getSubjno() {
+ return subjno;
+ }
+
+ public void setSubjno(String subjno) {
+ this.subjno = subjno;
+ }
+
+ public Double getAccumdramt() {
+ return accumdramt;
+ }
+
+ public void setAccumdramt(Double accumdramt) {
+ this.accumdramt = accumdramt;
+ }
+
+ public Double getAccumcramt() {
+ return accumcramt;
+ }
+
+ public void setAccumcramt(Double accumcramt) {
+ this.accumcramt = accumcramt;
+ }
+
+ public Double getBegindrbal() {
+ return begindrbal;
+ }
+
+ public void setBegindrbal(Double begindrbal) {
+ this.begindrbal = begindrbal;
+ }
+
+ public Double getBegincrbal() {
+ return begincrbal;
+ }
+
+ public void setBegincrbal(Double begincrbal) {
+ this.begincrbal = begincrbal;
+ }
+
+ public Double getDramt() {
+ return dramt;
+ }
+
+ public void setDramt(Double dramt) {
+ this.dramt = dramt;
+ }
+
+ public Double getCramt() {
+ return cramt;
+ }
+
+ public void setCramt(Double cramt) {
+ this.cramt = cramt;
+ }
+
+ public Double getDrbal() {
+ return drbal;
+ }
+
+ public void setDrbal(Double drbal) {
+ this.drbal = drbal;
+ }
+
+ public Double getCrbal() {
+ return crbal;
+ }
+
+ public void setCrbal(Double crbal) {
+ this.crbal = crbal;
+ }
+
+ public String getUpdtime() {
+ return updtime;
+ }
+
+ public void setUpdtime(String updtime) {
+ this.updtime = updtime;
+ }
+
+ public Integer getLastsettleday() {
+ return lastsettleday;
+ }
+
+ public void setLastsettleday(Integer lastsettleday) {
+ this.lastsettleday = lastsettleday;
+ }
+
+ public Double getAccumsettleamt() {
+ return accumsettleamt;
+ }
+
+ public void setAccumsettleamt(Double accumsettleamt) {
+ this.accumsettleamt = accumsettleamt;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectday.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectday.java
new file mode 100644
index 0000000..eedf9b5
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectday.java
@@ -0,0 +1,174 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SUBJECTDAY")
+@IdClass(TSubjectdayPK.class)
+public class TSubjectday {
+ @Id
+ @Column(name="ACCDATE", nullable = false, length = 8)
+ private String accdate;
+
+ @Id
+ @Column(name="SUBJNO", nullable = false, length = 10)
+ private String subjno;
+
+ @Column(name="PERIOD_YEAR", precision = 4)
+ private Integer periodYear;
+
+ @Column(name="PERIOD_MONTH", precision = 2)
+ private Integer periodMonth;
+
+ @Column(name="BEGINDRBAL", precision = 15, scale = 2)
+ private Double begindrbal;
+
+ @Column(name="BEGINCRBAL", precision = 15, scale = 2)
+ private Double begincrbal;
+
+ @Column(name="DRAMT", precision = 15, scale = 2)
+ private Double dramt;
+
+ @Column(name="CRAMT", precision = 15, scale = 2)
+ private Double cramt;
+
+ @Column(name="DRBAL", precision = 15, scale = 2)
+ private Double drbal;
+
+ @Column(name="CRBAL", precision = 15, scale = 2)
+ private Double crbal;
+
+ @Column(name="UPDTIME", precision = 15, scale = 2)
+ private String updtime;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public TSubjectday() {
+ }
+
+ public TSubjectday(String accdate, String subjno, Integer periodYear, Integer periodMonth, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal) {
+ this.accdate = accdate;
+ this.subjno = subjno;
+ this.periodYear = periodYear;
+ this.periodMonth = periodMonth;
+ this.begindrbal = begindrbal;
+ this.begincrbal = begincrbal;
+ this.dramt = dramt;
+ this.cramt = cramt;
+ this.drbal = drbal;
+ this.crbal = crbal;
+ }
+
+ public TSubjectday(String accdate, String subjno, Integer periodYear, Integer periodMonth, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String updtime) {
+ this.accdate = accdate;
+ this.subjno = subjno;
+ this.periodYear = periodYear;
+ this.periodMonth = periodMonth;
+ this.begindrbal = begindrbal;
+ this.begincrbal = begincrbal;
+ this.dramt = dramt;
+ this.cramt = cramt;
+ this.drbal = drbal;
+ this.crbal = crbal;
+ this.updtime = updtime;
+ }
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ public String getSubjno() {
+ return subjno;
+ }
+
+ public void setSubjno(String subjno) {
+ this.subjno = subjno;
+ }
+
+ public Integer getPeriodYear() {
+ return periodYear;
+ }
+
+ public void setPeriodYear(Integer periodYear) {
+ this.periodYear = periodYear;
+ }
+
+ public Integer getPeriodMonth() {
+ return periodMonth;
+ }
+
+ public void setPeriodMonth(Integer periodMonth) {
+ this.periodMonth = periodMonth;
+ }
+
+ public Double getBegindrbal() {
+ return begindrbal;
+ }
+
+ public void setBegindrbal(Double begindrbal) {
+ this.begindrbal = begindrbal;
+ }
+
+ public Double getBegincrbal() {
+ return begincrbal;
+ }
+
+ public void setBegincrbal(Double begincrbal) {
+ this.begincrbal = begincrbal;
+ }
+
+ public Double getDramt() {
+ return dramt;
+ }
+
+ public void setDramt(Double dramt) {
+ this.dramt = dramt;
+ }
+
+ public Double getCramt() {
+ return cramt;
+ }
+
+ public void setCramt(Double cramt) {
+ this.cramt = cramt;
+ }
+
+ public Double getDrbal() {
+ return drbal;
+ }
+
+ public void setDrbal(Double drbal) {
+ this.drbal = drbal;
+ }
+
+ public Double getCrbal() {
+ return crbal;
+ }
+
+ public void setCrbal(Double crbal) {
+ this.crbal = crbal;
+ }
+
+ public String getUpdtime() {
+ return updtime;
+ }
+
+ public void setUpdtime(String updtime) {
+ this.updtime = updtime;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectdayPK.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectdayPK.java
new file mode 100644
index 0000000..a3fdd45
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectdayPK.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+public class TSubjectdayPK implements Serializable {
+ @Id
+ @Column(name = "ACCDATE", nullable = false, length = 8)
+ private String accdate;
+
+ @Id
+ @Column(name = "SUBJNO", nullable = false, length = 10)
+ private String subjno;
+
+ public String getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ public String getSubjno() {
+ return subjno;
+ }
+
+ public void setSubjno(String subjno) {
+ this.subjno = subjno;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TSubjectdayPK tSubjectdayPK = (TSubjectdayPK) o;
+ if (accdate != null ? !accdate.equals(tSubjectdayPK.getAccdate()) : accdate != null)
+ return false;
+ if (subjno != null ? !subjno.equals(tSubjectdayPK.getSubjno()) : subjno != null)
+ return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = accdate != null ? accdate.hashCode() : 0;
+ result = 31 * result + (subjno != null ? subjno.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSyspara.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSyspara.java
new file mode 100644
index 0000000..3434b87
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSyspara.java
@@ -0,0 +1,175 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.NumberUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.SysparaUtil;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_SYSPARA")
+public class TSyspara {
+ @Id
+ @Column(name = "PARAID", nullable = false, precision = 9)
+ private Integer paraid;
+
+ @Column(name = "PARAVAL", length = 100)
+ private String paraval;
+
+ @Column(name = "PARANAME", length = 90)
+ private String paraname;
+
+ @Column(name = "PARAUNIT", length = 20)
+ private String paraunit;
+
+ @Column(name = "VALUETYPE", length = 10)
+ private String valueType = SysparaUtil.SYSPARA_VALUETYPE_STRING;
+
+ @Column(name = "EDITFLAG", precision = 1)
+ @NotNull
+ private Integer editflag;
+
+ @Column(name = "DISPLAYFLAG", length = 10)
+ @NotNull
+ private String displayflag;
+
+ @Column(name = "REMARK", length = 240)
+ private String remark;
+
+ @Column(name = "LASTSAVED", length = 14)
+ @NotNull
+ private String lastsaved;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public TSyspara() {
+ }
+
+ public TSyspara(Integer paraid, Integer editflag) {
+ this.paraid = paraid;
+ this.editflag = editflag;
+ }
+
+ public TSyspara(Integer paraid, String paraval, String paraname, String paraunit, String valueType, Integer editflag, String displayflag, String remark, String lastsaved) {
+ this.paraid = paraid;
+ this.paraval = paraval;
+ this.paraname = paraname;
+ this.paraunit = paraunit;
+ this.valueType = valueType;
+ this.editflag = editflag;
+ this.displayflag = displayflag;
+ this.remark = remark;
+ this.lastsaved = lastsaved;
+ }
+
+ public Integer getParaid() {
+ return paraid;
+ }
+
+ public void setParaid(Integer paraid) {
+ this.paraid = paraid;
+ }
+
+ public String getParaval() {
+ return paraval;
+ }
+
+ public void setParaval(String paraval) {
+ this.paraval = paraval;
+ }
+
+ public String getParaname() {
+ return paraname;
+ }
+
+ public void setParaname(String paraname) {
+ this.paraname = paraname;
+ }
+
+ public String getParaunit() {
+ return paraunit;
+ }
+
+ public void setParaunit(String paraunit) {
+ this.paraunit = paraunit;
+ }
+
+ public String getValueType() {
+ return valueType;
+ }
+
+ public void setValueType(String valueType) {
+ this.valueType = valueType;
+ }
+
+ public Integer getEditflag() {
+ return editflag;
+ }
+
+ public void setEditflag(Integer editflag) {
+ this.editflag = editflag;
+ }
+
+ public String getDisplayflag() {
+ return displayflag;
+ }
+
+ public void setDisplayflag(String displayflag) {
+ this.displayflag = displayflag;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getLastsaved() {
+ return lastsaved;
+ }
+
+ public void setLastsaved(String lastsaved) {
+ this.lastsaved = lastsaved;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+
+ /**
+ * 判断参数是否非法
+ *
+ * @return 非法 -> true; 合法 -> false
+ */
+ public boolean checkValueInvalid() {
+ if (!StringUtil.isEmpty(this.paraval)) {
+ if (SysparaUtil.SYSPARA_VALUETYPE_AMOUNT.equals(this.valueType) && !NumberUtil.isAmount(this.paraval)) {
+ return true; //参数值非金额类型
+ } else if (SysparaUtil.SYSPARA_VALUETYPE_DECIMAL.equals(this.valueType) && !NumberUtil.isDecimal(this.paraval)) {
+ return true; //参数值非数值类型
+ } else if (SysparaUtil.SYSPARA_VALUETYPE_NUMBER.equals(this.valueType) && !NumberUtil.isNumber(this.paraval)) {
+ return true; //参数值非整数
+ } else if (SysparaUtil.SYSPARA_VALUETYPE_SWITCH.equals(this.valueType) && !"1".equals(this.paraval) && !"0".equals(this.paraval)) {
+ return true; //参数值非开关量 0/1
+ } else if (SysparaUtil.SYSPARA_VALUETYPE_DATE.equals(this.valueType) && !DateUtil.checkDatetimeValid(this.paraval, "yyyyMMdd")) {
+ return true; //参数值非日期格式
+ } else if (SysparaUtil.SYSPARA_VALUETYPE_DATETIME.equals(this.valueType) && !DateUtil.checkDatetimeValid(this.paraval, "yyyyMMddHHmmss")) {
+ return true; //参数值非日期时间格式
+ }
+ }
+ return false; //默认字符串格式都合法
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTaskLock.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTaskLock.java
new file mode 100644
index 0000000..6baf8b4
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTaskLock.java
@@ -0,0 +1,69 @@
+package com.supwisdom.dlpay.framework.domain;
+
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_TASK_LOCK")
+public class TTaskLock {
+ @Id
+ @Column(name="TASKCODE", nullable = false, length = 30)
+ private String taskcode;
+
+ @Column(name="TASKSTATUS", nullable = false, precision = 1)
+ private Integer taskstatus;
+
+ @Column(name="TASKTIME", length = 20)
+ private String tasktime;
+
+ @Column(name="REMARK", length = 600)
+ private String remark;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public String getTaskcode() {
+ return taskcode;
+ }
+
+ public void setTaskcode(String taskcode) {
+ this.taskcode = taskcode;
+ }
+
+ public Integer getTaskstatus() {
+ return taskstatus;
+ }
+
+ public void setTaskstatus(Integer taskstatus) {
+ this.taskstatus = taskstatus;
+ }
+
+ public String getTasktime() {
+ return tasktime;
+ }
+
+ public void setTasktime(String tasktime) {
+ this.tasktime = tasktime;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantConfig.java
new file mode 100644
index 0000000..30701d8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantConfig.java
@@ -0,0 +1,46 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "tb_tenantconfig")
+public class TTenantConfig {
+ @Id
+ @Column(name = "cfgid", length = 20)
+ private String cfgid;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ @Column(name = "datacenter_id", length = 40)
+ private String dataCenterId;
+
+ public String getCfgid() {
+ return cfgid;
+ }
+
+ public void setCfgid(String cfgid) {
+ this.cfgid = cfgid;
+ }
+
+ public String getDataCenterId() {
+ return dataCenterId;
+ }
+
+ public void setDataCenterId(String dataCenterId) {
+ this.dataCenterId = dataCenterId;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTranscode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTranscode.java
new file mode 100644
index 0000000..ac42871
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTranscode.java
@@ -0,0 +1,57 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "TB_TRANSCODE")
+public class TTranscode implements DictionaryTable, Serializable {
+ @Id
+ @Column(name = "TRANSCODE", nullable = false, precision = 4)
+ private Integer transcode;
+
+ @Column(name = "TRANSNAME", nullable = false, length = 100)
+ private String transname;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public Integer getTranscode() {
+ return transcode;
+ }
+
+ public void setTranscode(Integer transcode) {
+ this.transcode = transcode;
+ }
+
+ public String getTransname() {
+ return transname;
+ }
+
+ public void setTransname(String transname) {
+ this.transname = transname;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+
+ @Override
+ public String getDictKey() {
+ return String.valueOf(this.transcode);
+ }
+
+ @Override
+ public Object getDictValue() {
+ return this.transname;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTranstype.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTranstype.java
new file mode 100644
index 0000000..5a52e0b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTranstype.java
@@ -0,0 +1,68 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_TRANSTYPE")
+public class TTranstype {
+ @Id
+ @Column(name = "TRANSTYPE", nullable = false, precision = 4)
+ private Integer transtype;
+
+ @Column(name = "DRSUBJNO", length = 10)
+ private String drsubjno;
+
+ @Column(name = "CRSUBJNO", length = 10)
+ private String crsubjno;
+
+ @Column(name = "SUMMARY", length = 200)
+ private String summary;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public Integer getTranstype() {
+ return transtype;
+ }
+
+ public void setTranstype(Integer transtype) {
+ this.transtype = transtype;
+ }
+
+ public String getDrsubjno() {
+ return drsubjno;
+ }
+
+ public void setDrsubjno(String drsubjno) {
+ this.drsubjno = drsubjno;
+ }
+
+ public String getCrsubjno() {
+ return crsubjno;
+ }
+
+ public void setCrsubjno(String crsubjno) {
+ this.crsubjno = crsubjno;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucher.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucher.java
new file mode 100644
index 0000000..71b30d8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucher.java
@@ -0,0 +1,312 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_VOUCHER")
+public class TVoucher {
+ @Id
+ @SequenceGenerator(name = "voucherid", sequenceName = "SEQ_VOUCHERID", allocationSize = 1)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "voucherid")
+ @Column(name = "VOUCHERID", nullable = false, precision = 9)
+ private Integer voucherid;
+
+ @Column(name = "PERIODYEAR", precision = 8)
+ private Integer periodYear;
+
+ @Column(name = "PERIODMONTH", precision = 2)
+ private Integer periodMonth;
+
+ @Column(name = "VOUCHERNO", precision = 9)
+ private Integer voucherno;
+
+ @Column(name = "VOUCHERDATE", precision = 8)
+ private Integer voucherdate;
+
+ @Column(name = "TRANSDATE", precision = 8)
+ private Integer transdate;
+
+ @Column(name = "TRANSCNT", precision = 9)
+ private Integer transcnt;
+
+ @Column(name = "AMOUNT", precision = 15, scale = 2)
+ @NotNull
+ private Double amount;
+
+ @Column(name = "SUMMARY", length = 200)
+ private String summary;
+
+ @Column(name = "ENTRYCNT", precision = 2)
+ private Integer entrycnt = 2;
+
+ @Column(name = "ATTACHMENTS", precision = 1)
+ private Integer attachments;
+
+ @Column(name = "SOURCETYPE", length = 20)
+ @NotNull
+ private String sourcetype; //auto-自动生成;hand-手工凭证;jiekuan-解款凭证(商户营业额不会统计解款凭证)
+
+ @Column(name = "SIGNFLAG", precision = 1)
+ private Integer signflag;
+
+ @Column(name = "CHECKFLAG", precision = 1)
+ private Integer checkflag;
+
+ @Column(name = "POSTFLAG", precision = 1)
+ private Integer postflag;
+
+ @Column(name = "INVALIDFLAG", precision = 1)
+ private Integer invalidflag;
+
+ @Column(name = "EDITFLAG", precision = 1)
+ private Integer editflag;
+
+ @Column(name = "PREPARER", length = 32)
+ private String preparer;
+
+ @Column(name = "CASHIER", length = 32)
+ private String cashier;
+
+ @Column(name = "CHECKER", length = 32)
+ private String checker;
+
+ @Column(name = "POSTER", length = 32)
+ private String poster;
+
+ @Column(name = "CREATEDATE", precision = 8)
+ private Integer createdate;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+
+ public TVoucher(Integer periodYear, Integer periodMonth, Integer voucherno, Integer voucherdate, Integer transdate, Integer transcnt, Double amount, String summary, String sourcetype, Integer createdate) {
+ this.periodYear = periodYear;
+ this.periodMonth = periodMonth;
+ this.voucherno = voucherno;
+ this.voucherdate = voucherdate;
+ this.transdate = transdate;
+ this.transcnt = transcnt;
+ this.amount = amount;
+ this.summary = summary;
+ this.entrycnt = 2;
+ this.attachments = 0;
+ this.sourcetype = sourcetype;
+ this.signflag = 0;
+ this.checkflag = 1;
+ this.postflag = 0;
+ this.invalidflag = 0;
+ this.editflag = 0;
+ this.createdate = createdate;
+ }
+
+ public TVoucher(Integer periodYear, Integer periodMonth, Integer voucherno, Integer voucherdate, Integer transdate, Integer transcnt, Double amount, String summary, Integer entrycnt, Integer attachments, String sourcetype, Integer signflag, Integer checkflag, Integer postflag, Integer invalidflag, Integer editflag, String preparer, String cashier, String checker, String poster, Integer createdate) {
+ this.periodYear = periodYear;
+ this.periodMonth = periodMonth;
+ this.voucherno = voucherno;
+ this.voucherdate = voucherdate;
+ this.transdate = transdate;
+ this.transcnt = transcnt;
+ this.amount = amount;
+ this.summary = summary;
+ this.entrycnt = entrycnt;
+ this.attachments = attachments;
+ this.sourcetype = sourcetype;
+ this.signflag = signflag;
+ this.checkflag = checkflag;
+ this.postflag = postflag;
+ this.invalidflag = invalidflag;
+ this.editflag = editflag;
+ this.preparer = preparer;
+ this.cashier = cashier;
+ this.checker = checker;
+ this.poster = poster;
+ this.createdate = createdate;
+ }
+
+ public Integer getVoucherid() {
+ return voucherid;
+ }
+
+ public void setVoucherid(Integer voucherid) {
+ this.voucherid = voucherid;
+ }
+
+ public Integer getPeriodYear() {
+ return periodYear;
+ }
+
+ public void setPeriodYear(Integer periodYear) {
+ this.periodYear = periodYear;
+ }
+
+ public Integer getPeriodMonth() {
+ return periodMonth;
+ }
+
+ public void setPeriodMonth(Integer periodMonth) {
+ this.periodMonth = periodMonth;
+ }
+
+ public Integer getVoucherno() {
+ return voucherno;
+ }
+
+ public void setVoucherno(Integer voucherno) {
+ this.voucherno = voucherno;
+ }
+
+ public Integer getVoucherdate() {
+ return voucherdate;
+ }
+
+ public void setVoucherdate(Integer voucherdate) {
+ this.voucherdate = voucherdate;
+ }
+
+ public Integer getTransdate() {
+ return transdate;
+ }
+
+ public void setTransdate(Integer transdate) {
+ this.transdate = transdate;
+ }
+
+ public Integer getTranscnt() {
+ return transcnt;
+ }
+
+ public void setTranscnt(Integer transcnt) {
+ this.transcnt = transcnt;
+ }
+
+ public Double getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Double amount) {
+ this.amount = amount;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public Integer getEntrycnt() {
+ return entrycnt;
+ }
+
+ public void setEntrycnt(Integer entrycnt) {
+ this.entrycnt = entrycnt;
+ }
+
+ public Integer getAttachments() {
+ return attachments;
+ }
+
+ public void setAttachments(Integer attachments) {
+ this.attachments = attachments;
+ }
+
+ public String getSourcetype() {
+ return sourcetype;
+ }
+
+ public void setSourcetype(String sourcetype) {
+ this.sourcetype = sourcetype;
+ }
+
+ public Integer getSignflag() {
+ return signflag;
+ }
+
+ public void setSignflag(Integer signflag) {
+ this.signflag = signflag;
+ }
+
+ public Integer getCheckflag() {
+ return checkflag;
+ }
+
+ public void setCheckflag(Integer checkflag) {
+ this.checkflag = checkflag;
+ }
+
+ public Integer getPostflag() {
+ return postflag;
+ }
+
+ public void setPostflag(Integer postflag) {
+ this.postflag = postflag;
+ }
+
+ public Integer getInvalidflag() {
+ return invalidflag;
+ }
+
+ public void setInvalidflag(Integer invalidflag) {
+ this.invalidflag = invalidflag;
+ }
+
+ public Integer getEditflag() {
+ return editflag;
+ }
+
+ public void setEditflag(Integer editflag) {
+ this.editflag = editflag;
+ }
+
+ public String getPreparer() {
+ return preparer;
+ }
+
+ public void setPreparer(String preparer) {
+ this.preparer = preparer;
+ }
+
+ public String getCashier() {
+ return cashier;
+ }
+
+ public void setCashier(String cashier) {
+ this.cashier = cashier;
+ }
+
+ public String getChecker() {
+ return checker;
+ }
+
+ public void setChecker(String checker) {
+ this.checker = checker;
+ }
+
+ public String getPoster() {
+ return poster;
+ }
+
+ public void setPoster(String poster) {
+ this.poster = poster;
+ }
+
+ public Integer getCreatedate() {
+ return createdate;
+ }
+
+ public void setCreatedate(Integer createdate) {
+ this.createdate = createdate;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntry.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntry.java
new file mode 100644
index 0000000..b3006d8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntry.java
@@ -0,0 +1,185 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_VOUCHERENTRY")
+@IdClass(TVoucherEntryPK.class)
+public class TVoucherEntry {
+ @Id
+ @Column(name = "VOUCHERID",nullable = false, precision = 9)
+ private Integer voucherid;
+
+ @Id
+ @Column(name = "ENTRYID", precision = 2)
+ private Integer entryid;
+
+ @Column(name="SUBJNO", length = 10)
+ private String subjno;
+
+ @Column(name="ACCNO", length = 32)
+ private String accno;
+
+ @Column(name="DRAMT", precision = 15, scale = 2)
+ private Double dramt;
+
+ @Column(name="CRAMT", precision = 15, scale = 2)
+ private Double cramt;
+
+ @Column(name="BALANCE", precision = 15, scale = 2)
+ private Double balance;
+
+ @Column(name="BALFLAG", precision = 1)
+ private Integer balflag;
+
+ @Column(name="SUMMARY", length = 240)
+ private String summary;
+
+ @Column(name="OPPSUBJNO", length = 10)
+ private String oppsubjno;
+
+ @Column(name="OPPACCNO", length = 32)
+ private String oppaccno;
+
+ @Column(name = "OPPNAME", length = 240)
+ private String oppname;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public TVoucherEntry() {
+ }
+
+ public TVoucherEntry(Integer voucherid, Integer entryid, String subjno, String accno, Double dramt, Double cramt, String summary, String oppsubjno, String oppaccno) {
+ this.voucherid = voucherid;
+ this.entryid = entryid;
+ this.subjno = subjno;
+ this.accno = accno;
+ this.dramt = dramt;
+ this.cramt = cramt;
+ this.summary = summary;
+ this.oppsubjno = oppsubjno;
+ this.oppaccno = oppaccno;
+ }
+
+ public TVoucherEntry(Integer voucherid, Integer entryid, String subjno, String accno, Double dramt, Double cramt, Double balance, Integer balflag, String summary, String oppsubjno, String oppaccno, String oppname) {
+ this.voucherid = voucherid;
+ this.entryid = entryid;
+ this.subjno = subjno;
+ this.accno = accno;
+ this.dramt = dramt;
+ this.cramt = cramt;
+ this.balance = balance;
+ this.balflag = balflag;
+ this.summary = summary;
+ this.oppsubjno = oppsubjno;
+ this.oppaccno = oppaccno;
+ this.oppname = oppname;
+ }
+
+ public Integer getVoucherid() {
+ return voucherid;
+ }
+
+ public void setVoucherid(Integer voucherid) {
+ this.voucherid = voucherid;
+ }
+
+ public Integer getEntryid() {
+ return entryid;
+ }
+
+ public void setEntryid(Integer entryid) {
+ this.entryid = entryid;
+ }
+
+ public String getSubjno() {
+ return subjno;
+ }
+
+ public void setSubjno(String subjno) {
+ this.subjno = subjno;
+ }
+
+ public String getAccno() {
+ return accno;
+ }
+
+ public void setAccno(String accno) {
+ this.accno = accno;
+ }
+
+ public Double getDramt() {
+ return dramt;
+ }
+
+ public void setDramt(Double dramt) {
+ this.dramt = dramt;
+ }
+
+ public Double getCramt() {
+ return cramt;
+ }
+
+ public void setCramt(Double cramt) {
+ this.cramt = cramt;
+ }
+
+ public Double getBalance() {
+ return balance;
+ }
+
+ public void setBalance(Double balance) {
+ this.balance = balance;
+ }
+
+ public Integer getBalflag() {
+ return balflag;
+ }
+
+ public void setBalflag(Integer balflag) {
+ this.balflag = balflag;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public String getOppsubjno() {
+ return oppsubjno;
+ }
+
+ public void setOppsubjno(String oppsubjno) {
+ this.oppsubjno = oppsubjno;
+ }
+
+ public String getOppaccno() {
+ return oppaccno;
+ }
+
+ public void setOppaccno(String oppaccno) {
+ this.oppaccno = oppaccno;
+ }
+
+ public String getOppname() {
+ return oppname;
+ }
+
+ public void setOppname(String oppname) {
+ this.oppname = oppname;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntryPK.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntryPK.java
new file mode 100644
index 0000000..9fa5279
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntryPK.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+public class TVoucherEntryPK implements Serializable {
+ @Id
+ @Column(name = "VOUCHERID", nullable = false, precision = 9)
+ private Integer voucherid;
+
+ @Id
+ @Column(name = "ENTRYID", precision = 2)
+ private Integer entryid;
+
+ public Integer getVoucherid() {
+ return voucherid;
+ }
+
+ public void setVoucherid(Integer voucherid) {
+ this.voucherid = voucherid;
+ }
+
+ public Integer getEntryid() {
+ return entryid;
+ }
+
+ public void setEntryid(Integer entryid) {
+ this.entryid = entryid;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ TVoucherEntryPK tVoucherEntryPK = (TVoucherEntryPK) o;
+ if (voucherid != null ? !voucherid.equals(tVoucherEntryPK.getVoucherid()) : voucherid != null)
+ return false;
+ if (entryid != null ? !entryid.equals(tVoucherEntryPK.getEntryid()) : entryid != null)
+ return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = voucherid != null ? voucherid.hashCode() : 0;
+ result = 31 * result + (entryid != null ? entryid.hashCode() : 0);
+ return result;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java
new file mode 100644
index 0000000..f7ff649
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java
@@ -0,0 +1,68 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+@Entity
+@Table(name = "TB_VOUCHERNOCTL")
+public class TVouchernoCtl {
+ @Id
+ @Column(name = "VOUCHERTYPE", nullable = false, precision = 2)
+ private Integer vouchertype;
+
+ @Column(name = "PERIODMONTH", precision = 2)
+ @NotNull
+ private Integer periodMonth;
+
+ @Column(name = "VOUCHERNO", precision = 9)
+ @NotNull
+ private Integer voucherno;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ public TVouchernoCtl() {
+ }
+
+ public TVouchernoCtl(Integer vouchertype, Integer periodMonth, Integer voucherno) {
+ this.vouchertype = vouchertype;
+ this.periodMonth = periodMonth;
+ this.voucherno = voucherno;
+ }
+
+ public Integer getVouchertype() {
+ return vouchertype;
+ }
+
+ public void setVouchertype(Integer vouchertype) {
+ this.vouchertype = vouchertype;
+ }
+
+ public Integer getPeriodMonth() {
+ return periodMonth;
+ }
+
+ public void setPeriodMonth(Integer periodMonth) {
+ this.periodMonth = periodMonth;
+ }
+
+ public Integer getVoucherno() {
+ return voucherno;
+ }
+
+ public void setVoucherno(Integer voucherno) {
+ this.voucherno = voucherno;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java
new file mode 100644
index 0000000..c58260d
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java
@@ -0,0 +1,92 @@
+package com.supwisdom.dlpay.framework.filter;
+
+
+import com.supwisdom.dlpay.exception.ValidateCodeException;
+import com.supwisdom.dlpay.framework.security.CodeUtil;
+import com.supwisdom.dlpay.framework.security.MyAuthenticationFailureHandler;
+import com.supwisdom.dlpay.framework.security.validate.ImageCodeUtil;
+import com.supwisdom.dlpay.framework.security.validate.VerifyCode;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+
+@Component("validateCodeFilter")
+public class ValidateCodeFilter extends OncePerRequestFilter {
+
+ /**
+ * 校验失败处理器
+ */
+ @Autowired
+ private MyAuthenticationFailureHandler myAuthenticationFailureHandler;
+
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request,
+ HttpServletResponse response, FilterChain filterChain)
+ throws ServletException, IOException {
+ String context = request.getContextPath();
+ if (context == null || "" == context.trim()) {
+ context = "/";
+ }
+ if (request.getRequestURI().isEmpty()) {
+ filterChain.doFilter(request, response);
+ return;
+ }
+ String url = request.getRequestURI();
+ if (!"/".equals(context)) {
+ url = url.replace(context, "");
+ }
+ if (StringUtil.equals("/login/form", url)
+ && StringUtil.equalsIgnoreCase(request.getMethod(), "post")) {
+ try {
+ validate(request);
+ } catch (ValidateCodeException e) {
+ //response.setStatus(HttpStatus.OK.value());
+ //response.setContentType("application/json;charset=UTF-8");
+ //response.getWriter().write(objectMapper.writeValueAsString(JsonResult.error(400, e.getMessage())));
+ //response.sendError(HttpStatus.UNAUTHORIZED.value(),e.getMessage());
+ myAuthenticationFailureHandler.onAuthenticationFailure(request, response, e);
+ return;
+ }
+ }
+ filterChain.doFilter(request, response);
+ }
+
+ private void validate(HttpServletRequest request) throws ValidateCodeException {
+ if (!CodeUtil.checkVerifyCode(request)) {
+ throw new ValidateCodeException("验证码不匹配");
+ } else {
+ request.getSession().removeAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
+ }
+// VerifyCode imageCode = (VerifyCode) request.getSession().getAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);
+// String inputCode;
+// try {
+// inputCode = request.getParameter("imageCode");
+// } catch (Exception e) {
+// throw new ValidateCodeException("获取验证码的值失败");
+// }
+// if (StringUtil.isEmpty(inputCode)) {
+// throw new ValidateCodeException("验证码不能为空");
+// }
+// if (null == imageCode) {
+// throw new ValidateCodeException("验证码不存在");
+// }
+// if (imageCode.isExpired()) {
+// request.getSession().removeAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);
+// throw new ValidateCodeException("验证码已过期");
+// }
+// if (!StringUtil.equalsIgnoreCase(imageCode.getText(), inputCode)) {
+// throw new ValidateCodeException("验证码不匹配");
+// }
+// request.getSession().removeAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiClientRepository.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiClientRepository.java
new file mode 100644
index 0000000..1d48dd1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiClientRepository.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.framework.redisrepo;
+
+import com.supwisdom.dlpay.framework.domain.ApiClientRedis;
+import org.springframework.data.repository.CrudRepository;
+
+public interface ApiClientRepository extends CrudRepository<ApiClientRedis, String> {
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiJwtRepository.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiJwtRepository.java
new file mode 100644
index 0000000..3371b31
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/redisrepo/ApiJwtRepository.java
@@ -0,0 +1,8 @@
+package com.supwisdom.dlpay.framework.redisrepo;
+
+import com.supwisdom.dlpay.framework.domain.JwtRedis;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+public interface ApiJwtRepository extends CrudRepository<JwtRedis, String> {
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/redisrepo/PersonRepository.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/redisrepo/PersonRepository.java
new file mode 100644
index 0000000..a4925cd
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/redisrepo/PersonRepository.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.framework.redisrepo;
+
+import com.supwisdom.dlpay.framework.domain.PersonRedis;
+import org.springframework.data.repository.CrudRepository;
+
+public interface PersonRepository extends CrudRepository<PersonRedis, String> {
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/CodeUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/CodeUtil.java
new file mode 100644
index 0000000..ef3b475
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/CodeUtil.java
@@ -0,0 +1,45 @@
+package com.supwisdom.dlpay.framework.security;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class CodeUtil {
+ /**
+ * 将获取到的前端参数转为string类型
+ *
+ * @param request
+ * @param key
+ * @return
+ */
+ public static String getString(HttpServletRequest request, String key) {
+ try {
+ String result = request.getParameter(key);
+ if (result != null) {
+ result = result.trim();
+ }
+ if ("".equals(result)) {
+ result = null;
+ }
+ return result;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ /**
+ * 验证码校验
+ *
+ * @param request
+ * @return
+ */
+ public static boolean checkVerifyCode(HttpServletRequest request) {
+ //获取生成的验证码
+ String verifyCodeExpected = (String) request.getSession()
+ .getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
+ //获取用户输入的验证码
+ String verifyCodeActual = CodeUtil.getString(request, "verifyCodeActual");
+ if (verifyCodeActual == null || !verifyCodeActual.equals(verifyCodeExpected)) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationFailureHandler.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationFailureHandler.java
new file mode 100644
index 0000000..f18d092
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationFailureHandler.java
@@ -0,0 +1,47 @@
+package com.supwisdom.dlpay.framework.security;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.exception.ValidateCodeException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.LockedException;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component("myAuthenticationFailureHandler")
+public class MyAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
+
+ @Autowired
+ private ObjectMapper objectMapper;
+
+
+ @Override
+ public void onAuthenticationFailure(HttpServletRequest request,
+ HttpServletResponse response, AuthenticationException exception)
+ throws IOException, ServletException {
+
+ logger.error("登录失败:" + exception.getMessage() + "|" + exception.getClass());
+ String errmsg = "登录失败";
+ if (exception instanceof BadCredentialsException) {
+ errmsg = "账号或密码错误";
+ } else if (exception instanceof LockedException) {
+ errmsg = "账号被锁定";
+ } else if (exception instanceof ValidateCodeException) {
+ errmsg = exception.getMessage();
+ }
+ setDefaultFailureUrl("/login");
+ super.onAuthenticationFailure(request, response, new ValidateCodeException(errmsg));
+ /*response.setTransStatus(HttpStatus.OK.value());
+ response.setContentType("application/json;charset=UTF-8");
+ response.getWriter().write(objectMapper.writeValueAsString(JsonResult.error(400, errmsg)));*/
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationSuccessHandler.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationSuccessHandler.java
new file mode 100644
index 0000000..abaa46a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyAuthenticationSuccessHandler.java
@@ -0,0 +1,32 @@
+package com.supwisdom.dlpay.framework.security;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component("myAuthenctiationSuccessHandler")
+public class MyAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
+ @Autowired
+ private ObjectMapper objectMapper;
+
+ @Override
+ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
+ Authentication authentication) throws IOException, ServletException {
+
+ logger.info("登录成功");
+ //TODO:记录日志
+ response.setStatus(HttpStatus.OK.value());
+ response.setContentType("application/json;charset=UTF-8");
+ response.getWriter().write(objectMapper.writeValueAsString(JsonResult.ok("登录成功")));
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyInvalidSessionStrategy.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyInvalidSessionStrategy.java
new file mode 100644
index 0000000..e37a508
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyInvalidSessionStrategy.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.framework.security;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.web.session.InvalidSessionStrategy;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component("myInvalidSessionStrategy")
+public class MyInvalidSessionStrategy implements InvalidSessionStrategy {
+ @Autowired
+ private ObjectMapper objectMapper = new ObjectMapper();
+
+ @Override
+ public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response)
+ throws IOException, ServletException {
+ JsonResult result =new JsonResult();
+ result.setCode(401);
+ result.setMessage("session已经失效了");
+ response.setStatus(HttpStatus.OK.value());
+ response.setContentType("application/json;charset=UTF-8");
+ response.getWriter().write(objectMapper.writeValueAsString(result));
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
new file mode 100644
index 0000000..d110ae7
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
@@ -0,0 +1,74 @@
+package com.supwisdom.dlpay.framework.security;
+
+import com.supwisdom.dlpay.framework.domain.*;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.service.FunctionService;
+import com.supwisdom.dlpay.system.service.OperatorService;
+import com.supwisdom.dlpay.system.service.RoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.PermissionEvaluator;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+@Component
+public class MyPermissionEvaluator implements PermissionEvaluator {
+ @Autowired
+ private RoleService roleService;
+ @Autowired
+ private OperatorService operatorService;
+ @Autowired
+ private FunctionService functionService;
+
+ @Override
+ public boolean hasPermission(Authentication authentication, Object targetUri, Object permission) {
+ //TODO save logger
+ if (targetUri != null) {
+ UserDetails userDetails = (UserDetails) authentication.getPrincipal();
+ if (userDetails != null) {
+ TOperator operator = operatorService.getOperatorByCode(userDetails.getUsername());
+ if (operator != null) {
+ List<TOperRole> operRoles = operatorService.getOperRoleByOperId(operator.getOperid());
+ for (TOperRole operRole : operRoles) {
+ TRole role = roleService.findRoleByRoleid(operRole.getRoleId());
+ if (role != null) {
+ TResource resource = roleService.findResourceByURI(String.valueOf(targetUri));
+ if (resource != null) {
+ TPermission permission1 = roleService.findByRoleIdAndResid(role.getRoleId(), resource.getId());
+ if (permission1 != null) {
+ TOperLog log = new TOperLog();
+ log.setLogdate(DateUtil.getNow());
+ log.setOperid(operator.getOperid());
+ log.setOpername(operator.getOpercode());
+ log.setResname(resource.getName());
+ log.setRespath(resource.getUri());
+ log.setTenantId(operator.getTenantId());
+ TFunction function = functionService.getFunctionById(resource.getFunctionId());
+ if (function != null) {
+ log.setFunctionid(function.getId());
+ log.setFunctionname(function.getName());
+ }
+ operatorService.saveOperLog(log);
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
+ return false;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/OperUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/OperUtil.java
new file mode 100644
index 0000000..4dd8c9e
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/OperUtil.java
@@ -0,0 +1,68 @@
+package com.supwisdom.dlpay.framework.security;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+import java.util.Collection;
+
+public class OperUtil {
+
+ public static TOperator getCurrentOper() {
+ Authentication au = SecurityContextHolder.getContext()
+ .getAuthentication();
+ if (au == null)
+ return null;
+ if (au.getPrincipal() == null)
+ return null;
+ if (au != null && au.getPrincipal() instanceof TOperator) {
+ return (TOperator) au.getPrincipal();
+ } else {
+ TOperator oper = new TOperator();
+ oper.setOpername(au.getPrincipal().toString());
+ oper.setOperpwd(au.getCredentials() == null ? null : au
+ .getCredentials().toString());
+ return oper;
+ }
+ }
+
+ public static String getCurrentOperid() {
+ TOperator oper = getCurrentOper();
+ if (oper == null)
+ return null;
+ return oper.getOperid() == null ? oper.getOpercode() : oper.getOperid();
+ }
+
+ public static boolean isLogined() {
+ Authentication au = SecurityContextHolder.getContext()
+ .getAuthentication();
+ if (au == null)
+ return false;
+ if (au.getPrincipal() == null)
+ return false;
+ if (au.getPrincipal() instanceof TOperator)
+ return true;
+ return false;
+ }
+
+ public static boolean isAdmin() {
+ TOperator loginOper = OperUtil.getCurrentOper();
+ if (loginOper != null) {
+ Collection<? extends GrantedAuthority> gas = loginOper.getAuthorities();
+ if (gas == null) {
+ return false;
+ }
+ boolean flag = false;
+ for (GrantedAuthority grantedAuthority : gas) {
+ if ("ROLE_ADMIN".equals(grantedAuthority.getAuthority())) {
+ flag = true;
+ }
+ }
+ return flag;
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/ValidateCodeSecurityConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/ValidateCodeSecurityConfig.java
new file mode 100644
index 0000000..3941628
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/ValidateCodeSecurityConfig.java
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.framework.security;
+
+import javax.servlet.Filter;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.web.DefaultSecurityFilterChain;
+import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
+import org.springframework.stereotype.Component;
+
+@Component("validateCodeSecurityConfig")
+public class ValidateCodeSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain,HttpSecurity> {
+
+ @Autowired
+ private Filter validateCodeFilter;
+
+
+ @Override
+ public void configure(HttpSecurity http) throws Exception {
+ http.addFilterBefore(validateCodeFilter, AbstractPreAuthenticatedProcessingFilter.class);
+ }
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCode.java
new file mode 100755
index 0000000..d88d3af
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCode.java
@@ -0,0 +1,21 @@
+package com.supwisdom.dlpay.framework.security.validate;
+
+import java.awt.image.BufferedImage;
+
+public class ImageCode extends ValidateCode {
+ private BufferedImage image;
+
+ public ImageCode(BufferedImage image, String code, int expireTime) {
+ super(code, expireTime);
+ this.image = image;
+ }
+
+ public BufferedImage getImage() {
+ return image;
+ }
+
+ public void setImage(BufferedImage image) {
+ this.image = image;
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCodeUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCodeUtil.java
new file mode 100644
index 0000000..0a105b9
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCodeUtil.java
@@ -0,0 +1,72 @@
+package com.supwisdom.dlpay.framework.security.validate;
+
+import javax.servlet.http.HttpServletRequest;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.util.Random;
+
+public class ImageCodeUtil {
+
+ public static final String LOGIN_IMAGECODE_SESSIONKEY = "SESSION_KEY_LOGIN_IMAGECODE";
+
+ /**
+ * 生成随机背景条纹
+ *
+ * @param fc
+ * @param bc
+ * @return
+ */
+ private static Color getRandColor(int fc, int bc) {
+ Random random = new Random();
+ if (fc > 255) {
+ fc = 255;
+ }
+ if (bc > 255) {
+ bc = 255;
+ }
+ int r = fc + random.nextInt(bc - fc);
+ int g = fc + random.nextInt(bc - fc);
+ int b = fc + random.nextInt(bc - fc);
+ return new Color(r, g, b);
+ }
+
+ /**
+ * 生成图形验证码
+ * @param request
+ * @return
+ */
+ public static ImageCode generate(HttpServletRequest request) {
+ int width = 64;
+ int height = 32;
+ BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+
+ Graphics g = image.getGraphics();
+
+ Random random = new Random();
+
+ g.setColor(getRandColor(200, 250));
+ g.fillRect(0, 0, width, height);
+ g.setFont(new Font("Times New Roman", Font.ITALIC, 20));
+ g.setColor(getRandColor(160, 200));
+ for (int i = 0; i < 155; i++) {
+ int x = random.nextInt(width);
+ int y = random.nextInt(height);
+ int xl = random.nextInt(12);
+ int yl = random.nextInt(12);
+ g.drawLine(x, y, x + xl, y + yl);
+ }
+
+ String sRand = "";
+ for (int i = 0; i < 4; i++) {
+ String rand = String.valueOf(random.nextInt(10));
+ sRand += rand;
+ g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
+ g.drawString(rand, 13 * i + 6, 16);
+ }
+
+ g.dispose();
+ return new ImageCode(image, sRand, 60);
+ }
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java
new file mode 100755
index 0000000..67a4812
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java
@@ -0,0 +1,55 @@
+package com.supwisdom.dlpay.framework.security.validate;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import java.util.Date;
+
+
+public class ValidateCode{
+
+ private String code;
+
+ private Date expireTime;
+
+ public ValidateCode() {
+ super();
+ }
+
+ public ValidateCode(String code, Date expireTime) {
+ super();
+ this.code = code;
+ this.expireTime = expireTime;
+ }
+
+ public ValidateCode(String code, int expireTime) {
+ super();
+ this.code = code;
+ this.expireTime = DateUtil.setMinutes(new Date(), expireTime);
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public Date getExpireTime() {
+ return expireTime;
+ }
+
+ public void setExpireTime(Date expireTime) {
+ this.expireTime = expireTime;
+ }
+
+ @JsonIgnore
+ public boolean isExpired() {
+ return new Date().compareTo(expireTime) > 0;
+ }
+
+ @Override
+ public String toString() {
+ return "ValidateCode [code=" + code + ", expireTime=" + expireTime + "]";
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/VerifyCode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/VerifyCode.java
new file mode 100644
index 0000000..74cc240
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/security/validate/VerifyCode.java
@@ -0,0 +1,126 @@
+package com.supwisdom.dlpay.framework.security.validate;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Random;
+
+public class VerifyCode implements Serializable {
+ private int w = 100;
+ private int h = 35;
+ private Random r = new Random();
+ // {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
+ private String[] fontNames = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};
+ // 可选字符
+ private String codes = "0123456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
+ // 背景色
+ private Color bgColor = new Color(255, 255, 255);
+ // 验证码上的文本
+ private String text ;
+
+ public VerifyCode() {
+ }
+ public VerifyCode(LocalDateTime localDateTime) {
+ this.localDateTime = localDateTime;
+ }
+ public VerifyCode(int second) {
+ // 多少秒后
+ this.localDateTime = LocalDateTime.now().plusSeconds(second);
+ }
+
+
+ //过期时间
+ private LocalDateTime localDateTime;
+ // 生成随机的颜色
+ private Color randomColor () {
+ int red = r.nextInt(150);
+ int green = r.nextInt(150);
+ int blue = r.nextInt(150);
+ return new Color(red, green, blue);
+ }
+
+ // 生成随机的字体
+ private Font randomFont () {
+ int index = r.nextInt(fontNames.length);
+ String fontName = fontNames[index];//生成随机的字体名称
+ int style = r.nextInt(4);//生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)
+ int size = r.nextInt(5) + 24; //生成随机字号, 24 ~ 28
+ return new Font(fontName, style, size);
+ }
+
+ // 画干扰线
+ private void drawLine (BufferedImage image) {
+ int num = 3;//一共画3条
+ Graphics2D g2 = (Graphics2D)image.getGraphics();
+ for(int i = 0; i < num; i++) {//生成两个点的坐标,即4个值
+ int x1 = r.nextInt(w);
+ int y1 = r.nextInt(h);
+ int x2 = r.nextInt(w);
+ int y2 = r.nextInt(h);
+ g2.setStroke(new BasicStroke(1.5F));
+ g2.setColor(Color.BLUE); //干扰线是蓝色
+ g2.drawLine(x1, y1, x2, y2);//画线
+ }
+ }
+
+ // 随机生成一个字符
+ private char randomChar () {
+ int index = r.nextInt(codes.length());
+ return codes.charAt(index);
+ }
+
+ // 创建BufferedImage
+ private BufferedImage createImage () {
+ BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g2 = (Graphics2D)image.getGraphics();
+ g2.setColor(this.bgColor);
+ g2.fillRect(0, 0, w, h);
+ return image;
+ }
+
+ // 调用这个方法得到验证码
+ public BufferedImage getImage () {
+ BufferedImage image = createImage();//创建图片缓冲区
+ Graphics2D g2 = (Graphics2D)image.getGraphics();//得到绘制环境
+ StringBuilder sb = new StringBuilder();//用来装载生成的验证码文本
+ // 向图片中画4个字符
+ for(int i = 0; i < 4; i++) {//循环四次,每次生成一个字符
+ String s = randomChar() + "";//随机生成一个字母
+ sb.append(s); //把字母添加到sb中
+ float x = i * 1.0F * w / 4; //设置当前字符的x轴坐标
+ g2.setFont(randomFont()); //设置随机字体
+ g2.setColor(randomColor()); //设置随机颜色
+ g2.drawString(s, x, h-5); //画图
+ }
+ this.text = sb.toString(); //把生成的字符串赋给了this.text
+ drawLine(image); //添加干扰线
+ return image;
+ }
+
+ // 返回验证码图片上的文本
+ public String getText () {
+ return text;
+ }
+
+ // 保存图片到指定的输出流
+ public static void output (BufferedImage image, OutputStream out)
+ throws IOException {
+ ImageIO.write(image, "JPEG", out);
+ }
+ public LocalDateTime getLocalDateTime() {
+ return localDateTime;
+ }
+
+ public void setLocalDateTime(LocalDateTime localDateTime) {
+ this.localDateTime = localDateTime;
+ }
+ public boolean isExpired(){
+ return LocalDateTime.now().isAfter(localDateTime);
+ }
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/DayendSettleService.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/DayendSettleService.java
new file mode 100644
index 0000000..86d7dbd
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/DayendSettleService.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.framework.service;
+
+import com.supwisdom.dlpay.framework.domain.TSettleLog;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 日终结算
+ * */
+public interface DayendSettleService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ TSettleLog doCreateSettleLog();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ TSettleLog doUpdateSettleLog(TSettleLog log);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean doDayendSettle() throws Exception; //日结
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean doVoucherSettle(String voucherid) throws Exception; //指定凭证入账
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/DayendStatisticsService.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/DayendStatisticsService.java
new file mode 100644
index 0000000..110f0e2
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/DayendStatisticsService.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.service;
+
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 日终统计
+ * */
+public interface DayendStatisticsService {
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean doDayendStatistics() throws Exception; //日结后统计
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java
new file mode 100644
index 0000000..bf72bfe
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/OperatorDetailService.java
@@ -0,0 +1,6 @@
+package com.supwisdom.dlpay.framework.service;
+
+import org.springframework.security.core.userdetails.UserDetailsService;
+
+public interface OperatorDetailService extends UserDetailsService {
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
new file mode 100644
index 0000000..e575265
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
@@ -0,0 +1,83 @@
+package com.supwisdom.dlpay.framework.service;
+
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.domain.TBusinesspara;
+import com.supwisdom.dlpay.framework.domain.TSyspara;
+import com.supwisdom.dlpay.framework.domain.TTaskLock;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface SystemUtilService {
+
+ /**
+ * 取数据库日期
+ */
+ @Transactional
+ SystemDateTime getSysdatetime();
+
+ /**
+ * 更新任务表
+ */
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ TTaskLock updateTaskLock(TTaskLock lock);
+
+ /**
+ * 取任务表
+ */
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ TTaskLock doLockTask(String taskcode, Integer minRecover, String remark);
+
+ /**
+ * 获取记账日期
+ */
+ String getAccdate();
+
+ /**
+ * 获取流水号
+ */
+ String getRefno();
+
+ /**
+ * 按交易码取交易名称
+ */
+ String getTranscodeName(int transocde, String defaultValue);
+
+
+ /********************** 获取【系统参数】【业务参数】通用方法 **********************/
+ String getSysparaValue(int paraid);
+
+ String getSysparaValue(int paraid, String defaultValue);
+
+ boolean getSysparaValueAsBoolean(int paraid);
+
+ int getSysparaValueAsInt(int paraid, int defaultValue);
+
+ double getSysparaValueAsDouble(int paraid, double defaultValue);
+
+ TSyspara getSyspara(int paraid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ TSyspara getSysparaValueForUpdate(int paraid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ TSyspara getSysparaValueForUpdateNowait(int paraid);
+
+
+ String getBusinessValue(String parakey);
+
+ String getBusinessValue(String parakey, String defaultValue);
+
+ TBusinesspara getBusiness(String parakey);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ TBusinesspara getBusinessValueForUpdate(String parakey);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ TBusinesspara getBusinessValueForUpdateNowait(String parakey);
+
+ /********************** 获取【系统参数】【业务参数】通用方法 **********************/
+
+
+ String getSubsystemSignKey(String syscode);
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java
new file mode 100644
index 0000000..2f4959b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java
@@ -0,0 +1,541 @@
+package com.supwisdom.dlpay.framework.service.impl;
+
+import com.supwisdom.dlpay.api.dao.DebitCreditDtlDao;
+import com.supwisdom.dlpay.framework.dao.*;
+import com.supwisdom.dlpay.framework.data.FSubjectInfoBean;
+import com.supwisdom.dlpay.framework.data.MerchBean;
+import com.supwisdom.dlpay.framework.data.SubjectInfoBean;
+import com.supwisdom.dlpay.framework.data.VoucherTemp;
+import com.supwisdom.dlpay.framework.domain.*;
+import com.supwisdom.dlpay.framework.service.DayendSettleService;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.MoneyUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.Subject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class DayendSettleServiceImpl implements DayendSettleService {
+ @Autowired
+ private SystemUtilService systemUtilService;
+ @Autowired
+ private SettleLogDao settleLogDao;
+ @Autowired
+ private SettleCtlDao settleCtlDao;
+ @Autowired
+ private PeriodDao periodDao;
+ @Autowired
+ private VouchernoCtlDao vouchernoCtlDao;
+ @Autowired
+ private ShopaccDao shopaccDao;
+ @Autowired
+ private SubjectDao subjectDao;
+ @Autowired
+ private SubjectbalDao subjectbalDao;
+ @Autowired
+ private VoucherDao voucherDao;
+ @Autowired
+ private VoucherEntryDao voucherEntryDao;
+
+ @Autowired
+ private ShopaccdayDao shopaccdayDao;
+ @Autowired
+ private SubjectdayDao subjectdayDao;
+ @Autowired
+ private DebitCreditDtlDao debitCreditDtlDao;
+
+
+ private static final Logger logger = LoggerFactory.getLogger(DayendSettleServiceImpl.class);
+
+ private int hostdate;
+ private int periodYear; // 记账年份
+ private int periodMonth; // 记账月份
+ private int settledate; //结算日期
+ private int lastsettday; //结算前一天
+
+ @Override
+ public TSettleLog doCreateSettleLog() {
+ TSettleLog log = new TSettleLog();
+ log.setStarttime(systemUtilService.getSysdatetime().getHostdatetime());
+ return settleLogDao.save(log);
+ }
+
+ @Override
+ public TSettleLog doUpdateSettleLog(TSettleLog log) {
+ if (null == log) return null;
+ log.setEndtime(systemUtilService.getSysdatetime().getHostdatetime());
+ return settleLogDao.save(log);
+ }
+
+ private boolean doSwitchPeriod() throws Exception {
+ TPeriod period = periodDao.getTPeriodWithLock(periodYear, periodMonth);
+ if (period.getSettleflag() == 1) {
+ throw new Exception("月末结转已完成");
+ }
+ period.setSettleflag(1);
+ periodDao.save(period); //已结
+
+ if (periodMonth >= 12) {
+ periodMonth = 1;
+ periodYear = periodYear + 1; //年份加一
+ } else {
+ periodMonth = periodMonth + 1; //year不变
+ }
+
+ TPeriod nextPerid = periodDao.getPeriod(periodYear, periodMonth);
+ if (null != nextPerid) {
+ if (settledate != Integer.valueOf(nextPerid.getStartdate())) {
+ throw new Exception("下一个会计期间的开始日期不正确");
+ } else if (nextPerid.getSettleflag() == 1) {
+ throw new Exception("下一个会计期间的月末结转已完成");
+ }
+ } else {
+ Integer startdate = periodYear * 10000 + periodMonth * 100 + 1;
+ Integer enddate = DateUtil.getLastDayOfMonth(periodYear, periodMonth);
+ if (settledate != startdate) {
+ throw new Exception("下一个会计期间的开始日期不正确");
+ }
+ nextPerid = new TPeriod();
+ nextPerid.setPeriodYear(periodYear);
+ nextPerid.setPeriodMonth(periodMonth);
+ nextPerid.setStartdate(startdate.toString());
+ nextPerid.setEnddate(enddate.toString());
+ nextPerid.setSettleflag(0);
+ periodDao.save(nextPerid); //保存下个会计期间
+ }
+
+ settleCtlDao.updateSettlePeriod(periodYear, periodMonth);
+ vouchernoCtlDao.updateVoucherno(periodMonth, 0);
+ return true;
+ }
+
+ private void saveVoucher(VoucherTemp voucherTemp) {
+ TVoucher voucher = new TVoucher(periodYear, periodMonth, 0, settledate, settledate, voucherTemp.getTranscnt(), Math.abs(voucherTemp.getTransamt()), voucherTemp.getSummary(), "auto", hostdate);
+ voucher = voucherDao.save(voucher);
+ TVoucherEntry entry1;
+ TVoucherEntry entry2;
+ if (voucherTemp.getTransamt() >= 0) {
+ entry1 = new TVoucherEntry(voucher.getVoucherid(), 1, voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), Math.abs(voucherTemp.getTransamt()), 0D, voucherTemp.getSummary(), voucherTemp.getCrsubjno(), voucherTemp.getCraccno());
+ entry2 = new TVoucherEntry(voucher.getVoucherid(), 2, voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), 0D, Math.abs(voucherTemp.getTransamt()), voucherTemp.getSummary(), voucherTemp.getDrsubjno(), voucherTemp.getDraccno());
+ } else {
+ entry1 = new TVoucherEntry(voucher.getVoucherid(), 1, voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), 0D, Math.abs(voucherTemp.getTransamt()), voucherTemp.getSummary(), voucherTemp.getCrsubjno(), voucherTemp.getCraccno());
+ entry2 = new TVoucherEntry(voucher.getVoucherid(), 2, voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), Math.abs(voucherTemp.getTransamt()), 0D, voucherTemp.getSummary(), voucherTemp.getDrsubjno(), voucherTemp.getDraccno());
+ }
+ voucherEntryDao.save(entry1);
+ voucherEntryDao.save(entry2);
+ }
+
+ @Override
+ public boolean doDayendSettle() throws Exception {
+ TSettlectl tSettlectl = settleCtlDao.findByBooksetnoWithLock(1);
+ if (null == tSettlectl || null == tSettlectl.getBooksetno()) {
+ throw new Exception("初始化错误,T_SETTLECTL 无初始化数据");
+ }
+ tSettlectl.setStatus(1); //结算标记
+ settleCtlDao.save(tSettlectl);
+
+ hostdate = Integer.valueOf(systemUtilService.getSysdatetime().getHostdate());
+ periodYear = tSettlectl.getPeriodYear();
+ periodMonth = tSettlectl.getPeriodMonth();
+ settledate = tSettlectl.getSettledate();
+ lastsettday = Integer.valueOf(DateUtil.getNewDay(tSettlectl.getSettledate().toString(), -1));
+
+ if (settledate >= hostdate) {
+ throw new Exception("日终结算已完成");
+ }
+
+ TPeriod period = periodDao.getPeriod(periodYear, periodMonth);
+ if (null == period) throw new Exception("year=[" + periodYear + "],month=[" + periodMonth + "] t_period not find ");
+ if (settledate > Integer.valueOf(period.getEnddate())) {
+ //月切
+ if (!doSwitchPeriod()) {
+ throw new Exception("月切失败");
+ }
+ }
+
+ //新增科目插入科目余额表(末级科目)
+ List<String> newEndsubjectList = subjectDao.getNewSubject();
+ if (!StringUtil.isEmpty(newEndsubjectList)) {
+ for (String subjno : newEndsubjectList) {
+ TSubjectbal subjectbal = new TSubjectbal(subjno);
+ subjectbalDao.save(subjectbal);
+ }
+ }
+ if (subjectDao.checkSettleSubject().getExisted() > 0) {
+ throw new Exception("初始化数据错误:科目余额表数据没有包含所有的科目余额");
+ }
+
+ //删除未入账凭证
+ if (voucherDao.checkExistUnpostVouhcer().getExisted() > 0) {
+ voucherEntryDao.deleteUnpostVoucherentry();
+ voucherDao.deleteUnpostVoucher();
+ }
+
+ //用户交易凭证
+ List<VoucherTemp> userList = debitCreditDtlDao.getVoucherData(String.valueOf(settledate));
+ if (!StringUtil.isEmpty(userList)) {
+ for (VoucherTemp temp : userList) {
+ saveVoucher(temp);
+ }
+ }
+
+ //凭证号
+ TVouchernoCtl vouchernoCtl = vouchernoCtlDao.getVoucherno();
+ if (null == vouchernoCtl) {
+ vouchernoCtl = new TVouchernoCtl();
+ vouchernoCtl.setVouchertype(1);
+ vouchernoCtl.setPeriodMonth(periodMonth);
+ vouchernoCtl.setVoucherno(0);
+ vouchernoCtlDao.save(vouchernoCtl);
+ }
+ int voucherno = vouchernoCtl.getVoucherno();
+ List<TVoucher> voucherList = voucherDao.getSettleVouchers();
+ if (!StringUtil.isEmpty(voucherList)) {
+ for (TVoucher voucher : voucherList) {
+ voucherno++;
+ voucher.setVoucherno(voucherno);
+ voucher.setPostflag(1);
+ voucherDao.save(voucher);
+ }
+ vouchernoCtl.setVoucherno(voucherno);
+ vouchernoCtlDao.save(vouchernoCtl);
+ }
+
+ Map<String, Double> v_merchbaldict = new HashMap<String, Double>(0);
+ //根据商户昨天日结表生成当天日结表(交易前余额), 新增商户添加记录
+ List<TShopaccday> lastShopaccdays = shopaccdayDao.getShopaccdayByAccdate(String.valueOf(lastsettday));
+ if (!StringUtil.isEmpty(lastShopaccdays)) {
+ for (TShopaccday lastday : lastShopaccdays) {
+ TShopaccday today = new TShopaccday(String.valueOf(settledate), lastday.getShopaccno(), periodYear, periodMonth, lastday.getBalance(), 0D, 0D, 0D);
+ shopaccdayDao.save(today);
+ v_merchbaldict.put(lastday.getShopaccno(), lastday.getBalance());
+ }
+ }
+ List<String> newShopaccs = shopaccDao.getNewShopacc(String.valueOf(lastsettday)); //新增商户
+ if(!StringUtil.isEmpty(newShopaccs)){
+ for(String accno:newShopaccs){
+ TShopaccday today = new TShopaccday(String.valueOf(settledate), accno, periodYear, periodMonth, 0D, 0D, 0D, 0D);
+ shopaccdayDao.save(today);
+ v_merchbaldict.put(accno, 0D);
+ }
+ }
+
+ List<MerchBean> merchBeanList = voucherDao.getShopVoucherByAccdate(settledate);
+ if (!StringUtil.isEmpty(merchBeanList)) {
+ for (MerchBean merch : merchBeanList) {
+ TShopaccday merchday = shopaccdayDao.getTShopaccdayById(String.valueOf(settledate), merch.getShopaccno());
+ if (null == merchday) {
+ throw new Exception("商户余额表无此商户账号[" + merch.getShopaccno() + "]");
+ }
+ merchday.setDramt(merch.getDramt() == null ? 0D : merch.getDramt());
+ merchday.setCramt(merch.getCramt() == null ? 0D : merch.getCramt());
+ shopaccdayDao.save(merchday);
+ }
+ }
+ shopaccdayDao.updateShopaccdayBalance(String.valueOf(settledate), systemUtilService.getSysdatetime().getHostdatetime()); //批量更新余额,商户日结表生成
+
+ //根据科目昨天日结表生成当天日结表(交易前借贷方余额),新增末级科目插入记录(交易前余额为科目贷方余额)
+ List<TSubjectday> lastSubjectDays = subjectdayDao.getAllByAccdate(String.valueOf(lastsettday));
+ if (!StringUtil.isEmpty(lastSubjectDays)) {
+ for (TSubjectday lastday : lastSubjectDays) {
+ TSubjectday today = new TSubjectday(String.valueOf(settledate), lastday.getSubjno(), periodYear, periodMonth, lastday.getDrbal(), lastday.getCrbal(), 0D, 0D, 0D, 0D);
+ subjectdayDao.save(today);
+ }
+ }
+ List<TSubjectbal> newSubjectBals = subjectbalDao.getUnsettleSubjectbal(String.valueOf(lastsettday));
+ if (!StringUtil.isEmpty(newSubjectBals)) {
+ for (TSubjectbal newSubject : newSubjectBals) {
+ TSubjectday today = new TSubjectday(String.valueOf(settledate), newSubject.getSubjno(), periodYear, periodMonth, newSubject.getBegindrbal(), newSubject.getBegincrbal(), 0D, 0D, 0D, 0D);
+ subjectdayDao.save(today);
+ }
+ }
+ List<String> newFSubjnos = subjectDao.getNewSubjnos(String.valueOf(settledate)); //新增非末级科目
+ if (!StringUtil.isEmpty(newFSubjnos)) {
+ for (String subjno : newFSubjnos) {
+ double beginDrbal = 0;
+ double beginCrbal = 0;
+ MerchBean balInfo = subjectbalDao.getSubjectInfo(subjno); //统计下级所有科目的交易前余额
+ if (null != balInfo) {
+ beginDrbal = (balInfo.getDramt() == null ? 0 : balInfo.getDramt().doubleValue());
+ beginCrbal = (balInfo.getCramt() == null ? 0 : balInfo.getCramt().doubleValue());
+ }
+ TSubjectday today = new TSubjectday(String.valueOf(settledate), subjno, periodYear, periodMonth, beginDrbal, beginCrbal, 0D, 0D, 0D, 0D);
+ subjectdayDao.save(today);
+ }
+ }
+
+ //初始化末级科目期初余额(包含商户科目)
+ Map<String, Double> v_subjbaldict = new HashMap<String, Double>(0);
+ Map<String, Integer> v_subjbalflagdict = new HashMap<String, Integer>(0);
+ List<MerchBean> subjectList = subjectdayDao.getEndSubjectbalInfos(String.valueOf(settledate));
+ if (!StringUtil.isEmpty(subjectList)) {
+ for (MerchBean bean : subjectList) {
+ v_subjbaldict.put(bean.getShopaccno(), MoneyUtil.formatYuan(bean.getDramt() + bean.getCramt()));
+ }
+ }
+
+ List<SubjectInfoBean> subjInfoList = subjectbalDao.getSubjectbalAndFlag();
+ for (SubjectInfoBean subj : subjInfoList) {
+ TSubjectday tSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), subj.getSubjno());
+ if (null == tSubjectday) {
+ throw new Exception("科目日结表无此科目记录[" + subj.getSubjno() + "]");
+ }
+
+ v_subjbalflagdict.put(subj.getSubjno(), subj.getBalflag());
+ MerchBean suminfo = voucherDao.getSettleSuminfo(settledate, subj.getSubjno());
+ double sumDramt = ((null == suminfo || null == suminfo.getDramt()) ? 0 : suminfo.getDramt().doubleValue());
+ double sumCramt = ((null == suminfo || null == suminfo.getCramt()) ? 0 : suminfo.getCramt().doubleValue());
+ tSubjectday.setDramt(sumDramt);
+ tSubjectday.setCramt(sumCramt);
+ tSubjectday.setUpdtime(systemUtilService.getSysdatetime().getHostdatetime());
+ if (subj.getBalflag() == 1) {
+ tSubjectday.setDrbal(MoneyUtil.formatYuan(tSubjectday.getBegindrbal() + sumDramt - sumCramt));
+ } else {
+ tSubjectday.setCrbal(MoneyUtil.formatYuan(tSubjectday.getBegincrbal() - sumDramt + sumCramt));
+ }
+ subjectdayDao.save(tSubjectday);
+ }
+ //根据二级更新一级科目日结
+ List<TSubjectday> parentSubject = subjectdayDao.getParentSubjectday(String.valueOf(settledate));
+ for (TSubjectday fsub : parentSubject) {
+ FSubjectInfoBean sumInfo = subjectdayDao.getParentSumInfo(String.valueOf(settledate), fsub.getSubjno());
+ fsub.setBegindrbal((null == sumInfo || null == sumInfo.getBegindrbal()) ? 0D : sumInfo.getBegindrbal());
+ fsub.setBegincrbal((null == sumInfo || null == sumInfo.getBegincrbal()) ? 0D : sumInfo.getBegincrbal());
+ fsub.setDramt((null == sumInfo || null == sumInfo.getDramt()) ? 0D : sumInfo.getDramt());
+ fsub.setCramt((null == sumInfo || null == sumInfo.getCramt()) ? 0D : sumInfo.getCramt());
+ fsub.setDrbal((null == sumInfo || null == sumInfo.getDrbal()) ? 0D : sumInfo.getDrbal());
+ fsub.setCrbal((null == sumInfo || null == sumInfo.getCrbal()) ? 0D : sumInfo.getCrbal());
+ fsub.setUpdtime(systemUtilService.getSysdatetime().getHostdatetime());
+ subjectdayDao.save(fsub);
+ }
+
+ //批量更新凭证明细中商户或科目账户的余额
+ List<TVoucherEntry> entryList = voucherEntryDao.getVoucherEntryByVoucherdate(settledate);
+ if (!StringUtil.isEmpty(entryList)) {
+ for (TVoucherEntry vce : entryList) {
+ if (Subject.SUBJNO_MACHANT_INCOME.equals(vce.getSubjno())) {
+ //商户科目
+ Double befbal = v_merchbaldict.get(vce.getAccno());
+ if (null == befbal) throw new Exception("商户表商户账号[" + vce.getAccno() + "]不存在");
+ v_merchbaldict.put(vce.getAccno(), MoneyUtil.formatYuan(befbal + vce.getCramt() - vce.getDramt())); //更新余额
+ vce.setBalflag(2);
+ vce.setBalance(v_merchbaldict.get(vce.getAccno()));
+ if (Subject.SUBJNO_MACHANT_INCOME.equals(vce.getOppsubjno())) {
+ vce.setOppname(shopaccDao.getShopname(vce.getOppaccno()));
+ } else {
+ vce.setOppname(subjectDao.getSubjectname(vce.getOppsubjno()));
+ }
+ voucherEntryDao.save(vce);
+ Double befMerchbal = v_subjbaldict.get(vce.getSubjno());
+ if (null == befMerchbal) throw new Exception("商户科目号[" + vce.getSubjno() + "]不存在");
+ v_subjbaldict.put(vce.getSubjno(), MoneyUtil.formatYuan(befMerchbal - vce.getDramt() + vce.getCramt())); //商户科目总余额更新
+ } else {
+ //其他科目
+ Integer balflag = v_subjbalflagdict.get(vce.getSubjno());
+ Double befbal = v_subjbaldict.get(vce.getSubjno());
+ if (null == balflag || null == befbal) throw new Exception("科目表科目号[" + vce.getSubjno() + "]不存在");
+ if (balflag == 1) {
+ v_subjbaldict.put(vce.getSubjno(), MoneyUtil.formatYuan(befbal + vce.getDramt() - vce.getCramt()));
+ } else {
+ v_subjbaldict.put(vce.getSubjno(), MoneyUtil.formatYuan(befbal - vce.getDramt() + vce.getCramt()));
+ }
+ vce.setBalflag(balflag);
+ vce.setBalance(v_subjbaldict.get(vce.getSubjno()));
+ if (Subject.SUBJNO_MACHANT_INCOME.equals(vce.getOppsubjno())) {
+ vce.setOppname(shopaccDao.getShopname(vce.getOppaccno()));
+ } else {
+ vce.setOppname(subjectDao.getSubjectname(vce.getOppsubjno()));
+ }
+ voucherEntryDao.save(vce);
+ }
+ }
+ }
+
+ //开始校验
+ //核算商户日结表商户余额 和凭证明细余额是否一致 TODO(新商户收入校验逻辑)
+ for (String shopaccno : v_merchbaldict.keySet()) {
+ TShopaccday tShopaccday = shopaccdayDao.getTShopaccdayById(String.valueOf(settledate), shopaccno);
+ if (!MoneyUtil.moneyEqual(v_merchbaldict.get(shopaccno), tShopaccday.getBalance())) {
+ throw new Exception("结算后检查失败:商户["+shopaccno+"]余额不等,商户日结余额[" + tShopaccday.getBalance() + "]凭证商户余额[" + v_merchbaldict.get(shopaccno) + "]");
+ }
+// TShopaccbal tShopaccbal = shopaccbalDao.getOne(shopaccno);
+// tShopaccbal.setBalance(tShopaccday.getBalance());
+// tShopaccbal.setUpdtime(systemUtilService.getSysdatetime().getHostdatetime());
+// shopaccbalDao.save(tShopaccbal); //商户期末余额
+ }
+
+ //核算科目日结表科目余额和凭证明细余额是否一致
+ for (String subjno : v_subjbaldict.keySet()) {
+ TSubjectday tSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), subjno);
+ if (!MoneyUtil.moneyEqual(v_subjbaldict.get(subjno), tSubjectday.getDrbal() + tSubjectday.getCrbal())) {
+ throw new Exception("结算后检查失败:科目日结表期末余额不等,科目号[" + subjno + "],科目余额[" + (tSubjectday.getDrbal() + tSubjectday.getCrbal()) + "],凭证科目余额[" + v_subjbaldict.get(subjno) + "]");
+ }
+ TSubjectbal tSubjectbal = subjectbalDao.getOne(subjno);
+ tSubjectbal.setBegindrbal(tSubjectday.getBegindrbal());
+ tSubjectbal.setBegincrbal(tSubjectday.getBegincrbal());
+ tSubjectbal.setDramt(tSubjectday.getDramt());
+ tSubjectbal.setCramt(tSubjectday.getCramt());
+ tSubjectbal.setDrbal(tSubjectday.getDrbal());
+ tSubjectbal.setCrbal(tSubjectday.getCrbal());
+ tSubjectbal.setUpdtime(systemUtilService.getSysdatetime().getHostdatetime());
+ subjectbalDao.save(tSubjectbal);
+ }
+
+ //核对商户日结表余额表和科目日结表商户余额是否一致
+ TSubjectday shopSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), Subject.SUBJNO_MACHANT_INCOME);
+ Double merchbal = shopaccdayDao.getSumBalance(String.valueOf(settledate));
+ double shopSubbal = (shopSubjectday == null ? 0 : shopSubjectday.getCrbal());
+ double shopMerchbal = (merchbal == null ? 0 : merchbal);
+ if (!MoneyUtil.moneyEqual(shopSubbal, shopMerchbal)) {
+ throw new Exception("结算后检查失败:商户日结表和科目日结表期末余额不平衡,商户[" + shopMerchbal + "] 科目[" + shopSubbal + "]");
+ }
+
+ //核算一级科目余额是否平衡
+ FSubjectInfoBean allParentSubjbal = subjectdayDao.getAllParentSubjectSumInfo(String.valueOf(settledate));
+ if (!MoneyUtil.moneyEqual(allParentSubjbal.getBegindrbal(), allParentSubjbal.getBegincrbal())) {
+ throw new Exception("结算后检查失败:一级科目余额表期初余额不平衡,借方[" + allParentSubjbal.getBegindrbal() + "],贷方[" + allParentSubjbal.getBegincrbal() + "]");
+ }
+ if (!MoneyUtil.moneyEqual(allParentSubjbal.getDramt(), allParentSubjbal.getCramt())) {
+ throw new Exception("结算后检查失败:一级科目余额表发生额不平衡,借方[" + allParentSubjbal.getDramt() + "],贷方[" + allParentSubjbal.getCramt() + "]");
+ }
+ if (!MoneyUtil.moneyEqual(allParentSubjbal.getDrbal(), allParentSubjbal.getCrbal())) {
+ throw new Exception("结算后检查失败:一级科目余额表期末额不平衡,借方[" + allParentSubjbal.getDrbal() + "]贷方[" + allParentSubjbal.getCrbal() + "]");
+ }
+ //校验科目余额表的balflag=1的总期末余额和balflag=2的总期末余额是否一致
+ Double balflag_1_sumbal = subjectbalDao.getSumEndsubjectBalByEndflag(1);
+ Double balflag_2_sumbal = subjectbalDao.getSumEndsubjectBalByEndflag(2);
+ if (null == balflag_1_sumbal || null == balflag_1_sumbal) throw new Exception("结算后检查失败:科目余额表无数据");
+ if (!MoneyUtil.moneyEqual(balflag_1_sumbal, balflag_2_sumbal)) {
+ throw new Exception("结算后检查失败:科目余额表期末余额不平衡,借方[" + balflag_1_sumbal + "],贷方[" + balflag_2_sumbal + "]");
+ }
+ //TODO: 校验 账户余额汇总值和科目日结表值是否一致
+
+ //日切
+ tSettlectl.setStatus(0); //清标记
+ tSettlectl.setPeriodYear(periodYear);
+ tSettlectl.setPeriodMonth(periodMonth);
+ tSettlectl.setSettledate(Integer.valueOf(DateUtil.getNewDay(String.valueOf(settledate), 1)));
+ tSettlectl.setUpdtime(systemUtilService.getSysdatetime().getHostdatetime());
+ settleCtlDao.save(tSettlectl);
+ return true;
+ }
+
+ @Override
+ public boolean doVoucherSettle(String voucherid) throws Exception {
+ if (StringUtil.isEmpty(voucherid)) throw new Exception("参数为空");
+
+ TSettlectl settlectl = settleCtlDao.findByBooksetno(1);
+ if (null == settlectl || null == settlectl.getBooksetno()) {
+ throw new Exception("系统初始化参数错误");
+ }
+
+// int hostDate = Integer.valueOf(systemUtilService.getSysdatetime().getHostdatetime());
+// int prdyear = settlectl.getPeriodYear();
+// int prdmonth = settlectl.getPeriodMonth();
+// int settday = settlectl.getSettledate();
+//
+// List<String> newShopList = shopaccDao.getNewAddShopacc(String.valueOf(settday));
+// if (!StringUtil.isEmpty(newShopList)) {
+// for (String accno : newShopList) {
+// TShopaccbal shopBal = new TShopaccbal(accno);
+// shopaccbalDao.save(shopBal);
+// }
+// }
+// if (shopaccDao.checkSettleShopacc().getExisted() > 0) {
+// throw new Exception("初始化数据错误:商户余额表数据没有包含所有有效的商户账户余额");
+// }
+//
+// //新增科目插入科目余额表(末级科目)
+// List<String> newEndsubjectList = subjectDao.getNewSubject();
+// if (!StringUtil.isEmpty(newEndsubjectList)) {
+// for (String subjno : newEndsubjectList) {
+// TSubjectbal subjectbal = new TSubjectbal(subjno);
+// subjectbalDao.save(subjectbal);
+// }
+// }
+// if (subjectDao.checkSettleSubject().getExisted() > 0) {
+// throw new Exception("初始化数据错误:科目余额表数据没有包含所有的科目余额");
+// }
+//
+// TVoucher voucher = voucherDao.findByVoucheridWithLock(voucherid);
+// List<TVoucherEntry> entryList = voucherEntryDao.getVoucherEntryByVoucherid(voucherid);
+// if (null == voucher) {
+// throw new Exception("凭证查询无记录");
+// } else if ("auto".equals(voucher.getSourcetype())) {
+// throw new Exception("该凭证不是手工录入凭证");
+// } else if (voucher.getCheckflag() != 1) {
+// throw new Exception("该凭证未审核");
+// } else if (StringUtil.isEmpty(voucher.getSummary())) {
+// throw new Exception("摘要不能为空");
+// } else if (voucher.getPostflag() == 1) {
+// throw new Exception("凭证已入账");
+// }
+//
+// if (StringUtil.isEmpty(entryList)) {
+// throw new Exception("凭证无借贷明细!");
+// }
+//
+// //凭证号
+// TVouchernoCtl vouchernoCtl = vouchernoCtlDao.getVoucherno();
+// if (null == vouchernoCtl) {
+// vouchernoCtl = new TVouchernoCtl(1, periodMonth, 0);
+// vouchernoCtlDao.save(vouchernoCtl);
+// }
+// int voucherno = vouchernoCtl.getVoucherno() + 1;
+// vouchernoCtl.setVoucherno(voucherno);
+// vouchernoCtlDao.save(vouchernoCtl);
+//
+// voucher.setVoucherno(voucherno);
+// voucher.setPostflag(1);
+// voucherDao.save(voucher); //修改凭证表凭证号、入账标志
+//
+// //明细
+// for (TVoucherEntry entry : entryList) {
+// if (Subject.SUBJNO_MACHANT_INCOME.equals(entry.getSubjno())) {
+// TShopaccbal tShopaccbal = shopaccbalDao.getTShopaccbalByIdWithLock(entry.getAccno());
+// if (null == tShopaccbal) {
+// throw new Exception("商户表商户账号[" + entry.getAccno() + "]不存在");
+// }
+// tShopaccbal.setBalance(tShopaccbal.getBeginbal() + entry.getCramt() - entry.getDramt());
+// shopaccbalDao.save(tShopaccbal);
+// entry.setBalflag(2);
+// entry.setBalance(tShopaccbal.getBalance());
+// } else {
+// TSubjectbal tSubjectbal = subjectbalDao.getTSubjectbalBySubjnoWithLock(entry.getSubjno());
+// TSubject subject = subjectDao.getOne(entry.getSubjno());
+// if (null == tSubjectbal || null == subject) {
+// throw new Exception("科目表科目号[" + entry.getSubjno() + "]不存在");
+// } else if (subject.getEndflag() != 1) {
+// throw new Exception("科目[" + entry.getSubjno() + "]非末级科目");
+// }
+// entry.setBalflag(subject.getBalflag());
+// if (subject.getBalflag() == 1) {
+// tSubjectbal.setDrbal(tSubjectbal.getDrbal() + entry.getDramt() - entry.getCramt());
+// entry.setBalance(tSubjectbal.getDrbal());
+// } else {
+// tSubjectbal.setCrbal(tSubjectbal.getCrbal() - entry.getDramt() + entry.getCramt());
+// entry.setBalance(tSubjectbal.getCrbal());
+// }
+// subjectbalDao.save(tSubjectbal);
+// }
+//
+// if (!StringUtil.isEmpty(entry.getOppaccno())) {
+// entry.setOppname(shopaccDao.getShopname(entry.getOppaccno()));
+// } else {
+// entry.setOppname(subjectDao.getSubjectname(entry.getOppsubjno()));
+// }
+// voucherEntryDao.save(entry);
+// }
+
+ return true;
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendStatisticsServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendStatisticsServiceImpl.java
new file mode 100644
index 0000000..b7d5c1b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendStatisticsServiceImpl.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.service.impl;
+
+import com.supwisdom.dlpay.framework.service.DayendStatisticsService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DayendStatisticsServiceImpl implements DayendStatisticsService {
+
+ @Override
+ public boolean doDayendStatistics() throws Exception {
+ return false;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
new file mode 100644
index 0000000..755828d
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/OperatorDetailServiceImpl.java
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.framework.service.impl;
+
+import com.supwisdom.dlpay.framework.dao.OperRoleDao;
+import com.supwisdom.dlpay.framework.dao.OperatorDao;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.service.OperatorDetailService;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+@Service
+public class OperatorDetailServiceImpl implements OperatorDetailService {
+ @Autowired
+ private OperatorDao operatorDao;
+ @Autowired
+ private OperRoleDao operRoleDao;
+
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+ TOperator oper = operatorDao.findByOpercode(username);
+ if (null == oper) {
+ throw new UsernameNotFoundException("管理员不存在");
+ }
+ Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>() {
+ };
+
+ List<String> roles = operRoleDao.getRolecodeByOperid(oper.getOperid());
+ if (!StringUtil.isEmpty(roles)) {
+ authorities = AuthorityUtils.createAuthorityList(roles.toArray(new String[0]));
+ }
+ oper.setAuthorities(authorities);
+ return oper;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
new file mode 100644
index 0000000..51b2b0b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
@@ -0,0 +1,217 @@
+package com.supwisdom.dlpay.framework.service.impl;
+
+import com.supwisdom.dlpay.framework.core.DatabaseConfig;
+import com.supwisdom.dlpay.framework.dao.*;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.domain.*;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.NumberUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Service
+public class SystemUtilServiceImpl implements SystemUtilService {
+ @Autowired
+ private DatabaseConfig databaseConfig;
+
+ @Autowired
+ private TaskLockDao taskLockDao;
+ @Autowired
+ private SettleCtlDao settleCtlDao;
+ @Autowired
+ private TranscodeDao transcodeDao;
+ @Autowired
+ private SysparaDao sysparaDao;
+ @Autowired
+ private BusinessparaDao businessparaDao;
+
+ private static final Logger logger = LoggerFactory.getLogger(SystemUtilServiceImpl.class);
+
+ /**
+ * 获取oracle数据库时间
+ */
+ private SystemDateTime getOracleDatetime() {
+ return taskLockDao.getOracleDatetime();
+ }
+
+ private SystemDateTime getPGDatetime() {
+ return taskLockDao.getPGDatetime();
+ }
+
+ @Override
+ public SystemDateTime getSysdatetime() {
+ switch (databaseConfig.getPlatform()) {
+ case "postgresql":
+ return getPGDatetime();
+ default:
+ return getOracleDatetime();
+ }
+ }
+
+ @Override
+ public TTaskLock updateTaskLock(TTaskLock lock) {
+ return taskLockDao.save(lock);
+ }
+
+ @Override
+ public TTaskLock doLockTask(String taskcode, Integer minRecover, String remark) {
+ if (null == minRecover) minRecover = 10; //默认10分钟
+ String hostdatetime = getSysdatetime().getHostdatetime(); //yyyyMMddHHmmss
+ TTaskLock lock = taskLockDao.getTaskLockWithLock(taskcode);
+ if (lock != null) {
+ if (lock.getTaskstatus() == 1 && DateUtil.compareDatetime(DateUtil.getNewTime(hostdatetime, -60 * minRecover), lock.getTasktime()) < 0) {
+ // 被锁,正在执行操作
+ return null;
+ } else {
+ lock.setTaskstatus(1);
+ lock.setTasktime(hostdatetime);
+ taskLockDao.save(lock);
+ return lock;
+ }
+ } else {
+ lock = new TTaskLock();
+ lock.setTaskcode(taskcode);
+ lock.setTaskstatus(1);
+ lock.setTasktime(hostdatetime);
+ lock.setRemark(remark);
+ taskLockDao.save(lock);
+ }
+ return lock;
+ }
+
+ @Override
+ public String getAccdate() {
+ String hostdate = getSysdatetime().getHostdate();
+ TSettlectl settlectl = settleCtlDao.getOne(1);
+ if (null != settlectl && null != settlectl.getSettledate()) {
+ if (Integer.valueOf(hostdate) < settlectl.getSettledate().intValue()) {
+ return settlectl.getSettledate().toString();
+ }
+ }
+ return hostdate;
+ }
+
+ private String getOracleRefno() {
+ return taskLockDao.getOracleRefno();
+ }
+
+ @Override
+ public String getRefno() {
+ switch (databaseConfig.getPlatform()) {
+ case "postgresql":
+ return taskLockDao.getPgRefno();
+ default:
+ return taskLockDao.getOracleRefno();
+ }
+ }
+
+ @Override
+ public String getTranscodeName(int transocde, String defaultValue) {
+ TTranscode tTranscode = transcodeDao.getOne(transocde);
+ if (null != tTranscode && !StringUtil.isEmpty(tTranscode.getTransname())) {
+ return tTranscode.getTransname();
+ }
+ return defaultValue;
+ }
+
+ @Override
+ public String getSysparaValue(int paraid) {
+ TSyspara syspara = sysparaDao.findByParaid(paraid);
+ if (null != syspara) return syspara.getParaval();
+ return null;
+ }
+
+ @Override
+ public String getSysparaValue(int paraid, String defaultValue) {
+ String paraval = getSysparaValue(paraid);
+ if (null != paraval) return paraval;
+ return defaultValue;
+ }
+
+ @Override
+ public boolean getSysparaValueAsBoolean(int paraid) {
+ TSyspara syspara = sysparaDao.findByParaid(paraid);
+ if (null != syspara && "1".equals(syspara.getParaval())) return true;
+ return false;
+ }
+
+ @Override
+ public int getSysparaValueAsInt(int paraid, int defaultValue) {
+ TSyspara syspara = sysparaDao.findByParaid(paraid);
+ if (null != syspara && NumberUtil.isNumber(syspara.getParaval()))
+ return Integer.parseInt(syspara.getParaval());
+ return defaultValue;
+ }
+
+ @Override
+ public double getSysparaValueAsDouble(int paraid, double defaultValue) {
+ TSyspara syspara = sysparaDao.findByParaid(paraid);
+ if (null != syspara && NumberUtil.isDecimal(syspara.getParaval()))
+ return Double.parseDouble(syspara.getParaval());
+ return defaultValue;
+ }
+
+ @Override
+ public TSyspara getSyspara(int paraid) {
+ return sysparaDao.findByParaid(paraid);
+ }
+
+ @Override
+ public TSyspara getSysparaValueForUpdate(int paraid) {
+ return sysparaDao.findByParaidWithLock(paraid);
+ }
+
+ @Override
+ public TSyspara getSysparaValueForUpdateNowait(int paraid) {
+ return sysparaDao.findByParaidWithLockNowait(paraid);
+ }
+
+ @Override
+ public String getBusinessValue(String parakey) {
+ if (!StringUtil.isEmpty(parakey)) {
+ TBusinesspara businesspara = businessparaDao.findByParakey(parakey.trim());
+ if (null != businesspara) return businesspara.getParaval();
+ }
+ return null;
+ }
+
+ @Override
+ public String getBusinessValue(String parakey, String defaultValue) {
+ String paraval = getBusinessValue(parakey);
+ if (!StringUtil.isEmpty(paraval)) return paraval;
+ return defaultValue;
+ }
+
+ @Override
+ public TBusinesspara getBusiness(String parakey) {
+ if (!StringUtil.isEmpty(parakey)) return businessparaDao.findByParakey(parakey.trim());
+ return null;
+ }
+
+ @Override
+ public TBusinesspara getBusinessValueForUpdate(String parakey) {
+ if (!StringUtil.isEmpty(parakey)) return businessparaDao.findByParakeyForUpdate(parakey.trim());
+ return null;
+ }
+
+ @Override
+ public TBusinesspara getBusinessValueForUpdateNowait(String parakey) {
+ if (!StringUtil.isEmpty(parakey)) return businessparaDao.findByParakeyForUpdateNowait(parakey.trim());
+ return null;
+ }
+
+ @Override
+ public String getSubsystemSignKey(String syscode) {
+ // fixme: 验证数据无误性签名秘钥
+ return "";
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/HibernateConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/HibernateConfig.java
new file mode 100644
index 0000000..5c28d84
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/HibernateConfig.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.framework.tenant;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.sql.DataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+@Configuration
+@Slf4j
+public class HibernateConfig {
+
+ private final JpaProperties jpaProperties;
+
+ private final HibernateProperties hibernateProperties;
+
+ public HibernateConfig(@Autowired JpaProperties jpaProperties,
+ HibernateProperties hibernateProperties) {
+ this.jpaProperties = jpaProperties;
+ this.hibernateProperties = hibernateProperties;
+ }
+
+ @Bean
+ public JpaVendorAdapter getJpaVendorAdapter() {
+ HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
+ adapter.setGenerateDdl(true);
+ return adapter;
+ }
+
+ @Bean("entityManagerFactory")
+ public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource,
+ MultiTenantConnectionProvider multiTenantConnectionProvider,
+ CurrentTenantIdentifierResolver currentTenantIdentifierResolver) {
+ Map<String, Object> properties = new HashMap<>();
+ properties.putAll(hibernateProperties
+ .determineHibernateProperties(jpaProperties.getProperties(),
+ new HibernateSettings()));
+ properties.put(Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
+ properties.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProvider);
+ properties.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolver);
+
+ LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+ em.setDataSource(dataSource);
+ em.setPackagesToScan("com.supwisdom");
+ em.setJpaPropertyMap(properties);
+ em.setJpaVendorAdapter(getJpaVendorAdapter());
+ log.info("setup multi-tenant entityManagerFactor");
+ return em;
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantConnectionProviderImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantConnectionProviderImpl.java
new file mode 100644
index 0000000..d13ffdb
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantConnectionProviderImpl.java
@@ -0,0 +1,67 @@
+package com.supwisdom.dlpay.framework.tenant;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.jdbc.connections.spi.AbstractDataSourceBasedMultiTenantConnectionProviderImpl;
+import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+/**
+ * Created by shuwei on 2018/12/4.
+ */
+@Component
+public class MultiTenantConnectionProviderImpl implements MultiTenantConnectionProvider {
+ @Autowired
+ private DataSource dataSource;
+
+ @Override
+ public Connection getAnyConnection() throws SQLException {
+ return dataSource.getConnection();
+ }
+
+ @Override
+ public void releaseAnyConnection(Connection connection) throws SQLException {
+ connection.close();
+ }
+
+ @Override
+ public Connection getConnection(String ti) throws SQLException {
+ String tenantIdentifier = TenantContext.getTenantSchema();
+ final Connection connection = getAnyConnection();
+ try {
+ if (tenantIdentifier != null) {
+ connection.createStatement().execute("SET search_path = \"" + tenantIdentifier + "\", public");
+ } else {
+ connection.createStatement().execute("SET search_path = public");
+ }
+ } catch (SQLException e) {
+ throw new HibernateException("Problem setting schema to " + tenantIdentifier, e);
+ }
+ return connection;
+ }
+
+ @Override
+ public void releaseConnection(String tenantIdentifier, Connection connection) throws SQLException {
+ connection.close();
+ }
+
+ @Override
+ public boolean supportsAggressiveRelease() {
+ return false;
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public boolean isUnwrappableAs(Class unwrapType) {
+ return false;
+ }
+
+ @Override
+ public <T> T unwrap(Class<T> unwrapType) {
+ return null;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantIdentifierResolver.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantIdentifierResolver.java
new file mode 100644
index 0000000..c1dc432
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantIdentifierResolver.java
@@ -0,0 +1,23 @@
+package com.supwisdom.dlpay.framework.tenant;
+
+import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created by shuwei on 2018/12/4.
+ */
+@Component
+public class MultiTenantIdentifierResolver implements CurrentTenantIdentifierResolver {
+ @Override
+ public String resolveCurrentTenantIdentifier() {
+ if (TenantContext.getTenantSchema() == null) {
+ return "default";
+ }
+ return TenantContext.getTenantSchema();
+ }
+
+ @Override
+ public boolean validateExistingCurrentSessions() {
+ return true;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantContext.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantContext.java
new file mode 100644
index 0000000..c1d4ca4
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantContext.java
@@ -0,0 +1,20 @@
+package com.supwisdom.dlpay.framework.tenant;
+
+/**
+ * Created by shuwei on 2018/11/29.
+ */
+public class TenantContext {
+ private static ThreadLocal<String> currentTenant = new ThreadLocal<>();
+
+ public static void setTenantSchema(String tid) {
+ currentTenant.set(tid);
+ }
+
+ public static String getTenantSchema() {
+ return currentTenant.get();
+ }
+
+ public static void clear() {
+ currentTenant.set(null);
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantInterceptor.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantInterceptor.java
new file mode 100644
index 0000000..e60b957
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantInterceptor.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.framework.tenant;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.Constants;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class TenantInterceptor extends HandlerInterceptorAdapter {
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
+ throws Exception {
+ String tenantId = request.getHeader(Constants.HEADER_TETANTID);
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ if (auth != null && auth.getPrincipal() instanceof TOperator) {
+ TOperator oper = (TOperator) auth.getPrincipal();
+ if (tenantId != null && !oper.getTenantId().equals(tenantId)) {
+ throw new RuntimeException("tenant ID 不匹配");
+ }
+ TenantContext.setTenantSchema(oper.getTenantId());
+ } else {
+ TenantContext.setTenantSchema(tenantId);
+ }
+ return true;
+ }
+
+ @Override
+ public void postHandle(HttpServletRequest request, HttpServletResponse response,
+ Object handler, ModelAndView modelAndView)
+ throws Exception {
+ //
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java
new file mode 100644
index 0000000..17dd6bc
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class Constants {
+ // HTTP HEADER define
+ public static final String HEADER_TETANTID = "X-TENANT-ID";
+
+ // define
+ public static final String JWT_CLAIM_TENANTID = "tenantId";
+ public static final String JWT_CLAIM_UID = "uid";
+ public static final String JWT_CLAIM_AUTHORITIES = "authorities";
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
new file mode 100644
index 0000000..fe39ac8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
@@ -0,0 +1,361 @@
+package com.supwisdom.dlpay.framework.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+public class DateUtil {
+ private static final Logger logger = LoggerFactory.getLogger(DateUtil.class);
+ public static final String DATE_FMT = "yyyyMMdd";
+ public static final String TIME_FMT = "HHmmss";
+ public static final String DATETIME_FMT = "yyyyMMddHHmmss";
+
+ /**
+ * Description: 返回一个当前时间 @return String 格式:yyyyMMddHHmmss @exception Modify
+ * History:
+ */
+ public static String getNow() {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+ return sdf.format(new Date());
+ }
+
+
+ /**
+ * Description: 根据类型返回一个当前时间 @param partten String @return String 格式:partten
+ */
+ public static String getNow(String partten) {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(partten);
+ return sdf.format(new Date());
+ }
+ /*
+ *
+ * */
+ public static String getNowInterDay(int intervalday) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+ Date d = new Date();
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(d.getTime());
+ calendar.add(Calendar.DATE, intervalday);
+ return sdf.format(calendar.getTime());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * Description: 得到一个特殊的时间 @param startTime String 格式:yyyyMMddHHmmss @param
+ * interval int 秒 @return String 格式:partten @exception Modify History:
+ */
+ public static String getNewTime(String startTime, int interval) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+ Date d = sdf.parse(startTime);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(d.getTime());
+ calendar.add(Calendar.SECOND, interval);
+ return sdf.format(calendar.getTime());
+ } catch (ParseException e) {
+ return startTime;
+ }
+ }
+
+ /**
+ * Description: 得到一个特殊的时间 @param startTime String 格式:partten @param
+ * interval int 秒 @return String 格式:partten @exception Modify History:
+ */
+ public static String getNewTime(String startTime, int interval, String partten) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(partten);
+ Date d = sdf.parse(startTime);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(d.getTime());
+ calendar.add(Calendar.SECOND, interval);
+ return sdf.format(calendar.getTime());
+ } catch (ParseException e) {
+ return startTime;
+ }
+ }
+
+ public static String getNewDay(String startDay, int intervalday) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+ Date d = sdf.parse(startDay);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(d.getTime());
+ calendar.add(Calendar.DATE, intervalday);
+ return sdf.format(calendar.getTime());
+ } catch (ParseException e) {
+ return startDay;
+ }
+ }
+
+ /**
+ * 得到两个日期相差的天数 格式 yyyyMMdd @return diffdays = secondDay - firstDay
+ */
+ public static long getIntervalDay(String firstDay, String secondDay) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+ Date f = sdf.parse(firstDay);
+ Date s = sdf.parse(secondDay);
+ long time = s.getTime() - f.getTime();
+ return time / (24 * 60 * 60 * 1000);
+ } catch (ParseException e) {
+ return 0;
+ }
+ }
+
+ /**
+ * Description: 比较两个时间字符串的前后关系 @param firstTime String 格式:yyyyMMddHHmmss
+ *
+ * @param secondTime String 格式: yyyyMMddHHmmss @return int |
+ * firstTime=second int=0 | firstTime>secondTime int>0 |
+ * firstTime<secondTime int<0 @exception Modify History:
+ */
+ public static int compareDatetime(String firstTime, String secondTime) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+ Date f = sdf.parse(firstTime);
+ Date s = sdf.parse(secondTime);
+ return f.compareTo(s);
+ } catch (ParseException e) {
+ return 0;
+ }
+ }
+
+ /**
+ * Description: 比较两个时间字符串的前后关系 @param firstTime String 格式:pattern
+ *
+ * @param secondTime String 格式: yyyyMMddHHmmss @return int |
+ * firstTime=second int=0 | firstTime>secondTime int>0 |
+ * firstTime<secondTime int<0 @exception Modify History:
+ */
+ public static int compareDatetime(String firstTime, String secondTime, String pattern) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+ Date f = sdf.parse(firstTime);
+ Date s = sdf.parse(secondTime);
+ return f.compareTo(s);
+ } catch (ParseException e) {
+ return 0;
+ }
+ }
+
+ /**
+ * Description: 比较两个时间字符串的时间差 @param firstTime String 格式:yyyyMMddHHmmss
+ *
+ * @param secondTime String 格式: yyyyMMddHHmmss @param second int 格式 @return
+ * int | firstTime+seconds=secondTime int=0 | firstTime+seconds>secondTime
+ * int>0 | firstTime+seconds<secondTime int<0 @exception Modify History:
+ */
+ public static int compareDatetime(String firstTime, String secondTime, int seconds) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+ Date f = sdf.parse(firstTime);
+ Date s = sdf.parse(secondTime);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(f.getTime());
+ calendar.add(Calendar.SECOND, seconds);
+ Date temp = calendar.getTime();
+ return temp.compareTo(s);
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ /**
+ * Description: 对time重新格式化
+ */
+ public static String reformatDatetime(String time, String fromPattern, String toPattern) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(fromPattern);
+ Date d = sdf.parse(time);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(d.getTime());
+ sdf = new SimpleDateFormat(toPattern);
+ return sdf.format(calendar.getTime());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return time;
+ }
+ }
+
+ /**
+ * 获得两个字符串日期之间的时间差(单位毫秒) 格式 yyyyMMddHHmmss
+ */
+ public static long getInterval(String startTime, String endTime) {
+ long duration = 0;
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+ duration = sdf.parse(endTime).getTime() - sdf.parse(startTime).getTime();
+ } catch (ParseException e) {
+ logger.error("Hi guys,there is an error when you try to parse the date string");
+ }
+ return duration;
+ }
+
+ /**
+ * 获得两个字符串日期之间的时间差(单位毫秒)
+ */
+ public static long getIntervalTime(String startTime, String endTime, String pattern) {
+ long duration = 0;
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+ duration = sdf.parse(endTime).getTime() - sdf.parse(startTime).getTime();
+ } catch (ParseException e) {
+ logger.error("Hi guys,there is an error when you try to parse the date string");
+ }
+ return duration;
+ }
+
+ /**
+ * 转换成日期格式
+ * 短格式:20140401 -> 2014-04-01
+ * 中格式:201404011200 -> 2014-04-01 12:00
+ * 长格式:20140401123025 -> 2014-04-01 12:30:25
+ **/
+ public static String parseToDateFormat(String str) {
+ switch (str.length()) {
+ case 8:
+ str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8);
+ break;
+ case 12:
+ str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10) + ":" + str.substring(10, 12);
+ break;
+ case 14:
+ str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10) + ":" + str.substring(10, 12) + ":" + str.substring(12, 14);
+ break;
+ default:
+ break;
+ }
+ return str;
+ }
+
+ /**
+ * 解日期格式
+ * 短格式:2014-04-01 -> 20140401
+ * 中格式:2014-04-01 12:00 -> 201404011200
+ * 长格式:2014-04-01 12:30:25 -> 20140401123025
+ **/
+ public static String unParseToDateFormat(String str) {
+ return str.replaceAll("-", "").replaceAll(" ", "").replaceAll(":", "");
+ }
+
+ /**
+ * 检验时间格式
+ */
+ public static boolean checkDatetimeValid(String datetime, String pattern) {
+ if (null == datetime) return false;
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+ Date d = sdf.parse(datetime);
+ return datetime.trim().equals(sdf.format(d));
+ } catch (Exception e) {
+ }
+ return false;
+ }
+
+ /**
+ * 获取指定日期是星期几 格式 yyyyMMdd
+ * MON|TUE|WED|THU|FRI|SAT|SUN
+ * 1 2 3 4 5 6 7
+ */
+ public static int getWeekday(String datestr) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+ Calendar calendar = Calendar.getInstance();
+ boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY); //一周第一天是否为星期天
+ Date d = sdf.parse(datestr);
+ calendar.setTimeInMillis(d.getTime());
+ int weekDay = calendar.get(calendar.DAY_OF_WEEK);
+ if (isFirstSunday) {
+ weekDay = weekDay - 1;
+ if (weekDay == 0) {
+ weekDay = 7;
+ }
+ }
+ return weekDay;
+ } catch (Exception e) {
+ return -1;
+ }
+ }
+
+ /**
+ * 获取指定日期
+ */
+ public static Date getSpecifyDate(String datestr, String pattern) {
+ try {
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+ Date result = sdf.parse(datestr);
+ return result;
+ } catch (Exception e) {
+ return new Date();
+ }
+ }
+
+ public static Integer getLastDayOfMonth(Integer year, Integer month) {
+ Calendar cal = Calendar.getInstance();
+ cal.set(Calendar.YEAR, year);
+ cal.set(Calendar.MONTH, month - 1);
+ cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DATE));
+ String str = new SimpleDateFormat("yyyyMMdd ").format(cal.getTime()).toString();
+ Integer result = Integer.parseInt(str.substring(0, 4) + str.substring(4, 6) + str.substring(6, 8));
+ return result;
+ }
+
+ private static Date set(Date date, int calendarField, int amount) {
+ Calendar c = Calendar.getInstance();
+ c.setLenient(false);
+ c.setTime(date);
+ c.add(calendarField, amount);
+ return c.getTime();
+ }
+
+
+ public static Date setMinutes(Date date, int amount) {
+ return set(date, Calendar.MINUTE, amount);
+ }
+
+
+ public static long getNowSecond() {
+ Calendar calendar = Calendar.getInstance();
+ return calendar.getTimeInMillis() / 1000;
+ }
+
+
+ public static String getUTCTime(Long timeInMillisSecond) {
+ Calendar time = Calendar.getInstance();
+ SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
+ fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
+ time.setTimeInMillis(timeInMillisSecond);
+ return fmt.format(time.getTime());
+ }
+
+ public static String getUTCTime() {
+ return getUTCTime(System.currentTimeMillis());
+ }
+
+ public static int compareDay(Timestamp d1, Timestamp d2) {
+ Calendar cd1 = Calendar.getInstance();
+ cd1.setTimeInMillis(d1.getTime());
+ Calendar cd2 = Calendar.getInstance();
+ cd2.setTimeInMillis(d2.getTime());
+
+ if (cd1.get(Calendar.YEAR) != cd2.get(Calendar.YEAR)) {
+ return cd1.compareTo(cd2);
+ }
+
+ return Integer.compare(cd1.get(Calendar.DAY_OF_YEAR), cd2.get(Calendar.DAY_OF_YEAR));
+ }
+
+ public static Boolean sameDay(Timestamp d1, Timestamp d2) {
+ return (compareDay(d1, d2) == 0);
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java
new file mode 100644
index 0000000..46377e9
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class Dictionary {
+ // dictionary 表字典
+ public static final String REVERSE_FLAG = "reverseflagList";
+ public static final String DTL_STATUS = "dtlStatusList";
+ public static final String IDTYPE = "idtypeList";
+ public static final String SEX = "sexList";
+ public static final String ACCOUNT_STATUS = "accountStatusList";
+
+ /////////////////////////////////////
+ public static final String SOURCE_TYPE = "sourcetypeList";
+ public static final String TRANS_CODE = "transcodeList";
+ public static final String PAY_TYPE = "paytypelist";
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java
new file mode 100644
index 0000000..7ea105c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java
@@ -0,0 +1,116 @@
+package com.supwisdom.dlpay.framework.util;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+public class HmacUtil {
+ /**
+ * 除去数组中的空值和签名参数
+ *
+ * @param sArray 签名参数组
+ * @return 去掉空值与签名参数后的新签名参数组
+ */
+ public static Map<String, String> paraFilter(Map<String, String> sArray) {
+
+ Map<String, String> result = new HashMap<String, String>();
+
+ if (sArray == null || sArray.size() <= 0) {
+ return result;
+ }
+
+ for (String key : sArray.keySet()) {
+ String value = sArray.get(key);
+ if (value == null || value.equals("") || "null".equals(value) || key.equalsIgnoreCase("sign")) {
+ continue;
+ }
+ result.put(key, value);
+ }
+
+ return result;
+ }
+
+ private static String HMACSHAX(String data, String key, String alg) {
+ String algorithm = "";
+ if ("SHA1".equals(alg)) {
+ algorithm = "HmacSHA1";
+ } else if ("SHA256".equals(alg)) {
+ algorithm = "HmacSHA256";
+ } else if ("SHA512".equals(alg)) {
+ algorithm = "HmacSHA512";
+ }
+ byte[] byteHMAC = null;
+ try {
+ Mac mac = Mac.getInstance(algorithm);
+ SecretKeySpec spec = new SecretKeySpec(key.getBytes(), algorithm);
+ mac.init(spec);
+ byteHMAC = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
+ } catch (InvalidKeyException | NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+
+ if (byteHMAC != null) {
+ try {
+ String hexMac = getHexString(byteHMAC);
+ return hexMac;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+ return null;
+ }
+
+ public static String HMACSHA256(String data, String key) {
+ return HMACSHAX(data, key, "SHA256");
+ }
+
+ public static String HMACSHA512(String data, String key) {
+ return HMACSHAX(data, key, "SHA512");
+ }
+
+ public static String HMACSHA1(String data, String key) {
+ return HMACSHAX(data, key, "SHA1");
+ }
+
+ public static String getHexString(byte[] b) throws Exception {
+ String result = "";
+ for (int i = 0; i < b.length; i++) {
+ result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
+ }
+ return result;
+ }
+
+ public static boolean checkHmacSign(String data, String key, String sign) {
+ String asign = HMACSHA1(data, key);
+ if (asign == null) {
+ return false;
+ }
+ if (asign.equalsIgnoreCase(sign)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public static void main(String[] args) {
+ String refno = DateUtil.getNow();
+ Map<String, String> mapValue = new HashMap<String, String>();
+ mapValue.put("tradeaccount", "10000097");
+ mapValue.put("tradename", "在线点餐");
+ mapValue.put("tradeamount", "1");
+ mapValue.put("paidamount", "1");
+ mapValue.put("outtradeno", refno);
+ mapValue.put("yktshopid", "2");
+ mapValue.put("shopid", "68512084");
+ String signstr = StringUtil.createLinkString(HmacUtil.paraFilter(mapValue));
+ String sign = HmacUtil.HMACSHA1(signstr, "adc4ac6822fd462780f878b86cb94688");
+ System.out.println("{\"tradeaccount\":\"10000097\",\"tradename\":\"在线点餐\",\"tradeamount\":\"1\"," +
+ "\"paidamount\": \"1\",\"outtradeno\":\"" + refno + "\",\"yktshopid\": \"2\",\"shopid\":\"68512084\",\"sign\": \"" + sign + "\"}");
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java
new file mode 100644
index 0000000..4d5ba84
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java
@@ -0,0 +1,70 @@
+package com.supwisdom.dlpay.framework.util;
+
+import java.security.MessageDigest;
+
+public class MD5 {
+ //十六进制下数字到字符的映射数组
+ private final static String[] hexDigits = {"0", "1", "2", "3", "4",
+ "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
+
+ /** * 把inputString加密 */
+ public static String generatePassword(String data, String salt){
+ String enyptString = data+"{"+salt+"}";
+ return encodeByMD5(enyptString);
+ }
+
+ /**
+ * 验证输入的密码是否正确
+ * @param password 加密后的密码
+ * @param inputString 输入的字符串
+ * @return 验证结果,TRUE:正确 FALSE:错误
+ */
+ public static boolean validatePassword(String password, String inputString){
+ if(password.equals(encodeByMD5(inputString))){
+ return true;
+ } else{
+ return false;
+ }
+ }
+ /** 对字符串进行MD5加密 */
+ public static String encodeByMD5(String originString){
+ if (originString != null){
+ try{
+ //创建具有指定算法名称的信息摘要
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
+ byte[] results = md.digest(originString.getBytes("UTF-8"));
+ //将得到的字节数组变成字符串返回
+ String resultString = byteArrayToHexString(results);
+ return resultString.toUpperCase();
+ } catch(Exception ex){
+ ex.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 转换字节数组为十六进制字符串
+ * @param 字节数组
+ * @return 十六进制字符串
+ */
+ private static String byteArrayToHexString(byte[] b){
+ StringBuffer resultSb = new StringBuffer();
+ for (int i = 0; i < b.length; i++){
+ resultSb.append(byteToHexString(b[i]));
+ }
+ return resultSb.toString();
+ }
+
+ /** 将一个字节转化成十六进制形式的字符串 */
+ private static String byteToHexString(byte b){
+ int n = b;
+ if (n < 0)
+ n = 256 + n;
+ int d1 = n / 16;
+ int d2 = n % 16;
+ return hexDigits[d1] + hexDigits[d2];
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MoneyUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MoneyUtil.java
new file mode 100644
index 0000000..d384340
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MoneyUtil.java
@@ -0,0 +1,35 @@
+package com.supwisdom.dlpay.framework.util;
+
+import java.text.DecimalFormat;
+
+public class MoneyUtil {
+
+ public static int YuanToFen(double yuan) {
+ return (int) (Math.round(yuan * 100));
+ }
+
+ public static boolean moneyEqual(double x1, double x2) {
+ return YuanToFen(x1) == YuanToFen(x2);
+ }
+
+ public static int moneyCompare(double x1, double x2) {
+ return YuanToFen(x1) - YuanToFen(x2);
+ }
+
+ public static double formatYuan(double yuan) {
+ DecimalFormat df = new DecimalFormat("##0.00");
+ double money = ((double) YuanToFen(yuan)) / 100;
+ return Double.valueOf(df.format(money));
+ }
+
+ public static String formatYuanToString(Double yuan) {
+ if (null == yuan) return "0.00";
+ DecimalFormat df = new DecimalFormat("##0.00");
+ double money = ((double) YuanToFen(yuan)) / 100;
+ return df.format(money);
+ }
+ public static double FenToYuan(int fen) {
+ return formatYuan(fen / 100.0);
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/NumberUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/NumberUtil.java
new file mode 100644
index 0000000..a8d4390
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/NumberUtil.java
@@ -0,0 +1,65 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class NumberUtil {
+
+ /**
+ * 判断是否是非负整数
+ *
+ * @param str
+ * @return 是 -> true; 否 -> false 如 1 -> true; -1 -> false
+ */
+ public static boolean isDigits(String str) {
+ if (null == str || "".equals(str.trim())) return false;
+ java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("[0-9]*");
+ java.util.regex.Matcher match = pattern.matcher(str.trim());
+ return match.matches();
+ }
+
+ /**
+ * 判断是否是整数(包含正负)
+ *
+ * @param str
+ * @return 是 -> true; 否 -> false 如 -1 -> true; -1.0 -> false
+ */
+ public static boolean isNumber(String str) {
+ if (null == str) return false;
+ try {
+ Integer.valueOf(str);
+ return true;
+ } catch (NumberFormatException ex) {
+ return false;
+ }
+ }
+
+ /**
+ * 判断是否是数字
+ *
+ * @param str
+ * @return 是 -> true; 否 -> false 如 -1 -> true; asd.1sa -> false
+ */
+ public static boolean isDecimal(String str) {
+ if (null == str) return false;
+ try {
+ Double.valueOf(str.trim());
+ return true;
+ } catch (NumberFormatException ex) {
+ return false;
+ }
+ }
+
+ /**
+ * 判断是否是金额(包含正负,最多2位小数)
+ *
+ * @param str
+ * @return 是 -> true; 否 -> false 如 -1.10 -> true; -1.011 -> false
+ */
+ public static boolean isAmount(String str) {
+ if (!isDecimal(str)) return false;
+ if (str.trim().indexOf(".") != -1) {
+ String suffix = str.trim().substring(str.trim().indexOf(".") + 1);
+ if (suffix.length() > 2) return false; //小数位多余2位
+ }
+ return true;
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/PageResult.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/PageResult.java
new file mode 100644
index 0000000..2c2694c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/PageResult.java
@@ -0,0 +1,87 @@
+package com.supwisdom.dlpay.framework.util;
+
+import org.springframework.data.domain.Page;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PageResult<T> {
+
+ private int code; //状态码, 0表示成功
+
+ private String msg; //提示信息
+
+ private long count; // 总数量
+
+ private List<T> data; // 当前数据
+
+ public PageResult() {
+ }
+
+ public PageResult(List<T> rows) {
+ this.data = rows;
+ this.count = rows.size();
+ this.code = 0;
+ this.msg = "";
+ }
+
+ public PageResult(long total, List<T> rows) {
+ this.count = total;
+ this.data = rows;
+ this.code = 0;
+ this.msg = "";
+ }
+
+ public PageResult(int code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ this.count = 0;
+ this.data = new ArrayList<>(0);
+ }
+
+ public PageResult(Page<T> page){
+ if(null == page) {
+ this.code = 99;
+ this.msg = "无数据";
+ this.count = 0;
+ this.data = new ArrayList<>(0);
+ } else{
+ this.code = 0;
+ this.msg = "";
+ this.count = page.getTotalElements();
+ this.data = page.getContent();
+ }
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ public long getCount() {
+ return count;
+ }
+
+ public void setCount(long count) {
+ this.count = count;
+ }
+
+ public List<T> getData() {
+ return data;
+ }
+
+ public void setData(List<T> data) {
+ this.data = data;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/PermissionConstants.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/PermissionConstants.java
new file mode 100644
index 0000000..6ffa106
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/PermissionConstants.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.framework.util;
+
+/**
+ * 增加权限常量维护表
+ * 增、删、改、查、更新密码、更新状态、打印、导出、导入
+ */
+public class PermissionConstants {
+
+ public static final String PERMISSION_QUERY = "query";
+
+ public static final String PERMISSION_ADD = "add";
+
+ public static final String PERMISSION_DELETE = "delete";
+
+ public static final String PERMISSION_UPDATE = "update";
+
+ public static final String PERMISSION_UPDATE_PWD = "upassword";
+
+ public static final String PERMISSION_UPDATE_STATUS = "ustatus";
+
+ public static final String PERMISSION_PRINT = "print";
+
+ public static final String PERMISSION_IMPORT = "import";
+
+ public static final String PERMISSION_EXPORT = "export";
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/RandomUtils.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/RandomUtils.java
new file mode 100644
index 0000000..0afac38
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/RandomUtils.java
@@ -0,0 +1,101 @@
+package com.supwisdom.dlpay.framework.util;
+
+import org.apache.commons.codec.binary.Base32;
+import org.apache.commons.codec.binary.Hex;
+
+import java.security.SecureRandom;
+import java.util.Random;
+import java.util.UUID;
+
+/**
+ * 获取随机数类
+ * @author yanhua_mao
+ *
+ */
+public class RandomUtils {
+
+ /**
+ * 获取随机数
+ * @param length 位数
+ * @return 返回随机数
+ */
+ public static final String randomNumber(int length) {
+ char[] numbersAndLetters = null;
+ Random randGen = null;
+ if (length < 1) {
+ return null;
+ }
+ if (randGen == null) {
+ randGen = new Random();
+ numbersAndLetters = ("0123456789").toCharArray();
+ }
+ char[] randBuffer = new char[length];
+ for (int i = 0; i < randBuffer.length; i++) {
+ randBuffer[i] = numbersAndLetters[randGen.nextInt(9)];
+ }
+ return new String(randBuffer);
+ }
+
+ /**
+ * 产生一个随机的字符串
+ *
+ * @param 字符串长度
+ * @return
+ */
+ public static String getRandomString(int length) {
+ String base = "abcdefghijklmnopqrstuvwxyz234567";
+ Random random = new Random();
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < length; i++) {
+ int number = random.nextInt(base.length());
+ sb.append(base.charAt(number));
+ }
+ return sb.toString();
+ }
+
+ public static String getSecureRandom(){
+ SecureRandom a = new SecureRandom();
+ byte[] phonesecret = new byte[10];
+ a.nextBytes(phonesecret);
+
+ Base32 c = new Base32();
+ String s = c.encodeAsString(phonesecret);
+ String savesecret = Hex.encodeHexString(phonesecret);
+ String result = s + "_"+savesecret;
+ return result;
+ }
+
+
+ /**
+ *
+ * @param length
+ * @return
+ */
+ public static String getCharAndNumr(int length)
+ {
+ String val = "";
+
+ Random random = new Random();
+ for(int i = 0; i < length; i++)
+ {
+ String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num"; // 输出字母还是数字
+
+ if("char".equalsIgnoreCase(charOrNum)) // 字符串
+ {
+ int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; //取得大写字母还是小写字母
+ val += (char) (choice + random.nextInt(26));
+ }
+ else if("num".equalsIgnoreCase(charOrNum)) // 数字
+ {
+ val += String.valueOf(random.nextInt(10));
+ }
+ }
+
+ return val;
+ }
+
+ public static String getUUIDStr() {
+ return UUID.randomUUID().toString().replaceAll("-", "");
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Sign.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Sign.java
new file mode 100644
index 0000000..399da55
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Sign.java
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.framework.util;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface Sign {
+ int order() default 0;
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
new file mode 100644
index 0000000..20756cc
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
@@ -0,0 +1,154 @@
+package com.supwisdom.dlpay.framework.util;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class StringUtil {
+ /**
+ * 判断字符串是否为空
+ */
+ public static boolean isEmpty(String str) {
+ if (null == str || "".equals(str) || "".equals(str.trim())) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 判断List是否为空
+ */
+ public static boolean isEmpty(List list) {
+ if (null == list || list.size() <= 0) {
+ return true;
+ }
+ return false;
+ }
+
+ public static boolean equalsIgnoreCase(String str1, String str2) {
+ return str1 == null ? str2 == null : str1.equalsIgnoreCase(str2);
+ }
+
+ public static boolean equals(String str1, String str2) {
+ return str1 == null ? str2 == null : str1.equals(str2);
+ }
+
+ /**
+ * 手机号验证
+ *
+ * @param str
+ * @return
+ */
+ public static boolean isMobile(String str) {
+ Pattern p = Pattern.compile("^1[0-9]{10}$"); // 验证手机号
+ Matcher m = p.matcher(str);
+ return m.matches();
+ }
+
+ /**
+ * 邮箱格式验证
+ */
+ public static boolean isEmail(String email) {
+ boolean ret = true;
+ Pattern pattern = Pattern.compile("^([a-zA-Z0-9]+[_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$");
+ final Matcher mat = pattern.matcher(email);
+ if (!mat.find()) {
+ ret = false;
+ }
+ return ret;
+ }
+
+ /**
+ * 身份证格式验证
+ *
+ * @param str
+ * @return
+ */
+ public static boolean isIdentity(String str) {
+ // 中国公民身份证格式:长度为15或18位,最后一位可以为字母
+ Pattern pattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");
+ final Matcher m = pattern.matcher(str);
+ return m.matches();
+ }
+
+ /**
+ * 除去数组中的空值和签名参数
+ *
+ * @param sArray 签名参数组
+ * @return 去掉空值与签名参数后的新签名参数组
+ */
+ public static Map<String, String> paraFilter(Map<String, String> sArray) {
+ Map<String, String> result = new HashMap<String, String>();
+ if (sArray == null || sArray.size() <= 0) {
+ return result;
+ }
+ for (String key : sArray.keySet()) {
+ String value = sArray.get(key);
+ if (null == value || "".equals(value.trim()) || "null".equalsIgnoreCase(value.trim()) || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")) {
+ continue;
+ }
+ result.put(key, value);
+ }
+ return result;
+ }
+
+ /**
+ * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
+ *
+ * @param params 需要排序并参与字符拼接的参数组
+ * @return 拼接后字符串
+ */
+ public static String createLinkString(Map<String, String> params) {
+
+ List<String> keys = new ArrayList<String>(params.keySet());
+ Collections.sort(keys);
+
+ String prestr = "";
+
+ for (int i = 0; i < keys.size(); i++) {
+ String key = keys.get(i);
+ String value = params.get(key);
+
+ if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符
+ prestr = prestr + key + "=" + value;
+ } else {
+ prestr = prestr + key + "=" + value + "&";
+ }
+ }
+
+ return prestr;
+ }
+
+ public static boolean isCharAndNum(String inputStr) {
+ //有问题
+ /*Pattern p = Pattern.compile("\\w+");
+ Matcher m = p.matcher(inputStr);
+ if (m.matches()) {
+ // 除字母和数字外还包含其它字符
+ return false;
+ } else {
+ return true;
+ }*/
+ return true;
+ }
+ /**
+ * 手机号遮掩中间4位
+ * */
+ public static String phoneReplace(String phone){
+ return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
+ }
+
+ /**
+ * 邮箱只显示@前面的首位和末位
+ * */
+ public static String emailReplace(String s){
+ return s.replaceAll("(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)", "$1****$3$4");
+ }
+
+ /**
+ * 名字显示姓
+ * */
+ public static String nameReplace(String s){
+ return s.replaceAll("([\\d\\D]{1})(.*)", "$1**");
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
new file mode 100644
index 0000000..e80344a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
@@ -0,0 +1,140 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class Subject {
+ //======================= 资产类 =====================//
+ /**
+ * 现金
+ */
+ public static final String SUBJNO_CASH = "1001";
+
+ /**
+ * 银行存款
+ */
+ public static final String SUBJNO_BANK_DEPOSIT = "1002";
+
+ /**
+ * 应收票据 - 支票
+ */
+ public static final String SUBJNO_CHEQUE = "112101";
+
+ /**
+ * 应收票据 - 经费本
+ */
+ public static final String SUBJNO_FUNDS = "112102";
+
+ /**
+ * 应收账款 - 现金充值款
+ */
+ public static final String SUBJNO_RECHARGE_CASH = "112201";
+
+ /**
+ * 应收账款 - 其他第三方充值款
+ */
+ public static final String SUBJNO_RECHARGE_OTHER = "112209";
+
+ /**
+ * 应收账款 - 支付宝充值款
+ */
+ public static final String SUBJNO_RECHARGE_ALIPAY = "112210";
+
+ /**
+ * 应收账款 - 微信充值款
+ */
+ public static final String SUBJNO_RECHARGE_WECHAT = "112211";
+
+ /**
+ * 应收账款 - 银联充值款
+ */
+ public static final String SUBJNO_RECHARGE_UNIONPAY = "112212";
+
+ /**
+ * 应收账款 - 一卡通充值款
+ */
+ public static final String SUBJNO_RECHARGE_YKT = "112213";
+
+
+ /**
+ * 应收账款 - 支付宝支付款
+ */
+ public static final String SUBJNO_PAY_ALIPAY = "112230";
+
+ /**
+ * 应收账款 - 微信支付款
+ */
+ public static final String SUBJNO_PAY_WECHAT = "112231";
+
+ /**
+ * 应收账款 - 银联支付款
+ */
+ public static final String SUBJNO_PAY_UNIONPAY = "112232";
+
+ /**
+ * 应收账款 - 一卡通支付款
+ */
+ public static final String SUBJNO_PAY_YKT = "112233";
+
+ /**
+ * 应收账款 - 市民卡支付款
+ */
+ public static final String SUBJNO_PAY_CITIZEN_CARD = "112234";
+
+
+ //======================= 负债类 =====================//
+
+ /**
+ * 用户押金
+ */
+ public static final String SUBJNO_FOREGIFT = "2001";
+
+ /**
+ * 商户营业款
+ */
+ public static final String SUBJNO_MACHANT_INCOME = "2004";
+
+
+ /**
+ * 应付账款 - 个人存款
+ */
+ public static final String SUBJNO_PERSONAL_DEPOSIT = "220201";
+
+
+ /**
+ * 应付账款 - 销户退款
+ */
+ public static final String SUBJNO_PERSONAL_REFUND = "220211";
+
+
+
+ //======================= 损益类 =====================//
+ /**
+ * 手续费收入 - 支付宝充值手续费
+ */
+ public static final String SUBJNO_SERVICEFEE_ALIPAY = "602101";
+
+ /**
+ * 手续费收入 - 微信充值手续费
+ */
+ public static final String SUBJNO_SERVICEFEE_WECHAT = "602102";
+
+ /**
+ * 手续费收入 - 银联充值手续费
+ */
+ public static final String SUBJNO_SERVICEFEE_UNIONPAY = "602103";
+
+
+ /**
+ * 销售费用 - (消费)折扣优惠款
+ */
+ public static final String SUBJNO_CONSUME_DISCOUNT = "660101";
+
+ /**
+ * 销售费用 - (消费)积分抵扣款
+ */
+ public static final String SUBJNO_CONSUME_POINTS = "660102";
+
+ /**
+ * 管理费收入 (搭伙费收入)
+ */
+ public static final String SUBJNO_MANAGEFEE = "6602";
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
new file mode 100644
index 0000000..3ccb2a7
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class SysparaUtil {
+ public static final String SYSPARA_VALUETYPE_AMOUNT = "amount"; //金额类型 Double
+ public static final String SYSPARA_VALUETYPE_SWITCH = "switch"; //开关类型 Boolean 0/1
+ public static final String SYSPARA_VALUETYPE_DATE = "date"; //日期类型 yyyyMMdd
+ public static final String SYSPARA_VALUETYPE_DATETIME = "datetime"; //日期+时间 yyyyMMddHHmmss
+ public static final String SYSPARA_VALUETYPE_DECIMAL = "decimal"; //数值
+ public static final String SYSPARA_VALUETYPE_NUMBER = "number "; //整数,包含正负
+ public static final String SYSPARA_VALUETYPE_STRING = "string"; //字符串
+
+
+ public static final int SYSPARAID_NO1 = 1; //系统默认最大余额限制的ID
+ public static final int SYSPARAID_NO2 = 2; //paraid=2
+
+ public static final int SYSPARAID_NO2019 = 2019; //与卡管系统对接的应用ID
+ public static final int SYSPARAID_NO2020 = 2020; //与卡管系统对接的应用appkey
+ public static final int SYSPARAID_NO2021 = 2021; //与卡管系统对接的业务参数deskey
+
+ public static final double SYSPARA_NO1_DEFAULT = 10000.0; // 系统默认最大余额限制
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
new file mode 100644
index 0000000..cc1b344
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
@@ -0,0 +1,20 @@
+package com.supwisdom.dlpay.framework.util;
+
+/**
+ * 交易码、交易类型
+ * */
+public class TradeCode {
+ public static final int TRANSCODE_BALANCE_PAY = 3000; //账户余额支付
+ public static final int TRANSCODE_CITIZENCARD_PAY=3010; //市民卡代扣消费
+ public static final int TRANSCODE_YKTCARD_PAY=3020; //一卡通支付
+
+
+ public static final int TRANSCODE_WECHAT=1001;
+
+
+ public static final int TRANSCODE_ERCHARGE = 3500; //账户充值
+
+
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
new file mode 100644
index 0000000..d193d3a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
@@ -0,0 +1,97 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class TradeDict {
+ /**
+ * 状态:
+ * normal -- 正常
+ * closed -- 注销
+ * locked -- 锁定、冻结
+ */
+ public static final String STATUS_NORMAL = "normal";
+ public static final String STATUS_CLOSED = "closed";
+ public static final String STATUS_LOCKED = "locked";
+
+ public static final String STATUS_YES = "yes";
+ public static final String STATUS_NO = "no";
+ /**
+ * JWT 状态
+ */
+ public static final String JWT_STATUS_NORMAL = "normal";
+ public static final String JWT_STATUS_BLACKLIST = "blacklist";
+
+ /**
+ * 流水状态
+ * temp -- 临时流水
+ * init -- 初始化流水
+ * success -- 交易成功
+ * fail -- 交易失败
+ * cancel -- 交易取消
+ */
+ public static final String DTL_STATUS_TEMP = "temp";
+ public static final String DTL_STATUS_INIT = "init";
+ public static final String DTL_STATUS_SUCCESS = "success";
+ public static final String DTL_STATUS_FAIL = "fail";
+ public static final String DTL_STATUS_CANCEL = "cancel";
+ public static final String DTL_STATUS_WIP = "wip";
+ public static final String DTL_STATUS_NONE = "none";
+
+
+ /**
+ * 操作员类型
+ * person - 个人
+ * shop - 商户
+ * operator - 操作员
+ */
+
+ public static final String OPERTYPE_PERSON = "person";
+ public static final String OPERTYPE_SHOP = "shop";
+ public static final String OPERTYPE_OPER = "operator";
+
+ /**
+ * 收支
+ * out - 支出
+ * in - 收入
+ */
+ public static final String TRADE_FLAG_OUT = "out";
+ public static final String TRADE_FLAG_IN = "in";
+ /**
+ * 交易借方
+ */
+ public static final String TRANS_DIRECTION_CREDIT = "credit";
+ public static final String TRANS_DIRECTION_DEBIT = "debit";
+
+
+ /**
+ * 支付方式
+ */
+ public static final String PAYTYPE_CASH = "cash";
+ public static final String PAYTYPE_BALANCE = "balance";
+ public static final String PAYTYPE_ALIPAY = "alipay"; //市民卡
+ public static final String PAYTYPE_WECHAT = "wechat"; //市民卡
+ public static final String PAYTYPE_CITIZEN_CARD = "citizenCard"; //市民卡
+ public static final String PAYTYPE_YKT_CARD = "yktpay"; //一卡通
+ public static final String PAYTYPE_OTHER_THIRDPART = "thirdpart"; //其他第三方
+
+
+ /**
+ * feetype
+ * - 消费:折扣、搭伙费(管理费)
+ * - 充值:优惠、服务费(手续费)
+ */
+
+ public static final String FEETYPE_CONSUME_MEALER = "mealer"; //收管理费
+ public static final String FEETYPE_CONSUME_DISCOUNT = "discount"; //折扣款抵扣
+
+ public static final String PAYTYPE_RECHARGE_COUPON = "coupon"; // 充值优惠
+ public static final String PAYTYPE_RECHARGE_SERVICEFEE = "servicefee"; //收服务费
+
+ /**
+ * refund flag
+ * - none : 无
+ * - cancel : 冲正
+ * - refund : 手工撤销
+ */
+ public static final String REVERSE_FLAG_NONE = "none";
+ public static final String REVERSE_FLAG_CANCEL = "cancel";
+ public static final String REVERSE_FLAG_REFUND = "refund";
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
new file mode 100644
index 0000000..d48c602
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
@@ -0,0 +1,143 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class TradeErrorCode {
+
+ public static final int OK = 0;
+
+ /**
+ * 10000 开始表示交易数据错误
+ */
+ public static final int INPUT_DATA_ERROR = 10000;
+
+
+ /**
+ * 账户不存在
+ */
+ public static final int ACCOUNT_NOT_EXISTS = 10001;
+
+ /**
+ * 账户余额不足
+ */
+ public static final int SHORT_BALANCE_ERROR = 10002;
+
+ /**
+ * 个人账户状态异常
+ */
+ public static final int PERSON_STATUS_ERROR = 10003;
+
+ /**
+ * 交易记录不存在
+ */
+ public static final int TRANSACTION_NOT_EXISTS = 10004;
+
+ /**
+ * 交易状态已完成
+ */
+ public static final int TRANSACTION_IS_FINISHED = 10005;
+
+ /**
+ * 交易状态错误,正在处理
+ */
+ public static final int TRANSACTION_HAS_BEEN_PROCESS = 100030;
+
+ /**
+ * 交易已冲正
+ */
+ public static final int TRANSACTION_HAS_CANCELED = 10006;
+ /**
+ * 商户不存在
+ */
+ public static final int SHOP_NOT_EXISTS = 10007;
+
+ /**
+ * 科目不存在
+ */
+ public static final int SUBJECT_NOT_EXISTS = 10008;
+
+ /**
+ * 外部流水号重复
+ */
+ public static final int OUTTRADENO_ALREADY_EXISTS = 10009;
+
+ /**
+ * 账户TAC校验异常
+ */
+ public static final int ACCOUNT_TAC_ERROR = 10010;
+
+ /**
+ * 账户余额超上限
+ */
+ public static final int OVERFLOW_BALANCE_ERROR = 10011;
+
+ /**
+ * 未指定明确的交易结束状态
+ */
+ public static final int TRANSDTL_STATUS_ERROR = 10012;
+
+ /**
+ * 非初始化流水
+ */
+ public static final int TRANSDTL_STATUS_NOT_INIT = 10013;
+
+ /**
+ * 账户交易繁忙
+ */
+ public static final int ACCOUNT_TRADE_BUSY = 10014;
+
+ /**
+ * 非等待锁查询超时异常
+ */
+ public static final int LOCK_READ_TIMEOUT = 10015;
+
+ /**
+ * 卡已挂失
+ */
+ public static final int ACCOUNT_IS_LOSS = 10016;
+
+ /**
+ * 卡已锁定
+ */
+ public static final int ACCOUNT_IS_LOCKED = 10017;
+
+ /**
+ * 费用类别未定义
+ */
+ public static final int FEETYPE_NOT_EXISTS = 10018;
+
+ /**
+ * 费用类别不支持
+ */
+ public static final int FEETYPE_NOT_NOSUPPORT = 10019;
+
+
+ /**
+ * 请求参数错误
+ */
+ public static final int REQUEST_PARAM_ERROR = 20000;
+
+ /**
+ * 请求参数错误签名错误
+ */
+ public static final int REQUEST_SIGN_ERROR = 20001;
+
+ /**
+ * 注册用户已经存在
+ */
+ public static final int REGISTER_USER_EXIST = 20003;
+
+
+ //================= 业务处理错误 ==================//
+
+ public static final int BUSINESS_DEAL_ERROR = 30000; //业务处理错误
+
+ public static final int BUSINESS_SHOP_EXISTS = 30001; //商户已经存在
+
+ public static final int BUSINESS_APPID_NOTFOUND = 30002; //APPID没找到
+
+ public static final int BUSINESS_PAYTYPE_NOSUPPORT = 30003; //支付方式不支持
+
+ public static final int SQL_EXCEPTION = 30004; // SQL处理异常
+
+ public static final int REQUEST_PARAM_EEROR = 30005; // 请求参数实体位置错误
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeSummary.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeSummary.java
new file mode 100644
index 0000000..c0053f7
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeSummary.java
@@ -0,0 +1,6 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class TradeSummary {
+ public static final String POS_PAY = "刷卡消费";
+ public static final String WX_PAYCODE = "微信付款码消费";
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Tradetype.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Tradetype.java
new file mode 100644
index 0000000..af8646f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Tradetype.java
@@ -0,0 +1,6 @@
+package com.supwisdom.dlpay.framework.util;
+
+public enum Tradetype {
+ RECHARGE, //充值
+ CONSUME //消费
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TranstypeCode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TranstypeCode.java
new file mode 100644
index 0000000..83b16e8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TranstypeCode.java
@@ -0,0 +1,6 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class TranstypeCode {
+
+ public static final int TT_CONSUUME_MANAGE_FEE = 301;
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/WebConstant.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/WebConstant.java
new file mode 100644
index 0000000..c6237a9
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/WebConstant.java
@@ -0,0 +1,8 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class WebConstant {
+ public static final int PAGENO_DEFAULT = 1;
+ public static final int PAGESIZE_DEFAULT = 10;
+ public static final String OPERPWD_DEFAULT = "123456";
+ public static final String OPERTYPE_DEFAULT = "oper";
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
new file mode 100644
index 0000000..66deb65
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
@@ -0,0 +1,101 @@
+package com.supwisdom.dlpay.framework.util;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class XmlUtils {
+ public static <T> String getObjectToXml(T object) throws IOException {
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+
+ try {
+ JAXBContext context = JAXBContext.newInstance(object.getClass());
+ // 将对象转变为xml Object------XML
+ // 指定对应的xml文件
+ Marshaller marshaller = context.createMarshaller();
+ marshaller.setProperty(Marshaller.JAXB_ENCODING, "gbk");//编码格式
+ marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);// 是否格式化生成的xml串
+ marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);// 是否省略xml头信息
+
+ // 将对象转换为对应的XML文件
+ marshaller.marshal(object, byteArrayOutputStream);
+ } catch (JAXBException e) {
+
+ e.printStackTrace();
+ }
+ // 转化为字符串返回
+ String xmlContent = new String(byteArrayOutputStream.toByteArray(),
+ "gbk");
+ return xmlContent;
+ }
+
+ /*
+ public static <T> T getXmlToObject(String xmlContent, Class clazz) {
+ try {
+ JAXBContext context = JAXBContext.newInstance(clazz);
+ // xml转换为对象 XML------Object
+ InputStream inputStream;
+ try {
+ inputStream = new ByteArrayInputStream(
+ xmlContent.getBytes("GBK"));
+ Unmarshaller um = context.createUnmarshaller();
+
+ @Suppress("UNCHECKED_CAST")
+ return (T) um.unmarshal(inputStream);
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }catch (Exception e) {
+ e.printStackTrace();
+ }
+ } catch (JAXBException e) {
+
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static <T> T getXmlToObject(String xmlContent,String charset, Class clazz) {
+ try {
+ JAXBContext context = JAXBContext.newInstance(clazz);
+ // xml转换为对象 XML------Object
+ InputStream inputStream;
+ try {
+ inputStream = new ByteArrayInputStream(
+ xmlContent.getBytes(charset));
+ Unmarshaller um = context.createUnmarshaller();
+
+ return (T) um.unmarshal(inputStream);
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }catch (Exception e) {
+ e.printStackTrace();
+ }
+ } catch (JAXBException e) {
+
+ e.printStackTrace();
+ }
+ return null;
+ }
+ */
+ public static Map<String, String> parseXml(String xml) throws Exception {
+ Map<String, String> map = new HashMap<String, String>();
+ Document document = DocumentHelper.parseText(xml);
+ Element root = document.getRootElement();
+ List<Element> elementList = root.elements();
+ for (Element e : elementList)
+ map.put(e.getName(), e.getText());
+ return map;
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/AccountPerson.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/AccountPerson.java
new file mode 100644
index 0000000..2a870c0
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/AccountPerson.java
@@ -0,0 +1,4 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class AccountPerson {
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/FunctionSearchBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/FunctionSearchBean.java
new file mode 100644
index 0000000..67df35b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/FunctionSearchBean.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class FunctionSearchBean extends PageBean{
+ private String functioname;
+
+ public String getFunctioname() {
+ return functioname;
+ }
+
+ public void setFunctioname(String functioname) {
+ this.functioname = functioname;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/IdTypeBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/IdTypeBean.java
new file mode 100644
index 0000000..d7ac784
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/IdTypeBean.java
@@ -0,0 +1,27 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class IdTypeBean {
+ private String idtype;
+ private String typename;
+
+ public IdTypeBean(String idtype,String typename){
+ this.idtype = idtype;
+ this.typename = typename;
+ }
+
+ public String getIdtype() {
+ return idtype;
+ }
+
+ public void setIdtype(String idtype) {
+ this.idtype = idtype;
+ }
+
+ public String getTypename() {
+ return typename;
+ }
+
+ public void setTypename(String typename) {
+ this.typename = typename;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LogBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LogBean.java
new file mode 100644
index 0000000..2ffbf62
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LogBean.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class LogBean extends PageBean{
+ private String opername;
+
+ public String getOpername() {
+ return opername;
+ }
+
+ public void setOpername(String opername) {
+ this.opername = opername;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/OperatorSearchBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/OperatorSearchBean.java
new file mode 100644
index 0000000..6b7e9e6
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/OperatorSearchBean.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class OperatorSearchBean {
+ private String opercode;
+ private String opername;
+ private String mobile;
+ private Boolean deleteShow = true;
+
+ public String getOpercode() {
+ return opercode;
+ }
+
+ public void setOpercode(String opercode) {
+ this.opercode = opercode;
+ }
+
+ public String getOpername() {
+ return opername;
+ }
+
+ public void setOpername(String opername) {
+ this.opername = opername;
+ }
+
+ public String getMobile() {
+ return mobile;
+ }
+
+ public void setMobile(String mobile) {
+ this.mobile = mobile;
+ }
+
+ public Boolean getDeleteShow() {
+ return deleteShow;
+ }
+
+ public void setDeleteShow(Boolean deleteShow) {
+ this.deleteShow = deleteShow;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/PageBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/PageBean.java
new file mode 100644
index 0000000..e615a3a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/PageBean.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class PageBean {
+ private int pageNo;
+ private int pageSize;
+
+ public int getPageNo() {
+ return pageNo;
+ }
+
+ public void setPageNo(int pageNo) {
+ this.pageNo = pageNo;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/PersonParamBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/PersonParamBean.java
new file mode 100644
index 0000000..591bb04
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/PersonParamBean.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class PersonParamBean extends PageBean {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessInfo.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessInfo.java
new file mode 100644
index 0000000..f7c2434
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessInfo.java
@@ -0,0 +1,60 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class ShopBusinessInfo {
+ private String shopaccno;
+ private String summary;
+ private Long transcnt;
+ private Double dramt;
+ private Double cramt;
+
+ public ShopBusinessInfo() {
+ }
+
+ public ShopBusinessInfo(String shopaccno, String summary, Long transcnt, Double dramt, Double cramt) {
+ this.shopaccno = shopaccno;
+ this.summary = summary;
+ this.transcnt = transcnt;
+ this.dramt = dramt;
+ this.cramt = cramt;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public Long getTranscnt() {
+ return transcnt;
+ }
+
+ public void setTranscnt(Long transcnt) {
+ this.transcnt = transcnt;
+ }
+
+ public Double getDramt() {
+ return dramt;
+ }
+
+ public void setDramt(Double dramt) {
+ this.dramt = dramt;
+ }
+
+ public Double getCramt() {
+ return cramt;
+ }
+
+ public void setCramt(Double cramt) {
+ this.cramt = cramt;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessShowBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessShowBean.java
new file mode 100644
index 0000000..0d793e1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessShowBean.java
@@ -0,0 +1,67 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class ShopBusinessShowBean {
+ private String shopid;
+ private String shopname;
+ private String fshopid;
+ private String shopaccno;
+ private String summary;
+ private Long transcnt;
+ private Double transamt;
+
+ public String getShopid() {
+ return shopid;
+ }
+
+ public void setShopid(String shopid) {
+ this.shopid = shopid;
+ }
+
+ public String getShopname() {
+ return shopname;
+ }
+
+ public void setShopname(String shopname) {
+ this.shopname = shopname;
+ }
+
+ public String getFshopid() {
+ return fshopid;
+ }
+
+ public void setFshopid(String fshopid) {
+ this.fshopid = fshopid;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public Long getTranscnt() {
+ return transcnt;
+ }
+
+ public void setTranscnt(Long transcnt) {
+ this.transcnt = transcnt;
+ }
+
+ public Double getTransamt() {
+ return transamt;
+ }
+
+ public void setTransamt(Double transamt) {
+ this.transamt = transamt;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopConfigBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopConfigBean.java
new file mode 100644
index 0000000..1e477e7
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopConfigBean.java
@@ -0,0 +1,80 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class ShopConfigBean {
+ private String shopaccno;
+ private String shopname;
+ private String paytype;
+ private String paydesc;
+ private boolean consumeEnable;
+ private boolean anonymousEnable;
+ private boolean reverseEnable;
+
+ public ShopConfigBean() {
+ }
+
+ public ShopConfigBean(String shopaccno, String shopname, String paytype, String paydesc, boolean consumeEnable, boolean anonymousEnable, boolean reverseEnable) {
+ this.shopaccno = shopaccno;
+ this.shopname = shopname;
+ this.paytype = paytype;
+ this.paydesc = paydesc;
+ this.consumeEnable = consumeEnable;
+ this.anonymousEnable = anonymousEnable;
+ this.reverseEnable = reverseEnable;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getShopname() {
+ return shopname;
+ }
+
+ public void setShopname(String shopname) {
+ this.shopname = shopname;
+ }
+
+ public String getPaytype() {
+ return paytype;
+ }
+
+ public void setPaytype(String paytype) {
+ this.paytype = paytype;
+ }
+
+ public String getPaydesc() {
+ return paydesc;
+ }
+
+ public void setPaydesc(String paydesc) {
+ this.paydesc = paydesc;
+ }
+
+ public boolean isConsumeEnable() {
+ return consumeEnable;
+ }
+
+ public void setConsumeEnable(boolean consumeEnable) {
+ this.consumeEnable = consumeEnable;
+ }
+
+ public boolean isAnonymousEnable() {
+ return anonymousEnable;
+ }
+
+ public void setAnonymousEnable(boolean anonymousEnable) {
+ this.anonymousEnable = anonymousEnable;
+ }
+
+ public boolean isReverseEnable() {
+ return reverseEnable;
+ }
+
+ public void setReverseEnable(boolean reverseEnable) {
+ this.reverseEnable = reverseEnable;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopdtlSearchBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopdtlSearchBean.java
new file mode 100644
index 0000000..f32d349
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopdtlSearchBean.java
@@ -0,0 +1,112 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class ShopdtlSearchBean {
+ private Integer page;
+ private Integer limit;
+ private String startAccdate;
+ private String endAccdate;
+ private String startTransdate;
+ private String endTransdate;
+ private String shopname;
+ private String shopaccno;
+ private String sourcetype;
+ private String tradeflag;
+ private String transcode;
+ private String status;
+
+ public Integer getPage() {
+ return page;
+ }
+
+ public void setPage(Integer page) {
+ this.page = page;
+ }
+
+ public Integer getLimit() {
+ return limit;
+ }
+
+ public void setLimit(Integer limit) {
+ this.limit = limit;
+ }
+
+ public String getStartAccdate() {
+ return startAccdate;
+ }
+
+ public void setStartAccdate(String startAccdate) {
+ this.startAccdate = startAccdate;
+ }
+
+ public String getEndAccdate() {
+ return endAccdate;
+ }
+
+ public void setEndAccdate(String endAccdate) {
+ this.endAccdate = endAccdate;
+ }
+
+ public String getStartTransdate() {
+ return startTransdate;
+ }
+
+ public void setStartTransdate(String startTransdate) {
+ this.startTransdate = startTransdate;
+ }
+
+ public String getEndTransdate() {
+ return endTransdate;
+ }
+
+ public void setEndTransdate(String endTransdate) {
+ this.endTransdate = endTransdate;
+ }
+
+ public String getShopname() {
+ return shopname;
+ }
+
+ public void setShopname(String shopname) {
+ this.shopname = shopname;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getSourcetype() {
+ return sourcetype;
+ }
+
+ public void setSourcetype(String sourcetype) {
+ this.sourcetype = sourcetype;
+ }
+
+ public String getTradeflag() {
+ return tradeflag;
+ }
+
+ public void setTradeflag(String tradeflag) {
+ this.tradeflag = tradeflag;
+ }
+
+ public String getTranscode() {
+ return transcode;
+ }
+
+ public void setTranscode(String transcode) {
+ this.transcode = transcode;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java
new file mode 100644
index 0000000..f31d5b5
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.system.bean;
+
+public interface SubjectDayInfo {
+ String getSubjno();
+
+ String getSubjname();
+
+ String getFsubjno();
+
+ Integer getSubjlevel();
+
+ String getDisplayflag();
+
+ Double getLastdaydrbal();
+
+ Double getLastdaycrbal();
+
+ Double getDramt();
+
+ Double getCramt();
+
+ Double getDrbal();
+
+ Double getCrbal();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java
new file mode 100644
index 0000000..c36c212
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java
@@ -0,0 +1,103 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class SubjectDayShowBean {
+ private String subjno;
+ private String subjname;
+ private String fsubjno;
+ private Integer subjlevel;
+ private String displayflag;
+ private Double lastdaydrbal;
+ private Double lastdaycrbal;
+ private Double dramt;
+ private Double cramt;
+ private Double drbal;
+ private Double crbal;
+
+ public String getSubjno() {
+ return subjno;
+ }
+
+ public void setSubjno(String subjno) {
+ this.subjno = subjno;
+ }
+
+ public String getSubjname() {
+ return subjname;
+ }
+
+ public void setSubjname(String subjname) {
+ this.subjname = subjname;
+ }
+
+ public String getFsubjno() {
+ return fsubjno;
+ }
+
+ public void setFsubjno(String fsubjno) {
+ this.fsubjno = fsubjno;
+ }
+
+ public Integer getSubjlevel() {
+ return subjlevel;
+ }
+
+ public void setSubjlevel(Integer subjlevel) {
+ this.subjlevel = subjlevel;
+ }
+
+ public String getDisplayflag() {
+ return displayflag;
+ }
+
+ public void setDisplayflag(String displayflag) {
+ this.displayflag = displayflag;
+ }
+
+ public Double getLastdaydrbal() {
+ return lastdaydrbal;
+ }
+
+ public void setLastdaydrbal(Double lastdaydrbal) {
+ this.lastdaydrbal = lastdaydrbal;
+ }
+
+ public Double getLastdaycrbal() {
+ return lastdaycrbal;
+ }
+
+ public void setLastdaycrbal(Double lastdaycrbal) {
+ this.lastdaycrbal = lastdaycrbal;
+ }
+
+ public Double getDramt() {
+ return dramt;
+ }
+
+ public void setDramt(Double dramt) {
+ this.dramt = dramt;
+ }
+
+ public Double getCramt() {
+ return cramt;
+ }
+
+ public void setCramt(Double cramt) {
+ this.cramt = cramt;
+ }
+
+ public Double getDrbal() {
+ return drbal;
+ }
+
+ public void setDrbal(Double drbal) {
+ this.drbal = drbal;
+ }
+
+ public Double getCrbal() {
+ return crbal;
+ }
+
+ public void setCrbal(Double crbal) {
+ this.crbal = crbal;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDetailShowBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDetailShowBean.java
new file mode 100644
index 0000000..2cc3222
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDetailShowBean.java
@@ -0,0 +1,100 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class SubjectDetailShowBean {
+ private Integer voucherdate; //凭证日期
+ private Integer voucherno; //凭证编号
+ private String subjno;
+ private String summary;
+ private Double dramt;
+ private Double cramt;
+ private Integer balflag;//1-借;2-贷
+ private Double balance;
+ private String oppname;
+
+ public SubjectDetailShowBean() {
+ }
+
+ public SubjectDetailShowBean(Integer voucherdate, Integer voucherno, String subjno, String summary, Double dramt, Double cramt, Integer balflag, Double balance, String oppname) {
+ this.voucherdate = voucherdate;
+ this.voucherno = voucherno;
+ this.subjno = subjno;
+ this.summary = summary;
+ this.dramt = dramt;
+ this.cramt = cramt;
+ this.balflag = balflag;
+ this.balance = balance;
+ this.oppname = oppname;
+ }
+
+ public Integer getVoucherdate() {
+ return voucherdate;
+ }
+
+ public void setVoucherdate(Integer voucherdate) {
+ this.voucherdate = voucherdate;
+ }
+
+ public Integer getVoucherno() {
+ return voucherno;
+ }
+
+ public void setVoucherno(Integer voucherno) {
+ this.voucherno = voucherno;
+ }
+
+ public String getSubjno() {
+ return subjno;
+ }
+
+ public void setSubjno(String subjno) {
+ this.subjno = subjno;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public Double getDramt() {
+ return dramt;
+ }
+
+ public void setDramt(Double dramt) {
+ this.dramt = dramt;
+ }
+
+ public Double getCramt() {
+ return cramt;
+ }
+
+ public void setCramt(Double cramt) {
+ this.cramt = cramt;
+ }
+
+ public Integer getBalflag() {
+ return balflag;
+ }
+
+ public void setBalflag(Integer balflag) {
+ this.balflag = balflag;
+ }
+
+ public Double getBalance() {
+ return balance;
+ }
+
+ public void setBalance(Double balance) {
+ this.balance = balance;
+ }
+
+ public String getOppname() {
+ return oppname;
+ }
+
+ public void setOppname(String oppname) {
+ this.oppname = oppname;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/TreeSelectNode.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/TreeSelectNode.java
new file mode 100644
index 0000000..87b6fd2
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/TreeSelectNode.java
@@ -0,0 +1,70 @@
+package com.supwisdom.dlpay.system.bean;
+
+import java.util.List;
+
+public class TreeSelectNode {
+ private String id;
+ private String name;
+ private boolean open;
+ private boolean checked;
+ private List<TreeSelectNode> children;
+
+ private String pId; //扩展 父级ID
+ private String accno; //扩展:商户账号
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public boolean isOpen() {
+ return open;
+ }
+
+ public void setOpen(boolean open) {
+ this.open = open;
+ }
+
+ public boolean isChecked() {
+ return checked;
+ }
+
+ public void setChecked(boolean checked) {
+ this.checked = checked;
+ }
+
+ public List<TreeSelectNode> getChildren() {
+ return children;
+ }
+
+ public void setChildren(List<TreeSelectNode> children) {
+ this.children = children;
+ }
+
+ public String getpId() {
+ return pId;
+ }
+
+ public void setpId(String pId) {
+ this.pId = pId;
+ }
+
+ public String getAccno() {
+ return accno;
+ }
+
+ public void setAccno(String accno) {
+ this.accno = accno;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/UserdtlSearchBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/UserdtlSearchBean.java
new file mode 100644
index 0000000..91b0cba
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/UserdtlSearchBean.java
@@ -0,0 +1,112 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class UserdtlSearchBean {
+ private Integer page;
+ private Integer limit;
+ private String startAccdate;
+ private String endAccdate;
+ private String startTransdate;
+ private String endTransdate;
+ private String personname;
+ private String cardno;
+ private String sourcetype;
+ private String tradeflag;
+ private String transcode;
+ private String status;
+
+ public Integer getPage() {
+ return page;
+ }
+
+ public void setPage(Integer page) {
+ this.page = page;
+ }
+
+ public Integer getLimit() {
+ return limit;
+ }
+
+ public void setLimit(Integer limit) {
+ this.limit = limit;
+ }
+
+ public String getStartAccdate() {
+ return startAccdate;
+ }
+
+ public void setStartAccdate(String startAccdate) {
+ this.startAccdate = startAccdate;
+ }
+
+ public String getEndAccdate() {
+ return endAccdate;
+ }
+
+ public void setEndAccdate(String endAccdate) {
+ this.endAccdate = endAccdate;
+ }
+
+ public String getStartTransdate() {
+ return startTransdate;
+ }
+
+ public void setStartTransdate(String startTransdate) {
+ this.startTransdate = startTransdate;
+ }
+
+ public String getEndTransdate() {
+ return endTransdate;
+ }
+
+ public void setEndTransdate(String endTransdate) {
+ this.endTransdate = endTransdate;
+ }
+
+ public String getPersonname() {
+ return personname;
+ }
+
+ public void setPersonname(String personname) {
+ this.personname = personname;
+ }
+
+ public String getCardno() {
+ return cardno;
+ }
+
+ public void setCardno(String cardno) {
+ this.cardno = cardno;
+ }
+
+ public String getSourcetype() {
+ return sourcetype;
+ }
+
+ public void setSourcetype(String sourcetype) {
+ this.sourcetype = sourcetype;
+ }
+
+ public String getTradeflag() {
+ return tradeflag;
+ }
+
+ public void setTradeflag(String tradeflag) {
+ this.tradeflag = tradeflag;
+ }
+
+ public String getTranscode() {
+ return transcode;
+ }
+
+ public void setTranscode(String transcode) {
+ this.transcode = transcode;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java
new file mode 100644
index 0000000..61e122e
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java
@@ -0,0 +1,78 @@
+package com.supwisdom.dlpay.system.bean;
+
+
+public class ZTreeNode {
+ private String id;
+ private String pId;
+ private String name;
+ private boolean checked;
+ private boolean open;
+
+ private Integer shoptype; //商户类别,商户树用到
+ private String shopaccno; //商户账号
+ private String iconSkin; //自定义图标
+
+ public boolean isOpen() {
+ return open;
+ }
+
+ public void setOpen(boolean open) {
+ this.open = open;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getpId() {
+ return pId;
+ }
+
+ public void setpId(String pId) {
+ this.pId = pId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public boolean isChecked() {
+ return checked;
+ }
+
+ public void setChecked(boolean checked) {
+ this.checked = checked;
+ }
+
+ public Integer getShoptype() {
+ return shoptype;
+ }
+
+ public void setShoptype(Integer shoptype) {
+ this.shoptype = shoptype;
+ }
+
+ public String getShopaccno() {
+ return shopaccno;
+ }
+
+ public void setShopaccno(String shopaccno) {
+ this.shopaccno = shopaccno;
+ }
+
+ public String getIconSkin() {
+ return iconSkin;
+ }
+
+ public void setIconSkin(String iconSkin) {
+ this.iconSkin = iconSkin;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java
new file mode 100644
index 0000000..af00076
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.system.service.DictionaryDataService;
+import com.supwisdom.dlpay.system.service.DictionaryProxy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.FormParam;
+import java.util.Map;
+
+@RestController
+public class DictPoolAction {
+ @Autowired
+ private DictionaryProxy dictionaryProxy;
+
+ @GetMapping("/dictpool")
+ public Map getDictDataByDicttype(@FormParam("dicttype") String dictType, HttpServletRequest request) {
+ dictType = request.getParameter("dicttype");
+ return dictionaryProxy.getDictionaryAsMap(dictType);
+ }
+
+ @GetMapping("/dictrefresh")
+ public JsonResult refreshDict() {
+ return JsonResult.ok();
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/DtlController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/DtlController.java
new file mode 100644
index 0000000..0b3a882
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/DtlController.java
@@ -0,0 +1,109 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.domain.TPersondtl;
+import com.supwisdom.dlpay.api.domain.TShopdtl;
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.framework.domain.TDictionary;
+import com.supwisdom.dlpay.framework.domain.TTranscode;
+import com.supwisdom.dlpay.framework.util.Dictionary;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.ShopdtlSearchBean;
+import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import com.supwisdom.dlpay.system.bean.UserdtlSearchBean;
+import com.supwisdom.dlpay.system.service.DictionaryProxy;
+import com.supwisdom.dlpay.system.service.DtlDataService;
+import com.supwisdom.dlpay.system.service.ShopDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Controller
+public class DtlController {
+ @Autowired
+ private DtlDataService dtlDataService;
+
+ @Autowired
+ private DictionaryProxy dictionaryProxy;
+
+ /**
+ * ====================================================
+ * 个人流水查询
+ * ====================================================
+ */
+ @GetMapping("/dtl/userdtl")
+ public String userdtlView(Model model) {
+// model.addAttribute("paytypelist", shopDataService.getConsumePaytypes());
+// model.addAttribute("transcodelist", dtlDataService.getAllTranscodes());
+// model.addAttribute("dtlstatuslist", dtlDataService.getAllDtlStatus());
+
+ model.addAttribute(Dictionary.TRANS_CODE,
+ dictionaryProxy.<TTranscode>getDictionaryAsList(Dictionary.TRANS_CODE));
+ model.addAttribute(Dictionary.DTL_STATUS,
+ dictionaryProxy.<TDictionary>getDictionaryAsList(Dictionary.DTL_STATUS));
+ model.addAttribute(Dictionary.PAY_TYPE,
+ dictionaryProxy.<TSourceType>getDictionaryAsList(Dictionary.SOURCE_TYPE));
+ return "system/dtl/userdtl";
+ }
+
+ @GetMapping("/dtl/userdtllist")
+ @PreAuthorize("hasPermission('/dtl/userdtl','')")
+ @ResponseBody
+ public PageResult<TPersondtl> searchUserdtlPage(@ModelAttribute UserdtlSearchBean searchBean) {
+ try {
+ Integer pageNo = searchBean.getPage();
+ Integer pageSize = searchBean.getLimit();
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return dtlDataService.getPersondtlPage(searchBean, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ /**
+ * ====================================================
+ * 商户流水查询
+ * ====================================================
+ */
+ @GetMapping("/dtl/shopdtl")
+ public String shopdtlView(Model model) {
+ model.addAttribute(Dictionary.PAY_TYPE,
+ dictionaryProxy.getDictionaryAsList(Dictionary.SOURCE_TYPE));
+ model.addAttribute(Dictionary.TRANS_CODE,
+ dictionaryProxy.getDictionaryAsList(Dictionary.TRANS_CODE));
+ model.addAttribute(Dictionary.DTL_STATUS,
+ dictionaryProxy.getDictionaryAsList(Dictionary.DTL_STATUS));
+ return "system/dtl/shopdtl";
+ }
+
+ @GetMapping("/dtl/shopdtllist")
+ @PreAuthorize("hasPermission('/dtl/shopdtl','')")
+ @ResponseBody
+ public PageResult<TShopdtl> searchUserdtlPage(@ModelAttribute ShopdtlSearchBean searchBean) {
+ try {
+ Integer pageNo = searchBean.getPage();
+ Integer pageSize = searchBean.getLimit();
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return dtlDataService.getShopdtlPage(searchBean, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/dtl/shoptreeselect")
+ @PreAuthorize("hasPermission('/dtl/shopdtl','')")
+ @ResponseBody
+ public List<TreeSelectNode> searchShopTree() {
+ List<TreeSelectNode> tree = dtlDataService.getTreeSelectShops();
+ return tree;
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
new file mode 100644
index 0000000..05d5977
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
@@ -0,0 +1,145 @@
+package com.supwisdom.dlpay.system.controller;
+
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TFunction;
+import com.supwisdom.dlpay.framework.domain.TResource;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import com.supwisdom.dlpay.system.service.FunctionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Controller
+public class FunctionController {
+
+ @Autowired
+ private FunctionService functionService;
+
+ @GetMapping("/function/index")
+ public String indexView() {
+ return "system/function/index";
+ }
+
+ @GetMapping("/function/list")
+ @PreAuthorize("hasPermission('/function/index','')")
+ @ResponseBody
+ public PageResult<TFunction> getDataList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "searchkey", required = false) String searchKey) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ FunctionSearchBean searchBean = new FunctionSearchBean();
+ searchBean.setPageNo(pageNo);
+ searchBean.setFunctioname(searchKey);
+ searchBean.setPageSize(pageSize);
+ return functionService.getFunctionsByKey(searchBean);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/function/loadadd")
+ @PreAuthorize("hasPermission('/function/loadadd','')")
+ public String loadadd() {
+ return "system/function/form";
+ }
+
+ @PostMapping("/function/add")
+ @PreAuthorize("hasPermission('/function/add','')")
+ @ResponseBody
+ public JsonResult add(@RequestBody TFunction function) {
+ if (function != null) {
+ function.setTenantId(TenantContext.getTenantSchema());
+ return functionService.saveFunction(function);
+ } else {
+ return JsonResult.error("添加失败");
+ }
+ }
+
+ @PostMapping("/function/delfunc")
+ @PreAuthorize("hasPermission('/function/delfunc','')")
+ @ResponseBody
+ public JsonResult delfunc(@RequestParam Integer funcid) {
+ return functionService.deleteFunction(funcid);
+ }
+
+ @GetMapping("/function/checkname")
+ @ResponseBody
+ public JsonResult checkname(@RequestParam String name,
+ @RequestParam(value = "id", required = false) Integer id) {
+ TFunction function = functionService.getFunctionByNameAndId(name, id);
+ if (function == null) {
+ return JsonResult.ok();
+ } else {
+ return JsonResult.error("功能名称重复");
+ }
+ }
+
+ @GetMapping("/function/loadsubadd")
+ @PreAuthorize("hasPermission('/function/loadsubadd','')")
+ public String loadsubadd(Model model) {
+ List<TFunction> functionList = functionService.getParentFunction();
+ model.addAttribute("list", functionList);
+ return "system/function/subform";
+ }
+
+ @GetMapping("/function/loadres")
+ @PreAuthorize("hasPermission('/function/loadres','')")
+ public String loadres(@RequestParam Integer functionid, Model model) {
+ TFunction function = functionService.getFunctionById(functionid);
+ List<TResource> resources = functionService.getResources(functionid);
+ model.addAttribute("function", function);
+ model.addAttribute("resources", resources);
+ return "system/function/reslist";
+ }
+
+ @GetMapping("/function/reslist")
+ @PreAuthorize("hasPermission('/function/loadres','')")
+ @ResponseBody
+ public PageResult<TResource> reslist(@RequestParam Integer functionid, Model model) {
+ List<TResource> resources = functionService.getResources(functionid);
+ return new PageResult<TResource>(resources);
+ }
+
+ @GetMapping("/function/loadresadd")
+ public String loadresadd(Model model) {
+ List<TFunction> functionList = functionService.getLeafFunction();
+ model.addAttribute("list", functionList);
+ return "system/function/resform";
+ }
+
+ @PostMapping("/function/addres")
+ @PreAuthorize("hasPermission('/function/addres','')")
+ @ResponseBody
+ public JsonResult addres(@RequestBody TResource resource) {
+ if (resource != null) {
+ return functionService.saveRes(resource);
+ } else {
+ return JsonResult.error("添加失败");
+ }
+ }
+
+ @GetMapping("/function/editres")
+ public String loadresadd(@RequestParam Integer resid, Model model) {
+ List<TFunction> functionList = functionService.getLeafFunction();
+ model.addAttribute("list", functionList);
+ return "system/function/resform";
+ }
+
+ @PostMapping("/function/delres")
+ @PreAuthorize("hasPermission('/function/delres','')")
+ @ResponseBody
+ public JsonResult delres(@RequestParam Integer resid) {
+ return functionService.deleteResource(resid);
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
new file mode 100644
index 0000000..3769118
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
@@ -0,0 +1,224 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.*;
+import com.supwisdom.dlpay.framework.security.OperUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.TradeDict;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import com.supwisdom.dlpay.system.bean.LogBean;
+import com.supwisdom.dlpay.system.bean.OperatorSearchBean;
+import com.supwisdom.dlpay.system.service.OperatorService;
+import com.supwisdom.dlpay.system.service.RoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+@Controller
+@RequestMapping("/operator")
+public class OperatorController {
+ @Autowired
+ private OperatorService operatorService;
+ @Autowired
+ private RoleService roleService;
+
+ @GetMapping("/index")
+ @PreAuthorize("hasPermission('/operator/index','')")
+ public String indexView(Model model) {
+ return "system/operator/index";
+ }
+
+ @GetMapping("/list")
+ @ResponseBody
+ public PageResult<TOperator> getDataList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "searchkey", required = false) String searchKey,
+ @RequestParam(value = "searchvalue", required = false) String searchValue) {
+ try {
+
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ OperatorSearchBean searchBean = new OperatorSearchBean();
+ if (!StringUtil.isEmpty(searchValue)) {
+ if ("opercode".equals(searchKey)) {
+ searchBean.setOpercode(searchValue.trim());
+ } else if ("opername".equals(searchKey)) {
+ searchBean.setOpername(searchValue.trim());
+ } else if ("mobile".equals(searchValue.trim())) {
+ searchBean.setMobile(searchValue.trim());
+ }
+ }
+ return operatorService.getOperatorsByPage(pageNo, pageSize, searchBean);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/load4add")
+ @PreAuthorize("hasPermission('/operator/load4add','')")
+ public String load4addOperator(Model model) {
+ model.addAttribute("roles", roleService.findAllRoles());
+ return "system/operator/operator";
+ }
+
+ @GetMapping("/checkopercode")
+ @ResponseBody
+ public JsonResult checkOpercode(@RequestParam("opercode") String opercode,
+ @RequestParam(value = "operid", required = false) String operid) {
+ if (operatorService.checkOpercodeExists(opercode, operid)) {
+ return JsonResult.error("账号重复");
+ }
+ return JsonResult.ok("success");
+ }
+
+ @PostMapping("/getoperatorrole")
+ @ResponseBody
+ public JsonResult getoperatorrole(@RequestParam(value = "operid") String operid) {
+ List<TOperRole> roles = operatorService.getOperRoleByOperId(operid);
+ JsonResult ret = JsonResult.ok("success");
+ ret.put("roles", roles);
+ return ret;
+ }
+
+ @PostMapping("/add")
+ @PreAuthorize("hasPermission('/operator/add','')")
+ @ResponseBody
+ public JsonResult add(@RequestParam("operid") String operid, @RequestParam("opercode") String opercode,
+ @RequestParam("opername") String opername, @RequestParam("sex") String sex,
+ @RequestParam("mobile") String mobile, @RequestParam("email") String email,
+ @RequestParam("roleId") String roleId, @RequestParam(value = "thirdadmin", required = false) String thirdadmin,
+ Model map) {
+ if (operatorService.checkOpercodeExists(opercode, operid)) {
+ return JsonResult.error("账号重复");
+ }
+ TOperator operator = new TOperator();
+ operator.setOpername(opername);
+ operator.setOpercode(opercode);
+ operator.setOperid(operid);
+ operator.setMobile(mobile);
+ operator.setEmail(email);
+ operator.setSex(sex);
+ operator.setThirdadmin("yes".equalsIgnoreCase(thirdadmin) ? "yes" : "no");
+ boolean ret = operatorService.saveOperator(operator, roleId);
+ if (ret) {
+ return JsonResult.ok("操作成功");
+ } else {
+ return JsonResult.error("操作失败");
+ }
+ }
+
+ @PostMapping("/resetpwd")
+ @PreAuthorize("hasPermission('/operator/resetpwd','')")
+ @ResponseBody
+ public JsonResult resetpwd(@RequestParam("operid") String operid) {
+ if (operatorService.resetPwd(operid)) {
+ return JsonResult.ok("操作成功,密码重置为123456");
+ } else {
+ return JsonResult.error("操作失败");
+ }
+ }
+
+ @PostMapping("/updatestate")
+ @PreAuthorize("hasPermission('/operator/updatestate','')")
+ @ResponseBody
+ public JsonResult updatestate(@RequestParam("operid") String operid, @RequestParam("state") String state) {
+ if (operatorService.updateState(operid, state)) {
+ return JsonResult.ok("操作成功");
+ } else {
+ return JsonResult.error("操作失败");
+ }
+ }
+
+ @GetMapping("/logs")
+ public String logs() {
+ return "system/operator/logs";
+ }
+
+ @GetMapping("/logslist")
+ @PreAuthorize("hasPermission('/operator/logslist','')")
+ @ResponseBody
+ public PageResult<TOperLog> logslist(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "searchkey", required = false) String searchKey) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ LogBean searchBean = new LogBean();
+ searchBean.setPageNo(pageNo);
+ searchBean.setOpername(searchKey);
+ searchBean.setPageSize(pageSize);
+ return operatorService.getOperLogs(searchBean);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/userinfor")
+ public String userinfor(ModelMap map) {
+ TOperator operator = OperUtil.getCurrentOper();
+ if(operator!=null){
+ operator = operatorService.getOperatorByCode(operator.getOpercode());
+ }
+ map.put("user", operator);
+ return "system/operator/userinfor";
+ }
+
+ @PostMapping("/updateinfor")
+ @ResponseBody
+ public JsonResult updateinfor(@RequestBody TOperator oper) {
+ TOperator operator = OperUtil.getCurrentOper();
+ if (oper != null) {
+ operator.setSex(oper.getSex());
+ operator.setOpername(oper.getOpername());
+ operator.setEmail(oper.getEmail());
+ operator.setMobile(oper.getMobile());
+ operatorService.saveOperator(operator);
+ }
+ return JsonResult.ok("操作成功");
+ }
+
+ @GetMapping("/setpwd")
+ public String setpwd(ModelMap map) {
+ return "system/operator/setpwd";
+ }
+
+ @PostMapping("/dosetpwd")
+ @ResponseBody
+ public JsonResult dosetpwd(@RequestParam String curpwd,
+ @RequestParam String newpwd, @RequestParam String renewpwd) {
+ if (StringUtil.isEmpty(curpwd)
+ || StringUtil.isEmpty(newpwd)
+ || StringUtil.isEmpty(renewpwd)) {
+ return JsonResult.error("参数粗错误");
+ }
+ BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+ String encpwd = encoder.encode(curpwd);
+ TOperator operator = OperUtil.getCurrentOper();
+ if (operator == null) {
+ return JsonResult.error(401, "登录已过期,请重新登录");
+ }
+ if (!encoder.matches(curpwd,operator.getPassword())) {
+ return JsonResult.error("当前密码错误");
+ }
+ if (!newpwd.equals(renewpwd)) {
+ return JsonResult.error("两次密码不一致");
+ }
+ if(newpwd.length()<6||newpwd.length()>20){
+ return JsonResult.error("密码6~20个字符");
+ }
+ operator.setOperpwd(encoder.encode(newpwd));
+ operatorService.saveOperator(operator);
+ return JsonResult.ok("密码修改成功,请重新登录");
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
new file mode 100644
index 0000000..cdc4a4a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
@@ -0,0 +1,571 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.framework.domain.TApiClient;
+import com.supwisdom.dlpay.framework.domain.TBusinesspara;
+import com.supwisdom.dlpay.framework.domain.TSyspara;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.*;
+import com.supwisdom.dlpay.system.service.ParamService;
+import com.supwisdom.dlpay.util.ConstantUtil;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+public class ParamController {
+ @Autowired
+ private ParamService paramService;
+ @Autowired
+ private SystemUtilService systemUtilService;
+
+ @GetMapping("/param/syspara")
+ public String sysparaView() {
+ return "system/param/syspara";
+ }
+
+ @GetMapping("/param/sysparalist")
+ @PreAuthorize("hasPermission('/param/syspara','')")
+ @ResponseBody
+ public PageResult<TSyspara> getDataList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "paraid", required = false) Integer paraid,
+ @RequestParam(value = "paraname", required = false) String paraname) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return paramService.getSysparaPage(paraid, paraname, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @PostMapping("/param/sysparaupdate")
+ @PreAuthorize("hasPermission('/param/sysparaupdate','')")
+ @ResponseBody
+ public JsonResult updateSyspara(@RequestParam("paraid") Integer paraid,
+ @RequestParam("paraval") String paraval) {
+ if (null == paraid || null == paraval) {
+ return JsonResult.error("参数传递错误");
+ } else if (paraval.length() > 30) {
+ return JsonResult.error("参数值过长");
+ }
+ TSyspara syspara = paramService.getSysparaByParaid(paraid);
+ if (null == syspara) {
+ return JsonResult.error("全局参数不存在");
+ }
+ syspara.setParaval(paraval);
+ syspara.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
+ if (syspara.checkValueInvalid()) {
+ return JsonResult.error("参数值格式错误");
+ }
+ try {
+ if (paramService.updateSyspara(syspara)) {
+ return JsonResult.ok("修改成功");
+ } else {
+ return JsonResult.error("修改失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+
+ /**
+ * ====================================================
+ * 业务参数配置
+ * ====================================================
+ */
+ @GetMapping("/param/businesspara")
+ public String busiparaView() {
+ return "system/param/businesspara";
+ }
+
+ @GetMapping("/param/businessparalist")
+ @PreAuthorize("hasPermission('/param/businesspara','')")
+ @ResponseBody
+ public PageResult<TBusinesspara> getBusinessDataList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "paraname", required = false) String paraname) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return paramService.getBusinessparaPage(paraname, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @PostMapping("/param/deletebusinesspara")
+ @PreAuthorize("hasPermission('/param/deletebusinesspara','')")
+ @ResponseBody
+ public JsonResult deleteBusinesspara(@RequestParam("parakey") String parakey) {
+ try {
+ if (StringUtil.isEmpty(parakey)) {
+ return JsonResult.error("参数名为空");
+ }
+ TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
+ if (null == businesspara) {
+ return JsonResult.error("业务参数[" + parakey + "]不存在!");
+ }
+ if (paramService.deleteBusinesspara(businesspara)) {
+ return JsonResult.ok("删除成功!");
+ } else {
+ return JsonResult.error("删除失败!");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @PostMapping("/param/businessparaupdate")
+ @PreAuthorize("hasPermission('/param/businessparaupdate','')")
+ @ResponseBody
+ public JsonResult updateBusinesspara(@RequestParam("parakey") String parakey, @RequestParam("paraval") String paraval) {
+ try {
+ if (StringUtil.isEmpty(parakey) || null == paraval) {
+ return JsonResult.error("参数传递错误");
+ }
+ TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
+ if (null == businesspara) {
+ return JsonResult.error("业务参数[" + parakey + "]不存在!");
+ }
+ businesspara.setParaval(paraval);
+ if (paramService.saveOrUpdateBusinesspara(businesspara)) {
+ return JsonResult.ok("修改成功!");
+ } else {
+ return JsonResult.error("修改失败!");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @GetMapping("/param/load4addbuspara")
+ @PreAuthorize("hasPermission('/param/load4addbuspara','')")
+ public String loadadd() {
+ return "system/param/busparaform";
+ }
+
+ @GetMapping("/param/checkbusname")
+ @ResponseBody
+ public JsonResult checkname(@RequestParam("parakey") String parakey) {
+ TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
+ if (businesspara == null) {
+ return JsonResult.ok();
+ } else {
+ return JsonResult.error("参数名重复");
+ }
+ }
+
+ @PostMapping("/param/addbusinesspara")
+ @PreAuthorize("hasPermission('/param/addbusinesspara','')")
+ @ResponseBody
+ public JsonResult addBusinesspara(@RequestParam("parakey") String parakey, @RequestParam("paraval") String paraval) {
+ if (StringUtil.isEmpty(parakey) || null == paraval) {
+ return JsonResult.error("参数传递错误");
+ }
+ try {
+ TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
+ if (null != businesspara) {
+ return JsonResult.error("参数名重复");
+ }
+ businesspara = new TBusinesspara();
+ businesspara.setParakey(parakey.trim());
+ businesspara.setParaval(paraval.trim());
+ if (paramService.saveOrUpdateBusinesspara(businesspara)) {
+ return JsonResult.ok("新增成功!");
+ } else {
+ return JsonResult.error("新增失败!");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+
+ /**
+ * ====================================================
+ * APPID应用权限参数管理
+ * ====================================================
+ */
+ @GetMapping("/param/apiclientpara")
+ public String appidParaView() {
+ return "system/param/apiclientpara";
+ }
+
+ @GetMapping("/param/apiclientparalist")
+ @PreAuthorize("hasPermission('/param/apiclientpara','')")
+ @ResponseBody
+ public PageResult<TApiClient> getApiclientDataList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "appid", required = false) String appid) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return paramService.getApiClientparaPage(appid, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/param/load4addapiclient")
+ @PreAuthorize("hasPermission('/param/load4addapiclient','')")
+ public String load4AddApiclientPara(Model model) {
+ Map<String, String> roles = new HashMap<>(0);
+ roles.put("ROLE_THIRD_COMMON", "调用通用接口权限");
+ roles.put("ROLE_THIRD_CONSUME", "调用消费接口权限");
+ roles.put("ROLE_THIRD_DEPOSIT", "调用充值接口权限");
+ roles.put("ROLE_THIRD_SHOP", "调用商户接口权限");
+ roles.put("ROLE_THIRD_ADMIN", "调用用户接口权限");
+ model.addAttribute("rolelist", roles);
+ return "system/param/apiclientform";
+ }
+
+ @PostMapping("/param/updateapiclientstate")
+ @PreAuthorize("hasPermission('/param/updateapiclientstate','')")
+ @ResponseBody
+ public JsonResult updateApiclientState(@RequestParam("appid") String appid, @RequestParam("state") String state) {
+ if (StringUtil.isEmpty(appid) || (!TradeDict.STATUS_NORMAL.equals(state) && !TradeDict.STATUS_CLOSED.equals(state))) {
+ return JsonResult.error("参数传递错误");
+ }
+ try {
+ TApiClient apiClient = paramService.getApiClientByAppid(appid);
+ if (null == apiClient) {
+ return JsonResult.error("应用参数不存在");
+ } else if (state.equals(apiClient.getStatus())) {
+ return JsonResult.error("状态修改错误,请刷新查询");
+ }
+ apiClient.setStatus(state);
+ if (paramService.saveOrUpdateApiClient(apiClient)) {
+ return JsonResult.ok(TradeDict.STATUS_NORMAL.equals(state) ? "启用成功" : "关闭成功");
+ } else {
+ return JsonResult.error(TradeDict.STATUS_NORMAL.equals(state) ? "启用失败" : "关闭失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @PostMapping("/param/deleteapiclient")
+ @PreAuthorize("hasPermission('/param/deleteapiclient','')")
+ @ResponseBody
+ public JsonResult deleteApiclientParam(@RequestParam("appid") String appid) {
+ if (StringUtil.isEmpty(appid)) {
+ return JsonResult.error("参数传递错误");
+ }
+ try {
+ TApiClient apiClient = paramService.getApiClientByAppid(appid);
+ if (null == apiClient) {
+ return JsonResult.error("应用参数不存在");
+ }
+
+ if (paramService.deleteApiClient(apiClient)) {
+ return JsonResult.ok("删除成功");
+ } else {
+ return JsonResult.error("删除失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @PostMapping("/param/updateapiclientpara")
+ @PreAuthorize("hasPermission('/param/updateapiclientpara','')")
+ @ResponseBody
+ public JsonResult updateApiclientSecret(@RequestParam("appid") String appid,
+ @RequestParam(value = "secret", required = false) String secret,
+ @RequestParam(value = "roles", required = false) String roles) {
+ if (StringUtil.isEmpty(appid) || (StringUtil.isEmpty(secret) && StringUtil.isEmpty(roles))) {
+ return JsonResult.error("参数传递错误");
+ }
+ try {
+ TApiClient apiClient = paramService.getApiClientByAppid(appid);
+ if (null == apiClient) {
+ return JsonResult.error("应用参数不存在");
+ }
+ if (!StringUtil.isEmpty(secret)) {
+ apiClient.setSecret(secret);
+ }
+ if (!StringUtil.isEmpty(roles)) {
+ apiClient.setRoles(roles.replaceAll(",", ";"));
+ }
+ if (paramService.saveOrUpdateApiClient(apiClient)) {
+ return JsonResult.ok("修改成功");
+ } else {
+ return JsonResult.error("修改失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @PostMapping("/param/addapiclientpara")
+ @PreAuthorize("hasPermission('/param/addapiclientpara','')")
+ @ResponseBody
+ public JsonResult addApiclientPara(@RequestParam("appid") String appid,
+ @RequestParam("roles") String roles) {
+ if (StringUtil.isEmpty(appid) || StringUtil.isEmpty(roles)) {
+ return JsonResult.error("参数传递错误");
+ }
+ try {
+ TApiClient apiClient = paramService.getApiClientByAppid(appid);
+ if (null != apiClient) {
+ return JsonResult.error("APPID重复");
+ }
+ apiClient = new TApiClient();
+ apiClient.setAppid(appid.trim());
+ apiClient.setSecret(RandomUtils.getUUIDStr());
+ apiClient.setStatus(TradeDict.STATUS_NORMAL);
+ apiClient.setTenantId(TenantContext.getTenantSchema());
+ apiClient.setRoles(roles.replaceAll(",", ";"));
+ if (paramService.saveOrUpdateApiClient(apiClient)) {
+ return JsonResult.ok("新增成功");
+ } else {
+ return JsonResult.error("新增失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ /**
+ * ====================================================
+ * 支付能力配置
+ * ====================================================
+ */
+ @GetMapping("/param/paytype")
+ public String paytypeView() {
+ return "system/param/paytype";
+ }
+
+ @GetMapping("/param/paytypelist")
+ @PreAuthorize("hasPermission('/param/paytype','')")
+ @ResponseBody
+ public PageResult<TSourceType> getPaytypeDataList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "paytype", required = false) String paytype) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return paramService.getSourceTypePage(paytype, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/param/load4addpaytype")
+ @PreAuthorize("hasPermission('/param/load4addpaytype','')")
+ public String load4AddPaytype(Model model) {
+ return "system/param/paytypeform";
+ }
+
+ @PostMapping("/param/updatepaytypestate")
+ @PreAuthorize("hasPermission('/param/updatepaytypestate','')")
+ @ResponseBody
+ public JsonResult updatePaytypeState(@RequestParam("paytype") String paytype,
+ @RequestParam("state") Boolean state,
+ @RequestParam(value = "optype", required = false) String optype) {
+ if (StringUtil.isEmpty(paytype)
+ || (!StringUtil.isEmpty(optype) && !"charge".equals(optype) && !"consume".equals(optype) && !"anonymous".equals(optype) && !"reversable".equals(optype) && !"checkable".equals(optype))) {
+ return JsonResult.error("参数传递错误");
+ }
+ try {
+ TSourceType tPaytype = paramService.getSourceType(paytype);
+ if (null == tPaytype) {
+ return JsonResult.error("支付方式不存在!");
+ }
+ if ("charge".equals(optype)) {
+ if (state.equals(tPaytype.getChargeEnable())) {
+ return JsonResult.error("状态错误,请重新查询后操作");
+ }
+ tPaytype.setChargeEnable(state);
+ } else if ("consume".equals(optype)) {
+ if (state.equals(tPaytype.getConsumeEnable())) {
+ return JsonResult.error("状态错误,请重新查询后操作");
+ }
+ tPaytype.setConsumeEnable(state);
+ } else if ("anonymous".equals(optype)) {
+ if (state.equals(tPaytype.getAnonymousEnable())) {
+ return JsonResult.error("状态错误,请重新查询后操作");
+ }
+ tPaytype.setAnonymousEnable(state);
+ } else if("reversable".equals(optype)){
+ if(state.equals(tPaytype.getReversable())){
+ return JsonResult.error("状态错误,请重新查询后操作");
+ }
+ tPaytype.setReversable(state);
+ }else if("checkable".equals(optype)){
+ if(state.equals(tPaytype.getCheckable())){
+ return JsonResult.error("状态错误,请重新查询后操作");
+ }
+ tPaytype.setCheckable(state);
+ }else{
+ if (state.equals(tPaytype.getEnable())) {
+ return JsonResult.error("状态错误,请重新查询后操作");
+ }
+ tPaytype.setEnable(state); //默认切换主状态
+ }
+
+ if (paramService.saveOrUpdateSourceType(tPaytype)) {
+ return JsonResult.ok(state ? "启用成功" : "关闭成功");
+ } else {
+ return JsonResult.error(!state ? "启用失败" : "关闭失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @PostMapping("/param/updatepaytypename")
+ @PreAuthorize("hasPermission('/param/updatepaytypename','')")
+ @ResponseBody
+ public JsonResult updatePaytypeName(@RequestParam("paytype") String paytype,
+ @RequestParam("paydesc") String paydesc) {
+ if (StringUtil.isEmpty(paytype) || StringUtil.isEmpty(paydesc)) {
+ return JsonResult.error("参数传递错误");
+ }
+ try {
+ TSourceType tPaytype = paramService.getSourceType(paytype);
+ if (null == tPaytype) {
+ return JsonResult.error("支付方式不存在!");
+ }
+ tPaytype.setPaydesc(paydesc.trim());
+ if (paramService.saveOrUpdateSourceType(tPaytype)) {
+ return JsonResult.ok("修改成功");
+ } else {
+ return JsonResult.error("修改失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @PostMapping("/param/deletepaytype")
+ @PreAuthorize("hasPermission('/param/deletepaytype','')")
+ @ResponseBody
+ public JsonResult deletePaytype(@RequestParam("paytype") String paytype) {
+ try {
+ TSourceType tPaytype = paramService.getSourceType(paytype);
+ if (null == tPaytype) {
+ return JsonResult.error("支付方式不存在!");
+ }
+ if (paramService.deleteSourceType(tPaytype)) {
+ return JsonResult.ok("删除成功");
+ } else {
+ return JsonResult.error("删除失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @PostMapping("/param/addpaytype")
+ @PreAuthorize("hasPermission('/param/addpaytype','')")
+ @ResponseBody
+ public JsonResult addPaytype(@RequestParam("paytype") String paytype,
+ @RequestParam(value = "enable", required = false, defaultValue = "no") String enable,
+ @RequestParam(value = "chargeEnable", required = false, defaultValue = "no") String chargeEnable,
+ @RequestParam(value = "consumeEnable", required = false, defaultValue = "no") String consumeEnable,
+ @RequestParam(value = "anonymousEnable", required = false, defaultValue = "no") String anonymousEnable,
+ @RequestParam(value = "reversable", required = false, defaultValue = "no") String reversable,
+ @RequestParam(value = "checkable", required = false, defaultValue = "no") String checkable,
+ @RequestParam("paydesc") String paydesc) {
+ try {
+ TSourceType tPaytype = paramService.getSourceType(paytype);
+ if (null != tPaytype) {
+ return JsonResult.error("支付方式已经存在");
+ }
+ tPaytype = new TSourceType();
+ tPaytype.setSourceType(paytype.trim());
+ if (StringUtil.isEmpty(paydesc)) return JsonResult.error("支付名称不能为空!");
+ tPaytype.setPaydesc(paydesc.trim());
+ tPaytype.setEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(enable));
+ tPaytype.setChargeEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(chargeEnable));
+ tPaytype.setConsumeEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(consumeEnable));
+ tPaytype.setAnonymousEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(anonymousEnable));
+ tPaytype.setReversable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(reversable));
+ tPaytype.setCheckable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(checkable));
+ if (paramService.saveOrUpdateSourceType(tPaytype)) {
+ return JsonResult.ok("新增成功");
+ } else {
+ return JsonResult.error("新增失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @GetMapping("/param/checkpaytype")
+ @ResponseBody
+ public JsonResult checkPaytype(@RequestParam("paytype") String paytype) {
+ TSourceType tPaytype = paramService.getSourceType(paytype);
+ if (null != tPaytype) {
+ return JsonResult.error("支付方式已经存在");
+ } else {
+ return JsonResult.ok("可以使用");
+ }
+ }
+
+ @GetMapping("/param/load4paytypeconfig")
+ @PreAuthorize("hasPermission('/param/load4paytypeconfig','')")
+ public String load4PaytypeConfig(@RequestParam("paytype") String paytype, Model model) {
+ List<TPaytypeConfig> configList = paramService.getSourceTypeConfigList(paytype);
+ model.addAttribute("configlist", configList);
+ model.addAttribute("paytype", paytype);
+ return "system/param/paytypeconfig";
+ }
+
+ @PostMapping("/param/addpaytypeconfig")
+ @PreAuthorize("hasPermission('/param/addpaytypeconfig','')")
+ @ResponseBody
+ public JsonResult addPaytypeConfig(@RequestBody Map<String, String> param) {
+ String paytypeHtmlKey = "hid_paytype"; //页面上传来paytype的KEY
+ if (null == param || StringUtil.isEmpty(param.get(paytypeHtmlKey))) {
+ return JsonResult.error("参数传递错误");
+ }
+
+ try {
+ String paytype = param.get(paytypeHtmlKey).trim();
+ param.remove(paytypeHtmlKey);
+ if (paramService.saveSourceTypeConfig(paytype, param)) {
+ return JsonResult.ok("配置成功");
+ } else {
+ return JsonResult.error("配置失败");
+ }
+ } catch (WebCheckException ex) {
+ return JsonResult.error(ex.getMessage());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
new file mode 100644
index 0000000..584953c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/RoleController.java
@@ -0,0 +1,90 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TRole;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import com.supwisdom.dlpay.system.service.RoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Controller
+public class RoleController {
+ @Autowired
+ private RoleService roleService;
+ @GetMapping("/role/index")
+ public String indexView() {
+ return "system/role/index";
+ }
+
+ @GetMapping("/role/list")
+ @PreAuthorize("hasPermission('/role/index','')")
+ @ResponseBody
+ public PageResult<TRole> getDataList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "searchkey", required = false) String searchKey) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ FunctionSearchBean searchBean = new FunctionSearchBean();
+ searchBean.setPageNo(pageNo);
+ searchBean.setFunctioname(searchKey);
+ searchBean.setPageSize(pageSize);
+ return roleService.getRolesByKey(searchBean);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/role/loadadd")
+ public String loadadd() {
+ return "system/role/form";
+ }
+
+ @PostMapping("/role/add")
+ @PreAuthorize("hasPermission('/role/add','')")
+ @ResponseBody
+ public JsonResult add(@RequestBody TRole role) {
+ if (role != null) {
+ return roleService.saveRole(role);
+ } else {
+ return JsonResult.error("添加失败");
+ }
+ }
+
+ @GetMapping("/role/loadfunc")
+ @PreAuthorize("hasPermission('/role/loadfunc','')")
+ public String loadfunc() {
+ return "system/role/func";
+ }
+
+ @PostMapping("/role/addfunc")
+ @PreAuthorize("hasPermission('/role/addfunc','')")
+ @ResponseBody
+ public JsonResult addfunc(@RequestParam String roleId,
+ @RequestParam String funcs) {
+ return roleService.saveRoleFuncId(roleId, funcs);
+ }
+
+ @GetMapping("/role/func")
+ @ResponseBody
+ public JsonResult func(@RequestParam String roleId) {
+ List<ZTreeNode> nodes = roleService.findByRoleIdNative(roleId);
+ JsonResult result = JsonResult.ok();
+ result.put("node", nodes);
+ return result;
+ }
+ @PostMapping("/role/del")
+ @PreAuthorize("hasPermission('/role/del','')")
+ @ResponseBody
+ public JsonResult del(@RequestParam String roleid) {
+ return roleService.deleteRole(roleid);
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SettleReportController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SettleReportController.java
new file mode 100644
index 0000000..c7cb46b
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SettleReportController.java
@@ -0,0 +1,159 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.BaseResp;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.ShopBusinessShowBean;
+import com.supwisdom.dlpay.system.bean.SubjectDayShowBean;
+import com.supwisdom.dlpay.system.bean.SubjectDetailShowBean;
+import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import com.supwisdom.dlpay.system.service.SettleReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.Date;
+import java.util.List;
+
+@Controller
+public class SettleReportController {
+ @Autowired
+ private SettleReportService settleReportService;
+
+ private boolean checkReportDate(String startdate, String enddate, BaseResp resp) {
+ if (StringUtil.isEmpty(startdate) || StringUtil.isEmpty(enddate)) {
+ resp.setRetcode("99");
+ resp.setRetmsg("请选择时间段");
+ return false;
+ } else if (!DateUtil.checkDatetimeValid(DateUtil.unParseToDateFormat(startdate), "yyyyMMdd")) {
+ resp.setRetcode("99");
+ resp.setRetmsg("起始时间非法");
+ return false;
+ } else if (!DateUtil.checkDatetimeValid(DateUtil.unParseToDateFormat(enddate), "yyyyMMdd")) {
+ resp.setRetcode("99");
+ resp.setRetmsg("截止时间非法");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * ====================================================
+ * 科目日结表
+ * ====================================================
+ */
+ @GetMapping("/report/subjectday")
+ public String subjectdayReport(ModelMap map) {
+ String settledate = settleReportService.getSystemSettledate();
+ map.addAttribute("maxdate", DateUtil.parseToDateFormat(DateUtil.getNewDay(settledate, -1)));
+ return "system/report/subjectday";
+ }
+
+ @GetMapping("/report/subjectdaylist")
+ @PreAuthorize("hasPermission('/report/subjectday','')")
+ @ResponseBody
+ public PageResult<SubjectDayShowBean> getSubjectdayData(@RequestParam(value = "startdate", required = false) String startdate,
+ @RequestParam(value = "enddate", required = false) String enddate,
+ @RequestParam(value = "nodealshow", required = false, defaultValue = "false") Boolean noDealShow) {
+ try {
+ BaseResp resp = new BaseResp();
+ if (!checkReportDate(startdate, enddate, resp)) {
+ return new PageResult<>(99, resp.getRetmsg());
+ }
+ return settleReportService.getSubjectDayInfos(DateUtil.unParseToDateFormat(startdate), DateUtil.unParseToDateFormat(enddate), noDealShow);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ /**
+ * ====================================================
+ * 科目明细账
+ * ====================================================
+ */
+ @GetMapping("/report/subjectdetail")
+ public String subjectDetailReport(ModelMap map) {
+ String settledate = settleReportService.getSystemSettledate();
+ map.addAttribute("maxdate", DateUtil.parseToDateFormat(DateUtil.getNewDay(settledate, -1)));
+ return "system/report/subjectdetail";
+ }
+
+ @GetMapping("/report/subjectdetaillist")
+ @PreAuthorize("hasPermission('/report/subjectdetail','')")
+ @ResponseBody
+ public PageResult<SubjectDetailShowBean> getSubjectData(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "startdate", required = false) String startdate,
+ @RequestParam(value = "enddate", required = false) String enddate,
+ @RequestParam(value = "subjno", required = false) String subjno) {
+ try {
+ BaseResp resp = new BaseResp();
+ if (!checkReportDate(startdate, enddate, resp)) {
+ return new PageResult<>(99, resp.getRetmsg());
+ }
+ if (StringUtil.isEmpty(subjno)) {
+ return new PageResult<>(99, "请选择科目");
+ }
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return settleReportService.getSubjectDetailInfos(DateUtil.unParseToDateFormat(startdate), DateUtil.unParseToDateFormat(enddate), subjno.trim(), pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/report/subjectselecttree")
+ @PreAuthorize("hasPermission('/report/subjectdetail','')")
+ @ResponseBody
+ public List<TreeSelectNode> getSubjectSelectTree(){
+ return settleReportService.getSystemShowSubjectTree();
+ }
+
+ /**
+ * ====================================================
+ * 商户营业情况表
+ * ====================================================
+ */
+ @GetMapping("/report/shopbusiness")
+ public String shopBusinessReport(ModelMap map) {
+ String settledate = settleReportService.getSystemSettledate();
+ map.addAttribute("maxdate", DateUtil.parseToDateFormat(DateUtil.getNewDay(settledate, -1)));
+ return "system/report/shopbusiness";
+ }
+
+ @GetMapping("/report/shopbusinesslist")
+ @PreAuthorize("hasPermission('/report/shopbusiness','')")
+ @ResponseBody
+ public PageResult<ShopBusinessShowBean> getShopbusinessData(@RequestParam(value = "startdate", required = false) String startdate,
+ @RequestParam(value = "enddate", required = false) String enddate,
+ @RequestParam(value = "shopid", required = false) String shopid,
+ @RequestParam(value = "nodealshow", required = false, defaultValue = "false") Boolean noDealShow){
+ try {
+ BaseResp resp = new BaseResp();
+ if (!checkReportDate(startdate, enddate, resp)) {
+ return new PageResult<>(99, resp.getRetmsg());
+ }
+ return settleReportService.getShopBusinessShowInfos(DateUtil.unParseToDateFormat(startdate), DateUtil.unParseToDateFormat(enddate), shopid, noDealShow);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询异常");
+ }
+ }
+
+ @GetMapping("/report/selectshoptree")
+ @PreAuthorize("hasPermission('/report/shopbusiness','')")
+ @ResponseBody
+ public List<TreeSelectNode> searchShopTree() {
+ return settleReportService.getSystemNormalShopTree();
+ }
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
new file mode 100644
index 0000000..b85095a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
@@ -0,0 +1,326 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.api.domain.TShopPaytype;
+import com.supwisdom.dlpay.api.domain.TShopPaytypeConfig;
+import com.supwisdom.dlpay.framework.domain.TShop;
+import com.supwisdom.dlpay.framework.domain.TShopacc;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.*;
+import com.supwisdom.dlpay.system.bean.ShopConfigBean;
+import com.supwisdom.dlpay.system.service.DictionaryProxy;
+import com.supwisdom.dlpay.system.service.ParamService;
+import com.supwisdom.dlpay.system.service.ShopDataService;
+import com.supwisdom.dlpay.util.ConstantUtil;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@Controller
+public class ShopController {
+ @Autowired
+ private ShopDataService shopDataService;
+ @Autowired
+ private ParamService paramService;
+ @Autowired
+ private SystemUtilService systemUtilService;
+
+ @Autowired
+ private DictionaryProxy dictionaryProxy;
+
+ @GetMapping("/shop/index")
+ public String shopView() {
+ return "system/shop/index";
+ }
+
+ @GetMapping("/shop/shoptree")
+ @PreAuthorize("hasPermission('/shop/index','')")
+ @ResponseBody
+ public JsonResult shopTreeData() {
+ return JsonResult.ok("OK").put("data", shopDataService.getAllShopNodes());
+ }
+
+ @PostMapping("/shop/deleteshop")
+ @PreAuthorize("hasPermission('/shop/deleteshop','')")
+ @ResponseBody
+ public JsonResult deleteShop(@RequestParam("shopid") Integer shopid) {
+ TShop shop = shopDataService.getShopByShopid(shopid);
+ if (null == shop) {
+ return JsonResult.error("商户不存在,请重新查询"); //商户不存在,请重新查询
+ }
+
+ try {
+ if (shopDataService.deleteShop(shop)) {
+ return JsonResult.ok("删除成功");
+ } else {
+ return JsonResult.error("删除失败");
+ }
+ } catch (WebCheckException ex) {
+ return JsonResult.error(ex.getMessage());
+ } catch (Exception e) {
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @GetMapping("/shop/getshopinfo")
+ @PreAuthorize("hasPermission('/shop/getshopinfo','')")
+ @ResponseBody
+ public JsonResult getShopInfo(@RequestParam("shopid") Integer shopid) {
+ TShop shop = shopDataService.getShopByShopid(shopid);
+ if (null == shop) {
+ return JsonResult.error("商户不存在,请重新查询"); //商户不存在,请重新查询
+ }
+ return JsonResult.ok("查询成功").put("shop", shop);
+ }
+
+ @PostMapping("/shop/saveorupdate")
+ @PreAuthorize("hasPermission('/shop/saveorupdate','')")
+ @ResponseBody
+ public JsonResult saveOrUpdateShop(@RequestParam("shopid") Integer shopid, @RequestParam("shopname") String shopname,
+ @RequestParam("fshopid") Integer fshopid, @RequestParam("shoptype") Integer shoptype,
+ @RequestParam(value = "contactman", required = false) String contactman,
+ @RequestParam(value = "idtype", required = false) String idtype,
+ @RequestParam(value = "idno", required = false) String idno,
+ @RequestParam(value = "mobile", required = false) String mobile,
+ @RequestParam(value = "tel", required = false) String tel,
+ @RequestParam(value = "email", required = false) String email,
+ @RequestParam(value = "addr", required = false) String addr,
+ @RequestParam(value = "zipcode", required = false) String zipcode) {
+ if (null == shopid || StringUtil.isEmpty(shopname) || null == fshopid || (shoptype != 0 && shoptype != 1)) {
+ return JsonResult.error("参数传递错误");
+ }
+
+ TShop shop;
+ boolean addflag = false;
+ if (shopid == 0) {
+ //新增
+ addflag = true;
+ shop = new TShop();
+ shop.setFshopid(fshopid);
+ shop.setShopname(shopname);
+ shop.setShoptype(shoptype);
+ shop.setStatus(TradeDict.STATUS_NORMAL);
+ } else {
+ //修改
+ shop = shopDataService.getShopByShopid(shopid);
+ if (null == shop) {
+ return JsonResult.error("商户不存在,修改失败!请重新查询");
+ }
+ shop.setFshopid(fshopid);
+ shop.setShopname(shopname);
+// shop.setShoptype(shoptype); //商户类型不能改
+ }
+ shop.setContactman(contactman == null ? null : contactman.trim());
+ shop.setIdno(idno == null ? null : idno.trim());
+ shop.setIdtype(idtype == null ? null : idtype.trim());
+ if (!StringUtil.isEmpty(shop.getIdno()) && StringUtil.isEmpty(shop.getIdtype())) {
+ return JsonResult.error("填写证件号时必须制定证件类型!");
+ } else if (!StringUtil.isEmpty(shop.getIdno()) && "1".equals(shop.getIdtype()) && !StringUtil.isIdentity(shop.getIdno())) {
+ return JsonResult.error("身份证格式错误!");
+ }
+ shop.setMobile(mobile == null ? null : mobile);
+ if (!StringUtil.isEmpty(shop.getMobile()) && !StringUtil.isMobile(shop.getMobile())) {
+ return JsonResult.error("请正确填写手机号!");
+ }
+ shop.setTel(tel == null ? null : tel.trim());
+ shop.setEmail(email == null ? null : email.trim());
+ if (!StringUtil.isEmpty(shop.getEmail()) && !StringUtil.isEmail(shop.getEmail())) {
+ return JsonResult.error("请正确填写邮箱地址!");
+ }
+ shop.setAddr(addr == null ? null : addr.trim());
+ shop.setZipcode(zipcode == null ? null : zipcode.trim());
+
+ try {
+ if (shopDataService.saveOrUpdateShop(shop)) {
+ return JsonResult.ok(addflag ? "新增成功" : "修改成功").put("shop", shop);
+ } else {
+ return JsonResult.error(addflag ? "新增失败" : "修改失败");
+ }
+ } catch (WebCheckException ex) {
+ return JsonResult.error(ex.getMessage());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ /**
+ * ====================================================
+ * 商户支付能力配置
+ * ====================================================
+ */
+ @GetMapping("/shop/config")
+ public String shopConfigView(Model model) {
+// model.addAttribute("paytypelist", shopDataService.getConsumePaytypes());
+ model.addAttribute(Dictionary.PAY_TYPE,
+ dictionaryProxy.<TSourceType>getDictionaryAsList(Dictionary.SOURCE_TYPE));
+ return "system/shop/config";
+ }
+
+ @GetMapping("/shop/shopacctree")
+ @PreAuthorize("hasPermission('/shop/config','')")
+ @ResponseBody
+ public JsonResult shopaccTreeData() {
+ return JsonResult.ok("OK").put("data", shopDataService.getAllShopNodes());
+ }
+
+ @GetMapping("/shop/shoppaytypelist")
+ @PreAuthorize("hasPermission('/shop/shoppaytypelist','')")
+ @ResponseBody
+ public PageResult<ShopConfigBean> getShopPaytypeList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "paytype", required = false) String paytype,
+ @RequestParam(value = "shopaccno", required = false) String shopaccno) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return shopDataService.getShopPaytypeInfos(shopaccno, paytype, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @PostMapping("/shop/updatepaytypestat")
+ @PreAuthorize("hasPermission('/shop/updatepaytypestat','')")
+ @ResponseBody
+ public JsonResult updateShopPaytypeStat(@RequestParam("shopaccno") String shopaccno, @RequestParam("paytype") String paytype,
+ @RequestParam("state") String state, @RequestParam("optype") String optype) {
+ if (StringUtil.isEmpty(shopaccno) || StringUtil.isEmpty(paytype)
+ || (!ConstantUtil.ENABLE_NO.equals(state) && !ConstantUtil.ENABLE_YES.equals(state))
+ || (!"consume".equals(optype) && !"anonymous".equals(optype) && !"reverse".equals(optype))) {
+ return JsonResult.error("参数传递错误");
+ }
+
+ try {
+ TShopPaytype shopPaytype = shopDataService.getShopPaytype(shopaccno.trim(), paytype.trim());
+ if (null == shopPaytype) {
+ return JsonResult.error("商户支付能力不存在!");
+ }
+
+ if ("consume".equals(optype)) {
+ if (state.equals(shopPaytype.getConsumeEnable())) {
+ return JsonResult.error("状态错误,请重新查询后操作");
+ }
+ shopPaytype.setConsumeEnable(ConstantUtil.ENABLE_YES.equals(state));
+ } else if ("anonymous".equals(optype)) {
+ if (state.equals(shopPaytype.getAnonymousEnable())) {
+ return JsonResult.error("状态错误,请重新查询后操作");
+ }
+ shopPaytype.setAnonymousEnable(ConstantUtil.ENABLE_YES.equals(state));
+ } else if ("refund".equals(optype)) {
+ if (state.equals(shopPaytype.getReverseEnable())) {
+ return JsonResult.error("状态错误,请重新查询后操作");
+ }
+ shopPaytype.setReverseEnable(ConstantUtil.ENABLE_YES.equals(state));
+ }
+
+ if (shopDataService.saveOrUpdateShopPaytype(shopPaytype)) {
+ return JsonResult.ok(ConstantUtil.ENABLE_YES.equals(state) ? "启用成功" : "关闭成功");
+ } else {
+ return JsonResult.error(ConstantUtil.ENABLE_YES.equals(state) ? "启用失败" : "关闭失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @GetMapping("/shop/load4addpaytype")
+ @PreAuthorize("hasPermission('/shop/load4addpaytype','')")
+ public String load4AddShopPaytype(Model model) {
+ model.addAttribute(Dictionary.PAY_TYPE,
+ dictionaryProxy.getDictionaryAsList(Dictionary.SOURCE_TYPE));
+ return "system/shop/configform";
+ }
+
+ @PostMapping("/shop/addshoppaytype")
+ @PreAuthorize("hasPermission('/shop/addshoppaytype','')")
+ @ResponseBody
+ public JsonResult addShoppaytype(@RequestParam("shopaccno") String shopaccno,
+ @RequestParam("paytype") String paytype,
+ @RequestParam(value = "consumeEnable", required = false, defaultValue = "no") String consumeEnable,
+ @RequestParam(value = "anonymousEnable", required = false, defaultValue = "no") String anonymousEnable,
+ @RequestParam(value = "reverseEnable", required = false, defaultValue = "no") String reverseEnable) {
+ if (StringUtil.isEmpty(shopaccno) || StringUtil.isEmpty(paytype)) {
+ return JsonResult.error("参数传递错误");
+ }
+ try {
+ TShopacc shopacc = shopDataService.getShopaccByAccno(shopaccno.trim());
+ TSourceType tPaytype = paramService.getSourceType(paytype.trim());
+ if (null == shopacc) {
+ return JsonResult.error("商户账户不存在!");
+ }
+ if (null == tPaytype) {
+ return JsonResult.error("支付方式在系统中不存在!");
+ }
+ TShopPaytype shopPaytype = shopDataService.getShopPaytype(shopaccno.trim(), paytype.trim());
+ if (null != shopPaytype) {
+ return JsonResult.error("商户该支付能力已经存在!");
+ }
+ shopPaytype = new TShopPaytype();
+ shopPaytype.setShopaccno(shopacc.getShopaccno());
+ shopPaytype.setPaytype(tPaytype.getSourceType());
+ shopPaytype.setConsumeEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(consumeEnable));
+ shopPaytype.setAnonymousEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(anonymousEnable));
+ shopPaytype.setReverseEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(reverseEnable));
+ shopPaytype.setCreatetime(systemUtilService.getSysdatetime().getHostdatetime());
+ if (shopDataService.saveOrUpdateShopPaytype(shopPaytype)) {
+ return JsonResult.ok("新增成功");
+ } else {
+ return JsonResult.error("新增失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @GetMapping("/shop/load4paytypepara")
+ @PreAuthorize("hasPermission('/shop/load4paytypepara','')")
+ public String load4AddShopPaytypePara(@RequestParam("shopaccno") String shopaccno,
+ @RequestParam("paytype") String paytype,
+ Model model) {
+ List<TShopPaytypeConfig> configList = shopDataService.getShopPaytypeConfigs(shopaccno, paytype);
+ model.addAttribute("configlist", configList);
+ model.addAttribute("shopaccno", shopaccno);
+ model.addAttribute("paytype", paytype);
+ return "system/shop/configpara";
+ }
+
+ @PostMapping("/shop/addpaytypepara")
+ @PreAuthorize("hasPermission('/shop/addpaytypepara','')")
+ @ResponseBody
+ public JsonResult addShopPaytypePara(@RequestBody Map<String, String> param) {
+ String shopaccnoHtmlKey = "hid_shopaccno"; //页面上传来shopaccno的KEY
+ String paytypeHtmlKey = "hid_paytype"; //页面上传来paytype的KEY
+ if (null == param || StringUtil.isEmpty(param.get(paytypeHtmlKey)) || StringUtil.isEmpty(param.get(shopaccnoHtmlKey))) {
+ return JsonResult.error("参数传递错误");
+ }
+ try {
+ String shopaccno = param.get(shopaccnoHtmlKey).trim();
+ String paytype = param.get(paytypeHtmlKey).trim();
+ param.remove(shopaccnoHtmlKey);
+ param.remove(paytypeHtmlKey);
+ if (shopDataService.saveOrUpdateShopPaytypeConfig(shopaccno, paytype, param)) {
+ return JsonResult.ok("配置成功");
+ } else {
+ return JsonResult.error("配置失败");
+ }
+ } catch (WebCheckException ex) {
+ return JsonResult.error(ex.getMessage());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
new file mode 100644
index 0000000..31c7fae
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
@@ -0,0 +1,164 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.domain.TAccount;
+import com.supwisdom.dlpay.api.domain.TPerson;
+import com.supwisdom.dlpay.api.domain.TPersonIdentity;
+import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.Dictionary;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.IdTypeBean;
+import com.supwisdom.dlpay.system.bean.PersonParamBean;
+import com.supwisdom.dlpay.system.service.DictionaryProxy;
+import com.supwisdom.dlpay.system.service.UserDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Controller
+public class UserController {
+ @Autowired
+ private UserDataService userDataService;
+
+ @Autowired
+ private DictionaryProxy dictionaryProxy;
+
+ @GetMapping("/user/index")
+ public String index() {
+ return "system/user/index";
+ }
+
+ @GetMapping("/user/list")
+ @PreAuthorize("hasPermission('/user/list','')")
+ @ResponseBody
+ public PageResult<TPerson> getDataList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "searchkey", required = false) String searchKey) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ PersonParamBean searchBean = new PersonParamBean();
+ searchBean.setPageNo(pageNo);
+ searchBean.setName(searchKey);
+ searchBean.setPageSize(pageSize);
+ return userDataService.getPersonsByKey(searchBean);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/user/loadadd")
+ public String add(ModelMap map) {
+ map.put(Dictionary.IDTYPE, dictionaryProxy.getDictionaryAsList(Dictionary.IDTYPE));
+ return "system/user/add";
+ }
+
+ @PostMapping("/user/add")
+ @PreAuthorize("hasPermission('/user/add','')")
+ @ResponseBody
+ public JsonResult add(@RequestBody TPerson person) {
+ if (StringUtil.isEmpty(person.getName())
+ || StringUtil.isEmpty(person.getSex())
+ || StringUtil.isEmpty(person.getIdno())
+ || StringUtil.isEmpty(person.getIdtype())
+ || StringUtil.isEmpty(person.getMobile())) {
+ return JsonResult.error("参数错误");
+ }
+ return userDataService.saveUser(person);
+ }
+
+ @PostMapping("/user/del")
+ @PreAuthorize("hasPermission('/user/del','')")
+ @ResponseBody
+ public JsonResult del(@RequestParam String userid) {
+ if (StringUtil.isEmpty(userid)) {
+ return JsonResult.error("参数错误");
+ }
+ return userDataService.deleteUser(userid);
+ }
+
+ @GetMapping("/user/acc")
+ public String acc() {
+ return "system/user/account";
+ }
+
+ @GetMapping("/user/account")
+ @PreAuthorize("hasPermission('/user/account','')")
+ @ResponseBody
+ public PageResult<TAccount> getDataAccountList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "searchkey", required = false) String searchKey) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ PersonParamBean searchBean = new PersonParamBean();
+ searchBean.setPageNo(pageNo);
+ searchBean.setName(searchKey);
+ searchBean.setPageSize(pageSize);
+ return userDataService.getAccountsByKey(searchBean);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/user/point")
+ public String point() {
+ return "system/user/point";
+ }
+
+ @GetMapping("/user/pointlist")
+ @PreAuthorize("hasPermission('/user/pointlist','')")
+ @ResponseBody
+ public PageResult<TPointsAccount> getDataPointList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "searchkey", required = false) String searchKey) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ PersonParamBean searchBean = new PersonParamBean();
+ searchBean.setPageNo(pageNo);
+ searchBean.setName(searchKey);
+ searchBean.setPageSize(pageSize);
+ return userDataService.getPointsByKey(searchBean);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @PostMapping("/user/delacc")
+ @PreAuthorize("hasPermission('/user/delacc','')")
+ @ResponseBody
+ public JsonResult delacc(@RequestParam String accno) {
+ if (StringUtil.isEmpty(accno)) {
+ return JsonResult.error("参数错误");
+ }
+ return userDataService.closeAccount(accno);
+ }
+
+ @PostMapping("/user/delpoint")
+ @PreAuthorize("hasPermission('/user/delpoint','')")
+ @ResponseBody
+ public JsonResult delpoint(@RequestParam String userid) {
+ if (StringUtil.isEmpty(userid)) {
+ return JsonResult.error("参数错误");
+ }
+ return userDataService.deletePoint(userid);
+ }
+
+ @GetMapping("/user/pointdtl")
+ public String pointdtl(@RequestParam String userid, ModelMap map) {
+ map.put("userid", userid);
+ return "system/user/pointdtl";
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/DictionaryDataService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/DictionaryDataService.java
new file mode 100644
index 0000000..48cc4df
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/DictionaryDataService.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.framework.domain.TDictionary;
+import com.supwisdom.dlpay.framework.domain.TTranscode;
+
+import java.util.List;
+
+public interface DictionaryDataService {
+ List<TDictionary> getDictionaryByDictType(String dicttype);
+
+ List<TTranscode> getTransCode();
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/DictionaryProxy.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/DictionaryProxy.java
new file mode 100644
index 0000000..7f8d814
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/DictionaryProxy.java
@@ -0,0 +1,56 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.framework.domain.DictionaryTable;
+import com.supwisdom.dlpay.framework.util.Dictionary;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class DictionaryProxy {
+ private final DictionaryDataService dictionaryDataService;
+
+ private final ParamService paramService;
+
+ public DictionaryProxy(DictionaryDataService dictionaryDataService, ParamService paramService) {
+ this.dictionaryDataService = dictionaryDataService;
+ this.paramService = paramService;
+ }
+
+ @SuppressWarnings("UNCHECKED_CAST")
+ public <T> Map<String, T> getDictionaryObject(String dictType) {
+ List<T> list = getDictionaryAsList(dictType);
+ Map<String, T> result = new HashMap<>();
+ for (Object item : list) {
+ if (item instanceof DictionaryTable) {
+ result.put(((DictionaryTable) item).getDictKey(), (T) item);
+ }
+ }
+ return result;
+ }
+
+ public Map<String, Object> getDictionaryAsMap(String dictType) {
+ List list = getDictionaryAsList(dictType);
+ Map<String, Object> result = new HashMap<>();
+ for (Object item : list) {
+ if (item instanceof DictionaryTable) {
+ DictionaryTable it = (DictionaryTable) item;
+ result.put(it.getDictKey(), it.getDictValue());
+ }
+ }
+ return result;
+ }
+
+ @SuppressWarnings("UNCHECKED_CAST")
+ public <T> List<T> getDictionaryAsList(String dictType) {
+ if (Dictionary.SOURCE_TYPE.equals(dictType)) {
+ return (List<T>) paramService.getAllSourceType();
+ } else if (Dictionary.TRANS_CODE.equals(dictType)) {
+ return (List<T>) dictionaryDataService.getTransCode();
+ } else {
+ return (List<T>) dictionaryDataService.getDictionaryByDictType(dictType);
+ }
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java
new file mode 100644
index 0000000..59afc6d
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.api.domain.TPersondtl;
+import com.supwisdom.dlpay.api.domain.TShopdtl;
+import com.supwisdom.dlpay.framework.domain.TDictionary;
+import com.supwisdom.dlpay.framework.domain.TTranscode;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.ShopdtlSearchBean;
+import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import com.supwisdom.dlpay.system.bean.UserdtlSearchBean;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface DtlDataService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<TPersondtl> getPersondtlPage(UserdtlSearchBean searchBean, int pageNo, int pageSize);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<TShopdtl> getShopdtlPage(ShopdtlSearchBean searchBean, int pageNo, int pageSize);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ List<TreeSelectNode> getTreeSelectShops();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
new file mode 100644
index 0000000..8884b21
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
@@ -0,0 +1,50 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TFunction;
+import com.supwisdom.dlpay.framework.domain.TResource;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+public interface FunctionService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<TFunction> getFunctionsByOperid(String operid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<Map<String, Object>> getMenuTree(List<TFunction> funcList, Integer parentId);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ PageResult<TFunction> getFunctionsByKey(FunctionSearchBean param);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ TFunction getFunctionByNameAndId(String name,Integer id);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult saveFunction(TFunction function);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ TFunction getFunctionById(Integer id);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult deleteFunction(Integer funcid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<TFunction> getParentFunction();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<TResource> getResources(Integer function);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<TFunction> getLeafFunction();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult saveRes(TResource resource);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult deleteResource(Integer resid);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
new file mode 100644
index 0000000..3954045
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
@@ -0,0 +1,44 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.framework.domain.TOperLog;
+import com.supwisdom.dlpay.framework.domain.TOperRole;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.LogBean;
+import com.supwisdom.dlpay.system.bean.OperatorSearchBean;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface OperatorService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<TOperator> getOperatorsByPage(int pageNo, int pageSize, OperatorSearchBean searchBean);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ boolean checkOpercodeExists(String opercode, String operid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean saveOperator(TOperator operator,String roles);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ TOperator getOperatorByCode(String opercode);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ List<TOperRole> getOperRoleByOperId(String operid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean resetPwd(String operid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean updateState(String operid,String state);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean saveOperLog(TOperLog log);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<TOperLog> getOperLogs(LogBean param);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean saveOperator(TOperator operator);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
new file mode 100644
index 0000000..dc9d180
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
@@ -0,0 +1,73 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.framework.domain.TApiClient;
+import com.supwisdom.dlpay.framework.domain.TBusinesspara;
+import com.supwisdom.dlpay.framework.domain.TSyspara;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+
+public interface ParamService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<TSyspara> getSysparaPage(Integer paraid, String paraname, int pageNo, int pageSize);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ TSyspara getSysparaByParaid(int paraid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean updateSyspara(TSyspara syspara);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<TBusinesspara> getBusinessparaPage(String paraname, int pageNo, int pageSize);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ TBusinesspara getBusinessparaByParakey(String parakey);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean deleteBusinesspara(TBusinesspara businesspara);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean saveOrUpdateBusinesspara(TBusinesspara businesspara);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<TApiClient> getApiClientparaPage(String appid, int pageNo, int pageSize);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ TApiClient getApiClientByAppid(String appid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean saveOrUpdateApiClient(TApiClient apiClient);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean deleteApiClient(TApiClient apiClient);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<TSourceType> getSourceTypePage(String paytype, int pageNo, int pageSize);
+
+ @Transactional(readOnly = true)
+ List<TSourceType> getAllSourceType();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ TSourceType getSourceType(String paytype);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean saveOrUpdateSourceType(TSourceType paytype);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean deleteSourceType(TSourceType paytype);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ List<TPaytypeConfig> getSourceTypeConfigList(String paytype);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean saveSourceTypeConfig(String paytype, Map<String, String> param) throws WebCheckException;
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/RoleService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/RoleService.java
new file mode 100644
index 0000000..6acfe7d
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/RoleService.java
@@ -0,0 +1,49 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TPermission;
+import com.supwisdom.dlpay.framework.domain.TResource;
+import com.supwisdom.dlpay.framework.domain.TRole;
+import com.supwisdom.dlpay.framework.domain.TRoleFunction;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface RoleService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<TRole> findAllRoles();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ TRole findRoleByRoleid(String roleid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ TResource findResourceByURI(String uri);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ TRoleFunction findRoleFunctionByRoleIdAndFunctionId(String roleid, Integer functionid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ PageResult<TRole> getRolesByKey(FunctionSearchBean param);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult saveRole(TRole role);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<TRoleFunction> getRoleFuncByRoleid(String roleId);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ TPermission findByRoleIdAndResid(String roleFuncId, Integer resid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult saveRoleFuncId(String roleId, String funcs);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<ZTreeNode> findByRoleIdNative(String roleId);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult deleteRole(String roleid);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/SettleReportService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/SettleReportService.java
new file mode 100644
index 0000000..6b60bca
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/SettleReportService.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.ShopBusinessShowBean;
+import com.supwisdom.dlpay.system.bean.SubjectDayShowBean;
+import com.supwisdom.dlpay.system.bean.SubjectDetailShowBean;
+import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface SettleReportService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ String getSystemSettledate();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<SubjectDayShowBean> getSubjectDayInfos(String startdate,String enddate, boolean nodealshow);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<SubjectDetailShowBean> getSubjectDetailInfos(String startdate,String enddate,String subjno, int pageNo,int pageSize);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ List<TreeSelectNode> getSystemShowSubjectTree();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ List<TreeSelectNode> getSystemNormalShopTree();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<ShopBusinessShowBean> getShopBusinessShowInfos(String startdate, String enddate, String shopid, boolean nodealshow);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
new file mode 100644
index 0000000..9f5bd1a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
@@ -0,0 +1,50 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.api.domain.TShopPaytype;
+import com.supwisdom.dlpay.api.domain.TShopPaytypeConfig;
+import com.supwisdom.dlpay.framework.domain.TShop;
+import com.supwisdom.dlpay.framework.domain.TShopacc;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.ShopConfigBean;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ShopDataService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<ZTreeNode> getAllShopNodes();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ TShop getShopByShopid(Integer shopid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean deleteShop(TShop shop) throws WebCheckException;
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean saveOrUpdateShop(TShop shop) throws WebCheckException;
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ PageResult<ShopConfigBean> getShopPaytypeInfos(String shopaccno, String paytype, int pageNo, int pageSize);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ TShopPaytype getShopPaytype(String shopaccno, String paytype);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ TShopacc getShopaccByAccno(String shopaccno);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean saveOrUpdateShopPaytype(TShopPaytype shopPaytype);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<TShopPaytypeConfig> getShopPaytypeConfigs(String shopaccno, String paytype);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ boolean saveOrUpdateShopPaytypeConfig(String shopaccno, String paytype, Map<String, String> param) throws WebCheckException;
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
new file mode 100644
index 0000000..942196e
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.domain.TAccount;
+import com.supwisdom.dlpay.api.domain.TPerson;
+import com.supwisdom.dlpay.api.domain.TPersonIdentity;
+import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.PersonParamBean;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface UserDataService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ PageResult<TPerson> getPersonsByKey(PersonParamBean param);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ PageResult<TAccount> getAccountsByKey(PersonParamBean param);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ PageResult<TPointsAccount> getPointsByKey(PersonParamBean param);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult saveUser(TPerson person);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult deleteUser(String userid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult closeAccount(String accno);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ JsonResult deletePoint(String userid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<TPersonIdentity> getPersonIdentity(String userid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ PageResult<TPointsAccount> getUserPointDTL(PersonParamBean param);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/DictionaryDataServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/DictionaryDataServiceImpl.java
new file mode 100644
index 0000000..523bded
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/DictionaryDataServiceImpl.java
@@ -0,0 +1,45 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.framework.dao.DictionaryDao;
+import com.supwisdom.dlpay.framework.dao.TranscodeDao;
+import com.supwisdom.dlpay.framework.domain.TDictionary;
+import com.supwisdom.dlpay.framework.domain.TTranscode;
+import com.supwisdom.dlpay.system.service.DictionaryDataService;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class DictionaryDataServiceImpl implements DictionaryDataService {
+ private final DictionaryDao dictionaryDao;
+ private final TranscodeDao transcodeDao;
+
+ public DictionaryDataServiceImpl(DictionaryDao dictionaryDao,
+ TranscodeDao transcodeDao) {
+ this.dictionaryDao = dictionaryDao;
+ this.transcodeDao = transcodeDao;
+ }
+
+ @Override
+ @Cacheable(cacheNames = "dicationary_cache", key = "#p0")
+ public List<TDictionary> getDictionaryByDictType(String dicttype) {
+ List<TDictionary> list = dictionaryDao.findAllByDicttype(dicttype);
+ if (!list.isEmpty()) {
+ return list;
+ }
+ return new ArrayList<>();
+ }
+
+
+ @Override
+ @Cacheable(cacheNames = "trans_code_cache")
+ public List<TTranscode> getTransCode() {
+ List<TTranscode> list = transcodeDao.findAll();
+ if (!list.isEmpty()) {
+ return list;
+ }
+ return new ArrayList<>();
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java
new file mode 100644
index 0000000..82fbdc2
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java
@@ -0,0 +1,165 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.dao.PersondtlDao;
+import com.supwisdom.dlpay.api.dao.ShopdtlDao;
+import com.supwisdom.dlpay.api.domain.TPersondtl;
+import com.supwisdom.dlpay.api.domain.TShopdtl;
+import com.supwisdom.dlpay.framework.dao.ShopDao;
+import com.supwisdom.dlpay.framework.dao.TranscodeDao;
+import com.supwisdom.dlpay.framework.domain.TDictionary;
+import com.supwisdom.dlpay.framework.domain.TShop;
+import com.supwisdom.dlpay.framework.domain.TTranscode;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.Dictionary;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.bean.ShopdtlSearchBean;
+import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import com.supwisdom.dlpay.system.bean.UserdtlSearchBean;
+import com.supwisdom.dlpay.system.service.DictionaryProxy;
+import com.supwisdom.dlpay.system.service.DtlDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class DtlDataServiceImpl implements DtlDataService {
+ @Autowired
+ private PersondtlDao persondtlDao;
+ @Autowired
+ private ShopdtlDao shopdtlDao;
+ @Autowired
+ private TranscodeDao transcodeDao;
+ @Autowired
+ private DictionaryProxy dictionaryProxy;
+ @Autowired
+ private ShopDao shopDao;
+
+ @Override
+ public PageResult<TPersondtl> getPersondtlPage(UserdtlSearchBean searchBean, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "refno"));
+ Page<TPersondtl> page = persondtlDao.findAll(new Specification<TPersondtl>() {
+ @Override
+ public Predicate toPredicate(Root<TPersondtl> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+ List<Predicate> predicates = new ArrayList<>();
+ if (!StringUtil.isEmpty(searchBean.getStartAccdate())) {
+ predicates.add(criteriaBuilder.ge(root.get("accdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getStartAccdate()))));
+ }
+ if (!StringUtil.isEmpty(searchBean.getEndAccdate())) {
+ predicates.add(criteriaBuilder.le(root.get("accdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getEndAccdate()))));
+ }
+ if (!StringUtil.isEmpty(searchBean.getStartTransdate())) {
+ predicates.add(criteriaBuilder.ge(root.get("transdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getStartTransdate()))));
+
+ }
+ if (!StringUtil.isEmpty(searchBean.getEndTransdate())) {
+ predicates.add(criteriaBuilder.le(root.get("transdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getEndTransdate()))));
+ }
+ if (!StringUtil.isEmpty(searchBean.getPersonname())) {
+ predicates.add(criteriaBuilder.like(root.get("userName").as(String.class), "%" + searchBean.getPersonname().trim() + "%"));
+ }
+ if (!StringUtil.isEmpty(searchBean.getSourcetype())) {
+ predicates.add(criteriaBuilder.equal(root.get("sourceType").as(String.class), searchBean.getSourcetype().trim()));
+ }
+ if (!StringUtil.isEmpty(searchBean.getTradeflag())) {
+ predicates.add(criteriaBuilder.equal(root.get("tradeflag").as(String.class), searchBean.getTradeflag().trim()));
+ }
+ if (!StringUtil.isEmpty(searchBean.getTranscode())) {
+ predicates.add(criteriaBuilder.equal(root.get("transcode").as(String.class), searchBean.getTranscode().trim()));
+ }
+ if (!StringUtil.isEmpty(searchBean.getStatus())) {
+ predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), searchBean.getStatus().trim()));
+ }
+ return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+ }
+ }, pageable);
+ return new PageResult<>(page);
+ }
+
+ @Override
+ public PageResult<TShopdtl> getShopdtlPage(ShopdtlSearchBean searchBean, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "refno"));
+ Page<TShopdtl> page = shopdtlDao.findAll((Specification<TShopdtl>) (root, query, criteriaBuilder) -> {
+ List<Predicate> predicates = new ArrayList<>();
+ if (!StringUtil.isEmpty(searchBean.getStartAccdate())) {
+ predicates.add(criteriaBuilder.ge(root.get("accdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getStartAccdate()))));
+ }
+ if (!StringUtil.isEmpty(searchBean.getEndAccdate())) {
+ predicates.add(criteriaBuilder.le(root.get("accdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getEndAccdate()))));
+ }
+ if (!StringUtil.isEmpty(searchBean.getStartTransdate())) {
+ predicates.add(criteriaBuilder.ge(root.get("transdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getStartTransdate()))));
+
+ }
+ if (!StringUtil.isEmpty(searchBean.getEndTransdate())) {
+ predicates.add(criteriaBuilder.le(root.get("transdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getEndTransdate()))));
+ }
+ if (!StringUtil.isEmpty(searchBean.getShopname())) {
+ predicates.add(criteriaBuilder.like(root.get("shopname").as(String.class), "%" + searchBean.getShopname().trim() + "%"));
+ }
+ if (!StringUtil.isEmpty(searchBean.getShopaccno())) {
+ predicates.add(criteriaBuilder.equal(root.get("shopaccno").as(String.class), searchBean.getShopaccno().trim()));
+ }
+ if (!StringUtil.isEmpty(searchBean.getSourcetype())) {
+ predicates.add(criteriaBuilder.equal(root.get("sourceType").as(String.class), searchBean.getSourcetype().trim()));
+ }
+ if (!StringUtil.isEmpty(searchBean.getTradeflag())) {
+ predicates.add(criteriaBuilder.equal(root.get("tradeflag").as(String.class), searchBean.getTradeflag().trim()));
+ }
+ if (!StringUtil.isEmpty(searchBean.getTranscode())) {
+ predicates.add(criteriaBuilder.equal(root.get("transcode").as(String.class), searchBean.getTranscode().trim()));
+ }
+ if (!StringUtil.isEmpty(searchBean.getStatus())) {
+ predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), searchBean.getStatus().trim()));
+ }
+ return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+ }, pageable);
+ return new PageResult<>(page);
+ }
+
+ @Override
+ public List<TreeSelectNode> getTreeSelectShops() {
+ List<TShop> shoplist = shopDao.getNormalShops();
+ if (StringUtil.isEmpty(shoplist)) {
+ return new ArrayList<>(0);
+ }
+ return getShopSelectTree(shoplist, 0);
+ }
+
+ private List<TreeSelectNode> getShopSelectTree(List<TShop> shoplist, Integer fshopid) {
+ List<TreeSelectNode> result = new ArrayList<>(0);
+ for (TShop shop : shoplist) {
+ if (fshopid.equals(shop.getFshopid())) {
+ TreeSelectNode node = new TreeSelectNode();
+ node.setId(String.valueOf(shop.getShopid()));
+ if (!StringUtil.isEmpty(shop.getShopaccno())) {
+ node.setId(shop.getShopaccno()); //替换商户账号
+ }
+ node.setName(shop.getShopname());
+ node.setOpen(StringUtil.isEmpty(shop.getShopaccno()));
+ node.setChecked(false);
+ node.setAccno(shop.getShopaccno());
+ List<TreeSelectNode> children = getShopSelectTree(shoplist, shop.getShopid());
+ if (null != children && children.size() > 0) {
+ node.setChildren(children);
+ } else {
+ node.setChildren(null);
+ }
+ result.add(node);
+ }
+ }
+ return result;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java
new file mode 100644
index 0000000..9dec0bf
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java
@@ -0,0 +1,145 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.dao.FunctionDao;
+import com.supwisdom.dlpay.framework.dao.ResourceDao;
+import com.supwisdom.dlpay.framework.dao.RoleFunctionDao;
+import com.supwisdom.dlpay.framework.domain.TFunction;
+import com.supwisdom.dlpay.framework.domain.TResource;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import com.supwisdom.dlpay.system.service.FunctionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class FunctionServiceImpl implements FunctionService {
+ @Autowired
+ private FunctionDao functionDao;
+ @Autowired
+ private ResourceDao resourceDao;
+ @Autowired
+ private RoleFunctionDao roleFunctionDao;
+
+ @Override
+ @Cacheable(cacheNames = "oper_function_list", key = "#p0")
+ public List<TFunction> getFunctionsByOperid(String operid) {
+ List<TFunction> list = functionDao.getTFunctionsByOperid(StringUtil.isEmpty(operid) ? "" : operid.trim());
+ if (!StringUtil.isEmpty(list)) return list;
+ return new ArrayList<>(0);
+ }
+
+ @Override
+ public List<Map<String, Object>> getMenuTree(List<TFunction> funcList, Integer parentId) {
+ List<Map<String, Object>> list = new ArrayList<>(0);
+ for (TFunction func : funcList) {
+ if (parentId.equals(func.getParentId())) {
+ Map<String, Object> map = new HashMap<>(0);
+ map.put("menuName", func.getName());
+ map.put("menuIcon", func.getMenuIcon());
+ if ("#".equals(func.getMenuUrl())) {
+ map.put("menuUrl", "javascript:;");
+ } else {
+ map.put("menuUrl", func.getMenuUrl());
+ }
+ map.put("subMenus", getMenuTree(funcList, func.getId()));
+ list.add(map);
+ }
+ }
+ return list;
+ }
+
+ @Override
+ public PageResult<TFunction> getFunctionsByKey(FunctionSearchBean param) {
+ Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+ , Sort.by("id"));
+ if (!StringUtil.isEmpty(param.getFunctioname())) {
+ return new PageResult<>(functionDao.findAllByNameContaining(param.getFunctioname(), pageable));
+ }
+ return new PageResult<>(functionDao.findAll(pageable));
+ }
+
+ @Override
+ @CacheEvict(cacheNames = "oper_function_list")
+ public TFunction getFunctionByNameAndId(String name, Integer id) {
+ if (id != null && id != 0) {
+ return functionDao.findByNameAndIdNot(name, id);
+ }
+ return functionDao.findByName(name);
+ }
+
+ @Override
+ public JsonResult saveFunction(TFunction function) {
+ TFunction temp = getFunctionByNameAndId(function.getName(), function.getId());
+ if (temp != null) {
+ return JsonResult.error("功能名称重复");
+ }
+ if (function.getParentId() == null) {
+ function.setParentId(-1);
+ }
+ functionDao.save(function);
+ return JsonResult.ok("成功");
+ }
+
+ @Override
+ public TFunction getFunctionById(Integer id) {
+ return functionDao.getOne(id);
+ }
+
+ @Override
+ public List<TFunction> getParentFunction() {
+ return functionDao.findByIsLeaf(0);
+ }
+
+ @Override
+ public List<TResource> getResources(Integer function) {
+ return resourceDao.findByFunctionId(function);
+ }
+
+ @Override
+ public List<TFunction> getLeafFunction() {
+ return functionDao.findByIsLeaf(1);
+ }
+
+ @Override
+ public JsonResult saveRes(TResource resource) {
+ if (resource.getId() != null && resource.getId() != 0) {
+ TResource temp = resourceDao.findByUriAndIdNot(resource.getUri(), resource.getId());
+ if (temp != null) {
+ return JsonResult.error("资源路径已存在");
+ }
+ } else {
+ TResource temp = resourceDao.findByUri(resource.getUri());
+ if (temp != null) {
+ return JsonResult.error("资源路径已存在");
+ }
+ }
+ resourceDao.save(resource);
+ return JsonResult.ok("成功");
+ }
+
+ @Override
+ public JsonResult deleteResource(Integer resid) {
+ resourceDao.deleteById(resid);
+ return JsonResult.ok("成功");
+ }
+
+ @Override
+ public JsonResult deleteFunction(Integer funcid) {
+ resourceDao.deleteByFunctionId(funcid);
+ roleFunctionDao.deleteByFunctionId(funcid);
+ functionDao.deleteById(funcid);
+ return JsonResult.ok("成功");
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
new file mode 100644
index 0000000..8a5a1c1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
@@ -0,0 +1,179 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.framework.dao.OperLogDao;
+import com.supwisdom.dlpay.framework.dao.OperRoleDao;
+import com.supwisdom.dlpay.framework.dao.OperatorDao;
+import com.supwisdom.dlpay.framework.domain.TOperLog;
+import com.supwisdom.dlpay.framework.domain.TOperRole;
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.*;
+import com.supwisdom.dlpay.system.bean.LogBean;
+import com.supwisdom.dlpay.system.bean.OperatorSearchBean;
+import com.supwisdom.dlpay.system.service.OperatorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class OperatorServiceImpl implements OperatorService {
+ @Autowired
+ private OperatorDao operatorDao;
+ @Autowired
+ private OperRoleDao operRoleDao;
+ @Autowired
+ private OperLogDao operLogDao;
+
+ @Override
+ public PageResult<TOperator> getOperatorsByPage(int pageNo, int pageSize, OperatorSearchBean searchBean) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.Direction.DESC, "opendate");
+ Page<TOperator> page = operatorDao.findAll(new Specification<TOperator>() {
+ @Override
+ public Predicate toPredicate(Root<TOperator> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+ List<Predicate> predicates = new ArrayList<>();
+ if (!StringUtil.isEmpty(searchBean.getOpercode())) {
+ predicates.add(criteriaBuilder.equal(root.get("opercode").as(String.class), searchBean.getOpercode().trim()));
+ }
+ if (!StringUtil.isEmpty(searchBean.getOpername())) {
+ predicates.add(criteriaBuilder.like(root.get("opername").as(String.class), "%" + searchBean.getOpername().trim() + "%"));
+ }
+ if (!StringUtil.isEmpty(searchBean.getMobile())) {
+ predicates.add(criteriaBuilder.like(root.get("mobile").as(String.class), "%" + searchBean.getMobile().trim() + "%"));
+ }
+ if (null != searchBean.getDeleteShow() && !searchBean.getDeleteShow()) {
+ predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), TradeDict.STATUS_NORMAL)); //仅显示正常
+ }
+ return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+ }
+ }, pageable);
+
+ return new PageResult<>(page);
+ }
+
+ @Override
+ public boolean checkOpercodeExists(String opercode, String operid) {
+ TOperator oper = operatorDao.findByOpercode(opercode.trim());
+ if (null != oper && StringUtil.isEmpty(operid)) return true;
+ if (null != oper && !StringUtil.isEmpty(operid) && !operid.trim().equals(oper.getOperid())) return true;
+ return false;
+ }
+
+ @Override
+ public boolean saveOperator(TOperator operator, String roles) {
+ if (StringUtil.isEmpty(operator.getOperid())) {
+ String[] roleids = roles.split(",");
+ operator.setOpendate(DateUtil.getNow("yyyyMMdd"));
+ operator.setStatus(TradeDict.STATUS_NORMAL);
+ operator.setOpertype(WebConstant.OPERTYPE_DEFAULT);
+ operator.setTenantId(TenantContext.getTenantSchema());
+ BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+ operator.setOperpwd(encoder.encode(WebConstant.OPERPWD_DEFAULT));
+ operator.setTenantId(TenantContext.getTenantSchema());
+ operator = operatorDao.save(operator);
+ for (String role : roleids) {
+ TOperRole operRole = new TOperRole();
+ operRole.setOperid(operator.getOperid());
+ operRole.setRoleId(role);
+ operRole.setTenantId(operator.getTenantId());
+ operRoleDao.save(operRole);
+ }
+ } else {
+ Optional<TOperator> temp = operatorDao.findById(operator.getOperid());
+ if (!temp.isPresent()) {
+ return false;
+ }
+ TOperator op = temp.get();
+ op.setSex(operator.getSex());
+ op.setEmail(operator.getEmail());
+ op.setMobile(operator.getMobile());
+ op.setOpername(operator.getOpername());
+ op.setOpercode(operator.getOpercode());
+ op.setThirdadmin(operator.getThirdadmin());
+ operatorDao.save(op);
+ operRoleDao.deleteByOperid(op.getOperid());
+ String[] roleids = roles.split(",");
+ for (String role : roleids) {
+ TOperRole operRole = new TOperRole();
+ operRole.setOperid(op.getOperid());
+ operRole.setRoleId(role);
+ operRole.setTenantId(op.getTenantId());
+ operRoleDao.save(operRole);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public TOperator getOperatorByCode(String opercode) {
+ return operatorDao.findByOpercode(opercode);
+ }
+
+ @Override
+ public List<TOperRole> getOperRoleByOperId(String operid) {
+ return operRoleDao.findAllByOperid(operid);
+ }
+
+ @Override
+ public boolean resetPwd(String operid) {
+ Optional<TOperator> temp = operatorDao.findById(operid);
+ if (!temp.isPresent()) {
+ return false;
+ }
+ TOperator op = temp.get();
+ BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+ op.setOperpwd(encoder.encode(WebConstant.OPERPWD_DEFAULT));
+ operatorDao.save(op);
+ return true;
+ }
+
+ @Override
+ public boolean updateState(String operid, String state) {
+ Optional<TOperator> temp = operatorDao.findById(operid);
+ if (!temp.isPresent()) {
+ return false;
+ }
+ TOperator op = temp.get();
+ op.setStatus(state);
+ operatorDao.save(op);
+ return true;
+ }
+
+ @Override
+ public boolean saveOperLog(TOperLog log) {
+ operLogDao.save(log);
+ return true;
+ }
+
+ @Override
+ public PageResult<TOperLog> getOperLogs(LogBean param) {
+ Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+ , Sort.by(Sort.Direction.DESC, "logdate"));
+ if (!StringUtil.isEmpty(param.getOpername())) {
+ return new PageResult<>(operLogDao.findAllByOpernameContaining(param.getOpername(), pageable));
+ }
+ return new PageResult<>(operLogDao.findAll(pageable));
+ }
+
+ @Override
+ public boolean saveOperator(TOperator operator) {
+ Optional<TOperator> temp = operatorDao.findById(operator.getOperid());
+ if (!temp.isPresent()) {
+ return false;
+ }
+ operatorDao.save(operator);
+ return true;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
new file mode 100644
index 0000000..a0f86cd
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
@@ -0,0 +1,229 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.dao.PaytypeConfigDao;
+import com.supwisdom.dlpay.api.dao.SourceTypeDao;
+import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.framework.dao.ApiClientDao;
+import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
+import com.supwisdom.dlpay.framework.dao.SysparaDao;
+import com.supwisdom.dlpay.framework.domain.TApiClient;
+import com.supwisdom.dlpay.framework.domain.TBusinesspara;
+import com.supwisdom.dlpay.framework.domain.TSyspara;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.service.ParamService;
+import com.supwisdom.dlpay.util.ConstantUtil;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+@Service
+public class ParamServiceImpl implements ParamService {
+ @Autowired
+ private SysparaDao sysparaDao;
+ @Autowired
+ private BusinessparaDao businessparaDao;
+ @Autowired
+ private ApiClientDao apiClientDao;
+ @Autowired
+ private SourceTypeDao sourceTypeDao;
+ @Autowired
+ private PaytypeConfigDao paytypeConfigDao;
+
+ @Override
+ public PageResult<TSyspara> getSysparaPage(Integer paraid, String paraname, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("paraid"));
+ Page<TSyspara> page = sysparaDao.findAll(new Specification<TSyspara>() {
+ @Override
+ public Predicate toPredicate(Root<TSyspara> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+ List<Predicate> predicates = new ArrayList<>();
+ if (null != paraid) {
+ predicates.add(criteriaBuilder.equal(root.get("paraid").as(Integer.class), paraid));
+ }
+ if (!StringUtil.isEmpty(paraname)) {
+ predicates.add(criteriaBuilder.like(root.get("paraname").as(String.class), "%" + paraname.trim() + "%"));
+ }
+ predicates.add(criteriaBuilder.equal(root.get("displayflag").as(String.class), ConstantUtil.ENABLE_YES));
+ return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+ }
+ }, pageable);
+ return new PageResult<>(page);
+ }
+
+ @Override
+ public TSyspara getSysparaByParaid(int paraid) {
+ return sysparaDao.findByParaid(paraid);
+ }
+
+ @Override
+ public boolean updateSyspara(TSyspara syspara) {
+ if (null != syspara) {
+ sysparaDao.save(syspara);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public PageResult<TBusinesspara> getBusinessparaPage(String paraname, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("parakey"));
+ if (!StringUtil.isEmpty(paraname)) {
+ return new PageResult<>(businessparaDao.findAllByParakeyContaining(paraname.trim(), pageable));
+ }
+ return new PageResult<>(businessparaDao.findAll(pageable));
+ }
+
+ @Override
+ public TBusinesspara getBusinessparaByParakey(String parakey) {
+ if (!StringUtil.isEmpty(parakey)) {
+ return businessparaDao.findByParakey(parakey.trim());
+ }
+ return null;
+ }
+
+ @Override
+ public boolean deleteBusinesspara(TBusinesspara businesspara) {
+ if (null != businesspara) {
+ businessparaDao.delete(businesspara);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean saveOrUpdateBusinesspara(TBusinesspara businesspara) {
+ if (null != businesspara) {
+ businesspara.setTenantId(TenantContext.getTenantSchema());
+ businessparaDao.save(businesspara);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public PageResult<TApiClient> getApiClientparaPage(String appid, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("appid"));
+ if (!StringUtil.isEmpty(appid)) {
+ return new PageResult<>(apiClientDao.findByAppidContaining(appid.trim(), pageable));
+ }
+ return new PageResult<>(apiClientDao.findAll(pageable));
+ }
+
+ @Override
+ public TApiClient getApiClientByAppid(String appid) {
+ if (!StringUtil.isEmpty(appid)) {
+ return apiClientDao.findByAppid(appid.trim());
+ }
+ return null;
+ }
+
+ @Override
+ public boolean saveOrUpdateApiClient(TApiClient apiClient) {
+ if (null != apiClient) {
+ apiClientDao.save(apiClient);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean deleteApiClient(TApiClient apiClient) {
+ if (null != apiClient) {
+ apiClientDao.delete(apiClient);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public PageResult<TSourceType> getSourceTypePage(String paytype, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("sourceType"));
+ if (!StringUtil.isEmpty(paytype)) {
+ return new PageResult<>(sourceTypeDao.findBySourceTypeContaining(paytype.trim(), pageable));
+ }
+ return new PageResult<>(sourceTypeDao.findAll(pageable));
+ }
+
+ @Override
+ @Cacheable(cacheNames = "source_type_cache", key = "#p0")
+ public TSourceType getSourceType(String paytype) {
+ if (!StringUtil.isEmpty(paytype)) {
+ return sourceTypeDao.getBySourceType(paytype.trim());
+ }
+ return null;
+ }
+
+ @Override
+ @Cacheable(cacheNames = "source_type_cache")
+ public List<TSourceType> getAllSourceType() {
+ return sourceTypeDao.findAll();
+ }
+
+ @Override
+ @CacheEvict(cacheNames = "source_type_cache", key = "#paytype.sourceType")
+ public boolean saveOrUpdateSourceType(TSourceType paytype) {
+ if (null != paytype) {
+ paytype.setTenantid(TenantContext.getTenantSchema());
+ sourceTypeDao.save(paytype);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ @CacheEvict(cacheNames = "source_type_cache", key = "#paytype.sourceType")
+ public boolean deleteSourceType(TSourceType paytype) {
+ if (null != paytype) {
+ sourceTypeDao.delete(paytype);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ @Cacheable(cacheNames = "source_type_config_cache", key = "#p0")
+ public List<TPaytypeConfig> getSourceTypeConfigList(String paytype) {
+ if (!StringUtil.isEmpty(paytype)) {
+ List<TPaytypeConfig> list = paytypeConfigDao.getByPaytypeOrderByConfigid(paytype.trim());
+ if (!StringUtil.isEmpty(list))
+ return list;
+ }
+ return new ArrayList<>(0);
+ }
+
+ @Override
+ @CacheEvict(cacheNames = "source_type_config_cache", key = "#p0")
+ public boolean saveSourceTypeConfig(String paytype, Map<String, String> param) throws WebCheckException {
+ TSourceType tPaytype = getSourceType(paytype);
+ if (null == tPaytype) throw new WebCheckException("支付能力[" + paytype + "]不存在");
+ for (String key : param.keySet()) {
+ String value = param.get(key);
+ TPaytypeConfig config = paytypeConfigDao.getByPaytypeAndAndConfigid(tPaytype.getSourceType(), key);
+ if (null == config)
+ throw new WebCheckException("支付能力[" + tPaytype.getSourceType() + "]不存在配置项[" + key + "],请重新查询");
+ config.setConfigValue(StringUtil.isEmpty(value) ? null : value.trim());
+ paytypeConfigDao.save(config);
+ }
+ return true;
+ }
+
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
new file mode 100644
index 0000000..3d83ae5
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
@@ -0,0 +1,193 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.dao.*;
+import com.supwisdom.dlpay.framework.data.NodeData;
+import com.supwisdom.dlpay.framework.domain.TPermission;
+import com.supwisdom.dlpay.framework.domain.TResource;
+import com.supwisdom.dlpay.framework.domain.TRole;
+import com.supwisdom.dlpay.framework.domain.TRoleFunction;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import com.supwisdom.dlpay.system.service.RoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class RoleServiceImpl implements RoleService {
+ @Autowired
+ private RoleDao roleDao;
+
+ @Autowired
+ private ResourceDao resourceDao;
+
+ @Autowired
+ private RoleFunctionDao roleFunctionDao;
+
+ @Autowired
+ private PermissionDao permissionDao;
+ @Autowired
+ private OperRoleDao operRoleDao;
+
+
+ @Override
+ public List<TRole> findAllRoles() {
+ List<TRole> list = roleDao.getAllRoles();
+ if (!StringUtil.isEmpty(list)) return list;
+ return new ArrayList<>(0);
+ }
+
+ @Override
+ public TRole findRoleByRoleid(String roleid) {
+ Optional<TRole> role = roleDao.findById(roleid);
+ if (role.isPresent()) {
+ return role.get();
+ }
+ return null;
+ }
+
+ @Override
+ public TResource findResourceByURI(String uri) {
+ return resourceDao.findByUri(uri);
+ }
+
+ @Override
+ public TRoleFunction findRoleFunctionByRoleIdAndFunctionId(String roleid, Integer functionid) {
+ return roleFunctionDao.findByRoleIdAndFunctionId(roleid, functionid);
+ }
+
+ @Override
+ public PageResult<TRole> getRolesByKey(FunctionSearchBean param) {
+ Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+ , Sort.by("createtime"));
+ if (!StringUtil.isEmpty(param.getFunctioname())) {
+ return new PageResult<>(roleDao.findAllByRoleNameContaining(param.getFunctioname(), pageable));
+ }
+ return new PageResult<>(roleDao.findAll(pageable));
+ }
+
+ @Override
+ public JsonResult saveRole(TRole role) {
+ if (!StringUtil.isEmpty(role.getRoleId())) {
+ TRole temp = roleDao.findByRoleNameAndRoleIdNot(role.getRoleName(), role.getRoleId());
+ if (temp != null) {
+ return JsonResult.error("角色名称已存在");
+ }
+ Optional<TRole> opt = roleDao.findById(role.getRoleId());
+ if (opt == null || !opt.isPresent()) {
+ return JsonResult.error("角色已被删除");
+ }
+ temp = opt.get();
+ temp.setRoleName(role.getRoleName());
+ temp.setRoleDesc(role.getRoleDesc());
+// temp.setRoleCode(role.getRoleCode());
+ temp.setLastsaved(DateUtil.getNow());
+ temp.setTenantId(TenantContext.getTenantSchema());
+ roleDao.save(temp);
+ } else {
+ TRole temp = roleDao.findByRoleName(role.getRoleName());
+ if (temp != null) {
+ return JsonResult.error("角色名称已存在");
+ }
+
+ role.setCreatetime(DateUtil.getNow());
+ role.setEditflag(1);
+ role.setRoleCode("ROLE_ADMIN");
+ role.setTenantId(TenantContext.getTenantSchema());
+ roleDao.save(role);
+ }
+ return JsonResult.ok("成功");
+ }
+
+ @Override
+ public List<TRoleFunction> getRoleFuncByRoleid(String roleId) {
+ return roleFunctionDao.findByRoleId(roleId);
+ }
+
+
+ @Override
+ public TPermission findByRoleIdAndResid(String roleFuncId, Integer resid) {
+ return permissionDao.findByRoleIdAndResid(roleFuncId, resid);
+ }
+
+ @Override
+ public JsonResult saveRoleFuncId(String roleId, String funcs) {
+ Optional<TRole> ret = roleDao.findById(roleId);
+ if (ret == null || !ret.isPresent()) {
+ return JsonResult.error("角色不存在");
+ }
+ roleFunctionDao.deleteByRoleId(roleId);
+ permissionDao.deleteByRoleId(roleId);
+ String[] datas = funcs.split(",");
+ for (String func : datas) {
+ if (func.contains("_res")) {
+ String id = func.replace("_res", "");
+ TPermission permission = new TPermission();
+ permission.setResid(Integer.valueOf(id));
+ permission.setRoleId(roleId);
+ permission.setTenantId(TenantContext.getTenantSchema());
+ permissionDao.save(permission);
+ } else {
+ if("-1".equals(func)) continue; //全选排除
+ TRoleFunction roleFunction = new TRoleFunction();
+ roleFunction.setFunctionId(Integer.valueOf(func));
+ roleFunction.setRoleId(roleId);
+ roleFunction.setTenantId(TenantContext.getTenantSchema());
+ roleFunctionDao.save(roleFunction);
+ }
+ }
+ return JsonResult.ok("成功");
+ }
+
+ @Override
+ public List<ZTreeNode> findByRoleIdNative(String roleId) {
+ List<NodeData> nodeData = roleFunctionDao.findByRoleIdNative(roleId);
+ List<ZTreeNode> ret = new ArrayList<>();
+ boolean allChecked = true;
+ for (NodeData data : nodeData) {
+ ZTreeNode zTreeNode = new ZTreeNode();
+ zTreeNode.setpId(data.getPid());
+ zTreeNode.setId(data.getId());
+ zTreeNode.setName(data.getName());
+ zTreeNode.setChecked(data.getChecked() == 0 ? false : true);
+ if (allChecked && !zTreeNode.isChecked()) allChecked = false;
+ zTreeNode.setOpen(data.getOpen() == 0 ? false : true);
+ ret.add(zTreeNode);
+ }
+ ZTreeNode root = new ZTreeNode();
+ root.setId("-1");
+ root.setpId("-99");
+ root.setName("选择全部功能");
+ root.setChecked(allChecked);
+ root.setOpen(true);
+ ret.add(root);
+ return ret;
+ }
+
+ @Override
+ public JsonResult deleteRole(String roleid) {
+ Optional<TRole> ret = roleDao.findById(roleid);
+ if (ret == null || !ret.isPresent()) {
+ return JsonResult.error("角色不存在");
+ }
+ if (ret.get().getEditflag() != 1) {
+ return JsonResult.error("该角色不能删除");
+ }
+ permissionDao.deleteByRoleId(roleid);
+ roleFunctionDao.deleteByRoleId(roleid);
+ operRoleDao.deleteByRoleId(roleid);
+ roleDao.deleteById(roleid);
+ return JsonResult.ok("成功");
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SettleReportServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SettleReportServiceImpl.java
new file mode 100644
index 0000000..dc1128f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SettleReportServiceImpl.java
@@ -0,0 +1,252 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.framework.dao.*;
+import com.supwisdom.dlpay.framework.domain.TSettlectl;
+import com.supwisdom.dlpay.framework.domain.TShop;
+import com.supwisdom.dlpay.framework.domain.TSubject;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.MoneyUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.bean.*;
+import com.supwisdom.dlpay.system.service.SettleReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class SettleReportServiceImpl implements SettleReportService {
+ @Autowired
+ private SubjectdayDao subjectdayDao;
+ @Autowired
+ private SettleCtlDao settleCtlDao;
+ @Autowired
+ private VoucherDao voucherDao;
+ @Autowired
+ private SubjectDao subjectDao;
+ @Autowired
+ private ShopDao shopDao;
+
+ @Override
+ public String getSystemSettledate() {
+ TSettlectl settlectl = settleCtlDao.getOne(1);
+ if (null != settlectl && null != settlectl.getSettledate()) {
+ return settlectl.getSettledate().toString();
+ }
+ return DateUtil.getNow("yyyyMMdd");
+ }
+
+ @Override
+ public PageResult<SubjectDayShowBean> getSubjectDayInfos(String startdate, String enddate, boolean nodealshow) {
+ List<SubjectDayInfo> list = subjectdayDao.getAllTSubjectday(startdate, enddate);
+ if (StringUtil.isEmpty(list)) {
+ return new PageResult<>(99, "无数据");
+ }
+
+ List<SubjectDayShowBean> result = new ArrayList<>(0);
+ for (SubjectDayInfo info : list) {
+ SubjectDayShowBean bean = new SubjectDayShowBean();
+ bean.setSubjno(info.getSubjno());
+ bean.setSubjname(info.getSubjname());
+ bean.setFsubjno(info.getFsubjno() == null ? "-1" : info.getFsubjno());
+ bean.setSubjlevel(info.getSubjlevel());
+ bean.setDisplayflag(info.getDisplayflag());
+ bean.setLastdaydrbal(info.getLastdaydrbal() == null ? 0.00 : info.getLastdaydrbal());
+ bean.setLastdaycrbal(info.getLastdaycrbal() == null ? 0.00 : info.getLastdaycrbal());
+ bean.setDramt(info.getDramt() == null ? 0.00 : info.getDramt());
+ bean.setCramt(info.getCramt() == null ? 0.00 : info.getCramt());
+ bean.setDrbal(info.getDrbal() == null ? 0.00 : info.getDrbal());
+ bean.setCrbal(info.getCrbal() == null ? 0.00 : info.getCrbal());
+ if (bean.getLastdaydrbal() == 0 && bean.getLastdaycrbal() == 0 && bean.getDramt() == 0 && bean.getCramt() == 0 && bean.getDrbal() == 0 && bean.getCrbal() == 0) {
+ //无交易记录
+ if (nodealshow && "y".equals(bean.getDisplayflag())) {
+ result.add(bean); //显示
+ } else {
+ continue;
+ }
+ } else {
+ result.add(bean);
+ }
+ }
+ return new PageResult<SubjectDayShowBean>(result);
+ }
+
+ @Override
+ public PageResult<SubjectDetailShowBean> getSubjectDetailInfos(String startdate, String enddate, String subjno, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize);
+ Page<SubjectDetailShowBean> page = voucherDao.getSubjectDetailInfos(Integer.valueOf(startdate), Integer.valueOf(enddate), subjno, pageable);
+ return new PageResult<>(page);
+ }
+
+ @Override
+ public List<TreeSelectNode> getSystemShowSubjectTree() {
+ List<TSubject> list = subjectDao.findAllDisplaySubjects();
+ List<TreeSelectNode> result = new ArrayList<>(0);
+ if (!StringUtil.isEmpty(list)) {
+ for (TSubject subject : list) {
+ if (subject.getSubjlevel() == 1) {
+ TreeSelectNode node = new TreeSelectNode();
+ node.setId(subject.getSubjno());
+ node.setName(subject.getSubjname());
+ node.setOpen(subject.getEndflag() == 0);
+ node.setChecked(false);
+ node.setChildren(null);
+ node.setAccno(subject.getEndflag().toString());
+ if (subject.getEndflag() == 0) {
+ node.setChildren(getSubjectSelectTree(list, subject.getSubjno())); //下级科目
+ }
+ result.add(node);
+ }
+ }
+ }
+ return result;
+ }
+
+ private List<TreeSelectNode> getSubjectSelectTree(List<TSubject> subjectList, String fsubjno) {
+ List<TreeSelectNode> result = null;
+ for (TSubject subject : subjectList) {
+ if (fsubjno.equals(subject.getFsubjno())) {
+ TreeSelectNode node = new TreeSelectNode();
+ node.setId(subject.getSubjno());
+ node.setName(subject.getSubjname());
+ node.setOpen(subject.getEndflag() == 0);
+ node.setChecked(false);
+ List<TreeSelectNode> children = null;
+ if (subject.getEndflag() == 0) {
+ children = getSubjectSelectTree(subjectList, subject.getSubjno());
+ }
+ node.setChildren(children);
+ node.setAccno(subject.getEndflag().toString());
+ if (null == result) result = new ArrayList<>(0); //初始化
+ result.add(node);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public List<TreeSelectNode> getSystemNormalShopTree() {
+ List<TShop> shopList = shopDao.getNormalShops();
+ return getShopSelectTree(shopList, 0);
+ }
+
+ private List<TreeSelectNode> getShopSelectTree(List<TShop> shopList, int fshopid) {
+ List<TreeSelectNode> result = new ArrayList<>(0);
+ if (!StringUtil.isEmpty(shopList)) {
+ for (TShop shop : shopList) {
+ if (fshopid == shop.getFshopid()) {
+ TreeSelectNode node = new TreeSelectNode();
+ node.setId(shop.getShopid().toString());
+ node.setName(shop.getShopname());
+ node.setOpen(shop.getShoptype() == 0);
+ node.setChecked(false);
+ node.setAccno(shop.getShopaccno() == null ? "" : shop.getShopaccno());
+ node.setpId(String.valueOf(fshopid));
+ List<TreeSelectNode> children = getShopSelectTree(shopList, shop.getShopid());
+ node.setChildren(StringUtil.isEmpty(children) ? null : children);
+ result.add(node);
+ }
+ }
+ }
+ return result;
+ }
+
+ private List<TShop> getShopBusinessSelectShops(List<TShop> shopList, String shopid) {
+ if (StringUtil.isEmpty(shopid)) return shopList;
+
+ int select_shopid = Integer.parseInt(shopid); //单选
+ List<TShop> result = new ArrayList<>(0);
+ for (TShop shop : shopList) {
+ if (select_shopid == shop.getShopid()) {
+ result.add(shop);
+ break;
+ }
+ }
+ if (StringUtil.isEmpty(result)) return result; //shopid 不存在
+ result.addAll(getChildrenShopByShopid(shopList, select_shopid)); //子商户
+ return result;
+ }
+
+ private List<TShop> getChildrenShopByShopid(List<TShop> shopList, int fshopid) {
+ List<TShop> result = new ArrayList<>(0);
+ for (TShop shop : shopList) {
+ if (fshopid == shop.getFshopid()) {
+ result.add(shop);
+ result.addAll(getChildrenShopByShopid(shopList, shop.getShopid()));
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public PageResult<ShopBusinessShowBean> getShopBusinessShowInfos(String startdate, String enddate, String shopid, boolean nodealshow) {
+ List<ShopBusinessInfo> businessInfos = voucherDao.getShopBusinessInfos(Integer.valueOf(startdate), Integer.valueOf(enddate));
+ if (StringUtil.isEmpty(businessInfos) && !nodealshow) {
+ return new PageResult<>(99, "无数据"); //无交易记录
+ }
+ List<TShop> shopAllList = shopDao.getNormalShops();
+ List<ShopBusinessShowBean> result = new ArrayList<>(0);
+ List<TShop> shopList = getShopBusinessSelectShops(shopAllList, shopid);
+ for (TShop shop : shopList) {
+ ShopBusinessShowBean bean = new ShopBusinessShowBean();
+ bean.setShopid(shop.getShopid().toString());
+ bean.setShopname(shop.getShopname());
+ bean.setFshopid(shop.getFshopid() == null ? "0" : shop.getFshopid().toString());
+ bean.setShopaccno(shop.getShopaccno() == null ? "" : shop.getShopaccno());
+ bean.setSummary("");
+ if (StringUtil.isEmpty(shop.getShopaccno())) {
+ //商户组,计算该组下所有的交易额
+ long transcnt = 0;
+ double transamt = 0;
+ List<TShop> childrenShops = getChildrenShopByShopid(shopAllList,shop.getShopid().intValue()); //子商户列表
+ for (TShop child : childrenShops) {
+ if(!StringUtil.isEmpty(child.getShopaccno())){
+ for(ShopBusinessInfo info:businessInfos){
+ if(child.getShopaccno().equals(info.getShopaccno())){
+ transcnt += info.getTranscnt();
+ transamt += (info.getCramt() - info.getDramt());
+ }
+ }
+ }
+ }
+ bean.setTranscnt(transcnt);
+ bean.setTransamt(MoneyUtil.formatYuan(transamt));
+ } else {
+ //末级商户
+ long transcnt = 0;
+ double transamt = 0;
+ for (ShopBusinessInfo info : businessInfos) {
+ if (shop.getShopaccno().equals(info.getShopaccno())) {
+ transcnt += info.getTranscnt();
+ transamt += (info.getCramt() - info.getDramt());
+
+ ShopBusinessShowBean temp = new ShopBusinessShowBean();
+ temp.setShopid(info.getShopaccno());
+ temp.setShopname("");
+ temp.setFshopid(shop.getShopid().toString());
+ temp.setShopaccno(info.getShopaccno());
+ temp.setSummary(info.getSummary());
+ temp.setTranscnt(info.getTranscnt());
+ temp.setTransamt(info.getCramt() - info.getDramt());
+ result.add(temp);
+ }
+ }
+
+ bean.setTranscnt(transcnt);
+ bean.setTransamt(MoneyUtil.formatYuan(transamt));
+ }
+
+ if (bean.getTranscnt() == 0 && MoneyUtil.moneyEqual(bean.getTransamt(), 0)) {
+ if (nodealshow) result.add(bean); //显示未交易商户
+ } else {
+ result.add(bean);
+ }
+ }
+ return new PageResult<>(result);
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java
new file mode 100644
index 0000000..88d4deb
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java
@@ -0,0 +1,274 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.dao.PaytypeConfigDao;
+import com.supwisdom.dlpay.api.dao.SourceTypeDao;
+import com.supwisdom.dlpay.api.dao.ShopPaytypeConfigDao;
+import com.supwisdom.dlpay.api.dao.ShopPaytypeDao;
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.api.domain.TShopPaytype;
+import com.supwisdom.dlpay.api.domain.TShopPaytypeConfig;
+import com.supwisdom.dlpay.framework.dao.ShopDao;
+import com.supwisdom.dlpay.framework.dao.ShopaccDao;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.domain.TShop;
+import com.supwisdom.dlpay.framework.domain.TShopacc;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.Subject;
+import com.supwisdom.dlpay.framework.util.TradeDict;
+import com.supwisdom.dlpay.system.bean.ShopConfigBean;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import com.supwisdom.dlpay.system.service.ShopDataService;
+import com.supwisdom.dlpay.util.ConstantUtil;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+import org.springframework.data.jpa.domain.Specification;
+
+import javax.persistence.criteria.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class ShopDataServiceImpl implements ShopDataService {
+ @Autowired
+ private ShopDao shopDao;
+ @Autowired
+ private ShopaccDao shopaccDao;
+ @Autowired
+ private ShopPaytypeDao shopPaytypeDao;
+ @Autowired
+ private SystemUtilService systemUtilService;
+ @Autowired
+ private SourceTypeDao paytypeDao;
+ @Autowired
+ private PaytypeConfigDao paytypeConfigDao;
+ @Autowired
+ private ShopPaytypeConfigDao shopPaytypeConfigDao;
+
+ @Override
+ public List<ZTreeNode> getAllShopNodes() {
+ List<ZTreeNode> result = new ArrayList<>(0);
+ List<TShop> shoplist = shopDao.getNormalShops();
+ if (!StringUtil.isEmpty(shoplist)) {
+ for (TShop shop : shoplist) {
+ if (null == shop || !TradeDict.STATUS_NORMAL.equals(shop.getStatus())) continue; //跳过注销商户
+ ZTreeNode node = new ZTreeNode();
+ node.setId(shop.getShopid().toString());
+ node.setName(shop.getShopid() + "_" + shop.getShopname());
+ node.setpId(shop.getFshopid() == null ? "" : shop.getFshopid().toString());
+ node.setChecked(false);
+ node.setOpen(true);
+ node.setShoptype(shop.getShoptype());
+ node.setShopaccno(StringUtil.isEmpty(shop.getShopaccno()) ? "" : shop.getShopaccno());
+ node.setIconSkin(shop.getShoptype() == 0 ? "pIcon01" : "pIcon02");
+ result.add(node);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public TShop getShopByShopid(Integer shopid) {
+ if (null != shopid) {
+ return shopDao.getTShopByShopid(shopid);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean deleteShop(TShop shop) throws WebCheckException {
+ if (null != shop) {
+ List<TShop> childShops = shopDao.getChildShopsByShopid(shop.getShopid());
+ if (!StringUtil.isEmpty(childShops))
+ throw new WebCheckException("请先删除下级商户");
+ shop.setStatus(TradeDict.STATUS_CLOSED);
+ shop.setClosedate(systemUtilService.getSysdatetime().getHostdate());
+ shopDao.save(shop);
+ if (!StringUtil.isEmpty(shop.getShopaccno())) {
+ TShopacc shopacc = shopaccDao.getByShopaccno(shop.getShopaccno());
+ if (null == shopacc) throw new WebCheckException("数据异常!对应的商户账户不存在!");
+ shopacc.setStatus(TradeDict.STATUS_CLOSED);
+ shopacc.setClosedate(shop.getClosedate());
+ shopaccDao.save(shopacc);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean saveOrUpdateShop(TShop shop) throws WebCheckException {
+ if (shop.getFshopid() != 0) {
+ TShop fshop = shopDao.getTShopByShopid(shop.getFshopid());
+ if (null == fshop) {
+ throw new WebCheckException("上级商户不存在!");
+ } else if (fshop.getShoptype() == 1) {
+ throw new WebCheckException("上级商户不是商户组!");
+ }
+ }
+ if (shopDao.checkShopnameExist(shop.getShopname(), shop.getFshopid(), shop.getShopid() == null ? 0 : shop.getShopid()) > 0) {
+ throw new WebCheckException("商户名称在同级下已经存在!");
+ }
+ if (null != shop.getShopid() && shop.getShopid() > 0) {
+ //修改
+ shopDao.save(shop);
+ if (!StringUtil.isEmpty(shop.getShopaccno())) {
+ shopaccDao.updateShopnameByShopaccno(shop.getShopname(), shop.getShopaccno()); //更新商户名
+ }
+ return true;
+ } else {
+ //新增
+ SystemDateTime dt = systemUtilService.getSysdatetime();
+ shop.setOpendate(dt.getHostdate());
+ shop.setTenantId(TenantContext.getTenantSchema());
+ shopDao.save(shop);
+ if (shop.getShoptype() == 1) {
+ TShopacc shopacc = new TShopacc();
+ shopacc.setShopaccno(String.format("2%09d", shop.getShopid()));
+ shopacc.setShopid(shop.getShopid());
+ shopacc.setShopname(shop.getShopname());
+ shopacc.setSubjno(Subject.SUBJNO_MACHANT_INCOME);
+ shopacc.setStatus(TradeDict.STATUS_NORMAL);
+ shopacc.setOpendate(dt.getHostdate());
+ shopacc.setBalance(0D);
+ shopacc.setTenantId(shop.getTenantId());
+ shopaccDao.save(shopacc);
+
+ shop.setShopaccno(shopacc.getShopaccno());
+ shopDao.save(shop);
+
+// TShopPaytype shopPaytype = new TShopPaytype();
+// shopPaytype.setShopaccno(shopacc.getShopaccno());
+// shopPaytype.setPaytype(TradeDict.PAYTYPE_BALANCE);
+// shopPaytype.setConsumeEnable(true);
+// shopPaytype.setAnonymousEnable(false);
+// shopPaytype.setReverseEnable(false);
+// shopPaytype.setCreatetime(dt.getHostdatetime());
+// shopPaytypeDao.save(shopPaytype); //默认增加余额支付方式
+ }
+ return true;
+ }
+ }
+
+ @Override
+ public PageResult<ShopConfigBean> getShopPaytypeInfos(String shopaccno, String paytype, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("shopaccno", "paytype"));
+
+ Page<TShopPaytype> page = shopPaytypeDao.findAll(new Specification<TShopPaytype>() {
+ @Override
+ public Predicate toPredicate(Root<TShopPaytype> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+ List<Predicate> predicates = new ArrayList<>();
+ if (!StringUtil.isEmpty(shopaccno)) {
+ predicates.add(criteriaBuilder.equal(root.get("shopaccno").as(String.class), shopaccno.trim()));
+ }
+ if (!StringUtil.isEmpty(paytype)) {
+ predicates.add(criteriaBuilder.equal(root.get("paytype").as(String.class), paytype.trim()));
+ }
+ return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+ }
+ }, pageable);
+
+ if (null == page || page.getTotalElements() == 0) {
+ return new PageResult<>(99, "无数据");
+ }
+ List<ShopConfigBean> list = new ArrayList<>(0);
+ for (TShopPaytype pt : page.getContent()) {
+ ShopConfigBean bean = new ShopConfigBean();
+ bean.setShopaccno(pt.getShopaccno());
+ TShopacc shopacc = shopaccDao.getByShopaccno(pt.getShopaccno());
+ bean.setShopname(shopacc == null ? "" : shopacc.getShopname());
+ bean.setPaytype(pt.getPaytype());
+ TSourceType tPaytype = paytypeDao.getBySourceType(pt.getPaytype());
+ bean.setPaydesc(tPaytype == null ? "" : tPaytype.getPaydesc());
+ bean.setConsumeEnable(pt.getConsumeEnable());
+ bean.setAnonymousEnable(pt.getAnonymousEnable());
+ bean.setReverseEnable(pt.getReverseEnable());
+ list.add(bean);
+ }
+ return new PageResult<>(page.getTotalElements(), list);
+ }
+
+ @Override
+ public TShopPaytype getShopPaytype(String shopaccno, String paytype) {
+ return shopPaytypeDao.getById(paytype, shopaccno);
+ }
+
+ @Override
+ public TShopacc getShopaccByAccno(String shopaccno) {
+ if (!StringUtil.isEmpty(shopaccno)) {
+ return shopaccDao.getByShopaccno(shopaccno.trim());
+ }
+ return null;
+ }
+
+ @Override
+ public boolean saveOrUpdateShopPaytype(TShopPaytype shopPaytype) {
+ if (null != shopPaytype) {
+ shopPaytype.setTenantid(TenantContext.getTenantSchema());
+ shopPaytypeDao.save(shopPaytype);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<TShopPaytypeConfig> getShopPaytypeConfigs(String shopaccno, String paytype) {
+ List<TShopPaytypeConfig> result = new ArrayList<>(0);
+ if (!StringUtil.isEmpty(paytype)) {
+ List<TPaytypeConfig> list = paytypeConfigDao.getByPaytypeOrderByConfigid(paytype.trim());
+ if (!StringUtil.isEmpty(list)) {
+ for (TPaytypeConfig pt : list) {
+ TShopPaytypeConfig spc = shopPaytypeConfigDao.getShopPaytypeConfigById(shopaccno, pt.getPaytype(), pt.getConfigid());
+ if (null == spc) {
+ spc = new TShopPaytypeConfig();
+ spc.setShopaccno(shopaccno);
+ spc.setPaytype(pt.getPaytype());
+ spc.setConfigid(pt.getConfigid());
+ spc.setConfigName(pt.getConfigName());
+ spc.setConfigValue(null);
+ }
+ result.add(spc);
+ }
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public boolean saveOrUpdateShopPaytypeConfig(String shopaccno, String paytype, Map<String, String> param) throws WebCheckException {
+ TShopPaytype shopPaytype = getShopPaytype(shopaccno, paytype);
+ if (null == shopPaytype) {
+ throw new WebCheckException("此商户[" + shopaccno + "]还不具有该支付能力[" + paytype + "]");
+ }
+ for (String key : param.keySet()) {
+ String value = param.get(key);
+ TShopPaytypeConfig spc = shopPaytypeConfigDao.getShopPaytypeConfigById(shopPaytype.getShopaccno(), shopPaytype.getPaytype(), key);
+ if (null != spc) {
+ spc.setConfigValue(StringUtil.isEmpty(value) ? null : value.trim());
+ } else {
+ spc = new TShopPaytypeConfig();
+ spc.setShopaccno(shopPaytype.getShopaccno());
+ spc.setPaytype(shopPaytype.getPaytype());
+ spc.setConfigid(key);
+ spc.setConfigValue(StringUtil.isEmpty(value) ? null : value.trim());
+ TPaytypeConfig paytypeConfig = paytypeConfigDao.getByPaytypeAndAndConfigid(shopPaytype.getPaytype(), key);
+ if (null != paytypeConfig) {
+ spc.setConfigName(paytypeConfig.getConfigName());
+ }
+ }
+ spc.setTenantid(shopPaytype.getTenantid());
+ shopPaytypeConfigDao.save(spc);
+ }
+ return true;
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
new file mode 100644
index 0000000..1254d32
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
@@ -0,0 +1,181 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.dao.AccountDao;
+import com.supwisdom.dlpay.api.dao.PersonDao;
+import com.supwisdom.dlpay.api.dao.PersonIdentityDao;
+import com.supwisdom.dlpay.api.dao.PointsAccountDao;
+import com.supwisdom.dlpay.api.domain.TAccount;
+import com.supwisdom.dlpay.api.domain.TPerson;
+import com.supwisdom.dlpay.api.domain.TPersonIdentity;
+import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.*;
+import com.supwisdom.dlpay.system.bean.PersonParamBean;
+import com.supwisdom.dlpay.system.service.UserDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class UserDataServiceImpl implements UserDataService {
+ @Autowired
+ private PersonDao personDao;
+ @Autowired
+ private AccountDao accountDao;
+ @Autowired
+ private PointsAccountDao pointsAccountDao;
+ @Autowired
+ private SystemUtilService systemUtilService;
+ @Autowired
+ private PersonIdentityDao personIdentityDao;
+
+ @Override
+ public PageResult<TPerson> getPersonsByKey(PersonParamBean param) {
+ Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+ , Sort.by(Sort.Direction.DESC, "lastsaved"));
+ if (!StringUtil.isEmpty(param.getName())) {
+ return new PageResult<>(personDao.findAllByNameContaining(param.getName(), pageable));
+ }
+ return new PageResult<>(personDao.findAll(pageable));
+ }
+
+ @Override
+ public PageResult<TAccount> getAccountsByKey(PersonParamBean param) {
+ Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+ if (!StringUtil.isEmpty(param.getName())) {
+ return new PageResult<>(accountDao.findAllByAccnameContaining(param.getName(), pageable));
+ }
+ return new PageResult<>(accountDao.findAll(pageable));
+ }
+
+ @Override
+ public PageResult<TPointsAccount> getPointsByKey(PersonParamBean param) {
+ Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+ if (!StringUtil.isEmpty(param.getName())) {
+ return new PageResult<>(pointsAccountDao.findAllByNameContaining(param.getName(), pageable));
+ }
+ return new PageResult<>(pointsAccountDao.findAll(pageable));
+ }
+
+ @Override
+ public JsonResult saveUser(TPerson person) {
+ if (!StringUtil.isEmpty(person.getUserid())) {
+ Optional<TPerson> temp = personDao.findById(person.getUserid());
+ if (!temp.isPresent()) {
+ return JsonResult.error("参数错误");
+ }
+ TPerson it = temp.get();
+ if (!person.getIdno().equals(it.getIdno())
+ || !person.getIdtype().equals(it.getIdtype())) {
+ TPerson has = personDao.findByIdentity(person.getIdtype(), person.getIdno());
+ if (has != null && !has.getUserid().equals(person.getUserid())) {
+ return JsonResult.error("证件类型、证件号已存在");
+ }
+ }
+ if (!person.getName().equals(it.getName())) {
+ TAccount account = accountDao.findByUserid(person.getUserid());
+ if (account != null) {
+ account.setAccname(person.getName());
+ accountDao.save(account);
+ }
+ }
+ if (StringUtil.isEmpty(person.getStatus())) {
+ person.setStatus(TradeDict.STATUS_NORMAL);
+ }
+ person.setTenantid(TenantContext.getTenantSchema());
+ personDao.save(person);
+ } else {
+ TPerson has = personDao.findByIdentity(person.getIdtype(), person.getIdno());
+ if (has != null) {
+ return JsonResult.error("证件类型、证件号已存在");
+ }
+ SystemDateTime systemDateTime = systemUtilService.getSysdatetime();
+ person.setStatus(TradeDict.STATUS_NORMAL);
+ person.setLastsaved(systemDateTime.getHostdatetime());
+ person.setTenantid(TenantContext.getTenantSchema());
+ person = personDao.save(person);
+
+ TAccount account = new TAccount();
+ account.setAccname(person.getName());
+ account.setSubjno(Subject.SUBJNO_PERSONAL_DEPOSIT);
+ account.setUserid(person.getUserid());
+ account.setTransStatus(person.getStatus());
+ account.setBalance(0.0);
+ account.setAvailbal(0.0);
+ account.setFrozebal(0.0);
+ account.setLowfreeFlag(false);
+ account.setMaxbal(systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT));
+ account.setLastdayDpsamt(0.0);
+ account.setLastdayTransamt(0.0);
+ account.setOpendate(systemDateTime.getHostdate());
+ account.setTac(account.generateTac());
+ account.setTenantid(person.getTenantid());
+ accountDao.save(account);
+ }
+ return JsonResult.ok("添加成功");
+ }
+
+ @Override
+ public JsonResult deleteUser(String userid) {
+ TAccount account = accountDao.findByUserid(userid);
+ if (account != null) {
+ if (!TradeDict.STATUS_CLOSED.equals(account.getTransStatus()) && account.getBalance() != 0) {
+ return JsonResult.error("该用户账户未注销且余额不为0,无法删除");
+ } else {
+ accountDao.delete(account);
+ }
+ }
+ TPointsAccount pointsAccount = pointsAccountDao.findByUserid(userid);
+ if (pointsAccount != null) {
+ if (pointsAccount.getPoints() != 0) {
+ return JsonResult.error("该用户账户积分不为0,无法删除,若要删除请先删除积分账户");
+ } else {
+ pointsAccountDao.delete(pointsAccount);
+ }
+ }
+ personDao.deleteById(userid);
+ return JsonResult.ok("操作成功");
+ }
+
+ @Override
+ public JsonResult closeAccount(String accno) {
+ Optional<TAccount> opt = accountDao.findById(accno);
+ if (opt.isPresent()) {
+ TAccount acc = opt.get();
+ acc.setTransStatus(TradeDict.STATUS_CLOSED);
+ accountDao.save(acc);
+ return JsonResult.ok("操作成功");
+ } else {
+ return JsonResult.error("参数错误");
+ }
+ }
+
+ @Override
+ public JsonResult deletePoint(String userid) {
+ Optional<TPointsAccount> pointsAccount = pointsAccountDao.findById(userid);
+ if (pointsAccount.isPresent()) {
+ pointsAccountDao.delete(pointsAccount.get());
+ return JsonResult.ok("操作成功");
+ } else {
+ return JsonResult.error("参数错误");
+ }
+ }
+
+ @Override
+ public List<TPersonIdentity> getPersonIdentity(String userid) {
+ return null;
+ }
+
+ @Override
+ public PageResult<TPointsAccount> getUserPointDTL(PersonParamBean param) {
+ return null;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/Code.java b/payapi/src/main/java/com/supwisdom/dlpay/util/Code.java
new file mode 100644
index 0000000..8f05ecd
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/Code.java
@@ -0,0 +1,39 @@
+package com.supwisdom.dlpay.util;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public enum Code {
+ SUCCESS("0","OK"),
+ PARAM_ERROR("1","参数错误"),
+ SYS_ERROR("2","系统异常"),
+ PAYTYPE_NOT_SUPPORT("10","支付方式不支持"),
+ PAYTYPE_CONFIG_ERROR("11","支付方式未配置或配置错误"),
+ REQUEST_ERROR("20","响应内容错误"),
+ RESPNOSE_CONTENT_ERROR("21","响应内容错误")
+ ;
+
+ private String code;
+ private String retmsg;
+
+ private Code(String code,String retmsg){
+ this.code = code;
+ this.retmsg = retmsg;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getRetmsg() {
+ return retmsg;
+ }
+
+ public void setRetmsg(String retmsg) {
+ this.retmsg = retmsg;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
new file mode 100644
index 0000000..6f56ce7
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
@@ -0,0 +1,43 @@
+package com.supwisdom.dlpay.util;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public class ConstantUtil {
+
+ public static final String ENABLE_YES = "yes";
+ public static final String ENABLE_NO = "no";
+
+ public static final String SEX_MALE = "male";
+ public static final String SEX_FEMALE = "female";
+
+ public static final String IDTYPE_IDENTITY = "1"; //身份证
+ public static final String IDTYPE_PASSPORT = "2"; //护照
+ public static final String IDTYPE_DRIVING_LICENSE = "3"; //驾照
+ public static final String IDTYPE_HKM_PASS = "4"; //港澳通行证
+ public static final String IDTYPE_STUEMPNO = "5"; //学工号
+ public static final String IDTYPE_OTHER = "9"; //其他
+ public static final String[] IDTYPE_DICTS = {"1", "2", "3", "4", "5", "9"}; //联动
+
+ public static final int SHOPTYPE_GROUP = 0; //商户组
+ public static final int SHOPTYPE_LEAF = 1; //末级商户,独立核算商户
+
+ public static final String FEETYPE_DEFAULT = "none";
+ public static final String FEETYPE_MEALER = "mealer";
+ public static final String FEETYPE_DISCOUNT = "discount";
+ public static final String[] FEETYPE_DICTS = {"none", "mealer", "discount"}; //联动
+
+
+ /**
+ * TDictionary的dicttype
+ * */
+ public static final int DICTTYPE_NO1 = 1; //冲正状态字典
+ public static final int DICTTYPE_NO2 = 2; //流水状态字典
+
+ /*
+ * 页面ID
+ * */
+
+ public static final String PAGE_USERXIEYI = "xieyi";//用户协议页面
+ public static final String PAGE_BANKXIEYI = "bankxieyi";//银行协议页面
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/DESedeUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/DESedeUtil.java
new file mode 100644
index 0000000..0d0e4cf
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/DESedeUtil.java
@@ -0,0 +1,107 @@
+package com.supwisdom.dlpay.util;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang.StringUtils;
+
+import javax.crypto.*;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * 加密/解密工具类
+ */
+public class DESedeUtil {
+ /**
+ * 加密工具类唯一实例
+ */
+ private static DESedeUtil instance = null;
+ /**
+ *
+ */
+ private Cipher cipher;
+ /**
+ *
+ */
+ private SecretKey secretKey;
+ /**
+ *
+ */
+ private IvParameterSpec ivSpec;
+
+ /**
+ * 初始化、创建密钥数据
+ *
+ * @throws NoSuchPaddingException
+ * @throws NoSuchAlgorithmException
+ */
+ private DESedeUtil(String deskey) throws NoSuchAlgorithmException, NoSuchPaddingException {
+ byte[] keyData = Base64.decodeBase64(deskey);
+ String fullAlg = "DESede/CBC/PKCS5Padding";
+ cipher = Cipher.getInstance(fullAlg);
+ int blockSize = cipher.getBlockSize();
+ byte[] iv = new byte[blockSize];
+ for (int i = 0; i < blockSize; ++i) {
+ iv[i] = 0;
+ }
+ secretKey = new SecretKeySpec(keyData, StringUtils.substringBefore(fullAlg, "/"));
+ ivSpec = new IvParameterSpec(iv);
+ }
+
+ /**
+ * 获取唯一实例
+ *
+ * @return
+ * @throws NoSuchPaddingException
+ * @throws NoSuchAlgorithmException
+ */
+ public static DESedeUtil getInstance(String deskey) throws NoSuchAlgorithmException, NoSuchPaddingException {
+ if (null == instance) {
+ synchronized (DESedeUtil.class) {
+ if (null == instance) {
+ instance = new DESedeUtil(deskey);
+ }
+ }
+ }
+ return instance;
+ }
+
+ /**
+ * 加密
+ *
+ * @param s 待加密字符串
+ * @return 返回BASE64编码加密字符串
+ * @throws InvalidAlgorithmParameterException
+ * @throws InvalidKeyException
+ * @throws BadPaddingException
+ * @throws IllegalBlockSizeException
+ * @throws UnsupportedEncodingException
+ */
+ public String encode(String s) throws InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
+ cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
+ byte[] cipherBytes = cipher.doFinal(s.getBytes("UTF-8"));
+ return new String(Base64.encodeBase64(cipherBytes));
+ }
+
+ /**
+ * 解密
+ *
+ * @param s 待解密字符串
+ * @return 返回明文
+ * @throws InvalidAlgorithmParameterException
+ * @throws InvalidKeyException
+ * @throws BadPaddingException
+ * @throws IllegalBlockSizeException
+ * @throws UnsupportedEncodingException
+ */
+ public String decode(String s) throws InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
+ cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
+ byte[] resultBytes = cipher.doFinal(Base64.decodeBase64(s));
+ return new String(resultBytes, "UTF-8");
+ }
+
+}
+
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
new file mode 100644
index 0000000..5aa25fb
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
@@ -0,0 +1,88 @@
+package com.supwisdom.dlpay.util;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.*;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+public class DlpayUtil {
+ /**
+ * socket方式请求农商行
+ */
+ public static String send(String ip, int port, int timeout, String data) throws UnknownHostException, IOException {
+ Socket client = new Socket(ip, port);
+ client.setSoTimeout(timeout * 1000); //timeout秒
+ PrintWriter printWriter = new PrintWriter(client.getOutputStream());
+ // 发送消息
+ printWriter.println(data);
+ printWriter.flush();
+
+ // 读取返回信息
+ InputStreamReader streamReader = new InputStreamReader(client.getInputStream());
+ BufferedReader reader = new BufferedReader(streamReader);
+ StringBuffer content = new StringBuffer(); //存返回信息
+ int ch;
+ while ((ch = reader.read()) != -1) {
+ content.append((char) ch);
+ }
+ reader.close();
+ client.close();
+ return content.toString();
+ }
+
+ /**
+ * XML解析返回Map
+ * */
+ public static Map<String, Object> getXMLValue(String xml, String charset) {
+ if (null == xml) return null;
+ if (null == charset) charset = "UTF-8"; //默认 UTF-8
+ try {
+ byte[] data = xml.getBytes(charset);
+ ByteArrayInputStream bin = new ByteArrayInputStream(data);
+ SAXReader reader = new SAXReader();
+ Document document = reader.read(bin);
+ Element root = document.getRootElement();
+ List<Element> elementList = root.elements();
+ Map<String, Object> map = new HashMap<>(0);
+ for (Element e : elementList) {
+ map.put(e.getName(), getElementValue(e));
+ }
+ return map;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private static Object getElementValue(Element root) {
+ if (null == root) return null;
+ if (root.elements().size() > 0) {
+ List<Element> elementList = root.elements();
+ Map<String, Object> map = new HashMap<>(0);
+ for (Element e : elementList) {
+ map.put(e.getName(), getElementValue(e));
+ }
+ return map;
+ } else {
+ return root.getText();
+ }
+ }
+ public static String getCodeRandom() {
+ Random random = new Random();
+ String fourRandom = random.nextInt(1000000) + "";
+ int randLength = fourRandom.length();
+ if (randLength < 6) {
+ for (int i = 1; i <= 6 - randLength; i++)
+ fourRandom = "0" + fourRandom;
+ }
+ return fourRandom;
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/PaytypeUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/PaytypeUtil.java
new file mode 100644
index 0000000..8222e90
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/PaytypeUtil.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.util;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public class PaytypeUtil {
+ public static final String YKTPAY = "yktpay";
+
+ public static final String WECHAT = "wechat";
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/WebCheckException.java b/payapi/src/main/java/com/supwisdom/dlpay/util/WebCheckException.java
new file mode 100644
index 0000000..42e72d4
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/WebCheckException.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.util;
+
+public class WebCheckException extends Exception {
+ public WebCheckException(String message) {
+ super(message);
+ }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
new file mode 100644
index 0000000..c2d2a32
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
@@ -0,0 +1,76 @@
+package com.supwisdom.dlpay
+
+import io.lettuce.core.ReadFrom
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.SpringApplication
+import org.springframework.boot.autoconfigure.SpringBootApplication
+import org.springframework.boot.autoconfigure.data.redis.RedisProperties
+import org.springframework.boot.builder.SpringApplicationBuilder
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
+import org.springframework.cache.annotation.EnableCaching
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.data.redis.connection.RedisConnectionFactory
+import org.springframework.data.redis.connection.RedisPassword
+import org.springframework.data.redis.connection.RedisStandaloneConfiguration
+import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
+import org.springframework.data.redis.core.RedisTemplate
+import org.springframework.data.redis.repository.configuration.EnableRedisRepositories
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer
+import org.springframework.data.redis.serializer.StringRedisSerializer
+import org.springframework.scheduling.annotation.EnableScheduling
+
+
+@Configuration
+@EnableRedisRepositories
+class AppConfig {
+
+ @Autowired
+ private lateinit var redis: RedisProperties
+
+ @Bean
+ fun redisConnectionFactory(): RedisConnectionFactory {
+ val clientConfig = LettuceClientConfiguration.builder()
+ .readFrom(ReadFrom.SLAVE_PREFERRED)
+ .build()
+ val serverConfig = RedisStandaloneConfiguration(redis.host, redis.port)
+ if (redis.password.isNotEmpty()) {
+ serverConfig.password = RedisPassword.of(redis.password)
+ }
+ serverConfig.database = redis.database
+ return LettuceConnectionFactory(serverConfig, clientConfig)
+ }
+}
+
+@Configuration
+class HttpSessionConfig {
+ @Bean
+ fun sessionRedisTemplate(
+ connectionFactory: RedisConnectionFactory): RedisTemplate<Any, Any> {
+ val template = RedisTemplate<Any, Any>()
+ template.keySerializer = StringRedisSerializer()
+ template.hashKeySerializer = StringRedisSerializer()
+
+ template.setDefaultSerializer(GenericJackson2JsonRedisSerializer())
+ template.setConnectionFactory(connectionFactory)
+ return template
+ }
+}
+
+
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableScheduling
+@EnableCaching
+class PayApiApplication : SpringBootServletInitializer() {
+
+ override fun configure(builder: SpringApplicationBuilder): SpringApplicationBuilder {
+ return builder.sources(PayApiApplication::class.java)
+ }
+}
+
+fun main(args: Array<String>) {
+ SpringApplication.run(PayApiApplication::class.java, * args)
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
new file mode 100644
index 0000000..3b5bd5e
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
@@ -0,0 +1,245 @@
+package com.supwisdom.dlpay.api
+
+import com.google.gson.Gson
+import com.sun.jersey.api.client.Client
+import com.sun.jersey.api.client.ClientResponse
+import com.supwisdom.dlpay.api.bean.BaseResp
+import com.supwisdom.dlpay.api.bean.SupStatusRevResp
+import com.supwisdom.dlpay.api.bean.SupYktResp
+import com.supwisdom.dlpay.api.bean.WechatReqResp
+import com.supwisdom.dlpay.api.domain.TPersondtl
+import com.supwisdom.dlpay.api.domain.TShopdtl
+import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.util.Code
+
+class CallBackResp {
+ var retcode: String = "99"
+ var retmsg: String? = null
+ val data = mutableMapOf<String, String>()
+ fun add(key: String, value: String) {
+ this.data.plus(mapOf(key to value))
+ }
+}
+
+class CallService {
+
+ companion object {
+ fun callYktPay(config: Map<String, String?>, paydtl: TPersondtl, time: String, stuempno: String, yktshopid: String, devphyid: String?): CallBackResp {
+ val code = CallBackResp()
+ val appid = config["appid"]
+ if (appid.isNullOrEmpty()) {
+ code.retcode = "1"
+ code.retmsg = "一卡通支付方式未启用或未配置"
+ return code
+ }
+
+ val appkey = config["appkey"]
+ val orderurl = config["orderurl"]
+
+ val params = hashMapOf<String, String?>()
+ params.put("partner_id", appid)
+ params.put("stuempno", stuempno)
+ params.put("tradeno", paydtl.refno)
+ params.put("tradename", paydtl.payinfo)
+ params.put("amount", MoneyUtil.YuanToFen(paydtl.amount).toString())
+ params.put("shopid", yktshopid)
+ params.put("devphyid", devphyid)
+ params.put("calcmanagefee", "T") //是否计算费率
+ params.put("timestamp", time)
+ params.put("sign_method", "HMAC");
+ params.put("limitflag", "off") //是否判断消费限额,on-判断;off-不判断。默认on(判断限额)。为空或不为off都是on;
+ var signstr = StringUtil.createLinkString(HmacUtil.paraFilter(params))
+ val sign = HmacUtil.HMACSHA1(signstr, appkey)
+ signstr = "$signstr&sign=$sign&sourcetype=food"
+ val c = Client.create()
+ c.setConnectTimeout(20000)
+ val r = c.resource(orderurl)
+ val respClient = r.post(ClientResponse::class.java, signstr)
+ if (200 == respClient.status) {
+ val ret = respClient.getEntity(String::class.java)
+ if (ret != null) {
+ try {
+ val gson = Gson()
+ val result = gson.fromJson(ret, SupYktResp::class.java)
+ if (result == null) {
+ code.retcode = "1"
+ code.retmsg = "返回内容为空"
+ return code
+ }
+ if ("0" != result.retcode) {
+ if ("30" == result.retcode) {
+ if (result.other != null) {
+ try {
+ val supStatusRevResp = gson.fromJson(result.other,
+ SupStatusRevResp::class.java)
+ if (supStatusRevResp != null) {
+ //同流水号,同一笔已经支付完成的,不重复支付。
+ if (3 == supStatusRevResp.status
+ && supStatusRevResp.revflag != null
+ && !supStatusRevResp.revflag) {
+ code.retcode = "0"
+ code.retmsg = "成功"
+ return code
+ }
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+ }
+ code.retcode = "1"
+ code.retmsg = "交易失败:" + result.retmsg
+ return code
+ }
+ code.retcode = "0"
+ code.retmsg = "成功"
+ return code
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+ }
+ code.retcode = "1"
+ code.retmsg = "请求失败"
+ return code
+ }
+
+ fun callWechatPay(config: Map<String, String>, paydtl: TPersondtl, time: String, wechattype: String,
+ realip: String?, qrcode: String?, openid: String?): BaseResp {
+ val code = BaseResp()
+ val appid = config["appid"]
+ if (appid.isNullOrEmpty()) {
+ code.retcode = "1"
+ code.retmsg = "微信支付方式未启用或未配置"
+ return code
+ }
+ val appkey = config["appkey"]
+ val orderurl = config["orderurl"]
+ val mchid = config["mchid"]
+ val wechatReqResp = WechatReqResp()
+ wechatReqResp.openid = openid
+ wechatReqResp.appid = appid
+ wechatReqResp.total_fee = MoneyUtil.YuanToFen(paydtl.amount)
+ wechatReqResp.body = paydtl.payinfo
+ wechatReqResp.key = appkey
+ wechatReqResp.mch_id = mchid
+ wechatReqResp.notify_url = config["notifyurl"] + "/notify/wechat"
+ wechatReqResp.out_trade_no = paydtl.refno
+ wechatReqResp.spbill_create_ip = realip
+ val c = Client.create()
+ c.setConnectTimeout(20000)
+ return when (wechattype) {
+ "qrcode" -> {
+ code
+ }
+ "app" -> {
+ wechatReqResp.trade_type = "APP"
+ code
+ }
+ "mp" -> {
+ wechatReqResp.trade_type = "JSAPI"
+ wechatReqResp.generaSign()
+ val xml = wechatReqResp.generaXML()
+ val r = c.resource(orderurl)
+ val respClient = r.post(ClientResponse::class.java, xml)
+ if (200 == respClient.status) {
+ try {
+ val ret = respClient.getEntity(String::class.java)
+ if (ret != null) {
+ val eleMap = XmlUtils.parseXml(ret)
+ val retcode = eleMap["return_code"]
+ val result_code = eleMap["result_code"]
+ val prepay_id = eleMap["prepay_id"]
+ if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
+ && !result_code.isNullOrEmpty() && "SUCCESS" == result_code
+ && !prepay_id.isNullOrEmpty()) {
+ wechatReqResp.retcode = 0
+ wechatReqResp.retmsg = "初始化成功"
+ wechatReqResp.prepay_id = prepay_id
+ //TODO prepay_id 是否保存
+ wechatReqResp.timestamp = DateUtil.getNowSecond().toString()
+ wechatReqResp.nonce_str = RandomUtils.getRandomString(30)
+ wechatReqResp.generaJSAPISign()
+ val params = wechatReqResp.generaJSAPIParamters()
+ code.setCode(Code.SUCCESS)
+ code.data = params
+ } else {
+ code.retcode = "1"
+ code.retmsg = eleMap["return_msg"]
+ }
+ } else {
+ code.retcode = "1"
+ code.retmsg = "微信支付请求失败"
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ code.retcode = "1"
+ code.retmsg = "微信支付请求异常"
+ }
+
+ } else {
+ code.retcode = "1"
+ code.retmsg = "微信支付请求返回失败"
+ }
+ code
+ }
+ "h5" -> {
+ wechatReqResp.trade_type = "MWEB"
+ wechatReqResp.scene_info = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"" + config["notifyurl"] + "\",\"wap_name\": \"${paydtl.payinfo}\"}}"
+ val xml = wechatReqResp.generaXML()
+ val r = c.resource(orderurl)
+ val respClient = r.post(ClientResponse::class.java, xml)
+ if (200 == respClient.status) {
+ try {
+ val ret = respClient.getEntity(String::class.java)
+ if (ret != null) {
+ val eleMap = XmlUtils.parseXml(ret)
+ val retcode = eleMap["return_code"]
+ val result_code = eleMap["result_code"]
+ val prepay_id = eleMap["prepay_id"]
+ val mweb_url = eleMap["mweb_url"]
+ if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
+ && !result_code.isNullOrEmpty() && "SUCCESS" == result_code
+ && !prepay_id.isNullOrEmpty()) {
+ wechatReqResp.retcode = 0
+ wechatReqResp.retmsg = "初始化成功"
+ wechatReqResp.prepay_id = prepay_id
+ wechatReqResp.mweb_url = mweb_url
+ code.setCode(Code.SUCCESS)
+ code.data = mweb_url
+ } else {
+ code.retcode = "1"
+ code.retmsg = eleMap["return_msg"]
+ }
+ } else {
+ code.retcode = "1"
+ code.retmsg = "微信支付请求失败"
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ code.retcode = "1"
+ code.retmsg = "微信支付请求异常"
+ }
+
+ } else {
+ code.retcode = "1"
+ code.retmsg = "微信支付请求返回失败"
+ }
+ code
+ }
+ else -> {
+ code.retcode = "1"
+ code.retmsg = "未标识的类型:wechattype=$wechattype"
+ code
+ }
+ }
+ }
+
+ fun CallCitizenCardPay(config: Map<String, String?>, paydtl: TShopdtl): CallBackResp {
+ val resp = CallBackResp()
+ resp.retcode = "0"
+ // TODO: 代扣逻辑
+ return resp
+ }
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt
new file mode 100644
index 0000000..b2ff84d
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt
@@ -0,0 +1,89 @@
+package com.supwisdom.dlpay.api
+
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException
+import com.supwisdom.dlpay.exception.TransactionCheckException
+import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.service.CommonService
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import mu.KotlinLogging
+import org.aspectj.lang.ProceedingJoinPoint
+import org.aspectj.lang.annotation.Around
+import org.aspectj.lang.annotation.Aspect
+import org.aspectj.lang.annotation.Pointcut
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.beans.factory.annotation.Value
+import org.springframework.http.ResponseEntity
+import org.springframework.security.core.context.SecurityContextHolder
+import org.springframework.stereotype.Component
+import org.springframework.web.bind.annotation.ExceptionHandler
+import org.springframework.web.bind.annotation.RestControllerAdvice
+import java.lang.reflect.UndeclaredThrowableException
+import javax.servlet.http.HttpServletRequest
+
+
+@RestControllerAdvice("com.supwisdom.dlpay.api")
+class RestControllerAdvice {
+ val logger = KotlinLogging.logger { }
+
+ @ExceptionHandler
+ fun handleException(ex: Exception, request: HttpServletRequest): ResponseEntity<Any> {
+ logger.error { "Request unhandler exception, url<${request.requestURI}>, ex<${ex.cause}>" }
+ val undeclared = if (ex is UndeclaredThrowableException) ex.undeclaredThrowable else ex
+ if (undeclared is RequestParamCheckException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .requestException(undeclared, "请求参数错误"))
+ } else if (undeclared is TransactionException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .exception(undeclared.code(), undeclared, "业务处理错误"))
+ }
+
+ return ResponseEntity.ok().body(ResponseBodyBuilder.create()
+ .exception(TradeErrorCode.BUSINESS_DEAL_ERROR, undeclared, "业务处理报错"))
+ }
+}
+
+@Component
+@Aspect
+class RestControllerAspect {
+ @Autowired
+ lateinit var commonService: CommonService
+
+ @Value("\${security.request.sign: true}")
+ private var requestSignCheck: Boolean = true
+
+ private val logger = KotlinLogging.logger { }
+
+ @Pointcut("@within(org.springframework.web.bind.annotation.RestController)")
+ fun restcontroller() {
+ }
+
+ @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)")
+ fun postmapping() {
+ }
+
+ @Around("restcontroller() && postmapping() && args(@RequestBody body, ..)")
+ @Throws(Throwable::class)
+ fun logPostMethods(joinPoint: ProceedingJoinPoint, body: Any): Any {
+ return try {
+ if (body is APIRequestParam) {
+ body.checkParam()
+
+ if (requestSignCheck &&
+ !body.checkSign(commonService.getSecretByAppid(
+ SecurityContextHolder.getContext().authentication.name))) {
+ throw RequestParamCheckException("参数签名错误")
+ }
+ } else {
+ throw TransactionCheckException(TradeErrorCode.REQUEST_PARAM_EEROR, "请求参数实体位置错误")
+ }
+
+ val result = joinPoint.proceed()
+ logger.debug(result.toString())
+ result
+ } catch (t: Throwable) {
+ logger.error { "request error , ex<${t.message}>" }
+ throw t
+ }
+ }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt
new file mode 100644
index 0000000..83bfde8
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt
@@ -0,0 +1,53 @@
+package com.supwisdom.dlpay.api
+
+import com.supwisdom.dlpay.api.repositories.ShopaccService
+import mu.KotlinLogging
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.scheduling.annotation.Async
+import org.springframework.scheduling.annotation.AsyncConfigurer
+import org.springframework.scheduling.annotation.EnableAsync
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
+import org.springframework.stereotype.Component
+import java.lang.reflect.Method
+import java.util.concurrent.Executor
+
+@Configuration
+@EnableAsync
+class SpringAsyncConfig : AsyncConfigurer {
+ @Bean("shopAccBalanceUpdater")
+ fun threadPoolExecutor(): Executor {
+ return ThreadPoolTaskExecutor().apply {
+ corePoolSize = 5
+ maxPoolSize = 10
+ setWaitForTasksToCompleteOnShutdown(true)
+ }
+ }
+
+ override fun getAsyncUncaughtExceptionHandler(): AsyncUncaughtExceptionHandler? {
+ return MyAsyncUncaughtExceptionHandler()
+ }
+}
+
+class MyAsyncUncaughtExceptionHandler : AsyncUncaughtExceptionHandler {
+ private val logger = KotlinLogging.logger { }
+ override fun handleUncaughtException(ex: Throwable, method: Method, vararg params: Any?) {
+ logger.error { "Async Task execute error: <${method.name}>, exception <${ex.message}>" }
+ }
+}
+
+
+@Component
+class ShopAccBalanceAsyncTask {
+ private val logger = KotlinLogging.logger { }
+
+ @Autowired
+ private lateinit var shopaccService: ShopaccService
+
+ @Async("shopAccBalanceUpdater")
+ fun updateShopBalance(shopdtlRefno: String) {
+ shopaccService.recalcShopBalance(shopdtlRefno, true)
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
new file mode 100644
index 0000000..87573a0
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -0,0 +1,215 @@
+package com.supwisdom.dlpay.api.bean
+
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
+import com.supwisdom.dlpay.api.APIRequestParam
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException
+import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.util.ConstantUtil
+import com.supwisdom.dlpay.util.DESedeUtil
+
+// ============================ USER ============================ //
+class OpenUserParam : APIRequestParam() {
+ @Sign
+ var uid: String = "" //第三方用户ID,必传
+ @Sign
+ var name: String = "" //必传
+ @Sign
+ var sex: String? = null
+ @Sign
+ var idtype: String = "" //必传
+ @Sign
+ var idno: String = "" //必传
+ @Sign
+ var mobile: String? = null
+ @Sign
+ var tel: String? = null
+ @Sign
+ var email: String? = null
+ @Sign
+ var address: String? = null
+ @Sign
+ var zipcode: String? = null
+
+ override fun checkParam(): Boolean {
+ if (StringUtil.isEmpty(uid)) throw RequestParamCheckException("用户唯一号不能为空")
+ if (StringUtil.isEmpty(name)) throw RequestParamCheckException("姓名不能为空")
+ if (!StringUtil.isEmpty(sex) && ConstantUtil.SEX_MALE != sex && ConstantUtil.SEX_FEMALE != sex) throw RequestParamCheckException("性别非法[male|female]")
+ if (StringUtil.isEmpty(idtype) || !ConstantUtil.IDTYPE_DICTS.contains(idtype)) throw RequestParamCheckException("证件类型非法")
+ if (StringUtil.isEmpty(idno) || !StringUtil.isCharAndNum(idno)) throw RequestParamCheckException("证件号不能为空,且仅支持数字和字母")
+ if (ConstantUtil.IDTYPE_IDENTITY == idtype && !StringUtil.isIdentity(idno)) throw RequestParamCheckException("身份证格式错误")
+ if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile)) throw RequestParamCheckException("手机号格式错误")
+ if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException("邮箱格式错误")
+
+ return true
+ }
+}
+
+class QueryUserParam : APIRequestParam() {
+ @Sign
+ var userid: String? = null // 用户ID二选一 (两者都传取userid)
+ @Sign
+ var uid: String? = null // 用户ID二选一
+
+ override fun checkParam(): Boolean {
+ if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException("用户唯一号不能为空")
+
+ return true
+ }
+}
+
+class ModifyUserParam : APIRequestParam() {
+ @Sign
+ var userid: String? = null // 用户ID二选一 (两者都传取userid)
+ @Sign
+ var uid: String? = null // 用户ID二选一
+ @Sign
+ var name: String? = null
+ @Sign
+ var sex: String? = null
+ @Sign
+ var idtype: String? = null
+ @Sign
+ var idno: String? = null
+ @Sign
+ var mobile: String? = null
+ @Sign
+ var tel: String? = null
+ @Sign
+ var email: String? = null
+ @Sign
+ var address: String? = null
+ @Sign
+ var zipcode: String? = null
+
+ override fun checkParam(): Boolean {
+ if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException("用户唯一号不能为空")
+ if (!StringUtil.isEmpty(sex) && ConstantUtil.SEX_MALE != sex && ConstantUtil.SEX_FEMALE != sex) throw RequestParamCheckException("性别非法[male|female]")
+ if (!StringUtil.isEmpty(idtype) && !ConstantUtil.IDTYPE_DICTS.contains(idtype)) throw RequestParamCheckException("证件类型非法")
+ if (!StringUtil.isEmpty(idno) && !StringUtil.isCharAndNum(idno)) throw RequestParamCheckException("证件号不能为空,且仅支持数字和字母")
+ if (!StringUtil.isEmpty(idno) && StringUtil.isEmpty(idtype)) throw RequestParamCheckException("证件号不能为空时,请指定证件类型")
+ if (!StringUtil.isEmpty(idno) && ConstantUtil.IDTYPE_IDENTITY == idtype && !StringUtil.isIdentity(idno)) throw RequestParamCheckException("身份证格式错误")
+ if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile)) throw RequestParamCheckException("手机号格式错误")
+ if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException("邮箱格式错误")
+
+ return true
+ }
+}
+
+
+// ============================ SHOP ============================ //
+class OpenShopParam : APIRequestParam() {
+ @Sign
+ var shopUniqueId: String = "" //必传
+ @Sign
+ var shoptype: Int = 1
+ @Sign
+ var fshopid: Int? = null
+ @Sign
+ var shopname: String = "" //必传
+ @Sign
+ var contactman: String? = null
+ @Sign
+ var idtype: String? = null
+ @Sign
+ var idno: String? = null
+ @Sign
+ var mobile: String? = null
+ @Sign
+ var email: String? = null
+ @Sign
+ var address: String? = null
+ @Sign
+ var zipcode: String? = null
+
+ override fun checkParam(): Boolean {
+ if (StringUtil.isEmpty(shopUniqueId)) throw RequestParamCheckException("商户唯一号不能为空")
+ if (ConstantUtil.SHOPTYPE_GROUP != shoptype && ConstantUtil.SHOPTYPE_LEAF != shoptype) throw RequestParamCheckException("请指定商户类型")
+ if (StringUtil.isEmpty(shopname)) throw RequestParamCheckException("商户名称不能为空")
+ if (!StringUtil.isEmpty(idtype) && !ConstantUtil.IDTYPE_DICTS.contains(idtype)) throw RequestParamCheckException("证件类型非法")
+ if (!StringUtil.isEmpty(idno) && !StringUtil.isCharAndNum(idno)) throw RequestParamCheckException("证件号不能为空,且仅支持数字和字母")
+ if (!StringUtil.isEmpty(idno) && StringUtil.isEmpty(idtype)) throw RequestParamCheckException("证件号不能为空时,请指定证件类型")
+ if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile)) throw RequestParamCheckException("手机号格式错误")
+ if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException("邮箱格式错误")
+
+ return true
+ }
+}
+
+class QueryShopParam : APIRequestParam() {
+ @Sign
+ var shopid: Int? = null //注册时返回的shopid
+ @Sign
+ var shopaccno: String? = null //注册时返回的shopaccno
+ @Sign
+ var shopUniqueId: String? = null //注册传的商户唯一号
+
+ override fun checkParam(): Boolean {
+ if (StringUtil.isEmpty(shopUniqueId) && null == shopid && StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException("商户唯一标志不能为空")
+
+ return true
+ }
+}
+
+
+class DaliDatasyncParam {
+ var app_id: String = ""
+ var data: String = ""
+ var count: Int = 0
+ var timestamp: String = ""
+ var sign_type: String = ""
+ var sign: String = ""
+
+ fun checkParam(): Boolean {
+ if (StringUtil.isEmpty(app_id)) {
+ throw RequestParamCheckException("请求参数错误[应用ID为空]")
+ }
+ if (StringUtil.isEmpty(data)) {
+ throw RequestParamCheckException("请求参数错误[业务参数报文为空]")
+ }
+ if (count < 1) throw RequestParamCheckException("请求参数错误[业务明细至少有一条]")
+ if (!DateUtil.checkDatetimeValid(timestamp, DateUtil.DATETIME_FMT)) {
+ throw RequestParamCheckException("请求参数错误[时间戳]")
+ }
+ if (StringUtil.isEmpty(sign_type)
+ || !"HmacSHA256".equals(sign_type, true)) {
+ throw RequestParamCheckException("请求参数错误[签名算法]")
+ }
+ if (StringUtil.isEmpty(sign)) {
+ throw RequestParamCheckException("请求参数错误[签名为空]")
+ }
+
+ return true
+ }
+
+ fun checkSign(key: String): Boolean {
+ val signData = "app_id=$app_id&count=$count&data=$data×tamp=$timestamp"
+ return sign.equals(HmacUtil.HMACSHA256(signData, key), true)
+ }
+
+ fun decData(deskey: String): ArrayList<DaliDatasyncDetail> {
+ try {
+ val listType = object : TypeToken<ArrayList<ConsumeFeetype>>() {}.type
+ val decstr = DESedeUtil.getInstance(deskey).decode(data)
+ return Gson().fromJson(decstr, listType)
+ } catch (e: Exception) {
+ throw RequestParamCheckException("数据解密失败!")
+ }
+ }
+
+}
+
+class DaliDatasyncDetail {
+ var cardno: String = ""
+ var cardphyid: String = ""
+ var expiredate: String = ""
+ var cardstatus: String = ""
+ var bankcardno: String? = null
+ var username: String = ""
+ var idtype: String = ""
+ var idno: String = ""
+ var mobile: String? = null
+ var email: String? = null
+}
+
+
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
new file mode 100644
index 0000000..da8c986
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
@@ -0,0 +1,144 @@
+package com.supwisdom.dlpay.api.controller
+
+import com.supwisdom.dlpay.api.AccountProxy
+import com.supwisdom.dlpay.api.TransactionBuilder
+import com.supwisdom.dlpay.api.bean.*
+import com.supwisdom.dlpay.api.service.*
+import com.supwisdom.dlpay.exception.TransactionCheckException
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.service.CommonService
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.Subject
+import com.supwisdom.dlpay.framework.util.TradeCode
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.http.ResponseEntity
+import org.springframework.security.core.Authentication
+import org.springframework.web.bind.annotation.PostMapping
+import org.springframework.web.bind.annotation.RequestBody
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+@RestController
+@RequestMapping("/api/recharge")
+class ChargeAPIController {
+ @Autowired
+ lateinit var accountUtilServcie: AccountUtilServcie
+ @Autowired
+ lateinit var systemUtilService: SystemUtilService
+ @Autowired
+ lateinit var transactionService: TransactionServiceProxy
+ @Autowired
+ lateinit var commonService: CommonService
+ @Autowired
+ lateinit var userService: UserService
+ @Autowired
+ lateinit var chargeApiService: ChargeApiService
+
+ /**
+ * ============================================================================
+ * 查询充值流水状态
+ * ============================================================================
+ * */
+ @PostMapping("/queryresult")
+ fun rechargeConfirm(@RequestBody param: CommonQueryRechargeResultParam, authentication: Authentication): ResponseEntity<Any> {
+ chargeApiService.getTransactionMainDtl(param.refno, param.billno, authentication.name).let {
+ if (null == it) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "充值流水不存在"))
+ }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", it.refno)
+ .data("billno", it.outTradeNo)
+ .data("status", it.status)
+ .data("amount", chargeApiService.getPersonDtl(it.refno).amount)
+ .data("reverseflag", it.reverseFlag)
+ .success("查询成功"))
+ }
+ }
+
+ /**
+ * ============================================================================
+ * 通用充值(只记流水)
+ * ============================================================================
+ * */
+ @PostMapping("/common/init")
+ fun rechargeInit(@RequestBody param: CommonRechargeInitParam, authentication: Authentication): ResponseEntity<Any> {
+ if (chargeApiService.checkRechargeSourcetype(param.sourcetype)) {
+ val person = userService.findOnePersonByUserid(param.userid)
+ val account = accountUtilServcie.readAccount(person.userid)
+ val rechargeDrsubjno = when (param.sourcetype) {
+ //根据不同支付方式确定借方科目,fixme:可根据outid或clientId自定义
+
+ TradeDict.PAYTYPE_CASH -> accountUtilServcie.readSubject(Subject.SUBJNO_RECHARGE_CASH)
+ TradeDict.PAYTYPE_OTHER_THIRDPART -> accountUtilServcie.readSubject(Subject.SUBJNO_RECHARGE_OTHER)
+ else -> throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "充值支付方式<${param.sourcetype}>未确定所属科目")
+ }
+
+ val transaction = TransactionBuilder().apply {
+ setTransInfo(param.transdate, param.transtime,
+ TradeCode.TRANSCODE_ERCHARGE,
+ param.sourcetype)
+ setOutTransInfo(authentication.name, param.billno) //fixme: outid取clientId
+// operator("", TradeDict.OPERTYPE_OPER) //充值操作员
+ payinfo = "账户充值"
+ description = "账户充值"
+ }.person(account).apply {
+ setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
+ setOpposite(AccountProxy(rechargeDrsubjno))
+ }.and().addDebitCreditRecord(AccountProxy(rechargeDrsubjno), AccountProxy(account),
+ param.amount / 100.0, "账户充值")
+ .also { builder ->
+ param.feelist?.forEach {
+ val feeamt = it.amount / 100.0
+ when (it.feetype) {
+ TradeDict.PAYTYPE_RECHARGE_COUPON -> {
+ //优惠折扣 优惠科目 -> 个人账户
+ val feetypeConfig = accountUtilServcie
+ .readFeetype(TradeDict.PAYTYPE_RECHARGE_COUPON, param.sourcetype)
+ val subject = accountUtilServcie
+ .readSubject(feetypeConfig.drsubjno) //不同在借方折扣科目
+ builder.addDebitCreditRecord(AccountProxy(subject),
+ AccountProxy(account), feeamt, feetypeConfig.summary)
+ }
+ //fixme: 服务费暂缺
+// TradeDict.PAYTYPE_RECHARGE_SERVICEFEE -> {
+// //收服务费 借方 -> 服务费科目
+// val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.PAYTYPE_RECHARGE_SERVICEFEE, param.sourcetype)
+// val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在服务费放在贷方科目
+// builder.addDebitCreditRecord(AccountProxy(rechargeDrsubjno), AccountProxy(subject), feeamt, feetypeConfig.summary)
+//
+// }
+ else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "充值费用清单不支持feetype<${it.feetype}>")
+ }
+ }
+ }.init(transactionService)
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", transaction.refno)
+ .data("amount", transaction.personDtl.amount)
+ .success("初始化成功"))
+
+ }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "充值不支持支付方式<${param.sourcetype}>"))
+ }
+
+ @PostMapping("/common/confirm")
+ fun rechargeConfirm(@RequestBody param: CommonRechargeConfirmParam): ResponseEntity<Any> {
+ transactionService.success(param.refno).let {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", it.refno)
+ .data("billno", it.outTradeNo)
+ .data("amount", chargeApiService.getPersonDtl(it.refno).amount)
+ .success("交易确认成功"))
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
new file mode 100644
index 0000000..4ecb7df
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -0,0 +1,461 @@
+package com.supwisdom.dlpay.api.controller
+
+import com.supwisdom.dlpay.api.*
+import com.supwisdom.dlpay.api.bean.*
+import com.supwisdom.dlpay.api.service.AccountUtilServcie
+import com.supwisdom.dlpay.api.service.ConsumePayService
+import com.supwisdom.dlpay.api.service.TransactionServiceProxy
+import com.supwisdom.dlpay.api.service.UserService
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.Subject
+import com.supwisdom.dlpay.framework.util.TradeCode
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.PostMapping
+import org.springframework.web.bind.annotation.RequestBody
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+@RestController
+@RequestMapping("/api/consume")
+class ConsumeAPIController {
+ @Autowired
+ lateinit var accountUtilServcie: AccountUtilServcie
+ @Autowired
+ lateinit var userService: UserService
+ @Autowired
+ lateinit var systemUtilService: SystemUtilService
+ @Autowired
+ lateinit var consumePayService: ConsumePayService
+ @Autowired
+ lateinit var transactionService: TransactionServiceProxy
+
+ /**
+ * ============================================================================
+ * 消费流水结果查询统一接口
+ * ============================================================================
+ * */
+ @PostMapping("/queryresult")
+ fun queryDtlResult(@RequestBody param: QueryDtlResultParam): ResponseEntity<Any> {
+ consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", it.refno)
+ .data("billno", it.outTradeNo)
+ .data("amount", it.shopDtl.amount)
+ .data("status", it.status)
+ .data("sourcetype", it.personDtl.sourceType)
+ .data("payinfo", it.personDtl.payinfo)
+ .data("reverseflag", it.reverseFlag)
+ .data("transdesc", it.shopDtl.transdesc)
+ .success("查询成功"))
+ } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
+ }
+
+ /**
+ * ============================================================================
+ * 账户【余额支付】
+ * ============================================================================
+ * */
+ @PostMapping("/balance/pay")
+ fun balancePay(@RequestBody param: CitizenCardPayinitParam): ResponseEntity<Any> {
+ val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
+ if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
+ val account = accountUtilServcie.readAccount(person.userid)
+ val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
+
+ val dtl = TransactionBuilder().apply {
+ setTransInfo(param.transdate, param.transtime,
+ TradeCode.TRANSCODE_BALANCE_PAY,
+ TradeDict.PAYTYPE_BALANCE)
+ setOutTransInfo(shopacc.shopaccno, param.billno)
+ operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
+ payinfo = param.cardNo //fixme: 卡号或其他唯一信息
+ description = "账户余额消费"
+ }.person(account).apply {
+ setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
+ setOpposite(AccountProxy(shopacc))
+ }.and().shop(shopacc).apply {
+ setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
+ setOpposite(AccountProxy(account))
+ }.and().addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
+ param.amount / 100.0, "账户余额消费")
+ .also {
+ param.feelist?.also {
+ TODO("feelist 费用清单未实现!")
+ }
+// param.feelist?.forEach {
+// val feeamt = it.amount / 100.0
+// when (it.feetype) {
+// TradeDict.FEETYPE_CONSUME_MEALER -> {
+// //搭伙费
+// val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER, TradeDict.PAYTYPE_BALANCE)
+// val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在贷方科目
+// when (Subject.SUBJNO_MACHANT_INCOME == subject.subjno) {
+// true -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), feeamt, feetypeConfig.summary) //商户收
+// false -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(subject), feeamt, feetypeConfig.summary) //其他科目
+// }
+// }
+// TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
+// //优惠折扣
+// val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_DISCOUNT, TradeDict.PAYTYPE_BALANCE)
+// val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方科目
+// builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc), feeamt, feetypeConfig.summary)
+//
+// }
+// else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+// "账户余额支付费用清单不支持feetype<${it.feetype}>")
+// }
+// }
+ }.init(transactionService)
+
+ transactionService.success(dtl.refno)
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", dtl.refno)
+ .data("billno", dtl.outTradeNo)
+ .data("amount", dtl.personDtl.amount)
+ .success("交易成功"))
+ }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<账户余额>"))
+ }
+
+
+ /**
+ * ============================================================================
+ * 市民卡【交易初始化】
+ * ============================================================================
+ * */
+ @PostMapping("/citizencard/payinit")
+ fun citizencardPayinit(@RequestBody param: CitizenCardPayinitParam): ResponseEntity<Any> {
+ val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
+ if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_CITIZEN_CARD)) {
+
+ val account = accountUtilServcie.readAccount(person.userid)
+ val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
+ val subject = accountUtilServcie.readSubject(Subject.SUBJNO_PAY_CITIZEN_CARD)
+ val transaction = TransactionBuilder().apply {
+ setTransInfo(param.transdate, param.transtime,
+ TradeCode.TRANSCODE_CITIZENCARD_PAY,
+ TradeDict.PAYTYPE_CITIZEN_CARD)
+ setOutTransInfo(shopacc.shopaccno, param.billno)
+ operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
+ payinfo = param.cardNo
+ description = "市民卡代扣消费"
+ }.person(account).apply {
+ setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
+ setOpposite(AccountProxy(shopacc))
+ }.and().shop(shopacc).apply {
+ setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
+ setOpposite(AccountProxy(account))
+ }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(account),
+ param.amount / 100.0, "市民卡代扣消费")
+ .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
+ param.amount / 100.0, "市民卡代扣消费")
+ .also {
+ param.feelist?.also {
+ TODO("feelist 费用清单未实现!")
+ }
+// param.feelist?.forEach {
+// val feeamt = it.amount / 100.0
+// when (it.feetype) {
+// TradeDict.FEETYPE_CONSUME_MEALER -> {
+// //搭伙费
+// val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER, TradeDict.PAYTYPE_BALANCE)
+// val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在贷方科目
+// when (Subject.SUBJNO_MACHANT_INCOME == subject.subjno) {
+// true -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), feeamt, feetypeConfig.summary) //商户收
+// false -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(subject), feeamt, feetypeConfig.summary) //其他科目
+// }
+// }
+// TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
+// //优惠折扣
+// val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_DISCOUNT, TradeDict.PAYTYPE_BALANCE)
+// val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方科目
+// builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc), feeamt, feetypeConfig.summary)
+//
+// }
+// else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+// "账户余额支付费用清单不支持feetype<${it.feetype}>")
+// }
+//
+// }
+ }.init(transactionService)
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", transaction.refno)
+ .data("billno", transaction.outTradeNo)
+ .data("amount", transaction.shopDtl.amount)
+ .success("交易初始化成功"))
+ }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>"))
+ }
+
+ /**
+ * ============================================================================
+ * 市民卡【交易确认】
+ * ============================================================================
+ * */
+ @PostMapping("/citizencard/payfinish")
+ fun citizencardPayinit(@RequestBody param: CitizenCardPayfinishParam): ResponseEntity<Any> {
+ val code = transactionService.wip(param.refno).let {
+ CallService.CallCitizenCardPay(
+ consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, it.shopDtl.shopaccno),
+ it.shopDtl)
+ }
+ if (code.retcode == "0") {
+ transactionService.success(param.refno, "支付").let {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", it.refno)
+ .data("billno", it.outTradeNo)
+ .data("amount", it.shopDtl.amount)
+ .success("交易确认成功"))
+ }
+
+ } else {
+ transactionService.fail(param.refno).let {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
+ }
+ }
+ }
+
+ /**
+ * ============================================================================
+ * 消费流水撤销
+ * ============================================================================
+ * */
+ @PostMapping("/paycancel")
+ fun payCancel(@RequestBody param: ConsumePayCancelParam): ResponseEntity<Any> {
+ consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let {
+ val builder = TransactionBuilder().apply {
+ setTransInfo(param.transdate, param.transtime, it.transCode, it.sourceType)
+ setOutTransInfo(it.outId, param.requestbillno)
+ }
+ val cancelTrans = builder.cancelInit(it.refno, transactionService)
+ //fixme: 撤销逻辑
+ if (it.sourceType.isNotEmpty()) {
+ // 第三方冲正
+ }
+ transactionService.success(cancelTrans.refno)
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", cancelTrans.refno)
+ .success("交易确认成功"))
+ } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
+ }
+
+ /**
+ * ============================================================================
+ * 消费流水退款
+ * ============================================================================
+ * */
+ @PostMapping("/payrefund")
+ fun payRefund(@RequestBody param: ConsumePayRefundParam): ResponseEntity<Any> {
+ consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let {
+ val builder = TransactionBuilder().apply {
+ setTransInfo(param.transdate, param.transtime, it.transCode, it.sourceType)
+ setOutTransInfo(it.outId, param.requestbillno)
+ }
+ val refundTrans = builder.refundInit(it.refno,
+ param.refundAmount / 100.0, transactionService)
+ //fixme: 撤销逻辑
+ if (it.sourceType.isNotEmpty()) {
+ // 第三方冲正
+ }
+ transactionService.success(refundTrans.refno)
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", refundTrans.refno)
+ .success("交易确认成功"))
+ } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
+ }
+
+ /**
+ * ============================================================================
+ * 一卡通支付【交易初始化】
+ * ============================================================================
+ * */
+ @PostMapping("/ykt/payinit")
+ fun yktPayInit(@RequestBody param: YktCardPayinitParam): ResponseEntity<Any> {
+// val person = param.uid?.let { userService.findByThirdUniqueIdenty(it) } //没注册,可能匿名?
+// if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_YKT_CARD, person == null)) {
+// val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+// .chooseTradetype(Tradetype.CONSUME) //消费
+// .also {
+// if (null != person) it.setOwner(person)
+// }
+// .setTransinfo(TradeCode.TRANSCODE_YKTCARD_PAY, "一卡通支付")
+// .setTransDatetime(param.transdate, param.transtime) //交易时间
+// .selectPaytype(TradeDict.PAYTYPE_YKT_CARD, param.stuempno)
+// .addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT),
+// AccountHolder.shop(param.shopaccno),
+// param.amount / 100.0, "一卡通支付")
+// .also { builder ->
+// param.feelist?.forEach {
+// //fixme: 科目 -> 商户 与个人无关
+// builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_YKT_CARD)
+// .with(AccountHolder.shop(param.shopaccno))
+// .with(AccountHolder.subject(Subject.SUBJNO_PAY_YKT))
+// , it.amount / 100.0)
+// }
+// }
+// .addExtendParam("stuempno", param.stuempno)
+// .addExtendParam("yktshopid", param.yktshopid ?: "")
+// .addExtendParam("devphyid", param.devphyid ?: "")
+// //.addExtendParam(param.extendmap) //fixme: 保存调一卡通附加参数 (是否直接传附加参数map)
+// .init(personBalancePayService)
+//
+// return ResponseEntity.ok(ResponseBodyBuilder.create()
+// .data("refno", dtl.refno)
+// .data("amount", dtl.amount)
+// .success("交易初始化成功"))
+//
+// }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
+ }
+
+
+ /**
+ * ============================================================================
+ * 一卡通支付【交易确认】
+ * ============================================================================
+ * */
+ @PostMapping("/ykt/payfinish")
+ fun yktPayFinish(@RequestBody param: CitizenCardPayfinishParam): ResponseEntity<Any> {
+// var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+// .setRefno(param.refno)
+// .wip(personBalancePayService)
+// val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
+// val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid == null),
+// dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
+// if (code.retcode == "0") {
+// dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+// .setRefno(param.refno)
+// .addResult(code.data)
+// .success(personBalancePayService) //流水置成功
+//
+// return ResponseEntity.ok(ResponseBodyBuilder.create()
+// .data("refno", dtl.refno)
+// .data("billno", dtl.outtradeno)
+// .success())
+// } else {
+// PersonTransBuilder.newBuilder(accountUtilServcie)
+// .setRefno(param.refno)
+// .addResult("errmsg", code.retmsg!!)
+// .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
+//
+// return ResponseEntity.ok(ResponseBodyBuilder.create()
+// .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
+// }
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败"))
+ }
+
+// ============================================== //
+//
+// @GetMapping("/account/payinit")
+// fun accountPayInit(userid: String, amount: Int, manageFee: Int): ResponseEntity<Any> {
+// val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+// .setTransDatetime("20190411", "112311")
+// .enableOverdraft(false)
+// .addDetail(AccountHolder.person(userid),
+// AccountHolder.shop("12323"),
+// amount / 100.0, "")
+// .addDetail(AccountHolder.person(userid), AccountHolder.transType(301),
+// manageFee / 100.0, "")
+// .done(personBalancePayService, false)
+//
+// return ResponseEntity.ok(dtl)
+// }
+//
+// @GetMapping("/account/payfinish")
+// fun accountPayFinish(refno: String): ResponseEntity<Any> {
+// val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+// .done(refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService)
+// return ResponseEntity.ok(dtl)
+// }
+
+
+//
+// /**
+// * 微信支付
+// * wechattype
+// * qrcode-扫微信二维码支付
+// * app-原生app微信支付
+// * mp-微信公众号支付
+// * h5-微信h5支付
+// *
+// * */
+// @PostMapping("/wechat/payinit")
+// fun wechatPayInit(userid: String, amount: Int, manageFee: Int,
+// stuempno: String, shopid: String, transdate: String, transtime: String,
+// outtradeno: String, payinfo: String, feetype: String,
+// wechattype: String, realip: String?, qrcode: String?, openid: String?): ResponseEntity<Any> {
+// return try {
+// val paytype = paytypeService.getBySourceType(PaytypeUtil.WECHAT)
+// if (paytype == null || ConstantUtil.ENABLE_YES != paytype.enable) {
+// ResponseEntity.ok(ResponseBodyBuilder.create()
+// .fail(1, "支付方式未开启"))
+// }
+// val person = userService.findByThirdUniqueIdenty(stuempno)
+// val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+// .setTransDatetime(transdate, transtime)
+// .selectPaytype(PaytypeUtil.WECHAT, payinfo)
+// .setOuttradeno(outtradeno)
+// .also {
+// if (null != person) it.setOwner(person)
+// }
+// .tryLock(true)
+// .setTransinfo(TradeCode.TRANSCODE_WECHAT, "微信支付")
+// .chooseTradetype(Tradetype.CONSUME)
+// .also {
+// when (feetype) {
+// TradeDict.FEETYPE_CONSUME_MEALER -> {
+// it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT),
+// AccountHolder.shop(shopid),
+// amount / 100.0, "微信支付")
+// .addDetail(AccountHolder.transType(TranstypeCode.TT_CONSUUME_MANAGE_FEE)
+// .with(AccountHolder.shop(shopid)),
+// manageFee / 100.0)
+// }
+// TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
+// it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT),
+// AccountHolder.shop(shopid),
+// (amount - manageFee) / 100.0, "微信支付")
+// .addDetail(AccountHolder.subject(Subject.SUBJNO_CONSUME_DISCOUNT),
+// AccountHolder.shop(shopid),
+// manageFee / 100.0, "优惠折扣")
+// }
+// else -> {
+// it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT),
+// AccountHolder.shop(shopid),
+// amount / 100.0, "微信支付")
+// }
+// }
+// }.done(personBalancePayService, false)
+// val code = CallService.callWechatPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.WECHAT),
+// dtl, DateUtil.getNow(), wechattype, realip, qrcode, openid)
+// if (code.retcode == "0") {
+// ResponseEntity.ok(ResponseBodyBuilder.create()
+// .data("refno", dtl.refno)
+// .success())
+// } else {
+// ResponseEntity.ok(ResponseBodyBuilder.create()
+// .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易请求失败-${code.retcode}"))
+// }
+// } catch (e: TransactionException) {
+// ResponseEntity.ok(ResponseBodyBuilder.create()
+// .transException(e, "交易初始化异常"))
+// }
+// }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
new file mode 100644
index 0000000..3f909c5
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
@@ -0,0 +1,63 @@
+package com.supwisdom.dlpay.api.controller
+
+import com.supwisdom.dlpay.api.bean.DaliDatasyncParam
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.SysparaUtil
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.*
+
+@RequestMapping("/api/common")
+class DaliDatasyncApiController {
+ @Autowired
+ lateinit var systemUtilService: SystemUtilService
+
+ /**
+ * ============================================================================
+ * 大理卡管系统推送市民卡信息同步接口
+ * ============================================================================
+ * */
+ @PostMapping("/datasync")
+ @ResponseBody
+ fun daliDatasync(@RequestBody param: DaliDatasyncParam): ResponseEntity<Any> {
+ try {
+ param.checkParam()
+ val appid = systemUtilService.getSysparaValue(SysparaUtil.SYSPARAID_NO2019)
+ val appkey = systemUtilService.getSysparaValue(SysparaUtil.SYSPARAID_NO2020)
+ val deskey = systemUtilService.getSysparaValue(SysparaUtil.SYSPARAID_NO2021)
+ if (StringUtil.isEmpty(appid) || StringUtil.isEmpty(appkey) || StringUtil.isEmpty(deskey)) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(1000, "系统参数未配置"))
+ } else if (appid != param.app_id) {
+ throw RequestParamCheckException("请求参数错误[应用ID错误]")
+ }
+ if (!param.checkSign(appkey)) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(2001, "签名错误"))
+ }
+
+ val datalist = param.decData(deskey)
+ if (param.count != datalist.size) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(2002, "请求参数错误[数据条数不匹配]"))
+ }
+
+ datalist.forEach {
+ TODO("更新数据逻辑")
+ }
+
+ return return ResponseEntity.ok(mapOf("retcode" to "0000", "retmsg" to "SUCCESS"))
+ } catch (ex: RequestParamCheckException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(ex.errCode, ex.message ?: "请求参数错误"))
+ } catch (e: Exception) {
+ e.printStackTrace()
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(4000, "系统处理错误"))
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
new file mode 100644
index 0000000..d57c96d
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
@@ -0,0 +1,98 @@
+package com.supwisdom.dlpay.api.controller
+
+import com.supwisdom.dlpay.api.service.AccountUtilServcie
+import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.service.TransactionService
+import com.supwisdom.dlpay.framework.util.MD5
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.util.PaytypeUtil
+import org.dom4j.io.SAXReader
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.util.StringUtils
+import org.springframework.web.bind.annotation.PathVariable
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.ResponseBody
+import org.springframework.web.bind.annotation.RestController
+import java.util.*
+import javax.servlet.http.HttpServletRequest
+import javax.servlet.http.HttpServletResponse
+
+/**
+ * Created by shuwei on 2019/4/22.
+ */
+@RestController
+@RequestMapping("/api/notify")
+class NotifyController {
+ private val logger = LoggerFactory.getLogger(NotifyController::class.java)
+ @Autowired
+ lateinit var paytypeService: SourceTypeService
+ @Autowired
+ lateinit var accountUtilServcie: AccountUtilServcie
+
+ @Autowired
+ lateinit var transactionService: TransactionService
+
+ @RequestMapping(value = ["/wechat"])
+ @ResponseBody
+ fun index(@PathVariable schema: String, request: HttpServletRequest,
+ response: HttpServletResponse): String {
+ try {
+ // 解析结果存储在HashMap
+ var map: MutableMap<String, String> = HashMap()
+ val inputStream = request.inputStream
+ // 读取输入流
+ val reader = SAXReader()
+ val document = reader.read(inputStream)
+ // 得到xml根元素
+ val root = document.rootElement
+ // 得到根元素的所有子节点
+ val elementList = root.elements()
+ // 遍历所有子节点
+ for (e in elementList) {
+ map[e.name] = e.text
+ logger.error("*************" + e.name + "=" + e.text + "************************")
+ }
+ // 释放资源
+ inputStream.close()
+
+ val sign = map["sign"]
+ if (StringUtils.isEmpty(sign)) {
+ logger.error("签名错误")
+ return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>"
+ }
+ map = StringUtil.paraFilter(map)
+ //TODO 校验签名
+ var signStr = StringUtil.createLinkString(map)
+ val config = paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.WECHAT)
+ if (config["appkey"].isNullOrEmpty()) {
+ logger.error("签名错误")
+ return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>"
+ }
+ val key = config["appkey"]
+ signStr += "&key=$key"
+ val signRet = MD5.encodeByMD5(signStr)
+ logger.error("*******signStr=$signStr")
+ if (!signRet.equals(sign, ignoreCase = true)) {
+ return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>"
+ }
+ logger.error("*******signRet=$signRet,sign=$sign*****************")
+ val return_code = map["return_code"]
+ val result_code = map["result_code"]
+ val out_trade_no = map["out_trade_no"]
+ if (out_trade_no == null || StringUtils.isEmpty(out_trade_no)) {
+ return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[订单信息错误]]></return_msg></xml>"
+ }
+ if (!StringUtils.isEmpty(return_code) && "SUCCESS" == return_code
+ && !StringUtils.isEmpty(result_code) && "SUCCESS" == result_code) {
+ //map.get("transaction_id") 第三方流水号
+ transactionService.success(out_trade_no)
+ }
+ return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"
+ } catch (e: Exception) {
+ e.printStackTrace()
+ logger.error("------------step7----------------" + e.message)
+ return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[解析失败]]></return_msg></xml>"
+ }
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt
new file mode 100644
index 0000000..4cbb21e
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt
@@ -0,0 +1,80 @@
+package com.supwisdom.dlpay.api.controller
+
+import com.supwisdom.dlpay.api.bean.OpenShopParam
+import com.supwisdom.dlpay.api.bean.QueryShopParam
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.api.service.ShopService
+import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.framework.service.CommonService
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.*
+import java.net.URLDecoder
+import javax.servlet.http.HttpServletRequest
+import javax.servlet.http.HttpServletResponse
+
+@RestController
+@RequestMapping("/api/shop")
+class ShopAPIController {
+ @Autowired
+ private lateinit var shopService: ShopService
+ @Autowired
+ private lateinit var commonService: CommonService
+
+ @PostMapping("/open")
+ fun openAccount(@RequestBody param: OpenShopParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
+ try {
+ if (!param.checkParam() || !param.checkSign(commonService.getAppidSecretByRequest(request))) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
+ }
+ shopService.findByThirdUniqueId(param.shopUniqueId)?.let {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_SHOP_EXISTS, "该商户唯一号[${param.shopUniqueId}]已经存在"))
+ }
+
+ param.shopname = param.shopname.let { URLDecoder.decode(param.shopname, Charsets.UTF_8.toString()) } //解码
+ param.contactman = param.contactman?.let { URLDecoder.decode(param.contactman, Charsets.UTF_8.toString()) } //解码
+ param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码
+ shopService.registerShop(param).let {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("shopid", it.shopid)
+ .data("shopaccno", it.shopaccno ?: "")
+ .success("注册成功"))
+ }
+ } catch (ex: RequestParamCheckException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .requestException(ex, "请求参数错误"))
+ } catch (et: TransactionException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .transException(et, "业务处理错误"))
+ }
+ }
+
+ @GetMapping("/query")
+ fun queryShop(@RequestBody param: QueryShopParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
+ try {
+ if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
+ }
+
+ shopService.findByShopBySearch(param.shopid, param.shopaccno, param.shopUniqueId)?.let {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("shop", it)
+ .success())
+ }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.SHOP_NOT_EXISTS, "商户不存在"))
+ } catch (ex: RequestParamCheckException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .requestException(ex, "请求参数错误"))
+ } catch (et: TransactionException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .transException(et, "业务处理错误"))
+ }
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
new file mode 100644
index 0000000..4d63b19
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
@@ -0,0 +1,142 @@
+package com.supwisdom.dlpay.api.controller
+
+import com.supwisdom.dlpay.api.bean.ModifyUserParam
+import com.supwisdom.dlpay.api.bean.OpenUserParam
+import com.supwisdom.dlpay.api.bean.QueryUserParam
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException
+import com.supwisdom.dlpay.api.service.UserService
+import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.service.CommonService
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.PostMapping
+import org.springframework.web.bind.annotation.RequestBody
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+import java.net.URLDecoder
+import javax.servlet.http.HttpServletRequest
+import javax.servlet.http.HttpServletResponse
+
+@RestController
+@RequestMapping("/api/user")
+class UserAPIController {
+ @Autowired
+ private lateinit var useService: UserService
+ @Autowired
+ private lateinit var commonService: CommonService
+
+ @PostMapping("/open")
+ fun openAccount(@RequestBody param: OpenUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
+ try {
+
+ if (!param.checkParam() || !param.checkSign(commonService.getAppidSecretByRequest(request))) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
+ }
+ useService.findByThirdUniqueIdenty(param.uid).let {
+ if (null != it) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.REGISTER_USER_EXIST, "该用户唯一号已经注册"))
+ }
+
+ param.name = URLDecoder.decode(param.name, Charsets.UTF_8.toString()) //解码
+ param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码
+ useService.registerUser(param).let {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("userid", it.userid)
+ .data("uid", param.uid)
+ .success())
+ }
+ }
+ } catch (ex: RequestParamCheckException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .requestException(ex, "请求参数错误"))
+ } catch (et: TransactionException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .transException(et, "业务处理错误"))
+ }
+ }
+
+ @PostMapping("/query")
+ fun queryAccount(@RequestBody param: QueryUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
+ try {
+ if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
+ }
+
+ useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid).let {
+ if (null != it) {
+ val account = useService.findAccountByUserid(it.userid, null)
+ val pointacc = useService.findPointsAccountByUserid(it.userid)
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("userid", it.userid)
+ .data("name", it.name)
+ .data("idtype", it.idtype)
+ .data("idno", it.idno)
+ .data("mobile", it.mobile)
+ .data("email", it.email)
+ .data("status", it.status)
+ .data("balance", account.let {
+ if (null == it) {
+ 0.0
+ } else {
+ it.availbal
+ }
+ }) //账户余额
+ .data("points", pointacc.let {
+ if (null == it) {
+ 0
+ } else {
+ it.points
+ }
+ }) //积分
+ .success())
+ }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在"))
+ }
+ } catch (ex: RequestParamCheckException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .requestException(ex, "请求参数错误"))
+ } catch (et: TransactionException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .transException(et, "业务处理错误"))
+ }
+ }
+
+ @PostMapping("/modify")
+ fun modifyAccount(@RequestBody param: ModifyUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
+ try {
+ if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
+ }
+ useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid)?.let {
+ param.name = param.name?.let { URLDecoder.decode(param.name, Charsets.UTF_8.toString()) } //解码
+ param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码
+ if (useService.modifyUserInfo(it, param)) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .success("修改成功"))
+ } else {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "账户信息修改失败"))
+ }
+ }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在"))
+ } catch (ex: RequestParamCheckException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .requestException(ex, "请求参数错误"))
+ } catch (et: TransactionException) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .transException(et, "业务处理错误"))
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
new file mode 100644
index 0000000..0e6d694
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.api
+
+import com.supwisdom.dlpay.api.domain.TShopdtl
+import com.supwisdom.dlpay.api.repositories.ShopaccService
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.scheduling.annotation.Scheduled
+import org.springframework.stereotype.Service
+
+@Service
+class MySchedulerTask {
+ @Autowired
+ private lateinit var shopaccService: ShopaccService
+
+ fun doShopBlanceUpdate(dtl: TShopdtl) {
+ shopaccService.recalcShopBalance(dtl.refno, true)
+ }
+
+ @Scheduled(cron = "\${shopbalance.updater.cron:-}")
+ fun dealShopUnupdatedDtl() {
+ shopaccService.findUnupdatedShopDtl(100).forEach {
+ doShopBlanceUpdate(it)
+ }
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/charge_api_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/charge_api_service.kt
new file mode 100644
index 0000000..2ac22fb
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/charge_api_service.kt
@@ -0,0 +1,17 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.api.domain.TPersondtl
+import com.supwisdom.dlpay.api.domain.TTransactionMain
+import org.springframework.transaction.annotation.Propagation
+import org.springframework.transaction.annotation.Transactional
+
+interface ChargeApiService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
+ fun checkRechargeSourcetype(sourceType: String): Boolean
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
+ fun getTransactionMainDtl(refno: String?, billno: String?, outid: String?): TTransactionMain?
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
+ fun getPersonDtl(refno: String): TPersondtl
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
new file mode 100644
index 0000000..ec92ddc
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
@@ -0,0 +1,19 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.api.domain.TTransactionMain
+import org.springframework.transaction.annotation.Propagation
+import org.springframework.transaction.annotation.Transactional
+
+interface ConsumePayService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
+ fun checkShopPaytype(shopaccno: String, sourceType: String, anonymousflag: Boolean? = false): Boolean
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
+ fun getPaytypeConfig(paytype: String, shopaccno: String, anonymousflag: Boolean? = false, ignoreStatus: Boolean? = false): Map<String, String?>
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
+ fun getUserdtlExtendParamMap(refno: String): Map<String, String>
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
+ fun getTransactionMainDtl(refno: String?, billno: String?, shopaccno: String?): TTransactionMain?
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/account_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/account_service_impl.kt
new file mode 100644
index 0000000..6e6ade4
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/account_service_impl.kt
@@ -0,0 +1,149 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.dao.DebitCreditDtlDao
+import com.supwisdom.dlpay.api.dao.TransactionMainDao
+import com.supwisdom.dlpay.api.domain.*
+import com.supwisdom.dlpay.api.repositories.AccountService
+import com.supwisdom.dlpay.api.repositories.ShopaccService
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.domain.TShopacc
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.DateUtil
+import com.supwisdom.dlpay.framework.util.Subject
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.framework.util.TradeDict.DTL_STATUS_SUCCESS
+import com.supwisdom.dlpay.framework.util.TradeDict.TRADE_FLAG_OUT
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.hibernate.Transaction
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Repository
+import org.springframework.stereotype.Service
+import java.sql.Timestamp
+import javax.persistence.EntityManager
+import javax.persistence.LockModeType
+import javax.persistence.OptimisticLockException
+import javax.persistence.PersistenceContext
+
+@Service
+class AccountServiceImpl : AccountService {
+
+ @PersistenceContext
+ private lateinit var entityManager: EntityManager
+
+ @Autowired
+ private lateinit var systemUtilServcie: SystemUtilService
+
+ private fun newAccounDayBal(dtl: TPersondtl, account: TAccount): TAccountDayBal {
+ return TAccountDayBal().apply {
+ accno = account.accno
+ accdate = dtl.accdate
+ amount = 0.0
+ updateTime = systemUtilServcie.sysdatetime.sysdate
+ checked = false
+ }
+ }
+
+ private fun doRecalcAccountBalance(dtl: TPersondtl, amount: Double, account: TAccount): TAccountDayBal {
+ val accountDayBal = entityManager.find(TAccountDayBal::class.java,
+ TAccountDayBalPk().also {
+ it.accno = account.accno
+ it.accdate = dtl.accdate
+ }, LockModeType.OPTIMISTIC) ?: newAccounDayBal(dtl, account)
+
+ accountDayBal.also {
+ it.lastRefno = dtl.refno
+ it.amount += amount
+ }.also {
+ entityManager.persist(it)
+ }
+
+ return accountDayBal
+ }
+
+ override fun recalcAccountBalance(dtl: TPersondtl, amount: Double, overdraft: Boolean) {
+ entityManager.find(TAccount::class.java, dtl.accountNo, LockModeType.OPTIMISTIC)
+ ?.let { account ->
+ if (!overdraft && account.availbal + dtl.amount < 0) {
+ throw TransactionProcessException(TradeErrorCode.SHORT_BALANCE_ERROR, "个人账户余额不足")
+ }
+ dtl.befbal = account.availbal
+ doRecalcAccountBalance(dtl, amount, account)
+ account.availbal += dtl.amount
+ account.balance += dtl.amount
+
+ val sameDay = DateUtil.sameDay(account.lasttranstime,
+ systemUtilServcie.sysdatetime.sysdate) ?: false
+
+ if (!sameDay) {
+ account.lastdayTransamt = 0.0
+ account.lastdayDpsamt = 0.0
+ }
+ if (dtl.tradeflag == TRADE_FLAG_OUT) {
+ account.lastdayTransamt += amount
+ } else {
+ account.lastdayDpsamt += amount
+ }
+ try {
+ entityManager.persist(account)
+ } catch (ex: OptimisticLockException) {
+ throw TransactionProcessException(TradeErrorCode.ACCOUNT_TRADE_BUSY,
+ "个人账户被被更新")
+ }
+ } ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+ "交易流水<${dtl.refno}>未找到指定个人账户")
+ }
+}
+
+@Repository
+class ShopaccServiceImpl : ShopaccService {
+ @PersistenceContext
+ private lateinit var entityManager: EntityManager
+
+ @Autowired
+ private lateinit var systemUtilService: SystemUtilService
+
+ @Autowired
+ private lateinit var transactionMainDao: TransactionMainDao
+
+ override fun recalcShopBalance(dtl: TShopdtl, amount: Double, overdraft: Boolean) {
+ val shopacc = entityManager.find(TShopacc::class.java, dtl.shopaccno, LockModeType.OPTIMISTIC)
+ ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS,
+ "商户账户<${dtl.shopaccno}>不存在")
+
+ shopacc.balance += amount
+ if (shopacc.balance < 0.0 && !overdraft) {
+ throw TransactionProcessException(TradeErrorCode.SHORT_BALANCE_ERROR,
+ "商户账户余额不足")
+ }
+ entityManager.persist(shopacc)
+ }
+
+ override fun recalcShopBalance(refno: String, overdraft: Boolean) {
+ val shopdtl = entityManager.find(TShopdtl::class.java, refno, LockModeType.PESSIMISTIC_WRITE)
+ ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
+ "商户流水<$refno>不存在")
+ if (shopdtl.updateBala) {
+ return
+ }
+ val amount = transactionMainDao.findByRefno(refno)?.sumAmountByAccno(shopdtl.shopaccno,
+ Subject.SUBJNO_MACHANT_INCOME, "both")
+ ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
+ "交易参考号<$refno>不存在")
+ recalcShopBalance(shopdtl, amount, overdraft)
+ shopdtl.updateBala = true
+ entityManager.persist(shopdtl)
+ }
+
+ override fun findUnupdatedShopDtl(maxCount: Int): List<TShopdtl> {
+ val startTime = Timestamp(systemUtilService.sysdatetime.sysdate.time - TIME_MINITUES)
+ return entityManager.createQuery("""
+ SELECT p FROM TShopdtl p, TTransactionMain m
+ WHERE m.refno=p.refno and p.status='$DTL_STATUS_SUCCESS' and p.updateBala=false
+ and m.endTime < '$startTime'
+ ORDER BY p.refno""", TShopdtl::class.java).setMaxResults(maxCount).resultList
+ }
+
+ companion object {
+ private const val TIME_MINITUES = 5 * 60 * 1000
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/charge_api_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/charge_api_service_impl.kt
new file mode 100644
index 0000000..3122da3
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/charge_api_service_impl.kt
@@ -0,0 +1,48 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.dao.PersondtlDao
+import com.supwisdom.dlpay.api.dao.SourceTypeDao
+import com.supwisdom.dlpay.api.dao.TransactionMainDao
+import com.supwisdom.dlpay.api.domain.TPersondtl
+import com.supwisdom.dlpay.api.domain.TTransactionMain
+import com.supwisdom.dlpay.api.service.ChargeApiService
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+@Service
+class ChargeApiServiceImpl : ChargeApiService {
+ @Autowired
+ lateinit var sourceTypeDao: SourceTypeDao
+ @Autowired
+ lateinit var transactionMainDao: TransactionMainDao
+ @Autowired
+ lateinit var persondtlDao: PersondtlDao
+
+ override fun checkRechargeSourcetype(sourceType: String): Boolean {
+ sourceTypeDao.getBySourceType(sourceType).let {
+ if (null == it) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统不支持支付方式[$sourceType]")
+ } else {
+ if (!it.enable || !it.chargeEnable) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统充值未启用支付方式[$sourceType]")
+ }
+ }
+ }
+
+ return true
+ }
+
+ override fun getTransactionMainDtl(refno: String?, billno: String?, outid: String?): TTransactionMain? {
+ return when (!StringUtil.isEmpty(refno)) {
+ true -> transactionMainDao.findByRefno(refno)
+ false -> transactionMainDao.findByBillno(billno, outid)
+ }
+ }
+
+ override fun getPersonDtl(refno: String): TPersondtl{
+ return persondtlDao.getOne(refno)
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
new file mode 100644
index 0000000..f367feb
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
@@ -0,0 +1,111 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.dao.SourceTypeDao
+import com.supwisdom.dlpay.api.dao.ShopPaytypeConfigDao
+import com.supwisdom.dlpay.api.dao.ShopPaytypeDao
+import com.supwisdom.dlpay.api.dao.TransactionMainDao
+import com.supwisdom.dlpay.api.domain.TTransactionMain
+import com.supwisdom.dlpay.api.service.ConsumePayService
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.util.ConstantUtil
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+@Service
+class ConsumePayServiceImpl : ConsumePayService {
+ @Autowired
+ lateinit var sourceTypeDao: SourceTypeDao
+ @Autowired
+ lateinit var shopPaytypeDao: ShopPaytypeDao
+ @Autowired
+ lateinit var shopPaytypeConfigDao: ShopPaytypeConfigDao
+ @Autowired
+ lateinit var transactionMainDao: TransactionMainDao
+
+ override fun checkShopPaytype(shopaccno: String, sourceType: String, anonymousflag: Boolean?): Boolean {
+ sourceTypeDao.getBySourceType(sourceType).let {
+ if (null == it) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统不支持支付方式[$sourceType]")
+ } else {
+ if (!it.enable || !it.consumeEnable) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统未启用支付方式[$sourceType]消费")
+ }
+ if (true == anonymousflag && !it.anonymousEnable) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统支付方式[$sourceType]未启用匿名消费")
+ }
+ }
+ }
+ shopPaytypeDao.getById(sourceType, shopaccno).let {
+ if (null == it) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$sourceType]")
+ } else {
+ if (!it.consumeEnable) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$sourceType]")
+ }
+ if (true == anonymousflag && !it.anonymousEnable) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$sourceType]未启用匿名消费")
+ }
+ }
+ }
+ return true
+ }
+
+ override fun getPaytypeConfig(paytype: String, shopaccno: String,
+ anonymousflag: Boolean?, ignoreStatus: Boolean?): Map<String, String?> {
+ sourceTypeDao.getBySourceType(paytype).let {
+ if (null == it) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统不支持支付方式[$paytype]")
+ } else {
+ //对账取配置时不关心状态,不能报错
+ if (true != ignoreStatus && (!it.enable || !it.consumeEnable)) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统未启用支付方式[$paytype]消费")
+ }
+ if (true != ignoreStatus && true == anonymousflag && !it.anonymousEnable) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统支付方式[$paytype]未启用匿名消费")
+ }
+ }
+ }
+
+ shopPaytypeDao.getById(paytype, shopaccno).let {
+ if (null == it) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
+ } else {
+ //对账取配置时不关心状态,不能报错
+ if (true != ignoreStatus && !it.consumeEnable) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
+ }
+ if (true != ignoreStatus && true == anonymousflag && !it.anonymousEnable) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未启用匿名消费")
+ }
+ }
+ }
+
+ shopPaytypeConfigDao.getShopPaytypeConfigs(paytype, shopaccno)?.let {
+ if (it.size < 1) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
+ } else {
+ val result = mutableMapOf<String, String?>()
+ it.forEach { paytypeConfig ->
+ result.plus(mapOf(paytypeConfig.configid to paytypeConfig.configValue))
+ }
+ return result
+ }
+ }
+ ?: throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
+ }
+
+ override fun getTransactionMainDtl(refno: String?, billno: String?, shopaccno: String?): TTransactionMain? {
+ return when (!StringUtil.isEmpty(refno)) {
+ true -> transactionMainDao.findByRefno(refno)
+ false -> transactionMainDao.findByBillno(billno, shopaccno)
+ }
+ }
+
+ override fun getUserdtlExtendParamMap(refno: String): Map<String, String> {
+ TODO("未实现方法")
+ }
+
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
new file mode 100644
index 0000000..e54f063
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
@@ -0,0 +1,72 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.dao.AccountDao
+import com.supwisdom.dlpay.api.domain.TAccount
+import com.supwisdom.dlpay.api.service.AccountUtilServcie
+import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.dao.FeetypeConfigDao
+import com.supwisdom.dlpay.framework.dao.ShopaccDao
+import com.supwisdom.dlpay.framework.dao.SubjectDao
+import com.supwisdom.dlpay.framework.domain.TFeetypeConfig
+import com.supwisdom.dlpay.framework.domain.TShopacc
+import com.supwisdom.dlpay.framework.domain.TSubject
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.hibernate.exception.LockTimeoutException
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.dao.CannotAcquireLockException
+import org.springframework.stereotype.Service
+
+
+@Service
+class AccountUtilServcieImpl : AccountUtilServcie {
+
+ @Autowired
+ lateinit var accountDao: AccountDao
+
+ @Autowired
+ lateinit var shopaccDao: ShopaccDao
+
+ @Autowired
+ lateinit var subjectDao: SubjectDao
+
+ @Autowired
+ lateinit var feetypeConfigDao: FeetypeConfigDao
+
+ override fun readAccountForUpdateNowait(userid: String): TAccount {
+ return try {
+ accountDao.getByUseridForUpdateNowait(userid)
+ ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户<$userid>不存在")
+ } catch (ex: Exception) {
+ when (ex) {
+ is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "账户<$userid>交易繁忙,请稍后再试")
+ else -> throw ex
+ }
+ }
+ }
+
+ override fun readAccount(userid: String): TAccount {
+ return accountDao.findByUserid(userid)
+ ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户<$userid>不存在")
+ }
+
+ override fun readShopAcc(shopId: Int): TShopacc {
+ return shopaccDao.findByShopid(shopId)
+ ?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户<$shopId>不存在")
+ }
+
+ override fun readShopbyShopaccno(shopaccno: String): TShopacc {
+ return shopaccDao.findByShopaccno(shopaccno)
+ ?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户<$shopaccno>不存在")
+ }
+
+ override fun readSubject(subjno: String): TSubject {
+ return subjectDao.findBySubjno(subjno)
+ ?: throw TransactionProcessException(TradeErrorCode.SUBJECT_NOT_EXISTS, "科目<$subjno>不存在")
+ }
+
+ override fun readFeetype(feetype: String, paytype: String): TFeetypeConfig {
+ return feetypeConfigDao.getById(feetype, paytype)
+ ?: throw TransactionProcessException(TradeErrorCode.FEETYPE_NOT_EXISTS, "在支付方式<$paytype>下不存在费用类别<$feetype>")
+ }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt
new file mode 100644
index 0000000..07c6c40
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt
@@ -0,0 +1,94 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.bean.OpenShopParam
+import com.supwisdom.dlpay.framework.dao.ShopDao
+import com.supwisdom.dlpay.framework.dao.ShopaccDao
+import com.supwisdom.dlpay.framework.domain.TShop
+import com.supwisdom.dlpay.framework.domain.TShopacc
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.Subject
+import com.supwisdom.dlpay.api.service.ShopService
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.util.ConstantUtil
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+/**
+ * Created by shuwei on 2019/4/15.
+ */
+@Service
+class ShopServiceImpl : ShopService {
+ @Autowired
+ private lateinit var shopDao: ShopDao
+ @Autowired
+ private lateinit var shopaccDao: ShopaccDao
+ @Autowired
+ private lateinit var systemUtilService: SystemUtilService
+
+ override fun findByThirdUniqueId(uniqueId: String): TShop? {
+ return shopDao.getByThirdUniqueIdenty(uniqueId)
+ }
+
+ override fun registerShop(param: OpenShopParam): TShop {
+ val systemdatetime = systemUtilService.sysdatetime
+ var shop = shopDao.getByThirdUniqueIdentyForUpdate(param.shopUniqueId)
+ if (null != shop) {
+ throw TransactionProcessException(TradeErrorCode.BUSINESS_SHOP_EXISTS, "该商户唯一号[${param.shopUniqueId}]已经存在")
+ }
+ if (null != param.fshopid) {
+ shopDao.getTShopByShopid(param.fshopid).let {
+ if (null == it) {
+ throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "上级商户不存在已经存在")
+ }
+ }
+ }
+ shop = shopDao.save(TShop().apply {
+ fshopid = param.fshopid
+ shopname = param.shopname
+ shoptype = param.shoptype
+ status = TradeDict.STATUS_NORMAL
+ contactman = param.contactman
+ idtype = param.idtype
+ idno = param.idno
+ mobile = param.mobile
+ email = param.email
+ addr = param.address
+ zipcode = param.zipcode
+ opendate = systemdatetime.hostdate
+ thirdUniqueIdenty = param.shopUniqueId
+ })
+ if (ConstantUtil.SHOPTYPE_GROUP != shop.shoptype) {
+ //非商户组要创建账号
+ val shopaccno = String.format("2%09d", shop.shopid)
+ shopaccDao.save(TShopacc().apply {
+ this.shopaccno = shopaccno
+ this.shopid = shop.shopid
+ this.shopname = shop.shopname
+ this.subjno = Subject.SUBJNO_MACHANT_INCOME
+ this.status = TradeDict.STATUS_NORMAL
+ this.opendate = shop.opendate
+ })
+ shop.shopaccno = shopaccno
+ shopDao.save(shop) //更新账号
+ }
+ return shop
+ }
+
+ override fun findByShopId(shopid: Int): TShop {
+ return shopDao.getTShopByShopid(shopid)
+ ?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户[ID=$shopid]不存在")
+ }
+
+ override fun findByShopBySearch(shopid: Int?, shopaccno: String?, shopUniqueId: String?): TShop? {
+ return if (null != shopid) {
+ shopDao.getTShopByShopid(shopid)
+ } else if (!StringUtil.isEmpty(shopaccno)) {
+ shopDao.getTShopByShopaccno(shopaccno)
+ } else {
+ shopDao.getByThirdUniqueIdenty(shopUniqueId)
+ }
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
new file mode 100644
index 0000000..44598d1
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -0,0 +1,506 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.TransactionBuilder
+import com.supwisdom.dlpay.api.dao.AccountDao
+import com.supwisdom.dlpay.api.dao.TransactionMainDao
+import com.supwisdom.dlpay.api.domain.*
+import com.supwisdom.dlpay.api.repositories.AccountService
+import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.service.TransactionService
+import com.supwisdom.dlpay.exception.TransactionCheckException
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.dao.ShopaccDao
+import com.supwisdom.dlpay.framework.dao.SubjectDao
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.tenant.TenantContext
+import com.supwisdom.dlpay.framework.util.Subject
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+import java.sql.SQLException
+import kotlin.math.absoluteValue
+
+
+@Service
+class TransactionServiceImpl : TransactionService {
+ @Autowired
+ private lateinit var transactionMainDao: TransactionMainDao
+
+ @Autowired
+ private lateinit var accountService: AccountService
+
+ @Autowired
+ private lateinit var accountDao: AccountDao
+
+ @Autowired
+ private lateinit var shopaccDao: ShopaccDao
+
+ @Autowired
+ private lateinit var subjectDao: SubjectDao
+
+ @Autowired
+ private lateinit var systemUtilService: SystemUtilService
+
+ @Autowired
+ private lateinit var sourceTypeService: SourceTypeService
+
+ /// 公共函数部分
+ private fun preCheck(builder: TransactionBuilder) {
+ builder.preCheck()
+ }
+
+ private fun getDebitOrCredit(tradeFlag: String, reverseTrans: Boolean): String {
+ return when (tradeFlag) {
+ TradeDict.TRADE_FLAG_IN -> if (!reverseTrans) "credit" else "debit"
+ TradeDict.TRADE_FLAG_OUT -> if (!reverseTrans) "debit" else "credit"
+ else -> "both"
+ }
+ }
+
+ private fun getTransAmountFromDetail(@Suppress("UNUSED_PARAMETER") builder: TransactionBuilder,
+ amount: Double): Double {
+ return amount
+ }
+
+ private fun builderRecords(builder: TransactionBuilder, status: String): TTransactionMain {
+ try {
+ preCheck(builder)
+ val sourceType = sourceTypeService.getByPaytype(builder.sourceType)
+ ?: throw TransactionCheckException(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT,
+ "交易源未定义,sourctype <${builder.sourceType}>")
+ // 记录三方的交易流水(个人,商户,科目)
+ val transaction = TTransactionMain().apply {
+ refno = systemUtilService.refno
+ accdate = systemUtilService.accdate
+ outTradeNo = builder.outtradeno
+ outId = builder.outId
+ createTime = systemUtilService.sysdatetime.sysdate
+ operid = builder.operId
+ opertype = builder.operType
+ reverseFlag = TradeDict.REVERSE_FLAG_NONE
+ checkable = sourceType.checkable
+ transCode = builder.transCode
+ reverseType = builder.reverseType
+ reverseRefno = builder.reverseRefno
+ refundAmount = 0.0
+ checkDate = null
+ settleDate = null
+ tenantid = TenantContext.getTenantSchema()
+ this.sourceType = sourceType.sourceType
+ }
+
+ if (builder.hasPerson()) {
+ TPersondtl().apply {
+ this.refno = transaction.refno
+ this.accdate = transaction.accdate
+ userid = builder.person().person.userid
+ accountNo = builder.person().person.accno
+ userName = builder.person().person.accname
+ outtradeno = builder.outtradeno
+ transdate = builder.transDate
+ transtime = builder.transTime
+ befbal = builder.person().person.availbal
+ amount = builder.person().amount
+ this.sourceType = builder.sourceType
+ payinfo = builder.person().payinfo
+ transcode = builder.transCode
+ tradeflag = builder.person().tradeFlag
+ transdesc = builder.person().description
+ oppositeAccNo = builder.person().oppositeAccNo()
+ oppositeAccName = builder.person().oppositeAccName()
+ this.reverseFlag = TradeDict.REVERSE_FLAG_NONE
+ remark = builder.person().remark
+ tenantid = transaction.tenantid
+ this.status = status
+ }.also {
+ // persondtlDao.save(it)
+ transaction.personDtl = it
+ transaction.person = true
+ }
+ }
+ if (builder.hasShop()) {
+ TShopdtl().apply {
+ this.refno = transaction.refno
+ this.accdate = transaction.accdate
+ this.amount = builder.shop().amount
+ this.payInfo = builder.shop().payinfo
+ this.sourceType = builder.sourceType
+ this.transdate = builder.transDate
+ this.transtime = builder.transTime
+ this.transcode = builder.transCode
+ this.sourceType = builder.sourceType
+ this.amount = builder.shop().amount
+ this.tradeflag = builder.shop().tradeFlag
+ this.shopaccno = builder.shop().shopacc.shopaccno
+ this.shopname = builder.shop().shopacc.shopname
+ this.transdesc = builder.shop().description
+ this.oppositeAccNo = builder.shop().oppositeAccNo()
+ this.oppositeAccName = builder.shop().oppositeAccName()
+ this.remark = builder.shop().remark
+ this.reverseFlag = TradeDict.REVERSE_FLAG_NONE
+ this.updateBala = false
+ this.tenantid = transaction.tenantid
+ this.status = status
+ }.also {
+ // save shopdtl
+ transaction.shopDtl = it
+ transaction.shop = true
+ }
+ }
+ if (builder.hasSubject()) {
+ // save subjectdtl
+ TSubjectdtl().apply {
+ this.refno = transaction.refno
+ this.accdate = transaction.accdate
+ this.amount = builder.subject().amount
+ this.payInfo = builder.subject().payinfo
+ this.payType = builder.sourceType
+ this.tradeCode = builder.transCode
+ this.transDate = builder.transDate
+ this.transTime = builder.transTime
+ this.oppositeAccNo = builder.subject().oppositeAccNo()
+ this.oppositeAccName = builder.subject().oppositeAccName()
+ this.tenantid = transaction.tenantid
+ this.status = status
+ }.also {
+ transaction.subjectDtl = it
+ transaction.subject = true
+ }
+ }
+
+ builder.getAllDetails().map { line ->
+ TDebitCreditDtl().apply {
+ this.refno = transaction.refno
+ this.seqno = line.seqno
+ this.draccno = line.debitAccNo
+ this.drsubjno = line.debitSubjNo
+ this.craccno = line.creditAccNo
+ this.crsubjno = line.creditSubjNo
+ this.amount = line.amount
+ this.summary = line.summary
+ this.settleDate = null
+ this.tenantid = transaction.tenantid
+ }
+ }.apply {
+ transaction.details = this
+ }
+
+
+ if (builder.hasPerson()) {
+ val dc = getDebitOrCredit(builder.person().tradeFlag, builder.isReverseTrans())
+ transaction.sumAmountByAccno(builder.person().person.accno,
+ Subject.SUBJNO_PERSONAL_DEPOSIT,
+ dc).also {
+ if (transaction.personDtl.amount != getTransAmountFromDetail(builder, it)) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR,
+ "输入金额错误,个人余额不符<${transaction.personDtl.amount}>")
+ }
+ }
+ }
+
+ if (builder.hasShop()) {
+ val dc = getDebitOrCredit(builder.shop().tradeFlag, builder.isReverseTrans())
+ transaction.sumAmountByAccno(builder.shop().shopacc.shopaccno,
+ Subject.SUBJNO_MACHANT_INCOME, dc).also {
+ if (transaction.shopDtl.amount != getTransAmountFromDetail(builder, it)) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR,
+ "输入金额错误,商户余额不符<${transaction.shopDtl.amount}>")
+ }
+ }
+ }
+
+ if (builder.hasSubject()) {
+ transaction.sumAmountByAccno(builder.subject().subject.subjno,
+ builder.subject().subject.subjno, "both").also {
+ val amount = if (builder.reverseType != TradeDict.REVERSE_FLAG_NONE) {
+ -it
+ } else {
+ it
+ }
+ if (transaction.subjectDtl.amount != amount) {
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR,
+ "输入金额错误,科目余额不符<${transaction.subjectDtl.amount}>")
+ }
+ }
+ }
+
+ transaction.status = status
+ transactionMainDao.save(transaction)
+ return transaction
+ } catch (ex: SQLException) {
+ throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, ex.message)
+ }
+ }
+
+
+ private fun updateRecordStatus(transaction: TTransactionMain, status: String) {
+ if (transaction.person) {
+ transaction.personDtl?.also {
+ if (it.status != transaction.status) {
+ throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED,
+ "个人流水<${transaction.refno}>状态错误")
+ }
+ it.status = status
+ } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
+ "个人流水<${transaction.refno}>不存在")
+ }
+
+ if (transaction.shop) {
+ transaction.shopDtl?.also {
+ if (it.status != transaction.status) {
+ throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED,
+ "商户流水<${transaction.refno}>状态错误")
+ }
+ it.status = status
+ } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
+ "商户流水<${transaction.refno}>不存在")
+ }
+
+ if (transaction.subject) {
+ transaction.subjectDtl?.also {
+ if (it.status != transaction.status) {
+ throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED,
+ "科目流水<${transaction.refno}>状态错误")
+ }
+ it.status = status
+ } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
+ "科目流水<${transaction.refno}>不存在")
+ }
+ transaction.status = status
+ }
+
+ /////////////////////////////////////////////////////////////////////
+// 业务接口
+ override fun init(builder: TransactionBuilder): TTransactionMain {
+ return builderRecords(builder, TradeDict.DTL_STATUS_INIT)
+ }
+
+ override fun wip(builder: TransactionBuilder): TTransactionMain {
+ return builderRecords(builder, TradeDict.DTL_STATUS_WIP)
+ }
+
+ override fun wip(refno: String): TTransactionMain {
+ val transaction = transactionMainDao.findByRefnoForUpdate(refno)
+ ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>参考号错误")
+
+ if (transaction.status != TradeDict.DTL_STATUS_INIT
+ && transaction.status != TradeDict.DTL_STATUS_WIP) {
+ throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>状态错误")
+ }
+
+ updateRecordStatus(transaction, TradeDict.DTL_STATUS_WIP)
+ transactionMainDao.save(transaction)
+ return transaction
+ }
+
+ override fun fail(refno: String): TTransactionMain {
+ return fail(refno, "")
+ }
+
+ override fun fail(refno: String, remark: String): TTransactionMain {
+ val transaction = transactionMainDao.findByRefnoForUpdate(refno)
+ ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>参考号错误")
+
+ val errorStatus = setOf(TradeDict.DTL_STATUS_SUCCESS, TradeDict.DTL_STATUS_CANCEL)
+ if (transaction.status in errorStatus) {
+ throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>状态错误")
+ }
+
+ updateRecordStatus(transaction, TradeDict.DTL_STATUS_FAIL)
+ if (transaction.person) {
+ transaction.personDtl.remark = remark
+ }
+ if (transaction.shop) {
+ transaction.shopDtl.remark = remark
+ }
+ transaction.endTime = systemUtilService.sysdatetime.sysdate
+ transactionMainDao.save(transaction)
+ return transaction
+ }
+
+ //////////////////////////////////////////////////////////////////
+// 成功
+ private fun transactionOnSuccess(transaction: TTransactionMain, remark: String, overdraft: Boolean) {
+ if (transaction.person) {
+ // update account balance
+ val amount = transaction.sumAmountByAccno(
+ transaction.personDtl.accountNo, Subject.SUBJNO_PERSONAL_DEPOSIT,
+ "both")
+ if (amount.absoluteValue.compareTo(0.0) != 0) {
+ transaction.personDtl?.let {
+ transaction.personDtl.accdate = transaction.accdate
+ accountService.recalcAccountBalance(it, amount, overdraft)
+ } ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
+ "个人流水<${transaction.refno}>不存在")
+ }
+ transaction.personDtl.status = TradeDict.DTL_STATUS_SUCCESS
+ transaction.personDtl.remark = remark
+ }
+ if (transaction.shop) {
+ transaction.shopDtl.updateBala = false
+ transaction.shopDtl.status = TradeDict.DTL_STATUS_SUCCESS
+ transaction.shopDtl.accdate = transaction.accdate
+ transaction.shopDtl.remark = remark
+ }
+
+ if (transaction.subject) {
+ // update subject balance
+ }
+ }
+
+ override fun success(refno: String, remark: String): TTransactionMain {
+ val transaction = transactionMainDao.findByRefnoForUpdate(refno)
+ ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "参考号<$refno>错误,流水不存在")
+
+ val errorStatus = setOf(TradeDict.DTL_STATUS_SUCCESS, TradeDict.DTL_STATUS_CANCEL)
+ if (transaction.status in errorStatus) {
+ throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>状态错误,流水已结束")
+ }
+ transaction.status = TradeDict.DTL_STATUS_SUCCESS
+ transaction.accdate = systemUtilService.accdate
+ transactionOnSuccess(transaction, remark, false)
+
+ transaction.endTime = systemUtilService.sysdatetime.sysdate
+ transactionMainDao.save(transaction)
+ return transaction
+ }
+
+ override fun success(refno: String): TTransactionMain {
+ return success(refno, "")
+ }
+
+ //////////////////////////////////////////////////////////////////
+// 回退业务接口,包括撤销和退款
+ override fun refundInit(originRefno: String, refundAmount: Double, builder: TransactionBuilder): TTransactionMain {
+ val originTrans = transactionMainDao.findByRefnoForUpdate(originRefno)
+ ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS
+ , "被退款流水不存在")
+ if (originTrans.status != TradeDict.DTL_STATUS_SUCCESS) {
+ throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+ "原流水不是成功状态")
+ }
+ if (originTrans.reverseFlag != TradeDict.REVERSE_FLAG_NONE
+ || originTrans.reverseFlag != TradeDict.REVERSE_FLAG_REFUND) {
+ throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+ "原流水已被退款")
+ }
+
+ doReversePrepareAndCheck(originTrans, builder)
+ builder.preCheck()
+ val transaction = doReverseProcess(originTrans, builder)
+
+ originTrans.reverseFlag = TradeDict.REVERSE_FLAG_REFUND
+ originTrans.refundAmount = refundAmount
+ transactionMainDao.save(originTrans)
+ return transaction
+ }
+
+ override fun cancelInit(originRefno: String, builder: TransactionBuilder): TTransactionMain {
+ val originTrans = transactionMainDao.findByRefnoForUpdate(originRefno)
+ ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS
+ , "被冲正流水不存在")
+ if (originTrans.status != TradeDict.DTL_STATUS_SUCCESS) {
+ throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+ "原流水不是成功状态")
+ }
+ if (originTrans.reverseFlag != TradeDict.REVERSE_FLAG_NONE) {
+ throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+ "原流水已被冲正")
+ }
+
+ doReversePrepareAndCheck(originTrans, builder)
+ val transaction = doReverseProcess(originTrans, builder)
+
+ originTrans.reverseFlag = TradeDict.REVERSE_FLAG_CANCEL
+ transactionMainDao.save(originTrans)
+ return transaction
+ }
+
+ private fun getOppositeTradeFlag(flag: String): String {
+ return when (flag) {
+ TradeDict.TRADE_FLAG_IN -> TradeDict.TRADE_FLAG_OUT
+ TradeDict.TRADE_FLAG_OUT -> TradeDict.TRADE_FLAG_IN
+ else -> "unknown"
+ }
+ }
+
+ private fun getReverseSuffix(t: String): String {
+ return when (t) {
+ TradeDict.REVERSE_FLAG_CANCEL -> "撤销"
+ TradeDict.REVERSE_FLAG_REFUND -> "退款"
+ TradeDict.REVERSE_FLAG_NONE -> ""
+ else -> ""
+ }
+ }
+
+ private fun doReverseProcess(originTrans: TTransactionMain, builder: TransactionBuilder): TTransactionMain {
+
+ if (originTrans.person) {
+ builder.person().apply {
+ setAmount(-originTrans.personDtl.amount, getOppositeTradeFlag(originTrans.personDtl.tradeflag))
+ setOpposite(originTrans.personDtl.oppositeAccNo, originTrans.personDtl.oppositeAccName)
+ }
+ }
+ if (originTrans.shop) {
+ builder.shop().apply {
+ setAmount(-originTrans.shopDtl.amount, getOppositeTradeFlag(originTrans.shopDtl.tradeflag))
+ setOpposite(originTrans.shopDtl.oppositeAccNo, originTrans.shopDtl.oppositeAccName)
+ }
+ }
+ val summarySuffix = getReverseSuffix(builder.reverseType)
+ originTrans.details.forEach {
+ builder.addDebitCreditRecord(it.draccno, it.drsubjno, it.craccno, it.crsubjno,
+ -it.amount, "${it.summary}$summarySuffix")
+ }
+ return builderRecords(builder, TradeDict.DTL_STATUS_INIT)
+ }
+
+ private fun doReversePrepareAndCheck(originTrans: TTransactionMain, builder: TransactionBuilder) {
+ if (originTrans.person) {
+ val account = accountDao.findByUserid(originTrans.personDtl.userid)
+ ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS,
+ "账户不存在")
+ builder.person(account).apply {
+ setAmount(-originTrans.personDtl.amount,
+ getOppositeTradeFlag(originTrans.personDtl.tradeflag))
+ }
+ }
+ if (originTrans.shop) {
+ val shopacc = shopaccDao.findByShopaccno(originTrans.shopDtl.shopaccno)
+ ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS,
+ "商户不存在")
+ builder.shop(shopacc).apply {
+ setAmount(-originTrans.shopDtl.amount,
+ getOppositeTradeFlag(originTrans.shopDtl.tradeflag))
+ }
+ }
+
+ if (originTrans.subject) {
+ val subject = subjectDao.findBySubjno(originTrans.subjectDtl.subjectno)
+ ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS,
+ "科目不存在")
+ builder.subject(subject)
+ }
+ }
+
+ override fun repair(refno: String, remark: String): TTransactionMain {
+ val transaction = transactionMainDao.findByRefnoForUpdate(refno)
+ ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
+ "补帐交易流水<$refno>不存在")
+ val checkStatus = setOf(TradeDict.DTL_STATUS_FAIL, TradeDict.DTL_STATUS_CANCEL,
+ TradeDict.DTL_STATUS_WIP)
+
+ if (transaction.status !in checkStatus) {
+ throw TransactionCheckException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+ "补帐交易<$refno>状态错误,status<${transaction.status}>")
+ }
+
+ transactionOnSuccess(transaction, remark, true)
+ transaction.checkDate = systemUtilService.accdate
+ transaction.endTime = systemUtilService.sysdatetime.sysdate
+
+ transactionMainDao.save(transaction)
+ return transaction
+ }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
new file mode 100644
index 0000000..6a17565
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
@@ -0,0 +1,191 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.bean.ModifyUserParam
+import com.supwisdom.dlpay.api.bean.OpenUserParam
+import com.supwisdom.dlpay.api.dao.*
+import com.supwisdom.dlpay.api.domain.*
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.api.service.UserService
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.domain.TOperator
+import com.supwisdom.dlpay.framework.util.*
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.data.domain.PageRequest
+import org.springframework.data.domain.Sort
+import org.springframework.stereotype.Service
+
+/**
+ * Created by shuwei on 2019/4/15.
+ */
+@Service
+class UserServiceImpl : UserService {
+ @Autowired
+ private lateinit var personDao: PersonDao
+ @Autowired
+ private lateinit var accountDao: AccountDao
+ @Autowired
+ private lateinit var personIdentityDao: PersonIdentityDao
+ @Autowired
+ private lateinit var pointsAccountDao: PointsAccountDao
+ @Autowired
+ private lateinit var systemUtilService: SystemUtilService
+ @Autowired
+ private lateinit var persondtlDao: PersondtlDao
+
+
+ override fun registerUser(param: OpenUserParam): TPerson {
+ var person = personDao.findByIdentity(param.idtype, param.idno)
+ if (null != person && param.name != person.name)
+ throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "证件指定用户与请求的用户名不匹配")
+
+ val systemdatetime = systemUtilService.sysdatetime
+ if (null == person) {
+ person = personDao.save(TPerson().apply {
+ name = param.name
+ sex = param.sex
+ status = TradeDict.STATUS_NORMAL
+ idtype = param.idtype
+ idno = param.idno
+ email = param.email
+ tel = param.tel
+ mobile = param.mobile
+ addr = param.address
+ zipcode = param.zipcode
+ lastsaved = systemdatetime.hostdatetime
+ })
+ }
+
+ if (accountDao.findByUseridAndSubjno(person.userid, Subject.SUBJNO_PERSONAL_DEPOSIT) == null) {
+ //开户
+ TAccount().apply {
+ accname = person.name
+ subjno = Subject.SUBJNO_PERSONAL_DEPOSIT
+ userid = person.userid
+ transStatus = person.status
+ balance = 0.0
+ availbal = 0.0
+ frozebal = 0.0
+ lowfreeFlag = false
+ lowfreeLimit = lowfreeLimit
+ daylimit = daylimit
+ maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT)
+ lasttranstime = systemdatetime.sysdate
+ lastdayTransamt = 0.0
+ lastdayDpsamt = 0.0
+ opendate = systemdatetime.hostdate
+ tac = this.generateTac()
+ accountDao.save(this)
+ }
+ }
+ personIdentityDao.save(TPersonIdentity().apply {
+ thirdUid = param.uid
+ this.person = person
+ status = person.status
+ lossflag = 0
+ lockflag = 0
+ createtime = systemdatetime.hostdatetime
+ }) //保存绑定关系
+
+ return person
+ }
+
+ override fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson? {
+ return personIdentityDao.getByThirdUid(thirdUniqueIdenty)?.let { it.person }
+ }
+
+ override fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?): TPerson? {
+ return if (!StringUtil.isEmpty(userid)) {
+ personDao.findByUserid(userid)
+ } else {
+ personIdentityDao.getByThirdUid(thirdUniqueIdenty)?.let { it.person }
+ }
+ }
+
+ override fun modifyUserInfo(person: TPerson, param: ModifyUserParam): Boolean {
+ if (!StringUtil.isEmpty(param.name) && param.name != person.name) {
+ person.name = param.name
+ accountDao.findByUseridAndSubjno(person.userid, Subject.SUBJNO_PERSONAL_DEPOSIT)?.let {
+ it.accname = param.name
+ accountDao.save(it)
+ }
+ }
+ if (!StringUtil.isEmpty(param.sex)) person.sex = param.sex
+ if (!StringUtil.isEmpty(param.idno)) {
+ person.idtype = param.idtype
+ person.idno = param.idno
+ }
+ if (!StringUtil.isEmpty(param.mobile)) person.mobile = param.mobile
+ if (!StringUtil.isEmpty(param.tel)) person.tel = param.tel
+ if (!StringUtil.isEmpty(param.email)) person.email = param.email
+ if (!StringUtil.isEmpty(param.address)) person.addr = param.address
+ if (!StringUtil.isEmpty(param.zipcode)) person.zipcode = param.zipcode
+ personDao.save(person)
+ return true
+ }
+
+ override fun findPersonByUserid(userid: String): TPerson? {
+ return personDao.findByUserid(userid)
+ }
+
+ override fun findAccountByUserid(userid: String, subjno: String?): TAccount? {
+ return if (!StringUtil.isEmpty(subjno)) {
+ accountDao.findByUseridAndSubjno(userid, subjno)
+ } else {
+ accountDao.findByUseridAndSubjno(userid, Subject.SUBJNO_PERSONAL_DEPOSIT)
+ }
+ }
+
+ override fun findPointsAccountByUserid(userid: String): TPointsAccount? {
+ return pointsAccountDao.findByUserid(userid)
+ }
+
+ override fun findPersonIdentity(thirdUniqueIdenty: String): TPersonIdentity? {
+ return personIdentityDao.getByThirdUid(thirdUniqueIdenty)
+ }
+
+ override fun findPersonByIdentityCheckStatus(thirdUniqueIdenty: String): TPerson {
+ personIdentityDao.getByThirdUid(thirdUniqueIdenty).let {
+ if (null != it) {
+ if (TradeDict.STATUS_NORMAL != it.status) {
+ throw TransactionProcessException(TradeErrorCode.PERSON_STATUS_ERROR, "账户状态异常")
+ }
+ if (1 == it.lossflag) {
+ throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOSS, "账户已挂失")
+ }
+ if (1 == it.lockflag) {
+ throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "账户已冻结")
+ }
+
+ if (null != it.person) {
+ return it.person
+ } else {
+ throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在")
+ }
+ }
+
+ throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在")
+ }
+ }
+
+ override fun findOnePersonByUserid(userid: String): TPerson {
+ return personDao.findByUserid(userid)
+ ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "用户<$userid>不存在")
+ }
+
+ override fun findPersondtlByUserid(userid: String,pageno:Int): PageResult<TPersondtl> {
+ var pageable = PageRequest.of(pageno - 1, 10, Sort.Direction.DESC, "transdate","transtime")
+ return PageResult<TPersondtl>(persondtlDao.findByUseridAndStatus(userid,TradeDict.DTL_STATUS_SUCCESS,pageable))
+ }
+
+ override fun findPersondtlDetailByUserid(userid: String, billno: String): TPersondtl? {
+ var dtl = persondtlDao.findById(billno)
+ if(dtl.isPresent){
+ if(userid!=dtl.get().userid){
+ return null
+ }
+ return dtl.get()
+ }else{
+ return null
+ }
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
new file mode 100644
index 0000000..f10c1a3
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.api.domain.TAccount
+import com.supwisdom.dlpay.framework.domain.TFeetypeConfig
+import com.supwisdom.dlpay.framework.domain.TShopacc
+import com.supwisdom.dlpay.framework.domain.TSubject
+import org.springframework.transaction.annotation.Propagation
+import org.springframework.transaction.annotation.Transactional
+
+interface AccountUtilServcie {
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
+ fun readAccountForUpdateNowait(userid: String): TAccount
+
+
+ fun readAccount(userid: String): TAccount
+
+ fun readShopAcc(shopId: Int): TShopacc
+
+ fun readShopbyShopaccno(shopaccno: String): TShopacc
+
+ fun readSubject(subjno: String): TSubject
+
+ fun readFeetype(feetype: String, paytype: String): TFeetypeConfig
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/shop_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/shop_service.kt
new file mode 100644
index 0000000..697bc11
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/shop_service.kt
@@ -0,0 +1,23 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.api.bean.OpenShopParam
+import com.supwisdom.dlpay.framework.domain.TShop
+import org.springframework.transaction.annotation.Propagation
+import org.springframework.transaction.annotation.Transactional
+
+/**
+ * Created by shuwei on 2019/4/15.
+ */
+interface ShopService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
+ fun registerShop(param: OpenShopParam): TShop
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findByThirdUniqueId(uniqueId: String): TShop?
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findByShopId(shopid: Int): TShop
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findByShopBySearch(shopid: Int?, shopaccno: String?, shopUniqueId: String?): TShop?
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
new file mode 100644
index 0000000..fff1a0e
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
@@ -0,0 +1,114 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.api.ShopAccBalanceAsyncTask
+import com.supwisdom.dlpay.api.TransactionBuilder
+import com.supwisdom.dlpay.api.domain.TTransactionMain
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.dao.DataAccessException
+import org.springframework.stereotype.Service
+import org.springframework.transaction.annotation.Transactional
+
+interface TransactionService {
+ @Transactional
+ fun init(builder: TransactionBuilder): TTransactionMain
+
+ @Transactional
+ fun wip(refno: String): TTransactionMain
+
+ @Transactional
+ fun wip(builder: TransactionBuilder): TTransactionMain
+
+ @Transactional
+ fun fail(refno: String): TTransactionMain
+
+ @Transactional
+ fun fail(refno: String, remark: String): TTransactionMain
+
+ @Transactional
+ fun success(refno: String, remark: String): TTransactionMain
+
+ @Transactional
+ fun success(refno: String): TTransactionMain
+
+ /**
+ * 退款类业务
+ */
+ @Transactional
+ fun refundInit(originRefno: String, refundAmount: Double, builder: TransactionBuilder): TTransactionMain
+
+ /**
+ * 撤销业务
+ */
+ @Transactional
+ fun cancelInit(originRefno: String, builder: TransactionBuilder): TTransactionMain
+
+ // 补帐接口
+ @Transactional
+ fun repair(refno: String, remark: String): TTransactionMain
+}
+
+@Service
+class TransactionServiceProxy {
+ @Autowired
+ private lateinit var transactionService: TransactionService
+
+ @Autowired
+ private lateinit var shopAccBalanceAsyncTask: ShopAccBalanceAsyncTask
+
+
+ fun init(builder: TransactionBuilder): TTransactionMain {
+ try {
+ return transactionService.init(builder)
+ } catch (ex: DataAccessException) {
+ //其他SQL错误
+ ex.javaClass.name.let {
+ val name = it.substringAfterLast('.')
+
+ throw TransactionProcessException(TradeErrorCode.SQL_EXCEPTION,
+ "SQL错误 $name - ${ex.message}")
+ }
+ }
+ }
+
+ fun wip(refno: String): TTransactionMain {
+ return transactionService.wip(refno)
+ }
+
+ fun fail(refno: String): TTransactionMain {
+ return transactionService.fail(refno)
+ }
+
+ fun fail(refno: String, remark: String): TTransactionMain {
+ return transactionService.fail(refno, remark)
+ }
+
+ fun success(refno: String, remark: String): TTransactionMain {
+ return transactionService.success(refno, remark).also {
+ if (it.shop) {
+ shopAccBalanceAsyncTask.updateShopBalance(it.refno)
+ }
+ }
+ }
+
+ fun success(refno: String): TTransactionMain {
+ return success(refno, "")
+ }
+
+ fun cancel(originRefno: String, builder: TransactionBuilder, confirm: Boolean): TTransactionMain {
+ val trans = transactionService.cancelInit(originRefno, builder)
+ if (confirm) {
+ return success(trans.refno)
+ }
+ return trans
+ }
+
+ fun refund(originRefno: String, refundAmount: Double, builder: TransactionBuilder, confirm: Boolean): TTransactionMain {
+ val trans = transactionService.refundInit(originRefno, refundAmount, builder)
+ if (confirm) {
+ return success(trans.refno)
+ }
+ return trans
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
new file mode 100644
index 0000000..f758859
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
@@ -0,0 +1,50 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.api.bean.ModifyUserParam
+import com.supwisdom.dlpay.api.bean.OpenUserParam
+import com.supwisdom.dlpay.api.domain.*
+import com.supwisdom.dlpay.framework.util.PageResult
+import org.springframework.transaction.annotation.Propagation
+import org.springframework.transaction.annotation.Transactional
+
+/**
+ * Created by shuwei on 2019/4/15.
+ */
+interface UserService {
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
+ fun registerUser(param: OpenUserParam): TPerson
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson?
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?): TPerson?
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun modifyUserInfo(person:TPerson,param: ModifyUserParam):Boolean
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findPersonByUserid(userid: String): TPerson?
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findAccountByUserid(userid: String, subjno:String?): TAccount?
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findPointsAccountByUserid(userid: String): TPointsAccount?
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findPersonIdentity(thirdUniqueIdenty: String):TPersonIdentity?
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findPersonByIdentityCheckStatus(thirdUniqueIdenty: String): TPerson
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findOnePersonByUserid(userid: String): TPerson
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findPersondtlByUserid(userid:String, pageno :Int) : PageResult<TPersondtl>
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun findPersondtlDetailByUserid(userid:String, billno :String) : TPersondtl?
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
new file mode 100644
index 0000000..a237617
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
@@ -0,0 +1,408 @@
+package com.supwisdom.dlpay.api
+
+import com.supwisdom.dlpay.api.domain.TAccount
+import com.supwisdom.dlpay.api.domain.TTransactionMain
+import com.supwisdom.dlpay.api.service.TransactionServiceProxy
+import com.supwisdom.dlpay.exception.TransactionCheckException
+import com.supwisdom.dlpay.framework.domain.TShopacc
+import com.supwisdom.dlpay.framework.domain.TSubject
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+
+open class SubTransactionBuilder<T : SubTransactionBuilder<T>>(val parent: TransactionBuilder) {
+ var payinfo: String = ""
+ get() {
+ return if (field.isEmpty()) parent.payinfo else field
+ }
+
+ var description: String = ""
+ get() {
+ return if (field.isEmpty()) parent.description else field
+ }
+
+ var remark: String = ""
+ get() {
+ return if (field.isEmpty()) parent.remark else field
+ }
+
+ private lateinit var oppAccno: String
+ private lateinit var oppAccName: String
+
+ fun hasOpposite(): Boolean {
+ return this::oppAccno.isInitialized
+ }
+
+ fun oppositeAccNo(): String {
+ return this.oppAccno
+ }
+
+ fun oppositeAccName(): String {
+ return this.oppAccName
+ }
+
+ fun setOpposite(accno: String, accName: String) {
+ this.oppAccno = accno
+ this.oppAccName = accName
+ }
+
+ fun setOpposite(accout: AccountProxy<*>) {
+ this.oppAccno = accout.getAccountNo()
+ this.oppAccName = accout.getAccountName()
+ }
+
+ fun and(): TransactionBuilder {
+ return parent
+ }
+
+ // 收支方向, in / out
+ var tradeFlag: String = ""
+ private set
+
+ var amount: Double = 0.0
+ private set
+
+ /**
+ * amount : 交易金额, 正向交易金额必须 >= 0, 冲正交易金额必须 <= 0
+ */
+ fun setAmount(amount: Double, inOut: String): SubTransactionBuilder<T> {
+ this.amount = if (inOut == TradeDict.TRADE_FLAG_IN) Math.abs(amount) else -Math.abs(amount)
+ this.tradeFlag = inOut
+ return this
+ }
+
+ /**
+ * amount : 交易金额, 正向交易金额必须 >= 0, 冲正交易金额必须 <= 0
+ */
+ fun addAmount(amount: Double): SubTransactionBuilder<T> {
+ this.amount += amount
+ return this
+ }
+
+}
+
+class PersonTranactionBuilder(parent: TransactionBuilder, val person: TAccount)
+ : SubTransactionBuilder<PersonTranactionBuilder>(parent) {
+}
+
+class ShopTransactionBuilder(parent: TransactionBuilder, val shopacc: TShopacc)
+ : SubTransactionBuilder<ShopTransactionBuilder>(parent) {
+}
+
+class SubjectTransactionBuilder(parent: TransactionBuilder, val subject: TSubject)
+ : SubTransactionBuilder<SubjectTransactionBuilder>(parent) {
+}
+
+class AccountProxy<T>(private val accountObj: T) {
+ fun getAccountNo(): String {
+ return when (accountObj) {
+ is TAccount -> (accountObj as TAccount).accno
+ is TShopacc -> (accountObj as TShopacc).shopaccno
+ is TSubject -> (accountObj as TSubject).subjno
+ else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "不支持的账户类型, $accountObj")
+ }
+ }
+
+ fun getSubjectNo(): String {
+ return when (accountObj) {
+ is TAccount -> (accountObj as TAccount).subjno
+ is TShopacc -> (accountObj as TShopacc).subjno
+ is TSubject -> (accountObj as TSubject).subjno
+ else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "不支持的账户类型, $accountObj")
+ }
+ }
+
+ fun getAccountName(): String {
+ return when (accountObj) {
+ is TAccount -> (accountObj as TAccount).accname
+ is TShopacc -> (accountObj as TShopacc).shopname
+ is TSubject -> (accountObj as TSubject).subjname
+ else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "不支持的账户类型, $accountObj")
+ }
+ }
+
+ fun get(): T {
+ return accountObj
+ }
+}
+
+class DebitCreditLine(val debitAccNo: String, val debitSubjNo: String,
+ val creditAccNo: String, val creditSubjNo: String,
+ val amount: Double, val summary: String, val seqno: Int) {
+ constructor(debit: AccountProxy<*>, credit: AccountProxy<*>,
+ amount: Double, summary: String, seqno: Int)
+ : this(debit.getAccountNo(), debit.getSubjectNo(),
+ credit.getAccountNo(), credit.getSubjectNo(),
+ amount, summary, seqno)
+}
+
+// 在 constructor 中加入 service 接口
+class TransactionBuilder {
+ companion object {
+ private val VALID_REVERSEFLAG = setOf(TradeDict.REVERSE_FLAG_CANCEL,
+ TradeDict.REVERSE_FLAG_REFUND,
+ TradeDict.REVERSE_FLAG_NONE)
+
+ private val VALID_OPERTYPE = setOf(TradeDict.OPERTYPE_OPER,
+ TradeDict.OPERTYPE_SHOP, TradeDict.OPERTYPE_PERSON)
+
+ private val VALID_TRADEFLAG = setOf(TradeDict.TRADE_FLAG_IN,
+ TradeDict.TRADE_FLAG_OUT)
+ }
+
+ private lateinit var personBuilder: PersonTranactionBuilder
+ private lateinit var shopBuilder: ShopTransactionBuilder
+ private lateinit var subjectBuilder: SubjectTransactionBuilder
+
+ private val debitCreditLines = mutableListOf<DebitCreditLine>()
+
+ // 以下是交易主表属性
+ var transDate: String = ""
+ private set
+ var transTime: String = ""
+ private set
+ var transCode: Int = 0 //交易码,各明细流水统一
+ private set
+
+ // 资金来源方案
+ var sourceType: String = ""
+ private set
+
+ fun setTransInfo(date: String, time: String, code: Int, sourceType: String): TransactionBuilder {
+ this.transDate = date
+ this.transTime = time
+ this.transCode = code
+ this.sourceType = sourceType
+ return this
+ }
+
+ var outtradeno: String = "" //第三方流水号
+ private set
+ var outId: String = ""
+ private set
+
+ fun setOutTransInfo(id: String, tradeno: String): TransactionBuilder {
+ this.outId = id
+ this.outtradeno = tradeno
+ return this
+ }
+
+ var operId: String = ""
+ private set
+ var operType: String = ""
+ private set
+
+ fun operator(id: String, type: String): TransactionBuilder {
+ this.operId = id
+ this.operType = type
+ return this
+ }
+
+ var reverseType: String = "none"
+ private set
+
+ var reverseRefno: String = ""
+ private set
+
+
+ // 以下属性可以在子表中不同
+ var payinfo: String = ""
+ var description: String = ""
+ var remark: String = ""
+
+ fun person(): PersonTranactionBuilder {
+ return this.personBuilder
+ }
+
+ fun person(account: TAccount): PersonTranactionBuilder {
+ return if (!this::personBuilder.isInitialized) {
+ PersonTranactionBuilder(this, account).also {
+ this.personBuilder = it
+ }
+ } else {
+ this.personBuilder
+ }
+ }
+
+ fun hasPerson(): Boolean {
+ return this::personBuilder.isInitialized
+ }
+
+ fun shop(): ShopTransactionBuilder {
+ return this.shopBuilder
+ }
+
+ fun shop(shopacc: TShopacc): ShopTransactionBuilder {
+ return if (!this::shopBuilder.isInitialized) {
+ ShopTransactionBuilder(this, shopacc).also {
+ this.shopBuilder = it
+ }
+ } else {
+ this.shopBuilder
+ }
+ }
+
+ fun hasShop(): Boolean {
+ return this::shopBuilder.isInitialized
+ }
+
+ fun subject(acc: TSubject): SubjectTransactionBuilder {
+ return if (!this::subjectBuilder.isInitialized) {
+ SubjectTransactionBuilder(this, acc).also {
+ this.subjectBuilder = it
+ }
+ } else {
+ this.subjectBuilder
+ }
+ }
+
+ fun subject(): SubjectTransactionBuilder {
+ return this.subjectBuilder
+ }
+
+ fun hasSubject(): Boolean {
+ return this::subjectBuilder.isInitialized
+ }
+
+ fun <T, U> addDebitCreditRecord(debit: AccountProxy<T>, credit: AccountProxy<U>,
+ amount: Double, summary: String): TransactionBuilder {
+ debitCreditLines.add(DebitCreditLine(debit, credit, amount, summary,
+ debitCreditLines.size + 1))
+ return this
+ }
+
+ fun addDebitCreditRecord(debitAccNo: String, debitSubjNo: String,
+ creditAccNo: String, creditSubjNo: String,
+ amount: Double, summary: String): TransactionBuilder {
+ debitCreditLines.add(DebitCreditLine(debitAccNo, debitSubjNo,
+ creditAccNo, creditSubjNo,
+ amount, summary, debitCreditLines.size + 1))
+ return this
+ }
+
+ fun getAllDetails(): List<DebitCreditLine> {
+ return debitCreditLines.toList()
+ }
+
+ private fun checkAmount(amount: Double, tradeFlag: String): Boolean {
+ return if (tradeFlag == TradeDict.TRADE_FLAG_IN) {
+ amount >= 0.0
+ } else {
+ amount <= 0.0
+ }
+ }
+
+ fun preCheck() {
+ if (outId.isNotEmpty() && outtradeno.isEmpty()) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "第三方账号未指定第三方流水号")
+ }
+
+ if (transDate.length != 8 || transTime.length != 6) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "交易发生日期错误")
+ }
+
+ if (transCode <= 0) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "交易码错误")
+ }
+
+ if (reverseType !in VALID_REVERSEFLAG) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "冲正标志错误")
+ }
+
+ if ((operId.isNotEmpty() || operType.isNotEmpty())
+ && operType !in VALID_OPERTYPE) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "操作员类型错误")
+ }
+
+ if (sourceType.isEmpty()) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "交易源类型错误")
+ }
+ if (hasPerson()) {
+ person().also {
+ if (it.person.transStatus != TradeDict.STATUS_NORMAL) {
+ throw TransactionCheckException(TradeErrorCode.PERSON_STATUS_ERROR,
+ "个人状态错误")
+ }
+ if (it.tradeFlag !in VALID_TRADEFLAG) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "个人交易收支方向错误")
+ }
+ if (!checkAmount(it.amount, it.tradeFlag)) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "个人交易金额不正确")
+ }
+ if (!it.hasOpposite()) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "个人交易对方账户未设置")
+ }
+// if (it.payinfo.isEmpty()) {
+// throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+// "个人交易信息未设置")
+// }
+ }
+ }
+
+ if (hasShop()) {
+ shop().also {
+ if (it.shopacc.status != TradeDict.STATUS_NORMAL) {
+ throw TransactionCheckException(TradeErrorCode.PERSON_STATUS_ERROR,
+ "商户状态错误")
+ }
+ if (it.tradeFlag !in VALID_TRADEFLAG) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "商户交易收支方向错误")
+ }
+ if (!checkAmount(it.amount, it.tradeFlag)) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "商户交易金额不正确")
+ }
+ if (!it.hasOpposite()) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "商户交易对方账户未设置")
+ }
+ }
+ }
+ }
+
+
+ fun isReverseTrans(): Boolean {
+ return this.reverseType != TradeDict.REVERSE_FLAG_NONE
+ }
+
+ fun init(transactionService: TransactionServiceProxy): TTransactionMain {
+ return transactionService.init(this)
+ }
+
+ fun refund(originRefno: String, amount: Double, transactionService: TransactionServiceProxy): TTransactionMain {
+ this.reverseType = TradeDict.REVERSE_FLAG_REFUND
+ this.reverseRefno = originRefno
+ return transactionService.refund(originRefno, amount, this, true)
+ }
+
+ fun refundInit(originRefno: String, amount: Double, transactionService: TransactionServiceProxy): TTransactionMain {
+ this.reverseType = TradeDict.REVERSE_FLAG_REFUND
+ this.reverseRefno = originRefno
+ return transactionService.refund(originRefno, amount, this, false)
+ }
+
+ fun cancel(originRefno: String, transactionService: TransactionServiceProxy): TTransactionMain {
+ this.reverseType = TradeDict.REVERSE_FLAG_CANCEL
+ this.reverseRefno = originRefno
+ return transactionService.cancel(originRefno, this, true)
+ }
+
+ fun cancelInit(originRefno: String, transactionService: TransactionServiceProxy): TTransactionMain {
+ this.reverseType = TradeDict.REVERSE_FLAG_CANCEL
+ this.reverseRefno = originRefno
+ return transactionService.cancel(originRefno, this, false)
+ }
+
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/app/bean/app_request_param.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/app/bean/app_request_param.kt
new file mode 100644
index 0000000..d857281
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/app/bean/app_request_param.kt
@@ -0,0 +1,2 @@
+package com.supwisdom.dlpay.app.bean
+
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt
new file mode 100644
index 0000000..3d2e5d2
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt
@@ -0,0 +1,28 @@
+package com.supwisdom.dlpay.framework.controller
+
+import com.jcabi.manifests.Manifests
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+
+@RestController
+@RequestMapping("/api/common")
+class AboutController {
+ @GetMapping("/version")
+ fun version(): ResponseEntity<Any> {
+ return try {
+ Manifests.read("Payapi-Version").let {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("version", it)
+ .success())
+ }
+ } catch (e: IllegalArgumentException) {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("version", "unknown")
+ .success())
+ }
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
new file mode 100644
index 0000000..81f099d
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
@@ -0,0 +1,325 @@
+package com.supwisdom.dlpay.framework.controller
+
+import com.google.code.kaptcha.Producer
+import com.supwisdom.dlpay.exception.TransactionCheckException
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.core.JwtConfig
+import com.supwisdom.dlpay.framework.core.JwtTokenUtil
+import com.supwisdom.dlpay.framework.dao.ApiClientDao
+import com.supwisdom.dlpay.framework.dao.TenantConfigDao
+import com.supwisdom.dlpay.framework.domain.ApiClientRedis
+import com.supwisdom.dlpay.framework.domain.JwtRedis
+import com.supwisdom.dlpay.framework.domain.TOperator
+import com.supwisdom.dlpay.framework.redisrepo.ApiClientRepository
+import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
+import com.supwisdom.dlpay.framework.security.validate.ImageCodeUtil
+import com.supwisdom.dlpay.framework.security.validate.VerifyCode
+import com.supwisdom.dlpay.framework.service.CommonService
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.system.service.FunctionService
+import mu.KotlinLogging
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.http.HttpStatus
+import org.springframework.http.ResponseEntity
+import org.springframework.security.core.Authentication
+import org.springframework.security.core.annotation.AuthenticationPrincipal
+import org.springframework.security.core.context.SecurityContextHolder
+import org.springframework.security.core.userdetails.UserDetails
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer
+import org.springframework.security.oauth2.provider.OAuth2Authentication
+import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler
+import org.springframework.social.connect.web.HttpSessionSessionStrategy
+import org.springframework.stereotype.Controller
+import org.springframework.ui.Model
+import org.springframework.web.bind.annotation.*
+import org.springframework.web.context.request.ServletWebRequest
+import java.awt.image.BufferedImage
+import java.io.IOException
+import java.lang.Exception
+import java.security.Principal
+import java.util.*
+import javax.imageio.ImageIO
+import javax.servlet.http.HttpServletRequest
+import javax.servlet.http.HttpServletResponse
+
+@RestController
+@RequestMapping("/api/auth")
+class ApiAuthController {
+
+ @Autowired
+ lateinit var apiClientRepository: ApiClientRepository
+
+ @Autowired
+ lateinit var apiJwtRepository: ApiJwtRepository
+
+ @Autowired
+ lateinit var apiClientDao: ApiClientDao
+
+ @Autowired
+ lateinit var systemUtil: SystemUtilService
+
+ @Autowired
+ lateinit var jwtConfig: JwtConfig
+
+ @Autowired
+ private lateinit var tetantConfigDao: TenantConfigDao
+
+ @GetMapping(value = ["/gettoken", "/gettoken/{clientid}"])
+ fun loginInit(appid: String, @PathVariable clientid: String?,
+ @RequestHeader(Constants.HEADER_TETANTID) tetantId: String?): ResponseEntity<Any> {
+
+ tetantConfigDao.default?.also {
+ if (it.tenantId != tetantId) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+ "租户ID错误")
+ }
+ } ?: throw TransactionCheckException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+ "系统未配置租户信息")
+
+ apiClientDao.findById(appid).run {
+ if (!isPresent) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ }
+ if (get().status != TradeDict.STATUS_NORMAL) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "API状态错误"))
+ }
+ get()
+ }.let { api ->
+ val token = generateRandomToken()
+ val now = systemUtil.sysdatetime.hostdatetime
+ ApiClientRedis().also {
+ it.id = if (clientid == null) appid else "$appid-$clientid"
+ it.loginTimestamp = now
+ it.roles = api.roles
+ it.tenantId = tetantId
+ it.token = HmacUtil.HMACSHA256(token, api.secret)
+ }.also {
+ apiClientRepository.save(it)
+ }
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("token", token)
+ .data("timestamp", now)
+ .success())
+ }
+ }
+
+ private fun generateRandomToken(): String {
+ val random = ByteArray(12) { 0x00 }
+ Random(System.currentTimeMillis()).nextBytes(random)
+ return Base64.getEncoder().encode(random).toString(Charsets.UTF_8)
+ }
+
+ private fun checkSecretToken(api: ApiClientRedis, secret: String): Boolean {
+ return (api.token == secret)
+ }
+
+ @GetMapping(value = ["/authentication", "/authentication/{clientid}"])
+ fun login(appid: String, secret: String, @PathVariable clientid: String?): ResponseEntity<Any> {
+ val requestId = if (clientid == null) appid else "$appid-$clientid"
+ return apiClientRepository.findById(requestId).let {
+ if (it.isPresent && checkSecretToken(it.get(), secret)) {
+ apiClientRepository.deleteById(requestId)
+ val token = JwtTokenUtil(jwtConfig).generateToken(
+ mapOf(Constants.JWT_CLAIM_UID to appid,
+ "issuer" to "payapi",
+ "audience" to (clientid ?: appid),
+ Constants.JWT_CLAIM_TENANTID to it.get().tenantId,
+ Constants.JWT_CLAIM_AUTHORITIES to it.get().roles.split(";")))
+ JwtRedis().apply {
+ jti = token.jti
+ uid = appid
+ status = TradeDict.JWT_STATUS_NORMAL
+ expiration = token.expiration.valueInMillis
+ }.apply {
+ apiJwtRepository.save(this)
+ }
+
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("jwt", token.jwtToken)
+ .data("appid", appid)
+ .data("expiredAt", DateUtil.getUTCTime(token.expiration.valueInMillis))
+ .success())
+ } else {
+ ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ }
+ }
+ }
+
+ @GetMapping("/refresh")
+ fun refresh(request: HttpServletRequest): ResponseEntity<Any> {
+ val auth = request.getHeader(jwtConfig.header) ?: ""
+ if (!auth.startsWith(jwtConfig.tokenHeader)) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ }
+ val jwt = JwtTokenUtil(jwtConfig).verifyToken(auth.substring(jwtConfig.tokenHeader.length))
+ val appid = jwt["uid"] as String
+ return apiClientDao.findById(appid).let {
+ if (it.isPresent && it.get().status == TradeDict.STATUS_NORMAL) {
+ // 新证书
+ val token = JwtTokenUtil(jwtConfig).generateToken(
+ mapOf(Constants.JWT_CLAIM_UID to appid,
+ "issuer" to "payapi",
+ "audience" to jwt["audience"],
+ Constants.JWT_CLAIM_AUTHORITIES to it.get().roles.split(";")))
+ JwtRedis().apply {
+ jti = token.jti
+ uid = appid
+ status = TradeDict.JWT_STATUS_NORMAL
+ expiration = token.expiration.valueInMillis
+ }.apply {
+ apiJwtRepository.save(this)
+ }
+
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("jwt", token.jwtToken)
+ .data("appid", appid)
+ .data("expiredAt", DateUtil.getUTCTime(token.expiration.valueInMillis))
+ .success())
+ } else {
+ ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ }
+ }
+ }
+}
+
+@RestController
+class ValidateCodeController {
+
+ @Autowired
+ private lateinit var captchaProducer: Producer
+
+ @GetMapping("/code/image")
+ fun createCode(request: HttpServletRequest, response: HttpServletResponse) {
+ val imageCode = VerifyCode(60)
+ HttpSessionSessionStrategy().setAttribute(ServletWebRequest(request), ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY, imageCode)
+ val session = request.session
+ response.setDateHeader("Expires", 0)
+ response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate")
+ response.addHeader("Cache-Control", "post-check=0, pre-check=0")
+ response.setHeader("Pragma", "no-cache")
+ response.contentType = "image/jpeg"
+ //生成验证码
+ val capText = captchaProducer.createText()
+ session.setAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY, capText)
+ //向客户端写出
+ val bi = captchaProducer.createImage(capText);
+ ImageIO.write(bi, "JPEG", response.outputStream)
+ try {
+ response.outputStream.flush()
+ } catch (ex: Exception) {
+ response.outputStream.close()
+ }
+ }
+}
+
+@RestController
+class UserInforController {
+
+ @RequestMapping("/api/userinfor")
+ fun user(user: Principal): Principal {
+ System.out.println(user)
+ return user
+ }
+}
+
+
+@Controller
+class WebMainController {
+ @Autowired
+ lateinit var functionService: FunctionService
+ @Autowired
+ lateinit var commonService: CommonService
+
+ private val logger = KotlinLogging.logger {}
+
+ @GetMapping("/login")
+ fun loginView() = "ologin"
+
+ @RequestMapping("/third/logout")
+ fun oauthLogout(request: HttpServletRequest, response: HttpServletResponse) {
+ val back = request.getParameter("redirect_uri")
+ SecurityContextLogoutHandler().logout(request, null, null);
+ try {
+ SecurityContextHolder.getContext().authentication = null
+ if (back != null) {
+ response.sendRedirect(back)
+ } else {
+ logger.debug { request.getHeader("referer") }
+ response.sendRedirect(request.getHeader("referer"))
+ }
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+
+ @GetMapping("/logout")
+ fun logout(request: HttpServletRequest, response: HttpServletResponse): String {
+ SecurityContextHolder.getContext().authentication?.also {
+ logger.debug { "user logout!! " }
+ SecurityContextLogoutHandler().logout(request, response, it)
+ }
+ return "redirect:/login?logout"
+ }
+
+ @GetMapping(value = ["/", "/index"])
+ fun menuView(@AuthenticationPrincipal operUser: UserDetails, model: Model): String {
+ model.addAttribute("loginOper", operUser as TOperator)
+ val funclist = functionService.getFunctionsByOperid(operUser.operid)
+ model.addAttribute("menus", functionService.getMenuTree(funclist, -1))
+ model.addAttribute("payapiVersion", commonService.getSystemVersion())
+ return "index"
+ }
+
+}
+
+@Controller
+@RequestMapping("/home")
+class HomeController {
+ /**
+ * 控制台
+ */
+ @GetMapping("/console")
+ fun console(): String {
+ return "home/console"
+ }
+
+ /**
+ * 消息弹窗
+ */
+ @GetMapping("/message")
+ fun message(): String {
+ return "home/message"
+ }
+
+ /**
+ * 修改密码弹窗
+ */
+ @GetMapping("/password")
+ fun password(): String {
+ return "home/password"
+ }
+
+ /**
+ * 主题设置弹窗
+ */
+ @GetMapping("/theme")
+ fun theme(): String {
+ return "home/theme"
+ }
+
+ /**
+ * 设置主题
+ */
+ @RequestMapping("/setTheme")
+ fun setTheme(themeName: String?, request: HttpServletRequest): String {
+ if (null == themeName) {
+ request.session.removeAttribute("theme")
+ } else {
+ request.session.setAttribute("theme", themeName)
+ }
+ return "redirect:/"
+ }
+
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
new file mode 100644
index 0000000..b25a725
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
@@ -0,0 +1,89 @@
+package com.supwisdom.dlpay.framework
+
+import com.google.gson.Gson
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException
+import com.supwisdom.dlpay.exception.TransactionCheckException
+import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import mu.KotlinLogging
+
+
+class ResponseBodyBuilder private constructor() {
+ companion object {
+ private const val INVALIDE_RETCODE = -0x7FFFFFFF
+ private val RESERVED_KEY = setOf("retcode", "retmsg")
+ private val LOGGER = KotlinLogging.logger {}
+ fun create() = ResponseBodyBuilder()
+ }
+
+ private var retCode = INVALIDE_RETCODE
+ private var retMsg = ""
+
+ private val respData = mutableMapOf<String, Any>()
+
+ fun result(code: Int, msg: String? = null): ResponseBodyBuilder {
+ this.retCode = code
+ retMsg = if (retCode == 0) {
+ msg ?: "成功"
+ } else {
+ msg ?: "失败"
+ }
+ return this
+ }
+
+ fun success(msg: String? = null): Map<String, Any> {
+ result(0, msg)
+ return build()
+ }
+
+ fun fail(code: Int, msg: String): Map<String, Any> {
+ if (code == 0) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "错误码未正确定义")
+ }
+ result(code, msg)
+ return build()
+ }
+
+ fun exception(code: Int, exception: Exception, msg: String? = null): Map<String, Any> {
+ data("exception", exception.message ?: "$exception")
+ result(code, msg)
+ return build()
+ }
+
+ fun exception(code: Int, cause: Throwable?, msg: String? = null): Map<String, Any> {
+ data("exception", cause?.message ?: "unkonw excpetion")
+ result(code, msg)
+ return build()
+ }
+
+ fun transException(exception: TransactionException, msg: String): Map<String, Any> {
+ data("exception", exception.message!!)
+ result(exception.code(), "$msg - [${exception.message}]")
+ return build()
+ }
+
+ fun requestException(exception: RequestParamCheckException, msg: String): Map<String, Any> {
+ data("exception", exception.message!!)
+ result(exception.errCode, "$msg - [${exception.message}]")
+ return build()
+ }
+
+ fun data(name: String, value: Any): ResponseBodyBuilder {
+ if (name in RESERVED_KEY) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "返回值 <$name> 为保留值,不能使用")
+ }
+ this.respData[name] = value
+ return this
+ }
+
+ private fun build(): Map<String, Any> {
+ if (retCode == INVALIDE_RETCODE) {
+ throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未设置返回码!")
+ } else if (retCode != 0) {
+ LOGGER.error(" ==== ERROR ==== 【retcode=[$retCode],retmsg=[$retMsg]】: data=" + Gson().toJson(this.respData))
+ } else {
+ LOGGER.info("retcode=[0],retmsg=[$retMsg] return success!!! \n" + Gson().toJson(this.respData))
+ }
+ return this.respData.plus(mapOf("retcode" to retCode, "retmsg" to retMsg))
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
new file mode 100644
index 0000000..d400aaa
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.framework.service
+
+import javax.servlet.http.HttpServletRequest
+
+interface CommonService {
+ fun getSystemVersion(): String
+
+ fun getRequestAppid(request: HttpServletRequest): String
+
+ fun getAppidSecretByRequest(request: HttpServletRequest): String
+
+ fun getSecretByAppid(appid: String): String
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
new file mode 100644
index 0000000..d5a13dd
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
@@ -0,0 +1,66 @@
+package com.supwisdom.dlpay.framework.service.impl
+
+import com.jcabi.manifests.Manifests
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.core.JwtConfig
+import com.supwisdom.dlpay.framework.core.JwtTokenUtil
+import com.supwisdom.dlpay.framework.dao.ApiClientDao
+import com.supwisdom.dlpay.framework.service.CommonService
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+import javax.servlet.http.HttpServletRequest
+
+@Service
+class CommonServiceImpl : CommonService {
+ @Autowired
+ lateinit var jwtConfig: JwtConfig
+ @Autowired
+ lateinit var apiClientDao: ApiClientDao
+
+ private var jwtUtil: JwtTokenUtil? = null
+
+ private fun getUtil(): JwtTokenUtil {
+ if (jwtUtil == null) {
+ jwtUtil = JwtTokenUtil((jwtConfig))
+ }
+ return jwtUtil as JwtTokenUtil
+ }
+
+ override fun getSystemVersion(): String {
+ return try {
+ Manifests.read("Payapi-Version") ?: "version 1.0"
+ } catch (ex: Exception) {
+// ex.printStackTrace()
+ "unknown"
+ }
+ }
+
+ override fun getRequestAppid(request: HttpServletRequest): String {
+ request.getHeader(jwtConfig.header).let {
+ if (null != it && it.startsWith(jwtConfig.tokenHeader)) {
+ val claims = getUtil().verifyToken(it.substring(jwtConfig.tokenHeader.length))
+ val uid = claims["uid"]?.toString()
+ if (!StringUtil.isEmpty(uid)) {
+ return uid as String
+ }
+ }
+
+ throw TransactionProcessException(TradeErrorCode.BUSINESS_APPID_NOTFOUND, "APPID未找到") //报错
+ }
+ }
+
+ override fun getAppidSecretByRequest(request: HttpServletRequest): String {
+ return getSecretByAppid(getRequestAppid(request))
+ }
+
+ override fun getSecretByAppid(appid: String): String {
+ return apiClientDao.findByAppid(appid).let {
+ if (null != it)
+ it.secret
+ else
+ throw TransactionProcessException(TradeErrorCode.BUSINESS_APPID_NOTFOUND, "APPID记录未找到") //报错
+ }
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/tenant.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/tenant.kt
new file mode 100644
index 0000000..dc8bbe7
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/tenant.kt
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.framework
+
+import com.supwisdom.dlpay.framework.tenant.TenantInterceptor
+import mu.KotlinLogging
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.annotation.Configuration
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
+import javax.annotation.PostConstruct
+
+
+//@Order(1)
+//@WebFilter(filterName = "multi_tenant_filter", urlPatterns = ["/*"])
+//class TenantNameFilter : Filter {
+// override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
+// if (request is HttpServletRequest) {
+// request.getHeader(Constants.HEADER_TETANTID)?.also {
+// // set tanent datasource
+// TenantContext.setTenantSchema(it)
+// } ?: TenantContext.setTenantSchema("default")
+// }
+// chain.doFilter(request, response)
+// }
+//}
+
+@Configuration
+class MultiTenantDatasourceConfiguration : WebMvcConfigurer {
+
+ private val logger = KotlinLogging.logger { }
+ @Autowired
+ private lateinit var tenantInterceptor: TenantInterceptor
+
+ @PostConstruct
+ fun post() {
+ logger.info("MultiTenantDatasourceConfiguration post constructor.")
+ }
+
+ override fun addInterceptors(registry: InterceptorRegistry) {
+ logger.info("adding interceptor(s).")
+ registry.addInterceptor(tenantInterceptor)
+ }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
new file mode 100644
index 0000000..b4f11a1
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
@@ -0,0 +1,142 @@
+package com.supwisdom.dlpay.mobile
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.service.UserService
+import com.supwisdom.dlpay.exception.ValidateCodeException
+import com.supwisdom.dlpay.framework.core.JwtConfig
+import com.supwisdom.dlpay.framework.core.JwtTokenUtil
+import com.supwisdom.dlpay.framework.domain.JwtRedis
+import com.supwisdom.dlpay.framework.redisrepo.ApiClientRepository
+import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.mobile.dao.MobileUserDao
+import com.supwisdom.dlpay.mobile.domain.TBMobileUser
+import com.supwisdom.dlpay.mobile.exception.UserLoginFailException
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.http.HttpStatus
+import org.springframework.security.authentication.BadCredentialsException
+import org.springframework.security.authentication.LockedException
+import org.springframework.security.core.Authentication
+import org.springframework.security.core.AuthenticationException
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler
+import org.springframework.stereotype.Component
+import java.io.IOException
+import javax.servlet.ServletException
+import javax.servlet.http.HttpServletRequest
+import javax.servlet.http.HttpServletResponse
+
+@Component("authLoginSuccessHandler")
+class AuthLoginSuccessHandler : SimpleUrlAuthenticationSuccessHandler() {
+ @Autowired
+ lateinit var mobileUserDao: MobileUserDao
+ @Autowired
+ lateinit var objectMapper: ObjectMapper
+ @Autowired
+ lateinit var jwtConfig: JwtConfig
+ @Autowired
+ lateinit var apiJwtRepository: ApiJwtRepository
+ @Autowired
+ lateinit var systemUtilService: SystemUtilService
+ @Autowired
+ lateinit var userService: UserService
+
+
+ override fun onAuthenticationSuccess(request: HttpServletRequest, response: HttpServletResponse, authentication: Authentication) {
+ logger.error(request.getParameter("platform"))
+ var temp = authentication.principal as TBMobileUser
+ var user = mobileUserDao.findByPhone(temp.phone)
+ val exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.SYSPARAID_NO3,60*60*24*3)
+ jwtConfig.expiration = exp.toLong()
+ if (user != null) {
+ //TODO 从数据取jwtConfig.expiration
+ val token = JwtTokenUtil(jwtConfig).generateToken(
+ mapOf("uid" to user.uid, "issuer" to "payapi",
+ "audience" to temp.phone,
+ Constants.JWT_CLAIM_TENANTID to "mobile",
+ Constants.JWT_CLAIM_AUTHORITIES to temp.authorities))
+ val jwt = JwtRedis().apply {
+ jti = token.jti
+ uid = temp.phone
+ status = TradeDict.JWT_STATUS_NORMAL
+ expiration = token.expiration.valueInMillis
+ }.apply {
+ //删除之前的token
+ if (!user.jti.isNullOrEmpty()) {
+ apiJwtRepository.deleteById(user.jti!!)
+ }
+ apiJwtRepository.save(this)
+ }
+ if (user.loginpwderror > 0) {
+ user.loginpwderror = 0
+ user.loginpwderrortime = null
+ }
+ user.lastlogin = DateUtil.getNow()
+ user.jti = jwt.jti
+ mobileUserDao.save(user)
+ var payseted = false
+ if(!user!!.paypwd.isNullOrEmpty()){
+ payseted = true
+ }
+ var name = ""
+ if (!user.userid.isNullOrEmpty()) {
+ var person = userService.findOnePersonByUserid(user.userid!!)
+ if (person != null) {
+ name = person.name
+ }
+ }
+
+ response.status = HttpStatus.OK.value()
+ response.contentType = "application/json;charset=UTF-8"
+ response.writer.write(objectMapper.writeValueAsString(JsonResult.ok()
+ .put("token", token.jwtToken)
+ ?.put("expire",token.expiration.valueInMillis)
+ ?.put("now",System.currentTimeMillis())
+ ?.put("tenantid", "mobile")
+ ?.put("name", name)
+ ?.put("phone", StringUtil.phoneReplace(user.phone))
+ ?.put("paypwdset",payseted)
+ ?.put("signed", if (user.issigned.isNullOrEmpty()) "" else user.issigned)
+ ?.put("userid",if(user.userid.isNullOrEmpty()) "" else user.userid)))
+ } else {
+ throw UserLoginFailException("登录错误")
+ }
+ }
+}
+
+
+@Component("authLoginFailHandler")
+class AuthLoginFailHandler : SimpleUrlAuthenticationFailureHandler() {
+ @Autowired
+ lateinit var mobileUserDao: MobileUserDao
+
+ @Autowired
+ lateinit var objectMapper: ObjectMapper
+
+ @Throws(IOException::class, ServletException::class)
+ override fun onAuthenticationFailure(request: HttpServletRequest,
+ response: HttpServletResponse, exception: AuthenticationException) {
+ logger.error("登录失败:" + exception.message + "|" + exception.javaClass)
+ val errmsg = when (exception) {
+ is BadCredentialsException -> "手机号或密码错误"
+ is LockedException -> "账户被锁定"
+ else -> exception.message!!
+ }
+ var temp = request.getParameter("username")
+ if(!temp.isNullOrEmpty()) {
+ mobileUserDao.findByPhone(temp)?.let {
+ if (it.loginpwderror == null || it.loginpwderror == 0) {
+ it.loginpwderror = 0
+ it.loginpwderrortime = System.currentTimeMillis()
+ }
+ it.loginpwderror += 1
+ mobileUserDao.save(it)
+ }
+ }
+ response.status = HttpStatus.OK.value()
+ response.contentType = "application/json;charset=UTF-8"
+ response.writer.write(objectMapper.writeValueAsString(JsonResult.error(errmsg)))
+ }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
new file mode 100644
index 0000000..ecc01ab
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -0,0 +1,537 @@
+package com.supwisdom.dlpay.mobile
+
+import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.dao.PersonDao
+import com.supwisdom.dlpay.api.domain.TPersonIdentity
+import com.supwisdom.dlpay.api.service.UserService
+import com.supwisdom.dlpay.framework.core.JwtConfig
+import com.supwisdom.dlpay.framework.core.JwtTokenUtil
+import com.supwisdom.dlpay.framework.domain.JwtRedis
+import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.mobile.domain.TBMobileUser
+import com.supwisdom.dlpay.mobile.service.MobileApiService
+import com.supwisdom.dlpay.util.ConstantUtil
+import org.apache.commons.lang.StringUtils
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.data.redis.core.RedisTemplate
+import org.springframework.security.core.GrantedAuthority
+import org.springframework.security.core.authority.AuthorityUtils
+import org.springframework.security.core.context.SecurityContextHolder
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.RequestParam
+import java.time.Duration
+import java.util.Calendar
+
+
+@RestController
+@RequestMapping("/mobileapi/i")
+class ApiInit {
+ @Autowired
+ lateinit var mobileApiService: MobileApiService
+ @Autowired
+ lateinit var redisTemplate: RedisTemplate<String, String>
+ @Autowired
+ lateinit var jwtConfig: JwtConfig
+ @Autowired
+ lateinit var apiJwtRepository: ApiJwtRepository
+ @Autowired
+ lateinit var systemUtilService: SystemUtilService
+
+ @RequestMapping("/time")
+ fun time(): JsonResult {
+ return JsonResult.ok("OK").put("now", System.currentTimeMillis())!!
+ }
+
+ @RequestMapping("/test")
+ fun test(uid: String): JsonResult {
+ return JsonResult.ok("OK").put("uid", uid)!!
+ }
+
+ @RequestMapping("/uxy")
+ fun xieyi(): JsonResult {
+ var page = mobileApiService.findPageById(ConstantUtil.PAGE_USERXIEYI)
+ if (page != null) {
+ return JsonResult.ok("OK").put("page", page.pageContent)!!
+ }
+ return JsonResult.error("页面未配置")
+ }
+
+ /**
+ * 注册或找回时使用的验证码生成接口
+ * */
+ @RequestMapping("/code")
+ fun code(@RequestParam phone: String, @RequestParam type: String?): JsonResult {
+ if (phone.isNullOrEmpty() || phone.length != 11 || !StringUtil.isMobile(phone)) {
+ return JsonResult.error("手机号有误")
+ }
+ var user = mobileApiService.findUserByPhone(phone)
+ if (type.isNullOrEmpty() || "new" == type) {
+ if (user != null && !user.loginpwd.isNullOrEmpty()) {
+ return JsonResult.error("该手机号已注册,请登录或找回密码")
+ }
+ } else {
+ if ("find" == type) {
+ if (user == null) {
+ return JsonResult.error("手机号不存在,请注册")
+ }
+ } else {
+ return JsonResult.error("类型错误")
+ }
+ }
+ // 如果未设置密码
+ var temp = redisTemplate.opsForValue().get(phone)
+ if (temp.isNullOrEmpty()) {
+ var code = RandomUtils.randomNumber(6)
+ System.out.println(code)
+ redisTemplate.opsForValue().set(phone, code, Duration.ofMinutes(5))
+ }
+ //TODO call send code sdk
+ return JsonResult.ok("验证码已发送")
+ }
+
+ /**
+ * 注册或找回时使用的验证码校验接口
+ * */
+ @RequestMapping("/checkcode")
+ fun check(@RequestParam phone: String,
+ @RequestParam code: String,
+ @RequestParam platform: String?,
+ @RequestParam uuid: String?): JsonResult {
+ var temp = redisTemplate.opsForValue().get(phone)
+ if (!temp.isNullOrEmpty()) {
+ if (temp != code) {
+ return JsonResult.error("验证码错误")
+ }
+ var user = mobileApiService.findUserByPhone(phone)
+ if (user == null) {
+ user = TBMobileUser()
+ user.phone = phone
+ user.registerplatform = platform
+ user.registerdate = DateUtil.getNow()
+ user.devuid = uuid
+ user.status = TradeDict.STATUS_NORMAL
+ user.paypwderror = 0
+ user.loginpwderror = 0
+ user = mobileApiService.saveUser(user)
+ }
+ user.status = TradeDict.STATUS_NORMAL
+ user.registerplatform = platform
+ user.devuid = uuid
+ user = mobileApiService.saveUser(user)
+ var code = RandomUtils.getRandomString(30)
+ redisTemplate.opsForValue().set(user.uid, code, Duration.ofHours(1))
+ redisTemplate.delete(phone)
+ return JsonResult.ok("OK").put("uid", user.uid)?.put("randcode", code)!!
+ } else {
+ return JsonResult.error(-1, "验证码无效或已过期,请重新获取")
+ }
+ }
+
+ /**
+ * 注册
+ * */
+ @RequestMapping("/register")
+ fun register(@RequestParam id: String,
+ @RequestParam pwd: String,
+ @RequestParam repwd: String,
+ @RequestParam random: String): JsonResult {
+ if (random.isNullOrEmpty()) {
+ return JsonResult.error("信息有误,请返回上一步")
+ }
+ if (pwd.isNullOrEmpty() || repwd.isNullOrEmpty() || pwd.length < 6) {
+ return JsonResult.error("请重新设置密码,密码不能小于6位字符")
+ }
+ if (pwd != repwd) {
+ return JsonResult.error("两次密码不一致")
+ }
+ var user: TBMobileUser? = mobileApiService.findUserById(id) ?: return JsonResult.error("用户不存在,请注册")
+ var code = redisTemplate.opsForValue().get(id)
+ if (random != code) {
+ return JsonResult.error("信息有误,请返回上一步,并重新发送验证码")
+ }
+ val encoder = BCryptPasswordEncoder()
+ user!!.loginpwd = encoder.encode(pwd)
+ var exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.SYSPARAID_NO3, 60 * 60 * 24 * 3)
+ jwtConfig.expiration = exp.toLong()
+ var authorities: Collection<GrantedAuthority> = AuthorityUtils.createAuthorityList("ROLE_USER")
+ user.auths = authorities
+ val token = JwtTokenUtil(jwtConfig).generateToken(
+ mapOf("uid" to user.uid, "issuer" to "payapi",
+ "audience" to user.phone,
+ Constants.JWT_CLAIM_TENANTID to "mobile",
+ Constants.JWT_CLAIM_AUTHORITIES to user.authorities))
+ var jwt = JwtRedis().apply {
+ jti = token.jti
+ uid = user.phone
+ status = TradeDict.JWT_STATUS_NORMAL
+ expiration = token.expiration.valueInMillis
+ }.apply {
+ //删除之前的token
+ if (!user.jti.isNullOrEmpty()) {
+ apiJwtRepository.deleteById(user.jti!!)
+ }
+ apiJwtRepository.save(this)
+ }
+ if (user.loginpwderror != null && user.loginpwderror!! > 0) {
+ user.loginpwderror = 0
+ user.loginpwderrortime = null
+ }
+ user.lastlogin = DateUtil.getNow()
+ user.jti = jwt.jti
+ mobileApiService.saveUser(user)
+ redisTemplate.delete(user.uid)
+ var payseted = false
+ if (!user!!.paypwd.isNullOrEmpty()) {
+ payseted = true
+ }
+ return JsonResult.ok("OK").put("token", token.jwtToken)
+ ?.put("userid", if (user.userid.isNullOrEmpty()) "" else user.userid)
+ ?.put("expire", token.expiration.valueInMillis)
+ ?.put("now", System.currentTimeMillis())
+ ?.put("phone", StringUtil.phoneReplace(user.phone))
+ ?.put("paypwdset", payseted)
+ ?.put("signed", if (user.issigned.isNullOrEmpty()) "" else user.issigned)
+ ?.put("tenantid", "mobile")!!
+ }
+}
+
+
+@RestController
+@RequestMapping("/mobileapi/v1")
+class ApiV1 {
+ @Autowired
+ lateinit var mobileApiService: MobileApiService
+ @Autowired
+ lateinit var userService: UserService
+ @Autowired
+ lateinit var redisTemplate: RedisTemplate<String, String>
+ @Autowired
+ lateinit var personDao: PersonDao
+
+ /**
+ * 用户信息
+ * */
+ @RequestMapping("/infor")
+ fun getUserInfor(): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ return JsonResult.ok("OK").put("now", System.currentTimeMillis())!!
+ }
+
+ /**
+ * 验证码生成,内部校验
+ * */
+ @RequestMapping("/code")
+ fun code(): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ if (user!!.phone.isNullOrEmpty()) {
+ return JsonResult.error("用户不存在,请注册")
+ }
+ var temp = redisTemplate.opsForValue().get(user!!.phone)
+ if (temp.isNullOrEmpty()) {
+ var code = RandomUtils.randomNumber(6)
+ System.out.println(code)
+ redisTemplate.opsForValue().set(user!!.phone, code, Duration.ofMinutes(5))
+ }
+ //TODO call send code sdk
+ return JsonResult.ok("验证码已发送")
+ }
+
+ @RequestMapping("/checkcode")
+ fun check(@RequestParam code: String
+ ): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ var temp = redisTemplate.opsForValue().get(user!!.phone)
+ if (!temp.isNullOrEmpty()) {
+ if (temp != code) {
+ return JsonResult.error("验证码错误")
+ }
+ var code = RandomUtils.getRandomString(30)
+ redisTemplate.opsForValue().set(user.uid, code, Duration.ofHours(1))
+ redisTemplate.delete(user!!.phone)
+ return JsonResult.ok("OK").put("randcode", code)!!
+ } else {
+ return JsonResult.error(-1, "验证码无效或已过期,请重新获取")
+ }
+ }
+
+ /**
+ * 绑卡
+ * */
+ @RequestMapping("/bindcard")
+ fun bindcard(card: String, name: String, code: String): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ var phone = user!!.phone
+ var temp = redisTemplate.opsForValue().get(phone)
+ if (!temp.isNullOrEmpty()) {
+ if (temp != code) {
+ return JsonResult.error("验证码错误")
+ }
+ if (user!!.userid.isNullOrEmpty()) {
+ var identy: TPersonIdentity? = userService.findPersonIdentity(card) ?: return JsonResult.error("银行卡号有误")
+ if (identy!!.person == null || identy.status != TradeDict.STATUS_NORMAL) {
+ return JsonResult.error("银行卡号信息有误")
+ }
+ if (identy!!.person.name != name) {
+ return JsonResult.error("姓名有误")
+ }
+ var temp: TBMobileUser? = mobileApiService.findUserById(identy!!.person.userid)
+ if (temp != null) {
+ return JsonResult.error("该银行卡号已被绑定,如有疑问,请联系客服")
+ }
+ user.bindtime = DateUtil.getNow()
+ user.userid = identy.person.userid
+ mobileApiService.saveUser(user)
+ redisTemplate.delete(phone)
+ var payseted = false
+ if (!user.paypwd.isNullOrEmpty()) {
+ payseted = true
+ }
+ return JsonResult.ok("OK").put("userid", user.userid)
+ ?.put("paypwdset", payseted)
+ ?.put("signed", if (user.issigned.isNullOrEmpty()) "" else user.issigned)!!
+ } else {
+ return JsonResult.error(-1, "用户已绑定银行卡")
+ .put("userid", if (user.userid.isNullOrEmpty()) "" else user.userid)!!
+ }
+ } else {
+ return JsonResult.error(-1, "验证码无效或已过期,请重新获取")
+ }
+ }
+
+ /**
+ * 支付密码
+ * */
+ @RequestMapping("/paypwd")
+ fun paypwd(pwd: String, repwd: String, oldpwd: String?, type: String, randcode: String?): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ if (pwd != repwd) {
+ return JsonResult.error("两次密码不一致,请确认")
+ }
+ if (pwd.length != 6) {
+ return JsonResult.error("支付密码为6位数字")
+ }
+ if (!StringUtils.isNumeric(pwd)) {
+ return JsonResult.error("支付密码为6位数字")
+ }
+ val encoder = BCryptPasswordEncoder()
+ if (user!!.paypwd.isNullOrEmpty()) {
+ user!!.paypwd = encoder.encode(pwd)
+ mobileApiService.saveUser(user)
+ return JsonResult.ok("OK")
+ ?.put("paypwdset", true)!!
+ } else {
+ when (type) {
+ "new" -> return JsonResult.error("支付密码已设置")
+ "renew" -> {
+ if (oldpwd.isNullOrEmpty()) {
+ return JsonResult.error("原支付密码错误")
+ }
+ if (user.paypwderror != null && user.paypwderror!! >= 5 && (System.currentTimeMillis() - user.paypwderrortime!!) < 1000 * 60 * 30) {
+ return JsonResult.error("密码错误次数过多,请30分钟后再试")
+ }else if (user.paypwderror != null && user.paypwderror!! >= 5 && (System.currentTimeMillis() - user.paypwderrortime!!) > 1000 * 60 * 30) {
+ //更新时间
+ user.paypwderror = 0
+ user.paypwderrortime = null
+ }
+ val encoder = BCryptPasswordEncoder()
+ var b = encoder.encode(oldpwd)
+ if (!encoder.matches(oldpwd,user.paypwd)) {
+ if (user.paypwderror == null || user.paypwderror == 0) {
+ user.paypwderror = 0
+ user.paypwderrortime = System.currentTimeMillis()
+ }
+ user.paypwderror += 1
+ mobileApiService.saveUser(user)
+ return JsonResult.error("原支付密码错误")
+ }
+ user!!.paypwd = encoder.encode(pwd)
+ mobileApiService.saveUser(user)
+ return JsonResult.ok("OK")
+ ?.put("paypwdset", true)!!
+ }
+ "find" -> {
+ if (randcode.isNullOrEmpty()) {
+ return JsonResult.error("信息有误,请返回并重新设置")
+ }
+ var code = redisTemplate.opsForValue().get(user.uid)
+ if (randcode != code) {
+ return JsonResult.error(-1, "长时间未操作,请返回上一步,并重新发送验证码")
+ }
+ user!!.paypwd = encoder.encode(pwd)
+ mobileApiService.saveUser(user)
+ redisTemplate.delete(user.uid)
+ return JsonResult.ok("OK")
+ ?.put("paypwdset", true)!!
+ }
+ else -> return JsonResult.error("请求错误")
+ }
+ }
+ }
+
+ /**
+ *
+ * 银行协议
+ * */
+ @RequestMapping("/bxy")
+ fun xieyi(): JsonResult {
+ var page = mobileApiService.findPageById(ConstantUtil.PAGE_BANKXIEYI)
+ if (page != null) {
+ return JsonResult.ok("OK").put("page", page.pageContent)!!
+ }
+ return JsonResult.error("页面未配置")
+ }
+
+ /**
+ *
+ * 签约银行协议
+ * */
+ @RequestMapping("/signbxy")
+ fun signbxy(agree: String): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ user!!.issigned = TradeDict.STATUS_YES
+ user!!.signedtime = DateUtil.getNow()
+ mobileApiService.saveUser(user)
+ //TODO 调用第三方接口签约
+ return JsonResult.ok("ok")
+ .put("signed", if (user.issigned.isNullOrEmpty()) "" else user.issigned)!!
+ }
+
+ /**
+ * 查询账单
+ * */
+ @RequestMapping("/bills")
+ fun bills(pageno: Int): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ val c = Calendar.getInstance()
+ val timeOfDay = c.get(Calendar.HOUR_OF_DAY)
+ var t = ""
+ when (timeOfDay) {
+ in 0..7 -> t = "早上好"
+ in 8..12 -> t = "上午好"
+ in 13..17 -> t = "下午好"
+ in 18..23 -> t = "晚上好"
+ }
+ if (user!!.userid.isNullOrEmpty()) {
+ return JsonResult.ok("OK").put("t", t)!!
+ }
+ var no = if (pageno <= 0) {
+ 1
+ } else {
+ pageno
+ }
+ var today = DateUtil.getNow("yyyyMMdd")
+ var yester = DateUtil.getNowInterDay(-1)
+ var acc = userService.findAccountByUserid(user.userid!!, null)
+ var point = userService.findPointsAccountByUserid(user.userid!!)
+ var amount = 0.0;
+ var pi = 0L
+ if (acc != null && acc.availbal != null) {
+ amount = acc.availbal
+ }
+ if (point != null && point.points != null) {
+ pi = point.points
+ }
+ var payseted = false
+ if (!user!!.paypwd.isNullOrEmpty()) {
+ payseted = true
+ }
+ var name = ""
+ var person = userService.findOnePersonByUserid(user.userid!!)
+ if (person != null) {
+ name = person.name
+ }
+ var page = userService.findPersondtlByUserid(user!!.userid!!, no)
+ return JsonResult.ok("OK").put("page", page)
+ ?.put("today", today)
+ ?.put("yesterday", yester)
+ ?.put("point", pi)
+ ?.put("amount", amount)
+ ?.put("paypwdset", payseted)
+ ?.put("name", name)
+ ?.put("signed", if (user.issigned.isNullOrEmpty()) "" else user.issigned)
+ ?.put("userid", if (user?.userid.isNullOrEmpty()) "" else user?.userid)!!
+ ?.put("t", t)!!
+ }
+
+ /**
+ * 账单明细
+ * */
+ @RequestMapping("/billdetail")
+ fun billdetail(billid: String): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ if (user!!.userid.isNullOrEmpty()) {
+ return JsonResult.ok("OK")
+ }
+ var dtl = userService.findPersondtlDetailByUserid(user?.userid!!, billid)
+ return JsonResult.ok("OK").put("dtl", dtl)!!
+ }
+
+ /**
+ * 密码修改
+ * */
+ @RequestMapping("/pwdset")
+ fun pwdset(oldpwd: String, newpwd: String, renewpwd: String): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ if (newpwd != renewpwd) {
+ return JsonResult.error("两次密码不一致,请确认")
+ }
+ if (newpwd.isNullOrEmpty() || newpwd.length < 6) {
+ return JsonResult.error("请重新设置密码,密码不能小于6位字符")
+ }
+ if (user!!.loginpwderror > 5) {
+ return JsonResult.error(-1, "原密码错误次数过多,将退出系统,请重新登录系统或点击忘记密码功能找回密码")
+ }
+ val encoder = BCryptPasswordEncoder()
+ if (!encoder.matches(oldpwd,user!!.loginpwd)) {
+ user.loginpwderror += 1
+ mobileApiService.saveUser(user)
+ return JsonResult.error("原密码错误")
+ }
+ if (user.loginpwderror != null && user.loginpwderror!! > 0) {
+ user.loginpwderror = 0
+ user.loginpwderrortime = null
+ }
+ user.loginpwd = encoder.encode(newpwd)
+ mobileApiService.saveUser(user)
+ return JsonResult.ok("密码修改成功")
+ }
+
+ /**
+ *
+ * 市民卡挂失
+ * */
+ @RequestMapping("/cardlost")
+ fun cardlost(paypwd: String): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ //TODO cardlost
+ return JsonResult.ok("ok")
+ }
+
+ /**
+ *
+ * 二维码在线生成
+ * */
+ @RequestMapping("/qrcode")
+ fun qrcode(): JsonResult {
+ val p = SecurityContextHolder.getContext().authentication
+ var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
+ //TODO cardlost
+ return JsonResult.ok("ok")
+ }
+
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/MobileUserDao.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/MobileUserDao.kt
new file mode 100644
index 0000000..76ad4c6
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/MobileUserDao.kt
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.mobile.dao
+
+import com.supwisdom.dlpay.mobile.domain.TBMobileUser
+import org.springframework.data.jpa.repository.JpaRepository
+import org.springframework.stereotype.Repository
+
+@Repository
+interface MobileUserDao : JpaRepository<TBMobileUser, String> {
+ fun findByPhone(phone: String): TBMobileUser?
+}
+
+
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
new file mode 100644
index 0000000..285546a
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
@@ -0,0 +1,161 @@
+package com.supwisdom.dlpay.mobile.domain
+
+import com.supwisdom.dlpay.framework.util.TradeDict
+import org.hibernate.annotations.GenericGenerator
+import org.springframework.security.core.GrantedAuthority
+import org.springframework.security.core.userdetails.UserDetails
+import javax.persistence.*
+
+@Entity
+@Table(name = "TB_MOBILE_USER")
+class TBMobileUser : UserDetails {
+ override fun getAuthorities(): Collection<GrantedAuthority>? {
+ return this.auths
+ }
+
+ override fun isEnabled(): Boolean {
+ return TradeDict.STATUS_CLOSED != this.status
+ }
+
+ override fun getUsername(): String {
+ return this.phone
+ }
+
+ override fun isCredentialsNonExpired(): Boolean {
+ return true
+ }
+
+ override fun getPassword(): String {
+ return this.loginpwd
+ }
+
+ override fun isAccountNonExpired(): Boolean {
+ return true
+ }
+
+ override fun isAccountNonLocked(): Boolean {
+ return TradeDict.STATUS_LOCKED != this.status
+ }
+ @Transient
+ var auths: Collection<GrantedAuthority>? = null
+
+
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "uid", nullable = false, length = 32)
+ var uid: String = ""
+ /**
+ * 手机号
+ * */
+ @Column(name = "phone", length = 15)
+ var phone: String = ""
+
+ /**
+ * 设备uuid
+ * */
+ @Column(name = "devuid", length = 64)
+ var devuid: String? = null
+
+ /**
+ * 注册时间
+ * */
+ @Column(name = "registerdate", length = 16)
+ var registerdate: String? = null
+
+ /**
+ * 关联tb_person
+ * */
+ @Column(name = "userid", length = 32)
+ var userid: String? = null
+
+ /**
+ * 银行卡绑定时间
+ * */
+ @Column(name = "bindtime", length = 14)
+ var bindtime: String? = null
+
+ /**
+ * 注册手机类型
+ * */
+ @Column(name = "registerplatform", length = 100)
+ var registerplatform: String? = null
+
+ /**
+ * 最后登录时间
+ * */
+ @Column(name = "lastlogin", length = 16)
+ var lastlogin: String? = null
+
+ /**
+ * 最后登录手机类型
+ * */
+ @Column(name = "lastloginplatform", length = 100)
+ var lastloginplatform: String? = null
+
+ /**
+ * 状态
+ * */
+ @Column(name = "status", length = 16)
+ var status: String? = null
+
+ /**
+ * 登录密码
+ * */
+ @Column(name = "loginpwd", length = 64)
+ var loginpwd: String = ""
+
+ /**
+ * 支付密码
+ * */
+ @Column(name = "paypwd", length = 64)
+ var paypwd: String? = null
+
+ /**
+ * 登录密码错误次数
+ * */
+ @Column(name = "loginpwderror", length = 4)
+ var loginpwderror: Int = 0
+
+ /**
+ * 登录密码错误时间
+ * */
+ @Column(name = "loginpwderrortime", length = 16)
+ var loginpwderrortime: Long? = 0
+
+ /**
+ * 支付密码错误次数
+ * */
+ @Column(name = "paypwderror", length = 4)
+ var paypwderror: Int = 0
+
+ /**
+ * 支付密码错误时间
+ * */
+ @Column(name = "paypwderrortime", length = 16)
+ var paypwderrortime: Long? = 0
+
+
+ /**
+ * jti
+ * */
+ @Column(name = "jti", length = 64)
+ var jti: String? = null
+
+ /**
+ * 签约
+ * */
+ @Column(name = "issigned", length = 20)
+ var issigned: String? = null
+ /**
+ * 签约时间
+ * */
+ @Column(name = "signedtime", length = 20)
+ var signedtime: String? = null
+
+ /**
+ * 头像
+ * */
+ @Column(name = "ulogo", length = 100)
+ var ulogo: String? = null
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/exception/UserLoginFailException.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/exception/UserLoginFailException.kt
new file mode 100644
index 0000000..67d6243
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/exception/UserLoginFailException.kt
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.mobile.exception
+
+import org.springframework.security.core.AuthenticationException
+
+class UserLoginFailException(msg: String) : AuthenticationException(msg) {
+ private val serialVersionUID = 1170189980006964105L
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt
new file mode 100644
index 0000000..6ddc123
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.mobile.service
+
+import com.supwisdom.dlpay.mobile.domain.TBMobileUser
+import com.supwisdom.dlpay.mobile.domain.TBPages
+
+interface MobileApiService {
+ fun saveUser(user: TBMobileUser): TBMobileUser
+
+ fun findPageById(pageid: String): TBPages?
+
+ fun findUserByPhone(phone: String): TBMobileUser?
+
+ fun findUserById(id: String): TBMobileUser?
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileUserService.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileUserService.kt
new file mode 100644
index 0000000..f8b5d8d
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileUserService.kt
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.mobile.service
+
+import com.supwisdom.dlpay.mobile.domain.TBMobileUser
+import org.springframework.security.core.userdetails.UserDetailsService
+
+interface MobileUserService : UserDetailsService {
+
+ fun getByUid(uid: String): TBMobileUser?
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt
new file mode 100644
index 0000000..21cd2ee
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.mobile.service.impl
+
+import com.supwisdom.dlpay.mobile.dao.MobileUserDao
+import com.supwisdom.dlpay.mobile.dao.PagesDao
+import com.supwisdom.dlpay.mobile.domain.TBMobileUser
+import com.supwisdom.dlpay.mobile.domain.TBPages
+import com.supwisdom.dlpay.mobile.service.MobileApiService
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+@Service
+class MobileApiServiceImpl : MobileApiService {
+ @Autowired
+ lateinit var mobileUserDao: MobileUserDao
+
+ @Autowired
+ lateinit var pagesDao: PagesDao
+
+ override fun saveUser(user: TBMobileUser): TBMobileUser {
+ return mobileUserDao.save(user)
+ }
+
+ override fun findPageById(pageid: String): TBPages? {
+ var t = pagesDao.findById(pageid)
+ if (t.isPresent) {
+ return t.get()
+ }
+ return null
+ }
+
+ override fun findUserByPhone(phone: String): TBMobileUser? {
+ return mobileUserDao.findByPhone(phone)
+ }
+
+ override fun findUserById(id: String): TBMobileUser? {
+ var t = mobileUserDao.findById(id)
+ if(t.isPresent){
+ return t.get()
+ }
+ return null
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileUserServiceImpl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileUserServiceImpl.kt
new file mode 100644
index 0000000..197da10
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileUserServiceImpl.kt
@@ -0,0 +1,55 @@
+package com.supwisdom.dlpay.mobile.service.impl
+
+import com.supwisdom.dlpay.mobile.dao.MobileUserDao
+import com.supwisdom.dlpay.mobile.domain.TBMobileUser
+import com.supwisdom.dlpay.mobile.exception.UserLoginFailException
+import com.supwisdom.dlpay.mobile.service.MobileUserService
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.security.core.GrantedAuthority
+import org.springframework.security.core.authority.AuthorityUtils
+import org.springframework.security.core.userdetails.UserDetails
+import org.springframework.security.core.userdetails.UsernameNotFoundException
+import org.springframework.stereotype.Service
+
+@Service
+class MobileUserServiceImpl : MobileUserService {
+ var logger = LoggerFactory.getLogger(MobileUserServiceImpl::class.java)
+
+ @Autowired
+ lateinit var mobileUserDao: MobileUserDao
+
+ override fun loadUserByUsername(username: String?): UserDetails {
+ logger.error("username:"+username)
+ if(username.isNullOrEmpty()){
+ throw UsernameNotFoundException("用户不存在")
+ }
+ var temp = mobileUserDao.findByPhone(username!!)
+ if(temp!=null) {
+ if(temp.loginpwd.isNullOrEmpty()){
+ throw UserLoginFailException("用户注册后未设置登录密码,请找回密码或重新注册")
+ }
+ if (temp.loginpwderror != null && temp.loginpwderror!! >= 5 && (System.currentTimeMillis() - temp.loginpwderrortime!!) < 1000 * 60 * 30) {
+ throw UserLoginFailException("密码错误次数过多,请30分钟后再试")
+ } else if (temp.loginpwderror != null && temp.loginpwderror!! >= 5 && (System.currentTimeMillis() - temp.loginpwderrortime!!) > 1000 * 60 * 30) {
+ //更新时间
+ temp.loginpwderror = 0
+ temp.loginpwderrortime = null
+ mobileUserDao.save(temp)
+ }
+ var authorities: Collection<GrantedAuthority> = AuthorityUtils.createAuthorityList("ROLE_USER")
+ temp.auths = authorities
+ }else{
+ throw UsernameNotFoundException("用户不存在")
+ }
+ return temp
+ }
+
+ override fun getByUid(uid: String): TBMobileUser? {
+ var t = mobileUserDao.findById(uid)
+ if(t.isPresent){
+ return t.get()
+ }
+ return null
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/oauth.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/oauth.kt
new file mode 100644
index 0000000..a249193
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/oauth.kt
@@ -0,0 +1,87 @@
+package com.supwisdom.dlpay
+
+import com.supwisdom.dlpay.system.service.ParamService
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.annotation.Configuration
+import org.springframework.data.redis.connection.RedisConnectionFactory
+import org.springframework.security.authentication.AuthenticationManager
+import org.springframework.security.core.Authentication
+import org.springframework.security.core.GrantedAuthority
+import org.springframework.security.core.authority.SimpleGrantedAuthority
+import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer
+import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer
+import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter
+import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer
+import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer
+import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer
+import org.springframework.security.oauth2.provider.ClientDetails
+import org.springframework.security.oauth2.provider.ClientDetailsService
+import org.springframework.security.oauth2.provider.client.BaseClientDetails
+import org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter
+import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore
+import java.util.*
+import org.springframework.security.oauth2.provider.token.TokenStore
+
+
+
+
+class OAuthDetailService : ClientDetailsService {
+ @Autowired
+ private lateinit var paramService: ParamService;
+ override fun loadClientByClientId(clientId: String?): ClientDetails {
+ val details = BaseClientDetails()
+ if (clientId.isNullOrEmpty()) {
+ return details
+ }
+ details.clientId = clientId
+ paramService.getApiClientByAppid(clientId)?.let {
+ details.setAuthorizedGrantTypes(Arrays.asList("password","authorization_code","refresh_token"))
+ details.setScope(Arrays.asList("read"))
+ details.setResourceIds(Arrays.asList("oauth2-resource"))
+ val authorities = HashSet<GrantedAuthority>()
+ authorities.add(SimpleGrantedAuthority("ROLE_THIRD_ADMIN"))
+ details.authorities = authorities
+ details.setAutoApproveScopes(Arrays.asList("true"))
+ details.clientSecret = it.bcryptSecret
+ details.accessTokenValiditySeconds = 3600
+ details.refreshTokenValiditySeconds=43200
+ val redir = HashSet<String>()
+ redir.add("http://localhost:8091/wt/sso/login")
+ details.registeredRedirectUri = redir
+ }
+ return details
+ }
+}
+
+
+@Configuration
+class OAuth2Config {
+
+ @Configuration
+ @EnableAuthorizationServer
+
+ class AuthorizationServerConfigure : AuthorizationServerConfigurerAdapter() {
+
+ @Autowired
+ private lateinit var redisConnectionFactory: RedisConnectionFactory
+
+ @Autowired
+ private lateinit var authenticationManager: AuthenticationManager
+
+
+ override fun configure(security: AuthorizationServerSecurityConfigurer?) {
+ security?.allowFormAuthenticationForClients()
+ }
+
+ override fun configure(clients: ClientDetailsServiceConfigurer?) {
+ clients?.withClientDetails(OAuthDetailService())
+ }
+
+ override fun configure(endpoints: AuthorizationServerEndpointsConfigurer?) {
+ endpoints?.tokenStore(RedisTokenStore(redisConnectionFactory))
+ ?.authenticationManager(authenticationManager)
+ }
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt
new file mode 100644
index 0000000..4b81a02
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -0,0 +1,372 @@
+package com.supwisdom.dlpay
+
+import com.supwisdom.dlpay.framework.core.JwtConfig
+import com.supwisdom.dlpay.framework.core.JwtTokenUtil
+import com.supwisdom.dlpay.framework.core.PasswordBCryptConfig
+import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
+import com.supwisdom.dlpay.framework.security.MyAuthenticationFailureHandler
+import com.supwisdom.dlpay.framework.security.ValidateCodeSecurityConfig
+import com.supwisdom.dlpay.framework.service.OperatorDetailService
+import com.supwisdom.dlpay.framework.util.Constants
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.mobile.AuthLoginFailHandler
+import com.supwisdom.dlpay.mobile.AuthLoginSuccessHandler
+import com.supwisdom.dlpay.mobile.service.MobileUserService
+import org.jose4j.jwt.ReservedClaimNames
+import org.jose4j.jwt.consumer.InvalidJwtException
+import org.jose4j.lang.JoseException
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.core.annotation.Order
+import org.springframework.data.redis.connection.RedisConnectionFactory
+import org.springframework.http.HttpStatus
+import org.springframework.security.authentication.AuthenticationManager
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity
+import org.springframework.security.config.annotation.web.builders.HttpSecurity
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
+import org.springframework.security.config.http.SessionCreationPolicy
+import org.springframework.security.core.authority.SimpleGrantedAuthority
+import org.springframework.security.core.context.SecurityContextHolder
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
+import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
+import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher
+import org.springframework.stereotype.Component
+import org.springframework.web.cors.CorsConfiguration
+import org.springframework.web.cors.CorsConfigurationSource
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource
+import org.springframework.web.filter.OncePerRequestFilter
+import java.security.SecureRandom
+import java.util.*
+import javax.servlet.FilterChain
+import javax.servlet.http.HttpServletRequest
+import javax.servlet.http.HttpServletResponse
+import javax.sql.DataSource
+import kotlin.collections.ArrayList
+
+
+@Component
+class ApiJwtAuthenticationFilter : OncePerRequestFilter() {
+ @Autowired
+ lateinit var jwtConfig: JwtConfig
+
+ @Autowired
+ lateinit var apiJwtRepository: ApiJwtRepository
+
+ private var jwtUtil: JwtTokenUtil? = null
+
+ @Autowired
+ private lateinit var redisConnectionFactory: RedisConnectionFactory
+
+
+ private fun getUtil(): JwtTokenUtil {
+ if (jwtUtil == null) {
+ jwtUtil = JwtTokenUtil((jwtConfig))
+ }
+ return jwtUtil as JwtTokenUtil
+ }
+
+ override fun doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain) {
+ var context: String? = request.contextPath
+ if (context == null || "" == context.trim { it <= ' ' }) {
+ context = "/"
+ }
+ if (request.requestURI.isEmpty()) {
+ filterChain.doFilter(request, response)
+ return
+ }
+ var url = request.requestURI
+ if ("/" != context) {
+ url = url.replace(context, "")
+ }
+ logger.info(url)
+ if (!url.startsWith("/api/") && !url.startsWith("/mobileapi/v1/")) {
+ filterChain.doFilter(request, response)
+ return
+ }
+ request.getHeader(jwtConfig.header)?.let { authHeader ->
+ try {
+ val jwt = if (authHeader.startsWith(jwtConfig.tokenHeader)) {
+ authHeader.substring(jwtConfig.tokenHeader.length)
+ } else {
+ throw JoseException("JWT Header error")
+ }
+ if (url.contains("/userinfor")) {
+ SecurityContextHolder.getContext().authentication = RedisTokenStore(redisConnectionFactory).readAuthentication(jwt)
+ filterChain.doFilter(request, response)
+ return
+ }
+ val claims = getUtil().verifyToken(jwt)
+ if (url.equals("/mobileapi/v1/logout")) {
+ SecurityContextHolder.clearContext()
+ apiJwtRepository.deleteById(claims[ReservedClaimNames.JWT_ID].toString())
+ throw JoseException("JWT has not been register")
+ }
+
+ apiJwtRepository.findById(claims[ReservedClaimNames.JWT_ID].toString()).let {
+ if (!it.isPresent) {
+ throw JoseException("JWT has not been register")
+ }
+ // token 已被设为黑名单
+ if (it.get().status != TradeDict.JWT_STATUS_NORMAL) {
+ throw JoseException("JWT status error : ${it.get().status}")
+ }
+ }
+ val tenantId = request.getHeader(Constants.HEADER_TETANTID)
+ if (tenantId == null) {
+ response.status = HttpStatus.UNAUTHORIZED.value()
+ return
+ }
+ if (claims[Constants.JWT_CLAIM_TENANTID] != tenantId) {
+ response.status = HttpStatus.UNAUTHORIZED.value()
+ return
+ }
+ val auth = UsernamePasswordAuthenticationToken(claims[Constants.JWT_CLAIM_UID], null,
+ (claims[Constants.JWT_CLAIM_AUTHORITIES] as ArrayList<*>)
+ .map { SimpleGrantedAuthority(it as String) })
+ SecurityContextHolder.getContext().authentication = auth
+ } catch (e: InvalidJwtException) {
+ SecurityContextHolder.clearContext()
+ if (e.hasExpired()) {
+ // jwt 过期后返回 401
+ apiJwtRepository.deleteById(e.jwtContext.jwtClaims.jwtId)
+ }
+ response.status = HttpStatus.UNAUTHORIZED.value()
+ return
+ } catch (e: JoseException) {
+ SecurityContextHolder.clearContext()
+ // jwt 失效后返回 401
+ response.status = HttpStatus.UNAUTHORIZED.value()
+ response.contentType = "application/json;charset=UTF-8"
+ return
+ } catch (e:Exception){
+ SecurityContextHolder.clearContext()
+ // jwt 失效后返回 401
+ response.status=HttpStatus.UNAUTHORIZED.value()
+ response.contentType = "application/json;charset=UTF-8"
+ return
+ }
+ }
+ filterChain.doFilter(request, response)
+ }
+}
+
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+class WebSecurityConfig {
+
+ companion object {
+ @Configuration
+ @Order(1)
+ class ApiWebSecurityConfigurationAdapter : WebSecurityConfigurerAdapter() {
+
+ @Autowired
+ lateinit var apiFilter: ApiJwtAuthenticationFilter
+
+ override fun configure(http: HttpSecurity) {
+ // 设置 API 访问权限管理
+ http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+ .and()
+ .antMatcher("/api/**")
+ .addFilterAfter(apiFilter,
+ UsernamePasswordAuthenticationFilter::class.java)
+ .authorizeRequests()
+ .antMatchers("/api/auth/**").permitAll()
+ .antMatchers("/api/notify/**").permitAll()
+ .antMatchers("/api/common/**").permitAll()
+ .antMatchers("/api/userinfor").hasAnyRole("ADMIN", "THIRD_ADMIN")
+// .antMatchers("/api/common/**").hasAnyRole("THIRD_COMMON", "THIRD_ADMIN")
+ .antMatchers("/api/consume/**").hasRole("THIRD_CONSUME")
+ .antMatchers("/api/recharge/**").hasRole("THIRD_DEPOSIT")
+ .antMatchers("/api/user/**").hasRole("THIRD_ADMIN")
+ .antMatchers("/api/shop/**").hasRole("THIRD_SHOP")
+ .anyRequest().hasRole("THIRD_COMMON")
+ .and()
+ .csrf().ignoringAntMatchers("/api/**", "oauth/**")
+ }
+
+ @Bean
+ override fun authenticationManager(): AuthenticationManager {
+ return super.authenticationManagerBean()
+ }
+ }
+
+ @Configuration
+ @Order(2)
+ class MobileApiSecurityConfigurationAdapter : WebSecurityConfigurerAdapter() {
+ @Autowired
+ lateinit var failureHandler: AuthLoginFailHandler
+ @Autowired
+ lateinit var successHandler: AuthLoginSuccessHandler
+ @Autowired
+ lateinit var passwordBCryptConfig: PasswordBCryptConfig
+
+ @Autowired
+ lateinit var userDetailsService: MobileUserService
+
+ @Autowired
+ lateinit var apiFilter: ApiJwtAuthenticationFilter
+
+ override fun configure(auth: AuthenticationManagerBuilder) {
+ auth.authenticationProvider(userProvider())
+ }
+
+ @Bean
+ fun userProvider(): DaoAuthenticationProvider {
+ return DaoAuthenticationProvider().apply {
+ setUserDetailsService(userDetailsService)
+ setPasswordEncoder(userPasswordEncoder())
+ }
+ }
+
+ @Bean
+ fun userPasswordEncoder(): BCryptPasswordEncoder {
+ return if (passwordBCryptConfig.seed.isBlank()) {
+ BCryptPasswordEncoder()
+ } else {
+ BCryptPasswordEncoder(passwordBCryptConfig.length,
+ SecureRandom(passwordBCryptConfig.seed.toByteArray()))
+ }
+ }
+
+ override fun configure(http: HttpSecurity) {
+ http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+ .and()
+ .cors()
+ .and()
+ .antMatcher("/mobileapi/**")
+ .addFilterAfter(apiFilter,
+ UsernamePasswordAuthenticationFilter::class.java)
+ .authorizeRequests().antMatchers("/mobileapi/i/**","/mobileapi/login")
+ .permitAll().anyRequest().authenticated()
+ .and()
+ .formLogin()
+ .loginProcessingUrl("/mobileapi/login")
+ .failureHandler(failureHandler)
+ .successHandler(successHandler)
+ .and().csrf().disable()
+ .sessionManagement().maximumSessions(1)
+ .expiredUrl("/mobileapi/sessionexpired")
+ }
+ @Bean
+ fun corsConfigurationSource(): CorsConfigurationSource {
+ //手机端支持跨域请求
+ val configuration = CorsConfiguration()
+ configuration.allowedOrigins = Arrays.asList("*")
+ configuration.allowedMethods = Arrays.asList("GET","POST")
+ configuration.allowedHeaders = Arrays.asList("*")
+ val source = UrlBasedCorsConfigurationSource()
+ source.registerCorsConfiguration("/mobileapi/**", configuration);
+ return source
+ }
+ }
+
+ @Configuration
+ class MvcWebSecurityConfigurationAdapter : WebSecurityConfigurerAdapter() {
+ @Autowired
+ lateinit var dataSource: DataSource
+ @Autowired
+ lateinit var validateCodeSecurityConfig: ValidateCodeSecurityConfig
+ @Autowired
+ lateinit var authenticationFailureHandler: MyAuthenticationFailureHandler
+ @Autowired
+ lateinit var passwordBCryptConfig: PasswordBCryptConfig
+
+ @Autowired
+ lateinit var userDetailsService: OperatorDetailService
+
+ override fun configure(auth: AuthenticationManagerBuilder) {
+ auth.authenticationProvider(authenticationProvider())
+ }
+
+ @Bean
+ fun authenticationProvider(): DaoAuthenticationProvider {
+ return DaoAuthenticationProvider().apply {
+ setUserDetailsService(userDetailsService)
+ setPasswordEncoder(passwordEncoder())
+ }
+ }
+
+ @Bean
+ fun passwordEncoder(): BCryptPasswordEncoder {
+ return if (passwordBCryptConfig.seed.isBlank()) {
+ BCryptPasswordEncoder()
+ } else {
+ BCryptPasswordEncoder(passwordBCryptConfig.length,
+ SecureRandom(passwordBCryptConfig.seed.toByteArray()))
+ }
+ }
+
+ @Bean
+ fun jdbcTokenImplement(): JdbcTokenRepositoryImpl {
+ return JdbcTokenRepositoryImpl().also {
+ it.setDataSource(dataSource)
+ }
+ }
+
+ override fun configure(http: HttpSecurity) {
+ // 设置 Web MVC 应用权限
+ http.apply(validateCodeSecurityConfig)
+ .and()
+ .authorizeRequests()
+ .antMatchers("/login", "/login/form", "/mobileapi/**").permitAll()
+ .antMatchers("/static/**").permitAll()
+ .antMatchers("/code/image").permitAll()
+ .antMatchers("/**").hasAnyRole("USER", "ADMIN")
+ .anyRequest().authenticated()
+ .and()
+ .sessionManagement()
+ .sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
+ .and()
+ .formLogin()
+ .loginPage("/login")
+ .loginProcessingUrl("/login/form")
+ .failureHandler(authenticationFailureHandler)
+ .defaultSuccessUrl("/", false)
+ .and()
+ .logout()
+ .logoutRequestMatcher(AntPathRequestMatcher("/logout"))
+ .logoutSuccessUrl("/login")
+ .deleteCookies("JSESSIONID")
+ .invalidateHttpSession(true)
+ .and().csrf().ignoringAntMatchers("oauth/**")
+ // 设置 Web MVC 应用权限
+// http.apply(validateCodeSecurityConfig)
+// .and()
+// .formLogin()
+// .loginPage("/login")
+// .loginProcessingUrl("/login/form")
+// .successHandler(zyAuthenticationSuccessHandler)
+// .failureHandler(zyAuthenticationFailureHandler)
+// .and()
+// .logout()
+// .logoutRequestMatcher(AntPathRequestMatcher("/logout"))
+// .logoutSuccessUrl("/login")
+// .deleteCookies("JSESSIONID")
+// .invalidateHttpSession(true)
+// .and()
+// .userDetailsService(userDetailsService)
+// .authorizeRequests()
+// .antMatchers("/login").permitAll()
+// .antMatchers("/static/**").permitAll()
+// .antMatchers("/code/image").permitAll()
+// .anyRequest().authenticated()
+// .and()
+// .sessionManagement()
+// .invalidSessionStrategy(myInvalidSessionStrategy)
+// .maximumSessions(1)
+// .sessionRegistry(SessionRegistryImpl())
+// .maxSessionsPreventsLogin(true)
+// .and()
+// .and()
+// .headers().frameOptions().disable()
+ }
+ }
+ }
+}
diff --git a/payapi/src/main/resources/application.properties b/payapi/src/main/resources/application.properties
new file mode 100644
index 0000000..cee20f1
--- /dev/null
+++ b/payapi/src/main/resources/application.properties
@@ -0,0 +1,35 @@
+#######################################springboot配置 start#################################
+spring.application.name=supwisdom.payapi
+spring.cloud.consul.discovery.health-check-path=${management.context-path}/api/common/version
+spring.cloud.consul.discovery.health-check-interval=10s
+spring.cloud.consul.discovery.instanceId=${spring.application.name}:${spring.application.instance_id:${random.value}}
+# 单库数据库配置
+spring.jpa.show-sql=true
+spring.datasource.hikari.connection-timeout=60000
+spring.datasource.hikari.maximum-pool-size=5
+spring.jpa.hibernate.ddl-auto=update
+# logging
+logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n
+logging.level.org.hibernate.SQL=debug
+#################### JSP PAGE ####################
+#spring.mvc.view.prefix=/pages/
+#spring.mvc.view.suffix=.jsp
+server.servlet.context-path=/payapi
+#################### thymeleaf ####################
+spring.mvc.static-path-pattern=/static/**
+spring.thymeleaf.prefix=classpath:/templates/
+spring.thymeleaf.suffix=.html
+spring.thymeleaf.encoding=UTF-8
+spring.thymeleaf.mode=HTML5
+spring.thymeleaf.cache=false
+spring.thymeleaf.enabled=true
+##################################################
+## quartz task scheduler
+shopbalance.updater.cron=10/* * * * *
+dayend.settletask.cron=0 3/30 2-3 * * ?
+#dayend.settletask.cron = 0 0/2 * * * ?
+################################################
+# user password
+auth.password.bcrypt.length=10
+###################################################
+spring.redis.database=0
\ No newline at end of file
diff --git a/payapi/src/main/resources/data-postgresql.sql b/payapi/src/main/resources/data-postgresql.sql
new file mode 100644
index 0000000..89ba0ee
--- /dev/null
+++ b/payapi/src/main/resources/data-postgresql.sql
@@ -0,0 +1,16 @@
+--pg--
+INSERT INTO "tb_period" ("period_year", "period_month", "startdate", "enddate", "settleflag" , "tenantid")
+VALUES (to_number(to_char(CURRENT_TIMESTAMP,'yyyy'),'9999'),to_number(to_char(CURRENT_TIMESTAMP,'MM'),'99'), to_char(CURRENT_TIMESTAMP,'yyyyMM')||'01', to_char((to_date(to_char(CURRENT_TIMESTAMP+'1 month','yyyyMM')||'01','yyyyMMdd')-1)::Timestamp,'yyyyMMdd'), 0, '{tenantid}');
+
+insert into TB_SETTLECTL(BOOKSETNO,PERIODYEAR,PERIODMONTH,STATDATE,SETTLEDATE,STATUS,updtime, "tenantid")
+values (1,to_number(to_char(CURRENT_TIMESTAMP,'yyyy'),'9999'),to_number(to_char(CURRENT_TIMESTAMP,'MM'),'99'),to_number(to_char(CURRENT_TIMESTAMP,'yyyyMMdd'),'99999999'),to_number(to_char(CURRENT_TIMESTAMP,'yyyyMMdd'),'99999999'),0,to_char(CURRENT_TIMESTAMP,'yyyyMMddhh24miss'), '{tenantid}');
+
+insert into TB_VOUCHERNOCTL(VOUCHERTYPE,PERIODMONTH,VOUCHERNO,"tenantid")
+values (1,to_number(to_char(CURRENT_TIMESTAMP,'MM'),'99'),0, , '{tenantid}');
+
+update TB_SUBJECT set opendate = to_number(to_char(CURRENT_TIMESTAMP,'yyyymmdd'),'99999999');
+
+CREATE SEQUENCE seq_refno;
+
+--------- end of script
+commit;
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
new file mode 100644
index 0000000..37daf22
--- /dev/null
+++ b/payapi/src/main/resources/data.sql
@@ -0,0 +1,543 @@
+INSERT INTO tb_tenantconfig(cfgid, tenantid, datacenter_id)
+values ('main', '{tenantid}', '01');
+
+INSERT INTO tb_operator(operid, closedate, opendate, opercode, opername, operpwd, opertype, status, thirdadmin, tenantid)
+VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', 'oper', 'normal', 'no', '{tenantid}');
+
+
+INSERT INTO tb_role(roleid, createtime, editflag, lastsaved, rolecode, roledesc, rolename, tenantid)
+VALUES ('d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '20190101000000', 0, '', 'ROLE_ADMIN', '超级管理员', '超级管理员', '{tenantid}');
+
+INSERT INTO tb_oper_role(id, operid, roleid, tenantid)
+VALUES ('1', 'LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (1, NULL, 0, NULL, 'layui-icon-home', '#', '主页', 1, -1, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (2, NULL, 1, NULL, 'layui-icon-home', '/home/console', '控制台', 1, 1, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (3, NULL, 0, NULL, 'layui-icon-set', '#', '系统中心', 2, -1, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (5, NULL, 1, NULL, 'layui-icon-set', '/role/index', '角色管理', 2, 3, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (6, NULL, 1, NULL, 'layui-icon-set', '/operator/index', '操作员管理', 4, 3, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (4, NULL, 1, NULL, 'layui-icon-set', '/function/index', '功能维护', 1, 3, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (7, NULL, 0, NULL, 'layui-icon-release', '#', '商户中心', 4, -1, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (9, NULL, 1, NULL, '', '/operator/logs', '操作日志', 4, 3, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (10, NULL, 0, NULL, 'layui-icon-util', '#', '参数管理', 3, -1, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (11, NULL, 1, NULL, 'layui-icon-util', '/param/syspara', '全局参数配置', 1, 10, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (12, NULL, 1, NULL, 'layui-icon-util', '/param/businesspara', '业务参数配置', 2, 10, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (17, NULL, 1, NULL, 'layui-icon-util', '/param/apiclientpara', '应用参数配置', 3, 10, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (18, NULL, 1, NULL, 'layui-icon-util', '/param/paytype', '支付能力配置', 4, 10, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (19, NULL, 0, NULL, 'layui-icon-user', '#', '用户中心', 5, -1, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (20, NULL, 0, NULL, 'layui-icon-rmb', '#', '结算中心', 6, -1, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (21, NULL, 1, NULL, '', '/user/index', '用户管理', 1, 19, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (23, NULL, 1, NULL, '', '/shop/index', '商户管理', 1, 7, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (24, NULL, 1, NULL, '', '/user/point', '积分管理', 3, 19, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (22, NULL, 1, NULL, '', '/user/acc', '账户管理', 2, 19, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (25, NULL, 1, NULL, '', '/shop/config', '商户支付能力配置', 2, 7, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (26, NULL, 0, NULL, 'layui-icon-tabs', '#', '流水管理', 3, -1, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (27, NULL, 1, NULL, '', '/dtl/userdtl', '个人流水查询', 1, 26, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (28, NULL, 1, NULL, '', '/dtl/shopdtl', '商户流水查询', 2, 26, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (29, NULL, 1, NULL, '', '/report/subjectday', '科目汇总表', 1, 20, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (30, NULL, 1, NULL, '', '/report/subjectdetail', '科目明细账', 2, 20, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (31, NULL, 1, NULL, '', '/report/shopbusiness', '商户营业情况表', 3, 20, '{tenantid}');
+
+
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b7955772c0032', 1, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b7955772d0033', 2, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b7955772d0034', 3, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b7955772d0035', 5, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557730003b', 6, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b795577310041', 4, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557732004a', 9, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557732004c', 7, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557732004d', 23, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b795577330052', 25, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557733005a', 20, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557733005b', 29, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557733005d', 30, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557733005f', 31, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b795577340061', 19, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b795577340062', 21, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b795577350068', 24, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557735006a', 22, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557735006c', 26, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557735006d', 27, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557735006f', 28, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b795577350071', 10, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b795577350072', 11, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b795577360074', 17, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b79557736007b', 12, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", "permissions", tenantid)
+VALUES ('ff8080816b7947ed016b795577370081', 18, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, '{tenantid}');
+
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (4, '1', 4, '添加功能', '/function/add', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (5, '', 4, '添加父功能', '/function/loadadd', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (6, '1', 6, '查询', '/operator/index', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (7, '', 6, '添加查询', '/operator/load4add', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (8, '', 6, '添加和修改', '/operator/add', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (9, '', 6, '重置密码', '/operator/resetpwd', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (10, '', 4, '查询', '/function/index', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (11, '', 4, '删除', '/function/delfunc', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (12, '', 4, '添加子功能', '/function/loadsubadd', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (13, '', 4, '维护资源', '/function/loadres', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (14, '', 4, '添加资源', '/function/addres', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (15, '', 4, '删除资源', '/function/delres', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (16, '', 5, '查询', '/role/index', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (17, '', 5, '添加', '/role/add', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (19, '', 5, '分配功能', '/role/addfunc', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (20, '', 5, '加载分配功能', '/role/loadfunc', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (21, '', 5, '删除角色', '/role/del', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (22, '', 6, '修改状态', '/operator/updatestate', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (24, '', 9, '查询', '/operator/logslist', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (26, '', 11, '修改', '/param/sysparaupdate', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (27, '', 11, '查询', '/param/syspara', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (28, '', 12, '查询', '/param/businesspara', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (29, '', 12, '删除', '/param/deletebusinesspara', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (30, '', 12, '修改', '/param/businessparaupdate', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (32, '', 12, '新增', '/param/addbusinesspara', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (33, '', 12, '新增跳转', '/param/load4addbuspara', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (34, '', 17, '查询', '/param/apiclientpara', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (35, '', 17, '新增修改跳转', '/param/load4addapiclient', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (36, '', 17, '修改状态', '/param/updateapiclientstate', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (37, '', 17, '删除', '/param/deleteapiclient', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (39, '', 17, '修改', '/param/updateapiclientpara', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (40, '', 17, '新增', '/param/addapiclientpara', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (41, '', 18, '查询', '/param/paytype', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (42, '', 21, '查询', '/user/list', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (43, '', 18, '新增跳转', '/param/load4addpaytype', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (44, '', 18, '切换状态', '/param/updatepaytypestate', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (45, '', 18, '修改', '/param/updatepaytypename', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (46, '', 18, '删除', '/param/deletepaytype', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (48, '', 18, '配置跳转', '/param/load4paytypeconfig', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (49, '', 18, '配置参数', '/param/addpaytypeconfig', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (50, '', 22, '查询', '/user/account', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (52, '', 24, '查询', '/user/pointlist', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (53, '', 23, '删除', '/shop/deleteshop', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (54, '', 21, '添加', '/user/add', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (56, '', 23, '查询', '/shop/getshopinfo', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (57, '', 23, '商户树', '/shop/index', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (58, '', 23, '新增修改', '/shop/saveorupdate', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (59, '', 21, '删除', '/user/del', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (60, '', 21, '注销账户', '/user/delacc', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (61, '', 21, '删除积分账户', '/user/delpoint', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (63, '', 25, '商户树', '/shop/config', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (64, '', 25, '查询', '/shop/shoppaytypelist', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (65, '', 25, '切换状态', '/shop/updatepaytypestat', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (66, '', 25, '新增跳转', '/shop/load4addpaytype', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (67, '', 25, '新增', '/shop/addshoppaytype', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (68, '', 25, '配置跳转', '/shop/load4paytypepara', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (69, '', 25, '配置', '/shop/addpaytypepara', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (70, '', 27, '查询', '/dtl/userdtl', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (71, '', 28, '查询', '/dtl/shopdtl', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (72, '', 29, '查询', '/report/subjectday', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (73, '', 30, '查询', '/report/subjectdetail', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (74, '', 31, '查询', '/report/shopbusiness', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (76, '', 18, '新增', '/param/addpaytype', '{tenantid}');
+
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid)
+VALUES ('ff8080816b7947ed016b795577300036', 16, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid)
+VALUES ('ff8080816b7947ed016b795577300037', 17, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid)
+VALUES ('ff8080816b7947ed016b795577300038', 19, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid)
+VALUES ('ff8080816b7947ed016b795577300039', 20, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid)
+VALUES ('ff8080816b7947ed016b79557730003a', 21, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid)
+VALUES ('ff8080816b7947ed016b79557730003c', 6, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid)
+VALUES ('ff8080816b7947ed016b79557730003d', 7, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557731003e', 8, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557731003f', 9, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577310040', 22, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577310042', 4, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577310043', 5, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577310044', 10, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577310045', 11, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577310046', 12, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577320047', 13, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577320048', 14, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577320049', 15, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557732004b', 24, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557732004e', 53, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557732004f', 57, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577320050', 56, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577320051', 58, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577330053', 63, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+ VALUES ('ff8080816b7947ed016b795577330054', 64, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577330055', 65, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577330056', 66, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+ VALUES ('ff8080816b7947ed016b795577330057', 68, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+ VALUES ('ff8080816b7947ed016b795577330058', 67, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+ VALUES ('ff8080816b7947ed016b795577330059', 69, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557733005c', 72, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557733005e', 73, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577340060', 74, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577340063', 54, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577340064', 60, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577340065', 61, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+ VALUES ('ff8080816b7947ed016b795577350066', 42, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577350067', 59, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577350069', 52, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+ VALUES ('ff8080816b7947ed016b79557735006b', 50, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557735006e', 70, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577350070', 71, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577360073', 27, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577360075', 39, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577360076', 34, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577360077', 40, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577360078', 37, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577360079', 36, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557736007a', 35, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557736007c', 33, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557736007d', 32, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b79557736007e', 28, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+ VALUES ('ff8080816b7947ed016b79557737007f', 30, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577370080', 29, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577370082', 46, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577370083', 48, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577370084', 41, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577370085', 44, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+ VALUES ('ff8080816b7947ed016b795577370086', 49, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577370087', 45, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816b7947ed016b795577370088', 43, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816bbb130c016bbb6ea2f700c9', 76, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816bbb130c016bbb6ea2f600b3', 26, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+
+
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('1001', 1, 'y', 1, NULL, 20190430, 1, '库存现金', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('1002', 1, 'y', 1, NULL, 20190430, 1, '银行存款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('1121', 1, 'n', 0, NULL, 20190430, 1, '应收票据', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112101', 1, 'n', 1, '1121', 20190430, 2, '支票', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112102', 1, 'n', 1, '1121', 20190430, 2, '经费本', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('1122', 1, 'y', 0, NULL, 20190430, 1, '应收账款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112201', 1, 'y', 1, '1122', 20190430, 2, '现金充值款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112209', 1, 'y', 1, '1122', 20190617, 2, '其他第三方充值款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112210', 1, 'y', 1, '1122', 20190430, 2, '支付宝充值款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112211', 1, 'y', 1, '1122', 20190430, 2, '微信充值款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112212', 1, 'n', 1, '1122', 20190430, 2, '银联充值款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112213', 1, 'y', 1, '1122', 20190430, 2, '一卡通充值款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112230', 1, 'y', 1, '1122', 20190430, 2, '支付宝支付款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112231', 1, 'y', 1, '1122', 20190430, 2, '微信支付款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112232', 1, 'n', 1, '1122', 20190430, 2, '银联支付款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112233', 1, 'y', 1, '1122', 20190430, 2, '一卡通支付款', 1, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('112234', 1, 'y', 1, '1122', NULL, 2, '市民卡支付款', 1, '{tenantid}');
+--负债
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('2001', 2, 'n', 1, NULL, 20190430, 1, '用户押金', 2, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('2004', 2, 'y', 1, NULL, 20190430, 1, '商户营业款', 2, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('2202', 2, 'y', 0, NULL, 20190430, 1, '应付账款', 2, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('220201', 2, 'y', 1, '2202', 20190430, 2, '个人存款', 2, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('220211', 2, 'n', 1, '2202', 20190430, 2, '销户退款', 2, '{tenantid}');
+--损益
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('6021', 2, 'y', 0, NULL, 20190430, 1, '手续费收入', 6, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('602101', 2, 'y', 1, '6021', 20190430, 2, '支付宝充值手续费', 6, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('602102', 2, 'y', 1, '6021', 20190430, 2, '微信充值手续费', 6, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('602103', 2, 'n', 1, '6021', 20190430, 2, '银联充值手续费', 6, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('6601', 2, 'y', 0, NULL, 20190430, 1, '销售费用', 6, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('660101', 2, 'y', 1, '6601', 20190430, 2, '折扣优惠款', 6, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('660102', 2, 'y', 1, '6601', 20190430, 2, '积分抵扣款', 6, '{tenantid}');
+INSERT INTO "tb_subject" ("subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
+VALUES ('6602', 2, 'y', 1, NULL, 20190430, 1, '管理费收入', 6, '{tenantid}');
+
+
+
+INSERT INTO "tb_sourcetype" ("sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "tenantid")
+VALUES ('citizenCard', 't', '大理市民卡', 't', 'f', 't', 'f', 't', '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "tenantid")
+VALUES ('balance', 'f', '账户余额', 't', 'f', 't', 'f', 't', '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "tenantid")
+VALUES ('thirdpart', 'f', '其他第三方支付', 't', 't', 'f', 'f', 'f', '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "tenantid")
+VALUES ('yktpay', 't', '一卡通支付', 't', 't', 't', 't', 't', '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "tenantid")
+VALUES ('alipay', 't', '支付宝', 't', 't', 't', 't', 'f', '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "tenantid")
+VALUES ('wechat', 't', '微信支付', 't', 't', 't', 't', 'f', '{tenantid}');
+
+-- 支付方式
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('yktpay','appid',null,'100005', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('yktpay','appkey',null,'adc4ac6822fd462780f878b86cb94688', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('yktpay','orderurl',null,'http://172.28.201.101:9116/epayapi/services/thirdparty/common/pay', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('yktpay','reverseurl',null,'http://172.28.201.101:9116/epayapi/services/thirdparty/common/payreverse', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('alipay', 'alipay.gateway', '支付宝网关地址', 'https://openapi.alipay.com/gateway.do', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('alipay', 'enable.paymethod', '支付渠道', 'balance,moneyFund,debitCardExpress,bankPay,pcredit', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('alipay', 'notify.url', '异步通知地址', 'http://ykt.supwisdom.com:9116/epay/zfb/newnotify', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('alipay', 'timeout.express', '支付超时时间', '5m', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('alipay', 'alipay.public.key', '支付宝商户应用的支付宝公钥', NULL, '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('alipay', 'alipay.rsa.private.key', '支付宝商户应用RSA私钥', NULL, '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('alipay', 'alipay.rsa.public.key', '支付宝商户应用RSA公钥', NULL, '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('alipay', 'appid', '支付宝应用APPID', NULL, '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
+VALUES ('citizenCard', 'bankcardno', NULL, NULL, '{tenantid}');
+
+INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
+VALUES (1, 'yes', 1, '20190514165658', '账户最大余额默认值', '元', '10001', '账户开户时的默认账户最大余额', 'amount', '{tenantid}');
+
+INSERT INTO "tb_task_lock" ("taskcode", "remark", "taskstatus", "tasktime", "tenantid")
+VALUES ('DAYENDSETTLETASK', '日终结算', '0', '20190619100600', '{tenantid}');
+
+INSERT INTO "tb_shop" ("shopid", "shopname", "shoptype", "fshopid", "status", "opendate", "tenantid")
+VALUES (1, '支付中心', 0, 0, 'normal', '20190517', '{tenantid}');
+
+INSERT INTO "tb_transcode" ("transcode", "transname", "tenantid")
+VALUES (3010, '市民卡代扣', '{tenantid}');
+INSERT INTO "tb_transcode" ("transcode", "transname", "tenantid")
+VALUES (3500, '账户充值', '{tenantid}');
+
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('cancel', 'reverseFlagList', '冲正', '冲正状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('reverse', 'reverseFlagList', '手工撤销', '冲正状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('none', 'reverseFlagList', '-', '冲正状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('init', 'dtlStatusList', '初始化', '流水状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('success', 'dtlStatusList', '交易成功', '流水状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('fail', 'dtlStatusList', '交易失败', '流水状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('wip', 'dtlStatusList','待支付', '流水状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('cancel','dtlStatusList', '交易取消', '流水状态', '{tenantid}');
+
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('1', 'idtypeList', '身份证', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('2', 'idtypeList', '护照', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('3', 'idtypeList', '驾照', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('4', 'idtypeList', '港澳通行证', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('5', 'idtypeList', '学工号', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('9', 'idtypeList', '其他', '证件类型', '{tenantid}');
+
+
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('male', 'sexList', '男', '性别', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('female', 'sexList', '女', '性别', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('unknown', 'sexList', '未知', '性别', '{tenantid}');
+
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('normal', 'accountStatusList', '正常', '账户状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('closed', 'accountStatusList', '注销', '账户状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('locked', 'accountStatusList', '锁定', '账户状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('unknown', 'accountStatusList', '异常', '账户状态', '{tenantid}');
+----------------------------------------------------
+commit;
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/custom/css/admin.css b/payapi/src/main/resources/static/custom/css/admin.css
new file mode 100755
index 0000000..29547ad
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/css/admin.css
@@ -0,0 +1,801 @@
+/** EasyWeb */
+html {
+ background-color: #f2f2f2;
+ color: #666;
+}
+
+/** header样式 */
+/** 导航栏下面的线条 */
+.layui-layout-admin .layui-header .layui-nav .layui-this:after, .layui-layout-admin .layui-header .layui-nav-bar {
+ height: 2px;
+ background-color: #03152A;
+ top: 0 !important;
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-item {
+ line-height: 50px; /** 高度重写 */
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child {
+ top: 55px;
+}
+
+.layui-layout-admin .layui-header .layui-nav-item .layui-icon {
+ font-size: 16px; /** 图标大小 */
+}
+
+.layui-layout-admin .layui-header .layui-layout-left {
+ left: 220px;
+ padding: 0 10px;
+ transition: all .3s;
+}
+
+.layui-layout-admin .layui-header .layui-layout-right {
+ padding: 0;
+}
+
+/** 重写header的背景色和字体颜色 */
+.layui-layout-admin .layui-header {
+ background-color: #fff;
+ height: 50px;
+ box-shadow: 0 1px 4px 0 rgba(0, 21, 41, .08);
+}
+
+.layui-layout-admin .layui-header a {
+ color: #333;
+ padding: 0 15px;
+}
+
+.layui-layout-admin .layui-header a:hover {
+ color: #333;
+}
+
+.layui-layout-admin .layui-header .layui-nav-child a {
+ color: #333 !important;
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-more {
+ border-color: #666 transparent transparent;
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-mored {
+ border-color: transparent transparent #666;
+}
+
+/** logo部分样式 */
+.layui-layout-admin .layui-header .layui-logo {
+ width: 220px;
+ background-color: #001529;
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .15);
+ color: #eee;
+ font-size: 16px;
+ font-family: Myriad Pro, Helvetica Neue, Arial, Helvetica, sans-serif;
+ font-weight: 300;
+ overflow: hidden;
+ line-height: 50px;
+ transition: all .3s;
+}
+
+.layui-layout-admin .layui-header .layui-logo img {
+ height: 40px;
+}
+
+.layui-layout-admin .layui-header .layui-logo cite {
+ font-style: normal;
+}
+
+.layui-layout-admin .layui-header .layui-nav-img {
+ margin-right: 5px;
+}
+
+.layui-layout-admin .layui-header .layui-nav-img + cite {
+ margin-right: 5px;
+}
+
+.layui-layout-admin .layui-header .layui-nav-child dd {
+ text-align: center;
+}
+
+.layui-layout-admin .layui-header a {
+ cursor: pointer;
+}
+
+/** //header样式结束 */
+
+/** 侧边栏样式 */
+.layui-layout-admin .layui-side .layui-side-scroll {
+ width: 240px;
+}
+
+.layui-layout-admin .layui-side {
+ top: 50px;
+ width: 220px;
+ background-color: #001529;
+ transition: all .3s;
+ -webkit-transition: all .3s;
+}
+
+.layui-layout-admin .layui-side .layui-nav {
+ width: 220px;
+ background-color: transparent;
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-item > a:hover {
+ background: transparent;
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-item > .layui-nav-child {
+ padding: 5px 0;
+ background-color: rgba(0, 0, 0, .3) !important;
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-more {
+ right: 15px;
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child a {
+ padding-left: 50px; /** 导航字体位置 */
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child .layui-nav-child a {
+ padding-left: 70px;
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-item > a {
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+
+/** 侧边栏样式结束 */
+
+/** 主体部分样式 */
+.layui-layout-admin .layui-body {
+ left: 220px;
+ top: 50px;
+ transition: left .3s;
+ overflow-y: scroll;
+ padding: 15px;
+}
+
+/** //主体部分样式结束 */
+
+/** 底部样式 */
+.layui-layout-admin .layui-footer {
+ left: 220px;
+ background: #fff;
+ transition: all .3s;
+}
+
+/** 底部样式结束 */
+
+/** 侧导航折叠样式PC */
+.layui-layout-admin.admin-nav-mini .layui-header .layui-logo {
+ width: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-header .layui-logo cite {
+ display: none;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-header .layui-layout-left {
+ left: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side {
+ width: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav {
+ width: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side-scroll {
+ width: 80px;
+}
+
+/** 侧导航隐藏文字 */
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a > cite {
+ display: none;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a .layui-nav-more {
+ display: none;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a {
+ overflow: visible;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-itemed .layui-nav-child {
+ display: none;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-body {
+ left: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-footer {
+ left: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-itemed > a {
+ background: rgba(0, 0, 0, .3);
+}
+
+/** 修改折叠的图标 */
+.layui-layout-admin.admin-nav-mini .layui-header .layui-icon-shrink-right:before {
+ content: "\e66b";
+}
+
+/** //侧导航折叠样式结束 */
+
+/** 移动设备样式 */
+@media screen and (max-width: 750px) {
+ .layui-layout-admin .layui-side {
+ position: fixed;
+ left: -260px;
+ z-index: 10000;
+ }
+
+ .layui-layout-admin .layui-body {
+ left: 0;
+ }
+
+ .layui-layout-admin .layui-footer {
+ left: 0;
+ }
+
+ .layui-layout-admin .layui-header .layui-logo {
+ left: -260px;
+ }
+
+ .layui-layout-admin .layui-header .layui-layout-left {
+ left: 0;
+ }
+
+ .layui-layout-admin .layui-header .layui-icon-shrink-right:before {
+ content: "\e66b";
+ }
+
+ /* 移动设备侧导航折叠样式 */
+ .layui-layout-admin.admin-nav-mini .layui-header .layui-logo {
+ width: 220px;
+ left: 0;
+ z-index: 10001;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-header {
+ z-index: auto;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-header .layui-logo cite {
+ display: inline-block;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-header .layui-layout-left {
+ left: 0;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-side {
+ width: 220px;
+ left: 0;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-side .layui-nav {
+ width: 220px;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-side-scroll {
+ width: 240px;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a > cite {
+ display: inline-block;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a .layui-nav-more {
+ display: inline-block;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a {
+ overflow: hidden;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-itemed > .layui-nav-child {
+ display: block;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-body {
+ left: 0;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-footer {
+ left: 0;
+ }
+
+ /** 移动设备遮罩层 */
+ .layui-layout-admin.admin-nav-mini .site-mobile-shade {
+ content: '';
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background-color: rgba(0, 0, 0, .2);
+ z-index: 9999;
+ cursor: pointer;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-itemed > a {
+ background: transparent;
+ }
+
+ .layui-layout-admin.admin-nav-mini .layui-header .layui-icon-shrink-right:before {
+ content: "\e668";
+ }
+}
+
+/** //移动设备样式结束 */
+
+/** 右侧弹窗样式 */
+.layui-layer.layui-layer-adminRight {
+ top: 50px !important;
+ bottom: 0;
+ box-shadow: 1px 1px 10px rgba(0, 0, 0, .1);
+ border-radius: 0;
+ overflow: auto;
+}
+
+/** 消息列表样式 */
+.message-list {
+}
+
+.message-list-item {
+ padding: 10px 24px;
+ border-bottom: 1px solid #e8e8e8;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ display: flex;
+ -ms-flex: 1 1;
+ flex: 1 1;
+}
+
+.message-list-item:hover {
+ background: #F2F2F2;
+}
+
+.message-item-icon {
+ width: 40px;
+ height: 40px;
+ margin-right: 16px;
+ display: block;
+ margin-top: 4px;
+}
+
+.message-item-right {
+ display: block;
+ flex: 1 0;
+}
+
+.message-item-title {
+ font-size: 14px;
+ color: rgba(0, 0, 0, .65);
+}
+
+.message-item-text {
+ color: rgba(0, 0, 0, .45);
+ font-size: 12px;
+}
+
+/** //消息列表样式结束 */
+
+/** 主体部分标题样式 */
+.layui-card-header .header-title {
+ display: inline;
+ font-size: 16px;
+}
+
+/** 表格搜索框样式 */
+.search-input {
+ width: 150px;
+ display: inline-block;
+ height: 36px;
+ vertical-align: middle;
+ padding: 3px 6px;
+}
+
+/** 重写layui默认按钮的高度,因为按钮跟输入框不一样高特别丑 */
+.layui-btn:not(.layui-btn-lg ):not(.layui-btn-sm):not(.layui-btn-xs) {
+ height: 34px;
+ line-height: 34px;
+}
+
+/** 如果按钮加图标减少内边距 */
+.icon-btn {
+ padding: 0 8px;
+}
+
+.layui-form.toolbar .layui-btn + .layui-btn {
+ margin-left: 15px;
+}
+
+.model-form-footer .layui-btn + .layui-btn {
+ margin-left: 15px;
+}
+
+.layui-table-cell .layui-btn + .layui-btn {
+ margin-left: 5px;
+}
+
+/** 表格上方工具栏样式 */
+.layui-form.toolbar {
+ color: #333;
+}
+
+.layui-form.toolbar .layui-form-select input {
+ height: 35px;
+ line-height: 35px;
+ width: 150px;
+ overflow: hidden;
+}
+
+.layui-form.toolbar .layui-form-select {
+ display: inline-block;
+}
+
+/* 表单弹窗样式 */
+.model-form {
+ padding-top: 30px;
+ padding-right: 45px;
+}
+
+.model-form-footer {
+ text-align: right;
+}
+
+/** dialog超出显示 */
+.layui-layout-body .layui-layer-page .layui-layer-content {
+ overflow: visible;
+}
+
+/* layui文档官网右侧弹窗目录列表的样式 */
+.site-dir li {
+ line-height: 26px;
+ margin-left: 20px;
+ overflow: visible;
+ list-style-type: disc;
+}
+
+/** laydate加图标 */
+.date-icon {
+ background-image: url(../images/icon_date.png);
+ background-repeat: no-repeat;
+ background-position: right center;
+}
+
+/** 辅助样式 */
+.layui-link {
+ color: #029789 !important;
+}
+
+.layui-link:hover {
+ opacity: .8;
+}
+
+.pull-right {
+ float: right;
+}
+
+.inline-block {
+ display: inline-block;
+}
+
+/** 卡片header里面的徽章样式调整 */
+.layui-card .layui-card-header .layui-badge.pull-right {
+ top: 50%;
+ margin-top: -9px;
+}
+
+/** 特大字体 */
+.lay-big-font {
+ font-size: 36px;
+ color: #666;
+ line-height: 36px;
+ padding: 5px 0 10px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-break: break-all;
+ white-space: nowrap;
+}
+
+/** 超链接样式 */
+.layui-text a:not(.layui-btn) {
+ color: #01AAED;
+}
+
+.layui-text a:not(.layui-btn):hover {
+ text-decoration: underline;
+}
+
+/** loading组件样式 */
+.admin-loading {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin: -16px -15px;
+ font-size: 30px;
+ color: #c2c2c2
+}
+
+/** admin选项卡样式 */
+/** 调整header阴影 */
+.layui-layout-admin.open-tab .layui-header {
+ box-shadow: 0 1px 1px 0 rgba(0, 21, 41, .05);
+}
+
+.layui-layout-admin.open-tab .layui-body {
+ padding: 0;
+ overflow: hidden;
+}
+
+.layui-layout-admin .layui-body .layui-tab {
+ margin: 0;
+ overflow: hidden;
+}
+
+/** 开启选项卡后让tab-content样式为以前的layui-body样式 */
+.layui-layout-admin .layui-body .layui-tab .layui-tab-content .layui-tab-item {
+ position: absolute;
+ bottom: 0;
+ overflow-y: scroll;
+ padding: 15px;
+ right: 0;
+ top: 40px;
+ left: 0;
+}
+
+/** 选项卡标题样式 */
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title {
+ height: 40px;
+ line-height: 40px;
+ padding: 0 80px 0 40px;
+ background-color: #fff;
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .1);
+ position: absolute;
+ right: 0;
+ z-index: 999;
+ border: none;
+ overflow: hidden;
+}
+
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li {
+ min-width: 0;
+ line-height: 40px;
+ max-width: 160px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ border-right: 1px solid #f6f6f6;
+ vertical-align: top;
+}
+
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title .layui-tab-bar {
+ display: none;
+}
+
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li.layui-this,
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:hover {
+ background-color: #f6f6f6;
+}
+
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li.layui-this:after {
+ width: 100%;
+ border: none;
+ height: 2px;
+ background-color: #292B34;
+ border-radius: 0;
+}
+
+/** tab关闭按钮样式 */
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li .layui-tab-close {
+ width: 16px;
+ height: 16px;
+ line-height: 16px;
+ border-radius: 50%;
+ font-size: 12px;
+}
+
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:first-child .layui-tab-close {
+ display: none; /** 第一个选项卡不可关闭 */
+}
+
+/** 选项卡其他操作按钮样式 */
+.layui-layout-admin .layui-body .admin-tabs-control {
+ position: absolute;
+ top: 0;
+ width: 40px;
+ height: 40px;
+ line-height: 40px;
+ text-align: center;
+ cursor: pointer;
+ transition: all .3s;
+ box-sizing: border-box;
+ border-left: 1px solid #f6f6f6;
+ z-index: 1000;
+ visibility: hidden; /** 默认隐藏 */
+ background-color: white;
+}
+
+.layui-layout-admin.open-tab .layui-body .admin-tabs-control {
+ visibility: visible;
+}
+
+.layui-layout-admin .layui-body .admin-tabs-control:hover {
+ background-color: #f6f6f6
+}
+
+.layui-layout-admin .layui-body .layui-icon-prev {
+ left: 0;
+ border-left: none;
+ border-right: 1px solid #f6f6f6;
+}
+
+.layui-layout-admin .layui-body .layui-icon-next {
+ right: 40px;
+}
+
+.layui-layout-admin .layui-body .layui-icon-down {
+ right: 0;
+}
+
+.admin-tabs-select.layui-nav {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ padding: 0;
+ background: 0 0;
+}
+
+.admin-tabs-select.layui-nav .layui-nav-item {
+ line-height: 40px
+}
+
+.admin-tabs-select.layui-nav .layui-nav-item > a {
+ height: 40px
+}
+
+.admin-tabs-select.layui-nav .layui-nav-item a {
+ color: #666
+}
+
+.admin-tabs-select.layui-nav .layui-nav-child {
+ top: 40px;
+ left: auto;
+ right: 0
+}
+
+.admin-tabs-select.layui-nav .layui-nav-child dd.layui-this,
+.admin-tabs-select.layui-nav .layui-nav-child dd.layui-this a {
+ background-color: #f2f2f2 !important;
+ color: #333
+}
+
+.admin-tabs-select.layui-nav .layui-nav-bar, .admin-tabs-select.layui-nav .layui-nav-more {
+ display: none;
+}
+
+.layui-fluid {
+ padding: 15px;
+}
+
+body.layui-fluid {
+ overflow-y: scroll;
+}
+
+.admin-iframe {
+ width: 100%;
+ height: 100%;
+}
+
+.layui-layout-admin .layui-body.admin-iframe-body {
+ padding: 0;
+ overflow: hidden;
+}
+
+@-webkit-keyframes layui-rl {
+ from {
+ -webkit-transform: translate3d(100%,0,0)
+ }
+
+ to {
+ -webkit-transform: translate3d(0,0,0)
+ }
+}
+
+@keyframes layui-rl {
+ from {
+ transform: translate3d(100%,0,0)
+ }
+
+ to {
+ transform: translate3d(0,0,0)
+ }
+}
+
+.layui-anim-rl {
+ -webkit-animation-name: layui-rl;
+ animation-name: layui-rl
+}
+
+@-webkit-keyframes layui-lr {
+ from {
+ -webkit-transform: translate3d(0 0,0);
+ opacity: 1
+ }
+
+ to {
+ -webkit-transform: translate3d(100%,0,0);
+ opacity: 1
+ }
+}
+
+@keyframes layui-lr {
+ from {
+ transform: translate3d(0,0,0)
+ }
+
+ to {
+ transform: translate3d(100%,0,0)
+ }
+}
+
+.layui-anim-lr,.layui-anim-rl.layer-anim-close {
+ -webkit-animation-name: layui-lr;
+ animation-name: layui-lr
+}
+
+.layadmin-tips {
+ margin-top: 30px;
+ text-align: center
+}
+
+.layadmin-tips .layui-icon[face] {
+ display: inline-block;
+ font-size: 300px;
+ color: #393D49
+}
+
+.layadmin-tips .layui-text {
+ width: 500px;
+ margin: 30px auto;
+ padding-top: 20px;
+ border-top: 5px solid #009688;
+ font-size: 16px
+}
+
+.layadmin-tips h1 {
+ font-size: 100px;
+ line-height: 100px;
+ color: #009688
+}
+
+.layadmin-tips .layui-text .layui-anim {
+ display: inline-block
+}
+
+@media screen and (max-width: 768px) {
+ .layadmin-panel-selection {
+ margin:0;
+ width: auto
+ }
+
+ .layui-body .layui-nav .layui-nav-item {
+ display: block
+ }
+
+ .layui-layout-admin .layui-body .layadmin-tabsbody-item {
+ -webkit-overflow-scrolling: touch;
+ overflow: auto
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/custom/css/console.css b/payapi/src/main/resources/static/custom/css/console.css
new file mode 100755
index 0000000..1e550bf
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/css/console.css
@@ -0,0 +1,29 @@
+/** 卡片轮播图样式 */
+.admin-carousel .layui-carousel-ind {
+ position: absolute;
+ top: -41px;
+ text-align: right;
+}
+
+.admin-carousel .layui-carousel-ind ul {
+ background: 0 0;
+}
+
+.admin-carousel .layui-carousel-ind li {
+ background-color: #e2e2e2;
+}
+
+.admin-carousel .layui-carousel-ind li.layui-this {
+ background-color: #999;
+}
+
+/** 广告位轮播图 */
+.admin-news .layui-carousel-ind {
+ height: 45px;
+}
+
+.admin-news a {
+ display: block;
+ line-height: 60px;
+ text-align: center;
+}
diff --git a/payapi/src/main/resources/static/custom/css/login.css b/payapi/src/main/resources/static/custom/css/login.css
new file mode 100644
index 0000000..60c4cf0
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/css/login.css
@@ -0,0 +1,141 @@
+/** EasyWeb */
+
+body {
+ background-image: url("../images/bg_login.png");
+ background-repeat: no-repeat;
+ background-size: cover;
+}
+
+.login-wrapper, body, html {
+ height: 100%
+}
+
+.login-wrapper {
+ overflow: auto;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+}
+
+.login-body {
+ padding: 10px 10px 40px 10px;
+}
+
+.login-body > .layui-card {
+ max-width: 360px;
+ margin: 0 auto;
+}
+
+.login-body .layui-card-header {
+ font-weight: 700;
+ font-size: 15px;
+}
+
+.login-body .layui-form-pane .layui-form-label {
+ width: 48px;
+}
+
+.login-body .layui-form-pane .layui-input-block {
+ margin-left: 48px;
+}
+
+.login-body .login-captcha {
+ width: 100%;
+ cursor: pointer;
+}
+
+.login-body .login-other > * {
+ display: inline-block;
+ vertical-align: middle;
+ margin-right: 10px;
+ font-size: 14px;
+}
+
+.login-body .login-other .layui-icon {
+ position: relative;
+ top: 2px;
+ font-size: 26px;
+}
+
+.login-body .login-other a:hover {
+ opacity: .8;
+}
+
+.layui-icon-login-qq {
+ color: #3492ED
+}
+
+.layui-icon-login-wechat {
+ color: #4DAF29
+}
+
+.layui-icon-login-weibo {
+ color: #CF1900
+}
+
+/** 底部样式 */
+.login-footer {
+ text-align: center;
+ line-height: 30px;
+ color: rgba(255, 255, 255, 0.7) !important;
+ padding-bottom: 20px;
+}
+
+.login-footer span {
+ padding: 0 5px
+}
+
+.login-footer a {
+ padding: 0 5px;
+ color: rgba(255, 255, 255, 0.7) !important;
+}
+
+.login-footer a:hover {
+ color: rgba(255, 255, 255, 0.4) !important;
+}
+
+/** 头部样式 */
+.login-header {
+ font-size: 20px;
+ font-weight: bold;
+ color: rgba(255, 255, 255, 0.85) !important;
+ padding: 10px;
+}
+
+.login-header img {
+ height: 40px;
+}
+
+/** 移动设备样式 */
+@media screen and (min-height: 590px) {
+ .login-footer {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ }
+}
+
+@media screen and (min-height: 670px) {
+ .login-body {
+ padding: 110px 10px 40px 10px;
+ }
+}
+
+/** 辅助样式 */
+.layui-link {
+ color: #029789 !important;
+}
+
+.layui-link:hover {
+ opacity: .8;
+}
+
+.pull-right {
+ float: right;
+}
+
+.inline-block {
+ display: inline-block;
+}
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/custom/css/theme-blue.css b/payapi/src/main/resources/static/custom/css/theme-blue.css
new file mode 100755
index 0000000..476b1bd
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/css/theme-blue.css
@@ -0,0 +1,102 @@
+/** logo部分样式 */
+.layui-layout-admin .layui-header .layui-logo {
+ background-color: #0085E8;
+ color: #fff;
+}
+
+/** header样式 */
+.layui-layout-admin .layui-header {
+ background-color: #1E9FFF;
+}
+
+.layui-layout-admin .layui-header a {
+ color: #fff;
+}
+
+.layui-layout-admin .layui-header a:hover {
+ color: #fff;
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-more {
+ border-color: #fff transparent transparent;
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-mored {
+ border-color: transparent transparent #fff;
+}
+
+/** 导航栏下面的线条 */
+.layui-layout-admin .layui-header .layui-nav .layui-this:after, .layui-layout-admin .layui-header .layui-nav-bar {
+ background-color: #fff;
+}
+
+/** 侧边栏样式 */
+.layui-layout-admin .layui-side {
+ background-color: #344058;
+}
+
+.layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, .layui-nav-tree .layui-this > a, .layui-nav-tree .layui-this > a:hover {
+ background-color: #1E9FFF;
+}
+
+.layui-nav-tree .layui-nav-bar {
+ background-color: #1E9FFF;
+}
+
+/** 主题颜色 */
+
+/** 按钮 */
+.layui-btn:not(.layui-btn-primary):not(.layui-btn-normal):not(.layui-btn-warm):not(.layui-btn-danger):not(.layui-btn-disabled) {
+ background-color: #1E9FFF;
+}
+
+.layui-btn.layui-btn-primary:hover {
+ border-color: #1E9FFF;
+}
+
+/** 开关 */
+.layui-form-onswitch {
+ border-color: #1E9FFF;
+ background-color: #1E9FFF;
+}
+
+/** 分页插件 */
+.layui-laypage .layui-laypage-curr .layui-laypage-em {
+ background-color: #1E9FFF;
+}
+
+.layui-table-page .layui-laypage input:focus {
+ border-color: #1E9FFF !important;
+}
+
+.layui-table-view select:focus {
+ border-color: #1E9FFF !important;
+}
+
+.layui-table-page .layui-laypage a:hover {
+ color: #1E9FFF;
+}
+
+/** 单选按钮 */
+.layui-form-radio > i:hover, .layui-form-radioed > i {
+ color: #1E9FFF;
+}
+
+/** 下拉条目选中 */
+.layui-form-select dl dd.layui-this {
+ background-color: #1E9FFF;
+}
+
+/** 选项卡 */
+.layui-tab-brief > .layui-tab-title .layui-this {
+ color: #1E9FFF;
+}
+
+.layui-tab-brief > .layui-tab-more li.layui-this:after, .layui-tab-brief > .layui-tab-title .layui-this:after {
+ border-color: #1E9FFF !important;
+}
+
+/** 面包屑导航 */
+.layui-breadcrumb a:hover {
+ color: #1E9FFF !important;
+}
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/custom/images/bg_login.png b/payapi/src/main/resources/static/custom/images/bg_login.png
new file mode 100755
index 0000000..91cefd8
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/images/bg_login.png
Binary files differ
diff --git a/payapi/src/main/resources/static/custom/images/head.png b/payapi/src/main/resources/static/custom/images/head.png
new file mode 100755
index 0000000..e298c8a
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/images/head.png
Binary files differ
diff --git a/payapi/src/main/resources/static/custom/images/logo.png b/payapi/src/main/resources/static/custom/images/logo.png
new file mode 100755
index 0000000..6465b5b
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/images/logo.png
Binary files differ
diff --git a/payapi/src/main/resources/static/custom/module/admin.js b/payapi/src/main/resources/static/custom/module/admin.js
new file mode 100755
index 0000000..cbdbc36
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/admin.js
@@ -0,0 +1,387 @@
+layui.define(['layer'], function (exports) {
+ var layer = layui.layer;
+ var popupRightIndex, popupCenterIndex, popupCenterParam;
+ var baseUrl = window.location.pathname;
+
+ var admin = {
+ isRefresh: false,
+ // 设置侧栏折叠
+ flexible: function (expand) {
+ var isExapnd = $('.layui-layout-admin').hasClass('admin-nav-mini');
+ if (isExapnd == !expand) {
+ return;
+ }
+ if (expand) {
+ $('.layui-layout-admin').removeClass('admin-nav-mini');
+ } else {
+ $('.layui-layout-admin').addClass('admin-nav-mini');
+ }
+ },
+ // 设置导航栏选中
+ activeNav: function (url) {
+ $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child dd').removeClass('layui-this');
+ $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item').removeClass('layui-this');
+ if (url && url != '') {
+ $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item').removeClass('layui-nav-itemed');
+ var $a = $('.layui-layout-admin .layui-side .layui-nav a[href="#!' + url + '"]');
+ $a.parent('li').addClass('layui-this');
+ $a.parent('dd').addClass('layui-this');
+ $a.parent('dd').parent('.layui-nav-child').parent('.layui-nav-item').addClass('layui-nav-itemed');
+ }
+ },
+ // 右侧弹出
+ popupRight: function (path) {
+ var param = new Object();
+ param.path = path;
+ param.id = 'adminPopupR';
+ param.title = false;
+ param.anim = 2;
+ param.isOutAnim = false;
+ param.closeBtn = false;
+ param.offset = 'r';
+ param.shadeClose = true;
+ param.area = '336px';
+ param.skin = 'layui-layer-adminRight';
+ param.end = function () {
+ layer.closeAll('tips');
+ };
+ popupRightIndex = admin.open(param);
+ return popupRightIndex;
+ },
+ // 关闭右侧弹出
+ closePopupRight: function () {
+ layer.close(popupRightIndex);
+ },
+ // 中间弹出
+ popupCenter: function (param) {
+ param.id = 'adminPopupC';
+ popupCenterParam = param;
+ popupCenterIndex = admin.open(param);
+ return popupCenterIndex;
+ },
+ // 关闭中间弹出并且触发finish回调
+ finishPopupCenter: function () {
+ layer.close(popupCenterIndex);
+ popupCenterParam.finish ? popupCenterParam.finish() : '';
+ },
+ // 关闭中间弹出
+ closePopupCenter: function () {
+ layer.close(popupCenterIndex);
+ },
+ // 封装layer.open
+ open: function (param) {
+ var sCallBack = param.success;
+ param.type = 1;
+ param.area = param.area ? param.area : '450px';
+ param.offset = param.offset ? param.offset : '120px';
+ param.resize ? param.resize : false;
+ param.shade ? param.shade : .2;
+ param.success = function (layero, index) {
+ sCallBack ? sCallBack(layero, index) : '';
+ admin.ajax({
+ url: param.path,
+ type: 'GET',
+ dataType: 'html',
+ success: function (result, status, xhr) {
+ $(layero).children('.layui-layer-content').html(result);
+ }
+ });
+ };
+ return layer.open(param);
+ },
+
+ go:function(url,data,success,error){
+ $.ajax({
+ url: url,
+ data: data,
+ async: false,
+ dataType: 'json',
+ type: 'post',
+ success: success,
+ error:error
+ })
+ },
+ dgo:function(url,data,success,error){
+ $.ajax({
+ url: url,
+ data: data,
+ async: false,
+ dataType: 'json',
+ type: 'get',
+ success: success,
+ error:error
+ })
+ },
+ // 封装ajax请求,返回数据类型为json
+ req: function (url, data, success, method) {
+ admin.ajax({
+ url: url,
+ data: data,
+ async: false,
+ type: method,
+ dataType: 'json',
+ success: success
+ });
+ },
+ // 封装ajax请求
+ ajax: function (param) {
+ console.log(param);
+ var successCallback = param.success;
+ param.success = function (result, status, xhr) {
+ // 判断登录过期和没有权限
+ var jsonRs;
+ if ('json' == param.dataType.toLowerCase()) {
+ jsonRs = result;
+ } else if ('html' == param.dataType.toLowerCase() || 'text' == param.dataType.toLowerCase()) {
+ jsonRs = admin.parseJSON(result);
+ }
+ if (jsonRs) {
+ if (jsonRs.code == 401) {
+ layer.msg(jsonRs.msg, {icon: 2, time: 1500}, function () {
+ location.replace('/login');
+ }, 1000);
+ return;
+ } else if ('html' == param.dataType.toLowerCase() && jsonRs.code == 403) {
+ layer.msg(jsonRs.msg, {icon: 2});
+ }
+ }
+ successCallback(result, status, xhr);
+ };
+ param.error = function (xhr) {
+ //{code: xhr.status, msg: xhr.statusText}
+ param.success(xhr.responseText,xhr.status,xhr);
+ };
+ $.ajax(param);
+ },
+ // 显示加载动画
+ showLoading: function (element) {
+ $(element).append('<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop admin-loading"></i>');
+ },
+ // 移除加载动画
+ removeLoading: function (element) {
+ $(element + '>.admin-loading').remove();
+ },
+ // 缓存临时数据
+ putTempData: function (key, value) {
+ if (value) {
+ layui.sessionData('tempData', {key: key, value: value});
+ } else {
+ layui.sessionData('tempData', {key: key, remove: true});
+ }
+ },
+ // 获取缓存临时数据
+ getTempData: function (key) {
+ return layui.sessionData('tempData')[key];
+ },
+ // 滑动选项卡
+ rollPage: function (d) {
+ var $tabTitle = $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title');
+ var left = $tabTitle.scrollLeft();
+ if ('left' === d) {
+ $tabTitle.scrollLeft(left - 120);
+ } else if ('auto' === d) {
+ var autoLeft = 0;
+ $tabTitle.children("li").each(function () {
+ if ($(this).hasClass('layui-this')) {
+ return false;
+ } else {
+ autoLeft += $(this).outerWidth();
+ }
+ });
+ $tabTitle.scrollLeft(autoLeft - 47);
+ } else {
+ $tabTitle.scrollLeft(left + 120);
+ }
+ },
+ // 刷新主题部分
+ refresh: function () {
+ admin.isRefresh = true;
+ Q.refresh();
+ },
+ // 判断是否为json
+ parseJSON: function (str) {
+ if (typeof str == 'string') {
+ try {
+ var obj = JSON.parse(str);
+ if (typeof obj == 'object' && obj) {
+ return obj;
+ }
+ } catch (e) {
+ }
+ }
+ },
+ formatDate:function (str) {
+ if (str == null || str == "") {
+ return;
+ }
+ switch (str.length) {
+ case 8:
+ str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8);
+ return str;
+ case 12:
+ str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10)
+ + ":" + str.substring(10, 12);
+ return str;
+ case 14:
+ str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10)
+ + ":" + str.substring(10, 12) + ":" + str.substring(12, 14);
+ return str;
+ default:
+ return str;
+ }
+ },
+ errorBack: function (err) {
+ layer.closeAll('loading');
+ if (403 == err.status) {
+ layer.msg("无资源权限!", {icon: 2, time: 1500});
+ return;
+ }
+ if (200 == err.status) {
+ layer.msg("请求异常,请刷新页面重新操作", {icon: 2, time: 1500});
+ return;
+ } else {
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ }
+ };
+
+ // ewAdmin提供的事件
+ admin.events = {
+ // 折叠侧导航
+ flexible: function (e) {
+ var expand = $('.layui-layout-admin').hasClass('admin-nav-mini');
+ admin.flexible(expand);
+ },
+ // 刷新主体部分
+ refresh: function () {
+ admin.refresh();
+ },
+ //后退
+ back: function () {
+ history.back();
+ },
+ // 设置主题
+ theme: function () {
+ admin.popupRight(baseUrl+'home/theme');
+ },
+ // 全屏
+ fullScreen: function (e) {
+ var ac = 'layui-icon-screen-full', ic = 'layui-icon-screen-restore';
+ var ti = $(this).find('i');
+
+ var isFullscreen = document.fullscreenElement || document.msFullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || false;
+ if (isFullscreen) {
+ var efs = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen;
+ if (efs) {
+ efs.call(document);
+ } else if (window.ActiveXObject) {
+ var ws = new ActiveXObject('WScript.Shell');
+ ws && ws.SendKeys('{F11}');
+ }
+ ti.addClass(ac).removeClass(ic);
+ } else {
+ var el = document.documentElement;
+ var rfs = el.requestFullscreen || el.webkitRequestFullscreen || el.mozRequestFullScreen || el.msRequestFullscreen;
+ if (rfs) {
+ rfs.call(el);
+ } else if (window.ActiveXObject) {
+ var ws = new ActiveXObject('WScript.Shell');
+ ws && ws.SendKeys('{F11}');
+ }
+ ti.addClass(ic).removeClass(ac);
+ }
+ },
+ // 左滑动tab
+ leftPage: function () {
+ admin.rollPage("left");
+ },
+ // 右滑动tab
+ rightPage: function () {
+ admin.rollPage();
+ },
+ // 关闭当前选项卡
+ closeThisTabs: function () {
+ var $title = $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title');
+ if ($title.find('li').first().hasClass('layui-this')) {
+ return;
+ }
+ $title.find('li.layui-this').find(".layui-tab-close").trigger("click");
+ },
+ // 关闭其他选项卡
+ closeOtherTabs: function () {
+ $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:gt(0):not(.layui-this)').find('.layui-tab-close').trigger('click');
+ },
+ // 关闭所有选项卡
+ closeAllTabs: function () {
+ $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:gt(0)').find('.layui-tab-close').trigger('click');
+ },
+ // 关闭所有弹窗
+ closeDialog: function () {
+ layer.closeAll('page');
+ },
+ //刷新字典
+ refreshDict: function (){
+ layer.confirm('确定要刷新数据字典吗?', {
+ btn: ['确定', '取消']
+ }, function (index, layero) {
+ layer.closeAll('dialog'); //加入这个信息点击确定 会关闭这个消息框
+ admin.dgo(baseUrl+"dictrefresh", {}, function (data) {
+ if (data.code == 200) {
+ layer.msg("刷新数据字典成功!", {icon: 1, time: 1000});
+ DictPoolToolkit().initAll(baseUrl+"dictpool");
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('/login');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2, time: 1500});
+ }
+ }, function () {
+ layer.msg("数据字典刷新失败,访问服务器失败!", {icon: 2, time: 1500});
+ });
+ });
+ }
+ };
+
+ // 所有ew-event
+ $('body').on('click', '*[ew-event]', function () {
+ var event = $(this).attr('ew-event');
+ var te = admin.events[event];
+ te && te.call(this, $(this));
+ });
+
+ // 移动设备遮罩层点击事件
+ $('.site-mobile-shade').click(function () {
+ admin.flexible(true);
+ });
+
+ // 侧导航折叠状态下鼠标经过显示提示
+ $('body').on('mouseenter', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {
+ var tipText = $(this).find('cite').text();
+ if (document.body.clientWidth > 750) {
+ layer.tips(tipText, this);
+ }
+ }).on('mouseleave', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {
+ layer.closeAll('tips');
+ });
+
+ // 侧导航折叠状态下点击展开
+ $('body').on('click', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {
+ if (document.body.clientWidth > 750) {
+ layer.closeAll('tips');
+ admin.flexible(true);
+ }
+ });
+
+ // 所有lay-tips处理
+ $('body').on('mouseenter', '*[lay-tips]', function () {
+ var tipText = $(this).attr('lay-tips');
+ var dt = $(this).attr('lay-direction');
+ layer.tips(tipText, this, {tips: dt || 1, time: -1});
+ }).on('mouseleave', '*[lay-tips]', function () {
+ layer.closeAll('tips');
+ });
+
+ exports('admin', admin);
+});
diff --git a/payapi/src/main/resources/static/custom/module/formSelects/formSelects-v4.all.js b/payapi/src/main/resources/static/custom/module/formSelects/formSelects-v4.all.js
new file mode 100755
index 0000000..6599c17
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/formSelects/formSelects-v4.all.js
@@ -0,0 +1,1415 @@
+'use strict';
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+/**
+ * name: formSelects
+ * 基于Layui Select多选
+ * version: 4.0.0.formSelects
+ * http://sun.faysunshine.com/layui/formSelects-v4/dist/formSelects-v4.js
+ */
+(function (layui, window, factory) {
+ if ((typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object') {
+ // 支持 CommonJS
+ module.exports = factory();
+ } else if (typeof define === 'function' && define.amd) {
+ // 支持 AMD
+ define(factory);
+ } else if (window.layui && layui.define) {
+ //layui加载
+ layui.define(['jquery'], function (exports) {
+ exports('formSelects', factory());
+ });
+ } else {
+ window.formSelects = factory();
+ }
+})(typeof layui == 'undefined' ? null : layui, window, function () {
+ var v = '4.0.0.formSelects',
+ NAME = 'xm-select',
+ PNAME = 'xm-select-parent',
+ INPUT = 'xm-select-input',
+ TDIV = 'xm-select--suffix',
+ THIS = 'xm-select-this',
+ LABEL = 'xm-select-label',
+ SEARCH = 'xm-select-search',
+ CREATE = 'xm-select-create',
+ CREATE_LONG = 'xm-select-create-long',
+ MAX = 'xm-select-max',
+ SKIN = 'xm-select-skin',
+ DIRECTION = "xm-select-direction",
+ HEIGHT = 'xm-select-height',
+ DISABLED = 'xm-dis-disabled',
+ DIS = 'xm-select-dis',
+ TEMP = 'xm-select-temp',
+ RADIO = 'xm-select-radio',
+ LINKAGE = 'xm-select-linkage',
+ DL = 'xm-select-dl',
+ HIDE_INPUT = 'xm-hide-input',
+ SANJIAO = 'xm-select-sj',
+ ICON_CLOSE = 'xm-icon-close',
+ FORM_TITLE = 'xm-select-title',
+ FORM_SELECT = 'xm-form-select',
+ FORM_SELECTED = 'xm-form-selected',
+ FORM_NONE = 'xm-select-none',
+ FORM_EMPTY = 'xm-select-empty',
+ FORM_INPUT = 'xm-input',
+ FORM_SELECT_TIPS = 'xm-select-tips',
+ CHECKBOX_YES = 'xm-icon-yes',
+ CZ = 'xm-cz',
+ CZ_GROUP = 'xm-cz-group',
+ TIPS = '请选择',
+ data = {},
+ events = {
+ on: {},
+ filter: {},
+ maxTips: {}
+ },
+ ajax = {
+ type: 'get',
+ header: {},
+ first: true,
+ data: {},
+ searchUrl: '',
+ searchName: 'keyword',
+ searchVal: null,
+ keyName: 'name',
+ keyVal: 'value',
+ keySel: 'selected',
+ keyDis: 'disabled',
+ keyChildren: 'children',
+ dataType: '',
+ delay: 500,
+ beforeSuccess: null,
+ success: null,
+ error: null,
+ beforeSearch: null,
+ clearInput: false
+ },
+ quickBtns = [{ icon: 'iconfont icon-quanxuan', name: '全选', click: function click(id, cm) {
+ cm.selectAll(id, true, true);
+ } }, { icon: 'iconfont icon-qingkong', name: '清空', click: function click(id, cm) {
+ cm.removeAll(id, true, true);
+ } }, { icon: 'iconfont icon-fanxuan', name: '反选', click: function click(id, cm) {
+ cm.reverse(id, true, true);
+ } }, { icon: 'iconfont icon-pifu', name: '换肤', click: function click(id, cm) {
+ cm.skin(id);
+ } }],
+ $ = window.$ || window.layui && window.layui.jquery,
+ $win = $(window),
+ ajaxs = {},
+ FormSelects = function FormSelects(options) {
+ var _this = this;
+
+ this.config = {
+ name: null, //xm-select="xxx"
+ max: null,
+ maxTips: function maxTips(vals, val, max) {
+ var ipt = $('[xid="' + _this.config.name + '"]').prev().find('.' + NAME);
+ if (ipt.parents('.layui-form-item[pane]').length) {
+ ipt = ipt.parents('.layui-form-item[pane]');
+ }
+ ipt.attr('style', 'border-color: red !important');
+ setTimeout(function () {
+ ipt.removeAttr('style');
+ }, 300);
+ },
+ init: null, //初始化的选择值,
+ on: null, //select值发生变化
+ filter: function filter(id, inputVal, val, isDisabled) {
+ return val.name.indexOf(inputVal) == -1;
+ },
+ clearid: -1,
+ direction: 'auto',
+ height: null,
+ isEmpty: false,
+ btns: [quickBtns[0], quickBtns[1], quickBtns[2]]
+ };
+ this.select = null;
+ this.values = [];
+ $.extend(true, this.config, options);
+ };
+
+ //一些简单的处理方法
+ var Common = function Common() {
+ this.loadingCss();
+ this.appender();
+ this.init();
+ this.on();
+ this.initVal();
+ this.onreset();
+ this.listening();
+ };
+
+ Common.prototype.appender = function () {
+ //针对IE做的一些拓展
+ if (!Array.prototype.map) {
+ Array.prototype.map = function (callback, thisArg) {
+ var T,
+ A,
+ k,
+ O = Object(this),
+ len = O.length >>> 0;
+ if (thisArg) {
+ T = thisArg;
+ }
+ A = new Array(len);
+ k = 0;
+ while (k < len) {
+ var kValue, mappedValue;
+ if (k in O) {
+ kValue = O[k];
+ mappedValue = callback.call(T, kValue, k, O);
+ A[k] = mappedValue;
+ }
+ k++;
+ }
+ return A;
+ };
+ }
+ if (!Array.prototype.forEach) {
+ Array.prototype.forEach = function forEach(callback, thisArg) {
+ var T, k;
+ if (this == null) {
+ throw new TypeError("this is null or not defined");
+ }
+ var O = Object(this);
+ var len = O.length >>> 0;
+ if (typeof callback !== "function") {
+ throw new TypeError(callback + " is not a function");
+ }
+ if (arguments.length > 1) {
+ T = thisArg;
+ }
+ k = 0;
+ while (k < len) {
+ var kValue;
+ if (k in O) {
+
+ kValue = O[k];
+ callback.call(T, kValue, k, O);
+ }
+ k++;
+ }
+ };
+ }
+ };
+
+ Common.prototype.init = function (target) {
+ var _this2 = this;
+
+ //初始化页面上已有的select
+ $(target ? target : 'select[' + NAME + ']').each(function (index, select) {
+ var othis = $(select),
+ id = othis.attr(NAME),
+ hasRender = othis.next('.layui-form-select'),
+ disabled = select.disabled,
+ max = othis.attr(MAX) - 0,
+ isSearch = othis.attr(SEARCH) != undefined,
+ searchUrl = isSearch ? othis.attr(SEARCH) : null,
+ isCreate = othis.attr(CREATE) != undefined,
+ isRadio = othis.attr(RADIO) != undefined,
+ skin = othis.attr(SKIN),
+ direction = othis.attr(DIRECTION),
+ optionsFirst = select.options[0],
+ height = othis.attr(HEIGHT),
+ formname = othis.attr('name'),
+ layverify = othis.attr('lay-verify'),
+ placeholder = optionsFirst ? optionsFirst.value ? TIPS : optionsFirst.innerHTML || TIPS : TIPS,
+ value = othis.find('option[selected]').toArray().map(function (option) {
+ //获取已选中的数据
+ return {
+ name: option.innerHTML,
+ val: option.value
+ };
+ }),
+ fs = new FormSelects();
+ data[id] = fs;
+ //先取消layui对select的渲染
+ hasRender[0] && hasRender.remove();
+
+ //包裹一个div
+ othis.wrap('<div class="' + PNAME + '"></div>');
+
+ //构造渲染div
+ var dinfo = _this2.renderSelect(id, placeholder, select);
+ var heightStyle = height ? 'style="height: ' + height + ';"' : '';
+ var inputHtml = height ? ['<div class="' + LABEL + '" style="margin-right: 50px;"></div>', '<input type="text" fsw class="' + FORM_INPUT + ' ' + INPUT + '" ' + (isSearch ? '' : 'style="display: none;"') + ' autocomplete="off" debounce="0" style="position: absolute;right: 10px;top: 3px;"/>'] : ['<div class="' + LABEL + '">', '<input type="text" fsw class="' + FORM_INPUT + ' ' + INPUT + '" ' + (isSearch ? '' : 'style="display: none;"') + ' autocomplete="off" debounce="0" />', '</div>'];
+ var reElem = $('<div class="' + FORM_SELECT + '" ' + SKIN + '="' + skin + '">\n\t\t\t\t\t<input type="hidden" class="' + HIDE_INPUT + '" value="" name="' + formname + '" lay-verify="' + layverify + '"/>\n\t\t\t\t\t<div class="' + FORM_TITLE + ' ' + (disabled ? DIS : '') + '">\n\t\t\t\t\t\t<div class="' + FORM_INPUT + ' ' + NAME + '" ' + heightStyle + '>\n\t\t\t\t\t\t\t' + inputHtml.join('') + '\n\t\t\t\t\t\t\t<i class="' + SANJIAO + '"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="' + TDIV + '">\n\t\t\t\t\t\t\t<input type="text" autocomplete="off" placeholder="' + placeholder + '" readonly="readonly" unselectable="on" class="' + FORM_INPUT + '">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<dl xid="' + id + '" class="' + DL + ' ' + (isRadio ? RADIO : '') + '">' + dinfo + '</dl>\n\t\t\t\t</div>');
+ othis.after(reElem);
+ fs.select = othis.remove(); //去掉layui.form.render
+ fs.values = value;
+ fs.config.name = id;
+ fs.config.init = value.concat([]);
+ fs.config.direction = direction;
+ fs.config.height = height;
+ fs.config.radio = isRadio;
+
+ if (max) {
+ //有最大值
+ fs.config.max = max;
+ }
+
+ //如果可搜索, 加上事件
+ if (isSearch) {
+ reElem.find('.' + INPUT).on('input propertychange', function (e) {
+ var input = e.target,
+ inputValue = $.trim(input.value),
+ keyCode = e.keyCode;
+ if (keyCode === 9 || keyCode === 13 || keyCode === 37 || keyCode === 38 || keyCode === 39 || keyCode === 40) {
+ return false;
+ }
+
+ //过滤一下tips
+ _this2.changePlaceHolder($(input));
+
+ var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+ searchUrl = ajaxConfig.searchUrl || searchUrl;
+ //如果开启了远程搜索
+ if (searchUrl) {
+ if (ajaxConfig.searchVal) {
+ inputValue = ajaxConfig.searchVal;
+ ajaxConfig.searchVal = '';
+ }
+ if (!ajaxConfig.beforeSearch || ajaxConfig.beforeSearch && ajaxConfig.beforeSearch instanceof Function && ajaxConfig.beforeSearch(id, searchUrl, inputValue)) {
+ var delay = ajaxConfig.delay;
+ if (ajaxConfig.first) {
+ ajaxConfig.first = false;
+ delay = 10;
+ }
+ clearTimeout(fs.clearid);
+ fs.clearid = setTimeout(function () {
+ reElem.find('dl > *:not(.' + FORM_SELECT_TIPS + ')').remove();
+ reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('请求中');
+ _this2.ajax(id, searchUrl, inputValue, false, null, true);
+ }, delay);
+ }
+ } else {
+ reElem.find('dl .layui-hide').removeClass('layui-hide');
+ //遍历选项, 选择可以显示的值
+ reElem.find('dl dd:not(.' + FORM_SELECT_TIPS + ')').each(function (idx, item) {
+ var _item = $(item);
+ var searchFun = data[id].config.filter || events.filter[id];
+ if (searchFun && searchFun(id, inputValue, {
+ name: _item.find('span').text(),
+ val: _item.attr('lay-value')
+ }, _item.hasClass(DISABLED)) == true) {
+ _item.addClass('layui-hide');
+ }
+ });
+ //控制分组名称
+ reElem.find('dl dt').each(function (index, item) {
+ if (!$(item).nextUntil('dt', ':not(.layui-hide)').length) {
+ $(item).addClass('layui-hide');
+ }
+ });
+ //动态创建
+ _this2.create(id, isCreate, inputValue);
+ var shows = reElem.find('dl dd:not(.' + FORM_SELECT_TIPS + '):not(.layui-hide)');
+ if (!shows.length) {
+ reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('无匹配项');
+ } else {
+ reElem.find('dd.' + FORM_NONE).removeClass(FORM_EMPTY);
+ }
+ }
+ });
+ if (searchUrl) {
+ //触发第一次请求事件
+ _this2.triggerSearch(reElem, true);
+ }
+ }
+ });
+ };
+
+ Common.prototype.isArray = function (obj) {
+ return Object.prototype.toString.call(obj) == "[object Array]";
+ };
+
+ Common.prototype.triggerSearch = function (div, isCall) {
+ (div ? [div] : $('.' + FORM_SELECT).toArray()).forEach(function (reElem, index) {
+ reElem = $(reElem);
+ var id = reElem.find('dl').attr('xid');
+ if (id && data[id] && data[id].config.isEmpty || isCall) {
+ var obj_caller = reElem.find('.' + INPUT)[0];
+ if (document.createEventObject) {
+ obj_caller.fireEvent("onchange");
+ } else {
+ var evt = document.createEvent("HTMLEvents");
+ evt.initEvent("input", false, true);
+ obj_caller.dispatchEvent(evt);
+ }
+ }
+ });
+ };
+
+ Common.prototype.ajax = function (id, searchUrl, inputValue, isLinkage, linkageWidth, isSearch) {
+ var _this3 = this;
+
+ var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+ if (!reElem[0] || !searchUrl) {
+ return;
+ }
+
+ var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+ var ajaxData = $.extend(true, {}, ajaxConfig.data);
+ ajaxData[ajaxConfig.searchName] = inputValue;
+ ajaxData['_'] = Date.now();
+ $.ajax({
+ type: ajaxConfig.type,
+ headers: ajaxConfig.header,
+ url: searchUrl,
+ data: ajaxConfig.dataType == 'json' ? JSON.stringify(ajaxData) : ajaxData,
+ success: function success(res) {
+ if (typeof res == 'string') {
+ res = JSON.parse(res);
+ }
+ ajaxConfig.beforeSuccess && ajaxConfig.beforeSuccess instanceof Function && (res = ajaxConfig.beforeSuccess(id, searchUrl, inputValue, res));
+ if (_this3.isArray(res)) {
+ res = {
+ code: 0,
+ msg: "",
+ data: res
+ };
+ }
+ if (res.code != 0) {
+ reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text(res.msg);
+ } else {
+ reElem.find('dd.' + FORM_NONE).removeClass(FORM_EMPTY);
+ //获得已选择的values
+ _this3.renderData(id, res.data, isLinkage, linkageWidth, isSearch);
+ data[id].config.isEmpty = res.data.length == 0;
+ }
+ ajaxConfig.success && ajaxConfig.success instanceof Function && ajaxConfig.success(id, searchUrl, inputValue, res);
+ },
+ error: function error(err) {
+ reElem.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + ')').remove();
+ reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('服务异常');
+ ajaxConfig.error && ajaxConfig.error instanceof Function && ajaxConfig.error(id, searchUrl, inputValue, err);
+ }
+ });
+ };
+
+ Common.prototype.renderData = function (id, dataArr, linkage, linkageWidth, isSearch) {
+ var _this4 = this;
+
+ if (linkage) {
+ var _ret = function () {
+ //渲染多级联动
+ var result = [],
+ index = 0,
+ temp = { "0": dataArr },
+ ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+
+ var _loop = function _loop() {
+ var group = result[index++] = [],
+ _temp = temp;
+ temp = {};
+ $.each(_temp, function (pid, arr) {
+ $.each(arr, function (idx, item) {
+ var val = {
+ pid: pid,
+ name: item[ajaxConfig.keyName],
+ val: item[ajaxConfig.keyVal]
+ };
+ group.push(val);
+ var children = item[ajaxConfig.keyChildren];
+ if (children && children.length) {
+ temp[val.val] = children;
+ }
+ });
+ });
+ };
+
+ do {
+ _loop();
+ } while (Object.getOwnPropertyNames(temp).length);
+
+ var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+ var html = ['<div class="xm-select-linkage">'];
+
+ $.each(result, function (idx, arr) {
+ var groupDiv = ['<div style="left: ' + (linkageWidth - 0) * idx + 'px;" class="xm-select-linkage-group xm-select-linkage-group' + (idx + 1) + ' ' + (idx != 0 ? 'xm-select-linkage-hide' : '') + '">'];
+ $.each(arr, function (idx2, item) {
+ var span = '<li title="' + item.name + '" pid="' + item.pid + '" value="' + item.val + '"><span>' + item.name + '</span></li>';
+ groupDiv.push(span);
+ });
+ groupDiv.push('</div>');
+ html = html.concat(groupDiv);
+ });
+ // <li class="xm-select-this xm-select-active"><span>123</span></li>
+ html.push('<div style="clear: both; height: 288px;"></div>');
+ html.push('</div>');
+ reElem.find('dl').html(html.join(''));
+ reElem.find('.' + INPUT).css('display', 'none'); //联动暂时不支持搜索
+ return {
+ v: void 0
+ };
+ }();
+
+ if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
+ }
+
+ var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+ var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+ var pcInput = reElem.find('.' + TDIV + ' input');
+
+ var values = [];
+ reElem.find('dl').html(this.renderSelect(id, pcInput.attr('placeholder') || pcInput.attr('back'), dataArr.map(function (item) {
+ if (item[ajaxConfig.keySel]) {
+ values.push({
+ name: item[ajaxConfig.keyName],
+ val: item[ajaxConfig.keyVal]
+ });
+ }
+ return {
+ innerHTML: item[ajaxConfig.keyName],
+ value: item[ajaxConfig.keyVal],
+ sel: item[ajaxConfig.keySel],
+ disabled: item[ajaxConfig.keyDis],
+ type: item.type,
+ name: item.name
+ };
+ })));
+
+ var label = reElem.find('.' + LABEL);
+ var dl = reElem.find('dl[xid]');
+ if (isSearch) {
+ //如果是远程搜索, 这里需要判重
+ var oldVal = data[id].values;
+ oldVal.forEach(function (item, index) {
+ dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+ });
+ values.forEach(function (item, index) {
+ if (_this4.indexOf(oldVal, item) == -1) {
+ _this4.addLabel(id, label, item);
+ dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+ oldVal.push(item);
+ }
+ });
+ } else {
+ values.forEach(function (item, index) {
+ _this4.addLabel(id, label, item);
+ dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+ });
+ data[id].values = values;
+ }
+ this.commonHanler(id, label);
+ };
+
+ Common.prototype.create = function (id, isCreate, inputValue) {
+ if (isCreate && inputValue) {
+ var fs = data[id],
+ dl = $('[xid="' + id + '"]'),
+ tips = dl.find('dd.' + FORM_SELECT_TIPS + ':first'),
+ tdd = null,
+ temp = dl.find('dd.' + TEMP);
+ dl.find('dd:not(.' + FORM_SELECT_TIPS + '):not(.' + TEMP + ')').each(function (index, item) {
+ if (inputValue == $(item).find('span').text()) {
+ tdd = item;
+ }
+ });
+ if (!tdd) {
+ //如果不存在, 则创建
+ if (temp[0]) {
+ temp.attr('lay-value', inputValue);
+ temp.find('span').text(inputValue);
+ temp.removeClass('layui-hide');
+ } else {
+ tips.after($(this.createDD({
+ innerHTML: inputValue,
+ value: Date.now()
+ }, TEMP + ' ' + CREATE_LONG)));
+ }
+ }
+ } else {
+ $('[xid=' + id + '] dd.' + TEMP).remove();
+ }
+ };
+
+ Common.prototype.createDD = function (item, clz) {
+ return '<dd lay-value="' + item.value + '" class="' + (item.disabled ? DISABLED : '') + ' ' + (clz ? clz : '') + '">\n\t\t\t\t\t<div class="xm-unselect xm-form-checkbox ' + (item.disabled ? 'layui-checkbox-disbaled ' + DISABLED : '') + '" lay-skin="primary">\n\t\t\t\t\t\t<span>' + $.trim(item.innerHTML) + '</span>\n\t\t\t\t\t\t<i class="' + CHECKBOX_YES + '"></i>\n\t\t\t\t\t</div>\n\t\t\t\t</dd>';
+ };
+
+ Common.prototype.createQuickBtn = function (obj, right) {
+ return '<div class="' + CZ + '" method="' + obj.name + '" title="' + obj.name + '" ' + (right ? 'style="margin-right: ' + right + '"' : '') + '><i class="' + obj.icon + '"></i><span>' + obj.name + '</span></div>';
+ };
+
+ Common.prototype.renderBtns = function (id, show, right) {
+ var _this5 = this;
+
+ var quickBtn = [];
+ var dl = $('dl[xid="' + id + '"]');
+ quickBtn.push('<div class="' + CZ_GROUP + '" show="' + show + '" style="max-width: ' + (dl.prev().width() - 54) + 'px;">');
+ $.each(data[id].config.btns, function (index, item) {
+ quickBtn.push(_this5.createQuickBtn(item, right));
+ });
+ quickBtn.push('</div>');
+ quickBtn.push(this.createQuickBtn({ icon: 'iconfont icon-caidan', name: '' }));
+ return quickBtn.join('');
+ };
+
+ Common.prototype.renderSelect = function (id, tips, select) {
+ var _this6 = this;
+
+ var arr = [];
+ if (data[id].config.btns.length) {
+ setTimeout(function () {
+ var dl = $('dl[xid="' + id + '"]');
+ dl.find('.' + CZ_GROUP).css('max-width', dl.prev().width() - 54 + 'px');
+ }, 10);
+ arr.push(['<dd lay-value="" class="' + FORM_SELECT_TIPS + '" style="background-color: #FFF!important;">', this.renderBtns(id, null, '30px'), '</dd>'].join(''));
+ } else {
+ arr.push('<dd lay-value="" class="' + FORM_SELECT_TIPS + '">' + tips + '</dd>');
+ }
+ if (this.isArray(select)) {
+ $(select).each(function (index, item) {
+ if (item.type === 'optgroup') {
+ arr.push('<dt>' + item.name + '</dt>');
+ } else {
+ arr.push(_this6.createDD(item));
+ }
+ });
+ } else {
+ $(select).find('*').each(function (index, item) {
+ if (item.tagName.toLowerCase() == 'option' && index == 0 && !item.value) {
+ return;
+ }
+ if (item.tagName.toLowerCase() === 'optgroup') {
+ arr.push('<dt>' + item.label + '</dt>');
+ } else {
+ arr.push(_this6.createDD(item));
+ }
+ });
+ }
+ arr.push('<dt style="display:none;"> </dt>');
+ arr.push('<dd class="' + FORM_SELECT_TIPS + ' ' + FORM_NONE + ' ' + (arr.length === 2 ? FORM_EMPTY : '') + '">\u6CA1\u6709\u9009\u9879</dd>');
+ return arr.join('');
+ };
+
+ Common.prototype.on = function () {
+ var _this7 = this;
+
+ //事件绑定
+ this.one();
+
+ $(document).on('click', function (e) {
+ if (!$(e.target).parents('.' + FORM_TITLE)[0]) {
+ //清空input中的值
+ $('.' + INPUT).val('');
+ $('.' + PNAME + ' dl .layui-hide').removeClass('layui-hide');
+ $('.' + PNAME + ' dl dd.' + TEMP).remove();
+ _this7.triggerSearch();
+ }
+ $('.' + PNAME + ' .' + FORM_SELECTED).removeClass(FORM_SELECTED);
+ });
+ };
+
+ Common.prototype.one = function (target) {
+ var _this8 = this;
+
+ //一次性事件绑定
+ $(target ? target : document).find('.' + FORM_TITLE).off('click').on('click', function (e) {
+ var othis = $(e.target),
+ title = othis.is(FORM_TITLE) ? othis : othis.parents('.' + FORM_TITLE),
+ dl = title.next(),
+ id = dl.attr('xid');
+
+ //清空非本select的input val
+ $('dl[xid]').not(dl).prev().find('.' + INPUT).val('');
+ $('dl[xid]').not(dl).find('dd.layui-hide').removeClass('layui-hide');
+
+ //如果是disabled select
+ if (title.hasClass(DIS)) {
+ return false;
+ }
+ //如果点击的是右边的三角或者只读的input
+ if (othis.is('.' + SANJIAO) || othis.is('.' + INPUT + '[readonly]')) {
+ _this8.changeShow(title, !title.parents('.' + FORM_SELECT).hasClass(FORM_SELECTED));
+ return false;
+ }
+ //如果点击的是input的右边, focus一下
+ if (title.find('.' + INPUT + ':not(readonly)')[0]) {
+ var input = title.find('.' + INPUT),
+ epos = { x: e.pageX, y: e.pageY },
+ pos = _this8.getPosition(title[0]),
+ width = title.width();
+ while (epos.x > pos.x) {
+ if ($(document.elementFromPoint(epos.x, epos.y)).is(input)) {
+ input.focus();
+ _this8.changeShow(title, true);
+ return false;
+ }
+ epos.x -= 50;
+ }
+ }
+
+ //如果点击的是可搜索的input
+ if (othis.is('.' + INPUT)) {
+ _this8.changeShow(title, true);
+ return false;
+ }
+ //如果点击的是x按钮
+ if (othis.is('i[fsw="' + NAME + '"]')) {
+ var val = {
+ name: othis.prev().text(),
+ val: othis.parent().attr("value")
+ },
+ dd = dl.find('dd[lay-value=\'' + val.val + '\']');
+ if (dd.hasClass(DISABLED)) {
+ //如果是disabled状态, 不可选, 不可删
+ return false;
+ }
+ _this8.handlerLabel(id, dd, false, val);
+ return false;
+ }
+
+ _this8.changeShow(title, !title.parents('.' + FORM_SELECT).hasClass(FORM_SELECTED));
+ return false;
+ });
+ $(target ? target : document).find('dl.' + DL).off('click').on('click', function (e) {
+ var othis = $(e.target);
+ if (othis.is('.' + LINKAGE) || othis.parents('.' + LINKAGE)[0]) {
+ //linkage的处理
+ othis = othis.is('li') ? othis : othis.parents('li');
+ var _group = othis.parents('.xm-select-linkage-group'),
+ _id = othis.parents('dl').attr('xid');
+ //激活li
+ _group.find('.xm-select-active').removeClass('xm-select-active');
+ othis.addClass('xm-select-active');
+ //激活下一个group, 激活前显示对应数据
+ _group.nextAll('.xm-select-linkage-group').addClass('xm-select-linkage-hide');
+ var nextGroup = _group.next('.xm-select-linkage-group');
+ nextGroup.find('li').addClass('xm-select-linkage-hide');
+ nextGroup.find('li[pid="' + othis.attr('value') + '"]').removeClass('xm-select-linkage-hide');
+ //如果没有下一个group, 或没有对应的值
+ if (!nextGroup[0] || nextGroup.find('li:not(.xm-select-linkage-hide)').length == 0) {
+ var vals = [],
+ index = 0,
+ _isAdd = !othis.hasClass('xm-select-this');
+ if (data[_id].config.radio) {
+ othis.parents('.xm-select-linkage').find('.xm-select-this').removeClass('xm-select-this');
+ }
+ do {
+ vals[index++] = {
+ name: othis.find('span').text(),
+ val: othis.attr('value')
+ /*isAdd ? (
+ othis.addClass('xm-select-this')
+ ) : (
+ !othis.parent('.xm-select-linkage-group').next().find(`li[pid="${othis.attr('value')}"].xm-select-this`).length && othis.removeClass('xm-select-this')
+ );*/
+ };othis = othis.parents('.xm-select-linkage-group').prev().find('li[value="' + othis.attr('pid') + '"]');
+ } while (othis.length);
+ vals.reverse();
+ var val = {
+ name: vals.map(function (item) {
+ return item.name;
+ }).join('/'),
+ val: vals.map(function (item) {
+ return item.val;
+ }).join('/')
+ };
+ _this8.handlerLabel(_id, null, _isAdd, val);
+ } else {
+ nextGroup.removeClass('xm-select-linkage-hide');
+ }
+ return false;
+ } //xm-select-this xm-select-active
+
+ if (othis.is('dt') || othis.is('dl')) {
+ return false;
+ }
+ var dd = othis.is('dd') ? othis : othis.parents('dd');
+ var id = dd.parent('dl').attr('xid');
+ if (dd.hasClass(DISABLED)) {
+ //被禁用选项的处理
+ return false;
+ }
+ if (dd.hasClass(FORM_SELECT_TIPS)) {
+ //tips的处理
+ var btn = othis.is('.' + CZ) ? othis : othis.parents('.' + CZ);
+ if (!btn[0]) {
+ return false;
+ }
+ //TODO 快捷操作
+ var method = btn.attr('method');
+ var obj = data[id].config.btns.filter(function (bean) {
+ return bean.name == method;
+ })[0];
+ obj && obj.click && obj.click instanceof Function && obj.click(id, _this8);
+ return false;
+ }
+ var isAdd = !dd.hasClass(THIS);
+ _this8.handlerLabel(id, dd, isAdd);
+ return false;
+ });
+ };
+
+ Common.prototype.linkageAdd = function (id, val) {
+ var dl = $('dl[xid="' + id + '"]');
+ dl.find('.xm-select-active').removeClass('xm-select-active');
+ var vs = val.val.split('/');
+ var pid = void 0,
+ li = void 0,
+ index = 0;
+ var lis = [];
+ do {
+ pid = vs[index];
+ li = dl.find('.xm-select-linkage-group' + (index + 1) + ' li[value="' + pid + '"]');
+ li[0] && lis.push(li);
+ index++;
+ } while (li.length && pid != undefined);
+ if (lis.length == vs.length) {
+ $.each(lis, function (idx, item) {
+ item.addClass('xm-select-this');
+ });
+ }
+ };
+
+ Common.prototype.linkageDel = function (id, val) {
+ var dl = $('dl[xid="' + id + '"]');
+ var vs = val.val.split('/');
+ var pid = void 0,
+ li = void 0,
+ index = vs.length - 1;
+ do {
+ pid = vs[index];
+ li = dl.find('.xm-select-linkage-group' + (index + 1) + ' li[value="' + pid + '"]');
+ if (!li.parent().next().find('li[pid=' + pid + '].xm-select-this').length) {
+ li.removeClass('xm-select-this');
+ }
+ index--;
+ } while (li.length && pid != undefined);
+ };
+
+ Common.prototype.valToName = function (id, val) {
+ var dl = $('dl[xid="' + id + '"]');
+ var vs = (val + "").split('/');
+ var names = [];
+ $.each(vs, function (idx, item) {
+ var name = dl.find('.xm-select-linkage-group' + (idx + 1) + ' li[value="' + item + '"] span').text();
+ names.push(name);
+ });
+ return names.length == vs.length ? names.join('/') : null;
+ };
+
+ Common.prototype.commonHanler = function (key, label) {
+ //计算input的提示语
+ this.changePlaceHolder(label);
+ //计算高度
+ this.retop(label.parents('.' + FORM_SELECT));
+ this.checkHideSpan(label);
+ this.calcLeft(key, label);
+ //表单默认值
+ label.parents('.' + PNAME).find('.' + HIDE_INPUT).val(data[key].values.map(function (val) {
+ return val.val;
+ }).join(','));
+ //title值
+ label.parents('.' + FORM_TITLE + ' .' + NAME).attr('title', data[key].values.map(function (val) {
+ return val.name;
+ }).join(','));
+ };
+
+ Common.prototype.initVal = function (id) {
+ var _this9 = this;
+
+ var target = {};
+ if (id) {
+ target[id] = data[id];
+ } else {
+ target = data;
+ }
+ $.each(target, function (key, val) {
+ var values = val.values,
+ div = $('dl[xid="' + key + '"]').parent(),
+ label = div.find('.' + LABEL),
+ dl = div.find('dl');
+ dl.find('dd.' + THIS).removeClass(THIS);
+
+ var _vals = values.concat([]);
+ _vals.concat([]).forEach(function (item, index) {
+ _this9.addLabel(key, label, item);
+ dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+ });
+ if (val.config.radio) {
+ _vals.length && values.push(_vals[_vals.length - 1]);
+ }
+ _this9.commonHanler(key, label);
+ });
+ };
+
+ Common.prototype.handlerLabel = function (id, dd, isAdd, oval, notOn) {
+ var div = $('[xid="' + id + '"]').prev().find('.' + LABEL),
+ val = dd && {
+ name: dd.find('span').text(),
+ val: dd.attr('lay-value')
+ },
+ vals = data[id].values,
+ on = data[id].config.on || events.on[id];
+ if (oval) {
+ val = oval;
+ }
+ var fs = data[id];
+ if (isAdd && fs.config.max && fs.values.length >= fs.config.max) {
+ var maxTipsFun = data[id].config.maxTips || events.maxTips[id];
+ maxTipsFun && maxTipsFun(id, vals.concat([]), val, fs.max);
+ return;
+ }
+ if (!notOn) {
+ if (on && on instanceof Function && on(id, vals.concat([]), val, isAdd, dd && dd.hasClass(DISABLED) == false)) {
+ return;
+ }
+ }
+ var dl = $('dl[xid="' + id + '"]');
+ isAdd ? (dd && dd[0] ? (dd.addClass(THIS), dd.removeClass(TEMP)) : dl.find('.xm-select-linkage')[0] && this.linkageAdd(id, val), this.addLabel(id, div, val), vals.push(val)) : (dd && dd[0] ? dd.removeClass(THIS) : dl.find('.xm-select-linkage')[0] && this.linkageDel(id, val), this.delLabel(id, div, val), this.remove(vals, val));
+ if (!div[0]) return;
+ //单选选完后直接关闭选择域
+ if (fs.config.radio) {
+ this.changeShow(div, false);
+ }
+ //移除表单验证的红色边框
+ div.parents('.' + FORM_TITLE).prev().removeClass('layui-form-danger');
+
+ //清空搜索值
+ fs.config.clearInput && div.parents('.' + PNAME).find('.' + INPUT).val('');
+
+ this.commonHanler(id, div);
+ };
+
+ Common.prototype.addLabel = function (id, div, val) {
+ if (!val) return;
+ var tips = 'fsw="' + NAME + '"';
+ var _ref = [$('<span ' + tips + ' value="' + val.val + '"><font ' + tips + '>' + val.name + '</font></span>'), $('<i ' + tips + ' class="xm-icon-close">\xD7</i>')],
+ $label = _ref[0],
+ $close = _ref[1];
+
+ $label.append($close);
+ //如果是radio模式
+ var fs = data[id];
+ if (fs.config.radio) {
+ fs.values.length = 0;
+ $('dl[xid="' + id + '"]').find('dd.' + THIS + ':not([lay-value="' + val.val + '"])').removeClass(THIS);
+ div.find('span').remove();
+ }
+ //如果是固定高度
+ if (fs.config.height) {
+ div.append($label);
+ } else {
+ div.find('input').css('width', '50px');
+ div.find('input').before($label);
+ }
+ };
+
+ Common.prototype.delLabel = function (id, div, val) {
+ if (!val) return;
+ div.find('span[value="' + val.val + '"]:first').remove();
+ };
+
+ Common.prototype.calcLeft = function (id, div) {
+ if (data[id].config.height) {
+ var showLastSpan = div.find('span:not(.xm-span-hide):last')[0];
+ div.next().css('left', (showLastSpan ? this.getPosition(showLastSpan).x - this.getPosition(div[0]).x + showLastSpan.offsetWidth + 20 : 10) + 'px');
+ }
+ };
+
+ Common.prototype.checkHideSpan = function (div) {
+ var _this10 = this;
+
+ var parentHeight = div.parents('.' + NAME)[0].offsetHeight + 5;
+ div.find('span.xm-span-hide').removeClass('xm-span-hide');
+ div.find('span').each(function (index, item) {
+ if (item.offsetHeight + item.offsetTop > parentHeight || _this10.getPosition(item).y + item.offsetHeight > _this10.getPosition(div[0]).y + div[0].offsetHeight + 5) {
+ $(item).addClass('xm-span-hide');
+ }
+ });
+ };
+
+ Common.prototype.retop = function (div) {
+ //计算dl显示的位置
+ var dl = div.find('dl'),
+ top = div.offset().top + div.outerHeight() + 5 - $win.scrollTop(),
+ dlHeight = dl.outerHeight();
+ var up = div.hasClass('layui-form-selectup') || dl.css('top').indexOf('-') != -1 || top + dlHeight > $win.height() && top >= dlHeight;
+ div = div.find('.' + NAME);
+
+ var fs = data[dl.attr('xid')];
+ var base = dl.parents('.layui-form-pane')[0] && dl.prev()[0].clientHeight > 38 ? 14 : 10;
+ if (fs) {
+ if (fs.config.direction == 'up') {
+ dl.css({
+ top: 'auto',
+ bottom: '42px'
+ });
+ return;
+ }
+ if (fs.direction == 'down') {
+ dl.css({
+ top: div[0].offsetTop + div.height() + base + 'px',
+ bottom: 'auto'
+ });
+ return;
+ }
+ }
+
+ if (up) {
+ dl.css({
+ top: 'auto',
+ bottom: '42px'
+ });
+ } else {
+ dl.css({
+ top: div[0].offsetTop + div.height() + base + 'px',
+ bottom: 'auto'
+ });
+ }
+ };
+
+ Common.prototype.changeShow = function (children, isShow) {
+ //显示于隐藏
+ var top = children.parents('.' + FORM_SELECT);
+ $('.' + PNAME + ' .' + FORM_SELECT).not(top).removeClass(FORM_SELECTED);
+ if (isShow) {
+ this.retop(top);
+ top.addClass(FORM_SELECTED);
+ top.find('.' + INPUT).focus();
+ } else {
+ top.removeClass(FORM_SELECTED);
+ top.find('.' + INPUT).val('');
+ top.find('dl .layui-hide').removeClass('layui-hide');
+ top.find('dl dd.' + TEMP).remove();
+ //计算ajax数据是否为空, 然后重新请求数据
+ var id = top.find('dl').attr('xid');
+ if (id && data[id] && data[id].config.isEmpty) {
+ this.triggerSearch(top);
+ }
+ }
+ };
+
+ Common.prototype.changePlaceHolder = function (div) {
+ //显示于隐藏提示语
+ //调整pane模式下的高度
+ var title = div.parents('.' + FORM_TITLE);
+
+ var id = div.parents('.' + PNAME).find('dl[xid]').attr('xid');
+ if (data[id] && data[id].config.height) {//既然固定高度了, 那就看着办吧
+
+ } else {
+ var height = title.find('.' + NAME)[0].clientHeight;
+ title.css('height', (height > 34 ? height + 4 : height) + 'px');
+ //如果是layui pane模式, 处理label的高度
+ var label = title.parents('.' + PNAME).parent().prev();
+ if (label.is('.layui-form-label') && title.parents('.layui-form-pane')[0]) {
+ height = height > 36 ? height + 4 : height;
+ title.css('height', height + 'px');
+ label.css({
+ height: height + 2 + 'px',
+ lineHeight: height - 18 + 'px'
+ });
+ }
+ }
+
+ var input = title.find('.' + TDIV + ' input'),
+ isShow = !div.find('span:last')[0] && !title.find('.' + INPUT).val();
+ if (isShow) {
+ var ph = input.attr('back');
+ input.removeAttr('back');
+ input.attr('placeholder', ph);
+ } else {
+ var _ph = input.attr('placeholder');
+ input.removeAttr('placeholder');
+ input.attr('back', _ph);
+ }
+ };
+
+ Common.prototype.indexOf = function (arr, val) {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i].val == val || arr[i].val == (val ? val.val : val) || arr[i] == val || JSON.stringify(arr[i]) == JSON.stringify(val)) {
+ return i;
+ }
+ }
+ return -1;
+ };
+
+ Common.prototype.remove = function (arr, val) {
+ var idx = this.indexOf(arr, val ? val.val : val);
+ if (idx > -1) {
+ arr.splice(idx, 1);
+ return true;
+ }
+ return false;
+ };
+
+ Common.prototype.selectAll = function (id, isOn, skipDis) {
+ var _this11 = this;
+
+ var dl = $('[xid="' + id + '"]');
+ if (dl.find('.xm-select-linkage')[0]) {
+ return;
+ }
+ dl.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + '):not(.' + THIS + ')' + (skipDis ? ':not(.' + DISABLED + ')' : '')).each(function (index, item) {
+ item = $(item);
+ var val = {
+ name: item.find('span').text(),
+ val: item.attr('lay-value')
+ };
+ _this11.handlerLabel(id, dl.find('dd[lay-value="' + val.val + '"]'), true, val, !isOn);
+ });
+ };
+
+ Common.prototype.removeAll = function (id, isOn, skipDis) {
+ var _this12 = this;
+
+ var dl = $('[xid="' + id + '"]');
+ if (dl.find('.xm-select-linkage')[0]) {
+ //针对多级联动的处理
+ data[id].values.concat([]).forEach(function (item, idx) {
+ var vs = item.val.split('/');
+ var pid = void 0,
+ li = void 0,
+ index = 0;
+ do {
+ pid = vs[index++];
+ li = dl.find('.xm-select-linkage-group' + index + ':not(.xm-select-linkage-hide) li[value="' + pid + '"]');
+ li.click();
+ } while (li.length && pid != undefined);
+ });
+ return;
+ }
+ data[id].values.concat([]).forEach(function (item, index) {
+ if (skipDis && dl.find('dd[lay-value="' + item.val + '"]').hasClass(DISABLED)) {} else {
+ _this12.handlerLabel(id, dl.find('dd[lay-value="' + item.val + '"]'), false, item, !isOn);
+ }
+ });
+ };
+
+ Common.prototype.reverse = function (id, isOn, skipDis) {
+ var _this13 = this;
+
+ var dl = $('[xid="' + id + '"]');
+ if (dl.find('.xm-select-linkage')[0]) {
+ return;
+ }
+ dl.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + ')' + (skipDis ? ':not(.' + DISABLED + ')' : '')).each(function (index, item) {
+ item = $(item);
+ var val = {
+ name: item.find('span').text(),
+ val: item.attr('lay-value')
+ };
+ _this13.handlerLabel(id, dl.find('dd[lay-value="' + val.val + '"]'), !item.hasClass(THIS), val, !isOn);
+ });
+ };
+
+ Common.prototype.skin = function (id) {
+ var skins = ['default', 'primary', 'normal', 'warm', 'danger'];
+ var skin = skins[Math.floor(Math.random() * skins.length)];
+ $('dl[xid="' + id + '"]').parents('.' + PNAME).find('.' + FORM_SELECT).attr('xm-select-skin', skin);
+ this.commonHanler(id, $('dl[xid="' + id + '"]').parents('.' + PNAME).find('.' + LABEL));
+ };
+
+ Common.prototype.getPosition = function (e) {
+ var x = 0,
+ y = 0;
+ while (e != null) {
+ x += e.offsetLeft;
+ y += e.offsetTop;
+ e = e.offsetParent;
+ }
+ return { x: x, y: y };
+ };
+
+ Common.prototype.onreset = function () {
+ //监听reset按钮, 然后重置多选
+ $(document).on('click', '[type=reset]', function (e) {
+ $(e.target).parents('form').find('.' + PNAME + ' dl[xid]').each(function (index, item) {
+ var id = item.getAttribute('xid'),
+ dl = $(item),
+ dd = void 0,
+ temp = {};
+ common.removeAll(id);
+ data[id].config.init.forEach(function (val, idx) {
+ if (val && (!temp[val] || data[id].config.repeat) && (dd = dl.find('dd[lay-value="' + val.val + '"]'))[0]) {
+ common.handlerLabel(id, dd, true);
+ temp[val] = 1;
+ }
+ });
+ });
+ });
+ };
+
+ Common.prototype.loadingCss = function () {
+ var cssStyle = $('<style type="text/css">' + '.xm-select-parent *{margin:0;padding:0;font-family:"Helvetica Neue",Helvetica,"PingFang SC",\u5FAE\u8F6F\u96C5\u9ED1,Tahoma,Arial,sans-serif}.xm-select-parent{text-align:left}.xm-select-parent select{display:none}.xm-select-parent .xm-select-title{position:relative;min-height:36px}.xm-select-parent .xm-input{cursor:pointer;border-radius:2px;border-width:1px;border-style:solid;border-color:#E6E6E6;display:block;width:100%;box-sizing:border-box;background-color:#FFF;height:36px;line-height:1.3;padding-left:10px;outline:0}.xm-select-parent .xm-select-sj{display:inline-block;width:0;height:0;border-style:dashed;border-color:transparent;overflow:hidden;position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#C2C2C2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.xm-select-parent .xm-form-selected .xm-select-sj{margin-top:-9px;transform:rotate(180deg)}.xm-select-parent .xm-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:999;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;animation-fill-mode:both;-webkit-animation-name:layui-upbit;animation-name:layui-upbit;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.xm-select-parent .xm-form-selected dl{display:block}.xm-select-parent .xm-form-select dl dd,.xm-select-parent .xm-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.xm-select-parent .xm-form-select dl dd{cursor:pointer;height:36px}.xm-select-parent .xm-form-select dl dd:hover{background-color:#f2f2f2}.xm-select-parent .xm-form-select dl dt{font-size:12px;color:#999}.layui-select-disabled .xm-dis-disabled{border-color:#eee!important}.xm-select-parent .xm-form-select dl .xm-select-tips{padding-left:10px!important;color:#999;font-size:14px}.xm-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.xm-form-checkbox{position:relative;display:inline-block;vertical-align:middle;height:30px;line-height:30px;margin-right:10px;padding-right:30px;background-color:#fff;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.xm-form-checkbox *{display:inline-block;vertical-align:middle}.xm-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.xm-form-checkbox:hover span{background-color:#c2c2c2}.xm-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.xm-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.xm-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;border:none!important;margin-right:0;padding-right:0;background:0 0}.xm-form-checkbox[lay-skin=primary] span{float:right;padding-right:15px;line-height:18px;background:0 0;color:#666}.xm-form-checkbox[lay-skin=primary] i{position:relative;top:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.xm-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.xm-icon-yes{width:30px;height:30px;border-radius:4px;background-color:#009688;position:relative}.xm-icon-yes:after{content:\'\';display:inline-block;border:2px solid #fff;border-top-width:0;border-right-width:0;width:9px;height:5px;-webkit-transform:rotate(-50deg);transform:rotate(-50deg);position:absolute;top:2px;left:3px}.xm-dis-disabled,.xm-dis-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.xm-form-select dl dd.xm-dis-disabled{background-color:#fff!important}.xm-form-select dl dd.xm-dis-disabled span{color:#C2C2C2}.xm-form-select dl dd.xm-dis-disabled .xm-icon-yes{border-color:#C2C2C2}.xm-select-parent{position:relative;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.xm-select-parent .xm-select{line-height:normal;height:auto;padding:4px 10px 1px 10px;overflow:hidden;min-height:36px;left:0;z-index:99;position:absolute;background:0 0;padding-right:20px}.xm-select-parent .xm-select:hover{border-color:#C0C4CC}.xm-select-parent .xm-select .xm-select-label{display:inline-block;margin:0;vertical-align:middle}.xm-select-parent .xm-select-title div.xm-select-label>span{position:relative;padding:2px 5px;background-color:#009688;border-radius:2px;color:#FFF;display:inline-block;line-height:18px;height:18px;margin:2px 5px 2px 0;cursor:initial;user-select:none;font-size:14px;padding-right:25px}.xm-select-parent .xm-select-title div.xm-select-label>span i{position:absolute;right:5px;top:2px;margin-left:8px;border-radius:20px;font-size:18px;cursor:pointer;display:inline-block;height:14px;line-height:15px;width:12px;vertical-align:top;margin-top:2px}.xm-select-parent .xm-select .xm-select-input{border:none;height:28px;background-color:transparent;padding:0;vertical-align:middle;display:inline-block;width:50px}.xm-select-parent .xm-select--suffix input{border:none}.xm-select-parent dl dd.xm-dis-disabled.xm-select-this i{border-color:#C2C2C2;background-color:#C2C2C2;color:#FFF}.xm-select-parent dl dd.xm-select-this i{background-color:#009688;border-color:#009688}.xm-form-selected .xm-select,.xm-form-selected .xm-select:hover{border-color:#009688!important}.xm-select--suffix+div{position:absolute;top:0;left:0;bottom:0;right:0}.xm-select-dis .xm-select--suffix+div{z-index:100;cursor:no-drop!important;opacity:.2;background-color:#FFF}.xm-select-disabled,.xm-select-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important;background-color:#fff}.xm-select-none{display:none;margin:5px 0;text-align:center}.xm-select-none:hover{background-color:#FFF!important}.xm-select-empty{display:block}.xm-span-hide{display:none!important}.xm-select-radio .xm-icon-yes{border-radius:20px!important}.xm-select-radio .xm-icon-yes:after{border-radius:20px;background-color:#fff;width:6px;height:6px;border:none;top:5px;left:5px}.layui-form-pane .xm-select,.layui-form-pane .xm-select:hover{border:none!important;top:0}.layui-form-pane .xm-select-title{border:1px solid #e6e6e6!important}div[xm-select-skin] .xm-select-title div.xm-select-label>span{border:1px solid #009688}div[xm-select-skin] .xm-select-title div.xm-select-label>span i:hover{opacity:.8;filter:alpha(opacity=80);cursor:pointer}div[xm-select-skin=default] .xm-select-title div.xm-select-label>span{background-color:#F0F2F5;color:#909399;border:1px solid #F0F2F5}div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i{background-color:#C0C4CC;color:#FFF}div[xm-select-skin=default] dl dd.xm-select-this:not(.xm-dis-disabled) i{background-color:#5FB878;border-color:#5FB878;color:#FFF}div[xm-select-skin=default].xm-form-selected .xm-select,div[xm-select-skin=default].xm-form-selected .xm-select:hover{border-color:#C0C4CC!important}div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span{background-color:#009688;color:#FFF;border:1px solid #009688}div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i{background-color:#009688;color:#FFF}div[xm-select-skin=primary] dl dd.xm-select-this:not(.xm-dis-disabled) i{background-color:#009688;border-color:#009688;color:#FFF}div[xm-select-skin=primary].xm-form-selected .xm-select,div[xm-select-skin=primary].xm-form-selected .xm-select:hover{border-color:#009688!important}div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span{background-color:#1E9FFF;color:#FFF;border:1px solid #1E9FFF}div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span i{background-color:#1E9FFF;color:#FFF}div[xm-select-skin=normal] dl dd.xm-select-this:not(.xm-dis-disabled) i{background-color:#1E9FFF;border-color:#1E9FFF;color:#FFF}div[xm-select-skin=normal].xm-form-selected .xm-select,div[xm-select-skin=normal].xm-form-selected .xm-select:hover{border-color:#1E9FFF!important}div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span{background-color:#FFB800;color:#FFF;border:1px solid #FFB800}div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span i{background-color:#FFB800;color:#FFF}div[xm-select-skin=warm] dl dd.xm-select-this:not(.xm-dis-disabled) i{background-color:#FFB800;border-color:#FFB800;color:#FFF}div[xm-select-skin=warm].xm-form-selected .xm-select,div[xm-select-skin=warm].xm-form-selected .xm-select:hover{border-color:#FFB800!important}div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span{background-color:#FF5722;color:#FFF;border:1px solid #FF5722}div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span i{background-color:#FF5722;color:#FFF}div[xm-select-skin=danger] dl dd.xm-select-this:not(.xm-dis-disabled) i{background-color:#FF5722;border-color:#FF5722;color:#FFF}div[xm-select-skin=danger].xm-form-selected .xm-select,div[xm-select-skin=danger].xm-form-selected .xm-select:hover{border-color:#FF5722!important}.xm-select-parent .layui-form-danger+.xm-select-title .xm-select{border-color:#FF5722!important}.xm-select-linkage li{padding:10px 0;cursor:pointer}.xm-select-linkage li span{padding-left:20px;padding-right:30px;display:inline-block;height:20px;overflow:hidden;text-overflow:ellipsis}.xm-select-linkage li.xm-select-this span{border-left:5px solid #009688;color:#009688;padding-left:15px}.xm-select-linkage-group{position:absolute;left:0;top:0;right:0;bottom:0;overflow-x:hidden;overflow-y:auto}.xm-select-linkage-group li:hover{border-left:1px solid #009688}.xm-select-linkage-group li:hover span{padding-left:19px}.xm-select-linkage-group li.xm-select-this:hover span{padding-left:15px;border-left-width:4px}.xm-select-linkage-group:nth-child(4n+1){background-color:#EFEFEF;left:0}.xm-select-linkage-group:nth-child(4n+1) li.xm-select-active{background-color:#F5F5F5}.xm-select-linkage-group:nth-child(4n+2){background-color:#F5F5F5;left:100px}.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color:#FAFAFA}.xm-select-linkage-group:nth-child(4n+3){background-color:#FAFAFA;left:200px}.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color:#FFF}.xm-select-linkage-group:nth-child(4n+4){background-color:#FFF;left:300px}.xm-select-linkage-group:nth-child(4n+4) li.xm-select-active{background-color:#EFEFEF}.xm-select-linkage li{list-style:none}.xm-select-linkage-hide{display:none}.xm-select-linkage-show{display:block}div[xm-select-skin=default] .xm-select-linkage li.xm-select-this span{border-left-color:#5FB878;color:#5FB878}div[xm-select-skin=default] .xm-select-linkage-group li:hover{border-left-color:#5FB878}div[xm-select-skin=primary] .xm-select-linkage li.xm-select-this span{border-left-color:#1E9FFF;color:#1E9FFF}div[xm-select-skin=primary] .xm-select-linkage-group li:hover{border-left-color:#1E9FFF}div[xm-select-skin=normal] .xm-select-linkage li.xm-select-this span{border-left-color:#1E9FFF;color:#1E9FFF}div[xm-select-skin=normal] .xm-select-linkage-group li:hover{border-left-color:#1E9FFF}div[xm-select-skin=warm] .xm-select-linkage li.xm-select-this span{border-left-color:#FFB800;color:#FFB800}div[xm-select-skin=warm] .xm-select-linkage-group li:hover{border-left-color:#FFB800}div[xm-select-skin=danger] .xm-select-linkage li.xm-select-this span{border-left-color:#FF5722;color:#FF5722}div[xm-select-skin=danger] .xm-select-linkage-group li:hover{border-left-color:#FF5722}.xm-form-checkbox[lay-skin=primary] i{top:9px}.xm-form-checkbox[lay-skin=primary] span{line-height:36px}.xm-select-tips[style]:hover{background-color:#FFF!important}.xm-select-parent dd>.xm-cz{position:absolute;top:5px;right:10px}.xm-select-parent dd>.xm-cz-group{margin-right:30px;border-right:2px solid #ddd;height:16px;margin-top:10px;line-height:16px;overflow:hidden}.xm-select-parent dd>.xm-cz-group .xm-cz{display:inline-block;margin-right:30px}.xm-select-parent dd>.xm-cz-group .xm-cz i{margin-right:10px}.xm-select-parent dd>.xm-cz-group[show=name] .xm-cz i{display:none}.xm-select-parent dd>.xm-cz-group[show=icon] .xm-cz span{display:none}.xm-select-parent dd .xm-cz:hover{color:#009688}div[xm-select-skin=default] dd .xm-cz:hover{color:#C0C4CC}div[xm-select-skin=primary] dd .xm-cz:hover{color:#009688}div[xm-select-skin=normal] dd .xm-cz:hover{color:#1E9FFF}div[xm-select-skin=warm] dd .xm-cz:hover{color:#FFB800}div[xm-select-skin=danger] dd .xm-cz:hover{color:#FF5722}' + '</style>' + '<link rel="stylesheet" type="text/css" href="//at.alicdn.com/t/font_711182_8sv6blqzaw2.css"/>');
+ $('head link:last')[0] && $('head link:last').after(cssStyle) || $('head').append(cssStyle);
+ };
+
+ Common.prototype.listening = function () {
+ //TODO 用于监听dom结构变化, 如果出现新的为渲染select, 则自动进行渲染
+ var flag = false;
+ var index = 0;
+ $(document).on('DOMNodeInserted', function (e) {
+ if (flag) {
+ //避免递归渲染
+ return;
+ }
+ flag = true;
+ //渲染select
+ $('select[' + NAME + ']').each(function (index, select) {
+ var sid = select.getAttribute(NAME);
+ common.init(select);
+ common.one($('dl[xid="' + sid + '"]').parents('.' + PNAME));
+ common.initVal(sid);
+ });
+
+ flag = false;
+ });
+ };
+
+ var Select4 = function Select4() {
+ this.v = v;
+ };
+ var common = new Common();
+
+ Select4.prototype.value = function (id, type, isAppend) {
+ if (typeof id != 'string') {
+ return [];
+ }
+ var fs = data[id];
+ if (!fs) {
+ return [];
+ }
+ if (typeof type == 'string' || type == undefined) {
+ var arr = fs.values.concat([]) || [];
+ if (type == 'val') {
+ return arr.map(function (val) {
+ return val.val;
+ });
+ }
+ if (type == 'valStr') {
+ return arr.map(function (val) {
+ return val.val;
+ }).join(',');
+ }
+ if (type == 'name') {
+ return arr.map(function (val) {
+ return val.name;
+ });
+ }
+ if (type == 'nameStr') {
+ return arr.map(function (val) {
+ return val.name;
+ }).join(',');
+ }
+ return arr;
+ }
+ if (common.isArray(type)) {
+ var dl = $('[xid="' + id + '"]'),
+ temp = {},
+ dd = void 0,
+ isAdd = true;
+ if (isAppend == false) {
+ //删除传入的数组
+ isAdd = false;
+ } else if (isAppend == true) {
+ //追加模式
+ isAdd = true;
+ } else {
+ //删除原有的数据
+ common.removeAll(id);
+ }
+ if (isAdd) {
+ fs.values.forEach(function (val, index) {
+ temp[val.val] = 1;
+ });
+ }
+ type.forEach(function (val, index) {
+ if (val && (!temp[val] || fs.config.repeat)) {
+ if ((dd = dl.find('dd[lay-value="' + val + '"]'))[0]) {
+ common.handlerLabel(id, dd, isAdd, null, true);
+ temp[val] = 1;
+ } else {
+ var name = common.valToName(id, val);
+ if (name) {
+ common.handlerLabel(id, dd, isAdd, {
+ name: name,
+ val: val
+ }, true);
+ temp[val] = 1;
+ }
+ }
+ }
+ });
+ }
+ };
+
+ Common.prototype.bindEvent = function (name, id, fun) {
+ if (id && id instanceof Function) {
+ fun = id;
+ id = null;
+ }
+ if (fun && fun instanceof Function) {
+ if (!id) {
+ $.each(data, function (id, val) {
+ data[id] ? data[id].config[name] = fun : events[name][id] = fun;
+ });
+ } else {
+ data[id] ? data[id].config[name] = fun : events[name][id] = fun;
+ }
+ }
+ };
+
+ Select4.prototype.on = function (id, fun) {
+ common.bindEvent('on', id, fun);
+ return this;
+ };
+
+ Select4.prototype.filter = function (id, fun) {
+ common.bindEvent('filter', id, fun);
+ return this;
+ };
+
+ Select4.prototype.maxTips = function (id, fun) {
+ common.bindEvent('maxTips', id, fun);
+ return this;
+ };
+
+ Select4.prototype.config = function (id, config, isJson) {
+ if (id && (typeof id === 'undefined' ? 'undefined' : _typeof(id)) == 'object') {
+ isJson = config == true;
+ config = id;
+ id = null;
+ }
+ if (config && (typeof config === 'undefined' ? 'undefined' : _typeof(config)) == 'object') {
+ if (isJson) {
+ config.header || (config.header = {});
+ config.header['Content-Type'] = 'application/json; charset=UTF-8';
+ config.dataType = 'json';
+ }
+ id ? (ajaxs[id] = $.extend(true, {}, ajax, config), data[id] && (data[id].config.direction = config.direction), config.searchUrl && data[id] && common.triggerSearch($('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT), true)) : $.extend(true, ajax, config);
+ }
+ return this;
+ };
+
+ Select4.prototype.render = function (id) {
+ var _this14 = this;
+
+ var target = {};
+ id ? data[id] && (target[id] = data[id]) : data;
+
+ if (Object.getOwnPropertyNames(target).length) {
+ $.each(target, function (key, val) {
+ //恢复初始值
+ var dl = $('dl[xid="' + key + '"]'),
+ vals = [];
+ val.select.find('option[selected]').each(function (index, item) {
+ vals.push(item.value);
+ });
+ //移除创建元素
+ dl.find('.' + CREATE_LONG).remove();
+ //清空INPUT
+ dl.prev().find('.' + INPUT).val('');
+ //触发search
+ common.triggerSearch(dl.parents('.' + FORM_SELECT), true);
+ //移除hidn
+ dl.find('.layui-hide').removeClass('layui-hide');
+ //重新赋值
+ _this14.value(key, vals);
+ });
+ }
+ ($('select[' + NAME + '="' + id + '"]')[0] ? $('select[' + NAME + '="' + id + '"]') : $('select[' + NAME + ']')).each(function (index, select) {
+ var sid = select.getAttribute(NAME);
+ common.init(select);
+ common.one($('dl[xid="' + sid + '"]').parents('.' + PNAME));
+ common.initVal(sid);
+ });
+ return this;
+ };
+
+ Select4.prototype.disabled = function (id) {
+ var target = {};
+ id ? data[id] && (target[id] = data[id]) : target = data;
+
+ $.each(target, function (key, val) {
+ $('dl[xid="' + key + '"]').prev().addClass(DIS);
+ });
+ return this;
+ };
+
+ Select4.prototype.undisabled = function (id) {
+ var target = {};
+ id ? data[id] && (target[id] = data[id]) : target = data;
+
+ $.each(target, function (key, val) {
+ $('dl[xid="' + key + '"]').prev().removeClass(DIS);
+ });
+ return this;
+ };
+
+ Select4.prototype.data = function (id, type, config) {
+ if (!id || !type || !config) {
+ return this;
+ }
+ //检测该id是否尚未渲染
+ !data[id] && this.render(id).value(id, []);
+ this.config(id, config);
+ if (type == 'local') {
+ common.renderData(id, config.arr, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100');
+ } else if (type == 'server') {
+ common.ajax(id, config.url, config.keyword, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100');
+ }
+ return this;
+ };
+
+ Select4.prototype.btns = function (id, btns, config) {
+ if (!btns || !common.isArray(btns)) {
+ return this;
+ };
+ var target = {};
+ id ? data[id] && (target[id] = data[id]) : target = data;
+
+ btns = btns.map(function (obj) {
+ if (typeof obj == 'string') {
+ if (obj == 'select') {
+ return quickBtns[0];
+ }
+ if (obj == 'remove') {
+ return quickBtns[1];
+ }
+ if (obj == 'reverse') {
+ return quickBtns[2];
+ }
+ if (obj == 'skin') {
+ return quickBtns[3];
+ }
+ }
+ return obj;
+ });
+
+ $.each(target, function (key, val) {
+ val.config.btns = btns;
+ var dd = $('dl[xid="' + key + '"]').find('.' + FORM_SELECT_TIPS + ':first');
+ if (btns.length) {
+ var show = config && config.show && (config.show == 'name' || config.show == 'icon') ? config.show : '';
+ var html = common.renderBtns(key, show, config && config.space ? config.space : '30px');
+ dd.html(html);
+ } else {
+ var pcInput = dd.parents('.' + FORM_SELECT).find('.' + TDIV + ' input');
+ var _html = pcInput.attr('placeholder') || pcInput.attr('back');
+ dd.html(_html);
+ dd.removeAttr('style');
+ }
+ });
+
+ return this;
+ };
+
+ Select4.prototype.search = function (id, val) {
+ if (id && data[id]) {
+ ajaxs[id] = $.extend(true, {}, ajax, {
+ first: true,
+ searchVal: val
+ });
+ common.triggerSearch($('dl[xid="' + id + '"]').parents('.' + FORM_SELECT), true);
+ }
+ return this;
+ };
+
+ return new Select4();
+});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/custom/module/formSelects/formSelects-v4.css b/payapi/src/main/resources/static/custom/module/formSelects/formSelects-v4.css
new file mode 100755
index 0000000..626a4d5
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/formSelects/formSelects-v4.css
@@ -0,0 +1,156 @@
+/* formSelects多选css */
+.xm-select-parent * {margin: 0;padding: 0;font-family: "Helvetica Neue", Helvetica, "PingFang SC", 微软雅黑, Tahoma, Arial, sans-serif;}
+.xm-select-parent {text-align: left;}
+.xm-select-parent select {display: none;}
+.xm-select-parent .xm-select-title {position: relative;min-height: 36px;}
+.xm-select-parent .xm-input {cursor: pointer;border-radius: 2px;border-width: 1px;border-style: solid;border-color: #E6E6E6;display: block;width: 100%;box-sizing: border-box;background-color: #FFF;height: 36px;line-height: 1.3;padding-left: 10px;outline: 0}
+.xm-select-parent .xm-select-sj {display: inline-block;width: 0;height: 0;border-style: dashed;border-color: transparent;overflow: hidden;position: absolute;right: 10px;top: 50%;margin-top: -3px;cursor: pointer;border-width: 6px;border-top-color: #C2C2C2;border-top-style: solid;transition: all .3s;-webkit-transition: all .3s}
+.xm-select-parent .xm-form-selected .xm-select-sj {margin-top: -9px;transform: rotate(180deg)}
+.xm-select-parent .xm-form-select dl {display: none;position: absolute;left: 0;top: 42px;padding: 5px 0;z-index: 999;min-width: 100%;border: 1px solid #d2d2d2;max-height: 300px;overflow-y: auto;background-color: #fff;border-radius: 2px;box-shadow: 0 2px 4px rgba(0, 0, 0, .12);box-sizing: border-box;animation-fill-mode: both;-webkit-animation-name: layui-upbit;animation-name: layui-upbit;-webkit-animation-duration: .3s;animation-duration: .3s;-webkit-animation-fill-mode: both;animation-fill-mode: both}
+@-webkit-keyframes layui-upbit {
+ from {-webkit-transform: translate3d(0, 30px, 0);opacity: .3}
+ to {-webkit-transform: translate3d(0, 0, 0);opacity: 1}
+}
+@keyframes layui-upbit {
+ from {transform: translate3d(0, 30px, 0);opacity: .3}
+ to {transform: translate3d(0, 0, 0);opacity: 1}
+}
+.xm-select-parent .xm-form-selected dl {display: block}
+.xm-select-parent .xm-form-select dl dd,.xm-select-parent .xm-form-select dl dt {padding: 0 10px;line-height: 36px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis}
+.xm-select-parent .xm-form-select dl dd {cursor: pointer;height: 36px;}
+.xm-select-parent .xm-form-select dl dd:hover {background-color: #f2f2f2}
+.xm-select-parent .xm-form-select dl dt {font-size: 12px;color: #999}
+.layui-select-disabled .xm-dis-disabled {border-color: #eee!important}
+.xm-select-parent .xm-form-select dl .xm-select-tips {padding-left: 10px!important;color: #999;font-size: 14px}
+.xm-unselect {-moz-user-select: none;-webkit-user-select: none;-ms-user-select: none}
+.xm-form-checkbox {position: relative;display: inline-block;vertical-align: middle;height: 30px;line-height: 30px;margin-right: 10px;padding-right: 30px;background-color: #fff;cursor: pointer;font-size: 0;-webkit-transition: .1s linear;transition: .1s linear;box-sizing: border-box}
+.xm-form-checkbox * {display: inline-block;vertical-align: middle}
+.xm-form-checkbox span {padding: 0 10px;height: 100%;font-size: 14px;border-radius: 2px 0 0 2px;background-color: #d2d2d2;color: #fff;overflow: hidden;white-space: nowrap;text-overflow: ellipsis}
+.xm-form-checkbox:hover span {background-color: #c2c2c2}
+.xm-form-checkbox i {position: absolute;right: 0;top: 0;width: 30px;height: 28px;border: 1px solid #d2d2d2;border-left: none;border-radius: 0 2px 2px 0;color: #fff;font-size: 20px;text-align: center}
+.xm-form-checkbox:hover i {border-color: #c2c2c2;color: #c2c2c2}
+.xm-form-checkbox[lay-skin=primary] {height: auto!important;line-height: normal!important;border: none!important;margin-right: 0;padding-right: 0;background: 0 0}
+.xm-form-checkbox[lay-skin=primary] span {float: right;padding-right: 15px;line-height: 18px;background: 0 0;color: #666}
+.xm-form-checkbox[lay-skin=primary] i {position: relative;top: 0;width: 16px;height: 16px;line-height: 16px;border: 1px solid #d2d2d2;font-size: 12px;border-radius: 2px;background-color: #fff;-webkit-transition: .1s linear;transition: .1s linear}
+.xm-form-checkbox[lay-skin=primary]:hover i {border-color: #5FB878;color: #fff}
+.xm-icon-yes {width: 30px;height: 30px;border-radius: 4px;background-color: #009688;position: relative}
+.xm-icon-yes:after {content: '';display: inline-block;border: 2px solid #fff;border-top-width: 0;border-right-width: 0;width: 9px;height: 5px;-webkit-transform: rotate(-50deg);transform: rotate(-50deg);position: absolute;top: 2px;left: 3px}
+.xm-dis-disabled,.xm-dis-disabled:hover {color: #d2d2d2!important;cursor: not-allowed!important}
+.xm-form-select dl dd.xm-dis-disabled {background-color: #fff!important}
+.xm-form-select dl dd.xm-dis-disabled span {color: #C2C2C2}
+.xm-form-select dl dd.xm-dis-disabled .xm-icon-yes {border-color: #C2C2C2}
+.xm-select-parent {position: relative;-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none}
+.xm-select-parent .xm-select {line-height: normal;height: auto;padding: 4px 10px 1px 10px;overflow: hidden;min-height: 36px;left: 0;z-index: 99;position: absolute;background: 0 0;padding-right: 20px}
+.xm-select-parent .xm-select:hover {border-color: #C0C4CC}
+.xm-select-parent .xm-select .xm-select-label {display: inline-block;margin: 0;vertical-align: middle}
+.xm-select-parent .xm-select-title div.xm-select-label>span {position: relative;padding: 2px 5px;background-color: #009688;border-radius: 2px;color: #FFF;display: inline-block;line-height: 18px;height: 18px;margin: 2px 5px 2px 0;cursor: initial;user-select: none;font-size: 14px;padding-right: 25px;}
+.xm-select-parent .xm-select-title div.xm-select-label>span i {position: absolute;right: 5px;top: 2px;margin-left: 8px;border-radius: 20px;font-size: 18px;cursor: pointer;display: inline-block;height: 14px;line-height: 15px;width: 12px;vertical-align: top;margin-top: 2px;}
+.xm-select-parent .xm-select .xm-select-input {border: none;height: 28px;background-color: transparent;padding: 0;vertical-align: middle;display: inline-block;width: 50px}
+.xm-select-parent .xm-select--suffix input {border: none}
+.xm-select-parent dl dd.xm-dis-disabled.xm-select-this i {border-color: #C2C2C2;background-color: #C2C2C2;color: #FFF}
+.xm-select-parent dl dd.xm-select-this i {background-color: #009688;border-color: #009688}
+.xm-form-selected .xm-select,.xm-form-selected .xm-select:hover {border-color: #009688!important}
+.xm-select--suffix+div {position: absolute;top: 0;left: 0;bottom: 0;right: 0}
+.xm-select-dis .xm-select--suffix+div {z-index: 100;cursor: no-drop!important;opacity: .2;background-color: #FFF;}
+.xm-select-disabled,.xm-select-disabled:hover {color: #d2d2d2!important;cursor: not-allowed!important;background-color: #fff}
+.xm-select-none {display: none;margin: 5px 0;text-align: center;}
+.xm-select-none:hover {background-color: #FFF!important}
+.xm-select-empty {display: block}
+.xm-span-hide {display: none!important;}
+.xm-select-radio .xm-icon-yes {border-radius: 20px!important;}
+.xm-select-radio .xm-icon-yes:after {border-radius: 20px;background-color: #fff;width: 6px;height: 6px;border: none;top: 5px;left: 5px;}
+.layui-form-pane .xm-select,.layui-form-pane .xm-select:hover {border: none!important;top: 0px}
+.layui-form-pane .xm-select-title {border: 1px solid #e6e6e6!important}
+
+
+/* 颜色相关 */
+div[xm-select-skin] .xm-select-title div.xm-select-label>span {border: 1px solid #009688}
+div[xm-select-skin] .xm-select-title div.xm-select-label>span i:hover {opacity: .8;filter: alpha(opacity=80);cursor: pointer}
+div[xm-select-skin=default] .xm-select-title div.xm-select-label>span {background-color: #F0F2F5;color: #909399;border: 1px solid #F0F2F5}
+div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i {background-color: #C0C4CC;color: #FFF}
+div[xm-select-skin=default] dl dd.xm-select-this:not(.xm-dis-disabled) i {background-color: #5FB878;border-color: #5FB878;color: #FFF}
+div[xm-select-skin=default].xm-form-selected .xm-select,div[xm-select-skin=default].xm-form-selected .xm-select:hover {border-color: #C0C4CC!important}
+div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span {background-color: #009688;color: #FFF;border: 1px solid #009688}
+div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i {background-color: #009688;color: #FFF}
+div[xm-select-skin=primary] dl dd.xm-select-this:not(.xm-dis-disabled) i {background-color: #009688;border-color: #009688;color: #FFF}
+div[xm-select-skin=primary].xm-form-selected .xm-select,div[xm-select-skin=primary].xm-form-selected .xm-select:hover {border-color: #009688!important}
+div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span {background-color: #1E9FFF;color: #FFF;border: 1px solid #1E9FFF}
+div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span i {background-color: #1E9FFF;color: #FFF}
+div[xm-select-skin=normal] dl dd.xm-select-this:not(.xm-dis-disabled) i {background-color: #1E9FFF;border-color: #1E9FFF;color: #FFF}
+div[xm-select-skin=normal].xm-form-selected .xm-select,div[xm-select-skin=normal].xm-form-selected .xm-select:hover {border-color: #1E9FFF!important}
+div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span {background-color: #FFB800;color: #FFF;border: 1px solid #FFB800}
+div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span i {background-color: #FFB800;color: #FFF}
+div[xm-select-skin=warm] dl dd.xm-select-this:not(.xm-dis-disabled) i {background-color: #FFB800;border-color: #FFB800;color: #FFF}
+div[xm-select-skin=warm].xm-form-selected .xm-select,div[xm-select-skin=warm].xm-form-selected .xm-select:hover {border-color: #FFB800!important}
+div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span {background-color: #FF5722;color: #FFF;border: 1px solid #FF5722}
+div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span i {background-color: #FF5722;color: #FFF}
+div[xm-select-skin=danger] dl dd.xm-select-this:not(.xm-dis-disabled) i {background-color: #FF5722;border-color: #FF5722;color: #FFF}
+div[xm-select-skin=danger].xm-form-selected .xm-select,div[xm-select-skin=danger].xm-form-selected .xm-select:hover {border-color: #FF5722!important}
+
+
+/* 多选联动 */
+.xm-select-parent .layui-form-danger+.xm-select-title .xm-select {border-color: #FF5722 !important;}
+.xm-select-linkage li {padding: 10px 0px;cursor: pointer;}
+.xm-select-linkage li span {padding-left: 20px;padding-right: 30px;display: inline-block;height: 20px;overflow: hidden;text-overflow: ellipsis;}
+.xm-select-linkage li.xm-select-this span {border-left: 5px solid #009688;color: #009688;padding-left: 15px;}
+.xm-select-linkage-group {position: absolute;left: 0;top: 0;right: 0;bottom: 0;overflow-x: hidden;overflow-y: auto;}
+.xm-select-linkage-group li:hover {border-left: 1px solid #009688;}
+.xm-select-linkage-group li:hover span {padding-left: 19px;}
+.xm-select-linkage-group li.xm-select-this:hover span {padding-left: 15px;border-left-width: 4px;}
+.xm-select-linkage-group:nth-child(4n+1){background-color: #EFEFEF; left: 0;}
+.xm-select-linkage-group:nth-child(4n+1) li.xm-select-active{background-color: #F5F5F5;}
+.xm-select-linkage-group:nth-child(4n+2){background-color: #F5F5F5; left: 100px;}
+.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color: #FAFAFA;}
+.xm-select-linkage-group:nth-child(4n+3){background-color: #FAFAFA; left: 200px;}
+.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color: #FFFFFF;}
+.xm-select-linkage-group:nth-child(4n+4){background-color: #FFFFFF; left: 300px;}
+.xm-select-linkage-group:nth-child(4n+4) li.xm-select-active{background-color: #EFEFEF;}
+.xm-select-linkage li{list-style: none;}
+.xm-select-linkage-hide {display: none;}
+.xm-select-linkage-show {display: block;}
+
+div[xm-select-skin='default'] .xm-select-linkage li.xm-select-this span {border-left-color: #5FB878;color: #5FB878;}
+div[xm-select-skin='default'] .xm-select-linkage-group li:hover {border-left-color: #5FB878;}
+div[xm-select-skin='primary'] .xm-select-linkage li.xm-select-this span {border-left-color: #1E9FFF;color: #1E9FFF;}
+div[xm-select-skin='primary'] .xm-select-linkage-group li:hover {border-left-color: #1E9FFF;}
+div[xm-select-skin='normal'] .xm-select-linkage li.xm-select-this span {border-left-color: #1E9FFF;color: #1E9FFF;}
+div[xm-select-skin='normal'] .xm-select-linkage-group li:hover {border-left-color: #1E9FFF;}
+div[xm-select-skin='warm'] .xm-select-linkage li.xm-select-this span {border-left-color: #FFB800;color: #FFB800;}
+div[xm-select-skin='warm'] .xm-select-linkage-group li:hover {border-left-color: #FFB800;}
+div[xm-select-skin='danger'] .xm-select-linkage li.xm-select-this span {border-left-color: #FF5722;color: #FF5722;}
+div[xm-select-skin='danger'] .xm-select-linkage-group li:hover {border-left-color: #FF5722;}
+.xm-form-checkbox[lay-skin=primary] i {top: 9px}
+.xm-form-checkbox[lay-skin=primary] span {line-height: 36px;}
+
+
+/* 快捷操作 */
+.xm-select-tips[style]:hover{background-color: #FFF!important;}
+.xm-select-parent dd > .xm-cz{position: absolute; top: 5px; right: 10px;}
+.xm-select-parent dd > .xm-cz-group{margin-right: 30px; border-right: 2px solid #ddd; height: 16px; margin-top: 10px; line-height: 16px; overflow: hidden;}
+.xm-select-parent dd > .xm-cz-group .xm-cz{display: inline-block; margin-right: 30px;}
+.xm-select-parent dd > .xm-cz-group .xm-cz i{margin-right: 10px;}
+.xm-select-parent dd > .xm-cz-group[show='name'] .xm-cz i{display: none;}
+.xm-select-parent dd > .xm-cz-group[show='icon'] .xm-cz span{display: none;}
+.xm-select-parent dd .xm-cz:hover{color: #009688;}
+div[xm-select-skin='default'] dd .xm-cz:hover{color: #C0C4CC;}
+div[xm-select-skin='primary'] dd .xm-cz:hover{color: #009688;}
+div[xm-select-skin='normal'] dd .xm-cz:hover{color: #1E9FFF;}
+div[xm-select-skin='warm'] dd .xm-cz:hover{color: #FFB800;}
+div[xm-select-skin='danger'] dd .xm-cz:hover{color: #FF5722;}
+
+
+
+/* 阿里巴巴矢量图标库 */
+@font-face {
+ font-family: "iconfont";
+ src: url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAkUAAsAAAAADXQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZXMkouY21hcAAAAYAAAACEAAAB3mzwoL5nbHlmAAACBAAABNwAAAbEQLmyxWhlYWQAAAbgAAAAMQAAADYR3AzwaGhlYQAABxQAAAAgAAAAJAgBA6pobXR4AAAHNAAAABsAAAAcHA3//mxvY2EAAAdQAAAAEAAAABAFDAZgbWF4cAAAB2AAAAAfAAAAIAEXAM9uYW1lAAAHgAAAAUUAAAJtPlT+fXBvc3QAAAjIAAAASwAAAF/pDVOXeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWKcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGBwYKl6YMzf8b2CIYW5mOAIUZgTJAQDaoQv3eJzFkcsJwzAQRN9GsgkhBBeiu2+uIoeU4BJ8zCmlLu7C2Y/BJA14xBPMIGnFLtABxWhGBfkguN6WSuSFW+SVp/kHVy70LDpo00nnddw2y//9IbE7x3Jf4oUu6vWcJjmv9K/usb925x1ZduyLOiQ+JW2J9Q+dEj+vc+LTXMeE+gUlrx+seJyNVE2IHEUUrlfVVdV/0z3939u70zs9vTudsMmumdndcaNu1h/wBw+RRJNcAlGDEdSDBwMacUGUCB4EDzEoKKIYUfDgwUuEmN1IvAgevIiEFQVzUC/iQXB7fdW7Sm461Lx6/V71V/V9/eoRTsjWD+wiS0lAdpF95C5ykBAQM9BzaAeKan6WzkBU8CgJHVaVVSHL3iy7DZKeCOPB4nw/EVK44EAOw2KwWM3SChbml+ktMIg7AGPj2SF/esJnr4GZVvlL9X30XYgmywl3eW99754D4aAb6Kdt3x/z/Vd1wblOqeY68GQSG9wwRf0ed7Po4uRuOgn2WJXdf6zVHfdPnJ1/qjOdGACrqxCMd50PDniZh+NMFgf+mGy39DRrlVMhnP7JSgO70/+R4E8g11s1wiaIRRJSkgVyNzmGbAvFoywUIygcCOOkWIb5Pmv8YZMFWfUxPwnxKD4AGOix/xGB7+FPP039WvpJQq1m8m8Ibfubt587amSBecput+0LRjBm/sczPZ5OpTjq7yAtU1CmfhkSFUvYQ+eOmPjKKZsx+wNzLKiff+OowjhlUWpdQJz6zLkjGDAet3ZWEFUDL2jAXiRtEpJpsoi6EEAyLjR0BopNJatRMo0iRd62QCNvFioPNYq8HBJUSQXK6dIB6W0XQ7OC/XolGsWXw3AtHkXrQfDH+vra5vv1RqcsO9DtlABlRz1BP4cw3w2wO4frG3kPYDaHqFMA9HL64ZUwVDBrYbgej8Lf19bWrnY79TW1rJcjTAGbG/hm/Uvehwa3R3dwd3ZR319Dnp+zNXYHibHS7ySHkKUi+S/THEaLDddRWeHRi20qyTBSBHcYc6+chQVvfnFU5DCp6gWLXxZKi2XFOk5YJFP9y2NoWrr+jPR1S2xIuXQQYP/M5tbMfjU/gH8K2/7m+YWsLDP4KkMx6tdn9tNXoJvWM2kXcIZv1fyJrl85qiNggohUo/KansqfD+9ZAljaU8PMEuz4sIX+yfo89DK4mil5siVY2vxtB+zrtChSpQXbqrc+0qbYIfIo+YJcJoTjBegr1v2Rh1e6X/XnaH8OMDALo+VGmGU4QBcT1CJWUik7aDKYw/hwoCLxdnISorhpCwrJkzg7MM2xJBZHC94IMRqsaqHZYQ76FV5Al+K+aqlQgSY8B6XsIc5OQuGrQXOqzpN4oTpGMqTfdOvzbt7SfS5AiHbVNuUgMg1bOpwJymNb558Jzx7r9yLhc8cAzdX9LBRGOuFQTdhB28h6U25gv2OYlsmly4E64jGzE3njJlDXdKv6OXjayHTOinHTDVydPWJQzZBmaL6NG7Vv1i2qcSvYNRE6wWRqZwaVwl5xpal/LLiUlk0BqGY6up4MueHwlh1NMcGEOXVY03nQimJ4gjEhLF3eFOuGLdqWiO1kwpT8U+FyQYFRQ7Ntyk1NapRyy2LYIW0OoNutt0zdMoX0HCHjXJy0U+Qt6md5K8HqGwLlmnEcHo4z09Acg52wUE88u2+9aQrAgwmE0tttrlHgJvdsaggNpH5BndxwDcq4bmAxJ/uE0Khw4qi+R0pJGTS9YxV76gp6FvGavkqC0iuiAoaNRX+h8dEmMpGqkWArWV2BlS18b6W+BOSvSzc+1df3nj37z6AEVjCFZvNSjcsIGvrgDQvI3936DLp4nGNgZGBgAGLtNU3b4/ltvjJwszCAwHXflFkw+v+//zYsKszNQC4HAxNIFABGAgv1AAAAeJxjYGRgYG7438AQw6L8/9///ywqDEARFMAOAKazBrJ4nGNhYGBgfsnAwAKkWRihtPL/fyAaACKnAyYAAAAAAAB2AQIBdgH8AyADYnicY2BkYGBgZzjMwMYAAkxAzAWEDAz/wXwGABycAecAeJxlj01OwzAQhV/6B6QSqqhgh+QFYgEo/RGrblhUavdddN+mTpsqiSPHrdQDcB6OwAk4AtyAO/BIJ5s2lsffvHljTwDc4Acejt8t95E9XDI7cg0XuBeuU38QbpBfhJto41W4Rf1N2MczpsJtdGF5g9e4YvaEd2EPHXwI13CNT+E69S/hBvlbuIk7/Aq30PHqwj7mXle4jUcv9sdWL5xeqeVBxaHJIpM5v4KZXu+Sha3S6pxrW8QmU4OgX0lTnWlb3VPs10PnIhVZk6oJqzpJjMqt2erQBRvn8lGvF4kehCblWGP+tsYCjnEFhSUOjDFCGGSIyujoO1Vm9K+xQ8Jee1Y9zed0WxTU/3OFAQL0z1xTurLSeTpPgT1fG1J1dCtuy56UNJFezUkSskJe1rZUQuoBNmVXjhF6XNGJPyhnSP8ACVpuyAAAAHicbcNRCoAgEAXAfWYqdRYPtWXJEqwJSR6/oN8Ghgx9JvrnYTDAYoSDRyD0UBtrf7uVJbHO9yaLcLkkRnvK3kIVzUfRTPQAg/cP1gA=') format('woff');
+}
+.iconfont {font-family:"iconfont" !important; font-size:16px; font-style:normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;}
+.icon-quanxuan:before { content: "\e62c"; }
+.icon-caidan:before { content: "\e610"; }
+.icon-fanxuan:before { content: "\e837"; }
+.icon-pifu:before { content: "\e668"; }
+.icon-qingkong:before { content: "\e63e"; }
+
+
+
diff --git a/payapi/src/main/resources/static/custom/module/formSelects/formSelects-v4.js b/payapi/src/main/resources/static/custom/module/formSelects/formSelects-v4.js
new file mode 100755
index 0000000..f613eec
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/formSelects/formSelects-v4.js
@@ -0,0 +1,1412 @@
+'use strict';
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+/**
+ * name: formSelects
+ * 基于Layui Select多选
+ * version: 4.0.0.formSelects
+ * http://sun.faysunshine.com/layui/formSelects-v4/dist/formSelects-v4.js
+ */
+(function (layui, window, factory) {
+ if ((typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object') {
+ // 支持 CommonJS
+ module.exports = factory();
+ } else if (typeof define === 'function' && define.amd) {
+ // 支持 AMD
+ define(factory);
+ } else if (window.layui && layui.define) {
+ //layui加载
+ layui.define(['jquery'], function (exports) {
+ exports('formSelects', factory());
+ });
+ } else {
+ window.formSelects = factory();
+ }
+})(typeof layui == 'undefined' ? null : layui, window, function () {
+ var v = '4.0.0.formSelects',
+ NAME = 'xm-select',
+ PNAME = 'xm-select-parent',
+ INPUT = 'xm-select-input',
+ TDIV = 'xm-select--suffix',
+ THIS = 'xm-select-this',
+ LABEL = 'xm-select-label',
+ SEARCH = 'xm-select-search',
+ CREATE = 'xm-select-create',
+ CREATE_LONG = 'xm-select-create-long',
+ MAX = 'xm-select-max',
+ SKIN = 'xm-select-skin',
+ DIRECTION = "xm-select-direction",
+ HEIGHT = 'xm-select-height',
+ DISABLED = 'xm-dis-disabled',
+ DIS = 'xm-select-dis',
+ TEMP = 'xm-select-temp',
+ RADIO = 'xm-select-radio',
+ LINKAGE = 'xm-select-linkage',
+ DL = 'xm-select-dl',
+ HIDE_INPUT = 'xm-hide-input',
+ SANJIAO = 'xm-select-sj',
+ ICON_CLOSE = 'xm-icon-close',
+ FORM_TITLE = 'xm-select-title',
+ FORM_SELECT = 'xm-form-select',
+ FORM_SELECTED = 'xm-form-selected',
+ FORM_NONE = 'xm-select-none',
+ FORM_EMPTY = 'xm-select-empty',
+ FORM_INPUT = 'xm-input',
+ FORM_SELECT_TIPS = 'xm-select-tips',
+ CHECKBOX_YES = 'xm-icon-yes',
+ CZ = 'xm-cz',
+ CZ_GROUP = 'xm-cz-group',
+ TIPS = '请选择',
+ data = {},
+ events = {
+ on: {},
+ filter: {},
+ maxTips: {}
+ },
+ ajax = {
+ type: 'get',
+ header: {},
+ first: true,
+ data: {},
+ searchUrl: '',
+ searchName: 'keyword',
+ searchVal: null,
+ keyName: 'name',
+ keyVal: 'value',
+ keySel: 'selected',
+ keyDis: 'disabled',
+ keyChildren: 'children',
+ dataType: '',
+ delay: 500,
+ beforeSuccess: null,
+ success: null,
+ error: null,
+ beforeSearch: null,
+ clearInput: false
+ },
+ quickBtns = [{ icon: 'iconfont icon-quanxuan', name: '全选', click: function click(id, cm) {
+ cm.selectAll(id, true, true);
+ } }, { icon: 'iconfont icon-qingkong', name: '清空', click: function click(id, cm) {
+ cm.removeAll(id, true, true);
+ } }, { icon: 'iconfont icon-fanxuan', name: '反选', click: function click(id, cm) {
+ cm.reverse(id, true, true);
+ } }, { icon: 'iconfont icon-pifu', name: '换肤', click: function click(id, cm) {
+ cm.skin(id);
+ } }],
+ $ = window.$ || window.layui && window.layui.jquery,
+ $win = $(window),
+ ajaxs = {},
+ FormSelects = function FormSelects(options) {
+ var _this = this;
+
+ this.config = {
+ name: null, //xm-select="xxx"
+ max: null,
+ maxTips: function maxTips(vals, val, max) {
+ var ipt = $('[xid="' + _this.config.name + '"]').prev().find('.' + NAME);
+ if (ipt.parents('.layui-form-item[pane]').length) {
+ ipt = ipt.parents('.layui-form-item[pane]');
+ }
+ ipt.attr('style', 'border-color: red !important');
+ setTimeout(function () {
+ ipt.removeAttr('style');
+ }, 300);
+ },
+ init: null, //初始化的选择值,
+ on: null, //select值发生变化
+ filter: function filter(id, inputVal, val, isDisabled) {
+ return val.name.indexOf(inputVal) == -1;
+ },
+ clearid: -1,
+ direction: 'auto',
+ height: null,
+ isEmpty: false,
+ btns: [quickBtns[0], quickBtns[1], quickBtns[2]]
+ };
+ this.select = null;
+ this.values = [];
+ $.extend(true, this.config, options);
+ };
+
+ //一些简单的处理方法
+ var Common = function Common() {
+ this.loadingCss();
+ this.appender();
+ this.init();
+ this.on();
+ this.initVal();
+ this.onreset();
+ this.listening();
+ };
+
+ Common.prototype.appender = function () {
+ //针对IE做的一些拓展
+ if (!Array.prototype.map) {
+ Array.prototype.map = function (callback, thisArg) {
+ var T,
+ A,
+ k,
+ O = Object(this),
+ len = O.length >>> 0;
+ if (thisArg) {
+ T = thisArg;
+ }
+ A = new Array(len);
+ k = 0;
+ while (k < len) {
+ var kValue, mappedValue;
+ if (k in O) {
+ kValue = O[k];
+ mappedValue = callback.call(T, kValue, k, O);
+ A[k] = mappedValue;
+ }
+ k++;
+ }
+ return A;
+ };
+ }
+ if (!Array.prototype.forEach) {
+ Array.prototype.forEach = function forEach(callback, thisArg) {
+ var T, k;
+ if (this == null) {
+ throw new TypeError("this is null or not defined");
+ }
+ var O = Object(this);
+ var len = O.length >>> 0;
+ if (typeof callback !== "function") {
+ throw new TypeError(callback + " is not a function");
+ }
+ if (arguments.length > 1) {
+ T = thisArg;
+ }
+ k = 0;
+ while (k < len) {
+ var kValue;
+ if (k in O) {
+
+ kValue = O[k];
+ callback.call(T, kValue, k, O);
+ }
+ k++;
+ }
+ };
+ }
+ };
+
+ Common.prototype.init = function (target) {
+ var _this2 = this;
+
+ //初始化页面上已有的select
+ $(target ? target : 'select[' + NAME + ']').each(function (index, select) {
+ var othis = $(select),
+ id = othis.attr(NAME),
+ hasRender = othis.next('.layui-form-select'),
+ disabled = select.disabled,
+ max = othis.attr(MAX) - 0,
+ isSearch = othis.attr(SEARCH) != undefined,
+ searchUrl = isSearch ? othis.attr(SEARCH) : null,
+ isCreate = othis.attr(CREATE) != undefined,
+ isRadio = othis.attr(RADIO) != undefined,
+ skin = othis.attr(SKIN),
+ direction = othis.attr(DIRECTION),
+ optionsFirst = select.options[0],
+ height = othis.attr(HEIGHT),
+ formname = othis.attr('name'),
+ layverify = othis.attr('lay-verify'),
+ placeholder = optionsFirst ? optionsFirst.value ? TIPS : optionsFirst.innerHTML || TIPS : TIPS,
+ value = othis.find('option[selected]').toArray().map(function (option) {
+ //获取已选中的数据
+ return {
+ name: option.innerHTML,
+ val: option.value
+ };
+ }),
+ fs = new FormSelects();
+ data[id] = fs;
+ //先取消layui对select的渲染
+ hasRender[0] && hasRender.remove();
+
+ //包裹一个div
+ othis.wrap('<div class="' + PNAME + '"></div>');
+
+ //构造渲染div
+ var dinfo = _this2.renderSelect(id, placeholder, select);
+ var heightStyle = height ? 'style="height: ' + height + ';"' : '';
+ var inputHtml = height ? ['<div class="' + LABEL + '" style="margin-right: 50px;"></div>', '<input type="text" fsw class="' + FORM_INPUT + ' ' + INPUT + '" ' + (isSearch ? '' : 'style="display: none;"') + ' autocomplete="off" debounce="0" style="position: absolute;right: 10px;top: 3px;"/>'] : ['<div class="' + LABEL + '">', '<input type="text" fsw class="' + FORM_INPUT + ' ' + INPUT + '" ' + (isSearch ? '' : 'style="display: none;"') + ' autocomplete="off" debounce="0" />', '</div>'];
+ var reElem = $('<div class="' + FORM_SELECT + '" ' + SKIN + '="' + skin + '">\n\t\t\t\t\t<input type="hidden" class="' + HIDE_INPUT + '" value="" name="' + formname + '" lay-verify="' + layverify + '"/>\n\t\t\t\t\t<div class="' + FORM_TITLE + ' ' + (disabled ? DIS : '') + '">\n\t\t\t\t\t\t<div class="' + FORM_INPUT + ' ' + NAME + '" ' + heightStyle + '>\n\t\t\t\t\t\t\t' + inputHtml.join('') + '\n\t\t\t\t\t\t\t<i class="' + SANJIAO + '"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="' + TDIV + '">\n\t\t\t\t\t\t\t<input type="text" autocomplete="off" placeholder="' + placeholder + '" readonly="readonly" unselectable="on" class="' + FORM_INPUT + '">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<dl xid="' + id + '" class="' + DL + ' ' + (isRadio ? RADIO : '') + '">' + dinfo + '</dl>\n\t\t\t\t</div>');
+ othis.after(reElem);
+ fs.select = othis.remove(); //去掉layui.form.render
+ fs.values = value;
+ fs.config.name = id;
+ fs.config.init = value.concat([]);
+ fs.config.direction = direction;
+ fs.config.height = height;
+ fs.config.radio = isRadio;
+
+ if (max) {
+ //有最大值
+ fs.config.max = max;
+ }
+
+ //如果可搜索, 加上事件
+ if (isSearch) {
+ reElem.find('.' + INPUT).on('input propertychange', function (e) {
+ var input = e.target,
+ inputValue = $.trim(input.value),
+ keyCode = e.keyCode;
+ if (keyCode === 9 || keyCode === 13 || keyCode === 37 || keyCode === 38 || keyCode === 39 || keyCode === 40) {
+ return false;
+ }
+
+ //过滤一下tips
+ _this2.changePlaceHolder($(input));
+
+ var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+ searchUrl = ajaxConfig.searchUrl || searchUrl;
+ //如果开启了远程搜索
+ if (searchUrl) {
+ if (ajaxConfig.searchVal) {
+ inputValue = ajaxConfig.searchVal;
+ ajaxConfig.searchVal = '';
+ }
+ if (!ajaxConfig.beforeSearch || ajaxConfig.beforeSearch && ajaxConfig.beforeSearch instanceof Function && ajaxConfig.beforeSearch(id, searchUrl, inputValue)) {
+ var delay = ajaxConfig.delay;
+ if (ajaxConfig.first) {
+ ajaxConfig.first = false;
+ delay = 10;
+ }
+ clearTimeout(fs.clearid);
+ fs.clearid = setTimeout(function () {
+ reElem.find('dl > *:not(.' + FORM_SELECT_TIPS + ')').remove();
+ reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('请求中');
+ _this2.ajax(id, searchUrl, inputValue, false, null, true);
+ }, delay);
+ }
+ } else {
+ reElem.find('dl .layui-hide').removeClass('layui-hide');
+ //遍历选项, 选择可以显示的值
+ reElem.find('dl dd:not(.' + FORM_SELECT_TIPS + ')').each(function (idx, item) {
+ var _item = $(item);
+ var searchFun = data[id].config.filter || events.filter[id];
+ if (searchFun && searchFun(id, inputValue, {
+ name: _item.find('span').text(),
+ val: _item.attr('lay-value')
+ }, _item.hasClass(DISABLED)) == true) {
+ _item.addClass('layui-hide');
+ }
+ });
+ //控制分组名称
+ reElem.find('dl dt').each(function (index, item) {
+ if (!$(item).nextUntil('dt', ':not(.layui-hide)').length) {
+ $(item).addClass('layui-hide');
+ }
+ });
+ //动态创建
+ _this2.create(id, isCreate, inputValue);
+ var shows = reElem.find('dl dd:not(.' + FORM_SELECT_TIPS + '):not(.layui-hide)');
+ if (!shows.length) {
+ reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('无匹配项');
+ } else {
+ reElem.find('dd.' + FORM_NONE).removeClass(FORM_EMPTY);
+ }
+ }
+ });
+ if (searchUrl) {
+ //触发第一次请求事件
+ _this2.triggerSearch(reElem, true);
+ }
+ }
+ });
+ };
+
+ Common.prototype.isArray = function (obj) {
+ return Object.prototype.toString.call(obj) == "[object Array]";
+ };
+
+ Common.prototype.triggerSearch = function (div, isCall) {
+ (div ? [div] : $('.' + FORM_SELECT).toArray()).forEach(function (reElem, index) {
+ reElem = $(reElem);
+ var id = reElem.find('dl').attr('xid');
+ if (id && data[id] && data[id].config.isEmpty || isCall) {
+ var obj_caller = reElem.find('.' + INPUT)[0];
+ if (document.createEventObject) {
+ obj_caller.fireEvent("onchange");
+ } else {
+ var evt = document.createEvent("HTMLEvents");
+ evt.initEvent("input", false, true);
+ obj_caller.dispatchEvent(evt);
+ }
+ }
+ });
+ };
+
+ Common.prototype.ajax = function (id, searchUrl, inputValue, isLinkage, linkageWidth, isSearch) {
+ var _this3 = this;
+
+ var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+ if (!reElem[0] || !searchUrl) {
+ return;
+ }
+
+ var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+ var ajaxData = $.extend(true, {}, ajaxConfig.data);
+ ajaxData[ajaxConfig.searchName] = inputValue;
+ ajaxData['_'] = Date.now();
+ $.ajax({
+ type: ajaxConfig.type,
+ headers: ajaxConfig.header,
+ url: searchUrl,
+ data: ajaxConfig.dataType == 'json' ? JSON.stringify(ajaxData) : ajaxData,
+ success: function success(res) {
+ if (typeof res == 'string') {
+ res = JSON.parse(res);
+ }
+ ajaxConfig.beforeSuccess && ajaxConfig.beforeSuccess instanceof Function && (res = ajaxConfig.beforeSuccess(id, searchUrl, inputValue, res));
+ if (_this3.isArray(res)) {
+ res = {
+ code: 0,
+ msg: "",
+ data: res
+ };
+ }
+ if (res.code != 0) {
+ reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text(res.msg);
+ } else {
+ reElem.find('dd.' + FORM_NONE).removeClass(FORM_EMPTY);
+ //获得已选择的values
+ _this3.renderData(id, res.data, isLinkage, linkageWidth, isSearch);
+ data[id].config.isEmpty = res.data.length == 0;
+ }
+ ajaxConfig.success && ajaxConfig.success instanceof Function && ajaxConfig.success(id, searchUrl, inputValue, res);
+ },
+ error: function error(err) {
+ reElem.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + ')').remove();
+ reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('服务异常');
+ ajaxConfig.error && ajaxConfig.error instanceof Function && ajaxConfig.error(id, searchUrl, inputValue, err);
+ }
+ });
+ };
+
+ Common.prototype.renderData = function (id, dataArr, linkage, linkageWidth, isSearch) {
+ var _this4 = this;
+
+ if (linkage) {
+ var _ret = function () {
+ //渲染多级联动
+ var result = [],
+ index = 0,
+ temp = { "0": dataArr },
+ ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+
+ var _loop = function _loop() {
+ var group = result[index++] = [],
+ _temp = temp;
+ temp = {};
+ $.each(_temp, function (pid, arr) {
+ $.each(arr, function (idx, item) {
+ var val = {
+ pid: pid,
+ name: item[ajaxConfig.keyName],
+ val: item[ajaxConfig.keyVal]
+ };
+ group.push(val);
+ var children = item[ajaxConfig.keyChildren];
+ if (children && children.length) {
+ temp[val.val] = children;
+ }
+ });
+ });
+ };
+
+ do {
+ _loop();
+ } while (Object.getOwnPropertyNames(temp).length);
+
+ var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+ var html = ['<div class="xm-select-linkage">'];
+
+ $.each(result, function (idx, arr) {
+ var groupDiv = ['<div style="left: ' + (linkageWidth - 0) * idx + 'px;" class="xm-select-linkage-group xm-select-linkage-group' + (idx + 1) + ' ' + (idx != 0 ? 'xm-select-linkage-hide' : '') + '">'];
+ $.each(arr, function (idx2, item) {
+ var span = '<li title="' + item.name + '" pid="' + item.pid + '" value="' + item.val + '"><span>' + item.name + '</span></li>';
+ groupDiv.push(span);
+ });
+ groupDiv.push('</div>');
+ html = html.concat(groupDiv);
+ });
+ // <li class="xm-select-this xm-select-active"><span>123</span></li>
+ html.push('<div style="clear: both; height: 288px;"></div>');
+ html.push('</div>');
+ reElem.find('dl').html(html.join(''));
+ reElem.find('.' + INPUT).css('display', 'none'); //联动暂时不支持搜索
+ return {
+ v: void 0
+ };
+ }();
+
+ if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
+ }
+
+ var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+ var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+ var pcInput = reElem.find('.' + TDIV + ' input');
+
+ var values = [];
+ reElem.find('dl').html(this.renderSelect(id, pcInput.attr('placeholder') || pcInput.attr('back'), dataArr.map(function (item) {
+ if (item[ajaxConfig.keySel]) {
+ values.push({
+ name: item[ajaxConfig.keyName],
+ val: item[ajaxConfig.keyVal]
+ });
+ }
+ return {
+ innerHTML: item[ajaxConfig.keyName],
+ value: item[ajaxConfig.keyVal],
+ sel: item[ajaxConfig.keySel],
+ disabled: item[ajaxConfig.keyDis],
+ type: item.type,
+ name: item.name
+ };
+ })));
+
+ var label = reElem.find('.' + LABEL);
+ var dl = reElem.find('dl[xid]');
+ if (isSearch) {
+ //如果是远程搜索, 这里需要判重
+ var oldVal = data[id].values;
+ oldVal.forEach(function (item, index) {
+ dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+ });
+ values.forEach(function (item, index) {
+ if (_this4.indexOf(oldVal, item) == -1) {
+ _this4.addLabel(id, label, item);
+ dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+ oldVal.push(item);
+ }
+ });
+ } else {
+ values.forEach(function (item, index) {
+ _this4.addLabel(id, label, item);
+ dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+ });
+ data[id].values = values;
+ }
+ this.commonHanler(id, label);
+ };
+
+ Common.prototype.create = function (id, isCreate, inputValue) {
+ if (isCreate && inputValue) {
+ var fs = data[id],
+ dl = $('[xid="' + id + '"]'),
+ tips = dl.find('dd.' + FORM_SELECT_TIPS + ':first'),
+ tdd = null,
+ temp = dl.find('dd.' + TEMP);
+ dl.find('dd:not(.' + FORM_SELECT_TIPS + '):not(.' + TEMP + ')').each(function (index, item) {
+ if (inputValue == $(item).find('span').text()) {
+ tdd = item;
+ }
+ });
+ if (!tdd) {
+ //如果不存在, 则创建
+ if (temp[0]) {
+ temp.attr('lay-value', inputValue);
+ temp.find('span').text(inputValue);
+ temp.removeClass('layui-hide');
+ } else {
+ tips.after($(this.createDD({
+ innerHTML: inputValue,
+ value: Date.now()
+ }, TEMP + ' ' + CREATE_LONG)));
+ }
+ }
+ } else {
+ $('[xid=' + id + '] dd.' + TEMP).remove();
+ }
+ };
+
+ Common.prototype.createDD = function (item, clz) {
+ return '<dd lay-value="' + item.value + '" class="' + (item.disabled ? DISABLED : '') + ' ' + (clz ? clz : '') + '">\n\t\t\t\t\t<div class="xm-unselect xm-form-checkbox ' + (item.disabled ? 'layui-checkbox-disbaled ' + DISABLED : '') + '" lay-skin="primary">\n\t\t\t\t\t\t<span>' + $.trim(item.innerHTML) + '</span>\n\t\t\t\t\t\t<i class="' + CHECKBOX_YES + '"></i>\n\t\t\t\t\t</div>\n\t\t\t\t</dd>';
+ };
+
+ Common.prototype.createQuickBtn = function (obj, right) {
+ return '<div class="' + CZ + '" method="' + obj.name + '" title="' + obj.name + '" ' + (right ? 'style="margin-right: ' + right + '"' : '') + '><i class="' + obj.icon + '"></i><span>' + obj.name + '</span></div>';
+ };
+
+ Common.prototype.renderBtns = function (id, show, right) {
+ var _this5 = this;
+
+ var quickBtn = [];
+ var dl = $('dl[xid="' + id + '"]');
+ quickBtn.push('<div class="' + CZ_GROUP + '" show="' + show + '" style="max-width: ' + (dl.prev().width() - 54) + 'px;">');
+ $.each(data[id].config.btns, function (index, item) {
+ quickBtn.push(_this5.createQuickBtn(item, right));
+ });
+ quickBtn.push('</div>');
+ quickBtn.push(this.createQuickBtn({ icon: 'iconfont icon-caidan', name: '' }));
+ return quickBtn.join('');
+ };
+
+ Common.prototype.renderSelect = function (id, tips, select) {
+ var _this6 = this;
+
+ var arr = [];
+ if (data[id].config.btns.length) {
+ setTimeout(function () {
+ var dl = $('dl[xid="' + id + '"]');
+ dl.find('.' + CZ_GROUP).css('max-width', dl.prev().width() - 54 + 'px');
+ }, 10);
+ arr.push(['<dd lay-value="" class="' + FORM_SELECT_TIPS + '" style="background-color: #FFF!important;">', this.renderBtns(id, null, '30px'), '</dd>'].join(''));
+ } else {
+ arr.push('<dd lay-value="" class="' + FORM_SELECT_TIPS + '">' + tips + '</dd>');
+ }
+ if (this.isArray(select)) {
+ $(select).each(function (index, item) {
+ if (item.type === 'optgroup') {
+ arr.push('<dt>' + item.name + '</dt>');
+ } else {
+ arr.push(_this6.createDD(item));
+ }
+ });
+ } else {
+ $(select).find('*').each(function (index, item) {
+ if (item.tagName.toLowerCase() == 'option' && index == 0 && !item.value) {
+ return;
+ }
+ if (item.tagName.toLowerCase() === 'optgroup') {
+ arr.push('<dt>' + item.label + '</dt>');
+ } else {
+ arr.push(_this6.createDD(item));
+ }
+ });
+ }
+ arr.push('<dt style="display:none;"> </dt>');
+ arr.push('<dd class="' + FORM_SELECT_TIPS + ' ' + FORM_NONE + ' ' + (arr.length === 2 ? FORM_EMPTY : '') + '">\u6CA1\u6709\u9009\u9879</dd>');
+ return arr.join('');
+ };
+
+ Common.prototype.on = function () {
+ var _this7 = this;
+
+ //事件绑定
+ this.one();
+
+ $(document).on('click', function (e) {
+ if (!$(e.target).parents('.' + FORM_TITLE)[0]) {
+ //清空input中的值
+ $('.' + INPUT).val('');
+ $('.' + PNAME + ' dl .layui-hide').removeClass('layui-hide');
+ $('.' + PNAME + ' dl dd.' + TEMP).remove();
+ _this7.triggerSearch();
+ }
+ $('.' + PNAME + ' .' + FORM_SELECTED).removeClass(FORM_SELECTED);
+ });
+ };
+
+ Common.prototype.one = function (target) {
+ var _this8 = this;
+
+ //一次性事件绑定
+ $(target ? target : document).find('.' + FORM_TITLE).off('click').on('click', function (e) {
+ var othis = $(e.target),
+ title = othis.is(FORM_TITLE) ? othis : othis.parents('.' + FORM_TITLE),
+ dl = title.next(),
+ id = dl.attr('xid');
+
+ //清空非本select的input val
+ $('dl[xid]').not(dl).prev().find('.' + INPUT).val('');
+ $('dl[xid]').not(dl).find('dd.layui-hide').removeClass('layui-hide');
+
+ //如果是disabled select
+ if (title.hasClass(DIS)) {
+ return false;
+ }
+ //如果点击的是右边的三角或者只读的input
+ if (othis.is('.' + SANJIAO) || othis.is('.' + INPUT + '[readonly]')) {
+ _this8.changeShow(title, !title.parents('.' + FORM_SELECT).hasClass(FORM_SELECTED));
+ return false;
+ }
+ //如果点击的是input的右边, focus一下
+ if (title.find('.' + INPUT + ':not(readonly)')[0]) {
+ var input = title.find('.' + INPUT),
+ epos = { x: e.pageX, y: e.pageY },
+ pos = _this8.getPosition(title[0]),
+ width = title.width();
+ while (epos.x > pos.x) {
+ if ($(document.elementFromPoint(epos.x, epos.y)).is(input)) {
+ input.focus();
+ _this8.changeShow(title, true);
+ return false;
+ }
+ epos.x -= 50;
+ }
+ }
+
+ //如果点击的是可搜索的input
+ if (othis.is('.' + INPUT)) {
+ _this8.changeShow(title, true);
+ return false;
+ }
+ //如果点击的是x按钮
+ if (othis.is('i[fsw="' + NAME + '"]')) {
+ var val = {
+ name: othis.prev().text(),
+ val: othis.parent().attr("value")
+ },
+ dd = dl.find('dd[lay-value=\'' + val.val + '\']');
+ if (dd.hasClass(DISABLED)) {
+ //如果是disabled状态, 不可选, 不可删
+ return false;
+ }
+ _this8.handlerLabel(id, dd, false, val);
+ return false;
+ }
+
+ _this8.changeShow(title, !title.parents('.' + FORM_SELECT).hasClass(FORM_SELECTED));
+ return false;
+ });
+ $(target ? target : document).find('dl.' + DL).off('click').on('click', function (e) {
+ var othis = $(e.target);
+ if (othis.is('.' + LINKAGE) || othis.parents('.' + LINKAGE)[0]) {
+ //linkage的处理
+ othis = othis.is('li') ? othis : othis.parents('li');
+ var _group = othis.parents('.xm-select-linkage-group'),
+ _id = othis.parents('dl').attr('xid');
+ //激活li
+ _group.find('.xm-select-active').removeClass('xm-select-active');
+ othis.addClass('xm-select-active');
+ //激活下一个group, 激活前显示对应数据
+ _group.nextAll('.xm-select-linkage-group').addClass('xm-select-linkage-hide');
+ var nextGroup = _group.next('.xm-select-linkage-group');
+ nextGroup.find('li').addClass('xm-select-linkage-hide');
+ nextGroup.find('li[pid="' + othis.attr('value') + '"]').removeClass('xm-select-linkage-hide');
+ //如果没有下一个group, 或没有对应的值
+ if (!nextGroup[0] || nextGroup.find('li:not(.xm-select-linkage-hide)').length == 0) {
+ var vals = [],
+ index = 0,
+ _isAdd = !othis.hasClass('xm-select-this');
+ if (data[_id].config.radio) {
+ othis.parents('.xm-select-linkage').find('.xm-select-this').removeClass('xm-select-this');
+ }
+ do {
+ vals[index++] = {
+ name: othis.find('span').text(),
+ val: othis.attr('value')
+ /*isAdd ? (
+ othis.addClass('xm-select-this')
+ ) : (
+ !othis.parent('.xm-select-linkage-group').next().find(`li[pid="${othis.attr('value')}"].xm-select-this`).length && othis.removeClass('xm-select-this')
+ );*/
+ };othis = othis.parents('.xm-select-linkage-group').prev().find('li[value="' + othis.attr('pid') + '"]');
+ } while (othis.length);
+ vals.reverse();
+ var val = {
+ name: vals.map(function (item) {
+ return item.name;
+ }).join('/'),
+ val: vals.map(function (item) {
+ return item.val;
+ }).join('/')
+ };
+ _this8.handlerLabel(_id, null, _isAdd, val);
+ } else {
+ nextGroup.removeClass('xm-select-linkage-hide');
+ }
+ return false;
+ } //xm-select-this xm-select-active
+
+ if (othis.is('dt') || othis.is('dl')) {
+ return false;
+ }
+ var dd = othis.is('dd') ? othis : othis.parents('dd');
+ var id = dd.parent('dl').attr('xid');
+ if (dd.hasClass(DISABLED)) {
+ //被禁用选项的处理
+ return false;
+ }
+ if (dd.hasClass(FORM_SELECT_TIPS)) {
+ //tips的处理
+ var btn = othis.is('.' + CZ) ? othis : othis.parents('.' + CZ);
+ if (!btn[0]) {
+ return false;
+ }
+ //TODO 快捷操作
+ var method = btn.attr('method');
+ var obj = data[id].config.btns.filter(function (bean) {
+ return bean.name == method;
+ })[0];
+ obj && obj.click && obj.click instanceof Function && obj.click(id, _this8);
+ return false;
+ }
+ var isAdd = !dd.hasClass(THIS);
+ _this8.handlerLabel(id, dd, isAdd);
+ return false;
+ });
+ };
+
+ Common.prototype.linkageAdd = function (id, val) {
+ var dl = $('dl[xid="' + id + '"]');
+ dl.find('.xm-select-active').removeClass('xm-select-active');
+ var vs = val.val.split('/');
+ var pid = void 0,
+ li = void 0,
+ index = 0;
+ var lis = [];
+ do {
+ pid = vs[index];
+ li = dl.find('.xm-select-linkage-group' + (index + 1) + ' li[value="' + pid + '"]');
+ li[0] && lis.push(li);
+ index++;
+ } while (li.length && pid != undefined);
+ if (lis.length == vs.length) {
+ $.each(lis, function (idx, item) {
+ item.addClass('xm-select-this');
+ });
+ }
+ };
+
+ Common.prototype.linkageDel = function (id, val) {
+ var dl = $('dl[xid="' + id + '"]');
+ var vs = val.val.split('/');
+ var pid = void 0,
+ li = void 0,
+ index = vs.length - 1;
+ do {
+ pid = vs[index];
+ li = dl.find('.xm-select-linkage-group' + (index + 1) + ' li[value="' + pid + '"]');
+ if (!li.parent().next().find('li[pid=' + pid + '].xm-select-this').length) {
+ li.removeClass('xm-select-this');
+ }
+ index--;
+ } while (li.length && pid != undefined);
+ };
+
+ Common.prototype.valToName = function (id, val) {
+ var dl = $('dl[xid="' + id + '"]');
+ var vs = (val + "").split('/');
+ var names = [];
+ $.each(vs, function (idx, item) {
+ var name = dl.find('.xm-select-linkage-group' + (idx + 1) + ' li[value="' + item + '"] span').text();
+ names.push(name);
+ });
+ return names.length == vs.length ? names.join('/') : null;
+ };
+
+ Common.prototype.commonHanler = function (key, label) {
+ //计算input的提示语
+ this.changePlaceHolder(label);
+ //计算高度
+ this.retop(label.parents('.' + FORM_SELECT));
+ this.checkHideSpan(label);
+ this.calcLeft(key, label);
+ //表单默认值
+ label.parents('.' + PNAME).find('.' + HIDE_INPUT).val(data[key].values.map(function (val) {
+ return val.val;
+ }).join(','));
+ //title值
+ label.parents('.' + FORM_TITLE + ' .' + NAME).attr('title', data[key].values.map(function (val) {
+ return val.name;
+ }).join(','));
+ };
+
+ Common.prototype.initVal = function (id) {
+ var _this9 = this;
+
+ var target = {};
+ if (id) {
+ target[id] = data[id];
+ } else {
+ target = data;
+ }
+ $.each(target, function (key, val) {
+ var values = val.values,
+ div = $('dl[xid="' + key + '"]').parent(),
+ label = div.find('.' + LABEL),
+ dl = div.find('dl');
+ dl.find('dd.' + THIS).removeClass(THIS);
+
+ var _vals = values.concat([]);
+ _vals.concat([]).forEach(function (item, index) {
+ _this9.addLabel(key, label, item);
+ dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+ });
+ if (val.config.radio) {
+ _vals.length && values.push(_vals[_vals.length - 1]);
+ }
+ _this9.commonHanler(key, label);
+ });
+ };
+
+ Common.prototype.handlerLabel = function (id, dd, isAdd, oval, notOn) {
+ var div = $('[xid="' + id + '"]').prev().find('.' + LABEL),
+ val = dd && {
+ name: dd.find('span').text(),
+ val: dd.attr('lay-value')
+ },
+ vals = data[id].values,
+ on = data[id].config.on || events.on[id];
+ if (oval) {
+ val = oval;
+ }
+ var fs = data[id];
+ if (isAdd && fs.config.max && fs.values.length >= fs.config.max) {
+ var maxTipsFun = data[id].config.maxTips || events.maxTips[id];
+ maxTipsFun && maxTipsFun(id, vals.concat([]), val, fs.max);
+ return;
+ }
+ if (!notOn) {
+ if (on && on instanceof Function && on(id, vals.concat([]), val, isAdd, dd && dd.hasClass(DISABLED) == false)) {
+ return;
+ }
+ }
+ var dl = $('dl[xid="' + id + '"]');
+ isAdd ? (dd && dd[0] ? (dd.addClass(THIS), dd.removeClass(TEMP)) : dl.find('.xm-select-linkage')[0] && this.linkageAdd(id, val), this.addLabel(id, div, val), vals.push(val)) : (dd && dd[0] ? dd.removeClass(THIS) : dl.find('.xm-select-linkage')[0] && this.linkageDel(id, val), this.delLabel(id, div, val), this.remove(vals, val));
+ if (!div[0]) return;
+ //单选选完后直接关闭选择域
+ if (fs.config.radio) {
+ this.changeShow(div, false);
+ }
+ //移除表单验证的红色边框
+ div.parents('.' + FORM_TITLE).prev().removeClass('layui-form-danger');
+
+ //清空搜索值
+ fs.config.clearInput && div.parents('.' + PNAME).find('.' + INPUT).val('');
+
+ this.commonHanler(id, div);
+ };
+
+ Common.prototype.addLabel = function (id, div, val) {
+ if (!val) return;
+ var tips = 'fsw="' + NAME + '"';
+ var _ref = [$('<span ' + tips + ' value="' + val.val + '"><font ' + tips + '>' + val.name + '</font></span>'), $('<i ' + tips + ' class="xm-icon-close">\xD7</i>')],
+ $label = _ref[0],
+ $close = _ref[1];
+
+ $label.append($close);
+ //如果是radio模式
+ var fs = data[id];
+ if (fs.config.radio) {
+ fs.values.length = 0;
+ $('dl[xid="' + id + '"]').find('dd.' + THIS + ':not([lay-value="' + val.val + '"])').removeClass(THIS);
+ div.find('span').remove();
+ }
+ //如果是固定高度
+ if (fs.config.height) {
+ div.append($label);
+ } else {
+ div.find('input').css('width', '50px');
+ div.find('input').before($label);
+ }
+ };
+
+ Common.prototype.delLabel = function (id, div, val) {
+ if (!val) return;
+ div.find('span[value="' + val.val + '"]:first').remove();
+ };
+
+ Common.prototype.calcLeft = function (id, div) {
+ if (data[id].config.height) {
+ var showLastSpan = div.find('span:not(.xm-span-hide):last')[0];
+ div.next().css('left', (showLastSpan ? this.getPosition(showLastSpan).x - this.getPosition(div[0]).x + showLastSpan.offsetWidth + 20 : 10) + 'px');
+ }
+ };
+
+ Common.prototype.checkHideSpan = function (div) {
+ var _this10 = this;
+
+ var parentHeight = div.parents('.' + NAME)[0].offsetHeight + 5;
+ div.find('span.xm-span-hide').removeClass('xm-span-hide');
+ div.find('span').each(function (index, item) {
+ if (item.offsetHeight + item.offsetTop > parentHeight || _this10.getPosition(item).y + item.offsetHeight > _this10.getPosition(div[0]).y + div[0].offsetHeight + 5) {
+ $(item).addClass('xm-span-hide');
+ }
+ });
+ };
+
+ Common.prototype.retop = function (div) {
+ //计算dl显示的位置
+ var dl = div.find('dl'),
+ top = div.offset().top + div.outerHeight() + 5 - $win.scrollTop(),
+ dlHeight = dl.outerHeight();
+ var up = div.hasClass('layui-form-selectup') || dl.css('top').indexOf('-') != -1 || top + dlHeight > $win.height() && top >= dlHeight;
+ div = div.find('.' + NAME);
+
+ var fs = data[dl.attr('xid')];
+ var base = dl.parents('.layui-form-pane')[0] && dl.prev()[0].clientHeight > 38 ? 14 : 10;
+ if (fs) {
+ if (fs.config.direction == 'up') {
+ dl.css({
+ top: 'auto',
+ bottom: '42px'
+ });
+ return;
+ }
+ if (fs.direction == 'down') {
+ dl.css({
+ top: div[0].offsetTop + div.height() + base + 'px',
+ bottom: 'auto'
+ });
+ return;
+ }
+ }
+
+ if (up) {
+ dl.css({
+ top: 'auto',
+ bottom: '42px'
+ });
+ } else {
+ dl.css({
+ top: div[0].offsetTop + div.height() + base + 'px',
+ bottom: 'auto'
+ });
+ }
+ };
+
+ Common.prototype.changeShow = function (children, isShow) {
+ //显示于隐藏
+ var top = children.parents('.' + FORM_SELECT);
+ $('.' + PNAME + ' .' + FORM_SELECT).not(top).removeClass(FORM_SELECTED);
+ if (isShow) {
+ this.retop(top);
+ top.addClass(FORM_SELECTED);
+ top.find('.' + INPUT).focus();
+ } else {
+ top.removeClass(FORM_SELECTED);
+ top.find('.' + INPUT).val('');
+ top.find('dl .layui-hide').removeClass('layui-hide');
+ top.find('dl dd.' + TEMP).remove();
+ //计算ajax数据是否为空, 然后重新请求数据
+ var id = top.find('dl').attr('xid');
+ if (id && data[id] && data[id].config.isEmpty) {
+ this.triggerSearch(top);
+ }
+ }
+ };
+
+ Common.prototype.changePlaceHolder = function (div) {
+ //显示于隐藏提示语
+ //调整pane模式下的高度
+ var title = div.parents('.' + FORM_TITLE);
+
+ var id = div.parents('.' + PNAME).find('dl[xid]').attr('xid');
+ if (data[id] && data[id].config.height) {//既然固定高度了, 那就看着办吧
+
+ } else {
+ var height = title.find('.' + NAME)[0].clientHeight;
+ title.css('height', (height > 34 ? height + 4 : height) + 'px');
+ //如果是layui pane模式, 处理label的高度
+ var label = title.parents('.' + PNAME).parent().prev();
+ if (label.is('.layui-form-label') && title.parents('.layui-form-pane')[0]) {
+ height = height > 36 ? height + 4 : height;
+ title.css('height', height + 'px');
+ label.css({
+ height: height + 2 + 'px',
+ lineHeight: height - 18 + 'px'
+ });
+ }
+ }
+
+ var input = title.find('.' + TDIV + ' input'),
+ isShow = !div.find('span:last')[0] && !title.find('.' + INPUT).val();
+ if (isShow) {
+ var ph = input.attr('back');
+ input.removeAttr('back');
+ input.attr('placeholder', ph);
+ } else {
+ var _ph = input.attr('placeholder');
+ input.removeAttr('placeholder');
+ input.attr('back', _ph);
+ }
+ };
+
+ Common.prototype.indexOf = function (arr, val) {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i].val == val || arr[i].val == (val ? val.val : val) || arr[i] == val || JSON.stringify(arr[i]) == JSON.stringify(val)) {
+ return i;
+ }
+ }
+ return -1;
+ };
+
+ Common.prototype.remove = function (arr, val) {
+ var idx = this.indexOf(arr, val ? val.val : val);
+ if (idx > -1) {
+ arr.splice(idx, 1);
+ return true;
+ }
+ return false;
+ };
+
+ Common.prototype.selectAll = function (id, isOn, skipDis) {
+ var _this11 = this;
+
+ var dl = $('[xid="' + id + '"]');
+ if (dl.find('.xm-select-linkage')[0]) {
+ return;
+ }
+ dl.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + '):not(.' + THIS + ')' + (skipDis ? ':not(.' + DISABLED + ')' : '')).each(function (index, item) {
+ item = $(item);
+ var val = {
+ name: item.find('span').text(),
+ val: item.attr('lay-value')
+ };
+ _this11.handlerLabel(id, dl.find('dd[lay-value="' + val.val + '"]'), true, val, !isOn);
+ });
+ };
+
+ Common.prototype.removeAll = function (id, isOn, skipDis) {
+ var _this12 = this;
+
+ var dl = $('[xid="' + id + '"]');
+ if (dl.find('.xm-select-linkage')[0]) {
+ //针对多级联动的处理
+ data[id].values.concat([]).forEach(function (item, idx) {
+ var vs = item.val.split('/');
+ var pid = void 0,
+ li = void 0,
+ index = 0;
+ do {
+ pid = vs[index++];
+ li = dl.find('.xm-select-linkage-group' + index + ':not(.xm-select-linkage-hide) li[value="' + pid + '"]');
+ li.click();
+ } while (li.length && pid != undefined);
+ });
+ return;
+ }
+ data[id].values.concat([]).forEach(function (item, index) {
+ if (skipDis && dl.find('dd[lay-value="' + item.val + '"]').hasClass(DISABLED)) {} else {
+ _this12.handlerLabel(id, dl.find('dd[lay-value="' + item.val + '"]'), false, item, !isOn);
+ }
+ });
+ };
+
+ Common.prototype.reverse = function (id, isOn, skipDis) {
+ var _this13 = this;
+
+ var dl = $('[xid="' + id + '"]');
+ if (dl.find('.xm-select-linkage')[0]) {
+ return;
+ }
+ dl.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + ')' + (skipDis ? ':not(.' + DISABLED + ')' : '')).each(function (index, item) {
+ item = $(item);
+ var val = {
+ name: item.find('span').text(),
+ val: item.attr('lay-value')
+ };
+ _this13.handlerLabel(id, dl.find('dd[lay-value="' + val.val + '"]'), !item.hasClass(THIS), val, !isOn);
+ });
+ };
+
+ Common.prototype.skin = function (id) {
+ var skins = ['default', 'primary', 'normal', 'warm', 'danger'];
+ var skin = skins[Math.floor(Math.random() * skins.length)];
+ $('dl[xid="' + id + '"]').parents('.' + PNAME).find('.' + FORM_SELECT).attr('xm-select-skin', skin);
+ this.commonHanler(id, $('dl[xid="' + id + '"]').parents('.' + PNAME).find('.' + LABEL));
+ };
+
+ Common.prototype.getPosition = function (e) {
+ var x = 0,
+ y = 0;
+ while (e != null) {
+ x += e.offsetLeft;
+ y += e.offsetTop;
+ e = e.offsetParent;
+ }
+ return { x: x, y: y };
+ };
+
+ Common.prototype.onreset = function () {
+ //监听reset按钮, 然后重置多选
+ $(document).on('click', '[type=reset]', function (e) {
+ $(e.target).parents('form').find('.' + PNAME + ' dl[xid]').each(function (index, item) {
+ var id = item.getAttribute('xid'),
+ dl = $(item),
+ dd = void 0,
+ temp = {};
+ common.removeAll(id);
+ data[id].config.init.forEach(function (val, idx) {
+ if (val && (!temp[val] || data[id].config.repeat) && (dd = dl.find('dd[lay-value="' + val.val + '"]'))[0]) {
+ common.handlerLabel(id, dd, true);
+ temp[val] = 1;
+ }
+ });
+ });
+ });
+ };
+
+ Common.prototype.loadingCss = function () {};
+
+ Common.prototype.listening = function () {
+ //TODO 用于监听dom结构变化, 如果出现新的为渲染select, 则自动进行渲染
+ var flag = false;
+ var index = 0;
+ $(document).on('DOMNodeInserted', function (e) {
+ if (flag) {
+ //避免递归渲染
+ return;
+ }
+ flag = true;
+ //渲染select
+ $('select[' + NAME + ']').each(function (index, select) {
+ var sid = select.getAttribute(NAME);
+ common.init(select);
+ common.one($('dl[xid="' + sid + '"]').parents('.' + PNAME));
+ common.initVal(sid);
+ });
+
+ flag = false;
+ });
+ };
+
+ var Select4 = function Select4() {
+ this.v = v;
+ };
+ var common = new Common();
+
+ Select4.prototype.value = function (id, type, isAppend) {
+ if (typeof id != 'string') {
+ return [];
+ }
+ var fs = data[id];
+ if (!fs) {
+ return [];
+ }
+ if (typeof type == 'string' || type == undefined) {
+ var arr = fs.values.concat([]) || [];
+ if (type == 'val') {
+ return arr.map(function (val) {
+ return val.val;
+ });
+ }
+ if (type == 'valStr') {
+ return arr.map(function (val) {
+ return val.val;
+ }).join(',');
+ }
+ if (type == 'name') {
+ return arr.map(function (val) {
+ return val.name;
+ });
+ }
+ if (type == 'nameStr') {
+ return arr.map(function (val) {
+ return val.name;
+ }).join(',');
+ }
+ return arr;
+ }
+ if (common.isArray(type)) {
+ var dl = $('[xid="' + id + '"]'),
+ temp = {},
+ dd = void 0,
+ isAdd = true;
+ if (isAppend == false) {
+ //删除传入的数组
+ isAdd = false;
+ } else if (isAppend == true) {
+ //追加模式
+ isAdd = true;
+ } else {
+ //删除原有的数据
+ common.removeAll(id);
+ }
+ if (isAdd) {
+ fs.values.forEach(function (val, index) {
+ temp[val.val] = 1;
+ });
+ }
+ type.forEach(function (val, index) {
+ if (val && (!temp[val] || fs.config.repeat)) {
+ if ((dd = dl.find('dd[lay-value="' + val + '"]'))[0]) {
+ common.handlerLabel(id, dd, isAdd, null, true);
+ temp[val] = 1;
+ } else {
+ var name = common.valToName(id, val);
+ if (name) {
+ common.handlerLabel(id, dd, isAdd, {
+ name: name,
+ val: val
+ }, true);
+ temp[val] = 1;
+ }
+ }
+ }
+ });
+ }
+ };
+
+ Common.prototype.bindEvent = function (name, id, fun) {
+ if (id && id instanceof Function) {
+ fun = id;
+ id = null;
+ }
+ if (fun && fun instanceof Function) {
+ if (!id) {
+ $.each(data, function (id, val) {
+ data[id] ? data[id].config[name] = fun : events[name][id] = fun;
+ });
+ } else {
+ data[id] ? data[id].config[name] = fun : events[name][id] = fun;
+ }
+ }
+ };
+
+ Select4.prototype.on = function (id, fun) {
+ common.bindEvent('on', id, fun);
+ return this;
+ };
+
+ Select4.prototype.filter = function (id, fun) {
+ common.bindEvent('filter', id, fun);
+ return this;
+ };
+
+ Select4.prototype.maxTips = function (id, fun) {
+ common.bindEvent('maxTips', id, fun);
+ return this;
+ };
+
+ Select4.prototype.config = function (id, config, isJson) {
+ if (id && (typeof id === 'undefined' ? 'undefined' : _typeof(id)) == 'object') {
+ isJson = config == true;
+ config = id;
+ id = null;
+ }
+ if (config && (typeof config === 'undefined' ? 'undefined' : _typeof(config)) == 'object') {
+ if (isJson) {
+ config.header || (config.header = {});
+ config.header['Content-Type'] = 'application/json; charset=UTF-8';
+ config.dataType = 'json';
+ }
+ id ? (ajaxs[id] = $.extend(true, {}, ajax, config), data[id] && (data[id].config.direction = config.direction), config.searchUrl && data[id] && common.triggerSearch($('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT), true)) : $.extend(true, ajax, config);
+ }
+ return this;
+ };
+
+ Select4.prototype.render = function (id) {
+ var _this14 = this;
+
+ var target = {};
+ id ? data[id] && (target[id] = data[id]) : data;
+
+ if (Object.getOwnPropertyNames(target).length) {
+ $.each(target, function (key, val) {
+ //恢复初始值
+ var dl = $('dl[xid="' + key + '"]'),
+ vals = [];
+ val.select.find('option[selected]').each(function (index, item) {
+ vals.push(item.value);
+ });
+ //移除创建元素
+ dl.find('.' + CREATE_LONG).remove();
+ //清空INPUT
+ dl.prev().find('.' + INPUT).val('');
+ //触发search
+ common.triggerSearch(dl.parents('.' + FORM_SELECT), true);
+ //移除hidn
+ dl.find('.layui-hide').removeClass('layui-hide');
+ //重新赋值
+ _this14.value(key, vals);
+ });
+ }
+ ($('select[' + NAME + '="' + id + '"]')[0] ? $('select[' + NAME + '="' + id + '"]') : $('select[' + NAME + ']')).each(function (index, select) {
+ var sid = select.getAttribute(NAME);
+ common.init(select);
+ common.one($('dl[xid="' + sid + '"]').parents('.' + PNAME));
+ common.initVal(sid);
+ });
+ return this;
+ };
+
+ Select4.prototype.disabled = function (id) {
+ var target = {};
+ id ? data[id] && (target[id] = data[id]) : target = data;
+
+ $.each(target, function (key, val) {
+ $('dl[xid="' + key + '"]').prev().addClass(DIS);
+ });
+ return this;
+ };
+
+ Select4.prototype.undisabled = function (id) {
+ var target = {};
+ id ? data[id] && (target[id] = data[id]) : target = data;
+
+ $.each(target, function (key, val) {
+ $('dl[xid="' + key + '"]').prev().removeClass(DIS);
+ });
+ return this;
+ };
+
+ Select4.prototype.data = function (id, type, config) {
+ if (!id || !type || !config) {
+ return this;
+ }
+ //检测该id是否尚未渲染
+ !data[id] && this.render(id).value(id, []);
+ this.config(id, config);
+ if (type == 'local') {
+ common.renderData(id, config.arr, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100');
+ } else if (type == 'server') {
+ common.ajax(id, config.url, config.keyword, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100');
+ }
+ return this;
+ };
+
+ Select4.prototype.btns = function (id, btns, config) {
+ if (!btns || !common.isArray(btns)) {
+ return this;
+ };
+ var target = {};
+ id ? data[id] && (target[id] = data[id]) : target = data;
+
+ btns = btns.map(function (obj) {
+ if (typeof obj == 'string') {
+ if (obj == 'select') {
+ return quickBtns[0];
+ }
+ if (obj == 'remove') {
+ return quickBtns[1];
+ }
+ if (obj == 'reverse') {
+ return quickBtns[2];
+ }
+ if (obj == 'skin') {
+ return quickBtns[3];
+ }
+ }
+ return obj;
+ });
+
+ $.each(target, function (key, val) {
+ val.config.btns = btns;
+ var dd = $('dl[xid="' + key + '"]').find('.' + FORM_SELECT_TIPS + ':first');
+ if (btns.length) {
+ var show = config && config.show && (config.show == 'name' || config.show == 'icon') ? config.show : '';
+ var html = common.renderBtns(key, show, config && config.space ? config.space : '30px');
+ dd.html(html);
+ } else {
+ var pcInput = dd.parents('.' + FORM_SELECT).find('.' + TDIV + ' input');
+ var _html = pcInput.attr('placeholder') || pcInput.attr('back');
+ dd.html(_html);
+ dd.removeAttr('style');
+ }
+ });
+
+ return this;
+ };
+
+ Select4.prototype.search = function (id, val) {
+ if (id && data[id]) {
+ ajaxs[id] = $.extend(true, {}, ajax, {
+ first: true,
+ searchVal: val
+ });
+ common.triggerSearch($('dl[xid="' + id + '"]').parents('.' + FORM_SELECT), true);
+ }
+ return this;
+ };
+
+ return new Select4();
+});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/custom/module/index.js b/payapi/src/main/resources/static/custom/module/index.js
new file mode 100755
index 0000000..df14f67
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/index.js
@@ -0,0 +1,151 @@
+layui.define(['admin', 'layer', 'element'], function (exports) {
+ var admin = layui.admin;
+ var layer = layui.layer;
+ var element = layui.element;
+ var baseUrl = window.location.pathname;
+
+ var index = {
+ pageTabs: true, // 是否开启多标签
+ // 路由注册
+ initRouter: function () {
+ // 自动扫描side菜单注册
+ $('.layui-layout-admin .layui-nav a[lay-href]').each(function () {
+ var menuName = $(this).text();
+ var menuPath = $(this).attr('lay-href');
+ if ('javascript:;' != menuPath && '' != menuPath) {
+ var key = menuPath.replace(/[?:=&/]/g, '_');
+ $(this).attr('href', '#!' + key);
+ if (menuPath.startsWith("/")) {
+ menuPath = baseUrl + menuPath.substring(1);
+ } else {
+ menuPath = baseUrl + menuPath;
+ }
+ console.log(menuPath);
+ Q.reg(key, function () {
+ index.loadView({
+ menuId: key,
+ menuPath: menuPath,
+ menuName: menuName
+ });
+ });
+ } else {
+ $(this).attr('href', 'javascript:;');
+ }
+ });
+
+ // 主页
+ Q.init({
+ index: '_home_console'
+ });
+ // tab选项卡切换监听
+ element.on('tab(admin-pagetabs)', function (data) {
+ var layId = $(this).attr('lay-id');
+ Q.go(layId);
+ });
+ },
+ // 加载主体部分
+ loadView: function (param) {
+ var menuId = param.menuId;
+ var menuPath = param.menuPath;
+ var menuName = param.menuName;
+ var flag; // 选项卡是否已添加
+ var contentBody = '.layui-layout-admin .layui-body';
+ // 判断是否开启了选项卡功能
+ if (index.pageTabs) {
+ $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title>li').each(function () {
+ if ($(this).attr('lay-id') === menuId) {
+ flag = true;
+ return false;
+ }
+ });
+ if (!flag) {
+ element.tabAdd('admin-pagetabs', {
+ title: menuName,
+ id: menuId,
+ content: '<div id="' + menuId + '"></div>'
+ });
+ }
+ contentBody = '#' + menuId;
+ element.tabChange('admin-pagetabs', menuId);
+ admin.rollPage('auto');
+ // 切换tab关闭表格内浮窗
+ $('.layui-table-tips-c').trigger('click');
+ admin.removeLoading('.layui-layout-admin .layui-body');
+ // 解决切换tab滚动条时而消失的问题
+ var $iframe = $('.layui-layout-admin .layui-body .layui-tab-content .layui-tab-item.layui-show .admin-iframe')[0];
+ if ($iframe) {
+ $iframe.style.height = "99%";
+ $iframe.scrollWidth;
+ $iframe.style.height = "100%";
+ }
+ } else {
+ $('.layui-body.admin-iframe-body').removeClass('admin-iframe-body');
+ }
+ if (!flag || admin.isRefresh) {
+ admin.showLoading('.layui-layout-admin .layui-body');
+ admin.ajax({
+ url: menuPath,
+ type: 'GET',
+ dataType: 'html',
+ success: function (result, status, xhr) {
+ $(contentBody).html(result);
+ admin.isRefresh = false;
+ element.render('breadcrumb');
+ admin.removeLoading('.layui-layout-admin .layui-body');
+ }
+ });
+ }
+ admin.activeNav(Q.lash);
+ // 移动设备切换页面隐藏侧导航
+ if (document.body.clientWidth <= 750) {
+ admin.flexible(true);
+ }
+ },
+ // 检查多标签功能是否开启
+ checkPageTabs: function () {
+ if (index.pageTabs) {
+ $('.layui-layout-admin').addClass('open-tab');
+ // 如果开启多标签先加载主页
+ element.tabAdd('admin-pagetabs', {
+ id: 'home_console',
+ title: '<i class="layui-icon layui-icon-home"></i>',
+ content: '<div id="home_console"></div>'
+ });
+ $('#home_console').load('home/console');
+ } else {
+ $('.layui-layout-admin').removeClass('open-tab');
+ }
+ },
+ // 打开新页面
+ openNewTab: function (param) {
+ var menuId = param.menuId;
+ var url = param.url;
+ var title = param.title;
+
+ Q.reg(menuId, function () {
+ index.loadView({
+ menuId: menuId,
+ menuPath: url,
+ menuName: title
+ });
+ });
+
+ Q.go(menuId);
+ },
+ // 关闭选项卡
+ closeTab: function (menuId) {
+ element.tabDelete('admin-pagetabs', menuId);
+ },
+ // 绑定事件监听
+ bindEvent: function () {
+ // 退出登录点击事件
+ $('#btnLogout').click(function () {
+ layer.confirm('确定退出登录?', function () {
+ location.replace(baseUrl+'logout');
+ });
+ });
+ }
+ };
+
+ exports('index', index);
+});
diff --git a/payapi/src/main/resources/static/custom/module/treeSelect/treeSelect.js b/payapi/src/main/resources/static/custom/module/treeSelect/treeSelect.js
new file mode 100755
index 0000000..e7a85fd
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/treeSelect/treeSelect.js
@@ -0,0 +1,597 @@
+
+layui.define(['form', 'jquery'], function (exports) { //提示:模块也可以依赖其它模块,如:layui.define('layer', callback);
+ var jQuery = layui.jquery,
+ $ = jQuery,
+ form = layui.form,
+ _MOD = 'treeSelect',
+ trss = {},
+ TreeSelect = function () {
+ this.v = '1.0.5';
+ };
+
+
+
+/*
+ * JQuery zTree core v3.5.37
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-08-21
+ */
+(function(r){var J,K,L,M,N,O,v,t={},w={},x={},P={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nameIsHTML:!1,selectedMulti:!0,showIcon:!0,showLine:!0,showTitle:!0,txtSelectedEnable:!1},data:{key:{isParent:"isParent",children:"children",name:"name",title:"",url:"url",icon:"icon"},simpleData:{enable:!1,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:!1,leaf:!1}},async:{enable:!1,contentType:"application/x-www-form-urlencoded",type:"post",
+dataType:"text",headers:{},xhrFields:{},url:"",autoParam:[],otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},y=[function(a){var b=a.treeObj,c=g.event;b.bind(c.NODECREATED,
+function(b,c,i){h.apply(a.callback.onNodeCreated,[b,c,i])});b.bind(c.CLICK,function(b,c,i,e,k){h.apply(a.callback.onClick,[c,i,e,k])});b.bind(c.EXPAND,function(b,c,i){h.apply(a.callback.onExpand,[b,c,i])});b.bind(c.COLLAPSE,function(b,c,i){h.apply(a.callback.onCollapse,[b,c,i])});b.bind(c.ASYNC_SUCCESS,function(b,c,i,e){h.apply(a.callback.onAsyncSuccess,[b,c,i,e])});b.bind(c.ASYNC_ERROR,function(b,c,i,e,k,g){h.apply(a.callback.onAsyncError,[b,c,i,e,k,g])});b.bind(c.REMOVE,function(b,c,i){h.apply(a.callback.onRemove,
+[b,c,i])});b.bind(c.SELECTED,function(b,c,i){h.apply(a.callback.onSelected,[c,i])});b.bind(c.UNSELECTED,function(b,c,i){h.apply(a.callback.onUnSelected,[c,i])})}],z=[function(a){var b=g.event;a.treeObj.unbind(b.NODECREATED).unbind(b.CLICK).unbind(b.EXPAND).unbind(b.COLLAPSE).unbind(b.ASYNC_SUCCESS).unbind(b.ASYNC_ERROR).unbind(b.REMOVE).unbind(b.SELECTED).unbind(b.UNSELECTED)}],A=[function(a){var b=e.getCache(a);b||(b={},e.setCache(a,b));b.nodes=[];b.doms=[]}],B=[function(a,b,c,d,f,i){if(c){var m=
+e.getRoot(a),k=e.nodeChildren(a,c);c.level=b;c.tId=a.treeId+"_"+ ++m.zId;c.parentTId=d?d.tId:null;c.open=typeof c.open=="string"?h.eqs(c.open,"true"):!!c.open;b=e.nodeIsParent(a,c);h.isArray(k)&&!(b===!1||typeof b=="string"&&h.eqs(b,"false"))?(e.nodeIsParent(a,c,!0),c.zAsync=!0):(b=e.nodeIsParent(a,c,b),c.open=b&&!a.async.enable?c.open:!1,c.zAsync=!b);c.isFirstNode=f;c.isLastNode=i;c.getParentNode=function(){return e.getNodeCache(a,c.parentTId)};c.getPreNode=function(){return e.getPreNode(a,c)};c.getNextNode=
+function(){return e.getNextNode(a,c)};c.getIndex=function(){return e.getNodeIndex(a,c)};c.getPath=function(){return e.getNodePath(a,c)};c.isAjaxing=!1;e.fixPIdKeyValue(a,c)}}],u=[function(a){var b=a.target,c=e.getSetting(a.data.treeId),d="",f=null,i="",m="",k=null,j=null,o=null;if(h.eqs(a.type,"mousedown"))m="mousedown";else if(h.eqs(a.type,"mouseup"))m="mouseup";else if(h.eqs(a.type,"contextmenu"))m="contextmenu";else if(h.eqs(a.type,"click"))if(h.eqs(b.tagName,"span")&&b.getAttribute("treeNode"+
+g.id.SWITCH)!==null)d=h.getNodeMainDom(b).id,i="switchNode";else{if(o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}]))d=h.getNodeMainDom(o).id,i="clickNode"}else if(h.eqs(a.type,"dblclick")&&(m="dblclick",o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}])))d=h.getNodeMainDom(o).id,i="switchNode";if(m.length>0&&d.length==0&&(o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}])))d=h.getNodeMainDom(o).id;if(d.length>0)switch(f=e.getNodeCache(c,d),i){case "switchNode":e.nodeIsParent(c,
+f)?h.eqs(a.type,"click")||h.eqs(a.type,"dblclick")&&h.apply(c.view.dblClickExpand,[c.treeId,f],c.view.dblClickExpand)?k=J:i="":i="";break;case "clickNode":k=K}switch(m){case "mousedown":j=L;break;case "mouseup":j=M;break;case "dblclick":j=N;break;case "contextmenu":j=O}return{stop:!1,node:f,nodeEventType:i,nodeEventCallback:k,treeEventType:m,treeEventCallback:j}}],C=[function(a){var b=e.getRoot(a);b||(b={},e.setRoot(a,b));e.nodeChildren(a,b,[]);b.expandTriggerFlag=!1;b.curSelectedList=[];b.noSelection=
+!0;b.createdNodes=[];b.zId=0;b._ver=(new Date).getTime()}],D=[],E=[],F=[],G=[],H=[],e={addNodeCache:function(a,b){e.getCache(a).nodes[e.getNodeCacheId(b.tId)]=b},getNodeCacheId:function(a){return a.substring(a.lastIndexOf("_")+1)},addAfterA:function(a){E.push(a)},addBeforeA:function(a){D.push(a)},addInnerAfterA:function(a){G.push(a)},addInnerBeforeA:function(a){F.push(a)},addInitBind:function(a){y.push(a)},addInitUnBind:function(a){z.push(a)},addInitCache:function(a){A.push(a)},addInitNode:function(a){B.push(a)},
+addInitProxy:function(a,b){b?u.splice(0,0,a):u.push(a)},addInitRoot:function(a){C.push(a)},addNodesData:function(a,b,c,d){var f=e.nodeChildren(a,b);f?c>=f.length&&(c=-1):(f=e.nodeChildren(a,b,[]),c=-1);if(f.length>0&&c===0)f[0].isFirstNode=!1,j.setNodeLineIcos(a,f[0]);else if(f.length>0&&c<0)f[f.length-1].isLastNode=!1,j.setNodeLineIcos(a,f[f.length-1]);e.nodeIsParent(a,b,!0);c<0?e.nodeChildren(a,b,f.concat(d)):(a=[c,0].concat(d),f.splice.apply(f,a))},addSelectedNode:function(a,b){var c=e.getRoot(a);
+e.isSelectedNode(a,b)||c.curSelectedList.push(b)},addCreatedNode:function(a,b){(a.callback.onNodeCreated||a.view.addDiyDom)&&e.getRoot(a).createdNodes.push(b)},addZTreeTools:function(a){H.push(a)},exSetting:function(a){r.extend(!0,P,a)},fixPIdKeyValue:function(a,b){a.data.simpleData.enable&&(b[a.data.simpleData.pIdKey]=b.parentTId?b.getParentNode()[a.data.simpleData.idKey]:a.data.simpleData.rootPId)},getAfterA:function(a,b,c){for(var d=0,e=E.length;d<e;d++)E[d].apply(this,arguments)},getBeforeA:function(a,
+b,c){for(var d=0,e=D.length;d<e;d++)D[d].apply(this,arguments)},getInnerAfterA:function(a,b,c){for(var d=0,e=G.length;d<e;d++)G[d].apply(this,arguments)},getInnerBeforeA:function(a,b,c){for(var d=0,e=F.length;d<e;d++)F[d].apply(this,arguments)},getCache:function(a){return x[a.treeId]},getNodeIndex:function(a,b){if(!b)return null;for(var c=b.parentTId?b.getParentNode():e.getRoot(a),c=e.nodeChildren(a,c),d=0,f=c.length-1;d<=f;d++)if(c[d]===b)return d;return-1},getNextNode:function(a,b){if(!b)return null;
+for(var c=b.parentTId?b.getParentNode():e.getRoot(a),c=e.nodeChildren(a,c),d=0,f=c.length-1;d<=f;d++)if(c[d]===b)return d==f?null:c[d+1];return null},getNodeByParam:function(a,b,c,d){if(!b||!c)return null;for(var f=0,i=b.length;f<i;f++){var m=b[f];if(m[c]==d)return b[f];m=e.nodeChildren(a,m);if(m=e.getNodeByParam(a,m,c,d))return m}return null},getNodeCache:function(a,b){if(!b)return null;var c=x[a.treeId].nodes[e.getNodeCacheId(b)];return c?c:null},getNodePath:function(a,b){if(!b)return null;var c;
+(c=b.parentTId?b.getParentNode().getPath():[])&&c.push(b);return c},getNodes:function(a){return e.nodeChildren(a,e.getRoot(a))},getNodesByParam:function(a,b,c,d){if(!b||!c)return[];for(var f=[],i=0,m=b.length;i<m;i++){var k=b[i];k[c]==d&&f.push(k);k=e.nodeChildren(a,k);f=f.concat(e.getNodesByParam(a,k,c,d))}return f},getNodesByParamFuzzy:function(a,b,c,d){if(!b||!c)return[];for(var f=[],d=d.toLowerCase(),i=0,m=b.length;i<m;i++){var k=b[i];typeof k[c]=="string"&&b[i][c].toLowerCase().indexOf(d)>-1&&
+f.push(k);k=e.nodeChildren(a,k);f=f.concat(e.getNodesByParamFuzzy(a,k,c,d))}return f},getNodesByFilter:function(a,b,c,d,f){if(!b)return d?null:[];for(var i=d?null:[],m=0,k=b.length;m<k;m++){var g=b[m];if(h.apply(c,[g,f],!1)){if(d)return g;i.push(g)}g=e.nodeChildren(a,g);g=e.getNodesByFilter(a,g,c,d,f);if(d&&g)return g;i=d?g:i.concat(g)}return i},getPreNode:function(a,b){if(!b)return null;for(var c=b.parentTId?b.getParentNode():e.getRoot(a),c=e.nodeChildren(a,c),d=0,f=c.length;d<f;d++)if(c[d]===b)return d==
+0?null:c[d-1];return null},getRoot:function(a){return a?w[a.treeId]:null},getRoots:function(){return w},getSetting:function(a){return t[a]},getSettings:function(){return t},getZTreeTools:function(a){return(a=this.getRoot(this.getSetting(a)))?a.treeTools:null},initCache:function(a){for(var b=0,c=A.length;b<c;b++)A[b].apply(this,arguments)},initNode:function(a,b,c,d,e,i){for(var m=0,g=B.length;m<g;m++)B[m].apply(this,arguments)},initRoot:function(a){for(var b=0,c=C.length;b<c;b++)C[b].apply(this,arguments)},
+isSelectedNode:function(a,b){for(var c=e.getRoot(a),d=0,f=c.curSelectedList.length;d<f;d++)if(b===c.curSelectedList[d])return!0;return!1},nodeChildren:function(a,b,c){if(!b)return null;a=a.data.key.children;typeof c!=="undefined"&&(b[a]=c);return b[a]},nodeIsParent:function(a,b,c){if(!b)return!1;a=a.data.key.isParent;typeof c!=="undefined"&&(typeof c==="string"&&(c=h.eqs(c,"true")),b[a]=!!c);return b[a]},nodeName:function(a,b,c){a=a.data.key.name;typeof c!=="undefined"&&(b[a]=c);return""+b[a]},nodeTitle:function(a,
+b){return""+b[a.data.key.title===""?a.data.key.name:a.data.key.title]},removeNodeCache:function(a,b){var c=e.nodeChildren(a,b);if(c)for(var d=0,f=c.length;d<f;d++)e.removeNodeCache(a,c[d]);e.getCache(a).nodes[e.getNodeCacheId(b.tId)]=null},removeSelectedNode:function(a,b){for(var c=e.getRoot(a),d=0,f=c.curSelectedList.length;d<f;d++)if(b===c.curSelectedList[d]||!e.getNodeCache(a,c.curSelectedList[d].tId))c.curSelectedList.splice(d,1),a.treeObj.trigger(g.event.UNSELECTED,[a.treeId,b]),d--,f--},setCache:function(a,
+b){x[a.treeId]=b},setRoot:function(a,b){w[a.treeId]=b},setZTreeTools:function(a,b){for(var c=0,d=H.length;c<d;c++)H[c].apply(this,arguments)},transformToArrayFormat:function(a,b){function c(b){d.push(b);(b=e.nodeChildren(a,b))&&(d=d.concat(e.transformToArrayFormat(a,b)))}if(!b)return[];var d=[];if(h.isArray(b))for(var f=0,i=b.length;f<i;f++)c(b[f]);else c(b);return d},transformTozTreeFormat:function(a,b){var c,d,f=a.data.simpleData.idKey,i=a.data.simpleData.pIdKey;if(!f||f==""||!b)return[];if(h.isArray(b)){var g=
+[],k={};for(c=0,d=b.length;c<d;c++)k[b[c][f]]=b[c];for(c=0,d=b.length;c<d;c++){var j=k[b[c][i]];if(j&&b[c][f]!=b[c][i]){var o=e.nodeChildren(a,j);o||(o=e.nodeChildren(a,j,[]));o.push(b[c])}else g.push(b[c])}return g}else return[b]}},n={bindEvent:function(a){for(var b=0,c=y.length;b<c;b++)y[b].apply(this,arguments)},unbindEvent:function(a){for(var b=0,c=z.length;b<c;b++)z[b].apply(this,arguments)},bindTree:function(a){var b={treeId:a.treeId},c=a.treeObj;a.view.txtSelectedEnable||c.bind("selectstart",
+v).css({"-moz-user-select":"-moz-none"});c.bind("click",b,n.proxy);c.bind("dblclick",b,n.proxy);c.bind("mouseover",b,n.proxy);c.bind("mouseout",b,n.proxy);c.bind("mousedown",b,n.proxy);c.bind("mouseup",b,n.proxy);c.bind("contextmenu",b,n.proxy)},unbindTree:function(a){a.treeObj.unbind("selectstart",v).unbind("click",n.proxy).unbind("dblclick",n.proxy).unbind("mouseover",n.proxy).unbind("mouseout",n.proxy).unbind("mousedown",n.proxy).unbind("mouseup",n.proxy).unbind("contextmenu",n.proxy)},doProxy:function(a){for(var b=
+[],c=0,d=u.length;c<d;c++){var e=u[c].apply(this,arguments);b.push(e);if(e.stop)break}return b},proxy:function(a){var b=e.getSetting(a.data.treeId);if(!h.uCanDo(b,a))return!0;for(var b=n.doProxy(a),c=!0,d=0,f=b.length;d<f;d++){var i=b[d];i.nodeEventCallback&&(c=i.nodeEventCallback.apply(i,[a,i.node])&&c);i.treeEventCallback&&(c=i.treeEventCallback.apply(i,[a,i.node])&&c)}return c}};J=function(a,b){var c=e.getSetting(a.data.treeId);if(b.open){if(h.apply(c.callback.beforeCollapse,[c.treeId,b],!0)==
+!1)return!0}else if(h.apply(c.callback.beforeExpand,[c.treeId,b],!0)==!1)return!0;e.getRoot(c).expandTriggerFlag=!0;j.switchNode(c,b);return!0};K=function(a,b){var c=e.getSetting(a.data.treeId),d=c.view.autoCancelSelected&&(a.ctrlKey||a.metaKey)&&e.isSelectedNode(c,b)?0:c.view.autoCancelSelected&&(a.ctrlKey||a.metaKey)&&c.view.selectedMulti?2:1;if(h.apply(c.callback.beforeClick,[c.treeId,b,d],!0)==!1)return!0;d===0?j.cancelPreSelectedNode(c,b):j.selectNode(c,b,d===2);c.treeObj.trigger(g.event.CLICK,
+[a,c.treeId,b,d]);return!0};L=function(a,b){var c=e.getSetting(a.data.treeId);h.apply(c.callback.beforeMouseDown,[c.treeId,b],!0)&&h.apply(c.callback.onMouseDown,[a,c.treeId,b]);return!0};M=function(a,b){var c=e.getSetting(a.data.treeId);h.apply(c.callback.beforeMouseUp,[c.treeId,b],!0)&&h.apply(c.callback.onMouseUp,[a,c.treeId,b]);return!0};N=function(a,b){var c=e.getSetting(a.data.treeId);h.apply(c.callback.beforeDblClick,[c.treeId,b],!0)&&h.apply(c.callback.onDblClick,[a,c.treeId,b]);return!0};
+O=function(a,b){var c=e.getSetting(a.data.treeId);h.apply(c.callback.beforeRightClick,[c.treeId,b],!0)&&h.apply(c.callback.onRightClick,[a,c.treeId,b]);return typeof c.callback.onRightClick!="function"};v=function(a){a=a.originalEvent.srcElement.nodeName.toLowerCase();return a==="input"||a==="textarea"};var h={apply:function(a,b,c){return typeof a=="function"?a.apply(Q,b?b:[]):c},canAsync:function(a,b){var c=e.nodeChildren(a,b),d=e.nodeIsParent(a,b);return a.async.enable&&b&&d&&!(b.zAsync||c&&c.length>
+0)},clone:function(a){if(a===null)return null;var b=h.isArray(a)?[]:{},c;for(c in a)b[c]=a[c]instanceof Date?new Date(a[c].getTime()):typeof a[c]==="object"?h.clone(a[c]):a[c];return b},eqs:function(a,b){return a.toLowerCase()===b.toLowerCase()},isArray:function(a){return Object.prototype.toString.apply(a)==="[object Array]"},isElement:function(a){return typeof HTMLElement==="object"?a instanceof HTMLElement:a&&typeof a==="object"&&a!==null&&a.nodeType===1&&typeof a.nodeName==="string"},$:function(a,
+b,c){b&&typeof b!="string"&&(c=b,b="");return typeof a=="string"?r(a,c?c.treeObj.get(0).ownerDocument:null):r("#"+a.tId+b,c?c.treeObj:null)},getMDom:function(a,b,c){if(!b)return null;for(;b&&b.id!==a.treeId;){for(var d=0,e=c.length;b.tagName&&d<e;d++)if(h.eqs(b.tagName,c[d].tagName)&&b.getAttribute(c[d].attrName)!==null)return b;b=b.parentNode}return null},getNodeMainDom:function(a){return r(a).parent("li").get(0)||r(a).parentsUntil("li").parent().get(0)},isChildOrSelf:function(a,b){return r(a).closest("#"+
+b).length>0},uCanDo:function(){return!0}},j={addNodes:function(a,b,c,d,f){var i=e.nodeIsParent(a,b);if(!a.data.keep.leaf||!b||i)if(h.isArray(d)||(d=[d]),a.data.simpleData.enable&&(d=e.transformTozTreeFormat(a,d)),b){var i=l(b,g.id.SWITCH,a),m=l(b,g.id.ICON,a),k=l(b,g.id.UL,a);if(!b.open)j.replaceSwitchClass(b,i,g.folder.CLOSE),j.replaceIcoClass(b,m,g.folder.CLOSE),b.open=!1,k.css({display:"none"});e.addNodesData(a,b,c,d);j.createNodes(a,b.level+1,d,b,c);f||j.expandCollapseParentNode(a,b,!0)}else e.addNodesData(a,
+e.getRoot(a),c,d),j.createNodes(a,0,d,null,c)},appendNodes:function(a,b,c,d,f,i,g){if(!c)return[];var k=[],h=d?d:e.getRoot(a),h=e.nodeChildren(a,h),o,l;if(!h||f>=h.length-c.length)f=-1;for(var s=0,n=c.length;s<n;s++){var p=c[s];i&&(o=(f===0||h.length==c.length)&&s==0,l=f<0&&s==c.length-1,e.initNode(a,b,p,d,o,l,g),e.addNodeCache(a,p));o=e.nodeIsParent(a,p);l=[];var I=e.nodeChildren(a,p);I&&I.length>0&&(l=j.appendNodes(a,b+1,I,p,-1,i,g&&p.open));g&&(j.makeDOMNodeMainBefore(k,a,p),j.makeDOMNodeLine(k,
+a,p),e.getBeforeA(a,p,k),j.makeDOMNodeNameBefore(k,a,p),e.getInnerBeforeA(a,p,k),j.makeDOMNodeIcon(k,a,p),e.getInnerAfterA(a,p,k),j.makeDOMNodeNameAfter(k,a,p),e.getAfterA(a,p,k),o&&p.open&&j.makeUlHtml(a,p,k,l.join("")),j.makeDOMNodeMainAfter(k,a,p),e.addCreatedNode(a,p))}return k},appendParentULDom:function(a,b){var c=[],d=l(b,a);!d.get(0)&&b.parentTId&&(j.appendParentULDom(a,b.getParentNode()),d=l(b,a));var f=l(b,g.id.UL,a);f.get(0)&&f.remove();f=e.nodeChildren(a,b);f=j.appendNodes(a,b.level+1,
+f,b,-1,!1,!0);j.makeUlHtml(a,b,c,f.join(""));d.append(c.join(""))},asyncNode:function(a,b,c,d){var f,i;f=e.nodeIsParent(a,b);if(b&&!f)return h.apply(d),!1;else if(b&&b.isAjaxing)return!1;else if(h.apply(a.callback.beforeAsync,[a.treeId,b],!0)==!1)return h.apply(d),!1;if(b)b.isAjaxing=!0,l(b,g.id.ICON,a).attr({style:"","class":g.className.BUTTON+" "+g.className.ICO_LOADING});var m={},k=h.apply(a.async.autoParam,[a.treeId,b],a.async.autoParam);for(f=0,i=k.length;b&&f<i;f++){var q=k[f].split("="),o=
+q;q.length>1&&(o=q[1],q=q[0]);m[o]=b[q]}k=h.apply(a.async.otherParam,[a.treeId,b],a.async.otherParam);if(h.isArray(k))for(f=0,i=k.length;f<i;f+=2)m[k[f]]=k[f+1];else for(var n in k)m[n]=k[n];var s=e.getRoot(a)._ver;r.ajax({contentType:a.async.contentType,cache:!1,type:a.async.type,url:h.apply(a.async.url,[a.treeId,b],a.async.url),data:a.async.contentType.indexOf("application/json")>-1?JSON.stringify(m):m,dataType:a.async.dataType,headers:a.async.headers,xhrFields:a.async.xhrFields,success:function(i){if(s==
+e.getRoot(a)._ver){var f=[];try{f=!i||i.length==0?[]:typeof i=="string"?eval("("+i+")"):i}catch(k){f=i}if(b)b.isAjaxing=null,b.zAsync=!0;j.setNodeLineIcos(a,b);f&&f!==""?(f=h.apply(a.async.dataFilter,[a.treeId,b,f],f),j.addNodes(a,b,-1,f?h.clone(f):[],!!c)):j.addNodes(a,b,-1,[],!!c);a.treeObj.trigger(g.event.ASYNC_SUCCESS,[a.treeId,b,i]);h.apply(d)}},error:function(c,d,i){if(s==e.getRoot(a)._ver){if(b)b.isAjaxing=null;j.setNodeLineIcos(a,b);a.treeObj.trigger(g.event.ASYNC_ERROR,[a.treeId,b,c,d,i])}}});
+return!0},cancelPreSelectedNode:function(a,b,c){var d=e.getRoot(a).curSelectedList,f,i;for(f=d.length-1;f>=0;f--)if(i=d[f],b===i||!b&&(!c||c!==i))if(l(i,g.id.A,a).removeClass(g.node.CURSELECTED),b){e.removeSelectedNode(a,b);break}else d.splice(f,1),a.treeObj.trigger(g.event.UNSELECTED,[a.treeId,i])},createNodeCallback:function(a){if(a.callback.onNodeCreated||a.view.addDiyDom)for(var b=e.getRoot(a);b.createdNodes.length>0;){var c=b.createdNodes.shift();h.apply(a.view.addDiyDom,[a.treeId,c]);a.callback.onNodeCreated&&
+a.treeObj.trigger(g.event.NODECREATED,[a.treeId,c])}},createNodes:function(a,b,c,d,f){if(c&&c.length!=0){var i=e.getRoot(a),m=!d||d.open||!!l(e.nodeChildren(a,d)[0],a).get(0);i.createdNodes=[];var b=j.appendNodes(a,b,c,d,f,!0,m),k,h;d?(d=l(d,g.id.UL,a),d.get(0)&&(k=d)):k=a.treeObj;k&&(f>=0&&(h=k.children()[f]),f>=0&&h?r(h).before(b.join("")):k.append(b.join("")));j.createNodeCallback(a)}},destroy:function(a){a&&(e.initCache(a),e.initRoot(a),n.unbindTree(a),n.unbindEvent(a),a.treeObj.empty(),delete t[a.treeId])},
+expandCollapseNode:function(a,b,c,d,f){var i=e.getRoot(a),m;if(b){var k=e.nodeChildren(a,b),q=e.nodeIsParent(a,b);if(i.expandTriggerFlag)m=f,f=function(){m&&m();b.open?a.treeObj.trigger(g.event.EXPAND,[a.treeId,b]):a.treeObj.trigger(g.event.COLLAPSE,[a.treeId,b])},i.expandTriggerFlag=!1;if(!b.open&&q&&(!l(b,g.id.UL,a).get(0)||k&&k.length>0&&!l(k[0],a).get(0)))j.appendParentULDom(a,b),j.createNodeCallback(a);if(b.open==c)h.apply(f,[]);else{var c=l(b,g.id.UL,a),i=l(b,g.id.SWITCH,a),o=l(b,g.id.ICON,
+a);q?(b.open=!b.open,b.iconOpen&&b.iconClose&&o.attr("style",j.makeNodeIcoStyle(a,b)),b.open?(j.replaceSwitchClass(b,i,g.folder.OPEN),j.replaceIcoClass(b,o,g.folder.OPEN),d==!1||a.view.expandSpeed==""?(c.show(),h.apply(f,[])):k&&k.length>0?c.slideDown(a.view.expandSpeed,f):(c.show(),h.apply(f,[]))):(j.replaceSwitchClass(b,i,g.folder.CLOSE),j.replaceIcoClass(b,o,g.folder.CLOSE),d==!1||a.view.expandSpeed==""||!(k&&k.length>0)?(c.hide(),h.apply(f,[])):c.slideUp(a.view.expandSpeed,f))):h.apply(f,[])}}else h.apply(f,
+[])},expandCollapseParentNode:function(a,b,c,d,e){b&&(b.parentTId?(j.expandCollapseNode(a,b,c,d),b.parentTId&&j.expandCollapseParentNode(a,b.getParentNode(),c,d,e)):j.expandCollapseNode(a,b,c,d,e))},expandCollapseSonNode:function(a,b,c,d,f){var i=e.getRoot(a),i=b?e.nodeChildren(a,b):e.nodeChildren(a,i),g=b?!1:d,k=e.getRoot(a).expandTriggerFlag;e.getRoot(a).expandTriggerFlag=!1;if(i)for(var h=0,l=i.length;h<l;h++)i[h]&&j.expandCollapseSonNode(a,i[h],c,g);e.getRoot(a).expandTriggerFlag=k;j.expandCollapseNode(a,
+b,c,d,f)},isSelectedNode:function(a,b){if(!b)return!1;var c=e.getRoot(a).curSelectedList,d;for(d=c.length-1;d>=0;d--)if(b===c[d])return!0;return!1},makeDOMNodeIcon:function(a,b,c){var d=e.nodeName(b,c),d=b.view.nameIsHTML?d:d.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");a.push("<span id='",c.tId,g.id.ICON,"' title='' treeNode",g.id.ICON," class='",j.makeNodeIcoClass(b,c),"' style='",j.makeNodeIcoStyle(b,c),"'></span><span id='",c.tId,g.id.SPAN,"' class='",g.className.NAME,"'>",
+d,"</span>")},makeDOMNodeLine:function(a,b,c){a.push("<span id='",c.tId,g.id.SWITCH,"' title='' class='",j.makeNodeLineClass(b,c),"' treeNode",g.id.SWITCH,"></span>")},makeDOMNodeMainAfter:function(a){a.push("</li>")},makeDOMNodeMainBefore:function(a,b,c){a.push("<li id='",c.tId,"' class='",g.className.LEVEL,c.level,"' tabindex='0' hidefocus='true' treenode>")},makeDOMNodeNameAfter:function(a){a.push("</a>")},makeDOMNodeNameBefore:function(a,b,c){var d=e.nodeTitle(b,c),f=j.makeNodeUrl(b,c),i=j.makeNodeFontCss(b,
+c),m=[],k;for(k in i)m.push(k,":",i[k],";");a.push("<a id='",c.tId,g.id.A,"' class='",g.className.LEVEL,c.level,"' treeNode",g.id.A,' onclick="',c.click||"",'" ',f!=null&&f.length>0?"href='"+f+"'":""," target='",j.makeNodeTarget(c),"' style='",m.join(""),"'");h.apply(b.view.showTitle,[b.treeId,c],b.view.showTitle)&&d&&a.push("title='",d.replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">"),"'");a.push(">")},makeNodeFontCss:function(a,b){var c=h.apply(a.view.fontCss,[a.treeId,b],a.view.fontCss);
+return c&&typeof c!="function"?c:{}},makeNodeIcoClass:function(a,b){var c=["ico"];if(!b.isAjaxing){var d=e.nodeIsParent(a,b);c[0]=(b.iconSkin?b.iconSkin+"_":"")+c[0];d?c.push(b.open?g.folder.OPEN:g.folder.CLOSE):c.push(g.folder.DOCU)}return g.className.BUTTON+" "+c.join("_")},makeNodeIcoStyle:function(a,b){var c=[];if(!b.isAjaxing){var d=e.nodeIsParent(a,b)&&b.iconOpen&&b.iconClose?b.open?b.iconOpen:b.iconClose:b[a.data.key.icon];d&&c.push("background:url(",d,") 0 0 no-repeat;");(a.view.showIcon==
+!1||!h.apply(a.view.showIcon,[a.treeId,b],!0))&&c.push("width:0px;height:0px;")}return c.join("")},makeNodeLineClass:function(a,b){var c=[];a.view.showLine?b.level==0&&b.isFirstNode&&b.isLastNode?c.push(g.line.ROOT):b.level==0&&b.isFirstNode?c.push(g.line.ROOTS):b.isLastNode?c.push(g.line.BOTTOM):c.push(g.line.CENTER):c.push(g.line.NOLINE);e.nodeIsParent(a,b)?c.push(b.open?g.folder.OPEN:g.folder.CLOSE):c.push(g.folder.DOCU);return j.makeNodeLineClassEx(b)+c.join("_")},makeNodeLineClassEx:function(a){return g.className.BUTTON+
+" "+g.className.LEVEL+a.level+" "+g.className.SWITCH+" "},makeNodeTarget:function(a){return a.target||"_blank"},makeNodeUrl:function(a,b){var c=a.data.key.url;return b[c]?b[c]:null},makeUlHtml:function(a,b,c,d){c.push("<ul id='",b.tId,g.id.UL,"' class='",g.className.LEVEL,b.level," ",j.makeUlLineClass(a,b),"' style='display:",b.open?"block":"none","'>");c.push(d);c.push("</ul>")},makeUlLineClass:function(a,b){return a.view.showLine&&!b.isLastNode?g.line.LINE:""},removeChildNodes:function(a,b){if(b){var c=
+e.nodeChildren(a,b);if(c){for(var d=0,f=c.length;d<f;d++)e.removeNodeCache(a,c[d]);e.removeSelectedNode(a);delete b[a.data.key.children];a.data.keep.parent?l(b,g.id.UL,a).empty():(e.nodeIsParent(a,b,!1),b.open=!1,c=l(b,g.id.SWITCH,a),d=l(b,g.id.ICON,a),j.replaceSwitchClass(b,c,g.folder.DOCU),j.replaceIcoClass(b,d,g.folder.DOCU),l(b,g.id.UL,a).remove())}}},scrollIntoView:function(a,b){if(b)if(typeof Element==="undefined"){var c=a.treeObj.get(0).getBoundingClientRect(),d=b.getBoundingClientRect();(d.top<
+c.top||d.bottom>c.bottom||d.right>c.right||d.left<c.left)&&b.scrollIntoView()}else{if(!Element.prototype.scrollIntoViewIfNeeded)Element.prototype.scrollIntoViewIfNeeded=function(a){function b(a,c){return{start:a,length:c,end:a+c}}function c(b,d){return!1===a||d.start<b.end&&b.start<d.end?Math.max(b.end-d.length,Math.min(d.start,b.start)):(b.start+b.end-d.length)/2}function d(a,b){return{x:a,y:b,translate:function(c,i){return d(a+c,b+i)}}}function e(a,b){for(;a;)b=b.translate(a.offsetLeft,a.offsetTop),
+a=a.offsetParent;return b}for(var g=e(this,d(0,0)),j=d(this.offsetWidth,this.offsetHeight),h=this.parentNode,l;h instanceof HTMLElement;)l=e(h,d(h.clientLeft,h.clientTop)),h.scrollLeft=c(b(g.x-l.x,j.x),b(h.scrollLeft,h.clientWidth)),h.scrollTop=c(b(g.y-l.y,j.y),b(h.scrollTop,h.clientHeight)),g=g.translate(-h.scrollLeft,-h.scrollTop),h=h.parentNode};b.scrollIntoViewIfNeeded()}},setFirstNode:function(a,b){var c=e.nodeChildren(a,b);if(c.length>0)c[0].isFirstNode=!0},setLastNode:function(a,b){var c=e.nodeChildren(a,
+b);if(c.length>0)c[c.length-1].isLastNode=!0},removeNode:function(a,b){var c=e.getRoot(a),d=b.parentTId?b.getParentNode():c;b.isFirstNode=!1;b.isLastNode=!1;b.getPreNode=function(){return null};b.getNextNode=function(){return null};if(e.getNodeCache(a,b.tId)){l(b,a).remove();e.removeNodeCache(a,b);e.removeSelectedNode(a,b);for(var f=e.nodeChildren(a,d),i=0,h=f.length;i<h;i++)if(f[i].tId==b.tId){f.splice(i,1);break}j.setFirstNode(a,d);j.setLastNode(a,d);var k,i=f.length;if(!a.data.keep.parent&&i==
+0)e.nodeIsParent(a,d,!1),d.open=!1,delete d[a.data.key.children],i=l(d,g.id.UL,a),h=l(d,g.id.SWITCH,a),k=l(d,g.id.ICON,a),j.replaceSwitchClass(d,h,g.folder.DOCU),j.replaceIcoClass(d,k,g.folder.DOCU),i.css("display","none");else if(a.view.showLine&&i>0){var q=f[i-1],i=l(q,g.id.UL,a),h=l(q,g.id.SWITCH,a);k=l(q,g.id.ICON,a);d==c?f.length==1?j.replaceSwitchClass(q,h,g.line.ROOT):(c=l(f[0],g.id.SWITCH,a),j.replaceSwitchClass(f[0],c,g.line.ROOTS),j.replaceSwitchClass(q,h,g.line.BOTTOM)):j.replaceSwitchClass(q,
+h,g.line.BOTTOM);i.removeClass(g.line.LINE)}}},replaceIcoClass:function(a,b,c){if(b&&!a.isAjaxing&&(a=b.attr("class"),a!=void 0)){a=a.split("_");switch(c){case g.folder.OPEN:case g.folder.CLOSE:case g.folder.DOCU:a[a.length-1]=c}b.attr("class",a.join("_"))}},replaceSwitchClass:function(a,b,c){if(b){var d=b.attr("class");if(d!=void 0){d=d.split("_");switch(c){case g.line.ROOT:case g.line.ROOTS:case g.line.CENTER:case g.line.BOTTOM:case g.line.NOLINE:d[0]=j.makeNodeLineClassEx(a)+c;break;case g.folder.OPEN:case g.folder.CLOSE:case g.folder.DOCU:d[1]=
+c}b.attr("class",d.join("_"));c!==g.folder.DOCU?b.removeAttr("disabled"):b.attr("disabled","disabled")}}},selectNode:function(a,b,c){c||j.cancelPreSelectedNode(a,null,b);l(b,g.id.A,a).addClass(g.node.CURSELECTED);e.addSelectedNode(a,b);a.treeObj.trigger(g.event.SELECTED,[a.treeId,b])},setNodeFontCss:function(a,b){var c=l(b,g.id.A,a),d=j.makeNodeFontCss(a,b);d&&c.css(d)},setNodeLineIcos:function(a,b){if(b){var c=l(b,g.id.SWITCH,a),d=l(b,g.id.UL,a),f=l(b,g.id.ICON,a),i=j.makeUlLineClass(a,b);i.length==
+0?d.removeClass(g.line.LINE):d.addClass(i);c.attr("class",j.makeNodeLineClass(a,b));e.nodeIsParent(a,b)?c.removeAttr("disabled"):c.attr("disabled","disabled");f.removeAttr("style");f.attr("style",j.makeNodeIcoStyle(a,b));f.attr("class",j.makeNodeIcoClass(a,b))}},setNodeName:function(a,b){var c=e.nodeTitle(a,b),d=l(b,g.id.SPAN,a);d.empty();a.view.nameIsHTML?d.html(e.nodeName(a,b)):d.text(e.nodeName(a,b));h.apply(a.view.showTitle,[a.treeId,b],a.view.showTitle)&&l(b,g.id.A,a).attr("title",!c?"":c)},
+setNodeTarget:function(a,b){l(b,g.id.A,a).attr("target",j.makeNodeTarget(b))},setNodeUrl:function(a,b){var c=l(b,g.id.A,a),d=j.makeNodeUrl(a,b);d==null||d.length==0?c.removeAttr("href"):c.attr("href",d)},switchNode:function(a,b){b.open||!h.canAsync(a,b)?j.expandCollapseNode(a,b,!b.open):a.async.enable?j.asyncNode(a,b)||j.expandCollapseNode(a,b,!b.open):b&&j.expandCollapseNode(a,b,!b.open)}};r.fn.zTree={consts:{className:{BUTTON:"button",LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch",NAME:"node_name"},
+event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open",CLOSE:"close",DOCU:"docu"},node:{CURSELECTED:"curSelectedNode"}},_z:{tools:h,
+view:j,event:n,data:e},getZTreeObj:function(a){return(a=e.getZTreeTools(a))?a:null},destroy:function(a){if(a&&a.length>0)j.destroy(e.getSetting(a));else for(var b in t)j.destroy(t[b])},init:function(a,b,c){var d=h.clone(P);r.extend(!0,d,b);d.treeId=a.attr("id");d.treeObj=a;d.treeObj.empty();t[d.treeId]=d;if(typeof document.body.style.maxHeight==="undefined")d.view.expandSpeed="";e.initRoot(d);a=e.getRoot(d);c=c?h.clone(h.isArray(c)?c:[c]):[];d.data.simpleData.enable?e.nodeChildren(d,a,e.transformTozTreeFormat(d,
+c)):e.nodeChildren(d,a,c);e.initCache(d);n.unbindTree(d);n.bindTree(d);n.unbindEvent(d);n.bindEvent(d);var f={setting:d,addNodes:function(a,b,c,f){function g(){j.addNodes(d,a,b,n,f==!0)}a||(a=null);var l=e.nodeIsParent(d,a);if(a&&!l&&d.data.keep.leaf)return null;l=parseInt(b,10);isNaN(l)?(f=!!c,c=b,b=-1):b=l;if(!c)return null;var n=h.clone(h.isArray(c)?c:[c]);h.canAsync(d,a)?j.asyncNode(d,a,f,g):g();return n},cancelSelectedNode:function(a){j.cancelPreSelectedNode(d,a)},destroy:function(){j.destroy(d)},
+expandAll:function(a){a=!!a;j.expandCollapseSonNode(d,null,a,!0);return a},expandNode:function(a,b,c,f,g){function n(){var b=l(a,d).get(0);b&&f!==!1&&j.scrollIntoView(d,b)}if(!a||!e.nodeIsParent(d,a))return null;b!==!0&&b!==!1&&(b=!a.open);if((g=!!g)&&b&&h.apply(d.callback.beforeExpand,[d.treeId,a],!0)==!1)return null;else if(g&&!b&&h.apply(d.callback.beforeCollapse,[d.treeId,a],!0)==!1)return null;b&&a.parentTId&&j.expandCollapseParentNode(d,a.getParentNode(),b,!1);if(b===a.open&&!c)return null;
+e.getRoot(d).expandTriggerFlag=g;!h.canAsync(d,a)&&c?j.expandCollapseSonNode(d,a,b,!0,n):(a.open=!b,j.switchNode(this.setting,a),n());return b},getNodes:function(){return e.getNodes(d)},getNodeByParam:function(a,b,c){return!a?null:e.getNodeByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodeByTId:function(a){return e.getNodeCache(d,a)},getNodesByParam:function(a,b,c){return!a?null:e.getNodesByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByParamFuzzy:function(a,b,c){return!a?null:
+e.getNodesByParamFuzzy(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByFilter:function(a,b,c,f){b=!!b;return!a||typeof a!="function"?b?null:[]:e.getNodesByFilter(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b,f)},getNodeIndex:function(a){if(!a)return null;for(var b=a.parentTId?a.getParentNode():e.getRoot(d),b=e.nodeChildren(d,b),c=0,f=b.length;c<f;c++)if(b[c]==a)return c;return-1},getSelectedNodes:function(){for(var a=[],b=e.getRoot(d).curSelectedList,c=0,f=b.length;c<f;c++)a.push(b[c]);return a},
+isSelectedNode:function(a){return e.isSelectedNode(d,a)},reAsyncChildNodesPromise:function(a,b,c){return new Promise(function(d,e){try{f.reAsyncChildNodes(a,b,c,function(){d(a)})}catch(g){e(g)}})},reAsyncChildNodes:function(a,b,c,f){if(this.setting.async.enable){var h=!a;h&&(a=e.getRoot(d));if(b=="refresh"){for(var b=e.nodeChildren(d,a),n=0,r=b?b.length:0;n<r;n++)e.removeNodeCache(d,b[n]);e.removeSelectedNode(d);e.nodeChildren(d,a,[]);h?this.setting.treeObj.empty():l(a,g.id.UL,d).empty()}j.asyncNode(this.setting,
+h?null:a,!!c,f)}},refresh:function(){this.setting.treeObj.empty();var a=e.getRoot(d),b=e.nodeChildren(d,a);e.initRoot(d);e.nodeChildren(d,a,b);e.initCache(d);j.createNodes(d,0,e.nodeChildren(d,a),null,-1)},removeChildNodes:function(a){if(!a)return null;var b=e.nodeChildren(d,a);j.removeChildNodes(d,a);return b?b:null},removeNode:function(a,b){a&&(b=!!b,b&&h.apply(d.callback.beforeRemove,[d.treeId,a],!0)==!1||(j.removeNode(d,a),b&&this.setting.treeObj.trigger(g.event.REMOVE,[d.treeId,a])))},selectNode:function(a,
+b,c){function e(){if(!c){var b=l(a,d).get(0);j.scrollIntoView(d,b)}}if(a&&h.uCanDo(d)){b=d.view.selectedMulti&&b;if(a.parentTId)j.expandCollapseParentNode(d,a.getParentNode(),!0,!1,e);else if(!c)try{l(a,d).focus().blur()}catch(f){}j.selectNode(d,a,b)}},transformTozTreeNodes:function(a){return e.transformTozTreeFormat(d,a)},transformToArray:function(a){return e.transformToArrayFormat(d,a)},updateNode:function(a){a&&l(a,d).get(0)&&h.uCanDo(d)&&(j.setNodeName(d,a),j.setNodeTarget(d,a),j.setNodeUrl(d,
+a),j.setNodeLineIcos(d,a),j.setNodeFontCss(d,a))}};a.treeTools=f;e.setZTreeTools(d,f);(c=e.nodeChildren(d,a))&&c.length>0?j.createNodes(d,0,c,null,-1):d.async.enable&&d.async.url&&d.async.url!==""&&j.asyncNode(d);return f}};var Q=r.fn.zTree,l=h.$,g=Q.consts})(jQuery);
+
+/*
+ * JQuery zTree excheck v3.5.37
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-08-21
+ */
+(function(n){var q,r,s,p={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},w={check:{enable:!1,autoCheckTrigger:!1,chkStyle:p.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:p.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};q=function(c,
+a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId);if(i.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;var d=e.nodeChecked(b,a);e.nodeChecked(b,a,!d);f.checkNodeRelation(b,a);d=m(a,h.id.CHECK,b);f.setChkClass(b,d,a);f.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(h.event.CHECK,[c,b.treeId,a]);return!0};r=function(c,a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId),d=m(a,h.id.CHECK,b);a.check_Focus=!0;f.setChkClass(b,d,a);return!0};s=function(c,
+a){if(a.chkDisabled===!0)return!1;var b=e.getSetting(c.data.treeId),d=m(a,h.id.CHECK,b);a.check_Focus=!1;f.setChkClass(b,d,a);return!0};n.extend(!0,n.fn.zTree.consts,p);n.extend(!0,n.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,j;d=h.radio;b=e.nodeChecked(c,a);if(c.check.chkStyle==d.STYLE){var g=e.getRadioCheckedList(c);if(b)if(c.check.radioType==d.TYPE_ALL){for(d=g.length-1;d>=0;d--){b=g[d];var k=e.nodeChecked(c,b);k&&b!=a&&(e.nodeChecked(c,b,!1),g.splice(d,1),f.setChkClass(c,
+m(b,h.id.CHECK,c),b),b.parentTId!=a.parentTId&&f.repairParentChkClassWithSelf(c,b))}g.push(a)}else{g=a.parentTId?a.getParentNode():e.getRoot(c);g=e.nodeChildren(c,g);for(d=0,j=g.length;d<j;d++)if(b=g[d],(k=e.nodeChecked(c,b))&&b!=a)e.nodeChecked(c,b,!1),f.setChkClass(c,m(b,h.id.CHECK,c),b)}else if(c.check.radioType==d.TYPE_ALL)for(d=0,j=g.length;d<j;d++)if(a==g[d]){g.splice(d,1);break}}else g=e.nodeChildren(c,a),b&&(!g||g.length==0||c.check.chkboxType.Y.indexOf("s")>-1)&&f.setSonNodeCheckBox(c,a,
+!0),!b&&(!g||g.length==0||c.check.chkboxType.N.indexOf("s")>-1)&&f.setSonNodeCheckBox(c,a,!1),b&&c.check.chkboxType.Y.indexOf("p")>-1&&f.setParentNodeCheckBox(c,a,!0),!b&&c.check.chkboxType.N.indexOf("p")>-1&&f.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=h.checkbox,d=h.radio,j="",g=e.nodeChecked(c,a),j=a.chkDisabled===!0?b.DISABLED:a.halfCheck?b.PART:c.check.chkStyle==d.STYLE?a.check_Child_State<1?b.FULL:b.PART:g?a.check_Child_State===2||a.check_Child_State===-1?b.FULL:b.PART:
+a.check_Child_State<1?b.FULL:b.PART,d=c.check.chkStyle+"_"+(g?b.TRUE:b.FALSE)+"_"+j,d=a.check_Focus&&a.chkDisabled!==!0?d+"_"+b.FOCUS:d;return h.className.BUTTON+" "+b.DEFAULT+" "+d},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===h.checkbox.STYLE)for(var b=e.getRoot(c),b=e.nodeChildren(c,b),d=0,j=b.length;d<j;d++){var g=b[d];g.nocheck!==!0&&g.chkDisabled!==!0&&e.nodeChecked(c,g,a);f.setSonNodeCheckBox(c,g,a)}},repairChkClass:function(c,a){if(a&&(e.makeChkFlag(c,a),a.nocheck!==!0)){var b=
+m(a,h.id.CHECK,c);f.setChkClass(c,b,a)}},repairParentChkClass:function(c,a){if(a&&a.parentTId){var b=a.getParentNode();f.repairChkClass(c,b);f.repairParentChkClass(c,b)}},repairParentChkClassWithSelf:function(c,a){if(a){var b=e.nodeChildren(c,a);b&&b.length>0?f.repairParentChkClass(c,b[0]):f.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b)a.chkDisabled=b;f.repairChkClass(c,a);if((a=e.nodeChildren(c,a))&&d)for(var j=0,g=a.length;j<g;j++)f.repairSonChkDisabled(c,
+a[j],b,d)}},repairParentChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b&&d)a.chkDisabled=b;f.repairChkClass(c,a);f.repairParentChkDisabled(c,a.getParentNode(),b,d)}},setChkClass:function(c,a,b){a&&(b.nocheck===!0?a.hide():a.show(),a.attr("class",f.makeChkClass(c,b)))},setParentNodeCheckBox:function(c,a,b,d){var j=m(a,h.id.CHECK,c);d||(d=a);e.makeChkFlag(c,a);a.nocheck!==!0&&a.chkDisabled!==!0&&(e.nodeChecked(c,a,b),f.setChkClass(c,j,a),c.check.autoCheckTrigger&&a!=d&&c.treeObj.trigger(h.event.CHECK,
+[null,c.treeId,a]));if(a.parentTId){j=!0;if(!b)for(var g=e.nodeChildren(c,a.getParentNode()),k=0,o=g.length;k<o;k++){var l=g[k],i=e.nodeChecked(c,l);if(l.nocheck!==!0&&l.chkDisabled!==!0&&i||(l.nocheck===!0||l.chkDisabled===!0)&&l.check_Child_State>0){j=!1;break}}j&&f.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var j=m(a,h.id.CHECK,c);d||(d=a);var g=!1,k=e.nodeChildren(c,a);if(k)for(var o=0,l=k.length;o<l;o++){var i=k[o];f.setSonNodeCheckBox(c,i,b,d);
+i.chkDisabled===!0&&(g=!0)}if(a!=e.getRoot(c)&&a.chkDisabled!==!0){g&&a.nocheck!==!0&&e.makeChkFlag(c,a);if(a.nocheck!==!0&&a.chkDisabled!==!0){if(e.nodeChecked(c,a,b),!g)a.check_Child_State=k&&k.length>0?b?2:0:-1}else a.check_Child_State=-1;f.setChkClass(c,j,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(h.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=e.getRoot(c).radioCheckedList,b=0,d=a.length;b<d;b++)e.getNodeCache(c,
+a[b].tId)||(a.splice(b,1),b--,d--);return a},getCheckStatus:function(c,a){if(!c.check.enable||a.nocheck||a.chkDisabled)return null;var b=e.nodeChecked(c,a);return{checked:b,half:a.halfCheck?a.halfCheck:c.check.chkStyle==h.radio.STYLE?a.check_Child_State===2:b?a.check_Child_State>-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var j=b&&c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL,d=!d?[]:d,g=0,f=a.length;g<f;g++){var i=
+a[g],l=e.nodeChildren(c,i),m=e.nodeChecked(c,i);if(i.nocheck!==!0&&i.chkDisabled!==!0&&m==b&&(d.push(i),j))break;e.getTreeCheckedNodes(c,l,b,d);if(j&&d.length>0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var b=!b?[]:b,d=0,j=a.length;d<j;d++){var g=a[d],f=e.nodeChildren(c,g),h=e.nodeChecked(c,g);g.nocheck!==!0&&g.chkDisabled!==!0&&h!=g.checkedOld&&b.push(g);e.getTreeChangeCheckedNodes(c,f,b)}return b},makeChkFlag:function(c,a){if(a){var b=-1,d=e.nodeChildren(c,a);
+if(d)for(var j=0,g=d.length;j<g;j++){var f=d[j],i=e.nodeChecked(c,f),l=-1;if(c.check.chkStyle==h.radio.STYLE)if(l=f.nocheck===!0||f.chkDisabled===!0?f.check_Child_State:f.halfCheck===!0?2:i?2:f.check_Child_State>0?2:0,l==2){b=2;break}else l==0&&(b=0);else if(c.check.chkStyle==h.checkbox.STYLE)if(l=f.nocheck===!0||f.chkDisabled===!0?f.check_Child_State:f.halfCheck===!0?1:i?f.check_Child_State===-1||f.check_Child_State===2?2:1:f.check_Child_State>0?1:0,l===1){b=1;break}else if(l===2&&b>-1&&j>0&&l!==
+b){b=1;break}else if(b===2&&l>-1&&l<2){b=1;break}else l>-1&&(b=l)}a.check_Child_State=b}}}});var n=n.fn.zTree,i=n._z.tools,h=n.consts,f=n._z.view,e=n._z.data,m=i.$;e.nodeChecked=function(c,a,b){if(!a)return!1;c=c.data.key.checked;typeof b!=="undefined"&&(typeof b==="string"&&(b=i.eqs(b,"true")),a[c]=!!b);return a[c]};e.exSetting(w);e.addInitBind(function(c){c.treeObj.bind(h.event.CHECK,function(a,b,d,e){a.srcEvent=b;i.apply(c.callback.onCheck,[a,d,e])})});e.addInitUnBind(function(c){c.treeObj.unbind(h.event.CHECK)});
+e.addInitCache(function(){});e.addInitNode(function(c,a,b,d){if(b){a=e.nodeChecked(c,b);a=e.nodeChecked(c,b,a);b.checkedOld=a;if(typeof b.nocheck=="string")b.nocheck=i.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=i.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=i.eqs(b.halfCheck,"true");b.halfCheck=!!b.halfCheck;
+b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return e.getCheckStatus(c,b)};c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL&&a&&e.getRoot(c).radioCheckedList.push(b)}});e.addInitProxy(function(c){var a=c.target,b=e.getSetting(c.data.treeId),d="",f=null,g="",k=null;if(i.eqs(c.type,"mouseover")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoverCheck"}else if(i.eqs(c.type,"mouseout")){if(b.check.enable&&
+i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoutCheck"}else if(i.eqs(c.type,"click")&&b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="checkNode";if(d.length>0)switch(f=e.getNodeCache(b,d),g){case "checkNode":k=q;break;case "mouseoverCheck":k=r;break;case "mouseoutCheck":k=s}return{stop:g==="checkNode",node:f,nodeEventType:g,nodeEventCallback:k,treeEventType:"",treeEventCallback:null}},
+!0);e.addInitRoot(function(c){e.getRoot(c).radioCheckedList=[]});e.addBeforeA(function(c,a,b){c.check.enable&&(e.makeChkFlag(c,a),b.push("<span ID='",a.tId,h.id.CHECK,"' class='",f.makeChkClass(c,a),"' treeNode",h.id.CHECK,a.nocheck===!0?" style='display:none;'":"","></span>"))});e.addZTreeTools(function(c,a){a.checkNode=function(a,b,g,k){var o=e.nodeChecked(c,a);if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!o),k=!!k,(o!==b||g)&&!(k&&i.apply(this.setting.callback.beforeCheck,[this.setting.treeId,a],
+!0)==!1)&&i.uCanDo(this.setting)&&this.setting.check.enable&&a.nocheck!==!0))e.nodeChecked(c,a,b),b=m(a,h.id.CHECK,this.setting),(g||this.setting.check.chkStyle===h.radio.STYLE)&&f.checkNodeRelation(this.setting,a),f.setChkClass(this.setting,b,a),f.repairParentChkClassWithSelf(this.setting,a),k&&this.setting.treeObj.trigger(h.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){f.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var a=a!==!1,b=e.nodeChildren(c,e.getRoot(this.setting));
+return e.getTreeCheckedNodes(this.setting,b,a)};a.getChangeCheckedNodes=function(){var a=e.nodeChildren(c,e.getRoot(this.setting));return e.getTreeChangeCheckedNodes(this.setting,a)};a.setChkDisabled=function(a,b,c,e){b=!!b;c=!!c;f.repairSonChkDisabled(this.setting,a,b,!!e);f.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,e){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&m(c,this.setting).get(0)&&i.uCanDo(this.setting)){var g=m(c,
+h.id.CHECK,this.setting);(e==!0||this.setting.check.chkStyle===h.radio.STYLE)&&f.checkNodeRelation(this.setting,c);f.setChkClass(this.setting,g,c);f.repairParentChkClassWithSelf(this.setting,c)}}});var t=f.createNodes;f.createNodes=function(c,a,b,d,e){t&&t.apply(f,arguments);b&&f.repairParentChkClassWithSelf(c,d)};var u=f.removeNode;f.removeNode=function(c,a){var b=a.getParentNode();u&&u.apply(f,arguments);a&&b&&(f.repairChkClass(c,b),f.repairParentChkClass(c,b))};var v=f.appendNodes;f.appendNodes=
+function(c,a,b,d,h,g,i){var m="";v&&(m=v.apply(f,arguments));d&&e.makeChkFlag(c,d);return m}})(jQuery);
+
+/*
+ * JQuery zTree exedit v3.5.37
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-08-21
+ */
+(function(B){var I={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},v={onHoverOverNode:function(a,b){var c=i.getSetting(a.data.treeId),d=i.getRoot(c);if(d.curHoverNode!=b)v.onHoverOutNode(a);d.curHoverNode=b;e.addHoverDom(c,b)},onHoverOutNode:function(a){var a=
+i.getSetting(a.data.treeId),b=i.getRoot(a);if(b.curHoverNode&&!i.isSelectedNode(a,b.curHoverNode))e.removeTreeDom(a,b.curHoverNode),b.curHoverNode=null},onMousedownNode:function(a,b){function c(a){if(m.dragFlag==0&&Math.abs(N-a.clientX)<f.edit.drag.minMoveSize&&Math.abs(O-a.clientY)<f.edit.drag.minMoveSize)return!0;var b,c,g,j;L.css("cursor","pointer");if(m.dragFlag==0){if(k.apply(f.callback.beforeDrag,[f.treeId,n],!0)==!1)return l(a),!0;for(b=0,c=n.length;b<c;b++){if(b==0)m.dragNodeShowBefore=[];
+g=n[b];i.nodeIsParent(f,g)&&g.open?(e.expandCollapseNode(f,g,!g.open),m.dragNodeShowBefore[g.tId]=!0):m.dragNodeShowBefore[g.tId]=!1}m.dragFlag=1;y.showHoverDom=!1;k.showIfameMask(f,!0);j=!0;var p=-1;if(n.length>1){var o=n[0].parentTId?i.nodeChildren(f,n[0].getParentNode()):i.getNodes(f);g=[];for(b=0,c=o.length;b<c;b++)if(m.dragNodeShowBefore[o[b].tId]!==void 0&&(j&&p>-1&&p+1!==b&&(j=!1),g.push(o[b]),p=b),n.length===g.length){n=g;break}}j&&(H=n[0].getPreNode(),Q=n[n.length-1].getNextNode());C=q("<ul class='zTreeDragUL'></ul>",
+f);for(b=0,c=n.length;b<c;b++)g=n[b],g.editNameFlag=!1,e.selectNode(f,g,b>0),e.removeTreeDom(f,g),b>f.edit.drag.maxShowNodeNum-1||(j=q("<li id='"+g.tId+"_tmp'></li>",f),j.append(q(g,d.id.A,f).clone()),j.css("padding","0"),j.children("#"+g.tId+d.id.A).removeClass(d.node.CURSELECTED),C.append(j),b==f.edit.drag.maxShowNodeNum-1&&(j=q("<li id='"+g.tId+"_moretmp'><a> ... </a></li>",f),C.append(j)));C.attr("id",n[0].tId+d.id.UL+"_tmp");C.addClass(f.treeObj.attr("class"));C.appendTo(L);u=q("<span class='tmpzTreeMove_arrow'></span>",
+f);u.attr("id","zTreeMove_arrow_tmp");u.appendTo(L);f.treeObj.trigger(d.event.DRAG,[a,f.treeId,n])}if(m.dragFlag==1){t&&u.attr("id")==a.target.id&&w&&a.clientX+G.scrollLeft()+2>B("#"+w+d.id.A,t).offset().left?(g=B("#"+w+d.id.A,t),a.target=g.length>0?g.get(0):a.target):t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));
+w=t=null;J=!1;h=f;g=i.getSettings();for(var z in g)if(g[z].treeId&&g[z].edit.enable&&g[z].treeId!=f.treeId&&(a.target.id==g[z].treeId||B(a.target).parents("#"+g[z].treeId).length>0))J=!0,h=g[z];z=G.scrollTop();j=G.scrollLeft();p=h.treeObj.offset();b=h.treeObj.get(0).scrollHeight;g=h.treeObj.get(0).scrollWidth;c=a.clientY+z-p.top;var E=h.treeObj.height()+p.top-a.clientY-z,r=a.clientX+j-p.left,s=h.treeObj.width()+p.left-a.clientX-j,p=c<f.edit.drag.borderMax&&c>f.edit.drag.borderMin,o=E<f.edit.drag.borderMax&&
+E>f.edit.drag.borderMin,F=r<f.edit.drag.borderMax&&r>f.edit.drag.borderMin,v=s<f.edit.drag.borderMax&&s>f.edit.drag.borderMin,E=c>f.edit.drag.borderMin&&E>f.edit.drag.borderMin&&r>f.edit.drag.borderMin&&s>f.edit.drag.borderMin,r=p&&h.treeObj.scrollTop()<=0,s=o&&h.treeObj.scrollTop()+h.treeObj.height()+10>=b,M=F&&h.treeObj.scrollLeft()<=0,P=v&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=g;if(a.target&&k.isChildOrSelf(a.target,h.treeId)){for(var D=a.target;D&&D.tagName&&!k.eqs(D.tagName,"li")&&D.id!=
+h.treeId;)D=D.parentNode;var R=!0;for(b=0,c=n.length;b<c;b++)if(g=n[b],D.id===g.tId){R=!1;break}else if(q(g,f).find("#"+D.id).length>0){R=!1;break}if(R&&a.target&&k.isChildOrSelf(a.target,D.id+d.id.A))t=B(D),w=D.id}g=n[0];if(E&&k.isChildOrSelf(a.target,h.treeId)){if(!t&&(a.target.id==h.treeId||r||s||M||P)&&(J||!J&&g.parentTId))t=h.treeObj;p?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):o&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);F?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):v&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+
+10);t&&t!=h.treeObj&&t.offset().left<h.treeObj.offset().left&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+t.offset().left-h.treeObj.offset().left)}C.css({top:a.clientY+z+3+"px",left:a.clientX+j+3+"px"});b=j=0;if(t&&t.attr("id")!=h.treeId){var A=w==null?null:i.getNodeCache(h,w),p=(a.ctrlKey||a.metaKey)&&f.edit.drag.isMove&&f.edit.drag.isCopy||!f.edit.drag.isMove&&f.edit.drag.isCopy;c=!!(H&&w===H.tId);F=!!(Q&&w===Q.tId);o=g.parentTId&&g.parentTId==w;g=(p||!F)&&k.apply(h.edit.drag.prev,[h.treeId,n,A],
+!!h.edit.drag.prev);c=(p||!c)&&k.apply(h.edit.drag.next,[h.treeId,n,A],!!h.edit.drag.next);p=(p||!o)&&!(h.data.keep.leaf&&!i.nodeIsParent(f,A))&&k.apply(h.edit.drag.inner,[h.treeId,n,A],!!h.edit.drag.inner);o=function(){t=null;w="";x=d.move.TYPE_INNER;u.css({display:"none"});if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null};if(!g&&!c&&!p)o();else if(F=B("#"+w+d.id.A,t),v=A.isLastNode?null:B("#"+A.getNextNode().tId+d.id.A,t.next()),E=F.offset().top,r=
+F.offset().left,s=g?p?0.25:c?0.5:1:-1,M=c?p?0.75:g?0.5:0:-1,z=(a.clientY+z-E)/F.height(),(s==1||z<=s&&z>=-0.2)&&g?(j=1-u.width(),b=E-u.height()/2,x=d.move.TYPE_PREV):(M==0||z>=M&&z<=1.2)&&c?(j=1-u.width(),b=v==null||i.nodeIsParent(f,A)&&A.open?E+F.height()-u.height()/2:v.offset().top-u.height()/2,x=d.move.TYPE_NEXT):p?(j=5-u.width(),b=E,x=d.move.TYPE_INNER):o(),t){u.css({display:"block",top:b+"px",left:r+j+"px"});F.addClass(d.node.TMPTARGET_NODE+"_"+x);if(S!=w||T!=x)K=(new Date).getTime();if(A&&i.nodeIsParent(f,
+A)&&x==d.move.TYPE_INNER&&(z=!0,window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId!==A.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===A.tId&&(z=!1),z))window.zTreeMoveTimer=setTimeout(function(){x==d.move.TYPE_INNER&&A&&i.nodeIsParent(f,A)&&!A.open&&(new Date).getTime()-K>h.edit.drag.autoOpenTime&&k.apply(h.callback.beforeDragOpen,[h.treeId,A],!0)&&(e.switchNode(h,A),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND,
+[h.treeId,A]))},h.edit.drag.autoOpenTime+50),window.zTreeMoveTargetNodeTId=A.tId}}else if(x=d.move.TYPE_INNER,t&&k.apply(h.edit.drag.inner,[h.treeId,n,null],!!h.edit.drag.inner)?t.addClass(d.node.TMPTARGET_TREE):t=null,u.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;S=w;T=x;f.treeObj.trigger(d.event.DRAGMOVE,[a,f.treeId,n])}return!1}function l(a){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=
+null;T=S=null;G.unbind("mousemove",c);G.unbind("mouseup",l);G.unbind("selectstart",g);L.css("cursor","");t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));k.showIfameMask(f,!1);y.showHoverDom=!0;if(m.dragFlag!=0){m.dragFlag=0;var b,j,o;for(b=0,j=n.length;b<j;b++)o=n[b],i.nodeIsParent(f,o)&&m.dragNodeShowBefore[o.tId]&&
+!o.open&&(e.expandCollapseNode(f,o,!o.open),delete m.dragNodeShowBefore[o.tId]);C&&C.remove();u&&u.remove();var r=(a.ctrlKey||a.metaKey)&&f.edit.drag.isMove&&f.edit.drag.isCopy||!f.edit.drag.isMove&&f.edit.drag.isCopy;!r&&t&&w&&n[0].parentTId&&w==n[0].parentTId&&x==d.move.TYPE_INNER&&(t=null);if(t){var p=w==null?null:i.getNodeCache(h,w);if(k.apply(f.callback.beforeDrop,[h.treeId,n,p,x,r],!0)==!1)e.selectNodes(v,n);else{var s=r?k.clone(n):n;b=function(){if(J){if(!r)for(var b=0,c=n.length;b<c;b++)e.removeNode(f,
+n[b]);x==d.move.TYPE_INNER?e.addNodes(h,p,-1,s):e.addNodes(h,p.getParentNode(),x==d.move.TYPE_PREV?p.getIndex():p.getIndex()+1,s)}else if(r&&x==d.move.TYPE_INNER)e.addNodes(h,p,-1,s);else if(r)e.addNodes(h,p.getParentNode(),x==d.move.TYPE_PREV?p.getIndex():p.getIndex()+1,s);else if(x!=d.move.TYPE_NEXT)for(b=0,c=s.length;b<c;b++)e.moveNode(h,p,s[b],x,!1);else for(b=-1,c=s.length-1;b<c;c--)e.moveNode(h,p,s[c],x,!1);e.selectNodes(h,s);b=q(s[0],f).get(0);e.scrollIntoView(f,b);f.treeObj.trigger(d.event.DROP,
+[a,h.treeId,s,p,x,r])};x==d.move.TYPE_INNER&&k.canAsync(h,p)?e.asyncNode(h,p,!1,b):b()}}else e.selectNodes(v,n),f.treeObj.trigger(d.event.DROP,[a,f.treeId,n,null,null,null])}}function g(){return!1}var o,j,f=i.getSetting(a.data.treeId),m=i.getRoot(f),y=i.getRoots();if(a.button==2||!f.edit.enable||!f.edit.drag.isCopy&&!f.edit.drag.isMove)return!0;var r=a.target,s=i.getRoot(f).curSelectedList,n=[];if(i.isSelectedNode(f,b))for(o=0,j=s.length;o<j;o++){if(s[o].editNameFlag&&k.eqs(r.tagName,"input")&&r.getAttribute("treeNode"+
+d.id.INPUT)!==null)return!0;n.push(s[o]);if(n[0].parentTId!==s[o].parentTId){n=[b];break}}else n=[b];e.editNodeBlur=!0;e.cancelCurEditNode(f);var G=B(f.treeObj.get(0).ownerDocument),L=B(f.treeObj.get(0).ownerDocument.body),C,u,t,J=!1,h=f,v=f,H,Q,S=null,T=null,w=null,x=d.move.TYPE_INNER,N=a.clientX,O=a.clientY,K=(new Date).getTime();k.uCanDo(f)&&G.bind("mousemove",c);G.bind("mouseup",l);G.bind("selectstart",g);return!0}};B.extend(!0,B.fn.zTree.consts,I);B.extend(!0,B.fn.zTree._z,{tools:{getAbs:function(a){a=
+a.getBoundingClientRect();return[a.left+(document.body.scrollLeft+document.documentElement.scrollLeft),a.top+(document.body.scrollTop+document.documentElement.scrollTop)]},inputFocus:function(a){a.get(0)&&(a.focus(),k.setCursorPosition(a.get(0),a.val().length))},inputSelect:function(a){a.get(0)&&(a.focus(),a.select())},setCursorPosition:function(a,b){if(a.setSelectionRange)a.focus(),a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0);c.moveEnd("character",
+b);c.moveStart("character",b);c.select()}},showIfameMask:function(a,b){for(var c=i.getRoot(a);c.dragMaskList.length>0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(b)for(var d=q("iframe",a),g=0,e=d.length;g<e;g++){var j=d.get(g),f=k.getAbs(j),j=q("<div id='zTreeMask_"+g+"' class='zTreeMask' style='top:"+f[1]+"px; left:"+f[0]+"px; width:"+j.offsetWidth+"px; height:"+j.offsetHeight+"px;'></div>",a);j.appendTo(q("body",a));c.dragMaskList.push(j)}}},view:{addEditBtn:function(a,b){if(!(b.editNameFlag||
+q(b,d.id.EDIT,a).length>0)&&k.apply(a.edit.showRenameBtn,[a.treeId,b],a.edit.showRenameBtn)){var c=q(b,d.id.A,a),l="<span class='"+d.className.BUTTON+" edit' id='"+b.tId+d.id.EDIT+"' title='"+k.apply(a.edit.renameTitle,[a.treeId,b],a.edit.renameTitle)+"' treeNode"+d.id.EDIT+" style='display:none;'></span>";c.append(l);q(b,d.id.EDIT,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeEditName,[a.treeId,b],!0)==!1)return!1;e.editNode(a,b);return!1}).show()}},addRemoveBtn:function(a,
+b){if(!(b.editNameFlag||q(b,d.id.REMOVE,a).length>0)&&k.apply(a.edit.showRemoveBtn,[a.treeId,b],a.edit.showRemoveBtn)){var c=q(b,d.id.A,a),l="<span class='"+d.className.BUTTON+" remove' id='"+b.tId+d.id.REMOVE+"' title='"+k.apply(a.edit.removeTitle,[a.treeId,b],a.edit.removeTitle)+"' treeNode"+d.id.REMOVE+" style='display:none;'></span>";c.append(l);q(b,d.id.REMOVE,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeRemove,[a.treeId,b],!0)==!1)return!1;e.removeNode(a,b);a.treeObj.trigger(d.event.REMOVE,
+[a.treeId,b]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(a,b){if(i.getRoots().showHoverDom)b.isHover=!0,a.edit.enable&&(e.addEditBtn(a,b),e.addRemoveBtn(a,b)),k.apply(a.view.addHoverDom,[a.treeId,b])},cancelCurEditNode:function(a,b,c){var l=i.getRoot(a),g=l.curEditNode;if(g){var o=l.curEditInput,b=b?b:c?i.nodeName(a,g):o.val();if(k.apply(a.callback.beforeRename,[a.treeId,g,b,c],!0)===!1)return!1;i.nodeName(a,g,b);q(g,d.id.A,a).removeClass(d.node.CURSELECTED_EDIT);
+o.unbind();e.setNodeName(a,g);g.editNameFlag=!1;l.curEditNode=null;l.curEditInput=null;e.selectNode(a,g,!1);a.treeObj.trigger(d.event.RENAME,[a.treeId,g,c])}return l.noSelection=!0},editNode:function(a,b){var c=i.getRoot(a);e.editNodeBlur=!1;if(i.isSelectedNode(a,b)&&c.curEditNode==b&&b.editNameFlag)setTimeout(function(){k.inputFocus(c.curEditInput)},0);else{b.editNameFlag=!0;e.removeTreeDom(a,b);e.cancelCurEditNode(a);e.selectNode(a,b,!1);q(b,d.id.SPAN,a).html("<input type=text class='rename' id='"+
+b.tId+d.id.INPUT+"' treeNode"+d.id.INPUT+" >");var l=q(b,d.id.INPUT,a);l.attr("value",i.nodeName(a,b));a.edit.editNameSelectAll?k.inputSelect(l):k.inputFocus(l);l.bind("blur",function(){e.editNodeBlur||e.cancelCurEditNode(a)}).bind("keydown",function(b){b.keyCode=="13"?(e.editNodeBlur=!0,e.cancelCurEditNode(a)):b.keyCode=="27"&&e.cancelCurEditNode(a,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});q(b,d.id.A,a).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=l;
+c.noSelection=!1;c.curEditNode=b}},moveNode:function(a,b,c,l,g,k){var j=i.getRoot(a);if(b!=c&&(!a.data.keep.leaf||!b||i.nodeIsParent(a,b)||l!=d.move.TYPE_INNER)){var f=c.parentTId?c.getParentNode():j,m=b===null||b==j;m&&b===null&&(b=j);if(m)l=d.move.TYPE_INNER;j=b.parentTId?b.getParentNode():j;if(l!=d.move.TYPE_PREV&&l!=d.move.TYPE_NEXT)l=d.move.TYPE_INNER;if(l==d.move.TYPE_INNER)if(m)c.parentTId=null;else{if(!i.nodeIsParent(a,b))i.nodeIsParent(a,b,!0),b.open=!!b.open,e.setNodeLineIcos(a,b);c.parentTId=
+b.tId}var y;m?y=m=a.treeObj:(!k&&l==d.move.TYPE_INNER?e.expandCollapseNode(a,b,!0,!1):k||e.expandCollapseNode(a,b.getParentNode(),!0,!1),m=q(b,a),y=q(b,d.id.UL,a),m.get(0)&&!y.get(0)&&(y=[],e.makeUlHtml(a,b,y,""),m.append(y.join(""))),y=q(b,d.id.UL,a));var r=q(c,a);r.get(0)?m.get(0)||r.remove():r=e.appendNodes(a,c.level,[c],null,-1,!1,!0).join("");y.get(0)&&l==d.move.TYPE_INNER?y.append(r):m.get(0)&&l==d.move.TYPE_PREV?m.before(r):m.get(0)&&l==d.move.TYPE_NEXT&&m.after(r);var s;y=-1;var r=0,n=null,
+m=null,B=c.level,v=i.nodeChildren(a,f),C=i.nodeChildren(a,j),u=i.nodeChildren(a,b);if(c.isFirstNode){if(y=0,v.length>1)n=v[1],n.isFirstNode=!0}else if(c.isLastNode)y=v.length-1,n=v[y-1],n.isLastNode=!0;else for(j=0,s=v.length;j<s;j++)if(v[j].tId==c.tId){y=j;break}y>=0&&v.splice(y,1);if(l!=d.move.TYPE_INNER)for(j=0,s=C.length;j<s;j++)C[j].tId==b.tId&&(r=j);if(l==d.move.TYPE_INNER){u||(u=i.nodeChildren(a,b,[]));if(u.length>0)m=u[u.length-1],m.isLastNode=!1;u.splice(u.length,0,c);c.isLastNode=!0;c.isFirstNode=
+u.length==1}else b.isFirstNode&&l==d.move.TYPE_PREV?(C.splice(r,0,c),m=b,m.isFirstNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!0,c.isLastNode=!1):b.isLastNode&&l==d.move.TYPE_NEXT?(C.splice(r+1,0,c),m=b,m.isLastNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(l==d.move.TYPE_PREV?C.splice(r,0,c):C.splice(r+1,0,c),c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!1);i.fixPIdKeyValue(a,c);i.setSonNodeLevel(a,c.getParentNode(),c);e.setNodeLineIcos(a,c);e.repairNodeLevelClass(a,
+c,B);!a.data.keep.parent&&v.length<1?(i.nodeIsParent(a,f,!1),f.open=!1,b=q(f,d.id.UL,a),l=q(f,d.id.SWITCH,a),j=q(f,d.id.ICON,a),e.replaceSwitchClass(f,l,d.folder.DOCU),e.replaceIcoClass(f,j,d.folder.DOCU),b.css("display","none")):n&&e.setNodeLineIcos(a,n);m&&e.setNodeLineIcos(a,m);a.check&&a.check.enable&&e.repairChkClass&&(e.repairChkClass(a,f),e.repairParentChkClassWithSelf(a,f),f!=c.parent&&e.repairParentChkClassWithSelf(a,c));k||e.expandCollapseParentNode(a,c.getParentNode(),!0,g)}},removeEditBtn:function(a,
+b){q(b,d.id.EDIT,a).unbind().remove()},removeRemoveBtn:function(a,b){q(b,d.id.REMOVE,a).unbind().remove()},removeTreeDom:function(a,b){b.isHover=!1;e.removeEditBtn(a,b);e.removeRemoveBtn(a,b);k.apply(a.view.removeHoverDom,[a.treeId,b])},repairNodeLevelClass:function(a,b,c){if(c!==b.level){var e=q(b,a),g=q(b,d.id.A,a),a=q(b,d.id.UL,a),c=d.className.LEVEL+c,b=d.className.LEVEL+b.level;e.removeClass(c);e.addClass(b);g.removeClass(c);g.addClass(b);a.removeClass(c);a.addClass(b)}},selectNodes:function(a,
+b){for(var c=0,d=b.length;c<d;c++)e.selectNode(a,b[c],c>0)}},event:{},data:{setSonNodeLevel:function(a,b,c){if(c){var d=i.nodeChildren(a,c);c.level=b?b.level+1:0;if(d)for(var b=0,g=d.length;b<g;b++)d[b]&&i.setSonNodeLevel(a,c,d[b])}}}});var H=B.fn.zTree,k=H._z.tools,d=H.consts,e=H._z.view,i=H._z.data,q=k.$;i.exSetting({edit:{enable:!1,editNameSelectAll:!1,showRemoveBtn:!0,showRenameBtn:!0,removeTitle:"remove",renameTitle:"rename",drag:{autoExpandTrigger:!1,isCopy:!0,isMove:!0,prev:!0,next:!0,inner:!0,
+minMoveSize:5,borderMax:10,borderMin:-5,maxShowNodeNum:5,autoOpenTime:500}},view:{addHoverDom:null,removeHoverDom:null},callback:{beforeDrag:null,beforeDragOpen:null,beforeDrop:null,beforeEditName:null,beforeRename:null,onDrag:null,onDragMove:null,onDrop:null,onRename:null}});i.addInitBind(function(a){var b=a.treeObj,c=d.event;b.bind(c.RENAME,function(b,c,d,e){k.apply(a.callback.onRename,[b,c,d,e])});b.bind(c.DRAG,function(b,c,d,e){k.apply(a.callback.onDrag,[c,d,e])});b.bind(c.DRAGMOVE,function(b,
+c,d,e){k.apply(a.callback.onDragMove,[c,d,e])});b.bind(c.DROP,function(b,c,d,e,f,i,q){k.apply(a.callback.onDrop,[c,d,e,f,i,q])})});i.addInitUnBind(function(a){var a=a.treeObj,b=d.event;a.unbind(b.RENAME);a.unbind(b.DRAG);a.unbind(b.DRAGMOVE);a.unbind(b.DROP)});i.addInitCache(function(){});i.addInitNode(function(a,b,c){if(c)c.isHover=!1,c.editNameFlag=!1});i.addInitProxy(function(a){var b=a.target,c=i.getSetting(a.data.treeId),e=a.relatedTarget,g="",o=null,j="",f=null,m=null;if(k.eqs(a.type,"mouseover")){if(m=
+k.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+d.id.A}]))g=k.getNodeMainDom(m).id,j="hoverOverNode"}else if(k.eqs(a.type,"mouseout"))m=k.getMDom(c,e,[{tagName:"a",attrName:"treeNode"+d.id.A}]),m||(g="remove",j="hoverOutNode");else if(k.eqs(a.type,"mousedown")&&(m=k.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+d.id.A}])))g=k.getNodeMainDom(m).id,j="mousedownNode";if(g.length>0)switch(o=i.getNodeCache(c,g),j){case "mousedownNode":f=v.onMousedownNode;break;case "hoverOverNode":f=v.onHoverOverNode;
+break;case "hoverOutNode":f=v.onHoverOutNode}return{stop:!1,node:o,nodeEventType:j,nodeEventCallback:f,treeEventType:"",treeEventCallback:null}});i.addInitRoot(function(a){var a=i.getRoot(a),b=i.getRoots();a.curEditNode=null;a.curEditInput=null;a.curHoverNode=null;a.dragFlag=0;a.dragNodeShowBefore=[];a.dragMaskList=[];b.showHoverDom=!0});i.addZTreeTools(function(a,b){b.cancelEditName=function(a){i.getRoot(this.setting).curEditNode&&e.cancelCurEditNode(this.setting,a?a:null,!0)};b.copyNode=function(b,
+l,g,o){if(!l)return null;var j=i.nodeIsParent(a,b);if(b&&!j&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;var f=this,m=k.clone(l);if(!b)b=null,g=d.move.TYPE_INNER;g==d.move.TYPE_INNER?(l=function(){e.addNodes(f.setting,b,-1,[m],o)},k.canAsync(this.setting,b)?e.asyncNode(this.setting,b,o,l):l()):(e.addNodes(this.setting,b.parentNode,-1,[m],o),e.moveNode(this.setting,b,m,g,!1,o));return m};b.editName=function(a){a&&a.tId&&a===i.getNodeCache(this.setting,a.tId)&&(a.parentTId&&e.expandCollapseParentNode(this.setting,
+a.getParentNode(),!0),e.editNode(this.setting,a))};b.moveNode=function(b,l,g,o){function j(){e.moveNode(m.setting,b,l,g,!1,o)}if(!l)return l;var f=i.nodeIsParent(a,b);if(b&&!f&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;else if(b&&(l.parentTId==b.tId&&g==d.move.TYPE_INNER||q(l,this.setting).find("#"+b.tId).length>0))return null;else b||(b=null);var m=this;k.canAsync(this.setting,b)&&g===d.move.TYPE_INNER?e.asyncNode(this.setting,b,o,j):j();return l};b.setEditable=function(a){this.setting.edit.enable=
+a;return this.refresh()}});var N=e.cancelPreSelectedNode;e.cancelPreSelectedNode=function(a,b){for(var c=i.getRoot(a).curSelectedList,d=0,g=c.length;d<g;d++)if(!b||b===c[d])if(e.removeTreeDom(a,c[d]),b)break;N&&N.apply(e,arguments)};var O=e.createNodes;e.createNodes=function(a,b,c,d,g){O&&O.apply(e,arguments);c&&e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(a,d)};var V=e.makeNodeUrl;e.makeNodeUrl=function(a,b){return a.edit.enable?null:V.apply(e,arguments)};var K=e.removeNode;e.removeNode=
+function(a,b){var c=i.getRoot(a);if(c.curEditNode===b)c.curEditNode=null;K&&K.apply(e,arguments)};var P=e.selectNode;e.selectNode=function(a,b,c){var d=i.getRoot(a);if(i.isSelectedNode(a,b)&&d.curEditNode==b&&b.editNameFlag)return!1;P&&P.apply(e,arguments);e.addHoverDom(a,b);return!0};var U=k.uCanDo;k.uCanDo=function(a,b){var c=i.getRoot(a);if(b&&(k.eqs(b.type,"mouseover")||k.eqs(b.type,"mouseout")||k.eqs(b.type,"mousedown")||k.eqs(b.type,"mouseup")))return!0;if(c.curEditNode)e.editNodeBlur=!1,c.curEditInput.focus();
+return!c.curEditNode&&(U?U.apply(e,arguments):!0)}})(jQuery);
+/*
+ * JQuery zTree exHideNodes v3.5.37
+ * http://treejs.cn/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2018-08-21
+ */
+(function(j){j.extend(!0,j.fn.zTree._z,{view:{clearOldFirstNode:function(c,a){for(var b=a.getNextNode();b;){if(b.isFirstNode){b.isFirstNode=!1;e.setNodeLineIcos(c,b);break}if(b.isLastNode)break;b=b.getNextNode()}},clearOldLastNode:function(c,a,b){for(a=a.getPreNode();a;){if(a.isLastNode){a.isLastNode=!1;b&&e.setNodeLineIcos(c,a);break}if(a.isFirstNode)break;a=a.getPreNode()}},makeDOMNodeMainBefore:function(c,a,b){a=d.isHidden(a,b);c.push("<li ",a?"style='display:none;' ":"","id='",b.tId,"' class='",
+l.className.LEVEL,b.level,"' tabindex='0' hidefocus='true' treenode>")},showNode:function(c,a){d.isHidden(c,a,!1);d.initShowForExCheck(c,a);k(a,c).show()},showNodes:function(c,a,b){if(a&&a.length!=0){var f={},g,i;for(g=0,i=a.length;g<i;g++){var h=a[g];if(!f[h.parentTId]){var u=h.getParentNode();f[h.parentTId]=u===null?d.getRoot(c):h.getParentNode()}e.showNode(c,h,b)}for(var j in f)a=d.nodeChildren(c,f[j]),e.setFirstNodeForShow(c,a),e.setLastNodeForShow(c,a)}},hideNode:function(c,a){d.isHidden(c,a,
+!0);a.isFirstNode=!1;a.isLastNode=!1;d.initHideForExCheck(c,a);e.cancelPreSelectedNode(c,a);k(a,c).hide()},hideNodes:function(c,a,b){if(a&&a.length!=0){var f={},g,i;for(g=0,i=a.length;g<i;g++){var h=a[g];if((h.isFirstNode||h.isLastNode)&&!f[h.parentTId]){var j=h.getParentNode();f[h.parentTId]=j===null?d.getRoot(c):h.getParentNode()}e.hideNode(c,h,b)}for(var k in f)a=d.nodeChildren(c,f[k]),e.setFirstNodeForHide(c,a),e.setLastNodeForHide(c,a)}},setFirstNode:function(c,a){var b=d.nodeChildren(c,a),f=
+d.isHidden(c,b[0],!1);b.length>0&&!f?b[0].isFirstNode=!0:b.length>0&&e.setFirstNodeForHide(c,b)},setLastNode:function(c,a){var b=d.nodeChildren(c,a),f=d.isHidden(c,b[0]);b.length>0&&!f?b[b.length-1].isLastNode=!0:b.length>0&&e.setLastNodeForHide(c,b)},setFirstNodeForHide:function(c,a){var b,f,g;for(f=0,g=a.length;f<g;f++){b=a[f];if(b.isFirstNode)break;if(!d.isHidden(c,b)&&!b.isFirstNode){b.isFirstNode=!0;e.setNodeLineIcos(c,b);break}else b=null}return b},setFirstNodeForShow:function(c,a){var b,f,
+g,i,h;for(f=0,g=a.length;f<g;f++){b=a[f];var j=d.isHidden(c,b);if(!i&&!j&&b.isFirstNode){i=b;break}else if(!i&&!j&&!b.isFirstNode)b.isFirstNode=!0,i=b,e.setNodeLineIcos(c,b);else if(i&&b.isFirstNode){b.isFirstNode=!1;h=b;e.setNodeLineIcos(c,b);break}}return{"new":i,old:h}},setLastNodeForHide:function(c,a){var b,f;for(f=a.length-1;f>=0;f--){b=a[f];if(b.isLastNode)break;if(!d.isHidden(c,b)&&!b.isLastNode){b.isLastNode=!0;e.setNodeLineIcos(c,b);break}else b=null}return b},setLastNodeForShow:function(c,
+a){var b,f,g,i;for(f=a.length-1;f>=0;f--){b=a[f];var h=d.isHidden(c,b);if(!g&&!h&&b.isLastNode){g=b;break}else if(!g&&!h&&!b.isLastNode)b.isLastNode=!0,g=b,e.setNodeLineIcos(c,b);else if(g&&b.isLastNode){b.isLastNode=!1;i=b;e.setNodeLineIcos(c,b);break}}return{"new":g,old:i}}},data:{initHideForExCheck:function(c,a){if(d.isHidden(c,a)&&c.check&&c.check.enable){if(typeof a._nocheck=="undefined")a._nocheck=!!a.nocheck,a.nocheck=!0;a.check_Child_State=-1;e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(c,
+a)}},initShowForExCheck:function(c,a){if(!d.isHidden(c,a)&&c.check&&c.check.enable){if(typeof a._nocheck!="undefined")a.nocheck=a._nocheck,delete a._nocheck;if(e.setChkClass){var b=k(a,l.id.CHECK,c);e.setChkClass(c,b,a)}e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(c,a)}}}});var j=j.fn.zTree,m=j._z.tools,l=j.consts,e=j._z.view,d=j._z.data,k=m.$;d.isHidden=function(c,a,b){if(!a)return!1;c=c.data.key.isHidden;typeof b!=="undefined"&&(typeof b==="string"&&(b=m.eqs(checked,"true")),a[c]=
+!!b);return a[c]};d.exSetting({data:{key:{isHidden:"isHidden"}}});d.addInitNode(function(c,a,b){a=d.isHidden(c,b);d.isHidden(c,b,a);d.initHideForExCheck(c,b)});d.addBeforeA(function(){});d.addZTreeTools(function(c,a){a.showNodes=function(a,b){e.showNodes(c,a,b)};a.showNode=function(a,b){a&&e.showNodes(c,[a],b)};a.hideNodes=function(a,b){e.hideNodes(c,a,b)};a.hideNode=function(a,b){a&&e.hideNodes(c,[a],b)};var b=a.checkNode;if(b)a.checkNode=function(f,e,i,h){(!f||!d.isHidden(c,f))&&b.apply(a,arguments)}});
+var n=d.initNode;d.initNode=function(c,a,b,f,g,i,h){var j=(f?f:d.getRoot(c))[c.data.key.children];d.tmpHideFirstNode=e.setFirstNodeForHide(c,j);d.tmpHideLastNode=e.setLastNodeForHide(c,j);h&&(e.setNodeLineIcos(c,d.tmpHideFirstNode),e.setNodeLineIcos(c,d.tmpHideLastNode));g=d.tmpHideFirstNode===b;i=d.tmpHideLastNode===b;n&&n.apply(d,arguments);h&&i&&e.clearOldLastNode(c,b,h)};var o=d.makeChkFlag;if(o)d.makeChkFlag=function(c,a){(!a||!d.isHidden(c,a))&&o.apply(d,arguments)};var p=d.getTreeCheckedNodes;
+if(p)d.getTreeCheckedNodes=function(c,a,b,f){if(a&&a.length>0){var e=a[0].getParentNode();if(e&&d.isHidden(c,e))return[]}return p.apply(d,arguments)};var q=d.getTreeChangeCheckedNodes;if(q)d.getTreeChangeCheckedNodes=function(c,a,b){if(a&&a.length>0){var e=a[0].getParentNode();if(e&&d.isHidden(c,e))return[]}return q.apply(d,arguments)};var r=e.expandCollapseSonNode;if(r)e.expandCollapseSonNode=function(c,a,b,f,g){(!a||!d.isHidden(c,a))&&r.apply(e,arguments)};var s=e.setSonNodeCheckBox;if(s)e.setSonNodeCheckBox=
+function(c,a,b,f){(!a||!d.isHidden(c,a))&&s.apply(e,arguments)};var t=e.repairParentChkClassWithSelf;if(t)e.repairParentChkClassWithSelf=function(c,a){(!a||!d.isHidden(c,a))&&t.apply(e,arguments)}})(jQuery);
+
+
+
+
+ TreeSelect.prototype.render = function (options) {
+ var elem = options.elem,
+ // 请求地址
+ data = options.data,
+ // 请求头
+ headers = options.headers,
+ // 请求方式
+ type = options.type === undefined ? 'GET' : options.type,
+ // 节点点击回调
+ click = options.click,
+ // 渲染成功后的回调函数
+ success = options.success,
+ // 占位符(提示信息)
+ placeholder = options.placeholder === undefined ? '请选择' : options.placeholder,
+ // 是否开启搜索
+ search = options.search === undefined ? false : options.search,
+ // 样式配置项
+ style = options.style,
+ // 唯一id
+ tmp = new Date().getTime(),
+ DATA = {},
+ selected = 'layui-form-selected',
+ TREE_OBJ = undefined,
+ TREE_INPUT_ID = 'treeSelect-input-' + tmp,
+ TREE_INPUT_CLASS = 'layui-treeselect',
+ TREE_SELECT_ID = 'layui-treeSelect-' + tmp,
+ TREE_SELECT_CLASS = 'layui-treeSelect',
+ TREE_SELECT_TITLE_ID = 'layui-select-title-' + tmp,
+ TREE_SELECT_TITLE_CLASS = 'layui-select-title',
+ TREE_SELECT_BODY_ID = 'layui-treeSelect-body-' + tmp,
+ TREE_SELECT_BODY_CLASS = 'layui-treeSelect-body',
+ TREE_SELECT_SEARCHED_CLASS = 'layui-treeSelect-search-ed';
+
+
+ var a = {
+ init: function () {
+ $.ajax({
+ url: data,
+ type: type,
+ headers: headers,
+ dataType: 'json',
+ success: function (d) {
+ DATA = d;
+ a.hideElem().input().toggleSelect().loadCss().preventEvent();
+ $.fn.zTree.init($('#' + TREE_SELECT_BODY_ID), a.setting(), d);
+ TREE_OBJ = $.fn.zTree.getZTreeObj(TREE_SELECT_BODY_ID);
+ if (search) {
+ a.searchParam();
+ }
+ a.configStyle();
+ if (success) {
+ var obj = {
+ treeId: TREE_SELECT_ID,
+ data: d
+ };
+ success(obj);
+ }
+ }
+ });
+ return a;
+ },
+ // 检查input是否有默认值
+ checkDefaultValue: function () {
+
+ },
+ setting: function () {
+ var setting = {
+ callback: {
+ onClick: a.onClick,
+ onExpand: a.onExpand,
+ onCollapse: a.onCollapse,
+ beforeExpand: a.ztreeCallBack.beforeExpand
+ }
+ };
+ return setting;
+ },
+ ztreeCallBack: {
+ beforeExpand: function () {
+ a.configStyle();
+ },
+ },
+ onCollapse: function () {
+ a.focusInput();
+ },
+ onExpand: function () {
+ a.configStyle();
+ a.focusInput();
+ },
+ focusInput: function () {
+ $('#' + TREE_INPUT_ID).focus();
+ },
+ onClick: function (event, treeId, treeNode) {
+ var name = treeNode.name,
+ id = treeNode.id,
+ $input = $('#' + TREE_SELECT_TITLE_ID + ' input');
+ $input.val(name);
+ $(elem).attr('value', id).val(id);
+ $('#' + TREE_SELECT_ID).removeClass(selected);
+
+ if (click) {
+ var obj = {
+ data: DATA,
+ current: treeNode,
+ treeId: TREE_SELECT_ID
+ };
+ click(obj);
+ }
+ return a;
+ },
+ hideElem: function () {
+ $(elem).hide();
+ return a;
+ },
+ input: function () {
+ var readonly = '';
+ if (!search) {
+ readonly = 'readonly';
+ }
+ var selectHtml = '<div class="' + TREE_SELECT_CLASS + ' layui-unselect layui-form-select" id="' + TREE_SELECT_ID + '">' +
+ '<div class="' + TREE_SELECT_TITLE_CLASS + '" id="' + TREE_SELECT_TITLE_ID + '">' +
+ ' <input type="text" id="' + TREE_INPUT_ID + '" placeholder="' + placeholder + '" value="" ' + readonly + ' class="layui-input layui-unselect">' +
+ '<i class="layui-edge"></i>' +
+ '</div>' +
+ '<div class="layui-anim layui-anim-upbit" style="">' +
+ '<div class="' + TREE_SELECT_BODY_CLASS + ' ztree" id="' + TREE_SELECT_BODY_ID + '"></div>' +
+ '</div>' +
+ '</div>';
+ $(elem).parent().append(selectHtml);
+ return a;
+ },
+ /**
+ * 展开/折叠下拉框
+ */
+ toggleSelect: function () {
+ var item = '#' + TREE_SELECT_TITLE_ID;
+ a.event('click', item, function (e) {
+ var $select = $('#' + TREE_SELECT_ID);
+ if ($select.hasClass(selected)) {
+ $select.removeClass(selected);
+ $('#' + TREE_INPUT_ID).blur();
+ } else {
+ // 隐藏其他picker
+ $('.layui-form-select').removeClass(selected);
+ // 显示当前picker
+ $select.addClass(selected);
+ }
+ e.stopPropagation();
+ });
+ $(document).click(function () {
+ var $select = $('#' + TREE_SELECT_ID);
+ if ($select.hasClass(selected)) {
+ $select.removeClass(selected);
+ $('#' + TREE_INPUT_ID).blur();
+ }
+ });
+ return a;
+ },
+ // 模糊查询
+ searchParam: function () {
+ if (!search) {
+ return;
+ }
+
+ var item = '#' + TREE_INPUT_ID;
+ a.fuzzySearch(item, null, true);
+ },
+ fuzzySearch: function (searchField, isHighLight, isExpand) {
+ var zTreeObj = TREE_OBJ;//get the ztree object by ztree id
+ if (!zTreeObj) {
+ alert("fail to get ztree object");
+ }
+ var nameKey = zTreeObj.setting.data.key.name; //get the key of the node name
+ isHighLight = isHighLight === false ? false : true;//default true, only use false to disable highlight
+ isExpand = isExpand ? true : false; // not to expand in default
+ zTreeObj.setting.view.nameIsHTML = isHighLight; //allow use html in node name for highlight use
+
+ var metaChar = '[\\[\\]\\\\\^\\$\\.\\|\\?\\*\\+\\(\\)]'; //js meta characters
+ var rexMeta = new RegExp(metaChar, 'gi');//regular expression to match meta characters
+
+ // keywords filter function
+ function ztreeFilter(zTreeObj, _keywords, callBackFunc) {
+ if (!_keywords) {
+ _keywords = ''; //default blank for _keywords
+ }
+
+ // function to find the matching node
+ function filterFunc(node) {
+ if (node && node.oldname && node.oldname.length > 0) {
+ node[nameKey] = node.oldname; //recover oldname of the node if exist
+ }
+ zTreeObj.updateNode(node); //update node to for modifications take effect
+ if (_keywords.length == 0) {
+ //return true to show all nodes if the keyword is blank
+ zTreeObj.showNode(node);
+ zTreeObj.expandNode(node, isExpand);
+ return true;
+ }
+ //transform node name and keywords to lowercase
+ if (node[nameKey] && node[nameKey].toLowerCase().indexOf(_keywords.toLowerCase()) != -1) {
+ zTreeObj.showNode(node);//show node with matching keywords
+ return true; //return true and show this node
+ }
+
+ zTreeObj.hideNode(node); // hide node that not matched
+ return false; //return false for node not matched
+ }
+
+ var nodesShow = zTreeObj.getNodesByFilter(filterFunc); //get all nodes that would be shown
+ processShowNodes(nodesShow, _keywords);//nodes should be reprocessed to show correctly
+ }
+
+ /**
+ * reprocess of nodes before showing
+ */
+ function processShowNodes(nodesShow, _keywords) {
+ if (nodesShow && nodesShow.length > 0) {
+ //process the ancient nodes if _keywords is not blank
+ if (_keywords.length > 0) {
+ $.each(nodesShow, function (n, obj) {
+ var pathOfOne = obj.getPath();//get all the ancient nodes including current node
+ if (pathOfOne && pathOfOne.length > 0) {
+ //i < pathOfOne.length-1 process every node in path except self
+ for (var i = 0; i < pathOfOne.length - 1; i++) {
+ zTreeObj.showNode(pathOfOne[i]); //show node
+ zTreeObj.expandNode(pathOfOne[i], true); //expand node
+ }
+ }
+ });
+ } else { //show all nodes when _keywords is blank and expand the root nodes
+ var rootNodes = zTreeObj.getNodesByParam('level', '0');//get all root nodes
+ $.each(rootNodes, function (n, obj) {
+ zTreeObj.expandNode(obj, true); //expand all root nodes
+ });
+ }
+ }
+ }
+
+ //listen to change in input element
+ $(searchField).bind('input propertychange', function () {
+ var _keywords = $(this).val();
+ searchNodeLazy(_keywords); //call lazy load
+ });
+
+ var timeoutId = null;
+ // excute lazy load once after input change, the last pending task will be cancled
+ function searchNodeLazy(_keywords) {
+ if (timeoutId) {
+ //clear pending task
+ clearTimeout(timeoutId);
+ }
+ timeoutId = setTimeout(function () {
+ ztreeFilter(zTreeObj, _keywords); //lazy load ztreeFilter function
+ $(searchField).focus();//focus input field again after filtering
+ }, 500);
+ }
+ },
+ checkNodes: function (nodes) {
+ for (var i = 0; i < nodes.length; i++) {
+ var o = nodes[i],
+ pid = o.parentTId,
+ tid = o.tId;
+ if (pid !== null) {
+ // 获取父节点
+ $('#' + pid).addClass(TREE_SELECT_SEARCHED_CLASS);
+ var pNode = TREE_OBJ.getNodesByParam("tId", pid, null);
+ TREE_OBJ.expandNode(pNode[0], true, false, true);
+ }
+ $('#' + tid).addClass(TREE_SELECT_SEARCHED_CLASS);
+ }
+ },
+ // 阻止Layui的一些默认事件
+ preventEvent: function () {
+ var item = '#' + TREE_SELECT_ID + ' .layui-anim';
+ a.event('click', item, function (e) {
+ e.stopPropagation();
+ });
+ return a;
+ },
+ loadCss: function () {
+ var ztree = '.ztree *{padding:0;margin:0;font-size:12px;font-family:Verdana,Arial,Helvetica,AppleGothic,sans-serif}.ztree{margin:0;padding:5px;color:#333}.ztree li{padding:0;margin:0;list-style:none;line-height:14px;text-align:left;white-space:nowrap;outline:0}.ztree li a:hover{text-decoration:underline}.ztree li a.curSelectedNode{padding-top:0px;background-color:#FFE6B0;color:black;height:16px;border:1px #FFB951 solid;opacity:0.8;}.ztree li a.curSelectedNode_Edit{padding-top:0px;background-color:#FFE6B0;color:black;height:16px;border:1px #FFB951 solid;opacity:0.8;}.ztree li a.tmpTargetNode_inner{padding-top:0px;background-color:#316AC5;color:white;height:16px;border:1px #316AC5 solid;opacity:0.8;filter:alpha(opacity=80)}.ztree li a.tmpTargetNode_prev{}.ztree li a.tmpTargetNode_next{}.ztree li a input.rename{height:14px;width:80px;padding:0;margin:0;font-size:12px;border:1px #7EC4CC solid;*border:0px}.ztree li span{line-height:16px;margin-right:2px}.ztree li span.button.chk.checkbox_false_full_focus{background-position:0 -14px}.ztree li span.button.chk.checkbox_false_part{background-position:0 -28px}.ztree li span.button.chk.checkbox_false_part_focus{background-position:0 -42px}.ztree li span.button.chk.checkbox_false_disable{background-position:0 -56px}.ztree li span.button.chk.checkbox_true_full{background-position:-14px 0}.ztree li span.button.chk.checkbox_true_full_focus{background-position:-14px -14px}.ztree li span.button.chk.checkbox_true_part{background-position:-14px -28px}.ztree li span.button.chk.checkbox_true_part_focus{background-position:-14px -42px}.ztree li span.button.chk.checkbox_true_disable{background-position:-14px -56px}.ztree li span.button.chk.radio_false_full{background-position:-28px 0}.ztree li span.button.chk.radio_false_full_focus{background-position:-28px -14px}.ztree li span.button.chk.radio_false_part{background-position:-28px -28px}.ztree li span.button.chk.radio_false_part_focus{background-position:-28px -42px}.ztree li span.button.chk.radio_false_disable{background-position:-28px -56px}.ztree li span.button.chk.radio_true_full{background-position:-42px 0}.ztree li span.button.chk.radio_true_full_focus{background-position:-42px -14px}.ztree li span.button.chk.radio_true_part{background-position:-42px -28px}.ztree li span.button.chk.radio_true_part_focus{background-position:-42px -42px}.ztree li span.button.chk.radio_true_disable{background-position:-42px -56px}.ztree li span.button.switch{width:18px;height:18px}.ztree li span.button.root_open{background-position:-92px -54px}.ztree li span.button.root_close{background-position:-74px -54px}.ztree li span.button.roots_open{background-position:-92px 0}.ztree li span.button.roots_close{background-position:-74px 0}.ztree li span.button.center_open{background-position:-92px -18px}.ztree li span.button.center_close{background-position:-74px -18px}.ztree li span.button.bottom_open{background-position:-92px -36px}.ztree li span.button.bottom_close{background-position:-74px -36px}.ztree li span.button.noline_open{background-position:-92px -72px}.ztree li span.button.noline_close{background-position:-74px -72px}.ztree li span.button.root_docu{background:none;}.ztree li span.button.roots_docu{background-position:-56px 0}.ztree li span.button.center_docu{background-position:-56px -18px}.ztree li span.button.bottom_docu{background-position:-56px -36px}.ztree li span.button.noline_docu{background:none;}.ztree li span.button.ico_open{margin-right:2px;background-position:-110px -16px;vertical-align:top;*vertical-align:middle}.ztree li span.button.ico_close{margin-right:2px;background-position:-110px 0;vertical-align:top;*vertical-align:middle}.ztree li span.button.ico_docu{margin-right:2px;background-position:-110px -32px;vertical-align:top;*vertical-align:middle}.ztree li span.button.edit{margin-right:2px;background-position:-110px -48px;vertical-align:top;*vertical-align:middle}.ztree li span.button.remove{margin-right:2px;background-position:-110px -64px;vertical-align:top;*vertical-align:middle}ul.tmpTargetzTree{background-color:#FFE6B0;opacity:0.8;filter:alpha(opacity=80)}ul.ztree.zTreeDragUL{margin:0;padding:0;position:absolute;width:auto;height:auto;overflow:hidden;background-color:#cfcfcf;border:1px #00B83F dotted;opacity:0.8;filter:alpha(opacity=80)}.zTreeMask{z-index:10000;background-color:#cfcfcf;opacity:0.0;filter:alpha(opacity=0);position:absolute}',
+ ztree_ex = '.layui-treeSelect .ztree li span.button{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:none;line-height:inherit;}.layui-treeSelect .ztree li span.button.ico_open{display:none;}.layui-treeSelect .ztree li span.button.ico_close{display:none;}.layui-treeSelect .ztree li span.button.ico_docu:before{content:"\\e621";}.layui-treeSelect .ztree li span.button.bottom_close:before,.layui-treeSelect .ztree li span.button.center_close:before,.layui-treeSelect .ztree li span.button.roots_close:before,.layui-treeSelect .ztree li span.button.root_close:before{content:"\\e623";}.layui-treeSelect .ztree li span.button.bottom_open:before,.layui-treeSelect .ztree li span.button.roots_open:before,.layui-treeSelect .ztree li span.button.center_open:before,.layui-treeSelect .ztree li span.button.root_open:before{content:"\\e625";}.layui-treeSelect .ztree li a:hover{text-decoration:none;}.layui-treeSelect .ztree *{font-size:14px;}.layui-treeSelect .ztree li{line-height:inherit;padding:2px 0;}.layui-treeSelect .ztree li span.button.switch{position:relative;top:-1px;}.layui-treeSelect .ztree li a,.ztree li span{line-height:18px;height:inherit;}.layui-treeSelect .ztree li a.curSelectedNode{color:#5FB878;background:none;border:none;height:inherit;padding-top:1px;}.layui-treeSelect .layui-anim::-webkit-scrollbar{width:6px;height:6px;background-color:#F5F5F5;}.layui-treeSelect .layui-anim::-webkit-scrollbar-track{box-shadow:inset 0 0 6px rgba(107,98,98,0.3);border-radius:10px;background-color:#F5F5F5;}.layui-treeSelect .layui-anim::-webkit-scrollbar-thumb{border-radius:10px;box-shadow:inset 0 0 6px rgba(107,98,98,0.3);background-color:#555;}.layui-treeSelect.layui-form-select .layui-anim{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:9999;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;}.layui-treeSelect.layui-form-selected .layui-anim{display:block;}.layui-treeSelect .ztree li ul.line{background:none;position:relative;}.layui-treeSelect .ztree li ul.line:before{content:"";height:100%;border-left:1px dotted #ece;position:absolute;left:8px;}.layui-treeSelect .ztree li .center_docu:before,.ztree li .bottom_docu::before{content:"";height:100%;border-left:1px dotted #ece;position:absolute;left:8px;}.layui-treeSelect .ztree li .center_docu::after,.ztree li .bottom_docu::after{content:"";position:absolute;left:8px;top:8px;width:8px;border-top:1px dotted #ece;}.layui-treeSelect .ztree li span.button.ico_open{display:inline-block;position:relative;top:1px;}.layui-treeSelect .ztree li span.button.ico_close{display:inline-block;position:relative;top:1px;}.layui-treeSelect .ztree li span.button.ico_open:before{content:"\\e643";}.layui-treeSelect .ztree li span.button.ico_close:before{content:"\\e63f";}';
+ $head = $('head'),
+ ztreeStyle = $head.find('style[ztree]');
+
+ if (ztreeStyle.length === 0) {
+ $head.append($('<style ztree>').append(ztree).append(ztree_ex))
+ }
+ return a;
+ },
+ configStyle: function () {
+ if (style == undefined || style.line == undefined || !style.line.enable) {
+ $('#' + TREE_SELECT_ID).find('li .center_docu,li .bottom_docu').hide();
+ //.layui-treeSelect .ztree li .center_docu:before, .ztree li .bottom_docu::before
+ }
+
+ if (style == undefined || style.folder == undefined || !style.folder.enable) {
+ $('#' + TREE_SELECT_ID).find('li span.button.ico_open').hide();
+ $('#' + TREE_SELECT_ID).find('li span.button.ico_close').hide();
+ }
+ },
+ event: function (evt, el, fn) {
+ $('body').on(evt, el, fn);
+ }
+ };
+ a.init();
+ return new TreeSelect();
+ };
+
+ /**
+ * 重新加载trerSelect
+ * @param filter
+ */
+ TreeSelect.prototype.refresh = function (filter) {
+ var treeObj = obj.treeObj(filter);
+ treeObj.reAsyncChildNodes(null, "refresh");
+ };
+
+ /**
+ * 选中节点,因为tree是异步加载,所以必须在success回调中调用checkNode函数,否则无法获取生成的DOM元素
+ * @param filter lay-filter属性
+ * @param id 选中的id
+ */
+ TreeSelect.prototype.checkNode = function(filter, id){
+ var o = obj.filter(filter),
+ treeInput = o.find('.layui-select-title input'),
+ treeObj = obj.treeObj(filter),
+ node = treeObj.getNodeByParam("id", id, null),
+ name = node.name;
+ treeInput.val(name);
+ o.find('a[treenode_a]').removeClass('curSelectedNode');
+ obj.get(filter).val(id).attr('value', id);
+ treeObj.selectNode(node);
+ };
+
+ /**
+ * 撤销选中的节点
+ * @param filter lay-filter属性
+ * @param fn 回调函数
+ */
+ TreeSelect.prototype.revokeNode = function(filter, fn){
+ var o = obj.filter(filter);
+ o.find('a[treenode_a]').removeClass('curSelectedNode');
+ o.find('.layui-select-title input.layui-input').val('');
+ obj.get(filter).attr('value', '').val('');
+ // obj.treeObj(filter).expandAll(false);
+ if (fn){
+ fn({
+ treeId: o.attr('id')
+ });
+ }
+ }
+
+ /**
+ * 销毁组件
+ */
+ TreeSelect.prototype.destroy = function(filter) {
+ var o = obj.filter(filter);
+ o.remove();
+ obj.get(filter).show();
+ }
+
+ /**
+ * 获取zTree对象,可调用所有zTree函数
+ * @param filter
+ */
+ TreeSelect.prototype.zTree = function (filter) {
+ return obj.treeObj(filter);
+ };
+
+ var obj = {
+ get: function(filter){
+ if (!filter) {
+ layui.hint().error('filter 不能为空');
+ }
+ return $('*[lay-filter='+ filter +']');
+ },
+ filter: function(filter){
+ var tf = obj.get(filter),
+ o = tf.next();
+ return o;
+ },
+ treeObj: function (filter) {
+ var o = obj.filter(filter),
+ treeId = o.find('.layui-treeSelect-body').attr('id'),
+ tree = $.fn.zTree.getZTreeObj(treeId);
+ return tree;
+ }
+ };
+
+ //输出接口
+ var mod = new TreeSelect();
+ exports(_MOD, mod);
+});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/custom/module/treetable-lay/treetable.css b/payapi/src/main/resources/static/custom/module/treetable-lay/treetable.css
new file mode 100755
index 0000000..584b2f8
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/treetable-lay/treetable.css
@@ -0,0 +1,18 @@
+.treeTable-empty {
+ width: 20px;
+ display: inline-block;
+}
+
+.treeTable-icon {
+ cursor: pointer;
+}
+
+.treeTable-icon .layui-icon-triangle-d:before {
+ content: "\e623";
+}
+
+.treeTable-icon.open .layui-icon-triangle-d:before {
+ content: "\e625";
+ background-color: transparent;
+}
+
diff --git a/payapi/src/main/resources/static/custom/module/treetable-lay/treetable.js b/payapi/src/main/resources/static/custom/module/treetable-lay/treetable.js
new file mode 100755
index 0000000..af7361a
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/treetable-lay/treetable.js
@@ -0,0 +1,212 @@
+layui.define(['layer', 'table'], function (exports) {
+ var $ = layui.jquery;
+ var layer = layui.layer;
+ var table = layui.table;
+
+ var treetable = {
+ // 渲染树形表格
+ render: function (param) {
+ // 检查参数
+ if (!treetable.checkParam(param)) {
+ return;
+ }
+ // 获取数据
+ if (param.data) {
+ treetable.init(param, param.data);
+ } else {
+ $.getJSON(param.url, param.where, function (res) {
+ treetable.init(param, res.data);
+ });
+ }
+ },
+ // 渲染表格
+ init: function (param, data) {
+ var mData = [];
+ var doneCallback = param.done;
+ var tNodes = data;
+ // 补上id和pid字段
+ for (var i = 0; i < tNodes.length; i++) {
+ var tt = tNodes[i];
+ if (!tt.id) {
+ if (!param.treeIdName) {
+ layer.msg('参数treeIdName不能为空', {icon: 5});
+ return;
+ }
+ tt.id = tt[param.treeIdName];
+ }
+ if (!tt.pid) {
+ if (!param.treePidName) {
+ layer.msg('参数treePidName不能为空', {icon: 5});
+ return;
+ }
+ tt.pid = tt[param.treePidName];
+ }
+ }
+
+ // 对数据进行排序
+ var sort = function (s_pid, data) {
+ for (var i = 0; i < data.length; i++) {
+ if (data[i].pid == s_pid) {
+ var len = mData.length;
+ if (len > 0 && mData[len - 1].id == s_pid) {
+ mData[len - 1].isParent = true;
+ }
+ mData.push(data[i]);
+ sort(data[i].id, data);
+ }
+ }
+ };
+ sort(param.treeSpid, tNodes);
+
+ // 重写参数
+ param.url = undefined;
+ param.data = mData;
+ param.page = {
+ count: param.data.length,
+ limit: param.data.length
+ };
+ param.cols[0][param.treeColIndex].templet = function (d) {
+ var mId = d.id;
+ var mPid = d.pid;
+ var isDir = d.isParent;
+ var showIcon = true;
+ if (undefined != param.showicon && (param.showicon == true || param.showicon == false)) {
+ showIcon = param.showicon;
+ }
+ var emptyNum = treetable.getEmptyNum(mPid, mData);
+ var iconHtml = '';
+ for (var i = 0; i < emptyNum; i++) {
+ iconHtml += '<span class="treeTable-empty"></span>';
+ }
+ if (showIcon) {
+ if (isDir) {
+ iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>';
+ } else {
+ iconHtml += '<i class="layui-icon layui-icon-file"></i>';
+ }
+ }
+ iconHtml += ' ';
+ var ttype = isDir ? 'dir' : 'file';
+ var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">';
+ return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
+ };
+
+ param.done = function (res, curr, count) {
+ $(param.elem).next().addClass('treeTable');
+ $('.treeTable .layui-table-page').css('display', 'none');
+ $(param.elem).next().attr('treeLinkage', param.treeLinkage);
+ // 绑定事件换成对body绑定
+ /*$('.treeTable .treeTable-icon').click(function () {
+ treetable.toggleRows($(this), param.treeLinkage);
+ });*/
+ if (param.treeDefaultClose) {
+ treetable.foldAll(param.elem);
+ }
+ if (doneCallback) {
+ doneCallback(res, curr, count);
+ }
+ };
+
+ // 渲染表格
+ table.render(param);
+ },
+ // 计算缩进的数量
+ getEmptyNum: function (pid, data) {
+ var num = 0;
+ if (!pid) {
+ return num;
+ }
+ var tPid;
+ for (var i = 0; i < data.length; i++) {
+ if (pid == data[i].id) {
+ num += 1;
+ tPid = data[i].pid;
+ break;
+ }
+ }
+ return num + treetable.getEmptyNum(tPid, data);
+ },
+ // 展开/折叠行
+ toggleRows: function ($dom, linkage) {
+ var type = $dom.attr('lay-ttype');
+ if ('file' == type) {
+ return;
+ }
+ var mId = $dom.attr('lay-tid');
+ var isOpen = $dom.hasClass('open');
+ if (isOpen) {
+ $dom.removeClass('open');
+ } else {
+ $dom.addClass('open');
+ }
+ $dom.closest('tbody').find('tr').each(function () {
+ var $ti = $(this).find('.treeTable-icon');
+ var pid = $ti.attr('lay-tpid');
+ var ttype = $ti.attr('lay-ttype');
+ var tOpen = $ti.hasClass('open');
+ if (mId == pid) {
+ if (isOpen) {
+ $(this).hide();
+ if ('dir' == ttype && tOpen == isOpen) {
+ $ti.trigger('click');
+ }
+ } else {
+ $(this).show();
+ if (linkage && 'dir' == ttype && tOpen == isOpen) {
+ $ti.trigger('click');
+ }
+ }
+ }
+ });
+ },
+ // 检查参数
+ checkParam: function (param) {
+ if (!param.treeSpid && param.treeSpid != 0) {
+ layer.msg('参数treeSpid不能为空', {icon: 5});
+ return false;
+ }
+
+ if (!param.treeColIndex && param.treeColIndex != 0) {
+ layer.msg('参数treeColIndex不能为空', {icon: 5});
+ return false;
+ }
+ return true;
+ },
+ // 展开所有
+ expandAll: function (dom) {
+ $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
+ var $ti = $(this).find('.treeTable-icon');
+ var ttype = $ti.attr('lay-ttype');
+ var tOpen = $ti.hasClass('open');
+ if ('dir' == ttype && !tOpen) {
+ $ti.trigger('click');
+ }
+ });
+ },
+ // 折叠所有
+ foldAll: function (dom) {
+ $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
+ var $ti = $(this).find('.treeTable-icon');
+ var ttype = $ti.attr('lay-ttype');
+ var tOpen = $ti.hasClass('open');
+ if ('dir' == ttype && tOpen) {
+ $ti.trigger('click');
+ }
+ });
+ }
+ };
+
+ layui.link(layui.cache.base + 'treetable-lay/treetable.css');
+
+ // 给图标列绑定事件
+ $('body').on('click', '.treeTable .treeTable-icon', function () {
+ var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage');
+ if ('true' == treeLinkage) {
+ treetable.toggleRows($(this), true);
+ } else {
+ treetable.toggleRows($(this), false);
+ }
+ });
+
+ exports('treetable', treetable);
+});
diff --git a/payapi/src/main/resources/static/libs/custom.js b/payapi/src/main/resources/static/libs/custom.js
new file mode 100644
index 0000000..21e9601
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/custom.js
@@ -0,0 +1,103 @@
+// 自定义全局js
+(function (root) {
+ "use strict";
+
+ root.DictPoolToolkit = function () {
+ var storage = root.localStorage;
+ if (storage == null || storage === undefined) {
+ layer.msg("浏览器不支持 LocalStorage!!!", {icon: 2, time: 1000});
+ return null;
+ }
+
+ return {
+ url: "",
+ storage: storage,
+ pool: {},
+ addNewDict: function (dictType) {
+ var that = this;
+ console.log("正在加载<" + dictType + ">");
+ $.ajax(that.url, {
+ method: "GET",
+ data: "dicttype=" + dictType,
+ contentType: "application/x-www-form-urlencoded",
+ success: function (data) {
+ if (data == null || data === "") {
+ that.storage.removeItem(dictType);
+ } else {
+ that.storage.setItem(dictType, JSON.stringify(data));
+ console.log("<" + dictType + ">加载成功!");
+ }
+ },
+ error: function (e) {
+ console.log("<" + dictType + ">加载失败!");
+ }
+ }
+ );
+ return this;
+ },
+ loadSyncDict: function (dictType) {
+ var that = this;
+ console.log("正在加载<" + dictType + ">");
+ $.ajax(that.url, {
+ method: "GET",
+ data: "dicttype=" + dictType,
+ async: false, //同步
+ contentType: "application/x-www-form-urlencoded",
+ success: function (data) {
+ if (data == null || data == "") {
+ that.storage.removeItem(dictType);
+ } else {
+ that.storage.setItem(dictType, JSON.stringify(data));
+ console.log("<" + dictType + ">加载成功!");
+ }
+ },
+ error: function (e) {
+ console.log("<" + dictType + ">加载失败!");
+ }
+ }
+ );
+ return this;
+ },
+ initAll: function (url) {
+ this.url = url;
+ this.addNewDict("sourcetypeList")
+ .addNewDict("reverseFlagList")
+ .addNewDict("idtypeList")
+ .addNewDict("sexList")
+ .addNewDict("accountStatusList")
+ },
+ getDict: function (dictType) {
+ var dict, that = this;
+ if (that.pool[dictType] !== undefined) {
+ return that.pool[dictType];
+ } else {
+ dict = that.storage.getItem(dictType);
+ if (dict === undefined) {
+ return null;
+ } else {
+ that.pool[dictType] = JSON.parse(dict);
+ return that.pool[dictType];
+ }
+ }
+ },
+ getDictValue: function (dictType, code) {
+ var dict, that = this;
+ dict = that.getDict(dictType);
+ if (dict == null) {
+ return code;
+ } else {
+ var c = "" + code;
+ return dict[c] === undefined ? code : dict[c];
+ }
+ }
+ }
+ }
+
+ root.getTempDictValue = function (dicttype, key) {
+ return DictPoolToolkit().getDictValue(dicttype, key);
+ }
+
+ root.dateFormat = function (str) {
+ return str.replace(/^(\d{4})(\d{2})(\d{2})$/, '$1-$2-$3'); //yyyyMMdd --> yyyy-MM-dd
+ }
+}(window));
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/jquery/jquery-3.2.1.min.js b/payapi/src/main/resources/static/libs/jquery/jquery-3.2.1.min.js
new file mode 100755
index 0000000..644d35e
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/jquery/jquery-3.2.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),
+a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&da(a),q=W.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],cb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=W.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ia([a],!0),j=a.style.display||j,k=r.css(a,"display"),ia([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=W.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ia([a],!0),m.done(function(){p||ia([a]),W.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=hb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=kb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=ab||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:ab||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);f<g;f++)if(d=kb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,hb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}r.Animation=r.extend(kb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return fa(c.elem,a,ba.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(L);for(var c,d=0,e=a.length;d<e;d++)c=a[d],kb.tweeners[c]=kb.tweeners[c]||[],kb.tweeners[c].unshift(b)},prefilters:[ib],prefilter:function(a,b){b?kb.prefilters.unshift(a):kb.prefilters.push(a)}}),r.speed=function(a,b,c){var d=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in r.fx.speeds?d.duration=r.fx.speeds[d.duration]:d.duration=r.fx.speeds._default),null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){r.isFunction(d.old)&&d.old.call(this),d.queue&&r.dequeue(this,d.queue)},d},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(da).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=kb(this,r.extend({},a),f);(e||W.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=W.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&db.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=W.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),r.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(ab=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),ab=void 0},r.fx.timer=function(a){r.timers.push(a),r.fx.start()},r.fx.interval=13,r.fx.start=function(){bb||(bb=!0,eb())},r.fx.stop=function(){bb=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var lb,mb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),
+null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Tb=[],Ub=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Tb.pop()||r.expando+"_"+ub++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ub.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ub.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ub,"$1"+e):b.jsonp!==!1&&(b.url+=(vb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Tb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=pb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Vb=a.jQuery,Wb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Wb),b&&a.jQuery===r&&(a.jQuery=Vb),r},b||(a.jQuery=a.$=r),r});
diff --git a/payapi/src/main/resources/static/libs/layui/css/layui.css b/payapi/src/main/resources/static/libs/layui/css/layui.css
new file mode 100755
index 0000000..825e383
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/css/layui.css
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ .layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-elip,.layui-form-checkbox span,.layui-form-pane .layui-form-label{text-overflow:ellipsis;white-space:nowrap}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:24px;font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{height:1px;margin:10px 0;border:0;clear:both}a{color:#333;text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-edge{display:inline-block;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{overflow:hidden}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=240);src:url(../font/iconfont.eot?v=240#iefix) format('embedded-opentype'),url(../font/iconfont.svg?v=240#iconfont) format('svg'),url(../font/iconfont.woff?v=240) format('woff'),url(../font/iconfont.ttf?v=240) format('truetype')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-home:before{content:"\e68e"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-cols:before{content:"\e610"}.layui-icon-export:before{content:"\e67d"}.layui-icon-print:before{content:"\e66d"}.layui-icon-slider:before{content:"\e714"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:absolute;left:200px;right:0;top:0;bottom:0;z-index:998;width:auto;overflow:hidden;overflow-y:auto;box-sizing:border-box}.layui-layout-body{overflow:hidden}.layui-layout-admin .layui-header{background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{top:60px;bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;height:44px;line-height:44px;padding:0 15px;background-color:#eee}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:'';display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space3{margin:-1.5px}.layui-col-space3>*{padding:1.5px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space8{margin:-3.5px}.layui-col-space8>*{padding:3.5px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:22px;border-left:5px solid #009688;border-radius:0 2px 2px 0;background-color:#f2f2f2}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:10px 15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#e2e2e2}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#f2f2f2;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-header{position:relative;height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-card-body{position:relative;padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #E6E6E6;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-textarea{position:relative}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#eee!important;color:#666!important}.layui-badge-rim,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#e6e6e6}.layui-timeline-item:before,hr{background-color:#e6e6e6}.layui-text{line-height:22px;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding:0 5px!important}.layui-btn{display:inline-block;height:38px;line-height:38px;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border:none;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{margin-right:3px;font-size:18px;vertical-align:bottom;vertical-align:middle\9}.layui-btn-primary{border:1px solid #C9C9C9;background-color:#fff;color:#555}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border:1px solid #e6e6e6;background-color:#FBFBFB;color:#C9C9C9;cursor:not-allowed;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-sm i{font-size:16px!important}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:14px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#C9C9C9;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #c9c9c9}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3;color:#bbb;}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#D2D2D2!important}.layui-input:focus,.layui-textarea:focus{border-color:#C9C9C9!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f2f2f2;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disbaled,.layui-checkbox-disbaled i{border-color:#e2e2e2!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio>i:hover,.layui-form-radioed>i{color:#5FB878}.layui-radio-disbaled>i{color:#e2e2e2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #e2e2e2}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#e2e2e2;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #e2e2e2}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#f2f2f2}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#e6e6e6}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#f2f2f2}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:0 -1px 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#C9C9C9}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{padding:0 10px;color:#999}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-tree{line-height:26px}.layui-tree li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-tree li .layui-tree-spread,.layui-tree li a{display:inline-block;vertical-align:top;height:26px;*display:inline;*zoom:1;cursor:pointer}.layui-tree li a{font-size:0}.layui-tree li a i{font-size:16px}.layui-tree li a cite{padding:0 6px;font-size:14px;font-style:normal}.layui-tree li i{padding-left:6px;color:#333;-moz-user-select:none}.layui-tree li .layui-tree-check{font-size:13px}.layui-tree li .layui-tree-check:hover{color:#009E94}.layui-tree li ul{display:none;margin-left:20px}.layui-tree li .layui-tree-enter{line-height:24px;border:1px dotted #000}.layui-tree-drag{display:none;position:absolute;left:-666px;top:-666px;background-color:#f2f2f2;padding:5px 10px;border:1px dotted #000;white-space:nowrap}.layui-tree-drag i{padding-right:5px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar,.layui-nav-tree .layui-nav-itemed:after{position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s}.layui-nav-bar{z-index:1000}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{content:'';top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#fff transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:50%;right:3px;margin-top:-3px;border-width:6px;border-top-color:rgba(255,255,255,.7)}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{margin-top:-9px;border-style:dashed dashed solid;border-color:transparent transparent #fff}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #d2d2d2;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#333}.layui-nav .layui-nav-child a:hover{background-color:#f2f2f2;color:#000}.layui-nav-child dd{position:relative}.layui-nav .layui-nav-child dd.layui-this a,.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:45px}.layui-nav-tree .layui-nav-item a{position:relative;height:45px;line-height:45px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item a:hover{background-color:#4E5465}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child a{height:40px;line-height:40px;color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-tree .layui-nav-more{right:10px}.layui-nav-itemed>.layui-nav-child{display:block;padding:0;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-bg-blue .layui-nav-bar,.layui-bg-blue .layui-nav-itemed:after,.layui-bg-blue .layui-this:after{background-color:#93D1FF}.layui-bg-blue .layui-nav-child dd.layui-this{background-color:#1E9FFF}.layui-bg-blue .layui-nav-itemed>a,.layui-nav-tree.layui-bg-blue .layui-nav-title a,.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover{background-color:#007DDB!important}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#e2e2e2;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:10px}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#f2f2f2}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:'';position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:last-child:before{display:none}.layui-timeline-item:first-child:before{display:block}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-8px 6px 0}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#e2e2e2;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New;font-size:12px}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #e6e6e6;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;z-index:66666666;width:280px;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#e2e2e2;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:'';position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #e6e6e6;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-15px}.layui-slider-input-btn{display:none;position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #d2d2d2}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #d2d2d2}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:34px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .3s;-webkit-transition:all .3s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/css/layui.mobile.css b/payapi/src/main/resources/static/libs/layui/css/layui.mobile.css
new file mode 100755
index 0000000..6f7f0a1
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/css/layui.mobile.css
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}@-webkit-keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-left{0%{-webkit-transform:translateX(100%);transform:translateX(100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-left{-webkit-animation-name:layui-m-anim-left;animation-name:layui-m-anim-left}@-webkit-keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes layui-m-anim-right{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.layui-m-anim-right{-webkit-animation-name:layui-m-anim-right;animation-name:layui-m-anim-right}@-webkit-keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes layui-m-anim-lout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.layui-m-anim-lout{-webkit-animation-name:layui-m-anim-lout;animation-name:layui-m-anim-lout}@-webkit-keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes layui-m-anim-rout{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{-webkit-transform:translateX(100%);transform:translateX(100%)}}.layui-m-anim-rout{-webkit-animation-name:layui-m-anim-rout;animation-name:layui-m-anim-rout}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/css/modules/code.css b/payapi/src/main/resources/static/libs/layui/css/modules/code.css
new file mode 100755
index 0000000..d0d3822
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/css/modules/code.css
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/css/modules/laydate/default/laydate.css b/payapi/src/main/resources/static/libs/layui/css/modules/laydate/default/laydate.css
new file mode 100755
index 0000000..f7e690e
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/css/modules/laydate/default/laydate.css
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:laydate-upbit;animation-name:laydate-upbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@-webkit-keyframes laydate-upbit{from{-webkit-transform:translate3d(0,20px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes laydate-upbit{from{transform:translate3d(0,20px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.laydate-set-ym span,.layui-laydate-header i{padding:0 5px;cursor:pointer}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;color:#999;font-size:18px}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;height:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px 20px}.layui-laydate-footer span{margin-right:15px;display:inline-block;cursor:pointer;font-size:12px}.layui-laydate-footer span:hover{color:#5FB878}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{height:26px;line-height:26px;margin:0 0 0 -1px;padding:0 10px;border:1px solid #C9C9C9;background-color:#fff;white-space:nowrap;vertical-align:top;border-radius:2px}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-0 .laydate-next-m,.layui-laydate-range .laydate-main-list-0 .laydate-next-y,.layui-laydate-range .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#00F7DE}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eaeaea;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/icon-ext.png b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/icon-ext.png
new file mode 100755
index 0000000..bbbb669
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/icon-ext.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/icon.png b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/icon.png
new file mode 100755
index 0000000..3e17da8
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/icon.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/layer.css b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/layer.css
new file mode 100755
index 0000000..157d537
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/layer.css
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/loading-0.gif b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/loading-0.gif
new file mode 100755
index 0000000..6f3c953
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/loading-0.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/loading-1.gif b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/loading-1.gif
new file mode 100755
index 0000000..db3a483
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/loading-1.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/loading-2.gif b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/loading-2.gif
new file mode 100755
index 0000000..5bb90fd
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/loading-2.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/font/iconfont.eot b/payapi/src/main/resources/static/libs/layui/font/iconfont.eot
new file mode 100755
index 0000000..93b3d5a
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/font/iconfont.eot
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/font/iconfont.svg b/payapi/src/main/resources/static/libs/layui/font/iconfont.svg
new file mode 100755
index 0000000..1c7ffe9
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/font/iconfont.svg
@@ -0,0 +1,473 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<!--
+2013-9-30: Created.
+-->
+<svg>
+<metadata>
+Created by iconfont
+</metadata>
+<defs>
+
+<font id="layui-icon" horiz-adv-x="1024" >
+ <font-face
+ font-family="layui-icon"
+ font-weight="500"
+ font-stretch="normal"
+ units-per-em="1024"
+ ascent="896"
+ descent="-128"
+ />
+ <missing-glyph />
+
+ <glyph glyph-name="reply-fill" unicode="" d="M507.904 835.5840000000001q93.184 1.024 175.104-33.792t143.872-94.72 97.792-141.312 36.864-174.592q1.024-88.064-30.208-165.888t-87.04-137.728-131.072-98.816-162.304-48.128q-22.528-3.072-48.128-5.12t-56.832-3.072-69.632 0-86.528 6.144q-106.496 10.24-158.208 26.624t-41.472 18.432q54.272 9.216 93.184 29.696 20.48 11.264 16.896 32.256t-19.968 39.424q-52.224 57.344-84.48 133.632t-34.304 164.352q-1.024 93.184 33.792 175.104t95.232 143.36 142.336 97.28 175.104 36.864zM707.584 385.024q0-26.624 18.432-45.568t45.056-18.944 45.568 18.944 18.944 45.568-18.944 45.056-45.568 18.432-45.056-18.432-18.432-45.056zM450.56 385.024q0-26.624 19.456-46.08t46.08-19.456q27.648 0 46.592 19.456t18.944 46.08q0 27.648-18.944 46.592t-46.592 18.944q-26.624 0-46.08-18.944t-19.456-46.592zM196.608 386.048q0-26.624 18.944-46.08t45.568-19.456q27.648 0 46.592 19.456t18.944 46.08-18.944 45.568-46.592 18.944q-26.624 0-45.568-18.944t-18.944-45.568z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="set-fill" unicode="" d="M916.9398 445.2101l-69.9664 10.7833c-18.6619 2.863-38.1388 17.826-43.3424 33.2487-5.1618 15.3809-15.0883 65.4524-3.9288 80.6661l41.9004 57.135c11.1595 15.2346 9.3832 38.5985-3.9706 51.9314l-30.6364 30.6573c-13.3538 13.3538-36.7177 15.151-51.9314 3.9497l-57.135-41.8795c-15.2346-11.1804-39.4344-14.3987-53.7704-7.168-14.3569 7.2307-57.3022 35.7773-60.1652 54.4183l-10.7833 69.9664C570.3471 807.6016 552.542 822.8571 533.6712 822.8571h-43.34236734693877c-18.8709 0-36.6759-15.2555-39.5389-33.9174l-10.7833-69.9664c-2.863-18.6619-17.826-38.1388-33.2487-43.3424-15.4018-5.1827-65.4524-15.1092-80.687-3.9288L268.9567 713.5817c-15.2346 11.1804-38.6194 9.3832-51.9523-3.9497l-30.6364-30.6573c-13.3747-13.3538-15.151-36.7177-3.9706-51.9314l41.9004-57.135c11.1595-15.2346 14.3778-39.4136 7.168-53.7704-7.2307-14.3569-35.7773-57.2813-54.4183-60.1443l-69.9664-10.7833C88.3984 442.3471 73.1429 424.542 73.1429 405.6712v-43.34236734693877c0-18.8709 15.2555-36.6759 33.9174-39.5389l69.9664-10.7833c18.6619-2.863 38.1388-17.8469 43.3424-33.2487 5.1618-15.4018 15.0883-65.4733 3.9288-80.687l-41.9004-57.135c-11.1595-15.2346-9.3832-38.6194 3.9706-51.9314l30.6364-30.6573c13.3538-13.3538 36.7177-15.151 51.9523-3.9706l57.135 41.9213c15.2346 11.1386 39.4136 14.3778 53.7704 7.168 14.3569-7.2307 57.2813-35.7773 60.1443-54.4183l10.7833-69.9664c2.863-18.6619 20.6472-33.9174 39.5389-33.9174h43.34236734693877c18.8709 0 36.6759 15.2555 39.5389 33.9174l10.7833 69.9664c2.863 18.6619 17.826 38.1388 33.2487 43.3215 15.4018 5.1827 65.4524 15.0883 80.6661 3.9288l57.1559-41.9213c15.2346-11.1595 38.5985-9.3623 51.9314 3.9706l30.6364 30.6573c13.3747 13.3329 15.151 36.7177 3.9706 51.9314l-41.9004 57.135c-11.1595 15.2346-14.3778 39.4136-7.168 53.7496 7.2307 14.3778 35.7773 57.3231 54.4183 60.1861l69.9664 10.7833c18.6619 2.863 33.9174 20.6472 33.9174 39.5389v43.34236734693877C950.8571 424.542 935.6016 442.3471 916.9398 445.2101zM512 210.4633c-95.838 0-173.5367 77.6986-173.5367 173.5367s77.6986 173.5367 173.5367 173.5367 173.5367-77.6986 173.5367-173.5367S607.838 210.4633 512 210.4633zM512 384m-104.7824 0a5.014 5.014 0 1 1 209.5647 0 5.014 5.014 0 1 1-209.5647 0Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="menu-fill" unicode="" d="M511.999488 834.254727c-248.678712 0-450.273176-201.585181-450.273176-450.254727s201.594464-450.254727 450.273176-450.254727 450.273176 201.585181 450.273176 450.254727S760.6782 834.254727 511.999488 834.254727zM266.371377 589.705012l491.256222 0 0-33.772174L266.371377 555.932838 266.371377 589.705012zM757.627599 178.29396499999996L266.371377 178.29396499999996l0 33.773198 491.256222 0L757.627599 178.29396499999996zM140.487278 367.11340099999995l0 33.771151 743.024421 0 0-33.771151L140.487278 367.11340099999995z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="search" unicode="" d="M439.323351 120.52219c-49.280352 0-97.09834 9.656941-142.126681 28.699646-43.480015 18.388812-82.522793 44.706201-116.043584 78.225619s-59.841305 72.560596-78.230871 116.03883C83.878729 388.513804 74.222416 436.330856 74.222416 485.609189c0 49.284473 9.656313 97.104595 28.699798 142.133138 18.388542 43.479257 44.71008 82.520435 78.231894 116.03883 33.518745 33.515325 72.562546 59.832713 116.043584 78.219479 45.027318 19.039635 92.846329 28.694529 142.125658 28.694529 49.280352 0 97.099364-9.653871 142.126681-28.694529 43.481039-18.385742 82.525863-44.704155 116.044608-78.220502 33.520791-33.518395 59.842328-72.559573 78.230871-116.03883 19.042462-45.028543 28.699798-92.848665 28.699798-142.133138 0-49.278333-9.657336-97.095385-28.701845-142.122905-18.388542-43.47721-44.708033-82.520435-78.228824-116.03883s-72.563569-59.838853-116.043584-78.226642C536.422715 130.177084 488.603703 120.52219 439.323351 120.52219zM439.323351 797.483242c-171.975699 0-311.887855-139.906423-311.887855-311.875077S267.347652 173.734112 439.323351 173.734112s311.887855 139.907447 311.887855 311.874053S611.299051 797.483242 439.323351 797.483242zM890.678206-48.734702c-22.121716 0-42.90387 8.562003-58.541653 24.115234L674.672953 128.025071l37.039062 38.20616 157.888289-153.058978c5.606924-5.606695 13.091693-8.692986 21.077901-8.692986 7.983139 0 15.464837 3.087315 21.070738 8.69094 5.616135 5.622044 8.715856 13.126972 8.715856 21.123087 0 7.980765-3.091535 15.46318-8.702552 21.067828l-0.301888 0.306992L758.714395 213.230662l38.207726 37.035498 152.611906-157.427472c15.571265-15.638165 24.144876-36.422538 24.144876-58.549487 0-22.195511-8.625801-43.054585-24.287121-58.735729C933.723298-40.112324 912.876674-48.734702 890.678206-48.734702zM281.015489 327.245392c-42.340005 42.320874-65.652899 98.584296-65.643689 158.421102 0.008187 59.818387 23.319034 116.074645 65.637549 158.4078l37.634651-37.619806c-66.60666-66.629513-66.60973-175.00071-0.007163-241.577011L281.015489 327.245392z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="share" unicode="" d="M769.714 306.453c-51.754 0-97.702-24.851-126.571-63.269L394.479 367.94100000000003c3.93 13.798 6.034 28.364 6.034 43.424 0 16.496-2.527 32.399-7.211 47.35l247.724 124.288c28.71-40.052 75.647-66.151 128.687-66.151 87.388 0 158.229 70.84 158.229 158.229 0 87.388-70.841 158.229-158.229 158.229-87.389 0-158.229-70.841-158.229-158.229 0-6.046 0.352-12.009 1.011-17.88L351.22 526.116c-28.371 26.943-66.723 43.479-108.938 43.479-87.388 0-158.229-70.84-158.229-158.229s70.84-158.229 158.229-158.229c43.752 0 83.354 17.758 111.997 46.459l258.676-129.779c-0.964-7.062-1.474-14.266-1.474-21.592 0-87.389 70.84-158.229 158.229-158.229s158.229 70.84 158.229 158.229C927.938 235.61199999999997 857.103 306.453 769.714 306.453L769.714 306.453z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="set-sm" unicode="" d="M946.367 405.895c0.02 21.85-13.04 38.49-31.74 41.57-18.69 3.07-79.05 13.01-85.99 14.14-6.95 1.15-14.09 8.07-15.4 11.45-1.32 3.37-8.94 22.2-11.87 29.46-2.95 7.27-1.92 16.58 4.39 25.52 6.3 8.93 39.9 55.87 48.38 67.72 8.49 11.87 8.65 34.61-4.84 48.39-13.48 13.78-47.75 47.09-56.73 55.86-8.99 8.76-31.08 8.64-42.67 0.43-11.58-8.2-71.69-51.01-71.69-51.01s-9.97-6.89-20.67-2.64c-10.7 4.24-33.43 14.07-33.43 14.07s-7.19 5.43-9.68 19.79c-2.5 14.37-11.11 65.28-14.07 82.7-2.97 17.42-20.67 29.62-37.83 29.46-17.16-0.14-57.91 0-74.33 0s-32.26-15.68-34.75-29.46c-2.49-13.79-11.56-69.16-14.07-84.45-2.52-15.3-11.44-18.48-11.44-18.48s-19.56-8.06-29.91-12.31c-10.34-4.26-15.39-2.64-30.35 7.48-14.95 10.11-44.74 31.03-63.04 43.83-18.3 12.81-38.12 7.92-49.26-3.52s-36.06-35.77-51.02-50.43c-14.95-14.66-12.61-37.54 0.58-55.71 13.2-18.18 32.34-45.43 41.35-58.21 9.01-12.78 10.84-19.5 8.36-26.82-2.49-7.34-6.64-16.58-11.43-27.72-4.81-11.13-9.69-13.64-27.86-17.01-17.36-3.21-58.42-9.92-77.4-13.31-18.99-3.37-30.66-21.43-30.66-41.81l0-64.66c0-24.34 13.2-37.24 38.42-41.93 25.22-4.69 62.66-10.66 74.77-12.61 12.1-1.95 17.67-6.6 21.41-15.54 3.73-8.94 5.13-10.12 9.37-22.57 4.26-12.47 6.46-15.55-4.98-31.67-11.44-16.13-34.31-48.11-46.03-64.51-11.74-16.4-6.45-37.83 4.98-49.85 11.44-12.03 35.47-35.64 48.97-48.97 13.49-13.33 35.19-16.28 53.36-3.52 18.19 12.75 54.98 38.99 65.69 46.62 10.7 7.63 21.91 5.28 27.85 2.94 5.94-2.35 11.25-4.6 22-9.1 10.73-4.48 13.85-11.2 16.41-23.45 2.57-12.24 10.19-56.85 13.93-78.59 3.75-21.72 18.91-33.43 40.62-33.72 21.7-0.29 33.27-0.12 61.57 0 28.29 0.13 41.86 12.61 45.45 31.38 3.59 18.76 12.45 72.94 14.22 83.72 1.78 10.76 5.94 14.73 13.63 18.47 7.7 3.74 14.32 6.47 26.84 11.88 12.51 5.4 18.91 0.66 27.7-5.72 8.8-6.39 47.51-33.78 63.78-45.31 16.28-11.53 36.73-10.33 51.9 4.4 15.18 14.73 31.62 30.99 49.27 48.38 17.64 17.4 12.16 39.59 4.4 51.46-7.77 11.88-44.49 62.95-49.71 70.23-5.21 7.28-4.4 18.62-1.75 24.63 2.64 6.01 8.44 18.24 11.72 25.22 3.29 6.97 9.6 11.22 18.18 12.9 8.58 1.69 62.72 11 83.75 14.61 21.03 3.64 31.11 19.92 31.26 39.92C946.427 359.93499999999995 946.347 388.525 946.367 405.895zM908.587 338.615c0.21-5.76-4.66-10.65-8.82-11.38-4.17-0.73-63.26-11.38-81.48-14.29-18.21-2.92-33.23-15.07-38.72-28.06-3.98-9.44-5.47-13.51-10.59-26.96-5.12-13.44-4.64-32.19 2.56-42.26 7.2-10.08 46.82-64.9 50.38-70.45s4.27-11.95-1.28-17.5-40.99-41.2-47.39-47.39c-6.41-6.19-11.83-4.8-18.79 0-6.95 4.8-39.61 26.39-64.44 44.36-16.96 12.28-32.82 12.43-48.7 6.02-15.87-6.42 1.28 0.28-22.2-8.97-23.48-9.25-30.23-27.62-33.73-48.24-3.5-20.63-10.67-62.98-11.95-70.45-1.28-7.47-5.55-11.1-13.66-11.1l-64.9 0c-8.11 0-11.74 2.99-14.52 11.95-2.77 8.97-10.03 54.87-12.8 74.29-2.78 19.43-13.82 36.12-24.77 40.56-10.94 4.45-4.98 2.14-27.32 11.1-22.34 8.97-39.63 4.5-51.23-3.84-11.61-8.34-58.64-42.69-65.33-46.96-6.68-4.28-14.65-3.28-18.35 0.42-3.7 3.7-40.56 40.56-46.54 46.54-5.98 5.98-5.36 12.92 0 20.49 5.36 7.58 28.39 40.76 40.99 57.95 12.59 17.2 17.93 34.74 9.82 53.49-8.12 18.74-4.42 10.24-12.39 28.6-7.96 18.36-24.28 24.46-38.42 26.9-14.14 2.43-68.88 11.53-76.85 13.23-7.97 1.71-11.95 7.26-11.95 14.09l0 66.18c0 9.53 7.67 12.44 12.38 13.23 4.7 0.8 54.22 9.18 73 12.39 18.79 3.2 36.36 11.32 43.55 29.03 7.19 17.7 4.27 11.1 11.1 27.32 6.83 16.23 3.8 33.94-7.68 49.96-11.49 16.01-38.85 54-44.4 61.9-5.55 7.9-5.77 12.6 0.85 19.21 6.62 6.62 42.05 42.48 46.96 46.97 4.91 4.48 12.07 5.4 18.36 0.85 6.3-4.55 49.31-35.65 64.04-46.11 14.73-10.46 32.35-12.56 49.1-5.55 16.75 7.02 10.25 4.48 26.9 11.1s24.84 19.09 28.18 39.71c3.33 20.61 11.95 74.14 12.81 77.7 0.85 3.55 5.55 10.46 11.74 10.46s65.82-0.07 69.8 0c3.99 0.07 10.3-3.29 11.32-9.18 1.02-5.9 13.02-74.29 14.94-86.25 1.92-11.95 15.58-28.57 25.54-32.73 9.96-4.16 21.35-8.75 31.31-13.09 9.97-4.34 30.13-1.91 36.15 2.28 6.03 4.18 70.52 48.81 75.43 52.37 4.91 3.56 11.52 3.27 17.64-2.85s43.34-43.19 47.54-47.53c4.19-4.34 4.66-8.66 1.14-13.66-3.53-5.01-36.72-51.8-47.54-67.46-10.81-15.65-11.73-33.73-5.41-48.96 6.33-15.22 3.99-9.39 9.11-21.91 5.13-12.53 16.28-29.03 33.59-31.88 17.31-2.85 76.92-12.74 84.82-13.95 7.9-1.21 11.1-7.18 11.1-13.37S908.377 344.385 908.587 338.615zM526.833 573.1949999999999c-110.45 0-200-89.54-200-200s89.55-200 200-200c110.46 0 200 89.54 200 200S637.293 573.1949999999999 526.833 573.1949999999999zM526.833 208.19500000000005c-91.12 0-165 73.87-165 165s73.88 165 165 165c91.13 0 165-73.87 165-165S617.963 208.19500000000005 526.833 208.19500000000005z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="engine" unicode="" d="M422.214332 360.70413299999996L186.183684 360.70413299999996l0 46.568461 236.030648 0c10.379577 40.075407 46.47537 69.794509 89.785668 69.794509 51.432433 0 93.067103-41.657943 93.067103-93.067103C605.067103 332.56756700000005 563.40916 290.909624 512 290.909624 468.689703 290.909624 432.593909 320.65199900000005 422.214332 360.70413299999996L422.214332 360.70413299999996zM512 779.634098c-218.529658 0-395.634098-177.10444-395.634098-395.634098 0-218.529658 177.10444-395.634098 395.634098-395.634098 154.76275 0 288.417257 89.064217 353.440885 218.55293l101.398692-59.112389-23.063141-39.959044-62.161099 35.909613c-33.745261-51.595341-77.42792-96.115813-129.093079-129.744711l35.653614-61.765464-40.308133-23.295867-35.653614 61.765464c-53.620057-27.345298-113.360805-44.404109-176.894987-47.73209L535.319139-127.99706800000001l-46.568461 0 0 70.981412c-63.534182 3.327981-123.27493 20.386792-176.894987 47.73209l-35.653614-61.765464-40.308133 23.295867 35.653614 61.765464c-51.665159 33.628898-95.347818 78.149371-129.093079 129.744711l-62.161099-35.909613-23.295867 40.308133 62.114553 35.863067c-27.415116 53.550239-44.799743 113.104807-48.127724 176.685534L0.002932 360.70413299999996l0 46.568461 70.958139 0c3.327981 63.580727 20.712609 123.135295 48.127724 176.685534l-62.114553 35.863067 23.295867 40.308133 62.161099-35.909613c33.745261 51.595341 77.42792 96.115813 129.093079 129.744711l-35.653614 61.765464 40.308133 23.295867 35.653614-61.765464c53.620057 27.345298 113.360805 44.404109 176.894987 47.73209L488.727406 895.997068l46.568461 0 0-70.981412c63.534182-3.327981 123.27493-20.386792 176.894987-47.73209l35.653614 61.765464 40.308133-23.295867-35.653614-61.765464c51.665159-33.628898 95.347818-78.149371 129.093079-129.744711l62.161099 35.909613 23.063141-39.959044-101.398692-59.112389C800.417257 690.569881 666.76275 779.634098 512 779.634098L512 779.634098z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="close" unicode="ဆ" d="M783.483 701.249L512 429.775 240.517 701.249c-10.082 10.083-26.429 10.083-36.51 0-10.083-10.082-10.083-26.429 0-36.509l271.481-271.475L204.008 121.78800000000001c-10.083-10.081-10.083-26.428 0-36.508 10.082-10.082 26.429-10.082 36.51 0L512 356.755l271.483-271.475c10.082-10.082 26.429-10.082 36.513 0 10.081 10.083 10.081 26.428 0 36.508L548.51 393.265l271.485 271.474c10.081 10.083 10.081 26.429 0 36.509C809.912 711.33 793.564 711.33 783.483 701.249z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="close-fill" unicode="ဇ" d="M512 822.022125c-217.47508 0-394.423141-176.949085-394.423141-394.423141 0-217.474057 176.948061-394.422118 394.423141-394.422118 217.473033 0 394.422118 176.948061 394.422118 394.422118C906.422118 645.07304 729.473033 822.022125 512 822.022125zM702.228529 270.92978200000005c8.030907-8.030907 8.030907-21.052478 0-29.083385s-21.052478-8.030907-29.083385 0L512 402.992563 350.853833 241.84741899999995c-8.030907-8.030907-21.052478-8.030907-29.083385 0s-8.030907 21.052478 0 29.083385l161.146167 161.146167L321.771471 593.222115c-8.030907 8.030907-8.030907 21.052478 0 29.083385s21.052478 8.030907 29.083385 0l161.146167-161.146167L673.145144 622.305501c8.030907 8.030907 21.052478 8.030907 29.083385 0s8.030907-21.052478 0-29.083385L541.082362 432.075949 702.228529 270.92978200000005z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="chart-screen" unicode="" d="M963.930903 179.21903299999997l0 34.824133-37.354769-2.675946L926.576133 694.8538169999999 691.413206 694.8538169999999l0 70.462818L330.260819 765.316635l0-70.462818L95.690386 694.8538169999999l0-480.809627-35.621289 0 0-34.824133 432.583253 0 0-141.228535-90.313935 0 0-35.307134 216.753649 0 0 35.307134-90.313935 0L528.778128 179.21903299999997 963.930903 179.21903299999997zM366.212636 730.008478L655.216819 730.008478l0-35.307134L366.212636 694.7013440000001 366.212636 730.008478zM364.817869 332.73133600000006L222.224244 406.252817l14.295588 27.736715 123.238812-63.523779 173.928285 159.755494 127.5807-92.634794 93.13826 122.414027 12.420891-9.449209 12.420891-9.449209L667.639756 394.365068l-131.636063 95.621824L364.817869 332.73133600000006z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="star" unicode="" d="M749.624889-84.152889c-15.672889 0-31.246222 3.882667-45.084444 11.306667l-192.526222 103.637333L319.544889-72.817778c-31.203556-16.64-70.314667-14.392889-99.043556 5.304889-29.511111 20.337778-44.743111 55.921778-38.840889 90.695111l37.703111 225.251556L56.661333 410.908444c-25.002667 24.888889-33.464889 60.984889-22.058667 94.193778 11.349333 32.910222 40.064 56.576 74.965333 61.752889l221.326222 32.896 96.128 199.580444c15.488 32.085333 48.853333 52.807111 84.992 52.807111 36.167111 0 69.518222-20.736 84.963556-52.807111l96.156444-199.580444 221.297778-32.910222c34.872889-5.162667 63.616-28.8 74.979556-61.696 11.392-33.28 2.944-69.361778-22.030222-94.250667L804.622222 248.433778l37.745778-225.28c5.845333-34.773333-9.386667-70.357333-38.812444-90.638222C787.569778-78.392889 768.938667-84.152889 749.624889-84.152889zM512.014222 91.548444c4.636444 0 9.272889-1.137778 13.482667-3.384889l205.937778-110.862222c12.373333-6.641778 28.316444-5.802667 39.936 2.133333 11.392 7.836444 17.123556 21.006222 14.890667 34.304L746.097778 253.496889c-1.507556 9.088 1.450667 18.332444 7.964444 24.832l173.141333 172.842667c9.457778 9.429333 12.686222 23.025778 8.405333 35.484444-4.380444 12.672-15.701333 21.873778-29.525333 23.921778L669.866667 545.706667c-9.315556 1.379556-17.365333 7.296-21.447111 15.786667L545.720889 774.641778c-6.030222 12.529778-19.256889 20.608-33.706667 20.608s-27.690667-8.092444-33.763556-20.622222L375.608889 561.493333c-4.081778-8.490667-12.131556-14.407111-21.447111-15.786667L117.930667 510.577778c-13.624889-2.033778-25.201778-11.434667-29.539556-23.992889-4.266667-12.416-1.024-25.984 8.433778-35.399111L269.937778 278.328889c6.513778-6.499556 9.472-15.744 7.964444-24.832l-40.135111-239.744c-2.247111-13.312 3.484444-26.439111 14.976-34.360889 11.434667-7.836444 27.349333-8.775111 39.950222-2.062222l205.852444 110.833778C502.741333 90.410667 507.377778 91.548444 512.014222 91.548444zM200.32 439.210667c-6.840889 0-12.885333 4.963556-14.023111 11.946667-1.251556 7.751111 4.010667 15.061333 11.761778 16.312889l9.443556 1.536c7.793778 1.336889 15.061333-4.010667 16.312889-11.761778 1.251556-7.751111-4.010667-15.061333-11.761778-16.312889l-9.443556-1.536C201.856 439.267556 201.073778 439.210667 200.32 439.210667zM252.544 447.687111c-6.684444 0-12.643556 4.721778-13.937778 11.534222-1.493333 7.708444 3.555556 15.175111 11.264 16.654222l153.927111 29.696 58.055111 133.148444c3.157333 7.182222 11.548444 10.496 18.716444 7.352889 7.210667-3.143111 10.510222-11.52 7.367111-18.716444l-61.056-140.017778c-1.877333-4.295111-5.745778-7.395556-10.353778-8.277333l-161.28-31.118222C254.336 447.758222 253.44 447.687111 252.544 447.687111z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="circle-dot" unicode="" d="M513.133312 830.6731560000001c-247.538793 0-448.208115-200.669322-448.208115-448.207092 0-247.538793 200.670346-448.208115 448.208115-448.208115 247.538793 0 448.208115 200.670346 448.208115 448.208115C961.341427 630.004857 760.673128 830.6731560000001 513.133312 830.6731560000001zM513.132288-6.649187999999981c-214.901465 0-389.113205 174.212764-389.113205 389.114229 0 214.902488 174.21174 389.115252 389.113205 389.115252 214.903511 0 389.115252-174.212764 389.115252-389.115252C902.24754 167.563576 728.0358-6.649187999999981 513.132288-6.649187999999981zM513.133312 382.46504100000004m-344.602456 0a336.754 336.754 0 1 1 689.204911 0 336.754 336.754 0 1 1-689.204911 0Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="chat" unicode="" d="M132.682393 414.567179c0 208.287837 166.471452 377.143593 379.317095 377.143593s385.380184-168.855756 385.380184-377.143593c0-177.196725-122.197086-325.812507-290.49821-366.259708l-116.291586-51.04763 0 41.126676C290.570353 52.175568999999996 132.682393 215.31206599999996 132.682393 414.567179zM83.799056 414.567179c0-211.946157 160.764474-387.135154 369.469819-415.152255-3.2623-20.458961-10.036587-65.024969-7.286963-65.024969 2.384303 0 114.89068 47.294143 189.700503 78.865185 176.193885 51.91437 304.518528 211.946157 304.518528 401.312038 0 231.432976-191.70823 419.042865-428.200432 419.042865S83.799056 646.0001560000001 83.799056 414.567179zM340.71952 276.63573699999995c22.935362-41.481763 89.831958-75.102489 170.391738-75.102489 79.650061 0 148.489916 32.909527 172.168198 73.681116-12.701277 5.979178-19.068288 8.02886-28.131711 12.21009-19.894096-31.257911-75.425853-59.661821-142.729725-59.661821-66.969251 0-122.836653 28.40391-143.598512 61.083194L340.71952 276.63573699999995z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="release" unicode="" d="M990.78144 828.5388800000001c-3.35872 1.59744-7.04512 2.37568-11.01824 2.37568-14.45888 0-27.60704-10.81344-27.40224-10.81344-8.8064-4.42368-880.59904-443.22816-911.44192-459.44832-17.408-9.13408-27.36128-24.73984-25.92768-40.71424 1.10592-13.14816 9.78944-23.51104 23.10144-27.77088 26.17344-8.27392 290.24256-91.58656 290.24256-91.58656l4.83328-1.47456 16.67072 50.05312-254.32064 79.54432 780.73856 406.28224c-82.82112-93.88032-420.53632-476.32384-436.10112-493.93664-20.11136-22.48704-29.4912-45.09696-29.40928-70.98368l0.28672-153.27232-0.08192 0c0 0 0.08192-53.49376 0.08192-53.6576l0-1.96608 0 0c1.18784-13.5168 12.73856-24.24832 26.54208-24.24832s25.51808 10.73152 26.74688 24.24832l0 0c0 0 0.53248 191.03744 0 205.08672-0.49152 12.4928 5.07904 26.54208 10.69056 33.05472 5.65248 6.38976 390.63552 442.61376 465.75616 527.81056-21.38112-106.41408-126.68928-629.76-128.24576-637.41952-0.8192-4.05504-2.58048-4.05504-3.35872-4.05504-0.6144 0-1.31072 0.12288-2.048 0.36864-7.45472 2.37568-268.82048 81.55136-279.92064 84.91008l-4.7104 1.4336-17.16224-50.50368 5.07904-1.59744c2.58048-0.77824 258.90816-79.09376 284.38528-86.46656 5.07904-1.47456 10.24-2.2528 15.44192-2.2528 26.99264 0 49.5616 19.37408 54.8864 46.98112 2.08896 10.93632 27.0336 134.67648 55.9104 277.99552 39.77216 197.14048 84.7872 420.61824 85.93408 427.6224l0.6144 3.31776C1009.70496 798.96576 1013.26848 817.9712 990.78144 828.5388800000001z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="list" unicode="" d="M618.04471 733.97072l-397.175835 0c-16.927531 0-30.699186-13.771655-30.699186-30.699186l0-638.543068c0-16.927531 13.771655-30.699186 30.699186-30.699186l582.261227 0c16.927531 0 30.699186 13.771655 30.699186 30.699186l-0.726547 476.760404L618.04471 733.97072zM803.771715 541.488871 619.537713 541.488871 619.537713 705.552483 803.771715 541.488871zM813.363164 64.728466c0-5.64251-4.590552-10.233062-10.233062-10.233062l-582.261227 0c-5.64251 0-10.233062 4.590552-10.233062 10.233062l0 638.543068c0 5.64251 4.590552 10.233062 10.233062 10.233062l378.202715 0 0-192.481849 214.291574 0L813.363164 64.728466zM298.129516 482.495268l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 468.168981l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM298.129516 342.044446l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 327.718159l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM298.129516 199.804884l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 185.478598l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM881.315812 53.053566" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="chart" unicode="" d="M953.440991 315.668729L784.061302 315.668729 681.06451 437.392024c-0.312108 0.373507-0.635473 0.737804-0.969071 1.094938-0.013303 0.014326-0.026606 0.027629-0.039909 0.041956-0.276293 0.293689-0.559748 0.582261-0.851391 0.86367-0.053212 0.051165-0.107447 0.099261-0.160659 0.150426-0.249687 0.237407-0.50142 0.470721-0.76134 0.697895-0.089028 0.078795-0.181125 0.153496-0.272199 0.230244-0.225127 0.191358-0.451278 0.381693-0.683569 0.565888-0.124843 0.099261-0.251733 0.192382-0.3776 0.288572-0.200568 0.153496-0.402159 0.306992-0.607844 0.454348-0.159636 0.11461-0.322341 0.224104-0.485047 0.334621-0.177032 0.12075-0.354064 0.242524-0.535189 0.35918-0.195451 0.12689-0.394996 0.246617-0.593518 0.367367-0.152473 0.092098-0.302899 0.186242-0.457418 0.275269-0.237407 0.137123-0.477884 0.268106-0.718361 0.397043-0.121773 0.065492-0.2415 0.132006-0.364297 0.195451-0.283456 0.146333-0.571005 0.285502-0.859577 0.420579-0.085958 0.040932-0.170892 0.082888-0.257873 0.122797-0.337691 0.154519-0.679475 0.298805-1.022283 0.437975-0.044002 0.017396-0.086981 0.036839-0.130983 0.055259-1.604544 0.638543-3.2623 1.113357-4.948709 1.416256-0.343831 0.062422-0.687662 0.112564-1.031493 0.160659-0.055259 0.008186-0.110517 0.01842-0.165776 0.025583-1.633197 0.216941-3.25923 0.26913-4.861728 0.173962-0.013303-0.001023-0.026606-0.001023-0.040932-0.002047-0.363274-0.022513-0.724501-0.054235-1.085728-0.091074-0.060375-0.00614-0.119727-0.011256-0.180102-0.017396-0.310062-0.034792-0.618077-0.077771-0.926092-0.122797-0.116657-0.017396-0.232291-0.032746-0.348947-0.051165-0.24764-0.040932-0.494257-0.086981-0.740874-0.135076-0.178055-0.033769-0.355087-0.067538-0.532119-0.105401-0.183172-0.039909-0.36532-0.083911-0.547469-0.127913-0.237407-0.056282-0.474814-0.113587-0.710175-0.176009-0.12075-0.032746-0.240477-0.068562-0.360204-0.102331-0.292666-0.082888-0.584308-0.168846-0.874927-0.26299-0.063445-0.020466-0.125867-0.042979-0.188288-0.063445-0.338714-0.112564-0.675382-0.230244-1.010003-0.357134-0.019443-0.007163-0.038886-0.01535-0.058328-0.022513-1.493004-0.571005-2.948145-1.284249-4.340865-2.149966-0.067538-0.041956-0.13303-0.088004-0.200568-0.12996-0.273223-0.172939-0.545422-0.346901-0.813528-0.531096-1.416256-0.971118-2.734274-2.089591-3.936659-3.333932-0.025583-0.026606-0.049119-0.053212-0.074701-0.079818-0.26299-0.275269-0.521886-0.555655-0.773619-0.843204-0.058328-0.066515-0.112564-0.134053-0.169869-0.200568-0.211824-0.246617-0.420579-0.496304-0.62217-0.751107-0.083911-0.106424-0.164752-0.214894-0.246617-0.322341-0.167822-0.218988-0.334621-0.437975-0.49528-0.663102-0.102331-0.14224-0.199545-0.287549-0.298805-0.431835-0.13303-0.194428-0.26606-0.387833-0.393973-0.586354-0.115634-0.179079-0.225127-0.360204-0.335644-0.541329-0.103354-0.168846-0.207731-0.336668-0.306992-0.508583-0.12689-0.220011-0.24764-0.443092-0.36839-0.666172-0.074701-0.138146-0.151449-0.275269-0.223081-0.416486-0.137123-0.265036-0.265036-0.533143-0.39295-0.802272-0.050142-0.105401-0.101307-0.209778-0.150426-0.316202-0.144286-0.317225-0.279363-0.63752-0.410346-0.958838-0.026606-0.064468-0.055259-0.127913-0.080841-0.193405-0.150426-0.378623-0.291642-0.760317-0.423649-1.14508-0.005117-0.016373-0.011256-0.031722-0.017396-0.048095-0.157589-0.463558-0.303922-0.930185-0.434905-1.400906l-97.897657-342.642824L435.093423 811.832042c-0.071631 0.569982-0.165776 1.13587-0.275269 1.696642-0.008186 0.040932-0.017396 0.081864-0.025583 0.12382-0.071631 0.356111-0.148379 0.709151-0.234337 1.061169-0.031722 0.128937-0.065492 0.255827-0.099261 0.38374-0.066515 0.254803-0.135076 0.508583-0.208754 0.760317-0.060375 0.206708-0.124843 0.411369-0.190335 0.615007-0.053212 0.166799-0.107447 0.332575-0.164752 0.49835-0.092098 0.26913-0.190335 0.535189-0.290619 0.800225-0.037862 0.098237-0.074701 0.196475-0.113587 0.293689-0.12382 0.313132-0.25378 0.623193-0.38988 0.930185-0.022513 0.050142-0.044002 0.100284-0.066515 0.150426-0.152473 0.338714-0.311085 0.672312-0.477884 1.00284-0.01228 0.024559-0.024559 0.049119-0.037862 0.074701-0.173962 0.343831-0.356111 0.682545-0.545422 1.017166-0.011256 0.019443-0.022513 0.039909-0.033769 0.059352-0.188288 0.330528-0.382717 0.654916-0.584308 0.975211-0.021489 0.034792-0.044002 0.068562-0.065492 0.103354-0.190335 0.298805-0.385786 0.592494-0.587378 0.88209-0.045025 0.065492-0.091074 0.12996-0.137123 0.194428-0.180102 0.252757-0.363274 0.502443-0.551562 0.74906-0.079818 0.105401-0.162706 0.208754-0.24457 0.312108-0.157589 0.199545-0.317225 0.396019-0.480954 0.590448-0.124843 0.149403-0.252757 0.295735-0.381693 0.442068-0.125867 0.14224-0.251733 0.284479-0.38067 0.424672-0.174985 0.191358-0.355087 0.378623-0.536212 0.563842-0.088004 0.090051-0.176009 0.180102-0.26606 0.26913-0.224104 0.222057-0.452301 0.440022-0.684592 0.653893-0.054235 0.050142-0.10847 0.100284-0.163729 0.150426-0.265036 0.240477-0.535189 0.474814-0.810459 0.704035-0.028653 0.023536-0.056282 0.047072-0.084934 0.070608-0.294712 0.243547-0.595564 0.479931-0.902556 0.711198-0.01535 0.011256-0.029676 0.022513-0.045025 0.033769-0.311085 0.232291-0.627287 0.458441-0.949628 0.677429-0.019443 0.013303-0.037862 0.025583-0.057305 0.038886-0.309038 0.208754-0.623193 0.411369-0.942465 0.606821-0.045025 0.027629-0.090051 0.054235-0.134053 0.081864-0.288572 0.174985-0.581238 0.343831-0.877997 0.50756-0.090051 0.050142-0.181125 0.098237-0.272199 0.147356-0.25071 0.134053-0.502443 0.265036-0.759293 0.391926-0.156566 0.077771-0.314155 0.151449-0.472767 0.226151-0.194428 0.091074-0.38988 0.182149-0.587378 0.268106-0.239454 0.105401-0.481977 0.204661-0.724501 0.302899-0.12382 0.049119-0.246617 0.100284-0.37146 0.148379-0.334621 0.128937-0.673335 0.249687-1.014096 0.36532-0.042979 0.014326-0.085958 0.029676-0.128937 0.044002-1.6158 0.536212-3.296069 0.915859-5.02034 1.119497-0.01535 0.002047-0.029676 0.004093-0.044002 0.00614-0.309038 0.035816-0.620124 0.062422-0.931209 0.086981-0.132006 0.010233-0.265036 0.025583-0.397043 0.033769-0.174985 0.011256-0.349971 0.01535-0.525979 0.022513-0.270153 0.01228-0.539282 0.024559-0.808412 0.027629-0.054235 0.001023-0.10847-0.001023-0.162706-0.001023-1.696642 0.010233-3.371794-0.149403-5.006014-0.466628-0.065492-0.01228-0.12996-0.027629-0.195451-0.039909-0.331551-0.067538-0.662079-0.13917-0.989537-0.218988-0.148379-0.035816-0.295735-0.075725-0.443092-0.11461-0.234337-0.061398-0.468674-0.124843-0.700965-0.192382-0.224104-0.065492-0.445138-0.135076-0.666172-0.206708-0.149403-0.048095-0.297782-0.096191-0.446162-0.147356-0.286526-0.098237-0.568958-0.201591-0.850367-0.309038-0.079818-0.030699-0.160659-0.061398-0.240477-0.093121-0.330528-0.12996-0.655939-0.267083-0.979304-0.410346-0.033769-0.01535-0.067538-0.029676-0.101307-0.045025-0.355087-0.159636-0.705058-0.325411-1.050935-0.500397-0.008186-0.004093-0.016373-0.008186-0.023536-0.01228-0.360204-0.182149-0.714268-0.372483-1.064238-0.569982-0.004093-0.002047-0.008186-0.005117-0.013303-0.007163-0.344854-0.196475-0.684592-0.399089-1.019213-0.610914-0.020466-0.013303-0.040932-0.025583-0.060375-0.038886-0.313132-0.199545-0.621147-0.404206-0.925069-0.61603-0.050142-0.034792-0.099261-0.070608-0.149403-0.105401-0.268106-0.190335-0.532119-0.38374-0.791016-0.583285-0.091074-0.069585-0.181125-0.141216-0.271176-0.212848-0.212848-0.167822-0.422625-0.337691-0.629333-0.512676-0.137123-0.11461-0.271176-0.232291-0.406253-0.349971-0.154519-0.1361-0.308015-0.272199-0.459464-0.412392-0.179079-0.164752-0.354064-0.332575-0.528026-0.502443-0.102331-0.100284-0.204661-0.199545-0.304945-0.301875-0.211824-0.212848-0.418532-0.430812-0.623193-0.651846-0.059352-0.064468-0.119727-0.128937-0.179079-0.194428-0.231267-0.254803-0.456395-0.515746-0.678452-0.780783-0.031722-0.037862-0.063445-0.075725-0.095167-0.11461-0.23536-0.285502-0.465604-0.577145-0.688685-0.874927-0.01842-0.024559-0.036839-0.048095-0.055259-0.072655-0.226151-0.301875-0.445138-0.60989-0.657986-0.923022-0.019443-0.028653-0.038886-0.057305-0.058328-0.084934-0.202615-0.300852-0.400113-0.606821-0.590448-0.916882-0.032746-0.053212-0.064468-0.105401-0.096191-0.158612-0.169869-0.282433-0.335644-0.567935-0.49528-0.857531-0.053212-0.097214-0.105401-0.194428-0.158612-0.292666-0.130983-0.24457-0.258896-0.490164-0.381693-0.73985-0.080841-0.162706-0.157589-0.326435-0.234337-0.491187-0.088004-0.189312-0.177032-0.378623-0.260943-0.571005-0.107447-0.245593-0.209778-0.493234-0.310062-0.741897-0.047072-0.11768-0.095167-0.234337-0.141216-0.354064-0.130983-0.340761-0.25378-0.684592-0.370437-1.030469-0.013303-0.037862-0.026606-0.075725-0.038886-0.113587-0.180102-0.543376-0.345877-1.092891-0.48914-1.650593L244.22942 305.59939599999996 67.355037 305.59939599999996c-14.128789 0-25.582655-11.453866-25.582655-25.582655s11.453866-25.582655 25.582655-25.582655l191.314257 0c0.867764 0 1.725294 0.044002 2.570545 0.128937 0.828878-0.080841 1.656733-0.1361 2.478448-0.1361 11.218506 0 21.512966 7.439436 24.644283 18.779715l113.358791 410.43686 103.412254-723.884758c0.00921-0.072655 0.021489-0.145309 0.030699-0.217964l0.046049-0.320295c0.002047-0.011256 0.005117-0.021489 0.00614-0.032746 0.109494-0.7552 0.25071-1.502213 0.425695-2.238994 0.01535-0.064468 0.031722-0.12689 0.047072-0.191358 0.166799-0.679475 0.358157-1.350764 0.579191-2.01182 0.041956-0.124843 0.088004-0.24764 0.130983-0.37146 0.210801-0.600681 0.437975-1.194198 0.692778-1.77646 0.068562-0.156566 0.144286-0.309038 0.215918-0.464581 0.223081-0.484024 0.460488-0.961908 0.713244-1.431605 0.106424-0.196475 0.213871-0.390903 0.325411-0.584308 0.265036-0.462534 0.545422-0.914836 0.838088-1.359974 0.088004-0.13303 0.170892-0.268106 0.260943-0.399089 0.354064-0.51677 0.732687-1.016143 1.12359-1.506307 0.078795-0.099261 0.156566-0.198521 0.237407-0.296759 0.420579-0.511653 0.864694-1.004887 1.325182-1.482771 0.051165-0.052189 0.101307-0.105401 0.152473-0.157589 0.494257-0.50449 1.010003-0.989537 1.548262-1.454118 0.00921-0.007163 0.017396-0.014326 0.026606-0.022513 1.636267-1.408069 3.466961-2.620687 5.466502-3.592828 0.075725-0.036839 0.151449-0.074701 0.228197-0.11154 0.576121-0.273223 1.165546-0.525979 1.768273-0.75827 0.158612-0.061398 0.319272-0.118704 0.478907-0.177032 0.558725-0.202615 1.124614-0.393973 1.704828-0.559748 0.005117-0.001023 0.010233-0.002047 0.01535-0.004093 0.278339-0.079818 0.562818-0.13917 0.844228-0.209778 0.394996-0.098237 0.789992-0.194428 1.184989-0.274246 0.283456-0.056282 0.568958-0.103354 0.854461-0.149403 0.445138-0.073678 0.889253-0.134053 1.333368-0.183172 0.229221-0.024559 0.456395-0.052189 0.686638-0.071631 0.710175-0.059352 1.418302-0.099261 2.122337-0.099261 0.337691 0 0.671289 0.027629 1.007957 0.040932 0.276293 0.011256 0.550539 0.013303 0.828878 0.033769 0.401136 0.029676 0.799202 0.079818 1.196245 0.127913 0.191358 0.022513 0.38067 0.033769 0.572028 0.061398 0.069585 0.010233 0.1361 0.024559 0.205685 0.034792 0.232291 0.034792 0.462534 0.075725 0.692778 0.116657 0.463558 0.082888 0.921999 0.176009 1.3743 0.283456 0.109494 0.025583 0.218988 0.047072 0.327458 0.074701 0.582261 0.145309 1.152243 0.316202 1.716084 0.499373 0.098237 0.031722 0.196475 0.063445 0.293689 0.097214 1.90335 0.644683 3.694135 1.50119 5.351891 2.540869 0.014326 0.00921 0.028653 0.01842 0.042979 0.027629 1.089821 0.686638 2.121314 1.452071 3.087315 2.287089 0.083911 0.071631 0.167822 0.143263 0.25071 0.215918 0.424672 0.3776 0.837064 0.76748 1.235131 1.170662 0.12382 0.124843 0.243547 0.254803 0.36532 0.382717 0.317225 0.334621 0.626263 0.677429 0.925069 1.028423 0.155543 0.183172 0.308015 0.36839 0.458441 0.556679 0.26606 0.331551 0.523933 0.670266 0.773619 1.01512 0.130983 0.180102 0.261966 0.35918 0.387833 0.543376 0.294712 0.429789 0.575098 0.86981 0.843204 1.316995 0.099261 0.165776 0.195451 0.334621 0.290619 0.503467 0.283456 0.499373 0.555655 1.004887 0.806365 1.52268 0.031722 0.065492 0.060375 0.13303 0.091074 0.199545 0.276293 0.584308 0.530073 1.178849 0.762363 1.784646 0.00614 0.017396 0.014326 0.034792 0.020466 0.051165 0.251733 0.661056 0.472767 1.336438 0.669242 2.020006 0.002047 0.008186 0.00614 0.016373 0.008186 0.024559l0.061398 0.215918c0.029676 0.106424 0.062422 0.210801 0.090051 0.317225l117.579929 411.527704 79.800487-94.308923c0.070608-0.083911 0.146333-0.161682 0.217964-0.243547 0.190335-0.220011 0.38374-0.436952 0.581238-0.649799 0.134053-0.144286 0.26913-0.285502 0.405229-0.425695 0.164752-0.168846 0.331551-0.335644 0.50142-0.500397 0.164752-0.159636 0.329505-0.319272 0.496304-0.473791 0.138146-0.12689 0.279363-0.25071 0.419556-0.37453 0.198521-0.174985 0.397043-0.350994 0.599657-0.518816 0.081864-0.067538 0.166799-0.132006 0.249687-0.198521 0.817622-0.661056 1.667989-1.264806 2.545986-1.811252 0.098237-0.061398 0.195451-0.125867 0.294712-0.185218 0.228197-0.138146 0.459464-0.267083 0.691755-0.398066 0.157589-0.089028 0.315178-0.178055 0.474814-0.264013 0.200568-0.107447 0.403183-0.208754 0.606821-0.311085 0.202615-0.101307 0.406253-0.201591 0.611937-0.297782 0.173962-0.080841 0.348947-0.159636 0.523933-0.237407 0.245593-0.10847 0.494257-0.212848 0.743944-0.313132 0.144286-0.058328 0.289596-0.115634 0.434905-0.171915 0.291642-0.11154 0.586354-0.216941 0.883113-0.317225 0.11154-0.037862 0.223081-0.076748 0.334621-0.113587 0.337691-0.109494 0.677429-0.210801 1.02126-0.305969 0.078795-0.021489 0.157589-0.046049 0.236384-0.066515 0.376577-0.101307 0.757247-0.193405 1.140986-0.277316 0.050142-0.011256 0.100284-0.023536 0.150426-0.034792 0.405229-0.085958 0.813528-0.162706 1.225921-0.229221 0.031722-0.005117 0.063445-0.01228 0.096191-0.017396 0.412392-0.065492 0.828878-0.12075 1.24741-0.165776 0.032746-0.004093 0.064468-0.00921 0.097214-0.01228 0.382717-0.039909 0.768503-0.068562 1.155313-0.092098 0.068562-0.004093 0.1361-0.01228 0.204661-0.01535 0.25992-0.013303 0.521886-0.01535 0.782829-0.020466 0.188288-0.004093 0.376577-0.01535 0.564865-0.01535 0.008186 0 0.01535 0.001023 0.023536 0.001023l181.208085 0c14.129812 0 25.582655 11.453866 25.582655 25.582655S967.56978 315.668729 953.440991 315.668729z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="ok-circle" unicode="စ" d="M516.152065-63.152063c-60.696384 0-119.594819 11.894911-175.056991 35.353183-53.55473 22.651906-101.646028 55.073316-142.936433 96.364745-41.291428 41.291428-73.712839 89.381703-96.363721 142.936433-23.458271 55.462173-35.353183 114.359584-35.353183 175.055968s11.894911 119.594819 35.353183 175.056991c22.651906 53.55473 55.073316 101.646028 96.363721 142.936433 41.290405 41.291428 89.381703 73.712839 142.936433 96.363721 55.462173 23.458271 114.359584 35.353183 175.056991 35.353183s119.594819-11.894911 175.056991-35.353183c53.55473-22.651906 101.645005-55.073316 142.936433-96.363721 41.291428-41.290405 73.711815-89.38068 96.363721-142.936433 23.459295-55.462173 35.353183-114.359584 35.353183-175.056991 0-60.696384-11.893888-119.593795-35.353183-175.055968-22.651906-53.55473-55.072293-101.645005-96.363721-142.936433s-89.381703-73.712839-142.936433-96.364745C635.747907-51.25715200000002 576.849472-63.152063 516.152065-63.152063zM516.152065 774.870222c-214.115566 0-388.311956-174.196391-388.311956-388.311956s174.196391-388.311956 388.311956-388.311956 388.311956 174.196391 388.311956 388.311956S730.268654 774.870222 516.152065 774.870222zM434.74908 132.830517L209.49278 358.08784 289.087583 437.68162 434.74908 292.020122 743.218594 600.488613 822.812373 520.89381Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="layim-theme" unicode="" d="M958.830745 538.643056L740.659817 692.753993l-100.539834 0-3.977591-9.332553c-0.37146-0.871857-38.021965-86.8613-124.772748-88.667435-35.691897 0.76441-67.206658 15.500019-93.680613 43.828204-20.658506 22.106484-30.374798 44.584428-30.456662 44.776809l-3.955078 9.393951-100.587929 0L64.518433 538.643056 169.320337 379.756349l89.956801 65.019853-19.016099-368.05254 268.86654 0 4.093225 0 269.866311 0-19.016099 368.051517 89.956801-65.018829L958.830745 538.643056zM730.105437 507.20402l20.655436-399.781172-237.540068 0-4.093225 0L272.587282 107.42284700000005l20.656459 399.781172-115.938546-83.797521-36.3243 55.070246 159.440315 111.641683-19.276019 30.638811L121.066333 508.667348l-14.548344 22.056342 185.921433 131.330094 71.077825 0c5.332449-10.04375 15.433504-26.779923 30.951943-43.580564 32.047904-34.69622 72.256674-53.486168 116.345822-54.411237l0-0.031722c0.203638 0.00307 0.406253 0.01228 0.60989 0.016373 0.203638-0.00307 0.406253-0.013303 0.60989-0.016373l0 0.031722c44.073798 0.925069 84.359316 19.703761 116.566856 54.379515 15.623839 16.821107 25.814945 33.579793 31.188326 43.612287l71.120804 0 185.921433-131.330094-14.548344-22.056342L742.203986 620.7551920000001l-19.276019-30.638811 159.440315-111.641683-36.3243-55.070246L730.105437 507.20402z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="table" unicode="" d="M304.738028 343.684806M729.544153 511.153982M595.52788 637.723655M143.806755 686.614156l0-601.704045L881.172549 84.91011100000003l0 601.704045L143.806755 686.614156zM420.318416 299.80441299999995l0 128.936581 184.341448 0 0-128.936581L420.318416 299.80441299999995zM604.659865 256.825552l0-128.936581L420.318416 127.88897099999997l0 128.936581L604.659865 256.825552zM604.659865 600.656435l0-128.936581L420.318416 471.719854l0 128.936581L604.659865 600.656435zM374.232798 600.656435l0-128.936581L189.89135 471.719854l0 128.936581L374.232798 600.656435zM189.89135 428.740994L374.232798 428.740994l0-128.936581L189.89135 299.80441299999995 189.89135 428.740994zM650.745483 428.740994l184.341448 0 0-128.936581L650.745483 299.80441299999995 650.745483 428.740994zM650.745483 471.719854l0 128.936581 184.341448 0 0-128.936581L650.745483 471.719854zM189.89135 256.825552L374.232798 256.825552l0-128.936581L189.89135 127.88897099999997 189.89135 256.825552zM650.745483 127.88897099999997l0 128.936581 184.341448 0 0-128.936581L650.745483 127.88897099999997z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="right" unicode="" d="M283.648 721.9189759999999L340.873216 780.926976 740.352 383.99795200000005 340.876288-12.925952000000052 283.648 46.07795199999998 619.52 383.99795200000005Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="left" unicode="" d="M740.352 721.9189759999999L683.126784 780.926976 283.648 383.99795200000005 683.123712-12.925952000000052 740.352 46.07795199999998 404.48 383.99795200000005Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="cart-simple" unicode="" d="M235.097303 196.866982C247.384597 160.417152 286.382106 132.37606800000003 324.772759 132.37606800000003L861.658537 132.37606800000003 880.429732 132.37606800000003 885.649214 150.54185399999994 1009.08775 580.154957C1021.388907 622.967661 993.187631 660.786325 949.051586 660.786325L424.585365 660.786325C410.791718 660.786325 399.609756 649.5207379999999 399.609756 635.623932 399.609756 621.727125 410.791718 610.461538 424.585365 610.461538L949.051586 610.461538C959.924 610.461538 964.161052 604.779539 961.106394 594.148171L837.667859 164.53506800000002 861.658537 182.70085500000005 324.772759 182.70085500000005C307.742153 182.70085500000005 287.789837 197.04752900000005 282.395194 213.05054900000005L73.600164 832.433664C69.16437 845.592294 54.980454 852.636656 41.919502 848.167687 28.858551 843.698719 21.86648 829.408727 26.302275 816.250097L235.097303 196.866982ZM399.609756-6.017094000000043C399.609756 49.57012899999995 354.881911 94.63247799999999 299.707317 94.63247799999999 244.532723 94.63247799999999 199.804878 49.57012899999995 199.804878-6.017094000000043 199.804878-61.604318000000035 244.532723-106.66666699999996 299.707317-106.66666699999996 354.881911-106.66666699999996 399.609756-61.604318000000035 399.609756-6.017094000000043ZM249.756098-6.017094000000043C249.756098 21.77651800000001 272.120021 44.30769299999997 299.707317 44.30769299999997 327.294613 44.30769299999997 349.658537 21.77651800000001 349.658537-6.017094000000043 349.658537-33.810704999999984 327.294613-56.34187899999995 299.707317-56.34187899999995 272.120021-56.34187899999995 249.756098-33.810704999999984 249.756098-6.017094000000043ZM924.097562-6.017094000000043C924.097562 49.57012899999995 879.369715 94.63247799999999 824.195121 94.63247799999999 769.020529 94.63247799999999 724.292683 49.57012899999995 724.292683-6.017094000000043 724.292683-61.604318000000035 769.020529-106.66666699999996 824.195121-106.66666699999996 879.369715-106.66666699999996 924.097562-61.604318000000035 924.097562-6.017094000000043ZM774.243902-6.017094000000043C774.243902 21.77651800000001 796.607825 44.30769299999997 824.195121 44.30769299999997 851.782419 44.30769299999997 874.146342 21.77651800000001 874.146342-6.017094000000043 874.146342-33.810704999999984 851.782419-56.34187899999995 824.195121-56.34187899999995 796.607825-56.34187899999995 774.243902-33.810704999999984 774.243902-6.017094000000043Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="face-cry" unicode="" d="M1024 384C1024 666.769792 794.769792 896 512 896 229.230208 896 0 666.769792 0 384 0 101.23020799999995 229.230208-128 512-128 629.410831-128 740.826187-88.33104600000001 830.768465-16.686661999999956 841.557579-8.092490999999995 843.33693 7.620766000000003 834.742758 18.409879000000046 826.148587 29.198990999999978 810.43533 30.978341999999998 799.646219 22.384173000000033 718.470035-42.277495000000044 618.001779-78.04878099999996 512-78.04878099999996 256.817504-78.04878099999996 49.951219 128.81750399999999 49.951219 384 49.951219 639.182496 256.817504 846.048781 512 846.048781 767.182496 846.048781 974.048781 639.182496 974.048781 384 974.048781 296.507166 949.714859 212.66323599999998 904.470807 140.039307 897.177109 128.33175700000004 900.755245 112.92820300000005 912.462793 105.63450699999999 924.170342 98.34080900000004 939.573897 101.91894200000002 946.867595 113.62649199999998 997.013826 194.11920399999997 1024 287.101621 1024 384ZM337.170731 396.487806C371.654852 396.487806 399.609756 424.442709 399.609756 458.926829 399.609756 493.41095 371.654852 521.365854 337.170731 521.365854 302.686611 521.365854 274.731708 493.41095 274.731708 458.926829 274.731708 424.442709 302.686611 396.487806 337.170731 396.487806ZM711.804879 396.487806C746.288998 396.487806 774.243902 424.442709 774.243902 458.926829 774.243902 493.41095 746.288998 521.365854 711.804879 521.365854 677.320757 521.365854 649.365854 493.41095 649.365854 458.926829 649.365854 424.442709 677.320757 396.487806 711.804879 396.487806ZM352.788105 191.21547499999997C396.165222 225.91716899999994 453.151987 246.639629 524.487806 246.639629 595.823622 246.639629 652.810387 225.91716899999994 696.187505 191.21547499999997 722.700531 170.00505399999997 738.882517 148.42907300000002 746.631548 132.931012 752.800254 120.59359800000004 747.799529 105.59142399999996 735.462114 99.42271600000004 723.124702 93.25401 708.122526 98.25473499999998 701.953818 110.59214899999995 701.03616 112.42746499999998 698.492224 116.61747600000001 694.165854 122.38597100000004 686.602473 132.47047699999996 676.927317 142.654852 664.983226 152.21012499999995 630.311565 179.947456 584.273939 196.68840999999998 524.487806 196.68840999999998 464.70167 196.68840999999998 418.664045 179.947456 383.992384 152.21012499999995 372.048292 142.654852 362.373137 132.47047699999996 354.809756 122.38597100000004 350.483386 116.61747600000001 347.93945 112.42746499999998 347.021792 110.59214899999995 340.853084 98.25473499999998 325.850908 93.25401 313.513495 99.42271600000004 301.176081 105.59142399999996 296.175356 120.59359800000004 302.344062 132.931012 310.093092 148.42907300000002 326.275078 170.00505399999997 352.788105 191.21547499999997Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="face-smile" unicode="" d="M1024 384C1024 666.769792 794.769792 896 512 896 229.230208 896 0 666.769792 0 384 0 101.23020799999995 229.230208-128 512-128 629.410831-128 740.826187-88.33104600000001 830.768465-16.686661999999956 841.557579-8.092490999999995 843.33693 7.620766000000003 834.742758 18.409879000000046 826.148587 29.198990999999978 810.43533 30.978341999999998 799.646219 22.384173000000033 718.470035-42.277495000000044 618.001779-78.04878099999996 512-78.04878099999996 256.817504-78.04878099999996 49.951219 128.81750399999999 49.951219 384 49.951219 639.182496 256.817504 846.048781 512 846.048781 767.182496 846.048781 974.048781 639.182496 974.048781 384 974.048781 296.507166 949.714859 212.66323599999998 904.470807 140.039307 897.177109 128.33175700000004 900.755245 112.92820300000005 912.462793 105.63450699999999 924.170342 98.34080900000004 939.573897 101.91894200000002 946.867595 113.62649199999998 997.013826 194.11920399999997 1024 287.101621 1024 384ZM337.170731 396.487806C371.654852 396.487806 399.609756 424.442709 399.609756 458.926829 399.609756 493.41095 371.654852 521.365854 337.170731 521.365854 302.686611 521.365854 274.731708 493.41095 274.731708 458.926829 274.731708 424.442709 302.686611 396.487806 337.170731 396.487806ZM711.804879 396.487806C746.288998 396.487806 774.243902 424.442709 774.243902 458.926829 774.243902 493.41095 746.288998 521.365854 711.804879 521.365854 677.320757 521.365854 649.365854 493.41095 649.365854 458.926829 649.365854 424.442709 677.320757 396.487806 711.804879 396.487806ZM352.788105 127.22903299999996C396.165222 92.52733899999998 453.151987 71.80487900000003 524.487806 71.80487900000003 595.823622 71.80487900000003 652.810387 92.52733899999998 696.187505 127.22903299999996 722.700531 148.43945399999996 738.882517 170.01543500000002 746.631548 185.51349500000003 752.800254 197.850908 747.799529 212.85308399999997 735.462114 219.021792 723.124702 225.19049800000005 708.122526 220.18977299999995 701.953818 207.85235799999998 701.03616 206.01704299999994 698.492224 201.82703100000003 694.165854 196.058537 686.602473 185.97402899999997 676.927317 175.78965500000004 664.983226 166.23438299999998 630.311565 138.49705200000005 584.273939 121.75609799999995 524.487806 121.75609799999995 464.70167 121.75609799999995 418.664045 138.49705200000005 383.992384 166.23438299999998 372.048292 175.78965500000004 362.373137 185.97402899999997 354.809756 196.058537 350.483386 201.82703100000003 347.93945 206.01704299999994 347.021792 207.85235799999998 340.853084 220.18977299999995 325.850908 225.19049800000005 313.513495 219.021792 301.176081 212.85308399999997 296.175356 197.850908 302.344062 185.51349500000003 310.093092 170.01543500000002 326.275078 148.43945399999996 352.788105 127.22903299999996Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="survey" unicode="" d="M722.355804 849.454545C761.006291 849.454545 792.380951 818.166023 792.380951 779.627344L792.380951 437.500928 799.081094 453.813218 401.874746 51.22138 418.539682 58.181818 138.070006 58.181818C99.387643 58.181818 68.063492 89.328555 68.063492 127.771428L68.063492 872.727273 44.698413 849.454545 722.355804 849.454545ZM21.333333 896 21.333333 872.727273 21.333333 127.771428C21.333333 63.604277 73.59726 11.636363 138.070006 11.636363L418.539682 11.636363 428.337293 11.636363 435.204619 18.596802 832.410967 421.18864 839.11111 427.979625 839.11111 437.500928 839.11111 779.627344C839.11111 843.859757 786.827324 896 722.355804 896L44.698413 896 21.333333 896ZM775.859347 307.365395 759.337741 290.90909 775.859347 274.452787 869.319663 181.361879 885.841269 164.905574 902.362876 181.361879 972.458114 251.18006 988.979721 267.636363 972.458114 284.092668 878.997796 377.183575 862.47619 393.639878 845.954583 377.183575 775.859347 307.365395ZM845.954583 344.27097 939.414901 251.18006 939.414901 284.092668 869.319663 214.274485 902.362876 214.274485 808.902558 307.365395 808.902558 274.452787 878.997796 344.27097 845.954583 344.27097ZM518.843473 51.365395 513.841133 46.382827 512.453734 39.473248 489.088655-76.890387 482.215251-111.121568 516.58227-104.275332 633.407665-81.002605 640.344663-79.620689 645.347004-74.638121 902.362876 181.361879 918.884482 197.818182 902.362876 214.274485 808.902558 307.365395 792.380951 323.821698 775.859347 307.365395 518.843473 51.365395ZM775.859347 274.452787 869.319663 181.361879 869.319663 214.274485 612.303791-41.725515 624.243127-35.361033 507.41773-58.633758 534.911345-86.018703 558.276425 30.344934 551.886686 18.452787 808.902558 274.452787 775.859347 274.452787ZM426.576706 298.269073C444.201086 298.269073 458.488469 284.053815 458.488469 266.500753L458.488469 258.086116C458.488469 240.540958 444.323959 226.317797 426.576706 226.317797L426.576706 226.317797C408.952326 226.317797 394.664943 240.533054 394.664943 258.086116L394.664943 266.500753C394.664943 284.045911 408.829453 298.269073 426.576706 298.269073L426.576706 298.269073ZM278.349205 552.435127C278.349205 552.435127 280.851125 530.485568 305.477133 530.485568 330.103138 530.485568 331.559155 552.435127 331.559155 552.435127 329.927383 623.508937 362.988497 657.25782 430.67155 653.905282 475.722639 648.839223 499.06407 623.508937 500.624896 577.839917 497.503245 557.501184 480.405116 531.202385 449.969026 499.092521 409.671358 458.489557 389.522524 422.133143 389.522524 390.023279L389.522524 357.093903C389.522524 357.093903 392.614705 337.454532 414.885933 337.454532 437.157161 337.454532 440.249342 357.093903 440.249342 357.093903L440.249342 379.965664C440.249342 406.785969 459.546816 439.044836 498.21271 476.369762 538.652271 513.471183 558.730159 547.369069 558.730159 577.839917 555.395669 662.323878 511.195938 706.353877 425.776235 709.780917 327.515198 711.419936 278.349205 658.971339 278.349205 552.435127Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="tree" unicode="" d="M962.691679 258.53447400000005c-8.721639 54.163597-34.298154 97.584526-73.089645 133.8638-44.721551 41.825594-99.282191 65.724911-156.512636 84.432994-26.935466 8.80555-54.079686 16.971533-81.129762 25.427112 41.188074 7.485485 81.495082 10.991332 121.872698 12.269441 39.906895 1.26276 79.885422 0.276293 120.633475 0.276293-30.644951 44.233434-74.588789 71.110571-127.260405 84.384899-53.004191 13.357216-103.742782 9.715269-152.261822-32.081673 18.715247 66.336848 12.464893 120.18936-38.810934 160.830989-32.450063 25.719778-77.127611 31.000038-111.319341 14.916734 58.583257-31.127951 82.051761-84.265172 94.304829-145.102772-44.638663 69.056795-110.067838 96.432283-187.710173 86.487793-56.123228-7.187703-110.723777-26.270317-166.003801-40.048111 15.677051-14.358009 31.136138-24.116257 47.932686-27.839045 51.427276-11.399631 103.405091-20.301372 155.098427-30.524201 37.036521-7.323802 75.163887-12.144598 104.448864-40.879036-78.096682 23.458271-155.928329 30.034037-235.541551 9.092076C186.718589 530.20385 104.838743 479.821369 81.996502 429.437865c46.955428 23.955598 95.807043 18.776645 144.606469 17.139356 37.737486-1.266853 76.089979-3.461845 113.238041 1.594311 52.683896 7.170307 104.513332 20.624736 159.209048 31.909757-91.88164-62.077847-186.516997-122.342396-159.194722-259.889075 58.852386 100.205213 163.392324 150.107763 229.951229 238.105956-16.239869-91.498924 6.980995-169.376619 66.432015-237.83785 41.815361-48.152696 89.979314-92.010577 110.706381-156.013263 12.758582 141.877311-25.823132 270.789333-97.911984 396.334677C755.996107 391.809873 858.199837 325.909977 962.691679 258.53447400000005zM513.476631 320.10169099999996c-27.767414-14.065344-39.008432-35.954887-42.252313-64.998363-6.078439-54.437843-15.162328-108.532879-21.799492-162.916487-3.90903-32.026414-5.519714-64.333214-8.16496-96.53052 30.078039 0 55.507198 0 79.961146 0 9.912767 78.200036 19.732413 154.247037 28.913517 230.369761 0.883113 7.322779-0.756223 15.746636-3.705392 22.591531C536.246217 272.25086999999996 524.967336 295.41135899999995 513.476631 320.10169099999996z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="upload-circle" unicode="" d="M512-128c282.768 0 512 229.216 512 512C1024 666.768 794.768 896 512 896 229.216 896 0 666.768 0 384 0 101.21600000000001 229.216-128 512-128zM512 848c256.272 0 464-207.744 464-464 0-256.272-207.728-464-464-464S48 127.72799999999995 48 384C48 640.256 255.728 848 512 848zM377.728 534.544L480 534.544l0-478c0-17.664 14.336-32 32-32s32 14.336 32 32L544 534.544l102.272 0c17.616 0 23.424 11.568 12.944 25.68l-128.128 172.624c-10.496 14.128-27.664 14.128-38.16 0L364.8 560.24C354.32 546.1120000000001 360.128 534.544 377.728 534.544z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="add-circle" unicode="" d="M675.04 412.736l-127.04 0 0 127.264c0 20.064-16.288 36.32-36.32 36.32-20.064 0-36.32-16.192-36.32-36.32l0-127.232-127.072 0c-20.064 0-36.352-16.32-36.352-36.352 0-20.064 16.224-36.352 36.352-36.352l127.072 0 0-127.232c0-20 16.256-36.384 36.32-36.384 20.032 0 36.32 16.256 36.32 36.384l0 127.136 127.04 0c19.968 0 36.352 16.256 36.352 36.384C711.36 396.448 695.136 412.736 675.04 412.736L675.04 412.736zM511.328 830.56c-250.24 0-453.952-203.616-453.952-453.952 0-250.336 203.712-453.952 453.952-453.952 250.336 0 453.984 203.584 453.984 453.952C965.312 626.944 761.696 830.56 511.328 830.56L511.328 830.56zM511.328-20.576000000000022c-219.04 0-397.184 178.176-397.184 397.152 0 219.104 178.144 397.216 397.184 397.216s397.216-178.112 397.216-397.216C908.576 157.63199999999995 730.368-20.576000000000022 511.328-20.576000000000022L511.328-20.576000000000022zM511.328-20.576000000000022" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="download-circle" unicode="" d="M510.771521 828.211081c-244.998947 0-443.597097-198.60429-443.597097-443.590957s198.59815-443.591981 443.597097-443.591981c244.986667 0 443.583794 198.60429 443.583794 443.591981S755.758188 828.211081 510.771521 828.211081zM510.771521-30.044013999999947c-229.010811 0-414.664138 185.65435-414.664138 414.664138 0 229.010811 185.653327 414.657998 414.664138 414.657998 228.996484 0 414.652881-185.647187 414.652881-414.657998C925.424402 155.60931300000004 739.768005-30.044013999999947 510.771521-30.044013999999947zM662.749888 352.39518799999996L537.719266 245.82501100000002l0 324.388065c0 14.887059-12.06478 26.953885-26.947745 26.953885-14.894222 0-26.961048-12.066827-26.961048-26.953885l0-325.410348L357.936647 352.39518799999996c-10.56359 10.599406-27.693736 10.599406-38.267559 0-10.56359-10.596336-10.56359-27.777647 0-38.375006l170.181961-161.220868c5.629207-5.652743 13.111622-8.060583 20.49887-7.680936 7.373944-0.379647 14.859429 2.02717 20.488637 7.680936l170.181961 161.220868c10.562567 10.597359 10.562567 27.77867 0 38.375006C690.443623 362.99561700000004 673.313477 362.99561700000004 662.749888 352.39518799999996z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="templeate-1" unicode="" d="M320 384L106.666667 384c-35.349333 0-64-28.650667-64-64l0-213.333333c0-35.349333 28.650667-64 64-64l213.333333 0c35.349333 0 64 28.650667 64 64L384 320C384 355.349333 355.349333 384 320 384zM256 341.33333300000004l0-256L170.666667 85.33333300000004 170.666667 341.33333300000004 256 341.33333300000004zM85.333333 106.66666699999996L85.333333 320c0 11.754667 9.578667 21.333333 21.333333 21.333333l42.666667 0 0-256L106.666667 85.33333300000004C94.912 85.33333300000004 85.333333 94.91200000000003 85.333333 106.66666699999996zM341.333333 106.66666699999996c0-11.754667-9.578667-21.333333-21.333333-21.333333l-42.666667 0L277.333333 341.33333300000004l42.666667 0c11.754667 0 21.333333-9.578667 21.333333-21.333333L341.333333 106.66666699999996zM576 554.666667L234.666667 554.666667c-47.061333 0-85.333333-38.272-85.333333-85.333333l0-42.666667 42.666667 0 0 42.666667c0 23.530667 19.136 42.666667 42.666667 42.666667l42.666667 0 0-96 21.333333 0L298.666667 512l213.333333 0 0-426.666667-85.333333 0-21.333333-42.666667 170.666667 0c47.061333 0 85.333333 38.272 85.333333 85.333333L661.333333 469.333333C661.333333 516.394667 623.061333 554.666667 576 554.666667zM618.666667 128c0-23.530667-19.136-42.666667-42.666667-42.666667l-42.666667 0L533.333333 512l42.666667 0c23.530667 0 42.666667-19.136 42.666667-42.666667L618.666667 128zM853.333333 42.66666699999996c47.061333 0 85.333333 38.272 85.333333 85.333333L938.666667 640c0 47.061333-38.272 85.333333-85.333333 85.333333L341.333333 725.333333c-47.061333 0-85.333333-38.272-85.333333-85.333333l0-42.666667 42.666667 0 0 42.666667c0 23.530667 19.136 42.666667 42.666667 42.666667l85.333333 0 0-85.333333 21.333333 0 0 85.333333 298.666667 0 0-597.333333-42.666667 0-21.333333-42.666667L853.333333 42.66666699999996zM896 128c0-23.530667-19.136-42.666667-42.666667-42.666667l-85.333333 0L768 682.666667l85.333333 0c23.530667 0 42.666667-19.136 42.666667-42.666667L896 128z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="util" unicode="" d="M282.127566 639.0826059999999c-13.120832-13.221116-30.625508-20.50808-49.278333-20.50808-18.618033 0-36.157501 7.286963-49.311079 20.50808l-32.885991 33.019021 98.623181 99.027387 32.885991-33.019021c13.186324-13.221116 20.473287-30.829146 20.473287-49.548486C302.599829 669.8769589999999 295.347658 652.26893 282.127566 639.0826059999999L282.127566 639.0826059999999zM249.308089 705.0899489999999l-0.032746 0-32.884968-32.987299c4.418636-4.417613 10.252505-6.845918 16.458857-6.845918 6.206352 0 12.041244 2.428306 16.426111 6.813173 4.418636 4.452405 6.845918 10.288321 6.845918 16.493649C256.121262 694.802652 253.693979 700.671313 249.308089 705.0899489999999L249.308089 705.0899489999999zM396.703067 496.343671L249.578242 638.778684l32.278147 33.626865 147.157571-142.468782L396.703067 496.343671 396.703067 496.343671zM751.45979 133.92852400000004L618.131179 274.071332l32.884968 32.985252 133.330658-140.141784L751.45979 133.92852400000004 751.45979 133.92852400000004zM850.184279 67.95597399999997c-22.700001-22.766516-52.481282-34.168194-82.264609-34.168194-29.714765 0-59.395762 11.333116-81.994456 34.033118L538.194592 222.398462l32.884968 33.021068L718.811206 100.806149c27.117614-27.183106 71.269183-27.116591 98.488105 0.169869 27.186176 27.287483 27.117614 71.773673-0.135076 99.196233l-147.426701 154.273642 32.851199 33.021068 147.461493-154.308435C895.447159 187.557956 895.514697 113.421468 850.184279 67.95597399999997L850.184279 67.95597399999997zM801.716404 468.380806c-30.726815-30.860868-71.605851-47.861054-115.082038-47.861054-43.442418 0-84.321454 16.999163-115.082038 47.861054-30.760584 30.861892-47.692209 71.877027-47.692209 115.521037s16.931624 84.691891 47.692209 115.554806l42.497906 42.666752 32.885991-32.986275-42.497906-42.667775c-21.99085-22.090111-34.099632-51.367925-34.065863-82.566484 0-31.163767 12.108782-60.441581 34.065863-82.499969 21.956058-22.058388 51.16531-34.20094 82.196047-34.20094 31.064506 0 60.239989 12.142551 82.196047 34.20094l42.49893 42.665729 32.884968-33.019021L801.716404 468.380806 801.716404 468.380806zM844.214311 511.049604l-49.311079 49.51267-16.45988-16.493649c-17.538445-17.638729-40.879036-27.352975-65.73719-27.352975l-0.032746 0c-24.824385 0-48.198745 9.713222-65.73719 27.352975-17.539468 17.607006-27.252691 41.082674-27.252691 66.007343 0 24.925692 9.679453 48.400337 27.252691 66.040089l16.458857 16.495696-49.344848 49.51267 32.885991 33.021068 82.196047-82.533738-49.311079-49.482995c-8.769734-8.835226-13.626345-20.571525-13.626345-33.051767 0-12.446473 4.856611-24.183795 13.626345-32.987299 8.768711-8.835226 20.439518-13.69286 32.884968-13.69286 12.411681 0 24.082488 4.857635 32.852222 13.69286l49.344848 49.514717 82.196047-82.534761L844.214311 511.049604 844.214311 511.049604zM233.591129 129.139451l0 46.681182 46.512337 0 0-46.681182L233.591129 129.139451 233.591129 129.139451zM538.160823 356.538555l-92.247984 91.572602 32.717146 33.18889 92.214215-91.539856L538.160823 356.538555 538.160823 356.538555zM304.2187 101.04355599999997l173.634596 239.842507 37.641295-27.454282L338.318332 69.23715300000003c-21.923312-22.057365-51.132564-34.20094-82.19707-34.20094-31.028691 0-60.237943 12.143575-82.196047 34.168194-21.958104 22.057365-34.065863 51.335179-34.065863 82.533738 0 31.198559 12.107759 60.476373 34.065863 82.533738l2.765997 2.360767L417.243893 412.054963l27.353998-37.742603L205.596542 200.00340600000004c-12.411681-13.053294-19.224854-30.119995-19.224854-48.26526 0-18.71934 7.252171-36.291554 20.438495-49.513694C232.747925 76.15265599999998 277.775444 75.71263499999998 304.2187 101.04355599999997L304.2187 101.04355599999997z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="face-surprised" unicode="" d="M485.656116-128C221.592397-128 6.762016 86.81718000000001 6.762016 350.87649799999997s214.830381 478.867697 478.8941 478.867697c264.041716 0 478.854495-214.812779 478.854495-478.867697S749.697832-128 485.656116-128zM485.656116 798.834741c-247.024795 0-447.975846-200.959852-447.975846-447.962644 0-247.002792 200.951051-447.962644 447.975846-447.962644 247.002792 0 447.953843 200.959852 447.953843 447.962644C933.609959 597.8748889999999 732.658908 798.834741 485.656116 798.834741zM352.033458 447.380528c0-30.469398-24.682677-55.147675-55.143274-55.147675-30.451796 0-55.143274 24.678276-55.143274 55.147675 0 30.460597 24.691478 55.138874 55.143274 55.138874C327.350781 502.519402 352.033458 477.845526 352.033458 447.380528zM674.417647 502.519402c-30.460597 0-55.156476-24.678276-55.156476-55.138874 0-30.469398 24.695879-55.147675 55.156476-55.147675 30.451796 0 55.143274 24.678276 55.143274 55.147675C729.560922 477.845526 704.869444 502.519402 674.417647 502.519402zM562.005634 165.30976499999997c0-59.733046-34.192262-108.165484-76.349518-108.165484-42.166057 0-76.36272 48.432438-76.36272 108.165484 0 59.724245 34.196663 108.152282 76.36272 108.152282C527.813371 273.45764699999995 562.005634 225.03400999999997 562.005634 165.30976499999997zM835.631745 793.712503c0 0 12.871605 56.819883 41.959231 85.925112 29.083226 29.096427 69.915916 15.124685 78.492585-8.801097 9.461179-26.385689-2.033053-50.069442-29.092027-56.164202C899.404495 808.463141 874.880237 826.192952 835.631745 793.712503zM916.698651 757.570797c0 0 35.767659 20.576965 64.877288 19.393218 29.136032-1.174946 41.431165-29.144833 33.109728-45.110024-9.192746-17.588993-27.054573-22.966463-43.217788-11.797871C954.979023 731.44034 952.453108 752.721393 916.698651 757.570797z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="edit" unicode="" d="M769.089 516.251l-125.896 125.89 62.974 62.947c20.866 20.838 54.652 20.838 75.517 0l50.353-50.351c20.865-20.865 20.865-54.703 0-75.567L769.089 516.251zM403.349 150.52700000000004L277.453 276.418 619.706 615.982 745.601 490.09ZM176.314 47.283000000000015L252.912 251.87699999999995 377.753 127.01199999999994Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="speaker" unicode="" d="M587.182306 754.7203c-6.003737 2.705622-13.043061 1.642406-17.984606-2.721994l-259.223926-229.293243-148.246369 0c-9.253758 0-16.752546-7.498788-16.752546-16.756639l0-267.886213c0-9.249665 7.498788-16.756639 16.752546-16.756639l144.050814 0c9.253758 0 16.752546 7.506974 16.752546 16.756639L322.530764 490.391099c1.774413 0.704035 3.433192 1.719154 4.892427 3.010567l236.127905 208.861912 0-653.332912-160.751171 137.64287c-2.12643 1.824555-90.300632 78.69941-93.927229 76.162634-4.427846-3.097548-15.768125-17.59882-18.419512-22.512736-0.953721-1.768273-2.196015-1.334391 15.413038-16.379039 25.674753-21.936615 73.780377-61.548798 75.144444-62.717414l10.007935-8.570189 178.388876-152.761196c3.093455-2.653433 6.978948-4.028757 10.900258-4.028757 2.369977 0 4.756327 0.503467 7.003508 1.534959 5.939269 2.738367 9.749038 8.677637 9.749038 15.217586L597.060281 739.446431C597.060281 746.034477 593.190137 752.013655 587.182306 754.7203L587.182306 754.7203zM290.453185 254.814756l-115.040083 0L175.413102 489.195877l115.03906 0 0-234.381122L290.453185 254.814756zM747.742119 375.98444300000006c0-51.55212-34.83232-96.658434-84.702124-109.693308-1.415232-0.375553-2.846838-0.551562-4.245697-0.551562-7.438413 0-14.234189 4.992711-16.200984 12.523221-2.338255 8.949836 3.021823 18.104333 11.967566 20.442588 35.136242 9.18929 59.672054 40.96397 59.672054 77.279061 0 36.307927-24.535813 68.090794-59.672054 77.271898-8.945743 2.346441-14.305821 11.492752-11.967566 20.450774 2.342348 8.953929 11.499915 14.305821 20.446681 11.967566C712.909799 472.643899 747.742119 427.530422 747.742119 375.98444300000006L747.742119 375.98444300000006zM864.950588 375.793084c0-88.87619-48.554856-170.44495-126.718053-212.883505-2.537799-1.375324-5.276167-2.02717-7.982812-2.02717-5.939269 0-11.69946 3.166109-14.733563 8.762571-4.417613 8.134261-1.39886 18.303878 6.727215 22.720468 67.350944 36.566824 109.198028 106.851587 109.198028 183.427636 0 76.844156-42.055838 147.272181-109.741403 183.78784-8.154727 4.396123-11.192923 14.557554-6.795776 22.700001 4.38896 8.142447 14.558577 11.184737 22.701025 6.795776C816.151162 546.697499 864.950588 464.976266 864.950588 375.793084L864.950588 375.793084z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="down" unicode="" d="M888.306 619.94c15.615 15.617 40.93 15.617 56.545 0v0c15.617-15.615 15.617-40.93 0-56.545l-405.733-405.734c-15.615-15.617-40.928-15.617-56.545 0v0c-15.615 15.615-15.615 40.93 0 56.545l405.733 405.734zM538.619 214.20600000000002c15.617-15.615 15.617-40.93 0-56.545v0c-15.615-15.617-40.928-15.617-56.545 0l-405.734 405.734c-15.615 15.615-15.615 40.93 0 56.545v0c15.617 15.617 40.93 15.617 56.547 0l405.732-405.734zM538.619 214.20600000000002z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="file" unicode="" d="M887.443911 598.6304l0-44.578133 0-45.511111 0-477.866667c0-37.705956-30.560711-68.266667-68.266667-68.266667l-614.4 0c-37.705956 0-68.266667 30.560711-68.266667 68.266667l0 705.422222c0 37.6832 30.560711 68.266667 68.266667 68.266667l386.844444 0 45.511111 0 38.024533 0c7.805156 2.594133 16.566044 1.2288 22.778311-5.006222l183.136711-183.159467C885.919289 611.373511 887.876267 604.9564439999999 887.443911 598.6304zM659.888356 531.296711c-12.583822 0-22.755556 10.171733-22.755556 22.755556l0 204.8-45.511111 0-364.088889 0c-25.122133 0-45.511111-20.388978-45.511111-45.511111l0-659.911111c0-25.122133 20.388978-45.511111 45.511111-45.511111l568.888889 0c25.122133 0 45.511111 20.388978 45.511111 45.511111l0 455.111111 0 22.755556L659.888356 531.296711zM682.643911 750.273422l0-173.4656 159.288889 0 0 14.176711L682.643911 750.273422z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="layouts" unicode="" d="M917.213-103.239h-810.426c-23.151 0-41.918 18.766-41.918 41.917l0 698.644c0 23.148 18.767 41.917 41.918 41.917h810.426c23.149 0 41.918-18.769 41.918-41.917v-698.643c0-23.151-18.769-41.918-41.918-41.918zM316.38-61.321h600.833v363.294h-600.833v-363.294zM106.787-61.321h167.674v363.294h-167.674v-363.294zM148.705 637.322c-23.151 0-41.918-18.769-41.918-41.92s18.767-41.92 41.918-41.92 41.92 18.768 41.92 41.92-18.769 41.92-41.92 41.92zM274.461 637.322c-23.151 0-41.918-18.769-41.918-41.92s18.767-41.92 41.918-41.92c23.151 0 41.92 18.768 41.92 41.92s-18.77 41.92-41.92 41.92zM400.216 637.322c-23.15 0-41.918-18.769-41.918-41.92s18.769-41.92 41.918-41.92c23.152 0 41.92 18.768 41.92 41.92s-18.768 41.92-41.92 41.92zM875.293 511.566h-768.506v-167.675h810.426l0 167.675h-41.921z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="rate-half" unicode="" d="M1012.064 504l-359.552 31.008-140.512 331.04-140.512-331.552-359.552-30.496 273.024-236.544-82.016-351.552 309.056 186.528 309.056-186.528-81.504 351.552 272.544 236.544zM512 195.96799999999996l0 465.056 85.504-202.016 219.04-19.008-166.016-144.032 50.016-214.016-188.512 114.016z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="add-circle-fine" unicode="" d="M509.989715-60.972421000000054c-246.734474 0-446.75195 200.023616-446.75195 446.75809 0 246.732427 200.017476 446.75195 446.75195 446.75195 246.733451 0 446.757067-200.019523 446.757067-446.75195C956.746782 139.051195 756.723166-60.972421000000054 509.989715-60.972421000000054L509.989715-60.972421000000054zM509.989715 812.433746c-235.633648 0-426.650123-191.014428-426.650123-426.648077 0-235.639788 191.016475-426.654216 426.650123-426.654216 235.638765 0 426.654216 191.014428 426.654216 426.654216C936.643931 621.419318 745.62848 812.433746 509.989715 812.433746L509.989715 812.433746zM527.863804 153.46957999999995l-35.741016 0L492.122789 367.909533 277.678742 367.909533 277.678742 403.653619l214.443024 0L492.121765 618.0956189999999l35.741016 0L527.862781 403.653619l214.442 0 0-35.744086L527.863804 367.909533 527.863804 153.46957999999995 527.863804 153.46957999999995zM527.863804 153.46957999999995" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="prev-circle" unicode="" d="M508.638018 827.97307c-246.403458 0-446.845649-200.463469-446.845649-446.845649 0-246.382179 200.442191-446.845649 446.845649-446.845649 246.382179 0 446.845649 200.463469 446.845649 446.845649C955.483667 627.5096 755.041476 827.97307 508.638018 827.97307zM508.638018-23.16149900000005c-222.933422 0-404.28892 181.355498-404.28892 404.28892 0 222.933422 181.355498 404.28892 404.28892 404.28892 222.912144 0 404.28892-181.355498 404.28892-404.28892C912.926939 158.19399899999996 731.57144-23.16149900000005 508.638018-23.16149900000005zM252.87208 485.1999c8.639016 26.129831-32.470784 37.215859-41.067243 11.32009-27.810822-83.730363-22.321004-168.545923 14.086277-248.573851 11.362646-24.938243 48.025268-3.298146 36.747735 21.491148C230.976644 339.081373 228.806251 412.853462 252.87208 485.1999zM599.262572 247.73335499999996l-127.627629 133.394065 127.47868 133.223838c9.043305 9.064583 9.022026 23.789211-0.021278 32.832516-8.809243 8.830521-24.087108 8.766686-32.832516 0l-148.310199-148.310199c-4.617405-4.638683-6.979303-11.064749-6.553736-17.746156-0.404289-6.702685 1.936331-13.107472 6.575015-17.788712l148.310199-148.28892c4.383343-4.383343 10.213615-6.787798 16.405619-6.787798 6.170726 0 12.000997 2.404455 16.405619 6.787798C608.156928 224.114371 608.156928 238.83899899999994 599.262572 247.73335499999996z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="read" unicode="" d="M335.282306 712.495464C399.587328 713.451107 442.778899 696.882717 470.183494 669.3706540000001 479.127332 660.39174 485.691302 650.857363 490.241971 641.442689 492.795622 636.159553 494.049041 632.438701 494.358795 631.0740940000001L493.723712 636.7409230000001 493.723706 196.90019600000005C493.723706 199.018106 495.816045 203.920655 503.591595 207.36436700000002 511.039185 210.66283299999998 515.68422 209.16527399999995 517.176538 207.906613L500.671543 188.33763 521.297207 203.50146800000005C514.140179 213.23636899999997 499.631258 225.71450900000002 476.134074 237.35914000000002 439.577969 255.475456 390.86048 266.10507900000005 328.491925 266.10508200000004 265.860796 266.10508200000004 219.424582 255.71817999999996 186.827162 237.741581 164.977332 225.69198700000004 152.538132 212.28117299999997 147.220271 201.30886999999996L170.257196 190.14374199999997 151.035786 207.05224299999998C152.884078 209.15336100000002 158.307299 211.80336599999998 167.849005 208.050434 177.092077 204.41496099999995 179.2 199.20011699999998 179.2 196.66445199999998L179.2 497.049743 179.2 636.7409230000001 175.817447 624.023021C177.078908 626.226721 180.088681 630.807811 184.828724 636.965629 192.95423 647.521524 202.792594 658.127492 214.297641 668.007961 247.526453 696.544681 287.381649 713.209056 334.514421 712.495571L335.282306 712.495464ZM335.289387 763.689705C274.661039 764.607483 223.081402 743.04085 180.940156 706.850184 156.32698 685.712527 139.975514 664.470237 131.382553 649.4588249999999L128 643.549699 128 636.7409230000001 128 497.049743 128 196.66445199999998C128 159.26104999999995 164.542545 144.88818300000003 189.478606 173.23524099999997L191.776657 175.84764199999995 193.294121 178.978613C194.07832 180.59664399999997 199.156367 186.07133399999998 211.552092 192.907243 236.030601 206.40648099999999 274.024879 214.905082 328.491925 214.905082 383.221547 214.905079 424.163878 205.97190999999998 453.399258 191.483569 469.376966 183.56540600000005 477.614626 176.48075300000005 480.045882 173.17379000000005L481.844905 170.72677999999996 484.166551 168.768644C511.279708 145.90070000000003 544.923706 160.801293 544.923706 196.90019600000005L544.923712 636.740922 544.288627 642.407751C540.427211 659.419023 529.175531 682.697124 506.45814 705.503602 468.987716 743.1209699999999 412.352271 764.846461 334.521502 763.689812L335.289387 763.689705ZM0 506.026694L0 27.856867999999963C0-8.875636999999983 34.793167-23.40043300000002 61.4635 1.2485080000000153L63.46242 3.315859000000046C65.301149 5.444836000000009 69.655573 9.862312999999972 76.498228 15.820363000000043 88.306297 26.101906999999983 102.566352 36.46294 119.251411 46.17438500000003 167.295691 74.13829099999998 224.90855 90.95018200000004 292.337329 90.95018200000004 358.378978 90.95018000000005 409.459345 71.66956600000003 448.125308 39.64774 461.506042 28.56627400000002 472.380655 16.734758000000056 480.912593 4.997000999999955 485.832384-1.7713730000000396 488.762874-6.741985999999997 489.872527-9.02252199999998 496.058545-21.73590200000001 511.379537-27.027375000000006 524.092917-20.84135500000002 536.806298-14.655337000000031 542.097771 0.6656550000000152 535.91175 13.379036000000042 527.471002 30.726293000000055 509.777717 55.06771800000001 480.782336 79.08069999999998 433.134118 118.54132300000003 370.586889 142.15017999999998 292.337329 142.15018199999997 215.474895 142.15018499999996 149.074727 122.77408400000002 93.495781 90.424668 59.761154 70.78961500000003 36.872315 50.859801999999945 24.713677 36.78188399999999L44.088049 20.048869999999965 26.712598 38.84923500000002C28.162783 40.189508000000046 32.877261 41.946117999999956 40.792576 38.64178100000004 49.035365 35.200736000000006 51.2 30.12989200000004 51.2 27.856867999999963L51.2 506.026694C51.2 520.165184 39.73849 531.626694 25.6 531.626694 11.46151 531.626694 0 520.165184 0 506.026694L0 506.026694ZM696.80221 763.689812C618.971441 764.846461 562.335996 743.1209699999999 524.86557 705.503602 502.148181 682.697124 490.896501 659.419023 487.035083 642.407751L486.4 636.740922 486.400004 196.90019600000005C486.400006 160.801293 520.044004 145.90070000000003 547.157161 168.768644L549.478807 170.72677999999996 551.27783 173.17379000000005C553.709086 176.48075300000005 561.946746 183.56540600000005 577.924452 191.483569 607.159834 205.97190999999998 648.102165 214.905079 702.831787 214.905082 757.298833 214.905082 795.293111 206.40648099999999 819.77162 192.907243 832.167345 186.07133399999998 837.245391 180.59664399999997 838.029591 178.978613L839.547055 175.84764199999995 841.845105 173.23524099999997C866.781167 144.88818300000003 903.323712 159.26104999999995 903.323712 196.66445199999998L903.323712 497.049743 903.323712 636.7409230000001 903.323712 643.549699 899.941158 649.4588249999999C891.348196 664.470237 874.996732 685.712527 850.383556 706.850184 808.24231 743.04085 756.662673 764.607483 696.034325 763.689705L696.80221 763.689812ZM696.809291 712.495571C743.942063 713.209056 783.797257 696.544681 817.026071 668.007961 828.531119 658.127492 838.369481 647.521524 846.494989 636.965629 851.235031 630.807811 854.244804 626.226721 855.506263 624.023021L852.123712 636.7409230000001 852.123712 497.049743 852.123712 196.66445199999998C852.123712 199.20011699999998 854.231635 204.41496099999995 863.474707 208.050434 873.016412 211.80336599999998 878.439633 209.15336100000002 880.287925 207.05224299999998L861.066515 190.14374199999997 884.103441 201.30886999999996C878.785579 212.28117299999997 866.346381 225.69198700000004 844.49655 237.741581 811.89913 255.71817999999996 765.462916 266.10508200000004 702.831785 266.10508200000004 640.463232 266.10507900000005 591.745741 255.475456 555.189638 237.35914000000002 531.692454 225.71450900000002 517.183533 213.23636899999997 510.026502 203.50146800000005L530.652166 188.33763 514.147172 207.906613C515.63949 209.16527399999995 520.284527 210.66283299999998 527.732117 207.36436700000002 535.507665 203.920655 537.600004 199.018106 537.600004 196.90019600000005L537.6 636.7409230000001 536.964917 631.0740940000001C537.274671 632.438701 538.52809 636.159553 541.081741 641.442689 545.63241 650.857363 552.196378 660.39174 561.140218 669.3706540000001 588.544813 696.882717 631.736384 713.451107 696.041406 712.495464L696.809291 712.495571ZM972.799998 506.026694L972.799998 27.856867999999963C972.799998 30.12989200000004 974.964631 35.200736000000006 983.207422 38.64178100000004 991.122737 41.946117999999956 995.837214 40.189508000000046 997.287401 38.84923500000002L979.911949 20.048869999999965 999.286321 36.78188399999999C987.127682 50.859801999999945 964.238844 70.78961500000003 930.504218 90.424668 874.925269 122.77408400000002 808.525103 142.15018499999996 731.662669 142.15018199999997 653.132708 142.15017999999998 590.55104 117.26282200000003 543.127755 75.73800100000005 514.370099 50.55719499999998 496.945662 25.10259599999995 488.705389 7.022771000000034 482.841769-5.842485000000011 488.517717-21.02524200000005 501.382974-26.888862000000017 514.248233-32.752481999999986 529.430987-27.07653300000004 535.294607-14.211275 536.420563-11.740835999999945 539.350332-6.450639000000024 544.25735 0.7178109999999833 552.731727 13.097653000000037 563.54464 25.561581000000047 576.856734 37.21792900000003 615.190044 70.78337499999998 665.901421 90.95018000000005 731.662669 90.95018200000004 799.091447 90.95018200000004 856.704307 74.13829099999998 904.748587 46.17438500000003 921.433645 36.46294 935.6937 26.101906999999983 947.501771 15.820363000000043 954.344425 9.862312999999972 958.698848 5.444836000000009 960.537577 3.315859000000046L962.536497 1.2485080000000153C989.206831-23.40043300000002 1023.999998-8.875636999999983 1023.999998 27.856867999999963L1023.999998 506.026694C1023.999998 520.165184 1012.538487 531.626694 998.399998 531.626694 984.261508 531.626694 972.799998 520.165184 972.799998 506.026694L972.799998 506.026694Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="404" unicode="" d="M300.197309 299.705317l4.427931 1.803972c1.147982-2.787956 10.167841-7.543882 26.89558-14.267777l5.411915-12.955798c10.659833-24.927611 23.123639-62.483024 37.555413-112.66624 14.431775 5.575913 34.439462 0.983985 60.351057-13.611787l1.803972-4.427931L389.575913 107.828315l18.203716-42.639334c2.459962-5.575913-12.463805-15.579757-44.7713-29.847534-11.151826 7.215887-19.84369 9.675849-26.403587 7.05189l-0.983985 2.131967c-10.823831 25.419603-16.235746 42.311339-16.399744 50.675208l-4.427931-1.803972 6.3959-14.923767-11.151826-4.263933c-41.655349-16.235746-71.830878-18.695708-90.690583-7.871877l-4.427931-1.803972-1.803972 4.263933c-7.05189 16.727739 3.607944 77.406791 32.307495 182.037156 11.479821 4.427931 19.1877 14.923767 22.959641 31.323511C281.337604 290.685458 291.83344 296.425368 300.197309 299.705317L300.197309 299.705317zM216.230621 80.276746c28.371557 19.515695 40.999359 32.799488 38.047406 39.68738-0.983985 2.131967-0.65599 5.575913 0.65599 10.167841l-0.983985 2.131967c-25.5836-21.483664-38.047406-32.963485-37.391416-34.439462C215.246637 88.804612 215.082639 83.064702 216.230621 80.276746L216.230621 80.276746zM216.722614 72.896861l0.983985-2.131967c11.643818 1.147982 21.155669 3.279949 28.699552 6.231903 0.819987 0.327995 7.379885 5.411915 19.84369 15.251762l-0.983985 2.131967c-7.543882-2.951954-12.7918-0.983985-15.743754 6.067905C226.398463 85.032671 215.574632 75.848815 216.722614 72.896861L216.722614 72.896861zM225.90647 143.743754l11.151826 4.263933c-1.147982-2.623959-6.3959-8.691864-15.579757-18.53171-2.295964-10.823831-2.787956-17.547726-1.639974-20.335682 27.715567 20.663677 40.34337 33.783472 37.883408 39.523382l0.819987 10.331839-3.443946-3.935939-9.019859-3.443946-0.983985 2.131967c11.151826 4.263933 17.875721 16.891736 20.49968 37.719411l-0.983985 2.131967C239.35426 172.443306 227.21845 160.307495 227.874439 157.027546L225.90647 143.743754 225.90647 143.743754zM231.646381 173.42729l0.983985-2.131967 2.131967 0.819987c28.371557 23.123639 40.179372 40.179372 35.423447 51.331198 1.475977 0.65599 1.967969 1.639974 1.475977 2.951954l-2.295964-0.819987c-28.863549-21.647662-40.999359-38.047406-36.407431-49.035234C231.482383 175.723254 230.990391 174.73927 231.646381 173.42729L231.646381 173.42729zM240.994234 211.966688l0.983985-2.131967c13.775785 10.331839 35.915439 29.847534 66.418962 58.21909l2.131967 0.819987-6.3959 14.923767 0.491992 5.083921-2.295964-0.819987c-36.571429-32.963485-55.431134-51.82319-56.579116-56.743113L240.994234 211.966688 240.994234 211.966688zM311.67713 107.336323l-35.751441-13.939782c-1.475977-0.491992-6.887892-4.263933-16.235746-11.315823l0.819987-1.967969 12.299808 2.131967 20.007687 7.871877c11.643818 4.591928 32.143498 19.84369 61.171044 46.08328l-6.3959 14.923767-2.131967-0.819987c-24.107623-16.891736-34.439462-29.191544-31.159513-36.899423C315.449071 110.616272 314.629084 108.484305 311.67713 107.336323L311.67713 107.336323zM267.889814 264.773863l0.819987-1.967969c17.875721 16.891736 27.387572 25.419603 28.207559 25.747598l-0.983985 2.131967-8.855862-3.443946C274.941704 282.485586 268.545804 274.941704 267.889814 264.773863L267.889814 264.773863zM275.597694 222.954516c16.071749-37.883408 20.007687-67.894939 11.971813-90.034593l-3.443946-28.863549 26.89558 10.495836c-7.543882 30.011531-18.367713 65.598975-32.471493 106.926329l-0.983985 2.131967L275.597694 222.954516 275.597694 222.954516zM279.369635 231.810378l6.3959-14.923767c13.44779 15.087764 24.435618 24.271621 32.63549 27.55157l-3.607944 8.527867-2.459962 11.643818-2.131967-0.819987C289.045484 247.06214 278.713645 236.566304 279.369635 231.810378L279.369635 231.810378zM292.817425 194.58296c23.943626 17.219731 33.619475 30.995516 29.191544 41.491352l-2.787956 6.3959-2.295964-0.819987c-21.483664-18.859705-30.667521-31.651505-27.879564-38.3754L292.817425 194.58296 292.817425 194.58296zM294.457399 190.483024l2.787956-6.3959 2.295964-11.807816 2.295964 0.819987-0.491992-5.083921 6.3959-14.923767 32.471493 27.387572-6.3959 15.087764c-9.347854-10.331839-16.235746-16.399744-20.827675-18.203716l-2.295964-0.983985c-0.65599 1.639974 6.067905 10.167841 20.335682 25.419603l-3.115951 13.611787-0.983985 2.131967L294.457399 190.483024 294.457399 190.483024zM307.413197 148.171685l2.787956-6.3959 2.295964-11.643818c23.943626 17.219731 35.259449 27.387572 33.94747 30.503523l-5.411915 12.955798C329.224856 165.719411 318.07303 157.191544 307.413197 148.171685L307.413197 148.171685zM355.792441 131.935939c-23.779628-17.711723-34.111467-30.011531-30.995516-37.227418l1.475977-9.347854c25.255605 18.039718 36.899423 29.355541 34.931454 33.783472 24.435618 21.155669 38.703395 32.471493 42.803331 33.94747l-0.819987 1.967969c-1.803972 2.787956-6.723895 4.099936-14.595772 4.427931l-30.831518-31.9795L355.792441 131.935939 355.792441 131.935939zM327.912876 81.26073l4.591928-10.659833-0.491992-5.083921 2.295964 0.819987c23.451634 14.595772 34.275464 23.615631 32.63549 27.55157l-5.411915 12.955798L327.912876 81.26073 327.912876 81.26073zM333.816784 61.253043l5.411915-12.7918c25.747598 13.283792 37.719411 22.139654 35.915439 26.403587l-4.591928 10.659833C348.412556 70.272902 336.112748 62.237028 333.816784 61.253043L333.816784 61.253043zM357.596413 139.971813l1.803972-4.099936c4.919923 1.967969 8.527867 9.839846 10.823831 23.943626l-2.295964-0.819987C364.648302 147.679693 361.204356 141.44779 357.596413 139.971813L357.596413 139.971813zM731.674568 256.081999l3.935939-0.163997c-0.163997-2.459962 4.755926-9.019859 14.759769-19.515695l-0.65599-11.315823c-1.147982-21.975657-5.411915-53.955157-12.955798-95.774504 12.627803-0.65599 25.911595-10.659833 39.68738-30.175529l-0.163997-3.935939-47.887252-10.823831-1.967969-37.719411c-0.327995-4.919923-14.923767-7.379885-43.951313-7.379885-5.575913 9.019859-11.151826 13.775785-16.891736 13.939782l0.163997 1.967969c1.147982 22.467649 3.279949 36.735426 6.231903 42.967329l-3.935939 0.163997-0.65599-13.119795-9.839846 0.491992c-36.571429 1.803972-60.023062 9.839846-70.026906 24.271621l-3.935939 0.163997 0.163997 3.771941c0.819987 14.759769 30.667521 56.087124 89.706598 124.14606 10.167841-0.491992 19.515695 4.755926 28.371557 15.579757C714.290839 255.754004 724.294683 256.573991 731.674568 256.081999L731.674568 256.081999zM587.848815 115.86419l-0.163997-1.967969c9.019859-2.951954 16.891736-4.591928 23.615631-4.919923 0.65599 0 7.379885 1.475977 20.171685 4.755926l0.163997 1.967969c-6.723895 0.327995-9.839846 3.607944-9.511851 9.675849C599.328635 121.6041 588.012812 118.324151 587.848815 115.86419L587.848815 115.86419zM590.144779 121.440102c28.043562 5.083921 42.147341 10.659833 42.475336 16.727739 0.163997 1.803972 1.475977 4.263933 4.099936 7.215887l0.163997 1.967969c-26.731582-7.379885-40.015375-11.807816-40.179372-13.119795C592.440743 128.163997 590.308776 123.900064 590.144779 121.440102L590.144779 121.440102zM620.15631 165.227418l9.839846-0.491992c-1.803972-1.475977-7.871877-4.427931-18.367713-8.527867-5.575913-7.215887-8.527867-12.13581-8.527867-14.595772 28.043562 6.067905 42.147341 11.643818 42.311339 16.727739l4.263933 7.379885-3.935939-1.803972-8.035874 0.327995 0.163997 1.967969c9.839846-0.491992 19.351698 6.559898 28.863549 21.155669l0.163997 1.967969c-26.23959-7.379885-39.68738-12.463805-40.34337-14.923767L620.15631 165.227418 620.15631 165.227418zM670.667521 109.960282l-31.487508 1.475977c-1.31198 0-6.559898-0.983985-16.071749-2.951954l-0.163997-1.803972 9.839846-2.459962 17.711723-0.819987c10.331839-0.491992 30.995516 4.099936 61.991031 13.939782l0.65599 13.119795-1.803972 0.163997c-23.943626-4.591928-36.079436-10.167841-36.407431-16.891736C674.603459 110.944266 673.29148 109.796284 670.667521 109.960282L670.667521 109.960282zM635.244074 185.399103l-0.163997-1.967969 1.803972-0.163997c29.355541 7.70788 44.279308 16.563741 44.7713 26.23959 1.31198 0 2.131967 0.491992 2.131967 1.639974l-1.967969 0.163997c-29.191544-6.3959-44.115311-14.595772-44.607303-24.271621C635.900064 187.039078 635.244074 186.547085 635.244074 185.399103L635.244074 185.399103zM685.755285 207.37476c-1.803972-33.29148-9.675849-56.907111-23.615631-70.682896l-12.955798-20.171685 23.779628-1.147982c5.247918 24.763613 10.167841 54.611147 14.595772 89.870596l0.163997 1.967969L685.755285 207.37476 685.755285 207.37476zM656.071749 210.818706l-0.163997-1.967969c13.939782 3.115951 37.391416 10.167841 70.354901 21.155669l1.803972-0.163997 0.65599 13.119795 2.295964 3.607944-1.967969 0.163997c-39.03139-12.299808-59.859065-20.007687-62.483024-23.287636L656.071749 210.818706 656.071749 210.818706zM670.339526 68.46893l-0.65599-11.315823c23.943626 1.31198 35.915439 3.935939 36.079436 7.70788l0.491992 9.347854C684.443306 70.272902 672.471493 68.304933 670.339526 68.46893L670.339526 68.46893zM673.29148 85.196669l-0.491992-9.347854-2.295964-3.607944 1.967969-0.163997c22.631646 2.951954 33.94747 6.231903 34.111467 9.511851l0.65599 11.315823L673.29148 85.196669 673.29148 85.196669zM712.158873 113.568225c-23.943626-5.247918-36.079436-10.987828-36.407431-17.219731l-2.295964-7.379885c25.255605 5.083921 37.883408 9.511851 38.211403 13.44779 25.747598 7.543882 40.34337 11.151826 43.951313 10.987828l0.163997 1.803972c-0.327995 2.623959-3.443946 5.247918-9.347854 8.035874l-34.439462-13.44779L712.158873 113.568225 712.158873 113.568225zM682.147341 141.611787l-0.327995-5.73991-2.459962-9.347854c23.943626 4.755926 36.079436 8.691864 36.079436 11.479821l0.65599 11.315823C704.778988 147.351698 693.463165 144.727739 682.147341 141.611787L682.147341 141.611787zM688.051249 177.199231l-0.327995-5.73991-2.623959-9.511851 1.967969-0.163997-2.295964-3.607944-0.65599-13.119795 33.94747 9.511851 0.65599 13.283792c-10.659833-4.591928-18.039718-6.723895-21.975657-6.559898l-1.967969 0.163997c0 1.475977 8.199872 5.411915 24.271621 12.13581l2.623959 11.151826 0.163997 1.967969L688.051249 177.199231 688.051249 177.199231zM688.215247 180.807175c23.943626 4.755926 36.243434 11.807816 36.735426 20.991672l0.327995 5.73991-1.967969 0.163997c-22.631646-6.887892-34.275464-13.283792-34.603459-19.1877L688.215247 180.807175 688.215247 180.807175zM691.82319 212.786675l-0.65599-13.119795c15.415759 6.723895 26.89558 10.003844 34.111467 9.511851l0.327995 7.543882 2.459962 9.511851-1.803972 0.163997C704.450993 220.986547 692.971172 216.558616 691.82319 212.786675L691.82319 212.786675zM695.103139 240.994234l-0.163997-1.803972c19.351698 6.559898 29.355541 9.839846 30.339526 9.839846l0.163997 1.967969-7.871877 0.327995C706.746957 251.818065 699.367072 248.374119 695.103139 240.994234L695.103139 240.994234zM716.422806 118.980141l-0.163997-3.607944c4.427931-0.163997 10.003844 4.427931 16.727739 14.10378l-1.967969 0.163997C724.45868 122.26009 719.538757 118.816143 716.422806 118.980141L716.422806 118.980141zM479.118514 382.196028c53.627162 10.167841 89.870596 1.967969 109.222293-24.599616 9.675849-18.695708 15.579757-33.455477 17.875721-44.279308 11.807816-56.743113-5.903908-103.154388-53.299167-138.741832-12.463805-5.083921-22.631646-8.363869-30.339526-10.003844-31.651505-6.067905-63.631006 5.083921-95.938501 33.455477-9.347854 16.399744-15.251762 31.159513-18.039718 44.279308-13.283792 63.795003 1.967969 108.238309 45.919283 133.165919L479.118514 382.196028 479.118514 382.196028zM410.075593 265.429853c6.231903 5.247918 11.479821 8.199872 15.579757 9.019859-9.675849-9.347854-14.431775-15.087764-13.939782-17.219731-0.327995-5.411915-0.163997-10.167841 0.819987-14.267777l2.131967 0.327995c24.271621 15.743754 35.915439 25.5836 35.095452 29.519539l-2.131967 10.003844c-4.099936-3.607944-8.035874-5.73991-11.643818-6.559898l-0.819987 4.099936c10.823831 2.131967 15.251762 11.971813 13.44779 29.519539l-1.967969-0.327995c-22.467649-16.399744-34.603459-27.715567-36.407431-33.94747C409.255605 273.30173 409.255605 269.857783 410.075593 265.429853L410.075593 265.429853zM410.23959 286.257527c33.127482 21.647662 47.887252 40.34337 44.607303 56.251121-29.683536-23.615631-44.443306-36.079436-44.279308-37.555413C409.747598 295.769379 409.5836 289.537476 410.23959 286.257527L410.23959 286.257527zM412.699552 315.777066l0.491992-2.131967c27.059577 20.663677 44.607303 37.227418 52.643177 49.527226 10.331839 1.967969 17.055734 7.379885 20.49968 16.235746l-2.131967-0.491992C447.303011 372.028187 423.523382 350.872518 412.699552 315.777066L412.699552 315.777066zM414.339526 234.926329c2.459962-4.919923 4.263933-9.347854 5.083921-13.44779 18.859705 14.759769 30.339526 22.467649 34.111467 23.123639l-3.771941 18.039718C444.18706 261.493914 432.379244 252.310058 414.339526 234.926329L414.339526 234.926329zM421.883408 220.002562c2.131967-9.839846 5.247918-14.759769 9.675849-14.759769l27.879564 21.975657c-0.327995 1.147982-2.131967 6.231903-5.411915 15.415759C437.299167 228.530429 426.639334 220.986547 421.883408 220.002562L421.883408 220.002562zM432.707239 199.174888c5.083921-5.903908 8.527867-8.691864 10.495836-8.363869l3.935939 0.819987c10.987828 10.495836 19.1877 16.235746 24.599616 17.219731-0.819987 3.935939-3.935939 8.855862-9.511851 14.759769C442.21909 209.014734 432.379244 200.814862 432.707239 199.174888L432.707239 199.174888zM448.450993 185.563101l0.491992-2.131967c2.459962 0.491992 6.3959-0.819987 11.807816-3.771941 18.859705 10.003844 28.207559 16.727739 28.207559 19.84369-6.067905 1.639974-9.511851 4.427931-10.331839 8.363869C466.818706 202.946829 456.814862 195.566944 448.450993 185.563101L448.450993 185.563101zM469.442665 179.331198l0.491992-2.131967 14.923767 0.65599 12.627803 2.459962c2.459962 0.491992 8.199872 3.771941 17.547726 9.839846l-0.491992 2.131967c-6.887892-1.31198-13.611787 0.163997-20.49968 4.263933L469.442665 179.331198 469.442665 179.331198zM476.494555 249.030109l4.591928-21.811659c2.951954-14.431775 12.463805-25.091608 28.535554-31.9795l4.099936 0.819987c24.599616 34.275464 32.143498 73.798847 22.795644 118.570147l-2.459962 11.971813-6.231903 19.515695-6.067905-1.147982c-3.935939-0.819987-14.267777 0-30.831518 2.295964C473.870596 316.597053 469.278668 283.961563 476.494555 249.030109L476.494555 249.030109zM476.494555 363.172325l0.327995-1.967969c10.823831-2.131967 17.547726-3.115951 20.007687-2.623959 13.939782 10.167841 21.647662 17.875721 23.287636 23.287636l-21.319667-1.967969C496.174247 379.408072 488.630365 373.832159 476.494555 363.172325L476.494555 363.172325zM508.966047 363.172325l3.771941 2.787956c1.147982 0.163997 6.231903-2.951954 15.087764-9.675849 10.331839 13.119795 18.203716 20.171685 23.779628 21.155669-0.65599 2.951954-8.199872 4.263933-22.467649 4.099936C515.361947 370.716208 508.638053 364.648302 508.966047 363.172325L508.966047 363.172325zM511.590006 185.235106l0.491992-2.131967 4.099936 0.819987c19.84369 3.771941 35.751441 17.219731 47.723254 40.34337C554.557335 214.754644 537.173607 201.634849 511.590006 185.235106L511.590006 185.235106zM521.921845 197.534914c38.211403 24.271621 56.087124 42.311339 53.79116 53.79116 1.967969 4.919923 2.623959 8.527867 2.295964 10.823831-35.095452-26.567585-51.495195-44.935298-49.363229-54.939142C526.349776 206.71877 524.217809 203.602819 521.921845 197.534914L521.921845 197.534914zM528.64574 352.348495l7.543882-15.251762 2.131967 0.491992c4.263933 5.73991 13.283792 14.431775 27.059577 25.911595l-0.491992 2.131967c-5.411915 5.247918-8.363869 8.855862-8.855862 10.823831l-4.099936-0.819987L528.64574 352.348495 528.64574 352.348495zM536.845612 333.324792l4.263933-9.675849-0.491992-8.363869 4.099936 0.819987c19.515695 17.711723 29.027546 27.059577 28.863549 28.371557l-0.491992 2.131967c-1.967969 9.347854-4.263933 13.611787-7.05189 13.119795C548.817425 342.508648 539.141576 333.652787 536.845612 333.324792L536.845612 333.324792zM539.797566 236.402306c27.715567 19.84369 40.999359 32.63549 39.68738 38.703395 1.31198 7.215887 1.803972 12.13581 1.147982 14.759769l-1.967969-0.327995-35.095452-29.519539C540.78155 245.586163 539.469571 237.714286 539.797566 236.402306L539.797566 236.402306zM542.257527 307.413197l2.459962-11.971813 10.003844 3.935939c-7.05189-7.871877-10.331839-12.627803-10.003844-14.267777-0.65599-10.495836-0.819987-16.727739-0.327995-18.695708 18.695708 13.611787 30.831518 24.927611 36.243434 33.94747l-2.459962 11.971813c-7.05189-7.05189-12.7918-10.987828-16.727739-11.807816 8.035874 11.315823 13.939782 17.383728 17.711723 18.039718l-4.099936 19.84369C554.557335 320.532992 543.733504 310.201153 542.257527 307.413197L542.257527 307.413197zM307.249199 569.153107c-9.675849 0-17.711723-6.887892-19.84369-16.071749-4.263933-12.463805 1.639974-28.863549 29.519539-35.751441 1.31198 35.587444 0 49.527226 0 49.527226C313.809097 568.33312 310.693145 569.153107 307.249199 569.153107L307.249199 569.153107zM709.862908 537.173607c0-1.147982 0-2.131967-0.163997-3.115951 2.131967 3.279949 3.279949 7.215887 3.279949 11.479821 0 11.643818-9.183857 21.155669-20.49968 21.155669-3.443946 0-6.723895-0.819987-9.511851-2.459962C697.891095 563.905189 709.862908 551.933376 709.862908 537.173607L709.862908 537.173607zM531.761691 520.281871c0.65599 15.743754-32.963485 49.199231-32.963485 49.199231 0-18.203716 9.347854-42.803331 12.463805-48.707239-8.035874-11.643818-13.283792-32.307495-13.283792-32.307495S531.105701 504.374119 531.761691 520.281871L531.761691 520.281871zM488.794363 507.326073c2.459962 0 4.427931 1.967969 4.427931 4.427931 0 2.459962-1.967969 4.427931-4.427931 4.427931-2.459962 0-4.427931-1.967969-4.427931-4.427931C484.366432 509.294042 486.334401 507.326073 488.794363 507.326073L488.794363 507.326073zM445.335042 629.668161c-0.819987 8.855862-2.131967 16.235746-2.131967 16.235746s-53.627162 7.05189-63.959001-30.503523C395.151826 632.94811 427.623318 631.144138 445.335042 629.668161L445.335042 629.668161zM620.648302 614.908392c-9.675849 37.719411-63.303011 31.651505-63.303011 31.651505s-1.475977-7.379885-2.459962-16.235746C572.597053 631.636131 605.232543 632.784113 620.648302 614.908392L620.648302 614.908392zM419.587444 518.313901c29.847534 0 53.955157 21.975657 53.955157 49.035234 0 27.059577-24.271621 49.035234-53.955157 49.035234-29.847534 0-53.955157-21.975657-53.955157-49.035234C365.632287 540.289558 389.903908 518.313901 419.587444 518.313901L419.587444 518.313901zM419.587444 613.76041c28.371557 0 51.331198-20.827675 51.331198-46.411275 0-25.5836-22.959641-46.411275-51.331198-46.411275-28.207559 0-51.331198 20.827675-51.331198 46.411275C368.256246 592.932735 391.379885 613.76041 419.587444 613.76041L419.587444 613.76041zM419.587444 534.38565c20.007687 0 36.243434 14.759769 36.243434 32.799488 0 18.203716-16.235746 32.799488-36.243434 32.799488s-36.243434-14.759769-36.243434-32.799488C383.34401 549.14542 399.579757 534.38565 419.587444 534.38565L419.587444 534.38565zM435.331198 552.261371c1.967969 2.131967 4.919923 2.623959 6.559898 1.147982 1.639974-1.475977 1.475977-4.263933-0.491992-6.3959-1.967969-2.131967-4.919923-2.623959-6.559898-1.147982C433.035234 547.341448 433.199231 550.129404 435.331198 552.261371L435.331198 552.261371zM395.971813 585.880846c5.411915 5.73991 13.283792 7.05189 17.875721 3.115951 4.591928-3.935939 3.935939-11.807816-1.475977-17.547726-5.411915-5.73991-13.283792-7.05189-17.875721-3.115951C389.903908 572.433056 390.559898 580.304933 395.971813 585.880846L395.971813 585.880846zM584.240871 518.313901c29.847534 0 53.955157 21.975657 53.955157 49.035234 0 27.059577-24.271621 49.035234-53.955157 49.035234-29.847534 0-53.955157-21.975657-53.955157-49.035234C530.121717 540.289558 554.393338 518.313901 584.240871 518.313901L584.240871 518.313901zM584.240871 613.76041c28.371557 0 51.331198-20.827675 51.331198-46.411275 0-25.5836-22.959641-46.411275-51.331198-46.411275-28.207559 0-51.331198 20.827675-51.331198 46.411275C532.909673 592.932735 555.869315 613.76041 584.240871 613.76041L584.240871 613.76041zM584.240871 534.38565c20.007687 0 36.243434 14.759769 36.243434 32.799488 0 18.203716-16.235746 32.799488-36.243434 32.799488-20.007687 0-36.243434-14.759769-36.243434-32.799488C547.997438 549.14542 564.233184 534.38565 584.240871 534.38565L584.240871 534.38565zM599.820628 552.261371c1.967969 2.131967 4.919923 2.623959 6.559898 1.147982 1.639974-1.475977 1.475977-4.263933-0.491992-6.3959-1.967969-2.131967-4.919923-2.623959-6.559898-1.147982C597.688661 547.341448 597.852659 550.129404 599.820628 552.261371L599.820628 552.261371zM560.62524 585.880846c5.411915 5.73991 13.283792 7.05189 17.875721 3.115951 4.591928-3.935939 3.935939-11.807816-1.475977-17.547726-5.411915-5.73991-13.283792-7.05189-17.875721-3.115951C554.557335 572.433056 555.213325 580.304933 560.62524 585.880846L560.62524 585.880846zM957.171044 381.540038C957.171044 381.540038 957.171044 381.540038 957.171044 381.540038c-0.65599 0.983985-1.31198 1.803972-1.967969 2.951954-0.327995 0.327995-0.491992 0.65599-0.819987 0.983985-0.327995 0.327995-1.967969 0.65599-2.295964 0.983985-11.315823 14.759769-29.355541 40.34337-62.975016 46.247277l0 34.931454c0 4.263933-0.819987 8.691864-5.083921 8.691864L685.919283 476.330557c-0.163997 10.331839-0.327995 18.203716-0.65599 27.879564 24.435618 1.803972 43.295324 19.351698 43.295324 41.491352 0 22.467649-19.84369 40.671365-45.263293 41.819347-1.967969 78.226778-5.903908 143.98975-7.70788 150.549648l-0.491992 0.983985c-1.967969 2.295964-9.511851 5.247918-21.155669 8.363869 0.327995 13.939782-3.279949 29.355541-11.643818 46.08328 3.443946-21.647662-22.795644-36.079436-26.567585-38.047406-0.163997 0-0.327995 0-0.491992 0 0.163997 4.427931 0 57.727098-88.230621 97.90647-1.475977-44.115311-14.10378-70.682896-31.9795-86.754644L494.534273 766.606022l-5.411915-0.327995 0-0.163997 0 0 0 0 0.327995 0 0.327995-0.163997c-0.819987-0.163997-0.983985-0.491992-1.147982-1.147982-10.331839-8.035874-28.043562-18.203716-64.450993-18.203716-13.283792 0-28.207559 1.31198-44.607303 3.935939-4.099936 0.819987-7.70788 1.147982-11.151826 1.147982-5.575913 0-10.003844-0.983985-16.071749-2.295964l-0.327995 0-0.327995-0.163997c-17.547726-4.099936-27.55157-7.70788-30.011531-10.659833l-0.491992-0.983985c-0.491992-2.131967-2.295964-8.363869-5.73991-150.549648-25.255605-0.983985-45.263293-19.351698-45.263293-41.983344 0-22.139654 18.859705-39.523382 43.459321-41.163357-0.163997-9.675849-0.327995-17.547726-0.65599-27.879564L132.099936 476.002562c-4.427931 0-10.495836-4.591928-10.495836-8.691864l0-97.414478c-11.807816-0.65599-19.679693-2.295964-26.731582-4.755926-29.027546-10.495836-35.751441-35.915439-35.587444-60.023062 0-1.475977 0.491992-2.787956 0.983985-3.771941-6.723895-11.643818-6.231903-25.5836-5.083921-35.587444 0.983985-8.035874 2.623959-12.13581 4.427931-13.939782-4.263933-8.855862-0.983985-18.859705 1.967969-26.731582 3.771941-10.167841 12.13581-11.971813 22.139654-10.003844-4.755926-9.019859-2.459962-17.219731 11.643818-28.699552 4.427931-3.607944 14.267777 7.05189 26.075593 16.071749l0-267.151826c0-4.263933 6.067905-6.067905 10.331839-6.067905l751.928251 0c4.427931 0 5.083921 1.803972 5.083921 6.067905L888.784113 248.374119c16.727739 0.983985 29.355541 7.70788 38.539398 19.84369 4.591928 6.231903 7.871877 11.807816 8.691864 16.891736C977.670724 313.153107 982.262652 344.640615 957.171044 381.540038L957.171044 381.540038zM316.433056 508.638053c-22.959641 0.491992-40.835362 16.727739-40.835362 36.735426 0 20.335682 18.859705 36.899423 41.983344 36.899423l0 2.623959 0.163997-0.65599c0-0.819987 0-1.475977 0-2.295964 0.491992 0.163997 0.983985 0.163997 1.475977 0.327995l1.803972 0 0 0.491992c5.247918 1.31198 12.7918 2.951954 19.351698 3.771941 10.003844 35.095452 34.111467 64.122998 34.111467 64.122998s-9.839846 28.863549-13.939782 67.238949c51.167201-85.11467 229.268418-81.178732 280.107623-10.823831-4.591928-32.799488-12.627803-56.415119-12.627803-56.415119s24.107623-28.863549 34.111467-64.122998c6.559898-0.819987 13.939782-1.147982 19.023703-2.295964 0 0.491992 0 2.623959 0 2.623959l0.491992 0c23.123639 0 41.983344-18.695708 41.983344-39.03139 0-9.347854-3.935939-18.695708-10.495836-25.419603-10.167841-6.723895-25.091608-10.331839-40.835362-10.331839 0-6.723895 0.983985-19.351698 1.803972-35.423447L318.401025 476.658552c0.163997 10.331839 0.491992 19.84369 0.65599 30.175529l0 2.131967L316.433056 508.638053 316.433056 508.638053zM126.524023 462.554773c0 4.099936 6.3959 9.183857 10.823831 9.183857l741.432415 0c4.263933 0 5.575913-4.919923 5.575913-9.183857l0-29.027546c0 0.491992-6.723895 1.475977-10.823831 1.147982-22.795644-2.295964-44.443306-3.607944-60.679052-9.183857L176.215247 425.491352l-1.31198-2.787956 0-60.18706c-10.823831 5.903908-25.5836 8.363869-48.215247 7.871877L126.68802 462.554773 126.524023 462.554773zM821.381166-13.693786 180.807175-13.693786 180.807175 282.649584c10.823831 4.263933 15.579757 10.987828 15.087764 21.975657-0.491992 8.363869-4.263933 13.611787-15.087764 16.727739l0 7.379885c5.903908 1.967969 3.935939 4.263933 5.247918 6.723895 5.411915 10.495836 5.575913 18.203716-5.247918 23.779628l0 55.759129 615.318386 0c-2.787956-5.575913-4.755926-7.871877-5.575913-12.299808-1.475977-8.035874-1.639974-18.367713-1.147982-28.207559L697.891095 315.449071c0 0-28.371557-15.251762-16.727739-32.799488 11.643818-17.383728 32.307495-11.479821 50.511211-0.327995 12.13581 7.379885 39.68738 23.287636 63.959001 40.179372 0.163997-0.163997 0.327995-0.163997 0.491992-0.327995-1.803972-1.31198-2.951954-2.295964-2.951954-2.295964-11.151826-7.543882-6.887892-36.899423 15.415759-41.327354 3.115951-0.65599 9.675849 0 9.675849 1.147982l0-293.391416L821.381166-13.693786 821.381166-13.693786zM177.855221 271.169763c0 3.443946-2.131967 6.231903-4.755926 8.035874 1.639974 0.491992 3.771941 0.983985 4.755926 1.475977L177.855221 271.169763 177.855221 271.169763zM177.855221 322.828956c-0.983985 0.163997-1.639974 0.327995-2.459962 0.491992 0.819987 0.491992 1.475977 0.983985 2.459962 1.475977L177.855221 322.828956 177.855221 322.828956zM878.780269-65.516976 137.347854-65.516976c-4.263933 0-10.823831 2.131967-10.823831 6.3959L126.524023 206.882767c5.903908 1.147982 4.919923 2.295964 6.723895 3.279949 19.679693 8.035874 38.047406 25.255605 25.747598 33.127482-0.163997 0-1.475977 0.163997-1.639974 0.163997 9.511851 3.771941 17.547726 9.839846 17.547726 20.663677l0-289.29148 655.169763 2.459962 0 291.915439c9.839846-9.675849 21.647662-14.595772 34.603459-10.331839 3.279949-6.559898 13.611787-9.839846 19.515695-10.331839l0-307.495195C884.192184-63.38501 883.044202-65.516976 878.780269-65.516976L878.780269-65.516976zM878.780269-65.516976" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="carousel" unicode="" d="M1002.069333 144.38400000000001L1002.069333 611.6906670000001c0 24.213333-16.917333 49.578667-42.069333 49.578667l-64 0 1.152 6.4c0 31.338667-26.005333 57.6-58.538667 57.6L186.432 725.269333c-31.936 0-58.410667-31.957333-58.410667-64l-0.213333 0.96L67.178667 662.229333c-25.152 0-45.226667-20.288-45.226667-44.501333l0-467.328L21.354667 150.39999999999998c0-24.789333 20.629333-44.693333 45.312-44.693333L127.786667 105.70666700000004l0-5.184C127.786667 69.03466700000001 153.792 42.66666699999996 186.432 42.66666699999996l652.842667 0c31.658667 0 56.277333 10.901333 56.725333 42.602667l64 0c24.661333 0 42.666667 34.325333 42.666667 59.114667L1002.069333 144.38400000000001zM128 149.26933299999996L64 149.26933299999996l0 469.333333 64 0L128 149.26933299999996zM853.333333 106.602667c0-6.421333-14.848-21.333333-21.333333-21.333333l-640 0c-6.485333 0-21.333333 14.848-21.333333 21.333333l0 554.666667c0 6.378667 9.258667 18.56 15.744 18.56l5.589333 2.773333 640 0c6.442667 0 21.333333-14.954667 21.333333-21.333333L853.333333 106.602667zM960 127.93600000000004l-64 0 0 490.666667 60.842667 1.984c4.970667 0 3.157333 2.944 3.157333-1.984l0-469.333333C960 144.29866700000002 965.013333 127.93600000000004 960 127.93600000000004zM412.458667 399.829333c43.925333 0 79.637333 34.773333 79.637333 77.482667 0 42.752-35.712 77.482667-79.637333 77.482667-43.925333 0-79.637333-34.730667-79.637333-77.482667C332.8 434.602667 368.533333 399.829333 412.458667 399.829333zM412.458667 516.0533330000001c21.952 0 39.829333-17.365333 39.829333-38.741333 0-21.333333-17.877333-38.741333-39.829333-38.741333-21.952 0-39.829333 17.408-39.829333 38.741333C372.629333 498.709333 390.506667 516.0533330000001 412.458667 516.0533330000001zM785.92 457.386667c-95.914667-23.338667-137.728-87.765333-168.256-134.805333-24.213333-37.269333-39.082667-58.346667-65.109333-58.346667l-0.042667 0c-35.456 0-57.109333 14.272-80.042667 28.16-24.362667 14.741333-49.536 29.952-88.64 29.952-75.648 0-156.906667-93.269333-165.930667-103.893333L213.333333 167.38133300000004c0-10.709333 8.917333-18.112 19.925333-18.112l557.504 0c10.986667 0 19.904 7.402667 19.904 18.112L810.666667 438.570667c0 5.973333-2.837333 11.626667-7.658667 15.296C798.186667 457.536 791.872 458.858667 785.92 457.386667zM770.858667 188.52266699999996L253.162667 188.52266699999996c24.874667 27.733333 85.290667 95.082667 130.666667 95.082667 27.733333 0 46.229333-11.157333 67.605333-24.128 25.152-15.168 53.632-32.426667 99.712-33.941333l2.944-0.064c47.637333 0 71.722667 37.12 97.237333 76.416 26.645333 41.088 56.469333 79.104 119.530667 102.485333L770.858667 188.52266699999996z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="help" unicode="" d="M690.2 741.8C635.2 783.6 573.2 798 494.6 798c-59.6 0-110.6-12.2-151-39.4C284 718 256 649.8 256 542l153.6 0c0 28.8-2.8 59.8 14 86.4 16.8 26.6 40.2 47 80.4 47 40.8 0 61.8-11.8 81.6-36.2 16.8-20.8 23.2-45.6 23.2-72 0-22.8-11.6-43.8-25.4-62.8-7.6-11.2-17.6-21.2-30.2-30.8 0 0-83-49.4-112.2-96.2-21.8-34.8-29.6-78.4-31.4-130.6-0.2-3.8 1.2-11.6 14.4-11.6 13 0 112 0 123.6 0 11.6 0 14 8.8 14.2 12.4 0.8 19 3.2 48.2 6.6 59.2 6.6 20.8 19.4 39 39.4 54.6l41.4 28.6c37.4 29.2 67.2 53 80.4 71.8 22.6 30.8 38.4 68.8 38.4 113.8C768 649 741 703.2 690.2 741.8zM484 155.6c-51.8 1.6-94.6-34.4-96.4-90.6-1.6-56.4 39-93.4 91-95 54-1.6 95.8 33.2 97.4 89.4C577.6 115.6 538 154 484 155.6z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="code-circle" unicode="" d="M513.544163 893.525741c-282.101629 0-510.78094-228.679311-510.78094-510.76288 0-282.083569 228.679311-510.76288 510.78094-510.76288s510.76288 228.679311 510.76288 510.76288C1024.325103 664.8464309999999 795.645793 893.525741 513.544163 893.525741zM513.544163-83.46335899999997c-257.503523 0-466.22622 208.740757-466.22622 466.22622S256.0587 848.989082 513.544163 848.989082s466.22622-208.740757 466.22622-466.22622S771.047686-83.46335899999997 513.544163-83.46335899999997zM171.771357 359.77212099999997L414.357086 256.088033 414.357086 300.805295 221.978945 380.50532599999997 414.357086 459.464886 414.357086 504.182148 171.771357 401.76228ZM442.585309 193.38272800000004L478.814238 193.38272800000004 584.737801 572.1429949999999 548.743656 572.1429949999999ZM612.749301 504.182148L612.749301 459.464886 804.874598 380.50532599999997 612.749301 300.805295 612.749301 256.088033 855.33503 359.77212099999997 855.33503 401.76228Z" horiz-adv-x="1025" />
+
+
+ <glyph glyph-name="water" unicode="" d="M862.315763 33.684211000000005C802.869868 33.684211000000005 754.526289 82.94399999999996 754.526289 143.50371900000005 754.526289 162.33094700000004 759.35885 180.96056099999998 768.520956 197.43438600000002 768.64671 197.79368399999998 768.808394 198.15298199999995 769.006008 198.49431600000003L849.075622 334.542596 849.057657 334.542596 862.315763 357.052632 875.573868 334.542596 875.573868 334.542596 955.140464 199.356632C955.715341 198.67396499999995 956.164464 197.865544 956.380043 196.96729800000003 965.380464 180.60126300000002 970.123201 162.151298 970.105236 143.50371900000005 970.105236 82.94399999999996 921.761657 33.684211000000005 862.315763 33.684211000000005L862.315763 33.684211000000005ZM924.33064 188.57768399999998C924.204885 188.79326300000002 924.115061 189.02680699999996 924.025236 189.27831600000002L862.315763 302.996211 800.606289 189.260351C800.516464 189.02680699999996 800.42664 188.79326300000002 800.300885 188.57768399999998 793.977236 176.505263 790.635763 162.81600000000003 790.635763 148.965053 790.635763 105.29235100000005 822.792956 69.75775399999998 862.333727 69.75775399999998 901.856534 69.75775399999998 933.995763 105.29235100000005 933.995763 148.98301800000002 933.995763 162.81600000000003 930.654289 176.52322800000002 924.33064 188.57768399999998L924.33064 188.57768399999998ZM682.684605 392.982456C593.50678 392.982456 520.982429 469.602807 520.982429 563.8108070000001 520.982429 593.093614 528.240254 622.071018 541.965447 647.706947 542.163061 648.281825 542.396605 648.820772 542.684043 649.341754L662.815412 860.968421 662.797447 860.968421 682.684605 896 702.571763 860.968421 702.535833 860.968421 821.89471 650.689123C822.774991 649.647158 823.439692 648.3716489999999 823.781026 646.970386 837.25471 621.514105 844.368815 592.8241399999999 844.35085 563.8108070000001 844.35085 469.602807 771.844464 392.982456 682.684605 392.982456L682.684605 392.982456ZM791.408254 630.1192980000001C791.21064 630.4965609999999 791.030991 630.891789 790.887271 631.322947L682.684605 823.924772 574.446008 631.287018C574.320254 630.891789 574.140605 630.4965609999999 573.942991 630.1013330000001 562.840675 609.6931930000001 556.912254 596.075789 556.912254 572.631579 556.912254 498.634105 613.375973 428.876351 682.684605 428.876351 751.993236 428.876351 808.367131 489.058807 808.367131 563.056281 808.367131 586.500491 802.492605 609.6931930000001 791.408254 630.1192980000001L791.408254 630.1192980000001ZM538.695833 276.983018C540.115061 275.330246 541.174991 273.33614 541.713938 271.12645599999996 563.433517 231.11859600000003 574.895131 186.02666699999997 574.895131 140.43171900000004 574.895131-7.581192999999985 458.051341-128 314.403903-128 170.738499-128 53.89471-7.581192999999985 53.89471 140.43171900000004 53.89471 186.47578899999996 65.589868 231.998877 87.704675 272.294175 88.010078 273.17445599999996 88.387341 274.01880700000004 88.872394 274.863158L282.408394 607.411649 282.372464 607.411649 314.403903 662.45614 346.453306 607.411649 346.399412 607.411649 538.695833 276.983018 538.695833 276.983018ZM314.403903 590.614456L119.807973 257.79649099999995C119.556464 257.113825 119.251061 256.449123 118.873798 255.78442099999995 98.932745 220.48336800000004 88.387341 180.42161399999998 88.387341 139.91073700000004 88.387341 12.072420999999963 189.799271-91.89052600000002 314.421868-91.89052600000002 439.026499-91.89052600000002 540.420464 12.072420999999963 540.402499 139.91073700000004 540.402499 180.42161399999998 529.857096 220.50133300000005 509.916043 255.78442099999995 509.53878 256.449123 509.233377 257.131789 508.963903 257.86835099999996L314.403903 590.614456 314.403903 590.614456Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="username" unicode="" d="M514.594 824.888c-144.11 0-260.979-118.46-260.979-264.558 0-88.783 43.497-166.928 109.711-214.898-135.361-59.354-230.159-195.858-230.159-354.931h0.894c1.541-21.375 18.641-38.377 40.117-38.377s38.575 17.051 40.117 38.377h0.645c0 0.944-0.099 1.79-0.099 2.734 0 0.05 0 0.099 0 0.149 0 0.099-0.05 0.149-0.05 0.199 0.05 159.967 120 291.054 273.009 304.924 8.948-0.944 17.598-2.734 26.844-2.734 144.11 0 260.979 118.46 260.979 264.558s-116.919 264.558-261.029 264.558zM514.594 377.54499999999996c-99.769 0-180.698 81.972-180.698 183.183s80.879 183.183 180.698 183.183c99.719 0 180.647-81.972 180.647-183.183s-80.879-183.183-180.647-183.183zM896.021-6.615000000000009c0 0.348-0.199 0.645-0.199 0.994-1.043 105.038-43.397 200.034-111.35 269.131v0c-7.157 7.357-17.001 11.98-27.986 11.98-21.574 0-39.122-17.747-39.122-39.668 0-11.135 4.573-21.127 11.83-28.334l-0.099-0.05c52.742-55.229 85.302-130.589 85.302-213.853 0-1.043-0.149-1.987-0.149-3.034h0.994c1.491-21.375 18.691-38.377 40.117-38.377 21.475 0 38.575 17.051 40.117 38.377h0.597c0 0.796-0.099 1.491-0.099 2.287-0.05 0.149 0.05 0.348 0.05 0.547z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="find-fill" unicode="" d="M512 896C229.236364 896 0 666.763636 0 384c0-282.786909 229.236364-512 512-512s512 229.213091 512 512C1024 666.763636 794.763636 896 512 896zM657.291636 383.976727c0-77.195636-60.392727-139.729455-136.424727-144.407273l-175.732364-151.714909-22.877091 13.242182 58.228364 222.021818c-8.634182 18.548364-13.800727 39.074909-13.800727 60.858182 0 77.195636 60.369455 139.729455 136.378182 144.430545l175.802182 151.714909 22.877091-13.172364-58.251636-222.068364C652.125091 426.309818 657.291636 405.806545 657.291636 383.976727zM512 384m-66.048 0a2.838 2.838 0 1 1 132.096 0 2.838 2.838 0 1 1-132.096 0Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="about" unicode="" d="M514.27174 834.607768c-249.516844 0-451.789687-202.272843-451.789687-451.789687s202.272843-451.789687 451.789687-451.789687 451.789687 202.272843 451.789687 451.789687S763.788583 834.607768 514.27174 834.607768zM514.27174-20.12919999999997c-222.541469 0-402.947282 180.405813-402.947282 402.947282s180.405813 402.947282 402.947282 402.947282 402.947282-180.405813 402.947282-402.947282S736.814232-20.12919999999997 514.27174-20.12919999999997zM514.295276 593.979362c-9.44614-10.360975-14.307867-22.951735-14.307867-37.483706 0-11.960403 3.886517-22.396079 11.534707-30.457686 7.783267-8.211009 17.853623-12.450567 29.313629-12.450567 9.312086 0 23.139 2.849908 35.782971 16.900925 9.865695 10.641361 14.866592 23.437805 14.866592 37.693484 0 11.68104-4.031826 21.900799-11.744485 29.832446C562.925856 615.325529 532.358677 613.449809 514.295276 593.979362zM549.461193 293.282882c-12.110829-11.541871-20.589944-18.759249-26.236548-23.316032 2.77009 14.953573 9.976212 44.614104 27.330462 103.023398 17.297968 57.890478 18.799158 67.991534 18.799158 72.955592 0 8.65717-3.63683 16.335037-9.921977 21.642926-14.124695 11.661597-39.035038 9.349949-69.131497-7.677866-16.779152-9.408277-34.595936-24.759917-54.493102-46.576805l-10.377348-11.541871 34.425044-26.548656 8.818853 8.715499c9.573029 9.292644 16.086373 15.35164 20.411889 19.393699-26.294876-86.460164-39.093367-140.190903-39.093367-164.262134 0-10.907421 3.172249-19.970844 9.573029-26.839275 6.460132-7.039323 15.510252-10.736529 25.891693-10.736529 10.146081 0 21.792329 3.926426 35.922141 11.949146 12.741185 7.212262 31.883151 23.029506 58.641585 48.190559l10.837836 10.391674-31.30703 30.475082L549.461193 293.282882z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="location" unicode="" d="M451.673935-98.39569900000004C478.883834-129.01914699999998 524.254807-128.8089789999999 551.400292-97.92885100000001 553.755808-95.38790800000004 558.821323-89.79676199999994 565.872444-81.84834999999998 577.572838-68.65901699999995 590.597131-53.62432000000001 604.615947-36.99831500000005 644.662065 10.495494000000008 684.708678 61.282182000000034 722.129538 113.35355300000003 759.658524 165.575381 792.492213 216.29072599999995 819.314991 264.54153799999995 868.685946 353.35368300000005 896 430.456574 896 493.714285 896 715.890551 719.301715 896 501.333333 896 283.364952 896 106.666667 715.890551 106.666667 493.714285 106.666667 430.401284 134.05152 353.19426999999996 183.54613 264.23737800000004 210.371803 216.02347099999997 243.193308 165.34812399999998 280.699364 113.16684599999996 318.155192 61.05544999999995 358.239268 10.22578999999996 398.322835-37.31103099999996 412.354743-53.95207300000004 425.391185-69.00072999999998 437.102468-82.20257900000001 444.160087-90.15846599999998 449.230214-95.75492099999997 451.982775-98.73670600000003L451.673935-98.39569900000004ZM486.822684-65.32134799999994C484.281231-62.568254000000024 479.425084-57.207989 472.585916-49.49835900000005 461.135889-36.591016999999965 448.364015-21.84776099999999 434.602351-5.527214999999956 395.275714 41.11192700000004 355.949587 90.98045200000001 319.289224 141.985137 282.808749 192.739548 250.983685 241.87642200000005 225.158316 288.29247799999996 179.388826 370.55419500000005 154.50505 440.709839 154.50505 493.714285 154.50505 688.960095 309.785362 847.238095 501.333333 847.238095 692.881306 847.238095 848.161617 688.960095 848.161617 493.714285 848.161617 440.753978 823.345286 370.701737 777.693969 288.58074899999997 751.873483 242.13293399999998 720.038415 192.96007499999996 683.537446 142.16873799999996 646.912604 91.20503299999996 607.624538 41.38032599999997 568.335977-5.21503800000005 554.587654-21.52024300000005 541.828177-36.24924999999996 530.389289-49.14379699999995 523.556841-56.84571100000005 518.705521-62.20043499999997 516.166694-64.95052599999997 507.543772-74.74891100000002 495.255793-74.80583000000001 487.131524-65.66235300000005L486.822684-65.32134799999994ZM714.955981 428.971194C723.919106 453.372045 728.565658 479.331002 728.565658 505.904762 728.565658 627.091817 632.184774 725.333333 513.29293 725.333333 394.401086 725.333333 298.020202 627.091817 298.020202 505.904762 298.020202 384.717709 394.401086 286.47619 513.29293 286.47619 549.003859 286.47619 583.510052 295.36805300000003 614.373097 312.125591 626.032316 318.456132 630.449257 333.22218 624.238611 345.10648100000003 618.027966 356.99078199999997 603.541579 361.49299399999995 591.882359 355.16245100000003 567.900883 342.14136099999996 541.111735 335.23809500000004 513.29293 335.23809500000004 420.821495 335.23809500000004 345.858586 411.648164 345.858586 505.904762 345.858586 600.161359 420.821495 676.571428 513.29293 676.571428 605.764365 676.571428 680.727273 600.161359 680.727273 505.904762 680.727273 485.192019 677.117041 465.022684 670.154965 446.069408 665.522846 433.459117 671.796821 419.408892 684.168282 414.687349 696.53974 409.965809 710.323861 416.360905 714.955981 428.971194L714.955981 428.971194Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="up" unicode="" d="M513.6 539.2l384-384c12.8-12.8 32-12.8 44.8 0 12.801 12.8 12.801 32 0 44.8l-403.2 403.2C532.8 609.6 520 616 513.6 616c-6.4 0-19.2 0-25.599-6.4L78.399 200c-12.8-12.8-12.8-32 0-44.8s32-12.8 44.8 0L513.6 539.2z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="pause" unicode="" d="M512-128c-282.714 0-511.893 229.232-511.893 512 0 282.768 229.179 512 511.893 512 282.714 0 511.893-229.232 511.893-512 0-282.768-229.179-512-511.893-512zM512 863.996c-265.043 0-479.9-214.91-479.9-479.996 0-265.097 214.857-479.996 479.9-479.996 265.043 0 479.9 214.899 479.9 479.996 0 265.086-214.857 479.996-479.9 479.996zM639.973 181.32299999999998h-21.329c-23.558 0-42.658 19.1-42.658 42.658v319.933c0 23.558 19.1 42.658 42.658 42.658h21.329c23.558 0 42.658-19.1 42.658-42.658v-319.933c0-23.558-19.1-42.658-42.658-42.658zM405.356 181.32299999999998h-21.329c-23.558 0-42.658 19.1-42.658 42.658v319.933c0 23.558 19.1 42.658 42.658 42.658h21.329c23.558 0 42.658-19.1 42.658-42.658v-319.933c0-23.558-19.1-42.658-42.658-42.658z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="date" unicode="" d="M933.185668 758.3591759999999l-167.054737 0 0 56.506968L732.333174 814.866145l0-56.506968L539.505447 758.3591759999999l0 56.506968-33.796734 0 0-56.506968-216.255299 0 0 56.506968-33.796734 0 0-56.506968L88.005356 758.3591759999999c-12.255115 0-22.224164-9.970072-22.224164-22.224164l0-706.60521c0-12.255115 9.970072-22.225187 22.224164-22.225187l845.179288 0c12.255115 0 22.225187 9.970072 22.225187 22.225187L955.409832 736.135012C955.409832 748.389104 945.43976 758.3591759999999 933.185668 758.3591759999999zM939.036933 29.528778999999986c0-3.226484-2.62478-5.852288-5.852288-5.852288l-845.179288 0c-3.226484 0-5.851265 2.62478-5.851265 5.852288L82.154092 736.135012c0 3.226484 2.62478 5.851265 5.851265 5.851265l167.650301 0 0-55.657624 33.796734 0 0 55.657624 216.255299 0 0-55.657624 33.796734 0 0 55.657624L732.333174 741.986277l0-55.657624 33.796734 0 0 55.657624 167.054737 0c3.226484 0 5.852288-2.62478 5.852288-5.851265L939.036933 29.528778999999986zM206.835765 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM206.835765 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM206.835765 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="layim-uploadfile" unicode="" d="M914.7359263333336 663.0359498888887c-20.806884999999987 20.806885000000012-48.471967999999976 32.265868000000026-77.89816099999994 32.265868000000054l-352.221993 2.2737367544323206e-13-120.26099099999992 95.03035300000005-11.157106999999995 8.816806000000007-14.220886 9.769962616701378e-15L197.09333633333344 799.148976888889c-51.69538300000001 2.1316282072803006e-14-93.75224400000005-42.88778599999995-93.75224400000006-95.60442799999993l-1.5631940186722204e-13-255.13888799999998c-1.7763568394002505e-15-2.302439 0.08391099999999785-4.716417999999999 0.24968699999999489-7.196911999999999l-1.9895196601282805e-13-340.692403c-1.9539925233402755e-14-29.426192999999998 11.458982999999954-57.09127599999999 32.26586799999994-77.89816100000002 20.806884999999987-20.806885000000012 48.471967999999976-32.265868000000026 77.89816099999994-32.265868000000054l623.083981-3.410605131648481e-13c29.426192999999998-1.9539925233402755e-14 57.09127599999999 11.458982999999954 77.89816100000002 32.26586799999994 20.806885000000012 20.806884999999987 32.265868000000026 48.471967999999976 32.265868000000054 77.89816099999994L947.0028173333335 585.1377888888885C947.0017943333336 614.5639818888885 935.5428113333334 642.2280418888886 914.7359263333336 663.0359498888887zM197.09333633333372 758.2167298888891l141.88345099999998-8.526512829121202e-14L470.3948853333333 654.369569888889l366.44287999999995-2.2737367544323206e-13c38.236859-2.1316282072803006e-14 69.23178099999997-30.99492100000004 69.23178099999994-69.23178100000004L906.0695463333333 465.9195468888886 144.27334033333327 465.91954688888893 144.2733403333336 703.5445488888892C144.2733403333336 733.7361748888891 167.92296933333355 758.2167298888891 197.09333633333372 758.2167298888891zM836.8377653333331 31.28558888888881L213.75480733333322 31.28558888888915c-38.236859 2.1316282072803006e-14-69.23178099999997 30.99492100000004-69.23178099999994 69.23178100000004L144.52302633333338 424.4776928888892l761.546519-6.252776074688882e-13-2.2737367544323206e-13-323.96134599999993C906.0695463333333 62.28050988888867 875.0746243333334 31.285588888888583 836.8377653333331 31.28558888888881z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="delete" unicode="" d="M738.923 24.288h-451.956c-27.2 0-49.327 21.603-49.327 48.157v418.017c0 26.548 22.129 48.147 49.327 48.147h451.956c27.2 0 49.327-21.598 49.327-48.147v-418.017c0-26.555-22.129-48.157-49.327-48.157zM286.966 494.547c-4.447 0-7.168-2.644-7.168-4.084v-418.017c0-1.443 2.722-4.093 7.168-4.093h451.956c4.448 0 7.168 2.651 7.168 4.093v418.017c0 1.44-2.722 4.084-7.168 4.084h-451.956zM832.199 496.302h-640.401c-27.201 0-49.327 20.131-49.327 44.876v61.045c0 24.74 22.128 44.867 49.327 44.867h640.401c27.2 0 49.327-20.127 49.327-44.867v-61.045c0-24.744-22.129-44.876-49.327-44.876zM184.631 541.327c0.387-0.733 2.722-2.866 7.168-2.866h640.401c4.445 0 6.782 2.132 7.168 2.867v60.741c-0.393 0.736-2.733 2.863-7.168 2.863h-640.401c-4.437 0-6.776-2.128-7.168-2.863v-60.742zM600.748 605.354h-174.546c-27.201 0-49.327 20.13-49.327 44.876v10.736c0 24.74 22.128 44.867 49.327 44.867h174.546c27.2 0 49.327-20.126 49.327-44.867v-10.736c0-24.745-22.128-44.876-49.327-44.876zM419.034 650.378c0.387-0.733 2.722-2.865 7.168-2.865h174.546c4.446 0 6.782 2.131 7.168 2.865v10.432c-0.393 0.736-2.734 2.862-7.168 2.862h-174.546c-4.437 0-6.776-2.126-7.168-2.862v-10.432zM404.099 430.833h-30.097c-7.297 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.916-13.212 13.213-13.212h30.098c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213zM659.583 430.833h-30.097c-7.298 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.917-13.212 13.213-13.212h30.097c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213zM531.841 430.833h-30.098c-7.297 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.917-13.212 13.213-13.212h30.098c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="play" unicode="" d="M512 896C229.376 896 0 666.624 0 384 0 101.37599999999998 229.376-128 512-128 794.624-128 1024 101.37599999999998 1024 384 1024 666.624 794.624 896 512 896L512 896 512 896zM512-95.23199999999997C245.76-95.23199999999997 32.768 117.75999999999999 32.768 384 32.768 650.24 245.76 863.232 512 863.232S991.232 650.24 991.232 384C991.232 117.75999999999999 778.24-95.23199999999997 512-95.23199999999997L512-95.23199999999997 512-95.23199999999997zM733.184 392.192L393.216 588.8c-4.096 4.096-8.192 4.096-12.288 0C376.832 588.8 372.736 584.704 372.736 580.608l0-393.216c0-4.096 4.096-8.192 4.096-8.192 4.096-4.096 8.192-4.096 12.288 0l344.064 196.608c4.096 4.096 4.096 4.096 4.096 8.192C741.376 388.096 737.28 392.192 733.184 392.192L733.184 392.192 733.184 392.192zM733.184 392.192" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="top" unicode="" d="M812 153.4l-300 172.8-300-172.8 300 604L812 153.4zM264.5 209.2l247.5 142.5 247.5-142.5L512 707.5 264.5 209.2zM371.7 138.3l0-126.2-15.9 0 0 126.2-45.9 0L309.9 153l107.4 0 0-14.8L371.7 138.2zM506.6 154.5c26.6 0 43.3-3.9 50-11.7 6.7-7.8 10-27.2 10-58.3 0-33.5-3.2-54.2-9.6-62-6.4-7.8-23.2-11.8-50.4-11.8-27 0-43.8 3.9-50.3 11.7-6.5 7.8-9.8 27.9-9.8 60.3l0 9.9 0.2 13.3c0 18.7 4.2 31.5 12.6 38.4C467.8 151 483.5 154.5 506.6 154.5zM506.5 141c-22.3 0-35.3-2.5-39.1-7.4-3.8-5-5.7-22-5.7-51 0-29.1 1.9-46.1 5.7-51.1 3.8-5 16.8-7.4 39.1-7.4 22.4 0 35.4 2.5 39.2 7.4 3.8 5 5.7 22 5.7 51.1l0 9.2-0.1 13.3c0 15.6-2.6 25.4-7.8 29.6S525.9 141 506.5 141zM608.4 12.1 608.4 153l59.2 0 5.4 0c15.9 0 26.7-3.1 32.5-9.2 5.8-6.1 8.7-17.6 8.7-34.4 0-16.1-3-27.1-9-32.9-6-5.9-17.3-8.8-33.9-8.8l-6.2-0.1-40.7 0 0-55.5L608.4 12.1zM624.3 81.1l37.7 0c15.8 0 25.9 1.6 30.3 4.9 4.4 3.2 6.7 10.7 6.7 22.3 0 13.6-1.5 22.2-4.5 25.9-3 3.6-10.1 5.4-21.3 5.4l-6.1 0.1-42.7 0L624.4 81.1z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="friends" unicode="" d="M672.02974 765.933689c7.66047-32.266891 8.420787-62.237483 7.713682-95.365998-0.283456-12.778024-7.291057-71.832002-5.3918-89.926102 1.561565-14.936177 5.132904-16.128329 10.759041-28.436656 9.803273-21.422915 6.51846-50.970882 2.76088-72.566736-2.056845-11.816117-6.404873-28.64541-13.017478-38.287001-7.291057-10.645454-21.864984-10.711969-28.319999-23.12365-9.29469-17.848507-4.045129-42.930765-9.903557-62.21497-6.65763-21.883403-23.599488-23.420409-24.877597-52.040237 8.316409-1.243317 16.59598-2.479471 24.877597-3.722788 8.316409-18.498306 23.533996-55.70265 39.08518-66.900689 13.024641-3.728928 26.048259-7.448646 39.07904-11.156084 45.641503-19.593244 96.365768-43.032072 142.108578-63.215764 41.656749-18.381649 91.51325-24.937972 106.575294-70.629617 0-31.026644 2.795673-104.309694 2.025123-144.978952L58.155515-56.631556000000046c-0.757247 40.669258 2.029216 113.952308 2.029216 144.978952 15.065114 45.691645 64.928778 52.247968 106.578364 70.629617 45.74281 20.182668 96.467075 43.62252 142.098345 63.215764 13.027711 3.707438 26.054399 7.427156 39.08211 11.156084 15.554254 11.197016 30.78105 48.402383 39.09439 66.900689l18.492166 4.710278c-4.196579 24.429389-18.658965 26.322505-24.682146 43.62559-2.356674 26.013467-4.729721 52.052516-7.095605 78.079286 0.107447-1.234107-17.006326 3.246951-19.252483 4.716418-24.130583 15.838733-24.618701 80.075757-26.941606 106.793258-1.063215 12.222369 15.163351 22.240537 10.654664 44.62536-26.433022 131.125433 11.437493 219.776496 71.330582 240.123916 41.564651 17.633612 119.167077 50.323129 191.563944 3.716648l17.971303-17.428951 29.061896-5.237281C662.71663 795.172617 672.02974 765.933689 672.02974 765.933689z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="refresh-3" unicode="" d="M820.376904 697.14807C740.637816 774.519228 631.884926 822.157201 511.999488 822.157201c-244.621347 0-442.925808-198.305485-442.925808-442.926832 0-244.6193 198.304462-442.925808 442.925808-442.925808 206.075449 0 379.271046 140.739395 428.740738 331.337337L822.859445 267.64189899999997c-45.759183-127.45381-167.656441-218.623229-310.859957-218.623229-182.371584 0-330.210677 147.842163-330.210677 330.210677 0 182.371584 147.840116 330.2117 330.210677 330.2117 88.762603 0 169.32443-35.035958 228.655723-92.015693L557.051567 433.822732l280.641725 0 113.880677 0 3.351328 0L954.925297 831.695438 820.376904 697.14807z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="ok" unicode="" d="M960 640L915.2 684.8 371.2 172.79999999999995 108.8 454.4 64 409.6 358.4 83.20000000000005 364.8 89.60000000000002 371.2 83.20000000000005Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="layer" unicode="" d="M96.089 724.318l0-684.236 831.822 0L927.911 724.318 96.089 724.318zM884.178 84.457L140.464 84.457 140.464 489.559l743.714 0L884.178 84.457z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="face-smile-fine" unicode="" d="M511.558443 852.9315573333333c-246.787686 0-447.597201-200.783932-447.597201-447.598224 0-246.815315 200.783932-447.598224 447.597201-447.598224 246.841921 0 447.64939 200.782909 447.64939 447.598224C959.207833 652.1476253333334 758.400365 852.9315573333333 511.558443 852.9315573333333zM511.558443-4.962310666666667c-226.247884 0-410.295644 184.046736-410.295644 410.295644 0 226.249931 184.072319 410.296667 410.295644 410.296667 226.27449 0 410.346809-184.046736 410.346809-410.296667C921.905252 179.08442633333334 737.832933-4.962310666666667 511.558443-4.962310666666667zM724.38055 303.5726953333334c-9.698896 3.457752-20.366863-1.566682-23.848151-11.264555-28.500101-79.45461-104.372116-132.844587-188.82353-132.844587-84.798315 0-160.770614 53.689806-189.070146 133.590578-3.432169 9.723455-14.075577 14.772448-23.823592 11.364839-9.699919-3.432169-14.797008-14.100136-11.364839-23.823592 33.547047-94.77248 123.668601-158.434405 224.234017-158.434405 100.142791 0 190.140525 63.314001 223.935212 157.564595C739.125369 289.3978573333334 734.102982 300.0903843333334 724.38055 303.5726953333334zM302.49494 515.3479593333334c0-24.653493 19.98517-44.638663 44.638663-44.638663 24.653493 0 44.638663 19.98517 44.638663 44.638663s-19.98517 44.63764-44.638663 44.63764C322.48011 559.9855993333333 302.49494 540.0014523333333 302.49494 515.3479593333334L302.49494 515.3479593333334zM631.398856 515.3479593333334c0-24.653493 19.98517-44.638663 44.63764-44.638663 24.653493 0 44.63764 19.98517 44.63764 44.638663s-19.984147 44.63764-44.63764 44.63764C651.384026 559.9855993333333 631.398856 540.0014523333333 631.398856 515.3479593333334L631.398856 515.3479593333334z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="dollar" unicode="" d="M517.565-65.45399999999995c-244.263 0-442.299 198.014-442.299 442.299s198.014 442.299 442.299 442.299c244.263 0 442.299-198.014 442.299-442.299 0-244.263-198.014-442.299-442.299-442.299zM517.565 863.383c-268.751 0-486.564-217.834-486.564-486.564s217.834-486.564 486.564-486.564c268.751 0 486.564 217.834 486.564 486.564 0 268.751-217.834 486.564-486.564 486.564zM497.036 425.349c-18.443 6.957-33.605 16.314-45.238 27.617-11.581 11.306-20.059 23.465-25.468 36.742-5.423 13.177-8.178 26.235-8.178 39.172-0.004 18.194 2.564 34.357 7.846 48.514 5.327 14.231 13.748 25.85 25.468 35.02 11.581 9.167 26.798 15.204 45.482 18.295v-205.52zM534.455 356.13199999999995c16.937-6.756 32.277-14.997 46.035-24.855 13.748-9.678 24.613-21.601 32.929-35.57 8.204-13.909 12.436-30.734 12.622-50.307 0-14.231-1.859-27.907-5.785-40.833-3.858-12.866-9.542-24.531-17.271-34.804-7.691-10.211-17.271-18.443-28.678-24.613-11.328-6.318-24.613-9.678-39.76-10.341v221.377zM534.455 94.18299999999999c29.037 3.318 53.978 11.306 74.785 24.134 20.985 12.866 37.018 30.15 48.281 51.734 11.125 21.535 16.876 46.832 16.937 76.196 0 16.08-1.67 30.377-5.033 42.985-3.318 12.622-8.204 24.15-14.836 34.357-6.739 10.341-14.836 20.189-24.613 29.326-8.853 8.204-19.107 15.957-30.659 23.041-11.328 7.197-22.836 13.706-34.281 19.261-11.581 5.694-21.601 10.516-30.659 14.231v221.377c14.527-3.318 26.662-8.594 36.62-16.192 9.859-7.395 17.766-16.192 23.776-26.384 5.941-10.211 10.341-20.985 12.972-32.345 2.666-11.328 4.026-22.836 3.858-34.097h46.155c0.004 16.314-1.566 32.345-5.327 48.281-3.543 15.957-9.938 30.909-19.107 44.969-8.996 13.909-21.601 26.235-37.684 36.742-16.192 10.521-36.62 18.295-61.318 23.562v49.426h-37.441v-53.316c-23.465-2.624-42.985-8.178-58.595-16.314-15.633-8.204-28.279-18.194-37.684-29.562-9.441-11.328-16.523-23.302-21.226-35.317-4.59-12.062-7.846-23.302-9.316-33.326-1.566-10.211-2.256-18.194-2.115-24.029 0.004-21.601 3.452-40.612 9.863-57.238 6.479-16.523 15.58-30.909 27.178-43.441 11.659-12.436 25.361-23.562 40.833-33.204 15.633-9.678 32.649-18.443 51.098-26.235v-237.329c-18.194 1.984-33.326 7.197-45.094 15.633-11.97 8.369-21.074 19.107-27.714 31.902-6.739 12.972-11.011 27.178-13.363 42.701-2.256 15.58-3.034 31.313-2.115 47.367h-47.803c-1.183-23.776 0.397-46.035 5.033-66.676s12.357-39.03 23.376-55.019c10.892-16.08 25.361-29.037 43.142-39.03 17.847-9.863 39.472-16.08 64.586-18.295v-65.283h37.441v65.283z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="group" unicode="" d="M1383.17753-39.75895700000001L1380.048488-13.938771999999972 1373.005994 17.35852699999998 1362.834458 47.090445000000045 1348.751189 77.605053 1334.667921 101.07716700000003 1315.107539 123.76659099999995 1293.199086 141.76331100000004 1262.684478 158.97562200000004 1240.777745 169.147158 1211.828518 176.18965200000002 1182.87757 183.23042599999997 1157.840075 192.61927200000002 1126.544497 207.48523 1101.507002 219.22214799999995 1070.992393 233.30541600000004 1047.52028 246.607714 1047.52028 329.54366300000004 1057.690095 341.280581 1067.080661 356.92751 1074.121435 372.57615899999996 1079.598549 392.136541 1085.858352 415.610375 1088.204704 433.605376 1091.595216 432.822685 1098.37624 433.866846 1103.593603 438.040048 1109.330466 447.428894 1112.982449 458.3814 1115.06905 471.943448 1117.676871 496.459723 1118.719312 517.324016 1117.676871 535.059266 1114.024889 546.0134929999999 1106.722645 550.186695 1102.549442 549.142535 1106.201425 572.614649 1109.330466 600.782906 1110.374627 626.341621 1109.851687 646.684693 1106.722645 665.4623839999999 1100.984061 683.718855 1093.160597 700.409945 1082.20637 719.189356 1069.688483 734.838006 1055.082274 746.8346730000001 1036.304583 758.83134 1012.832469 769.785566 993.010617 775.00121 969.017283 779.174412 945.543448 779.695632 921.550114 775.52243 898.599221 767.698965 878.256148 759.35256 860.520898 747.877113 844.089558 733.2726250000001 828.440908 716.058594 814.35764 695.715522 804.186104 673.8087889999999 797.92802 648.771294 797.14533 616.691305 800.274372 586.959387 804.186104 548.621314 795.579949 548.621314 790.102836 541.57882 788.539175 529.060933 790.102836 499.329015 794.014568 464.902674 797.14533 447.688644 802.622443 438.299798 812.793979 432.822685 819.052063 433.605376 822.965515 406.221529 826.877248 389.790189 833.137051 371.79346899999996 841.743207 353.79846799999996 851.914743 339.7152 859.738207 329.54366300000004 858.955517 245.04233299999999 867.267518 242.13003600000002 878.734364 238.975192 891.063029 234.389141 902.817148 229.80137100000002 913.712888 225.78814699999998 923.459535 220.91310299999998 935.215374 216.03977999999995 948.116866 208.58615799999995 961.018358 201.13081599999998 971.625104 193.38992099999996 985.386695 183.06872699999997 997.142535 172.174708 1008.323827 158.41311700000006 1020.077947 143.21860000000004 1032.549389 125.72933699999999 1043.300632 105.086951 1052.476173 82.72436500000003 1060.502621 62.08197800000005 1066.093267 42.72974099999999 1069.963715 22.517404000000056 1073.834162-0.27523199999995995 1076.41446-26.93831499999999 1076.84451-45.000403000000006 1075.984411-61.12726799999996 1072.328988-73.59870999999998 1065.377664-87.28805299999999 1057.277248-96.391345 1042.440532-103.91721500000006 1351.099261-103.91721500000006 1365.182529-96.87472100000002 1376.136756-85.92221500000005 1383.17753-74.18529799999999 1384.742911-59.319339000000014ZM438.650719 816.389195L421.44873 797.467007 405.96694 775.104421 394.785647 751.021637 387.904851 723.498455 387.044752 688.234377 390.48515 655.550598 394.785647 613.4057250000001 385.324553 613.4057250000001 379.303857 605.6648299999999 377.583658 591.903239 379.303857 559.21946 383.604354 521.375084 387.044752 502.452896 393.065448 492.131703 404.246741 486.111007 411.127537 486.971106 415.428034 456.867625 419.728531 438.805537 426.609327 419.02325 436.070421 399.240962 447.251713 383.75917200000004 455.852708 372.57787900000005 454.992609 279.687139 440.370918 270.226045 405.96694 253.88415499999996 370.702863 238.40236500000003 342.319581 224.64077399999996 319.956995 215.17967999999996 295.014111 207.43878500000005 269.211128 202.278188 244.268244 196.25749199999996 218.46526 185.07619899999997 194.382475 173.034807 172.879989 157.55301699999995 148.797205 133.470232 131.595216 108.52734799999996 118.693724 84.44456400000001 108.372531 58.641579999999976 98.051337 29.398198999999977 92.89074 6.175514000000021 88.590243-13.606772999999976 86.009945-36.829458000000045 86.009945-57.47184500000003 89.450343-78.11423200000002 99.771536-91.87582299999997 115.253326-102.19701699999996 135.035613-103.91721500000006 995.995162-103.91721500000006 1011.476952-96.17632000000003 1023.518344-84.13492799999995 1031.259239-71.23343599999998 1032.979438-54.891546999999946 1031.259239-33.38906099999997 1027.818842-5.005778999999961 1020.077947 29.398198999999977 1008.896654 62.08197800000005 993.414864 95.625857 977.933074 121.42884000000004 956.430587 146.37172399999997 932.347803 166.15401199999997 898.803924 185.07619899999997 874.72114 196.25749199999996 842.89746 203.99838699999998 811.07378 211.739282 783.550598 222.060476 749.14662 238.40236500000003 721.623438 251.303857 688.079559 266.78564700000004 662.276576 281.407338 662.276576 372.57787900000005 673.457869 385.479371 683.779062 402.68136 691.519957 419.883349 697.540653 441.385835 704.421449 467.188819 707.001747 486.971106 710.729418 486.111007 718.18304 487.258379 723.916463 491.84443 730.224432 502.165623 734.237656 514.207015 736.532402 529.1159789999999 739.398253 556.066335 740.545626 579.001747 739.398253 598.496761 735.385029 610.538153 727.356861 615.1259239999999 722.77081 613.9785509999999 726.784034 639.7815350000001 730.224432 670.7451149999999 731.371805 698.842844 730.797258 721.205429 727.356861 741.847816 721.050611 761.915656 712.449617 780.265018 700.408225 800.907405 686.646634 818.109394 670.590297 831.2981589999999 649.94791 844.485204 624.144927 856.526596 602.356888 862.261739 575.979358 866.847789 550.176374 867.422336 523.800564 862.834565 498.570407 854.233571 476.207822 845.05975 456.712807 832.443811Z" horiz-adv-x="1449" />
+
+
+ <glyph glyph-name="layim-download" unicode="" d="M186.888458 77.07363199999998l0 581.729108c14.85022-14.450107 35.050284-23.436782 57.359382-23.436782l560.03604 0 0-151.561881 25.029046 0 0 176.591951-585.065086 0c-31.191396 0-57.359382 26.166963-57.359382 57.359382 0 31.191396 26.165939 57.359382 57.359382 57.359382l572.551074 0L816.798914 800.143838 244.24784 800.143838c-45.431725 0-82.388429-36.957727-82.388429-82.388429l0-640.681778c0-41.796942 34.000372-75.789127 75.789127-75.789127l225.950102 0 0 25.029046L237.648538 26.31355099999996C209.661114 26.31355099999996 186.888458 49.078021000000035 186.888458 77.07363199999998zM236.947574 730.269421l560.38601 0 0-25.029046-560.38601 0 0 25.029046ZM686.086897 428.171012c-85.917812 0-164.908864-55.248302-194.553021-135.882783-30.013571-81.641415-4.269233-175.567621 62.624293-230.942813 67.00302-55.465243 164.474982-62.808488 238.931764-17.720593 74.094532 44.868907 113.272833 133.533272 96.080266 218.517829C869.882923 357.47283300000004 783.297916 428.171012 686.086897 428.171012zM686.086897 38.82858599999997c-75.595722 0-145.060817 48.634674-171.092703 119.595842-26.354228 71.839165-3.63069 154.438395 55.287187 203.074092 59.017138 48.718585 144.762011 55.029314 210.191186 15.237029 65.11195-39.59888 99.396801-117.681236 84.064604-192.408171C847.384513 100.72940100000005 771.387655 38.82858599999997 686.086897 38.82858599999997zM698.600909 152.23547199999996L698.600909 311.02496499999995 673.571862 311.02496499999995 673.571862 152.28459099999998 604.675726 221.17254100000002 586.978668 203.47548400000005 686.111456 104.35190499999999 785.185916 203.42738799999995 767.489882 221.123422Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="picture-fine" unicode="" d="M958.648085 84.30682933333333L65.772494 84.30682933333333 65.772494 721.9115253333333l892.87559 0L958.648085 84.30682933333333zM97.660762 116.20328333333339l829.099055 0L926.759817 690.0570263333334 97.660762 690.0570263333334 97.660762 116.20328333333339zM648.731616 419.05893933333334l-1.991354 0c-47.801702 0-86.696548 38.900985-86.696548 86.695524l0 1.978051c0 47.809889 38.894845 86.671988 86.696548 86.671988l1.991354 0c47.801702 0 86.698594-38.862099 86.698594-86.671988l0-1.978051C735.43021 457.95992433333333 696.533318 419.05893933333334 648.731616 419.05893933333334zM646.740262 562.5193053333333c-30.224372 0-54.810327-24.582885-54.810327-54.787814l0-1.978051c0-30.230512 24.584931-54.803163 54.810327-54.803163l1.991354 0c30.222325 0 54.810327 24.572652 54.810327 54.803163l0 1.978051c0 30.203906-24.586978 54.787814-54.810327 54.787814L646.740262 562.5193053333333zM91.097276 181.7900473333334l-22.748097 22.338774 274.373974 279.332916 22.750143-22.351054L91.097276 181.7900473333334zM604.886015 215.92242633333342L339.999113 480.74793033333333l22.548552 22.525016L627.433544 238.4638153333334 604.886015 215.92242633333342zM619.007641 202.70744933333333l-22.763446 22.337751 167.989015 171.035398 22.765493-22.350031L619.007641 202.70744933333333zM925.622924 222.7939273333334L758.534418 389.8343373333333l22.548552 22.529109 167.086459-167.044504L925.622924 222.7939273333334z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="link" unicode="" d="M262.4-121.60000000000002c-64 0-128 25.6-179.2 76.8-102.4 102.4-102.4 262.4 0 364.8l134.4 134.4 89.6-89.6-134.4-134.4c-51.2-51.2-51.2-128 0-179.2 51.2-51.2 128-51.2 179.2 0l179.2 179.2c25.6 25.6 38.4 57.6 38.4 89.6S556.8 384 537.6 409.6L467.2 473.6l89.6 89.6 70.4-70.4C672 448 697.6 384 697.6 313.6c0-70.4-25.6-134.4-76.8-179.2l-179.2-179.2C396.8-96 326.4-121.60000000000002 262.4-121.60000000000002zM467.2 204.79999999999995L396.8 268.79999999999995c-102.4 102.4-102.4 262.4 0 364.8l179.2 179.2c102.4 102.4 262.4 102.4 364.8 0 102.4-102.4 102.4-262.4 0-364.8l-134.4-134.4-89.6 89.6 134.4 134.4c51.2 51.2 51.2 128 0 179.2-51.2 51.2-134.4 51.2-179.2 0L486.4 544c-51.2-51.2-51.2-128 0-179.2l70.4-70.4L467.2 204.79999999999995z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="diamond" unicode="" d="M998.4 526.933333L797.866667 802.133333c-4.266667 6.4-12.8 10.666667-19.2 10.666667L243.2 812.8c0 0-14.933333-2.133333-23.466667-17.066667C194.133333 753.066667 32 512 32 512L21.333333 494.933333l12.8-14.933333L469.333333-27.733333000000016c4.266667-4.266667 6.4-6.4 10.666667-8.533333 6.4-4.266667 32-10.666667 46.933333 0 4.266667 2.133333 6.4 6.4 10.666667 8.533333l409.6 420.266667c10.666667 8.533333 10.666667 25.6 0 34.133333-8.533333 10.666667-23.466667 10.666667-32 0L561.066667 61.86666700000001l153.6 422.4 0 0 251.733333 0c2.133333 0 19.2 0 23.466667 4.266667l2.133333 2.133333C1004.8 497.066667 1006.933333 512 998.4 526.933333zM782.933333 763.733333l-96-226.133333L341.333333 537.6l-85.333333 226.133333L782.933333 763.733333zM221.866667 714.666667l72.533333-179.2-192 0L221.866667 714.666667zM91.733333 488.533333l215.466667 0 138.666667-416L91.733333 488.533333zM503.466667 44.799999999999955l-147.2 443.733333 307.2 0L503.466667 44.799999999999955zM736 535.4666669999999L810.666667 701.866667l119.466667-168.533333L736 533.333333z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="log" unicode="" d="M828.01742 700.357158C743.476979 784.899646 631.076002 831.458031 511.516999 831.458031c-119.55798 0-231.959979-46.558385-316.500421-131.09985C110.47716 615.81774 63.918775 503.41574 63.918775 383.85776c0-87.103824 25.045419-171.548074 72.429613-244.204861 9.393951-14.402011 28.685319-18.46249 43.087331-9.071609 14.404058 9.393951 18.46556 28.685319 9.072633 43.089377-40.768519 62.511729-62.317301 135.194098-62.317301 210.187093 0 212.469066 172.85586 385.326972 385.325949 385.326972s385.325949-172.857906 385.325949-385.326972-172.85586-385.326972-385.325949-385.326972c-70.357418 0-139.188062 19.131733-199.052498 55.323003-14.71412 8.900717-33.856086 4.180206-42.753733-10.534937-8.896624-14.71719-4.180206-33.856086 10.534937-42.753733 69.584821-42.070164 149.556201-64.307631 231.271294-64.307631 119.559003 0 231.959979 46.558385 316.500421 131.09985 84.539418 84.539418 131.097804 196.941418 131.097804 316.499397S912.556838 615.81774 828.01742 700.357158zM494.28964 690.216193c-21.782096 0-39.397289-17.658172-39.397289-39.439244l0-283.524378c0-1.360997 0.358157-2.706645 0.493234-4.03285 2.020006-19.886933 18.959817-34.573423 39.379892-34.573423l0 0 0.146333 0.832971 223.590358 0c21.782096 0 39.438221 17.616216 39.438221 39.397289s-17.658172 39.397289-39.439244 39.397289L533.686928 408.273846l0 242.503103C533.686928 672.5580219999999 516.071735 690.216193 494.28964 690.216193z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="rate-solid" unicode="" d="M957.111079 492.519576c-3.927449 11.669784-14.447037 19.86442-26.723641 20.816095L647.68068 535.250796 540.183388 811.873997c-4.586458 11.803837-15.951297 19.579941-28.614711 19.579941s-24.02723-7.776104-28.614711-19.579941L375.458719 535.250796l-282.708803-21.915126c-12.276604-0.951675-22.796192-9.146311-26.723641-20.816095-3.927449-11.669784-0.50142-24.557302 8.701173-32.737612l217.547735-193.358823-67.980277-291.298436c-2.848884-12.20702 2.009773-24.919553 12.273535-32.114418 10.264784-7.195889 23.87271-7.42818 34.375925-0.586354l240.624313 156.709111 240.625336-156.709111c5.099135-3.320629 10.92891-4.974291 16.752546-4.974291 6.173606 0 12.342096 1.858324 17.623379 5.561669 10.263761 7.194866 15.122419 19.907399 12.273535 32.114418l-67.980277 291.299459L948.409906 459.781964C957.613522 467.962274 961.037505 480.849792 957.111079 492.519576z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="fonts-del" unicode="" d="M928 448l-143.616 0c-3.456 55.616-14.272 106.56-29.504 144.96C725.504 666.816 617.344 768 464.32 768L256 768l0-320L96 448C78.336 448 64 433.664 64 416S78.336 384 96 384L256 384l0-320 229.632 0c156.288 0 240.768 97.856 267.904 167.488C772.736 280.96000000000004 782.272 333.312 784.96 384L928 384C945.664 384 960 398.336 960 416S945.664 448 928 448zM349.376 711.488l63.936 0c35.712 0 251.84 27.968 266.944-263.488l-330.88 0L349.376 711.488zM439.296 120.51199999999994L349.376 120.51199999999994 349.376 382.528 349.376 384l330.88 0C665.344 113.98400000000004 467.968 120.51199999999994 439.296 120.51199999999994z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="unlink" unicode="" d="M150.336 767.6800000000001C133.44 762.304 124.16 744.3199999999999 129.472 727.488 131.2 722.1759999999999 134.208 717.44 138.304 713.664l122.624-122.432C270.208 576.192 289.92 571.52 304.96 580.736 320 590.0799999999999 324.672 609.7280000000001 315.456 624.832 312.832 629.056 309.184 632.64 304.96 635.264L182.336 757.696C175.168 765.44 164.672 769.216 154.304 767.6800000000001 152.96 767.808 151.552 767.808 150.336 767.6800000000001L150.336 767.6800000000001zM406.08 831.424c-13.696-4.48-22.72-17.6-22.016-32L384.064 672c0-17.664 14.336-32 32-32s31.872 14.336 31.872 32L447.936 799.424C448.256 817.088 434.304 831.6800000000001 416.64 832 414.464 832.064 412.16 831.808 410.048 831.424 408.704 831.552 407.296 831.552 406.08 831.424L406.08 831.424zM91.392 511.872C73.728 509.12 61.632 492.544 64.384 474.88 67.136 457.28 83.712 445.248 101.376 448L224 448C241.664 448 256 462.208 256 479.872s-14.336 32-32 32L101.376 511.872c-1.984 0.192-3.968 0.192-6.016 0C94.016 512 92.608 512 91.392 511.872L91.392 511.872zM795.456 320c-17.728-2.752-29.824-14.08-27.072-31.744 2.752-17.6 19.328-35.008 36.992-32.256L928 256c17.664 0 32 19.584 32 37.248S945.664 320 928 320l-122.624 0c-1.984 0.192-3.968 0.192-6.016 0-1.344 0.128-2.688 0.128-4.032 0L795.456 320zM598.272 127.42399999999998c-13.76-4.48-22.72-17.6-22.08-32L576.192-32c0-17.664 14.336-32 32-32S640-49.66399999999999 640-32l0 127.424c0.32 17.6-13.568 32.256-31.232 32.576-2.176 0.064-4.352-0.192-6.592-0.576-1.344 0.128-2.688 0.128-4.032 0L598.272 127.42399999999998zM726.272 191.67999999999995c-16.896-5.376-26.24-23.36-20.864-40.192 1.664-5.312 4.736-10.048 8.832-13.824l122.56-122.432c9.28-15.04 28.928-19.776 44.032-10.496 14.976 9.344 19.712 28.992 10.368 44.032-2.624 4.224-6.144 7.808-10.368 10.432l-122.56 122.432c-7.168 7.744-17.6 11.52-28.032 9.984-1.344 0.128-2.688 0.128-4.032 0L726.272 191.61599999999999zM339.968 28.03200000000004c-49.152 0-98.304 18.688-135.744 56.128-74.816 74.88-74.816 196.608 0 271.488l87.744 87.744c12.48 12.48 32.768 12.48 45.248 0s12.48-32.768 0-45.248L249.408 310.46400000000006c-49.92-49.856-49.92-131.136 0-180.992 49.856-49.856 131.136-49.856 180.992 0l87.744 87.744c12.48 12.48 32.768 12.48 45.248 0s12.48-32.768 0-45.248l-87.744-87.744C438.272 46.72000000000003 389.12 28.03200000000004 339.968 28.03200000000004zM702.144 323.712c-8.192 0-16.384 3.136-22.656 9.344-12.48 12.48-12.48 32.768 0 45.248l87.744 87.744c49.856 49.92 49.856 131.072 0 180.992-49.856 49.856-131.136 49.856-180.992 0L498.496 559.296c-12.48-12.48-32.768-12.48-45.248 0s-12.48 32.768 0 45.248l87.744 87.744c74.88 74.88 196.608 74.88 271.488 0 74.88-74.816 74.88-196.672 0-271.488l-87.744-87.744C718.528 326.784 710.336 323.712 702.144 323.712z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="fonts-clear" unicode="" d="M944.787709 197.20939699999997L857.081297 197.20939699999997 741.092979-127.73993700000005 815.146059-127.73993700000005 832.440281-65.58476199999996 966.82809-65.58476199999996 984.512408-127.73993700000005 1062.011328-127.73993700000005 944.787709 197.20939699999997 944.787709 197.20939699999997ZM848.04409 1.1865400000000363L898.951519 153.25866699999995 949.923963 1.1865400000000363 848.04409 1.1865400000000363 848.04409 1.1865400000000363ZM210.238376 489.910857L183.386821 513.121524 12.46009 313.522794C-5.874386 292.652698-3.728862 260.989968 17.271265 242.720508 38.401424 224.45104800000001 70.454249 226.66158700000005 88.853741 247.53168300000004L100.361551 260.599873C106.603075 267.55657099999996 117.200662 268.20673 124.287392 262.22527 131.309106 256.048762 132.024281 245.51619000000005 125.912789 238.55949199999998 107.448281 217.62438099999997 98.085995 173.08850800000005 119.216154 154.81904799999995 140.281297 136.614603 183.841932 151.76330199999995 202.371455 172.69841299999996 208.417932 179.525079 219.145551 180.30526999999995 226.167265 174.19377799999995 233.188979 168.14730199999997 233.904154 157.61473 227.792662 150.65803200000005 209.328154 129.85295199999996 199.965868 85.05701599999998 221.096027 66.91758700000003 242.16117 48.648127000000045 285.656789 63.86184100000003 304.186313 84.666921 310.362821 91.62361899999996 321.025424 92.40381000000002 327.982122 86.29231700000003 335.068852 80.18082500000003 335.784027 69.71326999999997 329.672535 62.75657100000001 311.143011 41.82146 301.845741-2.9094599999999673 322.910884-20.983873000000017 344.041043-39.253333 387.601678-24.039619000000016 406.00117-3.234540000000038 412.177678 3.7221590000000333 422.840281 4.437332999999967 429.927011-1.6091430000000173 436.948725-7.720635000000016 437.598884-18.31822199999999 431.487392-25.144889000000035 413.022884-46.08000000000004 403.725614-90.81092100000001 424.790757-109.01536499999997 445.920916-127.15479400000004 477.973741-125.00927000000001 496.373233-104.20419000000004L667.299963 95.52457100000004 658.652852 132.90869799999996 210.238376 489.910857 210.238376 489.910857ZM844.013106 329.516698L680.10809 471.12127 929.639011 715.190857C933.2799 718.376635 936.725741 721.562413 939.976535 725.203302 977.815773 768.048762 973.524725 833.129651 930.28917 870.513778 887.183646 907.702857 821.58263 903.281778 783.808408 860.631365L783.483328 860.761397 564.249805 571.3107299999999 399.824662 713.56546C385.391138 726.113524 363.480789 724.553143 350.867709 710.249651L248.14263 593.871238 225.322059 567.994921 251.393424 545.434413 695.7119 161.25561900000002 726.26936 136.679619 847.328916 281.014857C859.941995 295.318349 858.44663 316.96863499999995 844.013106 329.516698L844.013106 329.516698ZM817.941741 830.724063C839.136916 854.779937 876.000916 857.315556 900.186821 836.250413 924.372725 815.380317 926.908344 778.906413 905.648154 754.85054 884.452979 730.924698 847.588979 728.389079 823.403075 749.3892060000001 799.21717 770.324317 796.811582 806.798222 817.941741 830.724063L817.941741 830.724063ZM765.473932 758.491429C768.919773 741.522286 777.6319 725.593397 791.80536 713.305397 806.043836 701.017397 823.533106 694.580825 841.087392 693.540571L643.634186 494.526984 593.116852 538.2176509999999 765.473932 758.491429 765.473932 758.491429ZM776.006503 299.739429L709.755328 219.314794 307.502122 566.369524 376.809043 645.03873C382.920535 651.865397 393.38809 652.5155560000001 400.409805 646.534095L774.381106 323.01511100000005C781.337805 317.098667 782.117995 306.69612700000005 776.006503 299.739429L776.006503 299.739429Z" horiz-adv-x="1063" />
+
+
+ <glyph glyph-name="triangle-r" unicode="" d="M293.291 728.256l426.88-355.456-426.88-355.52z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="circle" unicode="" d="M511.998 847.999C255.739 847.999 48 640.26 48 383.999c0-256.258 207.739-463.998 463.998-463.998C768.261-79.99900000000002 976 127.74199999999996 976 383.999 976 640.26 768.261 847.999 511.998 847.999zM512.002-16.000999999999976c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400C912 163.087 732.914-16.000999999999976 512.002-16.000999999999976z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="radio" unicode="" d="M512.5 383.5m-192 0a192 192 0 1 1 384 0 192 192 0 1 1-384 0ZM511.998 847.999C255.739 847.999 48 640.26 48 383.999c0-256.258 207.739-463.998 463.998-463.998C768.261-79.99900000000002 976 127.74199999999996 976 383.999 976 640.26 768.261 847.999 511.998 847.999zM512.002-16.000999999999976c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400C912 163.087 732.914-16.000999999999976 512.002-16.000999999999976z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="align-center" unicode="" d="M992 448L32 448C14.32 448 0 462.336 0 480 0 497.664 14.32 512 32 512L992 512C1009.68 512 1024 497.664 1024 480 1024 462.336 1009.68 448 992 448ZM800 704C817.664 704 832 689.664 832 672 832 654.336 817.664 640 800 640L224 640C206.32 640 192 654.336 192 672 192 689.664 206.32 704 224 704L800 704ZM992 832L32 832C14.32 832 0 846.336 0 864 0 881.664 14.32 896 32 896L992 896C1009.68 896 1024 881.664 1024 864 1024 846.336 1009.68 832 992 832ZM224 256C206.32 256 192 270.336 192 288 192 305.664 206.32 320 224 320L800 320C817.664 320 832 305.664 832 288 832 270.336 817.664 256 800 256L224 256ZM32 128L992 128C1009.68 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.68 64 992 64L32 64C14.32 64 0 78.33600000000001 0 96 0 113.66399999999999 14.32 128 32 128ZM224-64L800-64C817.664-64 832-78.33600000000001 832-96 832-113.66399999999999 817.664-128 800-128L224-128C206.32-128 192-113.66399999999999 192-96 192-78.33600000000001 206.32-64 224-64Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="align-right" unicode="" d="M992 64L32 64C14.32 64 0 78.33600000000001 0 96 0 113.66399999999999 14.32 128 32 128L992 128C1009.68 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.68 64 992 64ZM992 256L288 256C270.32 256 256 270.336 256 288 256 305.664 270.32 320 288 320L992 320C1009.68 320 1024 305.664 1024 288 1024 270.336 1009.68 256 992 256ZM992 448L32 448C14.32 448 0 462.336 0 480 0 497.664 14.32 512 32 512L992 512C1009.68 512 1024 497.664 1024 480 1024 462.336 1009.68 448 992 448ZM992 640L288 640C270.32 640 256 654.336 256 672 256 689.664 270.32 704 288 704L992 704C1009.68 704 1024 689.664 1024 672 1024 654.336 1009.68 640 992 640ZM992 832L32 832C14.32 832 0 846.336 0 864 0 881.664 14.32 896 32 896L992 896C1009.68 896 1024 881.664 1024 864 1024 846.336 1009.68 832 992 832ZM288-64L992-64C1009.68-64 1024-78.33600000000001 1024-96 1024-113.66399999999999 1009.68-128 992-128L288-128C270.32-128 256-113.66399999999999 256-96 256-78.33600000000001 270.32-64 288-64Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="align-left" unicode="" d="M992 448L32 448C14.336 448 0 462.336 0 480 0 497.664 14.336 512 32 512L992 512C1009.664 512 1024 497.664 1024 480 1024 462.336 1009.664 448 992 448ZM32 704L736 704C753.68 704 768 689.664 768 672 768 654.336 753.68 640 736 640L32 640C14.336 640 0 654.336 0 672 0 689.664 14.336 704 32 704ZM992 832L32 832C14.336 832 0 846.336 0 864 0 881.664 14.336 896 32 896L992 896C1009.664 896 1024 881.664 1024 864 1024 846.336 1009.664 832 992 832ZM32 320L736 320C753.68 320 768 305.664 768 288 768 270.336 753.68 256 736 256L32 256C14.336 256 0 270.336 0 288 0 305.664 14.336 320 32 320ZM32 128L992 128C1009.664 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.664 64 992 64L32 64C14.336 64 0 78.33600000000001 0 96 0 113.66399999999999 14.336 128 32 128ZM32-64L736-64C753.68-64 768-78.33600000000001 768-96 768-113.66399999999999 753.68-128 736-128L32-128C14.336-128 0-113.66399999999999 0-96 0-78.33600000000001 14.336-64 32-64Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="loading-1" unicode="" d="M537.574469 831.696462c-14.123672 0-25.574469-11.447726-25.574469-25.574469 0-14.123672 11.450796-25.574469 25.574469-25.574469 204.495464 0 370.82877-166.358889 370.82877-370.82877 0-14.123672 11.450796-25.574469 25.574469-25.574469 14.123672 0 25.574469 11.450796 25.574469 25.574469C959.551152 642.385838 770.241552 831.696462 537.574469 831.696462z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="return" unicode="" d="M927.858848 417.938973L168.863431 417.938973l308.721247 308.86758c11.685133 11.69025 11.435447 30.881334-0.557702 42.868343-11.992125 11.985986-31.18321 12.226462-42.868343 0.536212L75.199191 411.071565c-1.994424-1.662873-3.773953-3.583618-5.294586-5.713119-4.047176-5.373381-6.013971-11.839653-5.9055-18.328437-0.12996-7.794523 2.725064-15.561417 8.595772-21.432125l361.565802-361.744881c11.685133-11.691273 30.876218-11.449773 42.868343 0.535189 11.993149 11.985986 12.242835 31.17707 0.557702 42.868343L168.441828 356.54571799999997l759.417019 0c16.527418 0 29.925566 13.738909 29.925566 30.694069S944.386266 417.938973 927.858848 417.938973z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="fonts-strong" unicode="" d="M199.092919 848.487893l355.326704 0c70.335928 0 122.780371-2.942005 157.349701-8.809643 34.568307-5.884011 65.491597-18.131963 92.78522-36.759205 27.27725-18.627243 50.01409-43.427068 68.209498-74.397431 18.195408-30.986735 27.293623-65.699328 27.293623-104.169501 0-41.7161-11.17655-79.977519-33.496905-114.802676s-52.604078-60.951187-90.818425-78.362742c54.075593-15.765055 95.647407-42.626843 124.715443-80.585363s43.602054-82.58388 43.602054-133.877103c0-40.388872-9.417487-79.673597-28.220738-117.839849-18.803251-38.182624-44.482097-68.673056-77.035514-91.489714-32.55444-22.833031-72.702835-36.855396-120.414487-42.09984-29.931706-3.229554-102.122889-5.260817-216.572524-6.060019L199.092919-40.765192999999954 199.092919 848.487893zM378.171504 700.1084940000001l0-205.684546 117.64849 0c69.935816 0 113.410979 1.006933 130.390699 3.038196 30.730908 3.629667 54.891168 14.246469 72.478731 31.850405 17.588587 17.588587 26.381857 40.756239 26.381857 69.473281 0 27.501354-7.594979 49.838082-22.75219 67.042929-15.158235 17.188474-37.702694 27.597545-67.618027 31.242562-17.796318 2.01489-68.945255 3.038196-153.431461 3.038196L378.171504 700.109518zM378.171504 346.04454999999996l0-236.383732 166.622902 0c64.85203 0 106.008382 1.807159 123.43631 5.420453 26.750247 4.828982 48.543599 16.58063 65.363683 35.272341s25.247011 43.714617 25.247011 75.085092c0 26.526143-6.491855 49.03888-19.459191 67.538209-12.983709 18.48398-31.722492 31.961946-56.250118 40.404222s-77.739549 12.663414-159.619394 12.663414L378.171504 346.04454999999996z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="upload" unicode="" d="M831.488 478.208C831.488 478.208 831.488 478.208 831.488 478.208c0 143.36-114.688 258.048-253.952 258.048-98.304 0-184.32-57.344-225.28-139.264C327.68 605.184 307.2 609.28 286.72 609.28c-90.112 0-159.744-73.728-159.744-159.744 0-16.384 4.096-28.672 8.192-40.96C57.344 379.904 0 310.27200000000005 0 224.25599999999997c0-106.496 86.016-192.512 192.512-192.512l192.512 0 0 192.512L258.048 224.25599999999997l258.048 258.048 258.048-258.048-126.976 0 0-192.512 192.512 0L839.68 35.84000000000003c106.496 16.384 192.512 110.592 192.512 221.184C1024 371.712 937.984 465.92 831.488 478.208z" horiz-adv-x="1033" />
+
+
+ <glyph glyph-name="dialogue" unicode="" d="M998.4 500.992C998.4 682.24 811.392 829.696 581.632 829.696c-121.216 0-235.904-41.472-315.264-114.048 37.504 8.192 76.416 13.056 115.456 14.464 59.264 30.592 128.256 46.72 199.808 46.72 198.144 0 359.296-123.776 359.296-275.968 0-31.872-7.04-63.232-20.992-93.056 7.552-28.16 11.264-57.344 11.008-86.528C975.104 374.784 998.4 436.736 998.4 500.992L998.4 500.992zM442.368 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328S473.088 398.72 442.368 398.72zM243.328 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328C299.264 375.67999999999995 274.176 398.72 243.328 398.72zM641.28 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328S672.128 398.72 641.28 398.72zM442.368 677.888C212.608 677.888 25.6 530.432 25.6 349.312c0-179.968 173.696-296.192 332.544-321.664l60.8-78.336c5.632-7.424 14.464-11.008 23.296-11.008 8.832 0 17.792 3.712 23.424 11.008l60.8 78.464C685.312 53.24800000000005 859.008 169.47199999999998 859.008 349.44000000000005 859.136 530.432 672.128 677.888 442.368 677.888zM714.88 173.82399999999996c-52.224-45.184-124.288-77.952-197.376-89.6C503.168 81.91999999999996 490.112 74.24000000000001 481.28 62.72000000000003l-38.784-49.92-38.912 49.92c-8.96 11.52-21.888 19.2-36.224 21.504-73.216 11.776-145.152 44.416-197.376 89.728-39.68 34.304-86.912 92.544-86.912 175.36 0 69.76 35.584 136.192 100.352 187.264 68.736 54.144 160.768 84.096 258.944 84.096 98.304 0 190.336-29.824 259.072-84.096 64.768-51.072 100.352-117.504 100.352-187.264C801.664 266.36800000000005 754.56 208.12800000000004 714.88 173.82399999999996z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="video" unicode="" d="M952.523633 599.2477269999999L952.523633 599.2477269999999 952.523633 599.2477269999999zM100.53762400000005 661.054062C100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062zM100.74228 720.404517L100.74228 720.404517 100.74228 720.404517zM660.990107 739.9449716666666c8.697911 0 17.498151-0.511642 25.684421-2.353553 12.279404-2.865194 23.22854-8.18627 34.382332-16.679524 15.144599-11.460777 26.196063-29.572899 32.02878-52.187469 3.479165-13.405016 2.967523-28.651944 2.558209-42.05696-0.102328-4.195463-0.204657-8.083941-0.204657-11.665434l0-37.759169 101.407415 70.401919 25.479764 17.60048c0.511642 0.306985 1.330269 1.023284 2.148896 1.637254 4.40012 3.376836 11.051464 8.595583 20.977316 11.051464 3.274508 0.818627 6.549016 1.22794 10.02818 1.22794 9.618867 0 19.44239-3.274508 27.730987999999996-9.311882 18.82842-13.916657999999998 18.726092-35.405616 18.726092-51.061857 0-1.023284 0-2.148896 0-3.172179l0-409.620466c0-15.963226 0.102328-37.963825-19.647047-51.982812-6.753672-4.809433-16.679524-8.390926-27.219346-8.390926-5.01409 0-10.130509 0.818627-15.144599 2.762866-7.162986 2.762866-12.279404 6.856000999999999-16.065554 9.823524-0.920955 0.716299-1.841911 1.432597-2.353553 1.841911l-24.968122 17.395823-101.10043 70.094934 0-37.963825c0-3.581493 0.102328-7.367643 0.204657-11.460777 0.409313-14.735285 0.818627-29.982212-2.865194-43.796542-5.62806-21.488957999999997-16.679524-39.396423-31.107825-50.447886-7.879285-6.037374-18.930748-13.405016-34.075347-16.986509-7.776956-1.841911-16.167882-2.353553-24.45648-2.353553-4.297792 0-8.595583 0.102328-12.688718 0.204657-3.683821 0.102328-7.162986 0.204657-10.232837 0.204657L167.15339300000005 84.94107466666674c-1.944239 0-3.888478 0-5.832717 0-1.944239 0-3.990806 0-5.935045 0-16.577196 0-33.461377 0.61397-47.787349 6.549016-27.935644999999997 11.563106-46.764065 37.759169-53.006096 73.574098l-0.409313 2.251224 0 2.353553c-0.102328 18.930748-0.204657 37.861497-0.306985 56.792245l0 0.511642L53.87588699999998 598.0155226666666c0 4.40012-0.102328 8.902568-0.102328 13.712001999999998-0.306985 27.01469-0.716299 54.950335 9.311882 76.643949 9.823524 21.284300999999996 27.526331999999996 38.066154 48.708304 45.945438 5.730389 2.148896 11.051464 2.762866 15.04227 3.172179 1.023284 0.102328 2.353553 0.306985 3.069851 0.409313l4.093135 1.534926 500.9997 0c3.581493 0 7.572299 0.102328 11.767763 0.306985C651.166583 739.7403146666667 656.078345 739.9449716666666 660.990107 739.9449716666666M304.273409 266.7785886666668L559.889677 394.2797376666667l0 33.973019L304.273409 555.9585626666667 304.273409 266.7785886666668M660.990107 780.8763196666666c-5.62806 0-10.949136-0.204657-15.758569-0.306985-3.888478-0.102328-7.469971-0.204657-10.437494-0.204657L133.79434400000002 780.3646776666667l-7.265314 0-6.446687-2.353553c-5.3210749999999996-0.61397-13.609673-1.841911-22.716898-5.218747-31.210153-11.665434-57.303887-36.121915-71.629859-67.229739-13.814329999999998-30.084541-13.405016-64.159888-12.995703-94.244429 0.102328-4.604777 0.102328-9.004897 0.102328-13.20036l0-371.349655 0-0.102328 0-0.102328 0-0.511642c0.102328-18.930748 0.204657-37.861497 0.306985-56.792245l0-2.251224 0-3.479165 0.61397-3.376836 0.409313-2.251224c4.195463-23.944839 12.791046-45.126811 25.479764-62.727291 13.609673-18.82842 31.107825-32.847407 52.08514-41.545318 21.488957999999997-8.902568 44.001199-9.618867 63.443589-9.618867 2.046567 0 4.093135 0 6.139702 0 1.841911 0 3.78615 0 5.62806 0l473.166384 0c2.558209 0 5.62806-0.102328 9.004897-0.204657 4.195463-0.102328 8.902568-0.306985 13.916657999999998-0.306985 13.302688 0 24.149495 1.125612 33.973019 3.479165 22.819227 5.423404 39.089437 16.474868 49.322274 24.251824 21.693613999999997 16.577196 37.963825 42.363944999999994 45.84311 72.653143 2.251224 8.595583 3.376836 17.088838 3.990806 25.377436l36.838213-25.582093 24.558809-17.088838c0.306985-0.204657 0.61397-0.511642 0.920955-0.716299 4.809433-3.683821 13.609673-10.642149999999999 26.400719-15.656241 9.516538-3.683821 19.647047-5.62806 30.084541-5.62806 18.009793 0 36.53122799999999 5.832717 50.8572 15.963226 16.577196 11.767763 27.730987999999996 27.935644999999997 33.052064 48.094334 3.78615 14.4283 3.78615 27.628659999999996 3.78615 37.34985499999999l0 409.518137c0 0.920955 0 1.739582 0 2.660538l0 0.409313c0 9.41421 0.102328 22.409913-3.479165 36.53122799999999-5.116419 19.749375-15.758569 35.81493-31.721795 47.68502-15.144599 11.153792-33.666034 17.293495-52.08514 17.293495-6.753672 0-13.507345-0.818627-19.954032-2.455881-18.21445-4.604777-30.289198-13.916657999999998-36.019586-18.419107l0 0c-0.204657-0.204657-0.511642-0.409313-0.716299-0.511642l-25.172779-17.293495-0.102328 0-0.102328 0-37.14519799999999-25.786749c-0.511642 7.674628-1.637254 15.553912-3.683821 23.433197-8.18627 31.721795-24.354152 57.508544-46.866394 74.597382-15.758569 11.972419-32.02878 19.851704-49.833916 23.944839C685.8559009999999 779.7507076666667 674.702109 780.8763196666666 660.990107 780.8763196666666L660.990107 780.8763196666666zM345.204757 332.9850436666668L345.204757 489.75210666666663l157.074048-78.48586L345.204757 332.9850436666668 345.204757 332.9850436666668zM347.455981 429.177975L347.455981 308.02118499999995 347.455981 429.177975Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="headset" unicode="" d="M356.285031 2.1522690000000466L356.396571 2.1522690000000466 356.396571 285.236626 253.462201 285.236626 253.462201 2.1522690000000466ZM665.076886 285.236626l103.042841 0 0-283.08538-103.042841 0 0 283.08538ZM63.809793 301.950286c0-38.758746-3.195785-112.220874 5.457292-148.208507l65.735144 0c-10.112312 35.644825-7.747451 109.176538-7.747451 148.208507 0 219.937155 172.264389 398.231887 384.763131 398.231887 212.498742 0 384.763131-178.294732 384.763131-398.231887 0-39.031968 2.266623-112.563682-7.845689-148.208507l65.735144 0c8.653077 35.987632 5.555529 109.449761 5.555529 148.208507 0 256.20415-200.670346 463.898469-448.208115 463.898469C264.479115 765.848755 63.809793 558.1544349999999 63.809793 301.950286z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="cellphone-fine" unicode="" d="M731.514252 896L292.485748 896C195.323702 896 116.154627 816.830925 116.154627 719.6688790000001l0-671.337759c0-97.162046 79.169075-176.331121 176.331121-176.331121l438.628661 0c97.162046 0 176.331121 79.169075 176.331121 176.331121L907.445529 719.6688790000001C907.845373 816.830925 828.676298 896 731.514252 896zM292.485748 853.216712l438.628661 0c70.772355 0 128.349863-55.178446 133.147989-124.751269L159.737602 728.465443C164.135884 798.038266 222.113237 853.216712 292.485748 853.216712zM865.062085 48.73096399999997c0-73.571261-59.976572-133.547833-133.547833-133.547833L292.485748-84.816868c-73.571261 0-133.547833 59.976572-133.547833 133.547833l0 45.582194 705.724326 0L864.662241 48.73096399999997zM865.062085 137.096447L158.937915 137.096447 158.937915 685.682155l705.724326 0L864.662241 137.096447zM512-54.82858299999998c13.59469 0 26.789535 5.597813 36.385787 15.194065 9.596251 9.596251 15.194065 22.791097 15.194065 36.385787 0 13.59469-5.597813 26.789535-15.194065 36.385787-9.596251 9.596251-22.791097 15.194065-36.385787 15.194065-13.59469 0-26.789535-5.597813-36.385787-15.194065-9.596251-9.596251-15.194065-22.791097-15.194065-36.385787 0-13.59469 5.597813-26.789535 15.194065-36.385787C485.210465-49.23076900000001 498.40531-54.82858299999998 512-54.82858299999998z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="add-1" unicode="" d="M566.935 57.63900000000001c0-30.366-24.612-54.972-54.935-54.972v0c-30.384 0-54.996 24.612-54.996 54.972v610.057c0 30.361 24.612 54.972 54.996 54.972v0c30.33 0 54.935-24.612 54.935-54.972v-610.057zM817.004 417.633c30.384 0 54.996-24.606 54.996-54.966v0c0-30.354-24.612-54.966-54.996-54.966h-610.062c-30.33 0-54.942 24.612-54.942 54.966v0c0 30.359 24.612 54.966 54.942 54.966h610.062zM817.004 417.633z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="face-smile-b" unicode="" d="M511.931733-128c-136.738133 0-265.284267 53.213867-361.984 149.879467C53.282133 118.51093300000002 0 247.09119999999996 0 384c0 136.738133 53.282133 265.3184 150.050133 362.0864C246.749867 842.683733 375.296 896 512.136533 896s265.4208-53.316267 362.1888-149.9136c199.645867-199.714133 199.543467-524.5952 0-724.206933C777.454933-74.71786699999996 648.772267-128 511.931733-128L511.931733-128 511.931733-128 511.931733-128 511.931733-128 511.931733-128zM512.034133 829.303467c-118.920533 0-230.741333-46.2848-314.914133-130.389333C113.083733 614.8778669999999 66.7648 502.8864 66.7648 384c0-118.9888 46.2848-230.912 130.3552-315.016533 84.0704-84.0704 195.857067-130.321067 314.811733-130.321067 119.022933 0 230.946133 46.318933 315.016533 130.423467 173.704533 173.636267 173.704533 456.157867 0 629.794133C742.877867 782.984533 631.057067 829.303467 512.034133 829.303467L512.034133 829.303467 512.034133 829.303467 512.034133 829.303467 512.034133 829.303467 512.034133 829.303467zM330.103467 244.25813300000004c0 0 59.904-95.9488 181.828267-95.9488s201.8304 95.9488 201.8304 95.9488 45.294933 0.136533 45.192533-47.957333c0 0-78.506667-111.8208-247.022933-111.8208s-223.368533 111.8208-223.368533 111.8208S286.856533 244.25813300000004 330.103467 244.25813300000004L330.103467 244.25813300000004 330.103467 244.25813300000004 330.103467 244.25813300000004 330.103467 244.25813300000004zM363.2128 548.590933c-34.5088 0-62.702933-28.091733-62.702933-62.737067 0-34.679467 28.194133-62.6688 62.702933-62.6688 34.679467 0 62.702933 28.091733 62.702933 62.6688C425.915733 520.4992 397.858133 548.590933 363.2128 548.590933L363.2128 548.590933 363.2128 548.590933 363.2128 548.590933 363.2128 548.590933 363.2128 548.590933zM684.544 548.590933c-34.679467 0-62.702933-28.091733-62.702933-62.737067 0-34.679467 28.023467-62.6688 62.702933-62.6688 34.6112 0 62.600533 28.091733 62.600533 62.6688C747.144533 520.4992 719.121067 548.590933 684.544 548.590933L684.544 548.590933 684.544 548.590933 684.544 548.590933 684.544 548.590933 684.544 548.590933zM684.544 548.590933" horiz-adv-x="1025" />
+
+
+ <glyph glyph-name="fonts-html" unicode="" d="M194.33 416.235h-101.295v101.28h-46.035v-267.03h46.035v119.7h101.28v-119.7h46.035v267.03h-46.035v-101.28zM277.205 480.69h73.665v-230.205h46.035v230.205h73.665v36.825h-193.365v-36.825zM627.815 335.58000000000004l-46.755 181.935h-73.665v-267.03h46.035v211.785l46.035-211.785h55.245l46.83 213.93-0.795-213.93h46.035v267.03h-73.665l-45.3-181.935zM848.09 287.30999999999995v230.205h-46.035v-267.03h174.945v36.825h-128.91z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="screen-full" unicode="" d="M641.750109 511.899972l205.227128 204.519-0.704035-115.89966c-0.282433-9.611915 7.489578-18.09103 17.101493-17.808598l12.297071 0c9.611915 0.283456 17.667382 5.936199 17.808598 15.689331l0.565888 172.57752c0 0.14224 0.282433 9.187243 0.282433 9.187243 0.14224 4.804423-0.99056 9.187243-4.100388 12.297071-3.109828 3.109828-7.347339 5.086855-12.297071 4.946662l-8.763594-0.14224c-0.141216 0-0.278339 0-0.420579-0.14224L697.581696 797.833213c-9.611915-0.283456-17.667382-8.200776-17.808598-17.950837l0-12.297071c1.416256-11.44875 10.458189-18.092054 20.070104-17.808598l112.789832-0.283456-204.66124-203.814965c-9.329483-9.329483-9.329483-24.449855 0-33.778314 9.329483-9.470699 24.452925-9.470699 33.782408 0L641.750109 511.899972zM383.095141 319.11010699999997L177.726797 115.29411900000002l0.707105 115.338888c0.283456 9.607822-7.492648 18.086937-17.104563 17.808598l-13.001105 0c-9.611915-0.283456-17.667382-5.937223-17.808598-15.690354l-0.565888-172.718737c0-0.14224-0.282433-9.187243-0.282433-9.187243-0.14224-4.808516 0.99056-9.187243 4.096295-12.297071 3.109828-3.109828 7.351432-5.086855 12.297071-4.946662l8.762571 0.14224c0.14224 0 0.283456 0 0.425695 0.14224l171.873486-0.708128c9.607822 0.283456 17.667382 8.196683 17.808598 17.950837L344.93503 63.42477399999996c-1.415232 11.44875-10.461259 18.092054-20.074198 17.808598L212.069977 81.51682800000003 416.59 285.32872299999997c9.329483 9.329483 9.329483 24.453948 0 33.782408C407.40685 328.58182999999997 392.424624 328.58182999999997 383.095141 319.11010699999997L383.095141 319.11010699999997zM894.047276 60.03251399999999l-0.424672 172.718737c-0.283456 9.612938-8.200776 15.406898-17.809621 15.690354l-12.296047 0c-9.612938 0.278339-17.243733-8.200776-17.105586-17.808598l0.708128-115.903753L641.750109 319.11010699999997c-9.329483 9.329483-24.452925 9.329483-33.782408 0-9.325389-9.328459-9.325389-24.452925 0-33.782408L812.490795 81.51682800000003l-112.789832-0.283456c-9.611915 0.283456-18.515702-6.502088-20.073174-17.808598l0-12.297071c0.282433-9.611915 8.200776-17.667382 17.808598-17.950837l171.166381 0.708128c0.141216 0 0.282433-0.14224 0.424672-0.14224l8.763594-0.14224c4.803399-0.141216 9.187243 1.694595 12.296047 4.946662 3.109828 3.109828 4.238534 7.488555 4.097318 12.297071 0 0-0.14224 9.046027-0.14224 9.187243L894.047276 60.03149099999996zM212.216309 749.493252l112.789832 0.283456c9.607822-0.283456 18.512632 6.502088 20.070104 17.808598L345.076246 779.883399c-0.283456 9.611915-8.196683 17.667382-17.808598 17.950837l-172.011632-0.708128c-0.14224 0-0.283456 0.14224-0.425695 0.14224l-8.761548 0.14224c-4.808516 0.141216-9.187243-1.694595-12.297071-4.946662-3.109828-3.109828-4.242627-7.488555-4.096295-12.297071 0 0 0.282433-9.046027 0.282433-9.187243l0.420579-172.718737c0.14224-9.608845 8.200776-15.406898 17.808598-15.686261l13.005198 0c9.611915-0.282433 17.242709 8.196683 17.10047 17.808598l-0.564865 115.334795 205.231221-203.958228c9.324366-9.329483 24.448832-9.329483 33.777291 0 9.329483 9.329483 9.329483 24.452925 0 33.782408L212.216309 749.493252 212.216309 749.493252zM212.216309 749.493252" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="form" unicode="" d="M314.278111 437.019389l395.439892 0 0-30.297458-395.439892 0L314.278111 437.019389zM314.278111 315.83495200000004l395.439892 0 0-30.297458-395.439892 0L314.278111 315.83495200000004zM314.278111 194.62833l263.626661 0 0-30.297458L314.278111 164.330872 314.278111 194.62833zM609.376235 739.9931730000001c-7.849678 42.966669-48.394988 75.742447-97.378777 75.742447-48.961604 0-89.51311-32.775778-97.380776-75.742447L116.55177 739.9931730000001l0-787.725922 790.893774 0 0 787.725922L609.376235 739.9931730000001zM446.091342 670.440529l0 17.613058 0 36.791056c0 33.410348 29.57295 60.594317 65.906116 60.594317 36.352353 0 65.907115-27.183969 65.907115-60.594317l0-36.791056 0-17.621053 16.672696-8.712493c32.358061-16.929922 57.169039-42.663874 71.406386-73.213161L358.043239 588.50688c14.240345 30.555683 39.051523 56.281241 71.408385 73.213161L446.091342 670.440529zM874.489888-17.436289999999985L149.505227-17.436289999999985 149.505227 709.694715 413.138884 709.694715l0-21.641327c-51.44492-26.923746-88.727643-74.124144-98.86377-129.845165l395.44289 0c-10.102151 55.730615-47.40466 102.921419-98.859773 129.845165l0 21.641327 263.631658 0L874.489888-17.436289999999985z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="cart" unicode="" d="M365.920994 84.618469c-39.030945 0-70.78516-31.754215-70.78516-70.78516s31.754215-70.784136 70.78516-70.784136c39.030945 0 70.784136 31.753191 70.784136 70.784136S404.951939 84.618469 365.920994 84.618469zM365.920994-5.784493999999995c-10.818393 0-19.61985 8.801457-19.61985 19.618826 0 10.818393 8.801457 19.61985 19.61985 19.61985s19.618826-8.801457 19.618826-19.61985C385.540843 3.015939000000003 376.739387-5.784493999999995 365.920994-5.784493999999995zM808.821219 84.618469c-39.030945 0-70.784136-31.754215-70.784136-70.78516s31.753191-70.784136 70.784136-70.784136 70.78516 31.753191 70.78516 70.784136S847.852164 84.618469 808.821219 84.618469zM808.821219-5.784493999999995c-10.81737 0-19.618826 8.801457-19.618826 19.618826 0 10.818393 8.801457 19.61985 19.618826 19.61985 10.818393 0 19.61985-8.801457 19.61985-19.61985C828.441069 3.015939000000003 819.640636-5.784493999999995 808.821219-5.784493999999995zM443.99107 305.940157c-14.057157-1.416256-24.305569-13.959943-22.890336-28.0171 1.328251-13.187347 12.446473-23.02132 25.423019-23.02132 0.856507 0 1.723248 0.042979 2.594081 0.130983l439.314561 44.245713c0.088004 0.007163 0.174985 0.01842 0.261966 0.026606l0.180102 0.01842c0.50449 0.051165 1.001817 0.119727 1.496074 0.198521 0.222057 0.035816 0.443092 0.076748 0.663102 0.11768 0.552585 0.103354 1.100054 0.217964 1.638313 0.355087 0.085958 0.022513 0.169869 0.047072 0.254803 0.069585 0.586354 0.156566 1.161453 0.334621 1.728364 0.530073 0.077771 0.026606 0.155543 0.051165 0.233314 0.078795 0.626263 0.222057 1.239224 0.469698 1.840928 0.737804 0.039909 0.017396 0.078795 0.035816 0.118704 0.054235 1.277086 0.577145 2.496867 1.252527 3.647063 2.020006 0.001023 0.001023 0.002047 0.001023 0.00307 0.002047 0.553609 0.369414 1.088798 0.76134 1.609661 1.170662 0.069585 0.054235 0.137123 0.10847 0.205685 0.163729 0.48607 0.38988 0.958838 0.795109 1.413186 1.218758 0.092098 0.084934 0.180102 0.173962 0.270153 0.25992 0.394996 0.378623 0.778736 0.76748 1.14815 1.169639 0.11154 0.121773 0.222057 0.243547 0.331551 0.367367 0.333598 0.3776 0.653893 0.766456 0.964978 1.163499 0.12382 0.158612 0.249687 0.314155 0.370437 0.475837 0.322341 0.432859 0.629333 0.876973 0.925069 1.329275 0.113587 0.173962 0.224104 0.348947 0.333598 0.525979 0.296759 0.479931 0.580215 0.968048 0.845251 1.467421 0.069585 0.130983 0.134053 0.265036 0.201591 0.397043 0.289596 0.568958 0.563842 1.147126 0.811482 1.738597 0.00307 0.007163 0.005117 0.014326 0.008186 0.021489 0.569982 1.369184 1.019213 2.796696 1.345648 4.26514 0 0.001023 0 0.002047 0.001023 0.00307l0.00307 0.013303c0.035816 0.162706 0.075725 0.323365 0.10847 0.487094l56.17951 252.734118c0.895393 4.030803 0.780783 8.04728-0.165776 11.794627 0.50449 2.003634 0.774643 4.101411 0.774643 6.261611 0 14.128789-11.452843 25.582655-25.582655 25.582655L195.47502 616.098125l-52.358485 159.553902c-3.631714 11.067057-14.093996 17.972327-25.177426 17.590634-0.207731 0.005117-0.413416 0.01535-0.62217 0.01535L54.663994 793.258011c-14.128789 0-25.582655-11.453866-25.582655-25.582655s11.453866-25.582655 25.582655-25.582655l45.614897 0 197.955514-603.235934c3.536546-10.776438 13.546527-17.613146 24.303522-17.613146 2.067079 0 4.16281 0.26299 6.245238 0.788969l567.583946 0c14.129812 0 25.582655 11.453866 25.582655 25.582655s-11.452843 25.582655-25.582655 25.582655L340.816223 173.1979 212.265428 564.933839l701.224666 0-48.137347-216.557174L443.99107 305.940157z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="camera-fill" unicode="" d="M512 480C436.515555 480 375.111111 419.712 375.111111 345.6 375.111111 271.48800000000006 436.515555 211.20000000000005 512 211.20000000000005 587.484446 211.20000000000005 648.888887 271.48800000000006 648.888887 345.6 648.888887 419.712 587.484446 480 512 480M512 172.79999999999995C414.808889 172.79999999999995 336 250.15679999999998 336 345.6 336 441.0432 414.808889 518.4 512 518.4 609.210667 518.4 688 441.0432 688 345.6 688 250.15679999999998 609.210667 172.79999999999995 512 172.79999999999995M903.111113 691.2L723.767113 691.2C713.383113 691.2 703.448887 695.2512 696.115554 702.4512L640.792887 756.7488C633.459554 763.9488 623.505779 768 613.141333 768L512 768 410.878222 768C400.494222 768 390.56 763.9488 383.226667 756.7488L327.904 702.4512C320.570667 695.2512 310.616889 691.2 300.252445 691.2L120.888889 691.2C77.866667 691.2 42.666667 656.64 42.666667 614.4L42.666667 76.79999999999995C42.666667 34.559999999999945 77.866667 0 120.888889 0L903.111113 0C946.133333 0 981.333333 34.559999999999945 981.333333 76.79999999999995L981.333333 614.4C981.333333 656.64 946.133333 691.2 903.111113 691.2" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="tabs" unicode="" d="M310.30303 523.636364L124.121212 523.636364c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-186.181818c0-17.128727 13.901576-31.030303 31.030303-31.030303l186.181818 0c17.128727 0 31.030303 13.901576 31.030303 31.030303L341.333333 492.606061C341.333333 509.734788 327.431758 523.636364 310.30303 523.636364zM294.787879 306.42424200000005L139.636364 306.42424200000005c-17.128727 0-15.515152-1.613576-15.515152 15.515152L124.121212 477.090909c0 17.128727-1.613576 15.515152 15.515152 15.515152l155.151515 0c17.128727 0 15.515152 1.613576 15.515152-15.515152l0-155.151515C310.30303 304.81066699999997 311.916606 306.42424200000005 294.787879 306.42424200000005zM418.909091 352.969697l480.969697 0 0 31.030303L418.909091 384 418.909091 352.969697zM418.909091 228.84848499999998l480.969697 0 0 31.030303L418.909091 259.878788 418.909091 228.84848499999998zM418.909091 89.21212100000002l480.969697 0 0 31.030303L418.909091 120.24242400000003 418.909091 89.21212100000002zM418.909091 492.606061l480.969697 0 0 31.030303L418.909091 523.636364 418.909091 492.606061zM992.969697 725.333333l-15.515152 0L977.454545 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L775.757576 880.484848c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-124.121212-139.636364 0L605.090909 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L403.393939 880.484848c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-124.121212-124.121212 0L248.242424 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L31.030303 880.484848C13.901576 880.484848 0 866.583273 0 849.454545l0-946.424242c0-17.128727 13.901576-31.030303 31.030303-31.030303l961.939394 0c17.128727 0 31.030303 13.901576 31.030303 31.030303L1024 694.30303C1024 711.431758 1010.098424 725.333333 992.969697 725.333333zM992.969697-65.939394c0-17.128727-13.901576-31.030303-31.030303-31.030303L62.060606-96.969697c-17.128727 0-31.030303 13.901576-31.030303 31.030303L31.030303 818.424242c0 17.128727 13.901576 31.030303 31.030303 31.030303l124.121212 0c17.128727 0 31.030303-13.901576 31.030303-31.030303l0-124.121212 744.727273 0c17.128727 0 31.030303-13.901576 31.030303-31.030303L992.969697-65.939394z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="fonts-code" unicode="" d="M270 626c-12 12-32 12-44 0L9 409c-12-12-12-32 0-44l217-217c6-6 14-9 22-9s16 3 22 9c12 12 12 32 0 44L75 387 270 582C282 595 282 614 270 626zM1015 409L798 626c-12 12-32 12-44 0-12-12-12-32 0-44l195-195L754 192c-12-12-12-32 0-44 6-6 14-9 22-9s16 3 22 9l217 217C1027 377 1027 397 1015 409zM624 696L624 696c-16 6-34-3-40-19L382 119c-6-16 2-34 19-40l0 0c16-6 34 3 40 19l202 558C648 672 640 690 624 696z" horiz-adv-x="1025" />
+
+
+ <glyph glyph-name="fire" unicode="" d="M890.059904 352.19948999999997C845.890699 458.956706 840.554889 548.4951550000001 857.396326 618.42714 859.144623 625.686731 860.991676 631.9776790000001 862.858846 637.425182 863.763607 640.064841 865.906573 645.659889 866.16406 646.532651L880.890349 696.448108 833.062903 675.9309969999999C832.106692 675.5208 830.618069 674.894716 827.426684 673.550492 824.667648 672.380966 822.310677 671.354022 819.868514 670.244809 813.291441 667.2575449999999 807.049466 664.090938 800.697749 660.4128450000001 784.089623 650.795565 768.486253 638.656896 753.86285 623.033596 727.630498 595.007563 706.526618 557.766355 691.78157 509.713231 675.041103 455.157161 671.516484 411.46006 673.004574 347.939834 673.477918 327.73476900000003 673.463923 322.197583 672.83965 318.324215 673.779618 324.156339 684.455526 333.67819899999995 696.104608 329.19567600000005 693.056849 330.36844199999996 685.695898 339.012828 676.314007 361.368339 660.550914 398.92921 646.834249 460.170272 636.817284 549.350468 625.445924 650.588768 630.103925 734.7280519999999 644.646978 801.338628 647.677924 815.221065 650.899934 827.082435 654.086773 836.904609 655.91465 842.538316 657.254607 846.094657 657.880284 847.554385L678.645286 896 628.243642 880.578031C617.409833 877.263087 599.94569 869.52239 578.105438 855.845223 542.547644 833.577626 507.199569 802.385036 474.400401 760.836776 447.596676 726.883228 423.611383 687.30061 403.118547 641.7016189999999 378.907516 587.829195 363.003277 542.798944 353.158029 503.238462 349.274261 487.632585 346.433259 473.323627 344.1945 458.925156 343.334411 453.39353 342.592734 448.063234 341.804612 441.911844 341.502524 439.553997 340.356619 430.329551 340.073506 428.145504 337.596047 409.033293 335.848224 404.35337 329.235273 398.312868 336.081933 404.566848 343.232634 404.098227 346.608002 402.086756 344.852318 403.133013 341.598345 406.493651 337.991853 411.887149 327.030897 428.279226 317.980358 454.883162 313.690598 489.339595 311.250185 508.941598 310.203772 539.08627 310.370048 576.545325 310.480474 601.422138 311.113088 628.122479 312.099068 654.977888 312.481453 665.393013 312.891081 675.105466 313.30045 683.8491750000001 313.545346 689.079919 313.735044 692.813105 313.84201 694.783403L317.55517 763.179488 271.360516 712.604139C270.467691 711.626645 268.852992 709.837042 266.618705 707.326295 262.927895 703.178805 258.823678 698.493751 254.407949 693.3614689999999 241.78797 678.693606 229.164348 663.340425 217.341267 648.004036 211.724185 640.717803 206.411389 633.591345 201.450577 626.6638379999999 176.017063 591.147305 156.617347 555.4025280000001 138.122768 512.155497 90.841957 401.595812 76.97672 299.64870599999995 99.261816 188.13489300000003 126.80821 50.29373899999996 188.553235-37.64422200000001 278.8297-84.690336 344.19104-118.75233700000001 408.837235-128 507.940695-128 525.713007-128 557.977207-125.567138 590.857378-120.46215900000004 641.152493-112.65333099999998 687.496192-99.78932299999997 726.063273-80.59104400000001 738.155853-74.57148800000004 743.07901-59.88870199999997 737.059454-47.79612199999997 731.039898-35.70354299999997 716.357111-30.780384000000026 704.264531-36.79993999999999 670.855859-53.43041900000003 629.092954-65.02289699999994 583.352478-72.12456999999995 552.984316-76.83953499999996 523.228215-79.08327499999996 507.940695-79.08327499999996 416.16215-79.08327499999996 357.934257-70.75375399999996 301.436271-41.310745999999995 224.830174-1.3887230000000272 171.977796 73.88423 147.230072 197.72094500000003 126.99711 298.965952 139.514783 391.004811 183.099329 492.921284 200.282663 533.1021499999999 218.020237 565.784358 241.22153 598.183718 245.831691 604.6215589999999 250.802959 611.289899 256.082244 618.137961 267.31885 632.713596 279.402035 647.409487 291.488864 661.457681 298.732051 669.8762429999999 304.338773 676.1767130000001 307.478705 679.614406L264.997214 697.435142C264.883874 695.347445 264.688038 691.493511 264.43725 686.13688 264.020474 677.234965 263.603959 667.359281 263.215279 656.7726250000001 262.21142 629.430212 261.566827 602.224414 261.453805 576.7624579999999 261.278897 537.3588179999999 262.385015 505.49418 265.148621 483.296209 276.058157 395.668083 322.627019 326.024497 362.226031 362.19561799999997 379.341732 377.829698 384.756649 392.328523 388.584361 421.857186 397.932742 493.974714 407.332926 531.746825 447.736538 621.64966 466.587287 663.594818 488.484326 699.731218 512.795234 730.526996 542.034492 767.565749 573.156162 795.028785 604.068111 814.386984 614.696751 821.043029 624.472062 826.201428 633.124687 830.036563 638.02329 832.207788 641.258688 833.404991 642.556233 833.802016L612.91959 866.825663C608.658554 856.884484 602.686705 838.478616 596.856038 811.772799 581.186705 740.003594 576.231674 650.498985 588.206246 543.890345 607.295279 373.94226100000003 638.819345 298.82556999999997 678.537329 283.542234 701.302332 274.78234499999996 717.731637 289.43566899999996 721.133156 310.5407 722.475759 318.870999 722.489387 324.26340300000004 721.907881 349.08549100000005 720.532565 407.791853 723.691247 446.952173 738.546223 495.36355 751.151827 536.44438 768.544047 567.135763 789.576147 589.605967 809.230566 610.60429 821.725461 617.839716 852.347733 630.9761169999999L842.705318 653.453557 819.246577 660.374464C822.235501 670.505564 813.450321 644.87463 809.839253 629.8801189999999 790.647573 550.1890470000001 796.611315 450.1135 844.8591 333.498332 883.105728 241.056017 874.587669 126.06492400000002 824.002925 61.39712899999995 815.680378 50.75754500000005 817.558709 35.38570000000004 828.198295 27.063153000000057 838.837879 18.740607999999952 854.209724 20.618939999999952 862.532269 31.258523999999966 924.762731 110.81426299999998 934.658528 244.404363 890.059904 352.19948999999997Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="set" unicode="" d="M466.496-126.62400000000002l-1.056 0.064c-25.184 2.08-47.456 22.368-51.744 47.232l-17.344 102.4c-0.672 4.064-6.624 11.04-10.56 12.416l-30.336 12.416c-5.44 2.496-15.424 0.8-17.472-0.64l-84.992-60.16c-19.584-14.016-51.456-12.736-70.08 3.168l-64.288 64c-17.952 20.48-19.488 50.592-4.736 71.296l60.416 84.672c2.176 3.072 2.784 11.52 1.024 15.04l0 0c0 0-1.664 3.104-7.264 16.608-6.176 14.848-6.816 17.44-6.816 17.44-0.992 3.04-7.456 8.672-11.36 9.376l-102.56 17.248c-25.152 4.288-45.44 26.624-47.168 52L0 428.288c2.112 27.36 22.496 49.6 47.52 53.728l102.528 17.344c4.128 0.672 11.008 6.56 12.416 10.496l12.608 30.336c2.368 4.992 1.6 14.112-0.8 17.504L113.984 642.24C99.36 662.88 100.704 692.896 117.056 712.192l64.416 64.224c20.672 18.208 51.296 18.784 71.36 4.64l84.992-60.16c1.952-1.376 13.28-2.016 15.04-1.056 0.384 0.192 2.528 1.344 16.704 7.168 14.24 5.92 16.576 6.592 16.576 6.592 3.84 1.184 9.504 7.648 10.144 11.424l17.44 102.4c4.32 25.152 26.752 45.376 52.128 47.104l90.528 0.064c27.328-2.112 49.632-22.368 53.952-47.232l17.344-102.432c0.672-4.064 6.656-11.04 10.624-12.48l30.304-12.352c6.24-2.784 15.456-0.8 17.44 0.608l85.024 60.16c19.52 14.016 51.392 12.704 70.08-3.136l64.288-64.032c17.952-20.48 19.456-50.56 4.736-71.264l-60.416-84.672c-2.208-3.136-2.848-11.616-1.056-15.04 0.16-0.352 1.376-2.56 7.232-16.672 5.856-14.112 6.592-16.512 6.592-16.512 1.248-4.032 7.712-9.6 11.648-10.304l102.56-17.248c25.152-4.224 45.44-26.592 47.168-52l0.096-90.304c-2.112-27.392-22.528-49.6-47.552-53.728l-102.528-17.376c-4.128-0.672-10.944-6.496-12.32-10.432l-12.736-30.432c-2.336-4.928-1.568-14.112 0.832-17.472l60.288-84.512c14.624-20.736 13.216-50.816-3.232-70.048l-64.192-64.096c-11.328-9.92-24.64-14.72-38.784-14.72l0 0c-11.904 0-23.52 3.552-32.704 10.016l-84.992 60.16c-1.952 1.408-13.312 2.016-15.072 1.056-0.288-0.16-2.432-1.312-16.608-7.2-14.08-5.792-16.384-6.496-16.384-6.496-4.16-1.28-9.792-7.776-10.432-11.52l-17.408-102.4c-4.352-25.152-26.72-45.344-52.032-47.104L466.496-126.62400000000002zM347.84 100.60799999999995c10.368 0 20.192-2.112 28.48-6.112l27.648-11.296c20.416-7.072 38.976-28.992 42.848-51.584l17.344-102.336c0.288-1.6 3.136-4.32 5.056-4.832l87.296 0.064c-0.032 0.064 3.04 2.944 3.328 4.672l17.408 102.368c3.872 22.656 23.328 44.832 45.28 51.584 0 0 0 0 0 0-0.096 0 2.976 1.152 12.448 5.056 9.472 3.936 12.384 5.248 13.12 5.568 18.208 9.6 49.44 8.032 67.776-4.96l84.928-60.16c0.192-0.128 1.312-0.64 3.104-0.64l0 0c2.048 0 3.52 0.672 3.872 0.96l61.536 61.408 0 0c-0.16 0 0.064 4.416-0.992 5.952l-60.224 84.448c-13.248 18.624-15.68 47.168-5.792 67.872l11.648 27.84c6.944 19.968 29.408 38.912 51.68 42.496l102.464 17.376c1.824 0.384 4.736 3.648 4.864 5.408L972.8 428.288l0 0c-0.096 0-2.88 3.072-4.576 3.424l-102.72 17.28c-23.168 4.032-44.896 22.976-51.776 45.056l0 0c-0.032 0-1.216 3.04-5.12 12.512-3.968 9.568-5.28 12.512-5.632 13.248-10.24 19.36-8.288 48.736 4.96 67.456L868.448 672c0.96 1.408 0.736 5.6-0.384 6.912l-61.408 61.184c0.704-0.8-0.768-0.192-2.848-0.192-1.728 0-2.784-0.416-3.008-0.576l-85.024-60.16c-17.824-12.8-47.776-15.36-68-5.664l-27.712 11.296c-20.512 7.2-39.04 29.088-42.88 51.584l-17.344 102.336c-0.288 1.76-3.616 4.704-5.504 4.864L467.616 843.52c0-0.064-3.104-2.944-3.392-4.672l-17.408-102.336c-3.84-22.624-23.264-44.8-45.216-51.584 0-0.032-3.008-1.184-12.416-5.088-9.568-3.936-12.512-5.248-13.248-5.568-17.984-9.568-49.344-8.032-67.744 4.992L223.264 739.36c-0.416 0.32-6.176 0.288-6.848-0.224L154.688 677.6320000000001c0 0 0 0 0 0 0.224 0 0.032-4.384 1.056-5.856L216 587.264c13.312-18.752 15.744-47.296 5.76-67.968l-11.52-27.648c-6.976-20.032-29.472-38.944-51.776-42.624L55.968 431.68c-1.824-0.384-4.704-3.648-4.832-5.408l0.096-86.56 0 0c0.096 0 2.912-3.104 4.608-3.424l102.656-17.28c23.04-4 44.704-22.912 51.712-44.928 0.256-0.736 1.44-3.84 5.088-12.64 3.68-8.832 5.024-11.84 5.472-12.736 10.592-20.288 8.672-48.96-4.672-67.904l-60.512-84.768c-0.96-1.408-0.736-5.632 0.384-6.912l61.408-61.184c-0.736 0.8 0.736 0.224 2.816 0.192 1.728 0 2.784 0.416 3.008 0.576l84.992 60.16C318.624 96.32000000000005 333.088 100.60799999999995 347.84 100.60799999999995zM512.032 133.856c-138.336 0-250.848 112.224-250.848 250.176 0 137.92 112.544 250.144 250.848 250.144s250.848-112.224 250.848-250.144C762.88 246.08000000000004 650.336 133.856 512.032 133.856zM512.032 583.136c-110.08 0-199.648-89.312-199.648-199.104s89.568-199.136 199.648-199.136 199.648 89.344 199.648 199.136S622.112 583.136 512.032 583.136z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="fonts-u" unicode="" d="M0-49.23076900000001L945.230769-49.23076900000001 945.230769-128 0-128 0-49.23076900000001ZM0 896L407.076943 896 407.076943 834.065644 319.153861 827.872177 299.076923 809.911217 299.076923 365.841959C299.076923 281.19796199999996 317.076716 220.709337 353.076933 184.37435100000005 389.077071 148.03936499999998 448.153442 129.87210800000003 530.307702 129.87210800000003 606.000364 129.87210800000003 660.807522 149.17482299999995 694.730752 187.78072599999996 728.653982 226.38662899999997 745.61536 289.66226700000004 745.61536 377.60953099999995L745.61536 804.956475 724.153817 826.633531 633.461524 834.065644 633.461524 896 955.384596 896 955.384596 834.065644 868.846119 826.633531 849.461563 804.956475 849.461563 364.60331299999996C849.461563 246.92743900000005 819.923338 161.66533900000002 760.846178 108.81441500000005 701.76894 55.96348999999998 606.462188 29.53846199999998 474.923087 29.53846199999998 406.153531 29.53846199999998 345.807951 38.51886300000001 293.884613 56.47990200000004 241.961275 74.44093999999996 201.230887 100.143419 171.692347 133.58820400000002 149.076834 160.01362700000004 133.038474 190.25793999999996 123.57695 224.32200899999998 114.115348 258.386078 109.384625 307.21047599999997 109.384625 370.796702L109.384625 809.911217 89.307687 827.872177 0 834.065644 0 896Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="triangle-d" unicode="" d="M773.128299 88.65234199999998M889.696178 575.195553L158.862147 575.195553 524.357446 209.64704300000005 889.696178 575.195553Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="tips" unicode="" d="M967.280184 578.537671c-24.915459 58.887178-60.544935 111.76755-105.96745 157.161413-45.393863 45.393863-98.273211 81.051991-157.160389 105.96745-60.988026 25.803689-125.735679 38.853913-192.494129 38.853913-66.729797 0-131.504056-13.0799-192.494129-38.853913-58.887178-24.916483-111.766526-60.544935-157.160389-105.96745-45.393863-45.393863-81.051991-98.274234-105.96745-157.161413-25.803689-60.988026-38.884612-125.734656-38.884612-192.464453s13.0799-131.50508 38.884612-192.464453c24.915459-58.887178 60.544935-111.737874 105.96745-157.161413 45.393863-45.393863 98.273211-81.051991 157.160389-105.96745 60.988026-25.803689 125.735679-38.853913 192.494129-38.853913 66.729797 0 131.504056 13.0799 192.494129 38.853913 58.887178 24.916483 111.766526 60.544935 157.160389 105.96745 45.393863 45.393863 81.051991 98.274234 105.96745 157.161413 25.803689 60.988026 38.853913 125.734656 38.853913 192.464453S993.084896 517.549645 967.280184 578.537671zM511.687892-55.138552000000004c-243.302305 0-441.241446 197.909465-441.241446 441.21177S268.385587 827.284989 511.687892 827.284989c243.273652-0.029676 441.210747-197.938118 441.210747-441.21177S754.990197-55.138552000000004 511.687892-55.138552000000004zM511.657192 573.565427m-45.511543 0a44.475 44.475 0 1 1 91.023086 0 44.475 44.475 0 1 1-91.023086 0ZM542.729885 184.14011300000004c0-17.162892-13.906731-31.071669-31.070646-31.071669l0 0c-17.163915 0-31.070646 13.907755-31.070646 31.071669L480.588593 426.998303c0 17.162892 13.906731 31.071669 31.070646 31.071669l0 0c17.163915 0 31.070646-13.907755 31.070646-31.071669L542.729885 184.14011300000004z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="picture" unicode="" d="M765.376 615.424c0 0 103.04 1.024 103.04-100.992 0 0 9.536-98.752-103.04-100.928 0 0-100.864-2.176-99.84 100.928C665.536 514.496 664.448 605.8879999999999 765.376 615.424ZM968.32 770.56c0 0 54.208-4.224 54.208-52.032l0-712.832c0 0-3.2-51.008-54.208-52.096L968.32 770.56ZM1.472 5.631999999999948c0 0 2.176-52.096 52.096-52.096L968.32-46.464000000000055l0 150.848-99.712 0-203.072 206.144-153.024-153.984L304.32 413.568l-205.056-307.072-45.632-1.024L52.48 718.4639999999999 1.472 718.4639999999999 1.472 5.631999999999948ZM968.32 770.56L53.568 770.56c0 0-52.096 1.088-52.096-52.032L968.32 718.528 968.32 770.56Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="more-vertical" unicode="" d="M511.998465 623.681848c40.525995 0 73.386404 35.771715 73.386404 79.892585s-32.860409 79.892585-73.386404 79.892585c-40.524972 0-73.384357-35.771715-73.384357-79.892585S471.47247 623.681848 511.998465 623.681848L511.998465 623.681848zM511.998465 463.893608c-40.524972 0-73.384357-35.772738-73.384357-79.893608 0-44.12087 32.859385-79.892585 73.384357-79.892585 40.525995 0 73.386404 35.772738 73.386404 79.892585C585.384869 428.12087 552.52446 463.893608 511.998465 463.893608L511.998465 463.893608zM511.998465 144.320199c-40.524972 0-73.384357-35.733852-73.384357-79.894631 0-44.119847 32.859385-79.893608 73.384357-79.893608 40.525995 0 73.386404 35.772738 73.386404 79.893608C585.383846 108.58634600000005 552.52446 144.320199 511.998465 144.320199L511.998465 144.320199z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="flag" unicode="" d="M878.368178 798.272211c-11.363815 4.799306-24.470321 2.360767-33.31578-6.245238-0.36532-0.350994-37.162388-35.304064-95.163383-56.05262-75.462692-26.993794-150.763702-18.409279-223.812415 25.517163-38.347376 23.060205-81.875752 40.665165-129.376603 52.327786-37.582967 9.228175-77.742619 14.777565-119.363552 16.496719-70.805626 2.925632-121.493052-6.224772-123.615389-6.615675-14.56574-2.682086-25.140587-15.380292-25.140587-30.191626L128.58047-31.312913999999978c0-16.954137 13.745049-30.699186 30.699186-30.699186s30.699186 13.745049 30.699186 30.699186L189.978842 266.68306099999995c15.562441 5.250584 47.994084 14.447037 91.40171 17.48728 35.985586 2.51938 72.440869 0.378623 108.35073-6.363941 44.847417-8.420787 89.059362-24.102954 131.409912-46.611597 46.26879-24.591071 93.776803-41.069371 141.203976-48.977481 38.270629-6.380314 76.541257-7.219425 113.740484-2.491751 64.277956 8.16803 103.877859 30.461779 105.532545 31.406291 9.56689 5.464455 15.471366 15.637142 15.471366 26.656103L897.089565 769.958352C897.091612 782.298402 889.73711 793.470859 878.368178 798.272211zM835.69324 257.496841c-14.58416-5.755074-38.82526-13.530155-70.319555-17.225313-30.990828-3.635807-62.940494-2.676969-94.952582 2.851954-40.201607 6.943133-80.731696 21.171182-120.464629 42.289152-48.455595 25.753547-99.208513 43.61945-150.848637 53.101405-29.29214 5.378497-58.896388 8.079002-88.407516 8.079002-12.228509 0-24.443715-0.464581-36.609803-1.39272-34.879392-2.663666-63.618946-8.741082-84.111676-14.355963L189.978842 766.569162c19.971867 2.003634 50.446949 3.910053 86.392626 2.334161 58.186214-2.554172 143.250588-15.041578 218.064504-60.029188 61.32674-36.877909 119.196753-49.491181 169.691797-49.488111 42.293245 0.002047 79.416747 8.854669 109.019972 19.711947 24.269753 8.901741 45.327348 19.747763 62.544475 30.179346L835.692217 257.496841z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="loading" unicode="" d="M511.999488 756.654348m-70.608128 0a69 69 0 1 1 141.216255 0 69 69 0 1 1-141.216255 0ZM236.047576 639.997442m-68.561515 0a67 67 0 1 1 137.123031 0 67 67 0 1 1-137.123031 0ZM125.530506 382.12428m-62.421678 0a61 61 0 1 1 124.843356 0 61 61 0 1 1-124.843356 0ZM227.861126 100.71507499999996m-54.235229 0a53 53 0 1 1 108.470457 0 53 53 0 1 1-108.470457 0ZM514.166851-16.84438799999998m-47.192835 0a46.118 46.118 0 1 1 94.385671 0 46.118 46.118 0 1 1-94.385671 0ZM804.730553 91.450061m-33.834596 0a33.064 33.064 0 1 1 67.669192 0 33.064 33.064 0 1 1-67.669192 0ZM935.55411 383.395226m-23.969924 0a23.424 23.424 0 1 1 47.939849 0 23.424 23.424 0 1 1-47.939849 0ZM856.723717 634.80007m-17.135262 0a16.745 16.745 0 1 1 34.270525 0 16.745 16.745 0 1 1-34.270525 0Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="fonts-i" unicode="" d="M897.948 834.255l0-64.322-128.65 0L447.674-1.9329999999999927l128.65 0 0-64.32L126.052-66.25300000000004l0 64.32 128.65 0 321.622 771.866-128.65 0L447.674 834.255 897.948 834.255z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="refresh-1" unicode="" d="M688.146 736l-192 128v-256l192 128.001zM496.146 767.7090000000001c-231.174-8.416-416-198.479-416-431.709 0-238.587 193.413-432 432-432 233.23 0 423.293 184.826 431.709 416h-64.05c-8.377-195.817-169.778-352-367.658-352-203.241 0-368 164.759-368 368 0 197.88 156.183 359.282 352 367.658v64.051z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="rmb" unicode="" d="M511.998465 896C229.23338 896 0.004605 666.769178 0.004605 384.001023c0-282.773272 229.227752-512.001023 511.99386-512.001023 282.769178 0 511.994883 229.227752 511.994883 512.001023C1023.994372 666.769178 794.767644 896 511.998465 896zM511.998465-91.59690499999999c-262.660188 0-475.589742 212.930577-475.589742 475.597929 0 262.663258 212.929554 475.594859 475.589742 475.594859 262.663258 0 475.590765-212.9316 475.590765-475.594859C987.590254 121.33469500000001 774.662747-91.59690499999999 511.998465-91.59690499999999zM738.742652 301.137781L544.432155 301.137781l0 69.780273 194.310497 0c17.835204 0 32.249495 14.43885 32.249495 32.220842 0 17.784038-14.414291 32.19526-32.249495 32.19526L589.7462 435.334155l149.620669 209.579249c8.916067 15.397688 3.63069 35.099403-11.82021 43.988864-15.398712 8.891508-35.097356 3.629667-44.017516-11.793604L512.187777 437.098335 340.84334 677.108664c-8.864902 15.423271-28.617781 20.685111-44.016493 11.793604-15.395642-8.889461-20.685111-28.590152-11.82021-43.988864l149.622716-209.579249L285.628808 435.334155c-17.781992 0-32.245402-14.411221-32.245402-32.19526 0-17.781992 14.46341-32.220842 32.245402-32.220842l194.310497 0 0-69.780273L285.628808 301.137781c-17.781992 0-32.245402-14.413268-32.245402-32.19526s14.46341-32.220842 32.245402-32.220842l194.310497 0 0-132.435265c0-17.780969 14.46341-32.19526 32.248472-32.19526 17.835204 0 32.245402 14.414291 32.245402 32.19526L544.433178 236.72065499999997l194.310497 0c17.835204 0 32.249495 14.43885 32.249495 32.220842S756.577856 301.137781 738.742652 301.137781" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="home" unicode="" d="M824.084343-40.42033900000001H232.898863c-74.604138 0-85.85232 28.334325-85.852321 49.997718l-0.584307 5.314029V447.645552h48.806589v-402.916582c0-25.547863 13.548574-36.343743 37.629015-36.343743h568.020898c25.928532 0 27.978215 6.220678 27.978215 37.84391V447.585177l48.806589 0.118704c0.022513-14.346753 0-382.76666 0-433.098999 0-38.130436-12.726859-54.765301-51.858088-54.765301l-1.76111-0.25992zM1012.470921 493.103884C849.773422 615.120868 687.101505 737.137853 524.404006 859.153814c-6.207375 4.659113-18.433838 4.659113-24.641213 0C337.077573 737.137853 174.393377 615.120868 11.696902 493.103884c-24.856108-18.635429-0.572028-61.044308 24.642236-42.13361A15995638.709915 15995638.709915 0 0 1 512.025071 807.737794c0.988514-0.715291 1.644453-1.144056 2.823302-2.037403 18.040888-13.524015 36.057217-27.036773 54.073546-40.560788 58.291614-43.718711 116.583229-87.437421 174.874843-131.143852 81.33647-61.008492 162.696476-122.015961 244.033969-183.024454 25.212218-18.911722 49.496298 23.497157 24.64019 42.132587z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="user" unicode="" d="M611.2 342.4c70.4 54.4 115.2 140.8 115.2 230.4 0 156.8-128 288-284.8 288s-284.8-128-284.8-284.8c0-92.8 44.8-182.4 115.2-236.8C108.8 272 0 105.60000000000002 0-80c0-9.6 9.6-19.2 19.2-19.2h848c9.6 0 19.2 9.6 19.2 19.2 0 188.8-112 355.2-275.2 422.4z m-576-396.8C44.8 115.20000000000005 156.8 268.79999999999995 320 320c6.4 3.2 12.8 9.6 12.8 16s-3.2 16-9.6 19.2c-76.8 41.6-128 131.2-128 224 0 134.4 112 246.4 246.4 246.4s246.4-112 246.4-249.6c0-89.6-51.2-176-128-220.8-6.4-3.2-9.6-9.6-9.6-19.2 0-6.4 6.4-12.8 12.8-16 160-51.2 275.2-204.8 281.6-377.6H35.2zM812.8 361.6c54.4 41.6 86.4 108.8 86.4 176 0 89.6-54.4 172.8-134.4 208-9.6 3.2-22.4 0-25.6-9.6-3.2-9.6 0-22.4 9.6-25.6 67.2-28.8 112-99.2 112-172.8 0-67.2-38.4-131.2-96-163.2-6.4-3.2-9.6-9.6-9.6-19.2 0-6.4 6.4-12.8 12.8-16 131.2-41.6 217.6-160 217.6-297.6 0-9.6 9.6-19.2 19.2-19.2s19.2 9.6 19.2 19.2c-3.2 140.8-86.4 262.4-211.2 320z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="notice" unicode="" d="M544 798.976V864h-64v-65.024C289.536 786.304 160 658.624 160 416v-288h64V416c0 192 115.456 320 288 320 180.544 0 288-128 288-320v-288h64V416c0 242.88-122.496 370.56-320 382.976zM672 64a160 160 0 1 0-320 0h64a96 96 0 0 1 192 0h64zM64 128h896v-64H64v64z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="login-weibo" unicode="" d="M411.270737 288.350316c-17.973895 7.504842-41.189053-0.229053-52.264421-17.542737-11.223579-17.394526-5.955368-38.103579 11.870316-46.201263 18.108632-8.232421 42.132211-0.417684 53.342316 17.421474C435.253895 260.05557899999997 429.446737 280.62989500000003 411.270737 288.350316zM455.545263 306.64757899999995c-6.885053 2.721684-15.508211-0.579368-19.550316-7.329684-3.920842-6.790737-1.751579-14.524632 5.146947-17.367579 7.019789-2.883368 16.006737 0.458105 20.048842 7.370105C465.071158 296.259368 462.551579 304.087579 455.545263 306.64757899999995zM427.52 426.684632c-115.968-11.439158-203.924211-82.216421-196.378947-158.073263 7.531789-75.910737 107.654737-128.161684 223.649684-116.749474 115.994947 11.439158 203.924211 82.216421 196.392421 158.140632C643.664842 385.859368 543.541895 438.110316 427.52 426.684632zM529.300211 247.70021099999997c-23.673263-53.355789-91.769263-81.798737-149.530947-63.232-55.754105 17.933474-79.373474 72.811789-54.945684 122.246737 23.956211 48.464842 86.352842 75.870316 141.541053 61.561263C523.506526 353.562947 552.663579 299.85684200000003 529.300211 247.70021099999997zM512 896C229.241263 896 0 666.772211 0 384c0-282.758737 229.241263-512 512-512 282.772211 0 512 229.241263 512 512C1024 666.772211 794.772211 896 512 896zM455.531789 101.02568399999996c-145.354105 0-293.941895 70.197895-293.941895 185.667368 0 60.362105 38.386526 130.182737 104.474947 196.069053 88.252632 87.929263 191.164632 127.986526 229.874526 89.397895 17.084632-17.003789 18.741895-46.457263 7.760842-81.623579-5.726316-17.690947 16.666947-7.895579 16.666947-7.936 71.343158 29.763368 133.564632 31.514947 156.321684-0.862316 12.139789-17.246316 10.954105-41.472-0.215579-69.510737-5.173895-12.921263 1.589895-14.928842 11.466105-17.879579 40.178526-12.422737 84.924632-42.455579 84.924632-95.380211C772.837053 211.36168399999997 646.090105 101.02568399999996 455.531789 101.02568399999996zM718.672842 468.197053c4.715789 14.457263 1.765053 30.962526-9.202526 43.061895-10.954105 12.072421-27.136 16.666947-42.037895 13.527579l0 0.026947c-12.463158-2.694737-24.724211 5.268211-27.392 17.664-2.667789 12.463158 5.281684 24.697263 17.744842 27.338105 30.531368 6.467368 63.595789-2.937263 85.989053-27.715368 22.447158-24.764632 28.456421-58.489263 18.849684-88.064-3.907368-12.099368-16.936421-18.728421-29.062737-14.848-12.139789 3.920842-18.782316 16.922947-14.874947 28.995368L718.672842 468.183579zM853.261474 424.865684c-0.013474-0.013474-0.013474-0.080842-0.013474-0.107789-4.567579-14.026105-19.712-21.706105-33.778526-17.165474-14.133895 4.554105-21.854316 19.590737-17.300211 33.670737l0 0.013474c13.999158 43.169684 5.12 92.429474-27.567158 128.565895-32.714105 36.122947-80.949895 49.92-125.507368 40.488421-14.484211-3.085474-28.752842 6.130526-31.838316 20.574316-3.098947 14.403368 6.144 28.631579 20.641684 31.717053l0.026947 0c62.625684 13.271579 130.519579-6.117053 176.545684-56.966737C860.483368 554.886737 872.892632 485.618526 853.261474 424.865684z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="voice" unicode="" d="M463.380164 644.0568969999999v-0.003069c-4.550643 4.549619-10.484795 7.02295-16.913205 7.02295s-12.365632-2.473331-16.915251-7.02295c-4.549619-4.551666-7.020904-10.485819-7.020904-16.914229s2.471284-12.365632 7.020904-16.915251c60.437487-60.438511 93.675496-140.756791 93.675496-226.222301 0-85.464487-33.238009-165.783791-93.675496-226.220255-4.549619-4.551666-7.020904-10.487865-7.020904-16.915252 0-6.429433 2.471284-12.365632 7.020904-16.914228 4.550643-4.549619 10.486842-7.02295 16.915251-7.02295s12.364609 2.473331 16.913205 7.02295c35.114752 35.116799 62.317301 76.06849 80.814584 121.668037 17.904789 44.018539 26.90579 90.608647 26.90579 138.384768s-9.101285 94.26799-26.90579 138.384767c-18.59552 45.697785-45.698808 86.550215-80.814584 121.667013zM781.892405 618.929614v-0.002047c-31.358195 77.452-77.550237 146.990772-137.098471 206.539007-4.550643 4.549619-10.485819 7.02295-16.915252 7.02295-6.42841 0-12.363585-2.473331-16.914228-7.02295-9.29776-9.299807-9.29776-24.531719 0-33.82948 54.997592-54.998615 97.631598-119.195729 126.613676-190.71153 27.993564-69.044516 42.237987-142.045133 42.237987-216.924541s-14.244422-147.882072-42.237987-216.923518c-28.982078-71.517847-71.616084-135.616724-126.613676-190.711529-9.29776-9.298783-9.29776-24.531719 0-33.82948 4.551666-4.551666 10.485819-7.02295 16.914228-7.02295 6.429433 0 12.366655 2.471284 16.915252 7.02295 59.547211 59.547211 105.740276 129.085984 137.098471 206.53696 30.369681 74.78117 45.699832 153.817248 45.699831 234.928591 0 81.111343-15.331173 160.146397-45.699831 234.927567zM299.474141 427.621497c-11.670807 11.573593-27.103288 18.004049-43.522236 18.004049-16.419971 0-31.852452-6.429433-43.52326-18.004049-11.57257-11.57257-18.003026-27.104311-18.003026-43.522236 0-16.420995 6.42841-31.851429 18.003026-43.52326 11.574616-11.57257 27.103288-18.003026 43.52326-18.003025s31.852452 6.429433 43.522236 18.003025c11.573593 11.573593 18.003026 27.104311 18.003025 43.52326 0 16.419971-6.427386 31.852452-18.003025 43.522236z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="upload-drag" unicode="" d="M666.931 445.918l-124.245 99.362c-7.221 5.639-16.428 9.042-26.429 9.042-9.963 0-19.136-3.376-26.438-9.047l-124.215-99.391c-9.615-7.772-15.713-19.565-15.713-32.782 0-9.946 3.453-19.084 9.223-26.284 13.828-17.359 41.51-20.465 58.918-6.505l56.252 45.022v-261.12c0-23.177 18.842-41.984 41.95-41.984s41.95 18.842 41.95 41.984v261.12l56.286-45.056c17.545-13.892 45.09-10.718 58.914 6.554 5.754 7.137 9.236 16.316 9.236 26.308 0 13.211-6.086 24.999-15.609 32.716zM235.827 142.95000000000005c-85.026 0-152.542 31.71-188.655 89.839-36.113 58.095-34.406 134.724 4.335 195.174 37.342 58.334 102.366 92.023 178.995 94.549-19.866 130.492 42.667 202.377 84.753 235.008 90.112 69.871 234.257 79.053 335.565 21.367 58.982-33.587 94.037-85.675 100.454-146.978 113.937 18.978 177.562-33.826 206.814-69.905 63.317-78.131 71.27-204.39 18.91-300.203-46.524-85.06-130.389-127.317-229.82-116.497-18.739 2.116-32.222 18.978-30.174 37.683s19.285 32.017 37.683 30.174c96.7-10.718 143.258 46.353 162.406 81.408 39.014 71.373 33.826 167.868-12.049 224.495-38.673 47.684-100.352 60.518-178.483 37.069-2.94-0.916-6.319-1.443-9.822-1.443-18.851 0-34.133 15.282-34.133 34.133 0 1.495 0.096 2.969 0.283 4.414 8.549 68.506-31.114 106.53-65.93 126.362-77.346 44.066-191.522 37.035-259.925-15.974-58.266-45.193-75.947-117.18-51.132-208.179 0.761-2.688 1.198-5.775 1.198-8.963 0-18.851-15.282-34.133-34.133-34.133-1.481 0-2.94 0.094-4.371 0.277-70.759 8.822-128.991-13.535-159.677-61.424-24.61-38.434-26.146-86.46-3.823-122.368 27.716-44.578 86.05-64.375 164.147-55.637 1.132 0.133 2.443 0.209 3.772 0.209 18.853 0 34.138-15.284 34.138-34.138 0-17.525-13.205-31.965-30.208-33.914-14.153-1.653-27.874-2.404-41.118-2.404z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="login-qq" unicode="" d="M512 896C229.227789 896 0 666.772211 0 384c0-282.745263 229.227789-512 512-512s512 229.254737 512 512C1024 666.772211 794.772211 896 512 896L512 896zM738.856421 258.93726300000003c0 0-16.208842-44.220632-45.945263-83.941053 0 0 53.126737-18.054737 48.64-64.983579 0 0 1.778526-52.345263-113.461895-48.734316 0 0-81.071158 6.319158-105.377684 40.609684l-21.423158 0c-24.306526-34.304-105.350737-40.609684-105.350737-40.609684-115.280842-3.610947-113.475368 48.734316-113.475368 48.734316-4.500211 46.928842 48.626526 64.983579 48.626526 64.983579-29.709474 39.720421-45.918316 83.941053-45.918316 83.941053-72.057263-116.439579-64.848842 16.249263-64.848842 16.249263 13.527579 78.524632 70.238316 129.967158 70.238316 129.967158-8.111158 71.316211 21.611789 83.941053 21.611789 83.941053C318.410105 709.712842 508.025263 705.859368 512 705.751579c3.988211 0.107789 193.576421 3.961263 199.828211-216.643368 0 0 29.709474-12.638316 21.611789-83.941053 0 0 56.737684-51.442526 70.238316-129.967158l0 0C803.678316 275.18652599999996 810.873263 142.49768400000005 738.856421 258.93726300000003L738.856421 258.93726300000003zM738.856421 258.93726300000003" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="snowflake" unicode="" d="M480.695-64h63.725V59.291000000000054l68.854-68.242 44.945 44.546-113.798 112.79v180.02l177.271-102.44 41.67-155.652 60.725 16.284-25.398 94.872 85.259-49.266 31.87 55.246-84.726 48.961 94.497 25.343-16.495 61.622-156.068-41.855-176.934 102.245 177.667 102.667 155.513-41.709 16.274 60.793-94.78 25.418 85.255 49.264-31.869 55.247-84.733-48.965 25.326 94.594-61.557 16.51-41.817-156.206-176.948-102.251V644.461l113.849 113.951-44.459 44.496-69.392-69.454V832h-63.725v-97.935l-69.188 69.249-45.068-45.107 114.256-114.355V438.89l-156.557 90.469L283.45 684.39l-60.188-16.458 24.84-94.632-107.544 62.145-31.868-55.247 106.667-61.639-93.463-25.557 16.074-61.237 154.482 42.243 156.169-90.243-156.138-90.226-154.485 42.243-15.855-60.409 94.289-25.784-107.534-62.14 31.868-55.247 106.672 61.642-24.621-93.801 61.012-16.685 40.69 155.028 156.179 90.25v-180.455l-113.801-112.79 44.338-43.944 69.463 68.845V-64z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="file-b" unicode="" d="M790.08 177.91999999999996l-138.112-119.232V177.91999999999996h138.112zM198.848 763.008h627.328v-516.16H617.088a34.56 34.56 0 0 1-34.816-34.432v-206.528H198.848V763.008z m662.208 68.8H164.032a34.56 34.56 0 0 1-34.816-34.432v-825.92a34.56 34.56 0 0 1 34.816-34.432h453.056l278.784 240.896V797.376a34.56 34.56 0 0 1-34.816 34.432z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="template" unicode="" d="M734 172.89999999999998v82.8h-59.9v-37l-35.7-9.7 15.7-57.8zM674.1 419.3H734v-81.8h-59.9zM734 600.2l-95.6-26 15.7-57.8 20 5.4v-20.7H734zM866.1 131.29999999999995v-37l-35.7-9.7 7.9-28.9 7.8-28.9 79.9 21.7v82.8h-29.9zM740.9 60.299999999999955L651.4 36l7.9-28.9 7.8-29 89.5 24.4-7.8 28.9zM740.9 781.7l-89.5-24.3 7.9-28.9 7.8-28.9 89.5 24.3-7.8 28.9zM830.4 806l7.9-28.9 7.8-28.9 20 5.5v-20.8H926V832zM866.1 612.6v-120.3H926V612.6h-29.9zM866.1 371.9v-120.3H926V371.9h-29.9zM541.9 665.6l35.7 9.7-7.8 28.9-7.8 28.9-50-13.6L98 832v-783.5l384.1-104.3L512-64l29.9 8.1 35.7 9.7-7.8 28.9-7.8 28.9-20-5.4V120.79999999999995l35.7 9.7-15.7 57.8-20-5.4V486l35.7 9.7-15.7 57.8-20-5.4V665.6z m-59.8-659.4l-324.2 88.1V753.7l324.2-88.1V548l-192 52.2v-427.3l192-52.2v-114.5z m0 360.9V182.79999999999995l-132.2 35.9V521.8l132.2-35.9v-118.8z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="auz" unicode="" d="M324.266667 435.2c-17.066667 17.066667-39.822222 17.066667-51.2 0-17.066667-17.066667-17.066667-39.822222 0-51.2l153.6-159.288889c5.688889-5.688889 17.066667-11.377778 28.444444-11.377778s17.066667 5.688889 28.444445 11.377778l295.822222 290.133333c17.066667 17.066667 17.066667 39.822222 0 51.2-17.066667 17.066667-39.822222 17.066667-51.2 0L455.111111 304.355556 324.266667 435.2zM927.288889 753.777778L523.377778 896h-22.755556L96.711111 753.777778c-17.066667-5.688889-28.444444-17.066667-28.444444-34.133334v-432.355555c11.377778-250.311111 409.6-409.6 426.666666-415.288889h22.755556c17.066667 5.688889 415.288889 159.288889 426.666667 415.288889V719.644444c11.377778 17.066667 0 28.444444-17.066667 34.133334z m-45.511111-460.8c-5.688889-182.044444-301.511111-312.888889-369.777778-341.333334-113.777778 45.511111-358.4 182.044444-369.777778 341.333334v398.222222L512 822.044444l369.777778-125.155555v-403.911111z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="console" unicode="" d="M30.552 104.72699999999998c4.654-16.29 23.272-23.272 37.236-18.618 16.291 4.655 23.273 23.273 18.618 37.236C16.588 314.182 84.08 521.31 237.68 640c11.636 9.31 23.273 16.29 37.236 25.6 25.6 16.29 53.528 30.255 83.782 39.564 58.182 20.945 118.691 30.254 176.873 27.927h25.6c6.982 0 11.636 0 18.618-2.327 30.255-4.655 58.182-11.637 88.436-23.273 235.055-86.11 356.073-346.764 269.964-581.818-4.654-16.291 2.327-32.582 18.618-37.237 16.291-4.654 32.582 2.328 37.237 18.619 41.89 116.363 39.563 239.709 0 349.09h2.327C921.897 656.2909999999999 738.043 784.2909999999999 537.897 793.6h-48.873c-200.145-9.31-384-137.31-458.472-337.455-39.564-109.381-41.891-232.727 0-351.418z m707.49 386.328a29.498 29.498 0 0 1-41.89 0L521.606 316.509c-4.654 2.327-9.309 2.327-13.963 2.327-32.582 0-58.182-25.6-58.182-58.181s25.6-58.182 58.182-58.182 58.181 25.6 58.181 58.182c0 4.654 0 9.309-2.327 16.29l174.546 174.546c11.636 11.636 11.636 30.254 0 39.564z m228.073-458.473H58.48c-16.29 0-30.255-13.964-30.255-30.255 0-16.29 13.964-30.254 30.255-30.254h907.636c16.291 0 30.255 13.963 30.255 30.254 0 16.291-13.964 30.255-30.255 30.255z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="app" unicode="" d="M432.022 818.946h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM391.517 471.196h-295.169v295.169h295.021v-295.169zM976.847 635.717l-211.95 211.95c-8.837 8.837-23.124 8.837-31.963 0l-211.95-211.95c-8.837-8.837-8.837-23.124 0-31.963l211.95-212.098c8.837-8.837 23.124-8.837 31.963 0l211.95 211.95c8.837 8.987 8.837 23.271 0 32.109zM432.022 313.45000000000005h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM391.517-34.15499999999997h-295.169v295.021h295.021v-295.021zM932.511 313.45000000000005h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM891.859-34.15499999999997h-295.021v295.021h295.021v-295.021z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="prev" unicode="" d="M62.573 384.103l423.401 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.751-18.976-68.727 0l-39.753 39.753 0.269 0.246-385.655 385.661zM451.365 384.103l423.407 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.757-18.977-68.727 0l-39.762 39.754 0.273 0.249-385.662 385.661zM451.365 384.103z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="website" unicode="" d="M777.073418 147.443038c-30.460759 21.387342-40.83038 40.182278-76.47595 53.792405 25.275949 60.273418 40.182278 83.605063 42.126583 154.896203H887.898734c-3.888608-99.159494-45.367089-143.878481-110.825316-208.688608zM136.101266 356.13164600000005h167.210126c1.944304-71.291139 16.850633-94.622785 42.126583-154.896203-34.997468-13.610127-68.050633-31.756962-98.511393-53.792405C181.468354 212.25316499999997 139.989873 256.97215200000005 136.101266 356.13164600000005z m103.048101 259.888607c29.164557-23.979747 61.56962-42.774684 96.567089-57.681012-19.443038-53.792405-30.460759-90.734177-31.756962-152.951899H136.101266c3.240506 90.734177 46.663291 147.767089 103.048101 210.632911z m309.144304-209.98481V523.989873c47.311392 1.296203 71.291139 10.36962 114.065823 25.27595 18.146835-51.2 28.516456-84.901266 30.460759-143.23038H548.293671z m104.344304-195.078481c-40.182278 12.962025-60.273418 20.091139-104.344304 21.387342V356.13164600000005h144.526582c-1.944304-68.050633-16.202532-88.141772-40.182278-145.174684z m36.941772-57.681013c31.756962-12.313924 39.534177-28.516456 66.75443-47.311392-51.848101-44.718987-114.713924-73.883544-182.116455-84.901266 36.941772 37.589873 90.734177 82.308861 115.362025 132.212658z m-163.321519-137.397468l22.035443 165.913924c40.182278-1.296203 56.38481-7.777215 92.678481-18.794937-27.220253-56.38481-66.106329-106.288608-113.417722-147.118987h-1.296202z m-75.827848 5.18481c-67.402532 11.017722-130.268354 40.83038-182.764557 84.901266 27.868354 19.443038 57.681013 34.997468 88.789873 47.311392 23.331646-48.607595 55.088608-93.326582 93.974684-132.212658z m47.311392 335.068355v-123.787342c-44.070886-1.296203-64.162025-8.425316-104.344304-21.387342-23.979747 57.681013-38.237975 77.124051-40.182278 145.174684h144.526582zM383.675949 549.265823c42.774684-14.906329 66.75443-23.331646 114.065823-25.27595v-117.95443H353.21519c1.944304 58.329114 12.313924 92.03038 30.460759 143.23038z m-37.589873 57.032911c-31.756962 12.962025-60.921519 30.460759-88.141772 51.848101 53.792405 51.848101 115.362025 91.382278 192.486076 104.344304-44.718987-44.718987-80.364557-97.863291-104.344304-156.192405z m151.655696 161.377215v-193.782278c-44.070886 1.296203-64.162025 9.073418-103.696202 22.683544 29.164557 68.698734 49.903797 127.027848 102.4 171.098734h1.296202z m75.827848-4.536708c77.772152-13.610127 149.711392-49.903797 206.744304-104.344304-29.164557-22.035443-46.01519-37.589873-80.364557-51.848102-25.275949 59.625316-82.956962 112.76962-126.379747 156.192406z m-46.01519 4.536708c54.440506-46.01519 97.21519-104.992405 124.435443-171.098734-39.534177-13.610127-59.625316-21.387342-103.696202-22.683544l-22.035443 193.782278h1.296202z m-31.10886-751.149367c-46.663291 38.886076-62.865823 88.789873-91.382279 147.118988 36.293671 11.665823 53.144304 17.498734 93.326582 18.794936v-165.913924h-1.944303zM887.898734 406.035443h-145.174683c-1.296203 61.56962-12.313924 98.511392-31.756962 152.303798 37.589873 15.55443 57.032911 33.053165 88.789873 57.681012 56.38481-62.865823 84.901266-119.898734 88.141772-209.98481z m-375.898734 427.746835c-244.334177 0-442.005063-197.670886-442.005063-442.005063S267.665823-50.227847999999994 512-50.227847999999994s442.005063 197.670886 442.005063 442.005063S756.334177 833.782278 512 833.782278z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="next" unicode="" d="M948.066926 382.958838l-411.990051-412.24426c-18.47333-18.47333-48.417689-18.47333-66.875207 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L814.691135 383.088983 467.512212 730.269123c-18.466032 18.458735-18.466032 48.405526 0 66.873991 18.468465 18.464816 48.410391 18.464816 66.872774 0l38.682336-38.682336-0.261507-0.239614 375.259894-375.265975v0.003649m-378.312834 0L157.756743-29.28542200000004c-18.47333-18.47333-48.415256-18.47333-66.872775 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L436.369787 383.088983 89.19208 730.269123c-18.4636 18.458735-18.4636 48.405526 0 66.873991 18.470898 18.464816 48.415256 18.464816 66.872774 0l38.692067-38.682336-0.266372-0.239614 375.267191-375.265975-0.004865 0.003649m0 0z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="component" unicode="" d="M917.376 652.544L500.8 891.2a34.304 34.304 0 0 1-34.176 0L50.112 652.48a33.92 33.92 0 0 1-17.088-29.376v-477.44c0-12.16 6.528-23.296 17.088-29.44l416.512-238.72a35.136 35.136 0 0 1 34.176 0l416.576 238.72a33.92 33.92 0 0 1 17.088 29.44v477.44a33.92 33.92 0 0 1-17.088 29.44z m-51.264-487.36l-382.4-219.136-382.336 219.136V603.52l382.336 219.136 382.4-219.136v-438.272zM198.784 535.488a33.792 33.792 0 0 1 12.544-46.4l237.824-136.32V83.20000000000005c0-18.816 15.232-33.92 34.176-33.92a33.92 33.92 0 0 1 34.176 33.92V352.384l238.656 136.832a33.856 33.856 0 0 1 12.544 46.4 34.368 34.368 0 0 1-46.72 12.416L483.712 411.52 245.504 548.0319999999999a34.432 34.432 0 0 1-46.72-12.544z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="more" unicode="" d="M224 288c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z m288 0c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z m288 0c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="login-wechat" unicode="" d="M516.464646 896C233.714646 896 4.464646 666.75 4.464646 384S233.714646-128 516.464646-128s512 229.25 512 512S799.214646 896 516.464646 896z m-74-523.375c-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.25-1.125-0.5-1.875s-0.5-1.125-0.5-1.875c-0.25-0.75-0.25-1.125-0.5-1.875s-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875c0-0.75-0.25-1.125-0.25-1.875s-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875 0-1.125-0.25-1.875c0-0.75-0.25-1.125-0.25-1.875s0-1.125-0.25-1.875c0-0.75 0-1.125-0.25-1.875 0-0.75 0-1.125-0.25-1.875v-22.5c0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0.25-1.125 0.25-1.875s0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875l0.25-0.875c-4.25-0.25-8.625-0.75-12.75-0.75-3.75-0.25-7.25-0.25-11-0.25-3.5 0-7 0-10.5 0.25-7.25 0.25-14 0.875-20.75 1.875-4.25 0.5-8.125 1.125-12.375 1.875-3.5 0.5-6.75 1.125-10.25 1.875-3 0.5-6.25 1.125-9.25 1.875-3 0.75-5.875 1.125-8.875 1.875-2.75 0.75-5.875 1.125-8.875 1.875-2.75 0.5-5.625 1.125-8.375 1.625l-3.25-1.625-3.75-1.875-4 1.375-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-2.75-1.375-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-2.5-1.375 0.5 1.375 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.5 1.125c-0.5 0.25-0.75 0.5-1.125 0.75-0.875 0.75-1.625 1.125-2.5 1.875s-1.625 1.125-2.5 1.875-1.625 1.125-2.5 1.875c-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.375 1.125-2.375 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-1.875 1.875-0.75 0.75-1.375 1.125-1.875 1.875l-1.875 1.875-1.875 1.875-1.875 1.875-1.875 1.875c-0.75 0.75-1.125 1.125-1.625 1.875s-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-0.875 1.125-1.625 1.875c-0.5 0.75-0.875 1.125-1.625 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.125 1.875-0.5 0.75-0.875 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.25 1.125-0.5 1.875s-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875 0 1.125-0.25 1.875c0 0.75 0 1.125-0.25 1.875 0 0.75 0 1.125-0.25 1.875 0 0.75 0 1.125-0.25 1.875V457.25v1.875 1.875 1.875 1.875 1.875 0.875 0.875 1.875 1.875 1.875 1.875 1.875 1.875c0 0.75 0 1.125 0.25 1.875 0 0.75 0 1.125 0.25 1.875 0 0.75 0 1.125 0.25 1.875 0 0.75 0.25 1.125 0.25 1.875s0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.5 1.875c0 0.75 0.25 1.125 0.5 1.875s0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.5 1.125 0.5 1.875c0.25 0.75 0.5 1.125 0.5 1.875 0.25 0.75 0.5 1.125 0.5 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.625 1.875 0.5 0.75 0.875 1.125 1.625 1.875 0.5 0.75 1.125 1.125 1.625 1.875s1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875l1.875 1.875 1.875 1.875 1.875 1.875 1.875 1.875c0.75 0.75 1.375 1.125 1.875 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.875 0.75 1.625 1.125 2.5 1.875s1.625 1.125 2.5 1.875 1.875 1.125 2.5 1.875c0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 3 1.875 0.875 0.75 2.125 1.125 3 1.875s2.125 1.125 3 1.875c1.125 0.75 2.125 1.125 3.25 1.875 1.125 0.75 2.375 1.125 3.25 1.875 1.125 0.75 2.375 1.125 3.5 1.875 1.125 0.75 2.375 1.125 3.75 1.875 1.125 0.75 2.5 1.125 3.75 1.875 1.375 0.75 2.5 1.125 4 1.875 1.375 0.75 2.75 1.125 4.25 1.875 1.375 0.75 2.75 1.125 4.25 1.875 1.375 0.75 3 1.125 4.375 1.875 1.625 0.75 3 1.125 4.625 1.875 1.625 0.75 3.25 1.125 4.875 1.875 1.875 0.75 3.5 1.125 5.375 1.875s3.75 1.125 5.625 1.875c2.125 0.75 4.25 1.125 6 1.875 2.375 0.75 4.375 1.125 6.75 1.875 2.5 0.75 4.875 1.125 7.5 1.875 2.75 0.75 5.625 1.125 8.625 1.875 3.5 0.75 6.75 1.125 10.25 1.875 4.375 0.75 8.875 1.375 13.25 1.875 11 1.125 22.125 1.875 33.25 1.875h2.5c11.125 0 22.375-0.75 33.5-1.875 4.375-0.5 8.875-1.125 13.25-1.875 3.5-0.5 7-1.125 10.25-1.875 2.75-0.5 5.875-1.125 8.625-1.875 2.5-0.5 5.125-1.125 7.625-1.875 2.375-0.5 4.625-1.125 6.75-1.875 2.125-0.5 4.25-1.125 6.25-1.875 1.875-0.75 4-1.125 5.875-1.875s3.75-1.125 5.375-1.875c1.625-0.75 3.5-1.125 5.125-1.875 1.625-0.75 3.25-1.125 4.875-1.875 1.625-0.75 3-1.125 4.625-1.875 1.375-0.75 3-1.125 4.375-1.875s2.75-1.125 4.25-1.875c1.375-0.75 2.75-1.125 4-1.875 1.375-0.75 2.5-1.125 3.75-1.875 1.125-0.75 2.5-1.125 3.75-1.875 1.125-0.75 2.375-1.125 3.5-1.875 1.125-0.75 2.375-1.125 3.5-1.875 1.125-0.75 2.375-1.125 3.25-1.875 1.125-0.75 2.125-1.125 3.25-1.875 1.125-0.75 2.125-1.125 3-1.875s2.125-1.125 3-1.875 1.875-1.125 3-1.875c0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.5-1.875 0.875-0.75 1.625-1.125 2.5-1.875s1.625-1.125 2.5-1.875 1.625-1.125 2.375-1.875c0.75-0.75 1.625-1.125 2.375-1.875 0.75-0.75 1.625-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 1.875-1.875 0.75-0.75 1.375-1.125 1.875-1.875l1.875-1.875 1.875-1.875 1.875-1.875 1.875-1.875c0.75-0.75 1.125-1.125 1.625-1.875s1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 0.875-1.125 1.625-1.875c0.5-0.75 0.875-1.125 1.625-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.5-1.875 0.25-0.75 0.5-1.125 0.5-1.875 0.25-0.75 0.25-1.125 0.5-1.875s0.5-1.125 0.5-1.875c0.25-0.75 0.25-1.125 0.5-1.875s0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875c0-0.5 0.25-0.75 0.25-1.125-4.625 0.5-9.25 0.875-14 1.125-3.5 0.25-7 0.25-10.75 0.25-4 0-8.125 0-12.125-0.25-6.75-0.25-13.25-0.875-19.5-1.875-3.75-0.5-7.625-1.125-11.375-1.875-3-0.5-5.875-1.125-8.875-1.875-2.5-0.5-5.125-1.125-7.5-1.875-2.125-0.5-4.375-1.125-6.5-1.875-1.875-0.5-4-1.125-5.875-1.875-1.875-0.5-3.5-1.125-5.375-1.875-1.625-0.75-3.25-1.125-4.875-1.875-1.625-0.75-3-1.125-4.625-1.875-1.375-0.75-3-1.125-4.375-1.875s-2.75-1.125-4.25-1.875c-1.375-0.75-2.5-1.125-4-1.875-1.125-0.75-2.5-1.125-3.75-1.875-1.125-0.75-2.375-1.125-3.5-1.875-1.125-0.75-2.375-1.125-3.5-1.875-1.125-0.75-2.125-1.125-3.25-1.875-0.875-0.75-2.125-1.125-3-1.875s-2.125-1.125-3-1.875-1.875-1.125-3-1.875c-0.875-0.75-1.875-1.125-2.75-1.875-0.875-0.75-1.875-1.125-2.75-1.875-0.875-0.75-1.875-1.125-2.5-1.875-0.875-0.75-1.625-1.125-2.5-1.875s-1.625-1.125-2.5-1.875c-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-1.875-1.875l-1.875-1.875-1.875-1.875-1.875-1.875c-0.75-0.75-1.125-1.125-1.625-1.875s-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-0.875-1.125-1.625-1.875c-0.5-0.75-0.875-1.125-1.625-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.125-1.875-0.5-0.75-0.875-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.75-1.875-3.125-4.625-3.375-5.125-3.625-5.75z m433.625-71.25v-11.375c0-0.5 0-0.875-0.25-1.625 0-0.5 0-0.875-0.25-1.625 0-0.5 0-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625l-1.625-1.625-1.625-1.625c-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.375-0.875-1.875-1.625-0.75-0.5-1.375-0.875-1.875-1.625-0.75-0.5-1.375-0.875-2.125-1.625-0.75-0.5-1.375-0.875-2.125-1.625l-0.75-0.5 0.25-0.875 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.25-1.125-2.125 1.125-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-0.5 0.25-0.875-0.25c-2.125-0.5-4.25-0.875-6-1.625-2.125-0.5-4.25-0.875-6.25-1.625-2.125-0.5-4.25-0.875-6.5-1.625-2.375-0.5-4.375-0.875-6.75-1.625-2.375-0.5-4.875-1.125-7.25-1.625-2.75-0.5-5.375-1.125-8.125-1.625-3.25-0.5-6.5-1.125-9.75-1.625-5.375-0.75-10.75-1.125-15.875-1.625-2.75-0.25-5.875-0.25-8.625-0.25-3.75 0-7.5 0-11.125 0.25-6.5 0.25-12.75 0.75-19.125 1.625-3.75 0.5-7.5 0.875-11 1.625-2.75 0.5-5.875 0.875-8.625 1.625-2.375 0.5-4.875 0.875-7.25 1.625-2.125 0.5-4.25 0.875-6.25 1.625-1.875 0.5-3.75 0.875-5.625 1.625-1.875 0.5-3.5 0.875-5.125 1.625-1.625 0.5-3.25 0.875-4.875 1.625-1.375 0.5-3 0.875-4.375 1.625-1.375 0.5-2.75 0.875-4.25 1.625-1.375 0.5-2.5 0.875-4 1.625-1.125 0.5-2.5 0.875-3.75 1.625-1.125 0.5-2.375 0.875-3.75 1.625-1.125 0.5-2.375 0.875-3.5 1.625-1.125 0.5-2.125 0.875-3.25 1.625-1.125 0.5-2.125 0.875-3.25 1.625-0.875 0.5-2.125 0.875-3 1.625-0.875 0.5-1.875 0.875-3 1.625-0.875 0.5-1.875 0.875-2.75 1.625-0.875 0.5-1.875 0.875-2.75 1.625-0.875 0.5-1.875 0.875-2.5 1.625-0.875 0.5-1.625 0.875-2.5 1.625-0.875 0.5-1.625 0.875-2.5 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.375 0.875-2.375 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-1.875 1.625-0.75 0.5-1.375 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625l-1.625 1.625-1.625 1.625c-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625v1.625 1.625 1.625 3.25 1.625 3.25 1.375 1.625 1.625 1.625 1.625 1.625 1.625 1.625 1.625 1.625c0 0.5 0 0.875 0.25 1.625 0 0.5 0 0.875 0.25 1.625 0 0.5 0 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625l1.625 1.625 1.625 1.625c0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.375 0.875 1.875 1.625 0.75 0.5 1.375 0.875 1.875 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.875 0.5 1.625 0.875 2.5 1.625 0.875 0.5 1.625 0.875 2.5 1.625 0.875 0.5 1.875 0.875 2.5 1.625 0.875 0.5 1.875 0.875 2.75 1.625 0.875 0.5 1.875 0.875 2.75 1.625 0.875 0.5 1.875 0.875 3 1.625 0.875 0.5 2.125 0.875 3 1.625 1.125 0.5 2.125 0.875 3.25 1.625 1.125 0.5 2.125 0.875 3.25 1.625 1.125 0.5 2.375 0.875 3.5 1.625 1.125 0.5 2.375 0.875 3.75 1.625 1.125 0.5 2.5 0.875 3.75 1.625 1.375 0.5 2.5 0.875 4 1.625 1.375 0.5 2.75 0.875 4.25 1.625 1.375 0.5 3 0.875 4.375 1.625 1.625 0.5 3.25 0.875 4.875 1.625 1.625 0.5 3.5 0.875 5.125 1.625 1.875 0.5 3.75 0.875 5.875 1.625 2.125 0.5 4.25 1.125 6.25 1.625 2.375 0.5 4.875 1.125 7.25 1.625 2.75 0.5 5.875 1.125 8.625 1.625 3.75 0.75 7.5 1.125 11.125 1.625 9.25 1.125 19.125 1.625 28.875 1.625h1.375c9.25 0 18.375-0.75 27.5-1.625 3.75-0.5 7.25-0.875 10.75-1.625 2.75-0.5 5.625-0.875 8.375-1.625 2.375-0.5 4.625-0.875 7-1.625 2.125-0.5 4.25-0.875 6.25-1.625 1.875-0.5 3.75-0.875 5.625-1.625 1.625-0.5 3.5-0.875 5.125-1.625 1.625-0.5 3.25-0.875 4.625-1.625 1.375-0.5 3-0.875 4.375-1.625 1.375-0.5 2.75-0.875 4.25-1.625 1.375-0.5 2.5-0.875 4-1.625 1.125-0.5 2.5-0.875 3.75-1.625 1.125-0.5 2.375-0.875 3.5-1.625 1.125-0.5 2.375-0.875 3.5-1.625 1.125-0.5 2.125-0.875 3.25-1.625 1.125-0.5 2.125-0.875 3.25-1.625 0.875-0.5 2.125-0.875 3-1.625 0.875-0.5 1.875-0.875 3-1.625 0.875-0.5 1.875-0.875 2.75-1.625 0.875-0.5 1.875-0.875 2.75-1.625 0.875-0.5 1.875-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.75-0.5 1.625-0.875 2.375-1.625 0.75-0.5 1.625-0.875 2.375-1.625 0.75-0.5 1.375-0.875 2.375-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 1.875-1.625 0.75-0.5 1.375-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625l1.625-1.625 1.625-1.625c0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.875-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625v-11.375h-3.125zM589.714646 384c-12.625 0-25.375-12.75-25.375-25.375 0-12.75 12.75-25.375 25.375-25.375 19.375 0 31.875 12.625 31.875 25.375-0.125 12.625-12.75 25.375-31.875 25.375zM729.589646 384c-12.625 0-25.375-12.75-25.375-25.375 0-12.75 12.75-25.375 25.375-25.375 19.125 0 31.875 12.625 31.875 25.375 0 12.625-12.75 25.375-31.875 25.375zM328.714646 568.75c-19.125 0-38.375-12.625-38.375-31.625 0-19.125 19.375-31.875 38.375-31.875s31.875 12.75 31.875 31.875-12.875 31.625-31.875 31.625zM506.964646 568.75c-19.125 0-38.125-12.625-38.125-31.625 0-19.125 19.125-31.875 38.125-31.875 19.125 0 31.875 12.75 31.875 31.875s-12.875 31.625-31.875 31.625z" horiz-adv-x="1059" />
+
+
+ <glyph glyph-name="shrink-right" unicode="" d="M52.294-28.71900000000005h899.793c16.546 0 29.999 13.405 29.999 29.999v59.974c-0.013 16.562-13.436 29.985-29.998 29.999h-899.795c-16.57 0-29.999-13.429-29.999-29.999v-59.974c0-16.617 13.429-29.999 29.999-29.999zM952.087 451.165h-479.884c-16.57 0-29.999-13.405-29.999-29.999v-59.974c0 0 0 0 0 0 0-16.572 13.428-30.01 29.997-30.022h479.885c16.571 0.013 29.999 13.448 29.999 30.022 0 0 0 0 0 0v59.974c0 16.593-13.429 29.999-29.999 29.999zM52.294 691.0840000000001h899.793c16.554 0.013 29.972 13.423 29.999 29.974v59.999c0 16.57-13.429 29.999-29.999 29.999h-899.793c-16.57 0-29.999-13.429-29.999-29.999v-59.997c0-16.546 13.429-29.975 29.999-29.975zM45.183 383.53499999999997l239.919-150.598v301.196l-239.919-150.598z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="spread-left" unicode="" d="M942.974 770.924h-843.556c-15.513 0-28.124-12.567-28.124-28.124v-56.226c0.012-15.527 12.596-28.111 28.123-28.124h843.559c15.534 0 28.124 12.59 28.124 28.124v56.226c0 15.578-12.59 28.124-28.124 28.124zM99.418 321.033h449.891c15.534 0 28.124 12.567 28.124 28.124v56.226c0 0 0 0 0 0 0 15.537-12.589 28.134-28.122 28.146h-449.892c-15.534-0.012-28.124-12.608-28.124-28.146 0 0 0 0 0 0v-56.226c0-15.556 12.59-28.124 28.124-28.124zM942.974 96.10900000000004h-843.556c-15.519-0.012-28.099-12.584-28.124-28.101v-56.249c0-15.534 12.59-28.124 28.124-28.124h843.556c15.534 0 28.124 12.59 28.124 28.124v56.248c0 15.513-12.59 28.103-28.124 28.102zM949.641 384.436l-224.924 141.186v-282.37l224.924 141.186z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="camera" unicode="" d="M884.3 648.6H704.2L679.5 698l-0.2 0.4c-1.9 3.6-3.6 6.9-5.1 9.9-12 23.4-21.5 41.9-54.1 41.9H416.7c-32.9 0-43.7-21.3-55.1-43.8-1.3-2.6-2.7-5.3-4.2-8.1l-24.8-49.7H152.4c-34 0-61.7-27.7-61.7-61.7v-488c0-34 27.7-61.7 61.7-61.7h731.9c34 0 61.7 27.7 61.7 61.7v488c0 34-27.7 61.7-61.7 61.7zM904 98.89999999999998c0-10.8-8.8-19.7-19.7-19.7H152.4c-10.8 0-19.7 8.8-19.7 19.7v488c0 10.8 8.8 19.7 19.7 19.7h206.1l36.2 72.5c1.5 2.9 2.9 5.7 4.3 8.3 10.6 20.8 11.1 20.8 17.7 20.8H620c4.6 0 5.8-0.6 5.8-0.6 2-1.2 7.2-11.2 10.9-18.5 1.6-3.1 3.3-6.5 5.3-10.1l36.2-72.4h206.1c10.8 0 19.7-8.8 19.7-19.7v-488zM525.5 565.5c-123.5 0-223.6-100.1-223.6-223.6S402 118.20000000000005 525.5 118.20000000000005s223.7 100.1 223.7 223.7c0 123.5-100.2 223.6-223.7 223.6z m0-402.5c-98.8 0-178.9 80.1-178.9 178.9 0 98.8 80.1 178.9 178.9 178.9 98.8 0 178.9-80.1 178.9-178.9 0-98.8-80.1-178.9-178.9-178.9z m246 402.5v-44.7H861v44.7h-89.5z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="note" unicode="" d="M987.2 384.36L512.43 859.13a84.75 84.75 0 0 1-65 24.71L111.55 864.09a84.83 84.83 0 0 1-79.65-79.65L12.15 448.57a84.57 84.57 0 0 1 24.69-65l474.8-474.8a84.91 84.91 0 0 1 119.93 0L987.2 264.41999999999996a84.9 84.9 0 0 1 0 119.94z m-39.28-80.66L592.29-51.91999999999996a29.31 29.31 0 0 0-41.37 0L76.1 422.9a29.22 29.22 0 0 0-8.49 22.38l19.74 335.88a29.29 29.29 0 0 0 27.48 27.48l335.9 19.75a29.32 29.32 0 0 0 22.38-8.52l474.8-474.8a29.31 29.31 0 0 0 0.01-41.37zM236.86 659.14c-50.92-50.95-50.92-133.8 0-184.72a130.61 130.61 0 1 1 184.71 184.72c-50.89 50.86-133.77 50.86-184.71 0zM382.29 513.7c-28.38-28.38-77.78-28.38-106.15 0a75.08 75.08 0 1 0 106.15 0z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="refresh" unicode="" d="M928 810.666667c-18.133333 0-32-13.866667-32-32v-164.266667C816 747.733333 669.866667 832 512 832 264.533333 832 64 631.4666669999999 64 384s200.533333-448 448-448c230.4 0 422.4 172.8 445.866667 402.133333 2.133333 17.066667-10.666667 33.066667-28.8 35.2-17.066667 2.133333-33.066667-10.666667-35.2-28.8C873.6 148.26666699999998 709.333333 0 512 0c-212.266667 0-384 171.733333-384 384s171.733333 384 384 384c137.6 0 264.533333-74.666667 332.8-192H693.333333c-18.133333 0-32-13.866667-32-32s13.866667-32 32-32h266.666667V778.666667c0 18.133333-14.933333 32-32 32z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="female" unicode="" d="M774.4 800c-48 35.2-108.8 51.2-172.8 51.2-105.6 0-208-51.2-268.8-150.4-89.6-134.4-57.6-313.6 60.8-416l-32-51.2-188.8 121.6S128 384 108.8 352c-22.4-35.2 22.4-64 22.4-64l188.8-121.6-105.6-163.2s-19.2-32 16-51.2c38.4-22.4 57.6 12.8 57.6 12.8l102.4 160 185.6-121.6s48-28.8 70.4 6.4c19.2 28.8-25.6 57.6-25.6 57.6L432 192l32 48c44.8-22.4 92.8-32 137.6-32 105.6 0 208 51.2 268.8 150.4 96 147.2 51.2 345.6-96 441.6z m35.2-400c-44.8-67.2-118.4-108.8-201.6-108.8-44.8 0-92.8 12.8-131.2 38.4-112 73.6-147.2 220.8-73.6 332.8 44.8 64 121.6 105.6 201.6 108.8 44.8 0 92.8-12.8 131.2-38.4 112-73.6 147.2-220.8 73.6-332.8z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="male" unicode="" d="M889.6 800h-240s-35.2 0-38.4-41.6c0-19.2 16-38.4 38.4-38.4h140.8l-179.2-179.2C556.8 582.4 489.6 608 416 608 240 608 96 464 96 288s144-320 320-320 320 144 320 320c0 73.6-25.6 140.8-67.2 195.2l179.2 179.2v-140.8c0-22.4 19.2-38.4 38.4-38.4 22.4 0 38.4 19.2 38.4 41.6V764.8h3.2C924.8 800 889.6 800 889.6 800zM416 48c-131.2 0-236.8 105.6-236.8 236.8 0 131.2 105.6 236.8 236.8 236.8s236.8-105.6 236.8-236.8c0-131.2-105.6-236.8-236.8-236.8z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="screen-restore" unicode="" d="M582.6 454.6v320h50V540l274 274 35.4-35.4-274-274h234.6v-50h-320zM117.4-46l274 274v-234.6h50v320h-320v-50H356l-274-274 35.4-35.4zM132 764h302V814H82v-352h50V764z m760-760H590v-50h352V306h-50v-302z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="password" unicode="" d="M519.2 343.29999999999995c-41.1 0-74.4-33.3-74.4-74.4 0-29.7 17.5-55 42.5-67.1v-81.9c0-17.6 14.3-31.9 31.9-31.9 17.6 0 31.9 14.3 31.9 31.9v81.9c25.1 12 42.5 37.4 42.5 66.9 0 41.3-33.2 74.6-74.4 74.6zM827.6-62.10000000000002H189.4c-35.9 0-65.1 29.2-65.1 65.1V428.4c0 35.9 29.2 65.1 65.1 65.1h638.2c17.3 0 33.7-6.7 46-19.1 12.3-12.3 19.1-28.7 19.1-46V3c0-35.9-29.2-65.1-65.1-65.1zM231.9 427.2c-34.8 0-41.3-6.6-41.3-41.3v-340.4c0-34.8 6.6-41.3 41.3-41.3h553.2c34.8 0 41.3 6.6 41.3 41.3V385.9c0 34.8-6.6 41.3-41.3 41.3H231.9zM519.2 86.70000000000005c-18.3 0-33.2 14.8-33.2 33.2V201c-26.3 12.8-42.6 38.8-42.6 67.8 0 41.8 33.9 75.7 75.7 75.7s75.7-33.9 75.7-75.7c0-29-16.3-55-42.5-67.8v-81.1c0.1-18.2-14.9-33.2-33.1-33.2zM519.2 342c-40.4 0-73.2-32.9-73.2-73.2 0-28.3 16.1-53.6 41.9-65.8l0.7-0.4V120c0-17 13.7-30.7 30.7-30.7S550 103.10000000000002 550 120v82.6l0.7 0.4c25.8 12.3 41.9 37.5 41.9 65.8-0.2 40.4-33.1 73.2-73.4 73.2zM207 523.1c-9.1 0-17.6 3.5-23.9 10-6.4 6.4-10 15-10 23.9v2h-0.2l0.2 1.4c0.1 0.5 0.1 0.9 0.2 1.4l0.2 1c0.1 0.6 0.2 1.4 0.4 2 15.3 75.7 57 144.2 117.2 193 29.9 24.2 63.4 43 99.8 56 37.5 13.3 77 20.2 117.5 20.2 61 0 120.8-16.3 173-47.2 50.6-29.9 93-72.8 122.5-123.8 4-5.6 6.1-12.2 6.1-19.2 0-18.3-15-33.3-33.3-33.3-13.2 0-25.1 7.7-30.4 19.8-49.2 84.6-140.4 137.4-238 137.4-128.1 0-238.2-87.1-267.6-211.8v-0.2c-0.7-18.4-15.4-32.6-33.7-32.6z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="senior" unicode="" d="M719.9 249.39999999999998L514.7 379.5V485.1C615.6 419 731.5 344 731.5 344s139.2-45.6 139.2 106.5c0 93-172.5 112.1-197.2 11.8l-69.6 47.3s24.2 101.5 162.4 106.5c138.2 4.9 192-94.6 190.9-199.6-1.2-104.7-136-198.3-237.3-167.1zM561 414c-4-19-23-33.7-47.6-33.7l-6.9 4.3-217.3 137.8S171 555.2 160.8 439c-10.2-116.1 147.4-129.5 186.8-23.8l81.7-47.6s-65.1-119.1-198.5-119.1C97.3 248.5 0.6 423.8 114 546.3c113.5 122.4 218.6 64.6 257 35.7 16.4-12.4 85.3-57.9 158.6-105.9l3.1-2.4c28.3-18.2 33.4-35.6 28.3-59.7zM434.1 149.70000000000005h212c16.7 0 30.3-13.6 30.3-30.3v-15.1c0-16.7-13.6-30.3-30.3-30.3h-212c-16.7 0-30.3 13.6-30.3 30.3v15.1c0 16.8 13.6 30.3 30.3 30.3z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="theme" unicode="" d="M512 800C229.696 800 0 570.304 0 288c0-90.368 30.304-174.496 85.344-236.896 55.264-62.624 129.152-97.12 208.128-97.12 81.568 0 161.536 36.832 231.264 106.592l2.272 2.496c65.792 81.472 132.896 121.056 205.088 121.056 46.72 0 89.216-15.872 126.688-29.92 30.336-11.328 56.576-21.12 81.216-21.12C1024 133.08799999999997 1024 241.664 1024 288c0 282.304-229.696 512-512 512z m428-602.912c-13.088 0-35.296 8.288-58.784 17.088-40.48 15.136-90.848 33.952-149.12 33.952-92.352 0-175.328-46.944-253.76-143.456-57.184-56.704-121.056-86.688-184.832-86.688-60.352 0-117.216 26.784-160.128 75.456C88.64 144.12800000000004 64 213.216 64 288 64 535.04 264.96 736 512 736s448-200.96 448-448c0-27.328-1.952-90.912-20-90.912zM800.704 379.93600000000004m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM457.024 582.624m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM672.704 555.9359999999999m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM291.392 443.936m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM278.4 197.24800000000005m-96 0a96 96 0 1 1 192 0 96 96 0 1 1-192 0Z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="tread" unicode="" d="M860.8 172.79999999999995l6.4-57.6-6.4 57.6c12.8 0 25.6 3.2 35.2 12.8 6.4 9.6 6.4 22.4 3.2 32l57.6 12.8-57.6-12.8L800 553.6c-6.4 28.8-25.6 51.2-48 64-9.6 6.4-22.4 9.6-32 9.6H182.4c-22.4 3.2-41.6-6.4-51.2-25.6-6.4-9.6-6.4-19.2-9.6-28.8v-342.4c0-19.2 9.6-38.4 28.8-48 6.4-3.2 12.8-6.4 19.2-6.4h192l19.2-25.6 147.2-188.8c6.4-9.6 19.2-12.8 28.8-9.6 16 3.2 25.6 19.2 22.4 35.2l-9.6 118.4-6.4 67.2h297.6z m-233.6-57.6l9.6-128c3.2-28.8-9.6-54.4-28.8-73.6-35.2-32-92.8-28.8-124.8 6.4l-156.8 195.2H179.2c-19.2 0-38.4 6.4-57.6 16-35.2 19.2-57.6 57.6-57.6 99.2V572.8c0 19.2 6.4 38.4 16 57.6 19.2 38.4 57.6 60.8 99.2 54.4h537.6c67.2-3.2 121.6-48 137.6-112l102.4-339.2c6.4-28.8 3.2-57.6-12.8-80-19.2-22.4-48-38.4-76.8-38.4h-240zM304 627.2v-451.2h57.6V627.2H304z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="praise" unicode="" d="M860.8 595.2h-297.6l6.4 67.2 9.6 118.4c3.2 16-6.4 32-22.4 35.2-9.6 3.2-22.4 0-28.8-9.6l-147.2-188.8-19.2-25.6h-192c-6.4 0-12.8-3.2-19.2-6.4-19.2-9.6-28.8-28.8-28.8-48v-342.4c0-9.6 3.2-22.4 9.6-28.8 9.6-19.2 28.8-28.8 48-25.6h537.6c12.8 0 22.4 3.2 32 9.6 25.6 12.8 44.8 35.2 48 64l102.4 336 57.6-12.8-57.6 12.8c3.2 9.6 0 22.4-3.2 32-9.6 6.4-22.4 12.8-35.2 12.8l6.4 57.6-6.4-57.6z m-233.6 57.6h240c28.8 0 57.6-12.8 76.8-38.4 16-22.4 19.2-54.4 12.8-80l-102.4-339.2c-16-64-70.4-108.8-137.6-112H179.2c-41.6-3.2-80 19.2-99.2 54.4-9.6 19.2-16 38.4-16 57.6V537.6c0 41.6 22.4 80 57.6 99.2 19.2 9.6 38.4 12.8 57.6 16h144L480 848c32 35.2 89.6 38.4 124.8 6.4 19.2-19.2 32-44.8 28.8-73.6l-6.4-128z m-323.2-512h57.6V592H304v-451.2z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="star-fill" unicode="" d="M752-43.200000000000045c-9.6 0-20.8 3.2-30.4 8l-208 104-209.6-104c-20.8-11.2-48-9.6-67.2 4.8-19.2 14.4-30.4 40-25.6 64l43.2 224L89.6 411.2C72 428.8 65.6 456 72 478.4c8 24 27.2 41.6 52.8 44.8l228.8 41.6 102.4 208c11.2 22.4 33.6 36.8 57.6 36.8s48-14.4 57.6-36.8l102.4-208 228.8-40c24-3.2 44.8-20.8 51.2-44.8 8-24 1.6-49.6-16-67.2L772.8 257.6l41.6-224c4.8-25.6-6.4-49.6-25.6-64-9.6-8-22.4-12.8-36.8-12.8z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="rate" unicode="" d="M959.008 489.984l-308 47.008L512 832 372.992 536.992l-308-47.008 223.008-228-52.992-324L512 90.976l276.992-152.992-52.992 324zM512 156L304 39.00800000000004l40 235.008-179.008 182.016 242.016 32 104.992 224 104-224 240.992-34.016L680 273.024l36.992-235.008z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="template-1" unicode="" d="M512 384zM43.52 601.6l409.6-176.64c58.88-30.72 110.08 0 110.08 0l414.72 174.08 2.56 2.56c10.24 5.12 15.36 15.36 15.36 28.16 0 15.36-10.24 28.16-23.04 30.72L563.2 837.12c-56.32 23.04-97.28 0-97.28 0L46.08 660.48c-12.8-5.12-20.48-17.92-20.48-30.72s7.68-23.04 17.92-28.16z m0 0M512 222.72000000000003c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 12.8 20.48 17.92 33.28 12.8L512 276.48 988.16 486.4c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04c-2.56-2.56-7.68-2.56-10.24-2.56zM512 71.67999999999995c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 10.24 20.48 17.92 33.28 10.24L512 125.44000000000005 988.16 332.79999999999995c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04H512zM512-79.36000000000001c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 12.8 20.48 17.92 33.28 12.8L512-25.600000000000023l476.16 209.92c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04c-2.56-2.56-7.68-2.56-10.24-2.56z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="vercode" unicode="" d="M513.807059-128C351.171765-128 58.428235 126.19294100000002 54.211765 376.16941199999997V662.287059a93.364706 93.364706 0 0 0 81.317647 88.545882 570.428235 570.428235 0 0 1 163.237647 40.357647A393.336471 393.336471 0 0 1 446.945882 872.508235a101.797647 101.797647 0 0 0 120.470589 5.421177A629.458824 629.458824 0 0 1 716.8 792.395294a1255.303529 1255.303529 0 0 1 169.863529-38.550588 98.785882 98.785882 0 0 0 79.510589-90.955294 2911.171765 2911.171765 0 0 0-3.011765-291.538824C924.611765 49.09176500000001 672.828235-128 513.807059-128z m0 963.764706a39.152941 39.152941 0 0 1-24.696471-7.830588A438.512941 438.512941 0 0 0 319.247059 734.569412a608.376471 608.376471 0 0 0-180.705883-43.369412 33.731765 33.731765 0 0 1-24.094117-30.117647v-283.708235C118.663529 155.10588199999995 389.722353-67.76470600000005 513.807059-67.76470600000005s354.183529 148.178824 391.529412 444.536471c9.035294 175.887059 0 281.901176 0 283.105882a38.550588 38.550588 0 0 1-29.515295 33.731765 1287.830588 1287.830588 0 0 0-180.705882 41.562353A676.442353 676.442353 0 0 0 536.094118 829.741176a37.345882 37.345882 0 0 1-24.094118 6.02353zM784.865882 479.171765L487.905882 198.47529399999996a40.357647 40.357647 0 0 0-49.392941-4.818823l-7.830588 6.625882-161.430588 171.068235a40.357647 40.357647 0 1 0 60.235294 55.416471l133.722353-141.552941 267.444706 252.988235a40.357647 40.357647 0 1 0 55.41647-60.235294" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="cellphone" unicode="" d="M785.066667 896H238.933333a102.4 102.4 0 0 1-102.4-102.4v-819.2a102.4 102.4 0 0 1 102.4-102.4h546.133334a102.4 102.4 0 0 1 102.4 102.4V793.6a102.4 102.4 0 0 1-102.4 102.4zM238.933333 827.733333h546.133334a34.133333 34.133333 0 0 0 34.133333-34.133333v-648.533333H204.8V793.6a34.133333 34.133333 0 0 0 34.133333 34.133333z m546.133334-887.466666H238.933333a34.133333 34.133333 0 0 0-34.133333 34.133333v102.4h614.4v-102.4a34.133333 34.133333 0 0 0-34.133333-34.133333zM512 8.53333299999997m-34.133333 0a34.133333 34.133333 0 1 1 68.266666 0 34.133333 34.133333 0 1 1-68.266666 0ZM426.666667 725.333333h170.666666a17.066667 17.066667 0 0 1 0 34.133334h-170.666666a17.066667 17.066667 0 0 1 0-34.133334z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="print" unicode="" d="M843.946667 603.733333h-47.36V725.333333a90.026667 90.026667 0 0 1-94.72 85.333334H312.32a81.493333 81.493333 0 0 1-85.333333-85.333334v-121.6H170.666667a81.493333 81.493333 0 0 1-85.333334-85.333333v-325.12a89.173333 89.173333 0 0 1 85.333334-93.866667h56.746666v-52.48a89.6 89.6 0 0 1 89.6-89.6h389.973334a89.6 89.6 0 0 1 89.6 89.6v52.48h47.36a97.706667 97.706667 0 0 1 94.72 93.866667V518.4a90.026667 90.026667 0 0 1-94.72 85.333333zM279.466667 725.333333a30.72 30.72 0 0 0 32.853333 33.706667h389.546667c18.773333 0 42.666667-11.52 42.666666-33.706667v-121.6H279.466667z m465.066666-678.4a37.546667 37.546667 0 0 0-37.546666-37.973333H317.013333a37.546667 37.546667 0 0 0-37.546666 37.973333v170.666667a37.546667 37.546667 0 0 0 37.546666 38.4h389.973334a37.546667 37.546667 0 0 0 37.546666-37.973333z m142.506667 146.346667a45.653333 45.653333 0 0 0-42.666667-42.666667h-47.786666v66.133334a89.6 89.6 0 0 1-89.6 89.6H317.013333a89.6 89.6 0 0 1-89.6-89.6v-65.28H170.666667a37.546667 37.546667 0 0 0-33.28 42.666666v324.266667A31.146667 31.146667 0 0 0 170.666667 552.106667h673.28c19.2 0 42.666667-11.52 42.666666-33.706667z m-640 281.173333h-37.546667a13.226667 13.226667 0 0 0 0 26.026667h38.826667a13.226667 13.226667 0 1 0 0-26.026667z m94.293333 0H298.666667a13.226667 13.226667 0 1 0 0 26.026667h42.666666a13.226667 13.226667 0 0 0 0-26.026667z m426.666667-116.48H248.32a13.226667 13.226667 0 0 0 0 26.026667H768a13.226667 13.226667 0 0 0 0-26.026667z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="cols" unicode="" d="M128 448h384V832H128z m64 320h256v-256H192zM576 832v-384h384V832z m320-320H640V768h256zM192 384h64v-384H192zM384 384h64v-384H384zM640 384h64v-384H640zM832 384h64v-384h-64z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="export" unicode="" d="M896.4374528 479.830016c0 26.673152-21.6236032 48.2967552-48.2967552 48.2967552H630.8069376c-26.673152 0-48.2967552-21.6236032-48.2967552-48.2967552v-83.04831147H384.69522773l-2.71428266 5.36849067c-41.336832 87.44686933-35.95195733 204.128256 150.601728 199.94487467v-108.91537067l172.19037866 164.757504L532.58267307 822.7110912v-106.57245867c-228.64418133 5.70709333-263.651328-183.517184-157.433856-314.01028266l4.6891008-5.34664534h-88.46595414c-26.673152 0-48.2967552-21.6236032-48.2967552-48.2967552v-66.78882986h-98.43616426c-26.673152 0-40.4258816-21.6236032-30.71781547-48.2967552l79.10304427-217.33485227c9.70806613-26.673152 39.20145067-48.2967552 65.87460266-48.2967552h603.70670934c23.75898453 0 37.2506624 17.16169387 33.05745066 39.76178347 0.4980736 2.77108053 0.77441707 5.619712 0.77441707 8.53497173v463.765504z m-60.37067093-306.4528896l-21.8464256 60.02223787c-9.70806613 26.673152-39.20145067 48.2967552-65.87460267 48.2967552H303.44697173v30.56708266c0 13.336576 10.81125547 24.14783147 24.14783147 24.14783147h315.28605013v107.1972352c0 13.336576 10.81125547 24.14783147 24.14783147 24.14783147h144.88917333c13.336576 0 24.14783147-10.81125547 24.14783147-24.14783147v-270.2311424z" horiz-adv-x="1024" />
+
+
+ <glyph glyph-name="slider" unicode="" d="M228.7 683.9v-66.7H112v66.7h116.7z m333.2-266.6v-66.7H112v66.7h449.9zM295.4 150.60000000000002V84H112v66.7h183.4v-0.1z m116.6 600c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H278.8c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.3-9.9 23.5V717.1c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.3 9.9 23.5 9.9h133.3v0.1h-0.1z m66.7-533.3c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H345.3c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.5-9.9 23.5V183.89999999999998c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.3 9.9 23.5 9.9h133.4v0.1zM912 683.9v-66.7H462.1v66.7H912z m0-533.3V84H528.6v66.7h383.3v-0.1h0.1zM745.2 483.9c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H612c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.3-9.9 23.5V450.6c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.5 9.9 23.5 9.9l133.2-0.1zM912 417.3v-66.7H795.3v66.7H912z" horiz-adv-x="1024" />
+
+
+
+
+ </font>
+</defs></svg>
diff --git a/payapi/src/main/resources/static/libs/layui/font/iconfont.ttf b/payapi/src/main/resources/static/libs/layui/font/iconfont.ttf
new file mode 100755
index 0000000..0c8b0a5
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/font/iconfont.ttf
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/font/iconfont.woff b/payapi/src/main/resources/static/libs/layui/font/iconfont.woff
new file mode 100755
index 0000000..786bb2a
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/font/iconfont.woff
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/0.gif b/payapi/src/main/resources/static/libs/layui/images/face/0.gif
new file mode 100755
index 0000000..a63f0d5
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/0.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/1.gif b/payapi/src/main/resources/static/libs/layui/images/face/1.gif
new file mode 100755
index 0000000..b2b78b2
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/1.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/10.gif b/payapi/src/main/resources/static/libs/layui/images/face/10.gif
new file mode 100755
index 0000000..556c7e3
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/10.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/11.gif b/payapi/src/main/resources/static/libs/layui/images/face/11.gif
new file mode 100755
index 0000000..2bfc58b
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/11.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/12.gif b/payapi/src/main/resources/static/libs/layui/images/face/12.gif
new file mode 100755
index 0000000..1c321c7
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/12.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/13.gif b/payapi/src/main/resources/static/libs/layui/images/face/13.gif
new file mode 100755
index 0000000..300bbc2
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/13.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/14.gif b/payapi/src/main/resources/static/libs/layui/images/face/14.gif
new file mode 100755
index 0000000..43b6d0a
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/14.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/15.gif b/payapi/src/main/resources/static/libs/layui/images/face/15.gif
new file mode 100755
index 0000000..c9f25fa
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/15.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/16.gif b/payapi/src/main/resources/static/libs/layui/images/face/16.gif
new file mode 100755
index 0000000..34f28e4
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/16.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/17.gif b/payapi/src/main/resources/static/libs/layui/images/face/17.gif
new file mode 100755
index 0000000..39cd035
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/17.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/18.gif b/payapi/src/main/resources/static/libs/layui/images/face/18.gif
new file mode 100755
index 0000000..7bce299
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/18.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/19.gif b/payapi/src/main/resources/static/libs/layui/images/face/19.gif
new file mode 100755
index 0000000..adac542
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/19.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/2.gif b/payapi/src/main/resources/static/libs/layui/images/face/2.gif
new file mode 100755
index 0000000..7edbb58
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/2.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/20.gif b/payapi/src/main/resources/static/libs/layui/images/face/20.gif
new file mode 100755
index 0000000..50631a6
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/20.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/21.gif b/payapi/src/main/resources/static/libs/layui/images/face/21.gif
new file mode 100755
index 0000000..b984212
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/21.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/22.gif b/payapi/src/main/resources/static/libs/layui/images/face/22.gif
new file mode 100755
index 0000000..1f0bd8b
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/22.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/23.gif b/payapi/src/main/resources/static/libs/layui/images/face/23.gif
new file mode 100755
index 0000000..e05e0f9
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/23.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/24.gif b/payapi/src/main/resources/static/libs/layui/images/face/24.gif
new file mode 100755
index 0000000..f35928a
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/24.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/25.gif b/payapi/src/main/resources/static/libs/layui/images/face/25.gif
new file mode 100755
index 0000000..0b4a883
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/25.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/26.gif b/payapi/src/main/resources/static/libs/layui/images/face/26.gif
new file mode 100755
index 0000000..45c4fb5
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/26.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/27.gif b/payapi/src/main/resources/static/libs/layui/images/face/27.gif
new file mode 100755
index 0000000..7a4c013
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/27.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/28.gif b/payapi/src/main/resources/static/libs/layui/images/face/28.gif
new file mode 100755
index 0000000..fc5a0cf
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/28.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/29.gif b/payapi/src/main/resources/static/libs/layui/images/face/29.gif
new file mode 100755
index 0000000..5dd7442
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/29.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/3.gif b/payapi/src/main/resources/static/libs/layui/images/face/3.gif
new file mode 100755
index 0000000..86df67b
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/3.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/30.gif b/payapi/src/main/resources/static/libs/layui/images/face/30.gif
new file mode 100755
index 0000000..b751f98
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/30.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/31.gif b/payapi/src/main/resources/static/libs/layui/images/face/31.gif
new file mode 100755
index 0000000..c9476d7
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/31.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/32.gif b/payapi/src/main/resources/static/libs/layui/images/face/32.gif
new file mode 100755
index 0000000..9931b06
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/32.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/33.gif b/payapi/src/main/resources/static/libs/layui/images/face/33.gif
new file mode 100755
index 0000000..59111a3
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/33.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/34.gif b/payapi/src/main/resources/static/libs/layui/images/face/34.gif
new file mode 100755
index 0000000..a334548
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/34.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/35.gif b/payapi/src/main/resources/static/libs/layui/images/face/35.gif
new file mode 100755
index 0000000..a932264
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/35.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/36.gif b/payapi/src/main/resources/static/libs/layui/images/face/36.gif
new file mode 100755
index 0000000..6de432a
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/36.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/37.gif b/payapi/src/main/resources/static/libs/layui/images/face/37.gif
new file mode 100755
index 0000000..d05f2da
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/37.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/38.gif b/payapi/src/main/resources/static/libs/layui/images/face/38.gif
new file mode 100755
index 0000000..8b1c88a
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/38.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/39.gif b/payapi/src/main/resources/static/libs/layui/images/face/39.gif
new file mode 100755
index 0000000..38b84a5
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/39.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/4.gif b/payapi/src/main/resources/static/libs/layui/images/face/4.gif
new file mode 100755
index 0000000..d52200c
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/4.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/40.gif b/payapi/src/main/resources/static/libs/layui/images/face/40.gif
new file mode 100755
index 0000000..ae42991
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/40.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/41.gif b/payapi/src/main/resources/static/libs/layui/images/face/41.gif
new file mode 100755
index 0000000..b9c715c
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/41.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/42.gif b/payapi/src/main/resources/static/libs/layui/images/face/42.gif
new file mode 100755
index 0000000..0eb1434
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/42.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/43.gif b/payapi/src/main/resources/static/libs/layui/images/face/43.gif
new file mode 100755
index 0000000..ac0b700
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/43.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/44.gif b/payapi/src/main/resources/static/libs/layui/images/face/44.gif
new file mode 100755
index 0000000..ad44497
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/44.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/45.gif b/payapi/src/main/resources/static/libs/layui/images/face/45.gif
new file mode 100755
index 0000000..6837fca
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/45.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/46.gif b/payapi/src/main/resources/static/libs/layui/images/face/46.gif
new file mode 100755
index 0000000..d62916d
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/46.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/47.gif b/payapi/src/main/resources/static/libs/layui/images/face/47.gif
new file mode 100755
index 0000000..58a0836
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/47.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/48.gif b/payapi/src/main/resources/static/libs/layui/images/face/48.gif
new file mode 100755
index 0000000..7ffd161
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/48.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/49.gif b/payapi/src/main/resources/static/libs/layui/images/face/49.gif
new file mode 100755
index 0000000..959b992
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/49.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/5.gif b/payapi/src/main/resources/static/libs/layui/images/face/5.gif
new file mode 100755
index 0000000..4e8b09f
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/5.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/50.gif b/payapi/src/main/resources/static/libs/layui/images/face/50.gif
new file mode 100755
index 0000000..6e22e7f
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/50.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/51.gif b/payapi/src/main/resources/static/libs/layui/images/face/51.gif
new file mode 100755
index 0000000..ad3f4d3
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/51.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/52.gif b/payapi/src/main/resources/static/libs/layui/images/face/52.gif
new file mode 100755
index 0000000..39f8a22
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/52.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/53.gif b/payapi/src/main/resources/static/libs/layui/images/face/53.gif
new file mode 100755
index 0000000..a181ee7
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/53.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/54.gif b/payapi/src/main/resources/static/libs/layui/images/face/54.gif
new file mode 100755
index 0000000..e289d92
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/54.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/55.gif b/payapi/src/main/resources/static/libs/layui/images/face/55.gif
new file mode 100755
index 0000000..4351083
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/55.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/56.gif b/payapi/src/main/resources/static/libs/layui/images/face/56.gif
new file mode 100755
index 0000000..e0eff22
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/56.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/57.gif b/payapi/src/main/resources/static/libs/layui/images/face/57.gif
new file mode 100755
index 0000000..0bf130f
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/57.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/58.gif b/payapi/src/main/resources/static/libs/layui/images/face/58.gif
new file mode 100755
index 0000000..0f06508
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/58.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/59.gif b/payapi/src/main/resources/static/libs/layui/images/face/59.gif
new file mode 100755
index 0000000..7081e4f
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/59.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/6.gif b/payapi/src/main/resources/static/libs/layui/images/face/6.gif
new file mode 100755
index 0000000..f7715bf
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/6.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/60.gif b/payapi/src/main/resources/static/libs/layui/images/face/60.gif
new file mode 100755
index 0000000..6e15f89
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/60.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/61.gif b/payapi/src/main/resources/static/libs/layui/images/face/61.gif
new file mode 100755
index 0000000..f092d7e
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/61.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/62.gif b/payapi/src/main/resources/static/libs/layui/images/face/62.gif
new file mode 100755
index 0000000..7fe4984
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/62.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/63.gif b/payapi/src/main/resources/static/libs/layui/images/face/63.gif
new file mode 100755
index 0000000..cf8e23e
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/63.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/64.gif b/payapi/src/main/resources/static/libs/layui/images/face/64.gif
new file mode 100755
index 0000000..a779719
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/64.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/65.gif b/payapi/src/main/resources/static/libs/layui/images/face/65.gif
new file mode 100755
index 0000000..7bb98f2
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/65.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/66.gif b/payapi/src/main/resources/static/libs/layui/images/face/66.gif
new file mode 100755
index 0000000..bb6d077
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/66.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/67.gif b/payapi/src/main/resources/static/libs/layui/images/face/67.gif
new file mode 100755
index 0000000..6e33f7c
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/67.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/68.gif b/payapi/src/main/resources/static/libs/layui/images/face/68.gif
new file mode 100755
index 0000000..1a6c400
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/68.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/69.gif b/payapi/src/main/resources/static/libs/layui/images/face/69.gif
new file mode 100755
index 0000000..a02f0b2
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/69.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/7.gif b/payapi/src/main/resources/static/libs/layui/images/face/7.gif
new file mode 100755
index 0000000..e6d4db8
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/7.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/70.gif b/payapi/src/main/resources/static/libs/layui/images/face/70.gif
new file mode 100755
index 0000000..416c5c1
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/70.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/71.gif b/payapi/src/main/resources/static/libs/layui/images/face/71.gif
new file mode 100755
index 0000000..c17d60c
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/71.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/8.gif b/payapi/src/main/resources/static/libs/layui/images/face/8.gif
new file mode 100755
index 0000000..66f967b
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/8.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/images/face/9.gif b/payapi/src/main/resources/static/libs/layui/images/face/9.gif
new file mode 100755
index 0000000..6044740
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/images/face/9.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/carousel.js b/payapi/src/main/resources/static/libs/layui/lay/modules/carousel.js
new file mode 100755
index 0000000..2be2c8c
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/carousel.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['<button class="layui-icon '+u+'" lay-type="sub">'+("updown"===n.anim?"":"")+"</button>",'<button class="layui-icon '+u+'" lay-type="add">'+("updown"===n.anim?"":"")+"</button>"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['<div class="'+c+'"><ul>',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("<li"+(n.index===e?' class="layui-this"':"")+"></li>")}),i.join("")}(),"</ul></div>"].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a<n.index&&e.slide("sub",n.index-a)})},m.prototype.slide=function(e,i){var n=this,l=n.elemItem,u=n.config,c=u.index,m=u.elem.attr("lay-filter");n.haveSlide||("sub"===e?(n.subIndex(i),l.eq(u.index).addClass(d),setTimeout(function(){l.eq(c).addClass(r),l.eq(u.index).addClass(r)},50)):(n.addIndex(i),l.eq(u.index).addClass(s),setTimeout(function(){l.eq(c).addClass(o),l.eq(u.index).addClass(o)},50)),setTimeout(function(){l.removeClass(a+" "+d+" "+s+" "+o+" "+r),l.eq(u.index).addClass(a),n.haveSlide=!1},300),n.elemInd.find("li").eq(u.index).addClass(a).siblings().removeClass(a),n.haveSlide=!0,layui.event.call(this,t,"change("+m+")",{index:u.index,prevIndex:c,item:l.eq(u.index)}))},m.prototype.events=function(){var e=this,i=e.config;i.elem.data("haveEvents")||(i.elem.on("mouseenter",function(){clearInterval(e.timer)}).on("mouseleave",function(){e.autoplay()}),i.elem.data("haveEvents",!0))},n.render=function(e){var i=new m(e);return i},e(t,n)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/code.js b/payapi/src/main/resources/static/libs/layui/lay/modules/code.js
new file mode 100755
index 0000000..b33f9d6
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/code.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('<ol class="layui-code-ol"><li>'+o.replace(/[\r\t\n]+/g,"</li><li>")+"</li></ol>"),c.find(">.layui-code-h3")[0]||c.prepend('<h3 class="layui-code-h3">'+(c.attr("lay-title")||e.title||"code")+(e.about?'<a href="'+l+'" target="_blank">layui.code</a>':"")+"</h3>");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss");
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/colorpicker.js b/payapi/src/main/resources/static/libs/layui/lay/modules/colorpicker.js
new file mode 100755
index 0000000..fd99bf8
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/colorpicker.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['<div class="layui-unselect layui-colorpicker">',"<span "+("rgb"==o.format&&o.alpha?'class="layui-colorpicker-trigger-bgcolor"':"")+">",'<span class="layui-colorpicker-trigger-span" ','lay-type="'+("rgb"==o.format?o.alpha?"rgba":"torgb":"")+'" ','style="'+function(){var e="";return o.color?(e=o.color,(o.color.match(/[0-9]{1,3}/g)||[]).length>3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','<i class="layui-icon layui-colorpicker-trigger-i '+(o.color?a:s)+'"></i>',"</span>","</span>","</div>"].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['<div id="layui-colorpicker'+e.index+'" data-index="'+e.index+'" class="layui-anim layui-anim-upbit layui-colorpicker-main">','<div class="layui-colorpicker-main-wrapper">','<div class="layui-colorpicker-basis">','<div class="layui-colorpicker-basis-white"></div>','<div class="layui-colorpicker-basis-black"></div>','<div class="layui-colorpicker-basis-cursor"></div>',"</div>",'<div class="layui-colorpicker-side">','<div class="layui-colorpicker-side-slider"></div>',"</div>","</div>",'<div class="layui-colorpicker-main-alpha '+(o.alpha?n:"")+'">','<div class="layui-colorpicker-alpha-bgcolor">','<div class="layui-colorpicker-alpha-slider"></div>',"</div>","</div>",function(){if(o.predefine){var e=['<div class="layui-colorpicker-main-pre">'];return layui.each(o.colors,function(i,o){e.push(['<div class="layui-colorpicker-pre'+((o.match(/[0-9]{1,3}/g)||[]).length>3?" layui-colorpicker-pre-isalpha":"")+'">','<div style="background:'+o+'"></div>',"</div>"].join(""))}),e.push("</div>"),e.join("")}return""}(),'<div class="layui-colorpicker-main-input">','<div class="layui-inline">','<input type="text" class="layui-input">',"</div>",'<div class="layui-btn-container">','<button class="layui-btn layui-btn-primary layui-btn-sm" colorpicker-events="clear">清空</button>','<button class="layui-btn layui-btn-sm" colorpicker-events="confirm">确定</button>',"</div","</div>","</div>"].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:f<s&&(f=s),d+l+s>a()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['<div class="layui-auxiliar-moving" id="LAY-colorpicker-moving"></div'].join("")),Y=function(e){i("#LAY-colorpicker-moving")[0]||i("body").append(M),M.on("mousemove",e),M.on("mouseup",function(){M.remove()}).on("mouseleave",function(){M.remove()})};l.on("mousedown",function(e){var i=this.offsetTop,o=e.clientY,r=function(e){var r=i+(e.clientY-o),t=n[0].offsetHeight;r<0&&(r=0),r>t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/element.js b/payapi/src/main/resources/static/libs/layui/lay/modules/element.js
new file mode 100755
index 0000000..ac628df
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/element.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='<li lay-id="'+(i.id||"")+'"'+(i.attr?' lay-attr="'+i.attr+'"':"")+">"+(i.title||"unnaming")+"</li>";return s[0]?s.before(r):n.append(r),o.append('<div class="layui-tab-item">'+(i.content||"")+"</div>"),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('<span class="layui-unselect layui-tab-bar" '+r+"><i "+r+' class="layui-icon"></i></span>');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('<i class="layui-icon layui-unselect '+l+'">ဆ</i>');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a('<span class="'+c+'"></span>'),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append('<span class="'+y+'"></span>'),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after("<span "+i+">"+e+"</span>")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html('<span class="'+t+'-text">'+l+"</span>")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append('<i class="layui-icon layui-colla-icon">'+(l?"":"")+"</i>"),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/flow.js b/payapi/src/main/resources/static/libs/layui/lay/modules/flow.js
new file mode 100755
index 0000000..8a80c05
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/flow.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='<i class="layui-anim layui-anim-rotate layui-anim-loop layui-icon "></i>';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="<cite>加载更多</cite>",h=l('<div class="layui-flow-more"><a href="javascript:;">'+d+"</a></div>");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;s<t.lazyimg.elem.length;s++){var v=t.lazyimg.elem.eq(s),y=a?function(){return v.offset().top-n.offset().top+m}():v.offset().top;if(c(v,f),i=s,y>u)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/form.js b/payapi/src/main/resources/static/libs/layui/lay/modules/form.js
new file mode 100755
index 0000000..daa8ce5
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/form.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=t(r+'[lay-filter="'+e+'"]');a.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value===t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e)},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),x=i.find("dl"),g=x.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=x.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),g.removeClass(o),y=null,g.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),$()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||T(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},$=function(){var e=x.children("dd."+s);if(e[0]){var t=e.position().top,i=x.height(),a=e.height();t>i&&x.scrollTop(t+x.scrollTop()-i+a-5),t<0&&x.scrollTop(t+x.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),x.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=x.children("dd."+s);if(x.children("dd."+o)[0]&&"next"===t){var i=x.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n<e.index()&&!i.hasClass(s))return i.eq(0).prev()[0]?i.eq(0).prev():x.children(":last")}return a&&a[0]?a:y&&y[0]?y:e}();return l=r[t](),n=r[t]("dd:not(."+o+")"),l[0]?(y=r[t](),n[0]&&!n.hasClass(c)||!y[0]?(n.addClass(s).siblings().removeClass(s),void $()):i(t,y)):y=null};38===t&&i("prev"),40===t&&i("next"),13===t&&(e.preventDefault(),x.children("dd."+s).trigger("click"))});var T=function(e,i,a){var n=0;layui.each(g,function(){var i=t(this),l=i.text(),r=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:r)&&n++,"keyup"===a&&i[r?"addClass":"removeClass"](o)});var l=n===g.length;return i(l),l},j=function(e){var t=this.value,i=e.keyCode;return 9!==i&&13!==i&&37!==i&&38!==i&&39!==i&&40!==i&&(T(t,function(e){e?x.find("."+r)[0]||x.append('<p class="'+r+'">无匹配项</p>'):x.find("."+r).remove()},"keyup"),""===t&&x.find("."+r).remove(),void $())};f&&k.on("keyup",j).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){T(k.val(),function(e){d||k.val("")},"blur")},200)}),g.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['<div class="'+(h?"":"layui-unselect ")+a,(u?" layui-select-disabled":"")+'">','<div class="'+n+'">','<input type="text" placeholder="'+p+'" '+('value="'+(d?f.html():"")+'"')+(h?"":" readonly")+' class="layui-input'+(h?"":" layui-unselect")+(u?" "+c:"")+'">','<i class="layui-edge"></i></div>','<dl class="layui-anim layui-anim-upbit'+(r.find("optgroup")[0]?" layui-select-group":"")+'">',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("<dt>"+a.label+"</dt>"):t.push('<dd lay-value="'+a.value+'" class="'+(d===a.value?s:"")+(a.disabled?" "+c:"")+'">'+a.innerHTML+"</dd>"):t.push('<dd lay-value="" class="layui-select-tips">'+(a.innerHTML||i)+"</dd>")}),0===t.length&&t.push('<dd lay-value="" class="'+c+'">没有选项</dd>'),t.join("")}(r.find("*"))+"</dl>","</div>"].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['<div class="layui-unselect '+u[0],n.checked?" "+u[1]:"",o?" layui-checkbox-disbaled "+c:"",'"',r?' lay-skin="'+r+'"':"",">",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?"<span>"+n.title+"</span>":"",'<i class="layui-icon layui-icon-ok"></i>'].join(""),_switch:"<em>"+((n.checked?s[0]:s[1])||"")+"</em><i></i>"};return t[r]||t.checkbox}(),"</div>"].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=u.find("input[type=radio]"),n=function(a){var n=t(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['<div class="layui-unselect '+e,l.checked?" "+e+"ed":"",(o?" layui-radio-disbaled "+c:"")+'">','<i class="layui-anim layui-icon">'+i[l.checked?0:1]+"</i>","<div>"+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"</div>","</div>"].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=t(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),v=e.parents("form")[0],h=u.find("input,select,textarea"),y=e.attr("lay-filter");if(layui.each(d,function(e,l){var r=t(this),c=r.attr("lay-verify").split("|"),u=r.attr("lay-verType"),d=r.val();if(r.removeClass(o),layui.each(c,function(e,t){var c,f="",v="function"==typeof a[t];if(a[t]){var c=v?f=a[t](d,l):!a[t][0].test(d);if(f=f||a[t][1],c)return"tips"===u?i.tips(f,function(){return"string"==typeof r.attr("lay-ignore")||"select"!==l.tagName.toLowerCase()&&!/^checkbox|radio$/.test(l.type)?r:r.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}}),s)return s}),s)return!1;var p={};return layui.each(h,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];p[i]=0|p[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+p[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(c[t.name]=t.value)}}),layui.event.call(this,l,"submit("+y+")",{elem:this,form:v,field:c})},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/jquery.js b/payapi/src/main/resources/static/libs/layui/lay/modules/jquery.js
new file mode 100755
index 0000000..242696a
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/jquery.js
@@ -0,0 +1,5 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x<d;x++)if(a=e[x],a||0===a)if("object"===pe.type(a))pe.merge(v,a.nodeType?[a]:a);else if(Ue.test(a)){for(u=u||y.appendChild(t.createElement("div")),l=(We.exec(a)||["",""])[1].toLowerCase(),f=Xe[l]||Xe._default,u.innerHTML=f[1]+pe.htmlPrefilter(a)+f[2],o=f[0];o--;)u=u.lastChild;if(!fe.leadingWhitespace&&$e.test(a)&&v.push(t.createTextNode($e.exec(a)[0])),!fe.tbody)for(a="table"!==l||Ve.test(a)?"<table>"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r<i;r++)pe.event.add(t,n,s[n][r])}a.data&&(a.data=pe.extend({},a.data))}}function k(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!fe.noCloneEvent&&t[pe.expando]){i=pe._data(t);for(r in i.events)pe.removeEvent(t,r,i.handle);t.removeAttribute(pe.expando)}"script"===n&&t.text!==e.text?(C(t).text=e.text,E(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),fe.html5Clone&&e.innerHTML&&!pe.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Be.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}}function S(e,t,n,r){t=oe.apply([],t);var i,o,a,s,u,l,c=0,f=e.length,d=f-1,p=t[0],g=pe.isFunction(p);if(g||f>1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c<f;c++)o=l,c!==d&&(o=pe.clone(o,!0,!0),a&&pe.merge(s,h(o,"script"))),n.call(e[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,pe.map(s,E),c=0;c<a;c++)o=s[c],Ie.test(o.type||"")&&!pe._data(o,"globalEval")&&pe.contains(u,o)&&(o.src?pe._evalUrl&&pe._evalUrl(o.src):pe.globalEval((o.text||o.textContent||o.innerHTML||"").replace(ot,"")));l=i=null}return e}function A(e,t,n){for(var r,i=t?pe.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||pe.cleanData(h(r)),r.parentNode&&(n&&pe.contains(r.ownerDocument,r)&&g(h(r,"script")),r.parentNode.removeChild(r));return e}function D(e,t){var n=pe(t.createElement(e)).appendTo(t.body),r=pe.css(n[0],"display");return n.detach(),r}function j(e){var t=re,n=lt[e];return n||(n=D(e,t),"none"!==n&&n||(ut=(ut||pe("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a<s;a++)r=e[a],r.style&&(o[a]=pe._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Re(r)&&(o[a]=pe._data(r,"olddisplay",j(r.nodeName)))):(i=Re(r),(n&&"none"!==n||!i)&&pe._data(r,"olddisplay",i?n:pe.css(r,"display"))));for(a=0;a<s;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function _(e,t,n){var r=bt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function F(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;o<4;o+=2)"margin"===n&&(a+=pe.css(e,n+Oe[o],!0,i)),r?("content"===n&&(a-=pe.css(e,"padding"+Oe[o],!0,i)),"margin"!==n&&(a-=pe.css(e,"border"+Oe[o]+"Width",!0,i))):(a+=pe.css(e,"padding"+Oe[o],!0,i),"padding"!==n&&(a+=pe.css(e,"border"+Oe[o]+"Width",!0,i)));return a}function M(t,n,r){var i=!0,o="width"===n?t.offsetWidth:t.offsetHeight,a=ht(t),s=fe.boxSizing&&"border-box"===pe.css(t,"boxSizing",!1,a);if(re.msFullscreenElement&&e.top!==e&&t.getClientRects().length&&(o=Math.round(100*t.getBoundingClientRect()[n])),o<=0||null==o){if(o=gt(t,n,a),(o<0||null==o)&&(o=t.style[n]),ft.test(o))return o;i=s&&(fe.boxSizingReliable()||o===t.style[n]),o=parseFloat(o)||0}return o+F(t,n,r||(s?"border":"content"),i,a)+"px"}function O(e,t,n,r,i){return new O.prototype.init(e,t,n,r,i)}function R(){return e.setTimeout(function(){Nt=void 0}),Nt=pe.now()}function P(e,t){var n,r={height:e},i=0;for(t=t?1:0;i<4;i+=2-t)n=Oe[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function B(e,t,n){for(var r,i=($.tweeners[t]||[]).concat($.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function W(e,t,n){var r,i,o,a,s,u,l,c,f=this,d={},p=e.style,h=e.nodeType&&Re(e),g=pe._data(e,"fxshow");n.queue||(s=pe._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,u=s.empty.fire,s.empty.fire=function(){s.unqueued||u()}),s.unqueued++,f.always(function(){f.always(function(){s.unqueued--,pe.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],l=pe.css(e,"display"),c="none"===l?pe._data(e,"olddisplay")||j(e.nodeName):l,"inline"===c&&"none"===pe.css(e,"float")&&(fe.inlineBlockNeedsLayout&&"inline"!==j(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",fe.shrinkWrapBlocks()||f.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],St.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!g||void 0===g[r])continue;h=!0}d[r]=g&&g[r]||pe.style(e,r)}else l=void 0;if(pe.isEmptyObject(d))"inline"===("none"===l?j(e.nodeName):l)&&(p.display=l);else{g?"hidden"in g&&(h=g.hidden):g=pe._data(e,"fxshow",{}),o&&(g.hidden=!h),h?pe(e).show():f.done(function(){pe(e).hide()}),f.done(function(){var t;pe._removeData(e,"fxshow");for(t in d)pe.style(e,t,d[t])});for(r in d)a=B(h?g[r]:0,r,f),r in g||(g[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function I(e,t){var n,r,i,o,a;for(n in e)if(r=pe.camelCase(n),i=t[r],o=e[n],pe.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=pe.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function $(e,t,n){var r,i,o=0,a=$.prefilters.length,s=pe.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Nt||R(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;a<u;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),o<1&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:pe.extend({},t),opts:pe.extend(!0,{specialEasing:{},easing:pe.easing._default},n),originalProperties:t,originalOptions:n,startTime:Nt||R(),duration:n.duration,tweens:[],createTween:function(t,n){var r=pe.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(I(c,l.opts.specialEasing);o<a;o++)if(r=$.prefilters[o].call(l,e,c,l.opts))return pe.isFunction(r.stop)&&(pe._queueHooks(l.elem,l.opts.queue).stop=pe.proxy(r.stop,r)),r;return pe.map(c,B,l),pe.isFunction(l.opts.start)&&l.opts.start.call(e,l),pe.fx.timer(pe.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function z(e){return pe.attr(e,"class")||""}function X(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(De)||[];if(pe.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function U(e,t,n,r){function i(s){var u;return o[s]=!0,pe.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||a||o[l]?a?!(u=l):void 0:(t.dataTypes.unshift(l),i(l),!1)}),u}var o={},a=e===Qt;return i(t.dataTypes[0])||!o["*"]&&i("*")}function V(e,t){var n,r,i=pe.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&pe.extend(!0,e,n),e}function Y(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){u.unshift(a);break}if(u[0]in n)o=u[0];else{for(a in n){if(!u[0]||e.converters[a+" "+u[0]]){o=a;break}r||(r=a)}o=o||r}if(o)return o!==u[0]&&u.unshift(o),n[o]}function J(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(a=l[u+" "+o]||l["* "+o],!a)for(i in l)if(s=i.split(" "),s[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){a===!0?a=l[i]:l[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(f){return{state:"parsererror",error:a?f:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}function G(e){return e.style&&e.style.display||pe.css(e,"display")}function K(e){for(;e&&1===e.nodeType;){if("none"===G(e)||"hidden"===e.type)return!0;e=e.parentNode}return!1}function Q(e,t,n,r){var i;if(pe.isArray(t))pe.each(t,function(t,i){n||rn.test(e)?r(e,i):Q(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==pe.type(t))r(e,t);else for(i in t)Q(e+"["+i+"]",t[i],n,r)}function Z(){try{return new e.XMLHttpRequest}catch(t){}}function ee(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function te(e){return pe.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}var ne=[],re=e.document,ie=ne.slice,oe=ne.concat,ae=ne.push,se=ne.indexOf,ue={},le=ue.toString,ce=ue.hasOwnProperty,fe={},de="1.12.3",pe=function(e,t){return new pe.fn.init(e,t)},he=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ge=/^-ms-/,me=/-([\da-z])/gi,ye=function(e,t){return t.toUpperCase()};pe.fn=pe.prototype={jquery:de,constructor:pe,selector:"",length:0,toArray:function(){return ie.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:ie.call(this)},pushStack:function(e){var t=pe.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e){return pe.each(this,e)},map:function(e){return this.pushStack(pe.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(ie.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ae,sort:ne.sort,splice:ne.splice},pe.extend=pe.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||pe.isFunction(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(l&&n&&(pe.isPlainObject(n)||(t=pe.isArray(n)))?(t?(t=!1,o=e&&pe.isArray(e)?e:[]):o=e&&pe.isPlainObject(e)?e:{},a[r]=pe.extend(l,o,n)):void 0!==n&&(a[r]=n));return a},pe.extend({expando:"jQuery"+(de+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===pe.type(e)},isArray:Array.isArray||function(e){return"array"===pe.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){var t=e&&e.toString();return!pe.isArray(e)&&t-parseFloat(t)+1>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;i<r&&t.call(e[i],i,e[i])!==!1;i++);else for(i in e)if(t.call(e[i],i,e[i])===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(he,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?pe.merge(r,"string"==typeof e?[e]:e):ae.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(se)return se.call(t,e,n);for(r=t.length,n=n?n<0?Math.max(0,r+n):n:0;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o,a=0,s=[];if(n(e))for(i=e.length;a<i;a++)o=t(e[a],a,r),null!=o&&s.push(o);else for(a in e)o=t(e[a],a,r),null!=o&&s.push(o);return oe.apply([],s)},guid:1,proxy:function(e,t){var n,r,i;if("string"==typeof t&&(i=e[t],t=e,e=i),pe.isFunction(e))return n=ie.call(arguments,2),r=function(){return e.apply(t||this,n.concat(ie.call(arguments)))},r.guid=e.guid=e.guid||pe.guid++,r},now:function(){return+new Date},support:fe}),"function"==typeof Symbol&&(pe.fn[Symbol.iterator]=ne[Symbol.iterator]),pe.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){ue["[object "+t+"]"]=t.toLowerCase()});var ve=function(e){function t(e,t,n,r){var i,o,a,s,u,l,f,p,h=t&&t.ownerDocument,g=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==g&&9!==g&&11!==g)return n;if(!r&&((t?t.ownerDocument||t:B)!==H&&L(t),t=t||H,_)){if(11!==g&&(l=ye.exec(e)))if(i=l[1]){if(9===g){if(!(a=t.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(h&&(a=h.getElementById(i))&&R(t,a)&&a.id===i)return n.push(a),n}else{if(l[2])return Q.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&w.getElementsByClassName&&t.getElementsByClassName)return Q.apply(n,t.getElementsByClassName(i)),n}if(w.qsa&&!X[e+" "]&&(!F||!F.test(e))){if(1!==g)h=t,p=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(xe,"\\$&"):t.setAttribute("id",s=P),f=N(e),o=f.length,u=de.test(s)?"#"+s:"[id='"+s+"']";o--;)f[o]=u+" "+d(f[o]);p=f.join(","),h=ve.test(e)&&c(t.parentNode)||t}if(p)try{return Q.apply(n,h.querySelectorAll(p)),n}catch(m){}finally{s===P&&t.removeAttribute("id")}}}return S(e.replace(se,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>T.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=I++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,u,l,c=[W,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[P]||(t[P]={}),u=l[t.uniqueID]||(l[t.uniqueID]={}),(s=u[r])&&s[0]===W&&s[1]===o)return c[2]=s[2];if(u[r]=c,c[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i<o;i++)t(e,n[i],r);return r}function m(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function y(e,t,n,i,o,a){return i&&!i[P]&&(i=y(i)),o&&!o[P]&&(o=y(o,a)),r(function(r,a,s,u){var l,c,f,d=[],p=[],h=a.length,y=r||g(t||"*",s.nodeType?[s]:s,[]),v=!e||!r&&t?y:m(y,d,e,s,u),x=n?o||(r?e:h||i)?[]:a:v;if(n&&n(v,x,s,u),i)for(l=m(x,p),i(l,[],s,u),c=l.length;c--;)(f=l[c])&&(x[p[c]]=!(v[p[c]]=f));if(r){if(o||e){if(o){for(l=[],c=x.length;c--;)(f=x[c])&&l.push(v[c]=f);o(null,x=[],l,u)}for(c=x.length;c--;)(f=x[c])&&(l=o?ee(r,f):d[c])>-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s<i;s++)if(n=T.relative[e[s].type])c=[p(h(c),n)];else{if(n=T.filter[e[s].type].apply(null,e[s].matches),n[P]){for(r=++s;r<i&&!T.relative[e[r].type];r++);return y(s>1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s<r&&v(e.slice(s,r)),r<i&&v(e=e.slice(r)),r<i&&d(e))}c.push(n)}return h(c)}function x(e,n){var i=n.length>0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ne="[\\x20\\t\\r\\n\\f]",re="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",ie="\\["+ne+"*("+re+")(?:"+ne+"*([*^$|!~]?=)"+ne+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+re+"))|)"+ne+"*\\]",oe=":("+re+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+ie+")*)|.*)\\)|)",ae=new RegExp(ne+"+","g"),se=new RegExp("^"+ne+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ne+"+$","g"),ue=new RegExp("^"+ne+"*,"+ne+"*"),le=new RegExp("^"+ne+"*([>+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="<a id='"+P+"'></a><select id='"+P+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),
+l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[b]=s(b);for(b in{submit:!0,reset:!0})T.pseudos[b]=u(b);return f.prototype=T.filters=T.pseudos,T.setFilters=new f,N=t.tokenize=function(e,n){var r,i,o,a,s,u,l,c=z[e+" "];if(c)return n?0:c.slice(0);for(s=e,u=[],l=T.preFilter;s;){r&&!(i=ue.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),r=!1,(i=le.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(se," ")}),s=s.slice(r.length));for(a in T.filter)!(i=pe[a].exec(s))||l[a]&&!(i=l[a](i))||(r=i.shift(),o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):z(e,u).slice(0)},k=t.compile=function(e,t){var n,r=[],i=[],o=X[e+" "];if(!o){for(t||(t=N(e)),n=t.length;n--;)o=v(t[n]),o[P]?r.push(o):i.push(o);o=X(e,x(i,r)),o.selector=e}return o},S=t.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,f=!r&&N(e=l.selector||e);if(n=n||[],1===f.length){if(o=f[0]=f[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t<i;t++)if(pe.contains(r[t],this))return!0}));for(t=0;t<i;t++)pe.find(e,r[t],n);return n=this.pushStack(i>1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(pe.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=we.test(e)||"string"!=typeof e?pe(e,t||this.context):0;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u<a.length;)a[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=a.length,n=!1);e.memory||(n=!1),t=!1,i&&(a=n?[]:"")},c={add:function(){return a&&(n&&!t&&(u=a.length-1,s.push(n)),function r(t){pe.each(t,function(t,n){pe.isFunction(n)?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==pe.type(n)&&r(n)})}(arguments),n&&!t&&l()),this},remove:function(){return pe.each(arguments,function(e,t){for(var n;(n=pe.inArray(t,a,n))>-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i<a;i++)o[i]&&pe.isFunction(o[i].promise)?o[i].promise().progress(l(i,n,t)).done(l(i,r,o)).fail(u.reject):--s;return s||u.resolveWith(r,o),u.promise()}});var je;pe.fn.ready=function(e){return pe.ready.promise().done(e),this},pe.extend({isReady:!1,readyWait:1,holdReady:function(e){e?pe.readyWait++:pe.ready(!0)},ready:function(e){(e===!0?--pe.readyWait:pe.isReady)||(pe.isReady=!0,e!==!0&&--pe.readyWait>0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?pe.queue(this[0],e):void 0===t?this:this.each(function(){var n=pe.queue(this,e,t);pe._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&pe.dequeue(this,e)})},dequeue:function(e){return this.each(function(){pe.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=pe.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";a--;)n=pe._data(o[a],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}}),function(){var e;fe.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,r;return n=re.getElementsByTagName("body")[0],n&&n.style?(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(re.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(r),e):void 0}}();var Fe=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Me=new RegExp("^(?:([+-])=|)("+Fe+")([a-z%]*)$","i"),Oe=["Top","Right","Bottom","Left"],Re=function(e,t){return e=t||e,"none"===pe.css(e,"display")||!pe.contains(e.ownerDocument,e)},Pe=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===pe.type(n)){i=!0;for(s in n)Pe(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,pe.isFunction(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(pe(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},Be=/^(?:checkbox|radio)$/i,We=/<([\w:-]+)/,Ie=/^$|\/(?:java|ecma)script/i,$e=/^\s+/,ze="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";!function(){var e=re.createElement("div"),t=re.createDocumentFragment(),n=re.createElement("input");e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav></:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="<textarea>x</textarea>",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:fe.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/<tbody/i;!function(){var t,n,r=re.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(fe[t]=n in e)||(r.setAttribute(n,"t"),fe[t]=r.attributes[n].expando===!1);r=null}();var Ye=/^(?:input|select|textarea)$/i,Je=/^key/,Ge=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ke=/^(?:focusinfocus|focusoutblur)$/,Qe=/^([^.]*)(?:\.(.+)|)/;pe.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe._data(e);if(m){for(n.handler&&(u=n,n=u.handler,i=u.selector),n.guid||(n.guid=pe.guid++),(a=m.events)||(a=m.events={}),(c=m.handle)||(c=m.handle=function(e){return"undefined"==typeof pe||e&&pe.event.triggered===e.type?void 0:pe.event.dispatch.apply(c.elem,arguments)},c.elem=e),t=(t||"").match(De)||[""],s=t.length;s--;)o=Qe.exec(t[s])||[],p=g=o[1],h=(o[2]||"").split(".").sort(),p&&(l=pe.event.special[p]||{},p=(i?l.delegateType:l.bindType)||p,l=pe.event.special[p]||{},f=pe.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&pe.expr.match.needsContext.test(i),namespace:h.join(".")},u),(d=a[p])||(d=a[p]=[],d.delegateCount=0,l.setup&&l.setup.call(e,r,h,c)!==!1||(e.addEventListener?e.addEventListener(p,c,!1):e.attachEvent&&e.attachEvent("on"+p,c))),l.add&&(l.add.call(e,f),f.handler.guid||(f.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,f):d.push(f),pe.event.global[p]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe.hasData(e)&&pe._data(e);if(m&&(c=m.events)){for(t=(t||"").match(De)||[""],l=t.length;l--;)if(s=Qe.exec(t[l])||[],p=g=s[1],h=(s[2]||"").split(".").sort(),p){for(f=pe.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,d=c[p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=d.length;o--;)a=d[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(d.splice(o,1),a.selector&&d.delegateCount--,f.remove&&f.remove.call(e,a));u&&!d.length&&(f.teardown&&f.teardown.call(e,h,m.handle)!==!1||pe.removeEvent(e,p,m.handle),delete c[p])}else for(p in c)pe.event.remove(e,p+t[l],n,r,!0);pe.isEmptyObject(c)&&(delete m.handle,pe._removeData(e,"events"))}},trigger:function(t,n,r,i){var o,a,s,u,l,c,f,d=[r||re],p=ce.call(t,"type")?t.type:t,h=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=c=r=r||re,3!==r.nodeType&&8!==r.nodeType&&!Ke.test(p+pe.event.triggered)&&(p.indexOf(".")>-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n<s;n++)o=t[n],i=o.selector+" ",void 0===r[i]&&(r[i]=o.needsContext?pe(i,this).index(u)>-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[pe.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Ge.test(i)?this.mouseHooks:Je.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new pe.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||re),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,o=t.button,a=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=e.target.ownerDocument||re,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?t.toElement:a),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==b()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){if(this===b()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(pe.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1},_default:function(e){return pe.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n){var r=pe.extend(new pe.Event,n,{type:e,isSimulated:!0});pe.event.trigger(r,null,t),r.isDefaultPrevented()&&n.preventDefault()}},pe.removeEvent=re.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)}:function(e,t,n){var r="on"+t;e.detachEvent&&("undefined"==typeof e[r]&&(e[r]=null),e.detachEvent(r,n))},pe.Event=function(e,t){return this instanceof pe.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?v:x):this.type=e,t&&pe.extend(this,t),this.timeStamp=e&&e.timeStamp||pe.now(),void(this[pe.expando]=!0)):new pe.Event(e,t)},pe.Event.prototype={constructor:pe.Event,isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=v,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=v,e&&!this.isSimulated&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=v,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},pe.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){pe.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||pe.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),fe.submit||(pe.event.special.submit={setup:function(){return!pe.nodeName(this,"form")&&void pe.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=pe.nodeName(t,"input")||pe.nodeName(t,"button")?pe.prop(t,"form"):void 0;n&&!pe._data(n,"submit")&&(pe.event.add(n,"submit._submit",function(e){e._submitBubble=!0}),pe._data(n,"submit",!0))})},postDispatch:function(e){e._submitBubble&&(delete e._submitBubble,this.parentNode&&!e.isTrigger&&pe.event.simulate("submit",this.parentNode,e))},teardown:function(){return!pe.nodeName(this,"form")&&void pe.event.remove(this,"._submit")}}),fe.change||(pe.event.special.change={setup:function(){return Ye.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(pe.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._justChanged=!0)}),pe.event.add(this,"click._change",function(e){this._justChanged&&!e.isTrigger&&(this._justChanged=!1),pe.event.simulate("change",this,e)})),!1):void pe.event.add(this,"beforeactivate._change",function(e){var t=e.target;Ye.test(t.nodeName)&&!pe._data(t,"change")&&(pe.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||pe.event.simulate("change",this.parentNode,e)}),pe._data(t,"change",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type)return e.handleObj.handler.apply(this,arguments)},teardown:function(){return pe.event.remove(this,"._change"),!Ye.test(this.nodeName)}}),fe.focusin||pe.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){pe.event.simulate(t,e.target,pe.event.fix(e))};pe.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=pe._data(r,t);i||r.addEventListener(e,n,!0),pe._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=pe._data(r,t)-1;i?pe._data(r,t,i):(r.removeEventListener(e,n,!0),pe._removeData(r,t))}}}),pe.fn.extend({on:function(e,t,n,r){return w(this,e,t,n,r)},one:function(e,t,n,r){return w(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,pe(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return t!==!1&&"function"!=typeof t||(n=t,t=void 0),n===!1&&(n=x),this.each(function(){pe.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){pe.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return pe.event.trigger(e,t,n,!0)}});var Ze=/ jQuery\d+="(?:null|\d+)"/g,et=new RegExp("<(?:"+ze+")[\\s/>]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/<script|<style|<link/i,rt=/checked\s*(?:[^=]|=\s*.checked.)/i,it=/^true\/(.*)/,ot=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(pe.cleanData(h(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return S(this,arguments,function(t){var n=this.parentNode;pe.inArray(this,e)<0&&(pe.cleanData(h(this)),
+n&&n.replaceChild(t,this))},e)}}),pe.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){pe.fn[e]=function(e){for(var n,r=0,i=[],o=pe(e),a=o.length-1;r<=a;r++)n=r===a?this:this.clone(!0),pe(o[r])[t](n),ae.apply(i,n.get());return this.pushStack(i)}});var ut,lt={HTML:"block",BODY:"block"},ct=/^margin/,ft=new RegExp("^("+Fe+")(?!px)[a-z%]+$","i"),dt=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i},pt=re.documentElement;!function(){function t(){var t,c,f=re.documentElement;f.appendChild(u),l.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",n=i=s=!1,r=a=!0,e.getComputedStyle&&(c=e.getComputedStyle(l),n="1%"!==(c||{}).top,s="2px"===(c||{}).marginLeft,i="4px"===(c||{width:"4px"}).width,l.style.marginRight="50%",r="4px"===(c||{marginRight:"4px"}).marginRight,t=l.appendChild(re.createElement("div")),t.style.cssText=l.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",t.style.marginRight=t.style.width="0",l.style.width="1px",a=!parseFloat((e.getComputedStyle(t)||{}).marginRight),l.removeChild(t)),l.style.display="none",o=0===l.getClientRects().length,o&&(l.style.display="",l.innerHTML="<table><tr><td></td><td>t</td></tr></table>",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a<i;a++)o[t[a]]=pe.css(e,t[a],!1,r);return o}return void 0!==n?pe.style(e,t,n):pe.css(e,t)},e,t,arguments.length>1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r<i;r++)n=e[r],$.tweeners[n]=$.tweeners[n]||[],$.tweeners[n].unshift(t)},prefilters:[W],prefilter:function(e,t){t?$.prefilters.unshift(e):$.prefilters.push(e)}}),pe.speed=function(e,t,n){var r=e&&"object"==typeof e?pe.extend({},e):{complete:n||!n&&t||pe.isFunction(e)&&e,duration:e,easing:n&&t||t&&!pe.isFunction(t)&&t};return r.duration=pe.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in pe.fx.speeds?pe.fx.speeds[r.duration]:pe.fx.speeds._default,null!=r.queue&&r.queue!==!0||(r.queue="fx"),r.old=r.complete,r.complete=function(){pe.isFunction(r.old)&&r.old.call(this),r.queue&&pe.dequeue(this,r.queue)},r},pe.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Re).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=pe.isEmptyObject(e),o=pe.speed(t,n,r),a=function(){var t=$(this,pe.extend({},e),o);(i||pe._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=pe.timers,a=pe._data(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&At.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||pe.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=pe._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=pe.timers,a=r?r.length:0;for(n.finish=!0,pe.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),pe.each(["toggle","show","hide"],function(e,t){var n=pe.fn[t];pe.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(P(t,!0),e,r,i)}}),pe.each({slideDown:P("show"),slideUp:P("hide"),slideToggle:P("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){pe.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),pe.timers=[],pe.fx.tick=function(){var e,t=pe.timers,n=0;for(Nt=pe.now();n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||pe.fx.stop(),Nt=void 0},pe.fx.timer=function(e){pe.timers.push(e),e()?pe.fx.start():pe.timers.pop()},pe.fx.interval=13,pe.fx.start=function(){kt||(kt=e.setInterval(pe.fx.tick,pe.fx.interval))},pe.fx.stop=function(){e.clearInterval(kt),kt=null},pe.fx.speeds={slow:600,fast:200,_default:400},pe.fn.delay=function(t,n){return t=pe.fx?pe.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e,t=re.createElement("input"),n=re.createElement("div"),r=re.createElement("select"),i=r.appendChild(re.createElement("option"));n=re.createElement("div"),n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u<s;u++)if(n=r[u],(n.selected||u===i)&&(fe.optDisabled?!n.disabled:null===n.getAttribute("disabled"))&&(!n.parentNode.disabled||!pe.nodeName(n.parentNode,"optgroup"))){if(t=pe(n).val(),o)return t;a.push(t)}return a},set:function(e,t){for(var n,r,i=e.options,o=pe.makeArray(t),a=i.length;a--;)if(r=i[a],pe.inArray(pe.valHooks.option.get(r),o)>-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("<div>").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){
+for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/laydate.js b/payapi/src/main/resources/static/libs/layui/lay/modules/laydate.js
new file mode 100755
index 0000000..ae0a591
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/laydate.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期<br>建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t<n.length;t++)this.push(n[t])};C.prototype=[],C.prototype.constructor=C,w.extend=function(){var e=1,t=arguments,n=function(e,t){e=e||(t.constructor===Array?[]:{});for(var a in t)e[a]=t[a]&&t[a].constructor===Object?n(e[a],t[a]):t[a];return e};for(t[0]="object"==typeof t[0]?t[0]:{};e<t.length;e++)"object"==typeof t[e]&&n(t[0],t[e]);return t[0]},w.ie=function(){var e=navigator.userAgent.toLowerCase();return!!(window.ActiveXObject||"ActiveXObject"in window)&&((e.match(/msie\s(\d+)/)||[])[1]||"11")}(),w.stope=function(e){e=e||window.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},w.each=function(e,t){var n,a=this;if("function"!=typeof t)return a;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;n<e.length&&!t.call(e[n],n,e[n]);n++);return a},w.digit=function(e,t,n){var a="";e=String(e),t=t||2;for(var i=e.length;i<t;i++)a+="0";return e<Math.pow(10,t)?a+(0|e):e},w.elem=function(e,t){var n=document.createElement(e);return w.each(t||{},function(e,t){n.setAttribute(e,t)}),n},C.addStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){new RegExp("\\b"+n+"\\b").test(e)||(e=e+" "+n)}),e.replace(/^\s|\s$/,"")},C.removeStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){var a=new RegExp("\\b"+n+"\\b");a.test(e)&&(e=e.replace(a,""))}),e.replace(/\s+/," ").replace(/^\s|\s$/,"")},C.prototype.find=function(e){var t=this,n=0,a=[],i="object"==typeof e;return this.each(function(r,o){for(var s=i?[e]:o.querySelectorAll(e||null);n<s.length;n++)a.push(s[n]);t.shift()}),i||(t.selector=(t.selector?t.selector+" ":"")+e),w.each(a,function(e,n){t.push(n)}),t},C.prototype.each=function(e){return w.each.call(this,this,e)},C.prototype.addClass=function(e,t){return this.each(function(n,a){a.className=C[t?"removeStr":"addStr"](a.className,e)})},C.prototype.removeClass=function(e){return this.addClass(e,!0)},C.prototype.hasClass=function(e){var t=!1;return this.each(function(n,a){new RegExp("\\b"+e+"\\b").test(a.className)&&(t=!0)}),t},C.prototype.attr=function(e,t){var n=this;return void 0===t?function(){if(n.length>0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r<s?o+r*s:r:o);a=[l.getFullYear(),l.getMonth()+1,l.getDate()],r<s||(i=[l.getHours(),l.getMinutes(),l.getSeconds()])}else a=(t[n].match(/\d+-\d+-\d+/)||[""])[0].split("-"),i=(t[n].match(/\d+:\d+:\d+/)||[""])[0].split(":");t[n]={year:0|a[0]||(new Date).getFullYear(),month:a[1]?(0|a[1])-1:(new Date).getMonth(),date:0|a[2]||(new Date).getDate(),hours:0|i[0],minutes:0|i[1],seconds:0|i[2]}}),e.elemID="layui-laydate"+t.elem.attr("lay-key"),(t.show||a)&&e.render(),a||e.events(),t.value&&t.isInitValue&&(t.value.constructor===Date?e.setValue(e.parse(0,e.systemDate(t.value))):e.setValue(t.value)))},T.prototype.render=function(){var e=this,t=e.config,n=e.lang(),a="static"===t.position,i=e.elem=w.elem("div",{id:e.elemID,"class":["layui-laydate",t.range?" layui-laydate-range":"",a?" "+c:"",t.theme&&"default"!==t.theme&&!/^#/.test(t.theme)?" laydate-theme-"+t.theme:""].join("")}),r=e.elemMain=[],o=e.elemHeader=[],s=e.elemCont=[],l=e.table=[],d=e.footer=w.elem("div",{"class":p});if(t.zIndex&&(i.style.zIndex=t.zIndex),w.each(new Array(2),function(e){if(!t.range&&e>0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push('<span lay-type="datetime" class="laydate-btns-time">'+n.timeTips+"</span>"),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push('<span lay-type="'+r+'" class="laydate-btns-'+r+'">'+o+"</span>"))}),e.push('<div class="laydate-footer-btns">'+i.join("")+"</div>"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));t.elem&&(n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3))},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length<l.length&&(a=!0),/yyyy|y/.test(l)?(c<d[0]&&(c=d[0],a=!0),e.year=c):/MM|M/.test(l)?(c<1&&(c=1,a=!0),e.month=c-1):/dd|d/.test(l)?(c<1&&(c=1,a=!0),e.date=c):/HH|H/.test(l)?(c<1&&(c=0,a=!0),e.hours=c,r.range&&(i[o[n]].hours=c)):/mm|m/.test(l)?(c<1&&(c=0,a=!0),e.minutes=c,r.range&&(i[o[n]].minutes=c)):/ss|s/.test(l)&&(c<1&&(c=0,a=!0),e.seconds=c,r.range&&(i[o[n]].seconds=c))}),c(e)};return"limit"===e?(c(o),i):(l=l||r.value,"string"==typeof l&&(l=l.replace(/\s+/g," ").replace(/^\s|\s$/g,"")),i.startState&&!i.endState&&(delete i.startState,i.endState=!0),"string"==typeof l&&l?i.EXP_IF.test(l)?r.range?(l=l.split(" "+r.range+" "),i.startDate=i.startDate||i.systemDate(),i.endDate=i.endDate||i.systemDate(),r.dateTime=w.extend({},i.startDate),w.each([i.startDate,i.endDate],function(e,t){m(t,l[e],e)})):m(o,l):(i.hint("日期格式不合法<br>必须遵循下述格式:<br>"+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"<br>已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html('<span class="laydate-day-mark">'+n+"</span>"),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.now<l.min||l.now>l.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.year<d[0]&&(l.year=d[0],r.hint("最低只能支持到公元"+d[0]+"年")),l.year>d[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e<t?(c=a-t+e,n.addClass("laydate-day-prev"),d=r.getAsYM(l.year,l.month,"sub")):e>=t&&e<i+t?(c=e-t,s.range||c+1===l.date&&n.addClass(o)):(c=e-i-t,n.addClass("laydate-day-next"),d=r.getAsYM(l.year,l.month)),d[1]++,d[2]=c+1,n.attr("lay-ymd",d.join("-")).html(d[2]),r.mark(n,d).limit(n,{year:d[0],month:d[1]-1,date:d[2]},e)}),w(f[0]).attr("lay-ym",l.year+"-"+(l.month+1)),w(f[1]).attr("lay-ym",l.year+"-"+(l.month+1)),"cn"===s.lang?(w(f[0]).attr("lay-type","year").html(l.year+"年"),w(f[1]).attr("lay-type","month").html(l.month+1+"月")):(w(f[0]).attr("lay-type","month").html(m.month[l.month]),w(f[1]).attr("lay-type","year").html(l.year)),u&&(s.range&&(e?r.endDate=r.endDate||{year:l.year+("year"===s.type?1:0),month:l.month+("month"===s.type?0:-1)}:r.startDate=r.startDate||{year:l.year,month:l.month},e&&(r.listYM=[[r.startDate.year,r.startDate.month+1],[r.endDate.year,r.endDate.month+1]],r.list(s.type,0).list(s.type,1),"time"===s.type?r.setBtnStatus("时间",w.extend({},r.systemDate(),r.startTime),w.extend({},r.systemDate(),r.endTime)):r.setBtnStatus(!0))),s.range||(r.listYM=[[l.year,l.month+1]],r.list(s.type,0))),s.range&&!e){var p=r.getAsYM(l.year,l.month);r.calendar(w.extend({},l,{year:p[0],month:p[1]}))}return s.range||r.limit(w(r.footer).find(g),null,0,["hours","minutes","seconds"]),s.range&&e&&!u&&r.stampRange(),r},T.prototype.list=function(e,t){var n=this,a=n.config,i=a.dateTime,r=n.lang(),l=a.range&&"date"!==a.type&&"datetime"!==a.type,d=w.elem("ul",{"class":m+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[e]}),c=n.elemHeader[t],u=w(c[2]).find("span"),h=n.elemCont[t||0],y=w(h).find("."+m)[0],f="cn"===a.lang,p=f?"年":"",T=n.listYM[t]||{},C=["hours","minutes","seconds"],x=["startTime","endTime"][t];if(T[0]<1&&(T[0]=1),"year"===e){var M,b=M=T[0]-7;b<1&&(b=M=1),w.each(new Array(15),function(e){var i=w.elem("li",{"lay-ym":M}),r={year:M};M==T[0]&&w(i).addClass(o),i.innerHTML=M+p,d.appendChild(i),M<n.firstDate.year?(r.month=a.min.month,r.date=a.min.date):M>=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]<n.firstDate.year?s.date=a.min.date:T[0]>=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["<p>"+r.time[e]+"</p><ol>"];w.each(new Array(t),function(t){i.push("<li"+(n[x][C[e]]===t?' class="'+o+'"':"")+">"+w.digit(t,2)+"</li>")}),a.innerHTML=i.join("")+"</ol>",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s<t&&w(i).addClass(u)})},T.prototype.done=function(e,t){var n=this,a=n.config,i=w.extend({},n.startDate?w.extend(n.startDate,n.startTime):a.dateTime),r=w.extend({},w.extend(n.endDate,n.endTime));return w.each([i,r],function(e,t){"month"in t&&w.extend(t,{month:t.month+1})}),e=e||[n.parse(),i,r],"function"==typeof a[t||"done"]&&a[t||"done"].apply(a,e),n},T.prototype.choose=function(e){var t=this,n=t.config,a=n.dateTime,i=w(t.elem).find("td"),r=e.attr("lay-ymd").split("-"),l=function(e){new Date;e&&w.extend(a,r),n.range&&(t.startDate?w.extend(t.startDate,r):t.startDate=w.extend({},r,t.startTime),t.startYMD=r)};if(r={year:0|r[0],month:(0|r[1])-1,date:0|r[2]},!e.hasClass(s))if(n.range){if(w.each(["startTime","endTime"],function(e,n){t[n]=t[n]||{hours:0,minutes:0,seconds:0}}),t.endState)l(),delete t.endState,delete t.endDate,t.startState=!0,i.removeClass(o+" "+u),e.addClass(o);else if(t.startState){if(e.addClass(o),t.endDate?w.extend(t.endDate,r):t.endDate=w.extend({},r,t.endTime),t.newDate(r).getTime()<t.newDate(t.startYMD).getTime()){var d=w.extend({},t.endDate,{hours:t.startDate.hours,minutes:t.startDate.minutes,seconds:t.startDate.seconds});w.extend(t.endDate,t.startDate,{hours:t.endDate.hours,minutes:t.endDate.minutes,seconds:t.endDate.seconds}),t.startDate=d}n.showBottom||t.done(),t.stampRange(),t.endState=!0,t.done(null,"change")}else e.addClass(o),l(),t.startState=!0;w(t.footer).find(g)[t.endDate?"removeClass":"addClass"](s)}else"static"===n.position?(l(!0),t.calendar().done().done(null,"change")):"date"===n.type?(l(!0),t.setValue(t.parse()).remove().done()):"datetime"===n.type&&(l(!0),t.calendar().done(null,"change"))},T.prototype.tool=function(e,t){var n=this,a=n.config,i=a.dateTime,r="static"===a.position,o={datetime:function(){w(e).hasClass(s)||(n.list("time",0),a.range&&n.list("time",1),w(e).attr("lay-type","date").html(n.lang().dateTips))},date:function(){n.closeList(),w(e).attr("lay-type","datetime").html(n.lang().timeTips)},clear:function(){n.setValue("").remove(),r&&(w.extend(i,n.firstDate),n.calendar()),a.range&&(delete n.startState,delete n.endState,delete n.endDate,delete n.startTime,delete n.endTime),n.done(["",{},{}])},now:function(){var e=new Date;w.extend(i,n.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),n.setValue(n.parse()).remove(),r&&n.calendar(),n.done()},confirm:function(){if(a.range){if(!n.endDate)return n.hint("请先选择日期范围");if(w(e).hasClass(s))return n.hint("time"===a.type?l.replace(/日期/g,"时间"):l)}else if(w(e).hasClass(s))return n.hint("不在有效日期或时间范围内");n.done(),n.setValue(n.parse()).remove()}};o[t]&&o[t]()},T.prototype.change=function(e){var t=this,n=t.config,a=n.dateTime,i=n.range&&("year"===n.type||"month"===n.type),r=t.elemCont[e||0],o=t.listYM[e],s=function(s){var l=["startDate","endDate"][e],d=w(r).find(".laydate-year-list")[0],c=w(r).find(".laydate-month-list")[0];return d&&(o[0]=s?o[0]-15:o[0]+15,t.list("year",e)),c&&(s?o[0]--:o[0]++,t.list("month",e)),(d||c)&&(w.extend(a,{year:o[0]}),i&&(t[l].year=o[0]),n.range||t.done(null,"change"),t.setBtnStatus(),n.range||t.limit(w(t.footer).find(g),{year:o[0]})),d||c};return{prevYear:function(){s("sub")||(a.year--,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))},prevMonth:function(){var e=t.getAsYM(a.year,a.month,"sub");w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextMonth:function(){var e=t.getAsYM(a.year,a.month);w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextYear:function(){s()||(a.year++,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))}}},T.prototype.changeEvent=function(){var e=this;e.config;w(e.elem).on("click",function(e){w.stope(e)}),w.each(e.elemHeader,function(t,n){w(n[0]).on("click",function(n){e.change(t).prevYear()}),w(n[1]).on("click",function(n){e.change(t).prevMonth()}),w(n[2]).find("span").on("click",function(n){var a=w(this),i=a.attr("lay-ym"),r=a.attr("lay-type");i&&(i=i.split("-"),e.listYM[t]=[0|i[0],0|i[1]],e.list(r,t),w(e.footer).find(D).addClass(s))}),w(n[3]).on("click",function(n){e.change(t).nextMonth()}),w(n[4]).on("click",function(n){e.change(t).nextYear()})}),w.each(e.table,function(t,n){var a=w(n).find("td");a.on("click",function(){e.choose(w(this))})}),w(e.footer).find("span").on("click",function(){var t=w(this).attr("lay-type");e.tool(this,t)})},T.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())},T.prototype.events=function(){var e=this,t=e.config,n=function(n,a){n.on(t.trigger,function(){a&&(e.bindElem=this),e.render()})};t.elem[0]&&!t.elem[0].eventHandler&&(n(t.elem,"bind"),n(t.eventElem),w(document).on("click",function(n){n.target!==t.elem[0]&&n.target!==t.eventElem[0]&&n.target!==w(t.closeStop)[0]&&e.remove()}).on("keydown",function(t){13===t.keyCode&&w("#"+e.elemID)[0]&&e.elemID===T.thisElem&&(t.preventDefault(),w(e.footer).find(g)[0].click())}),w(window).on("resize",function(){return!(!e.elem||!w(r)[0])&&void e.position()}),t.elem[0].eventHandler=!0)},n.render=function(e){var t=new T(e);return a.call(t)},n.getEndDate=function(e,t){var n=new Date;return n.setFullYear(t||n.getFullYear(),e||n.getMonth()+1,1),new Date(n.getTime()-864e5).getDate()},window.lay=window.lay||w,e?(n.ready(),layui.define(function(e){n.path=layui.cache.dir,e(i,n)})):"function"==typeof define&&define.amd?define(function(){return n}):function(){n.ready(),window.laydate=n}()}();
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/layedit.js b/payapi/src/main/resources/static/libs/layui/lay/modules/layedit.js
new file mode 100755
index 0000000..96caa11
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/layedit.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['<div class="'+r+'">','<div class="layui-unselect layui-layedit-tool">'+f+"</div>",'<div class="layui-layedit-iframe">','<iframe id="'+u+'" name="'+u+'" textarea="'+t+'" frameborder="0"></iframe>',"</div>","</div>"].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e(["<style>","*{margin: 0; padding: 0;}","body{padding: 10px; line-height: 20px; overflow-x: hidden; word-wrap: break-word; font: 14px Helvetica Neue,Helvetica,PingFang SC,Microsoft YaHei,Tahoma,Arial,sans-serif; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}","a{color:#01AAED; text-decoration:none;}a:hover{color:#c00}","p{margin-bottom: 10px;}","img{display: inline-block; border: none; vertical-align: middle;}","pre{margin: 10px 0; padding: 10px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}","</style>"].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"<p>")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"<p>"),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"<p>"),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['<ul class="layui-form" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">URL</label>','<div class="layui-input-block" style="margin-left: 90px">','<input name="url" lay-verify="url" value="'+(t.href||"")+'" autofocus="true" autocomplete="off" class="layui-input">',"</div>","</li>",'<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">打开方式</label>','<div class="layui-input-block" style="margin-left: 90px">','<input type="radio" name="target" value="_self" class="layui-input" title="当前窗口"'+("_self"!==t.target&&t.target?"":"checked")+">",'<input type="radio" name="target" value="_blank" class="layui-input" title="新窗口" '+("_blank"===t.target?"checked":"")+">","</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-link-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('<li title="'+e+'"><img src="'+i+'" alt="'+e+'"></li>')}),'<ul class="layui-clear">'+t.join("")+"</ul>"}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['<ul class="layui-form layui-form-pane" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label">请选择语言</label>','<div class="layui-input-block">','<select name="lang">','<option value="JavaScript">JavaScript</option>','<option value="HTML">HTML</option>','<option value="CSS">CSS</option>','<option value="Java">Java</option>','<option value="PHP">PHP</option>','<option value="C#">C#</option>','<option value="Python">Python</option>','<option value="Ruby">Ruby</option>','<option value="Go">Go</option>',"</select>","</div>","</li>",'<li class="layui-form-item layui-form-text">','<label class="layui-form-label">代码</label>','<div class="layui-input-block">','<textarea name="code" lay-verify="required" autofocus="true" class="layui-textarea" style="height: 200px;"></textarea>',"</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-code-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'<i class="layui-icon layedit-tool-html" title="HTML源代码" lay-command="html" layedit-event="html""></i><span class="layedit-tool-mid"></span>',strong:'<i class="layui-icon layedit-tool-b" title="加粗" lay-command="Bold" layedit-event="b""></i>',italic:'<i class="layui-icon layedit-tool-i" title="斜体" lay-command="italic" layedit-event="i""></i>',underline:'<i class="layui-icon layedit-tool-u" title="下划线" lay-command="underline" layedit-event="u""></i>',del:'<i class="layui-icon layedit-tool-d" title="删除线" lay-command="strikeThrough" layedit-event="d""></i>',"|":'<span class="layedit-tool-mid"></span>',left:'<i class="layui-icon layedit-tool-left" title="左对齐" lay-command="justifyLeft" layedit-event="left""></i>',center:'<i class="layui-icon layedit-tool-center" title="居中对齐" lay-command="justifyCenter" layedit-event="center""></i>',right:'<i class="layui-icon layedit-tool-right" title="右对齐" lay-command="justifyRight" layedit-event="right""></i>',link:'<i class="layui-icon layedit-tool-link" title="插入链接" layedit-event="link""></i>',unlink:'<i class="layui-icon layedit-tool-unlink layui-disabled" title="清除链接" lay-command="unlink" layedit-event="unlink""></i>',face:'<i class="layui-icon layedit-tool-face" title="表情" layedit-event="face""></i>',image:'<i class="layui-icon layedit-tool-image" title="图片" layedit-event="image"><input type="file" name="file"></i>',code:'<i class="layui-icon layedit-tool-code" title="插入代码" layedit-event="code"></i>',help:'<i class="layui-icon layedit-tool-help" title="帮助" layedit-event="help"></i>'},w=new c;t(n,w)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/layer.js b/payapi/src/main/resources/static/libs/layui/lay/modules/layer.js
new file mode 100755
index 0000000..c6d5378
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/layer.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'<div class="layui-layer-title" style="'+(f?r.title[1]:"")+'">'+(f?r.title[0]:r.title)+"</div>":"";return r.zIndex=s,t([r.shade?'<div class="layui-layer-shade" id="layui-layer-shade'+a+'" times="'+a+'" style="'+("z-index:"+(s-1)+"; ")+'"></div>':"",'<div class="'+l[0]+(" layui-layer-"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?"":" layui-layer-border")+" "+(r.skin||"")+'" id="'+l[0]+a+'" type="'+o.type[r.type]+'" times="'+a+'" showtime="'+r.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+s+"; width:"+r.area[0]+";height:"+r.area[1]+(r.fixed?"":";position:absolute;")+'">'+(e&&2!=r.type?"":u)+'<div id="'+(r.id||"")+'" class="layui-layer-content'+(0==r.type&&r.icon!==-1?" layui-layer-padding":"")+(3==r.type?" layui-layer-loading"+r.icon:"")+'">'+(0==r.type&&r.icon!==-1?'<i class="layui-layer-ico layui-layer-ico'+r.icon+'"></i>':"")+(1==r.type&&e?"":r.content||"")+'</div><span class="layui-layer-setwin">'+function(){var e=c?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"";return r.closeBtn&&(e+='<a class="layui-layer-ico '+l[7]+" "+l[7]+(r.title?r.closeBtn:4==r.type?"1":"2")+'" href="javascript:;"></a>'),e}()+"</span>"+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class="'+l[6]+t+'">'+r.btn[t]+"</a>";return'<div class="'+l[6]+" layui-layer-btn-"+(r.btnAlign||"")+'">'+e+"</div>"}():"")+(r.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],u,i('<div class="layui-layer-move"></div>')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='<iframe scrolling="'+(t.content[1]||"auto")+'" allowtransparency="true" id="'+l[4]+a+'" name="'+l[4]+a+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+t.content[0]+'"></iframe>';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'<i class="layui-layer-TipsG"></i>',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'<textarea class="layui-layer-input"'+a+"></textarea>":function(){return'<input type="'+(1==e.formType?"password":"text")+'" class="layui-layer-input">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a='<span class="'+n+'">'+t[0].title+"</span>";i<e;i++)a+="<span>"+t[i].title+"</span>";return a}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=t.length,i=1,a="";if(e>0)for(a='<li class="layui-layer-tabli '+n+'">'+(t[0].content||"no content")+"</li>";i<e;i++)a+='<li class="layui-layer-tabli">'+(t[i].content||"no content")+"</li>";return a}()+"</ul>",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+"px",a[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,isOutAnim:!1,skin:"layui-layer-photos"+c("photos"),content:'<div class="layui-layer-phimg"><img src="'+u[d].src+'" alt="'+(u[d].alt||"")+'" layer-pid="'+u[d].pid+'"><div class="layui-layer-imgsee">'+(u.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(a?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(u[d].alt||"")+"</a><em>"+s.imgIndex+"/"+u.length+"</em></span></div></div></div>",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常<br>是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/laypage.js b/payapi/src/main/resources/static/libs/layui/lay/modules/laypage.js
new file mode 100755
index 0000000..fd07fda
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/laypage.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?'<a href="javascript:;" class="layui-laypage-prev'+(1==a.curr?" "+r:"")+'" data-page="'+(a.curr-1)+'">'+a.prev+"</a>":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push('<a href="javascript:;" class="layui-laypage-first" data-page="1" title="首页">'+(a.first||1)+"</a>");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r<t-1&&(r=u-t+1),a.first!==!1&&r>2&&e.push('<span class="layui-laypage-spr">…</span>');r<=u;r++)r===a.curr?e.push('<span class="layui-laypage-curr"><em class="layui-laypage-em" '+(/^#/.test(a.theme)?'style="background-color:'+a.theme+';"':"")+"></em><em>"+r+"</em></span>"):e.push('<a href="javascript:;" data-page="'+r+'">'+r+"</a>");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1<a.pages&&e.push('<span class="layui-laypage-spr">…</span>'),0!==t&&e.push('<a href="javascript:;" class="layui-laypage-last" title="尾页" data-page="'+a.pages+'">'+(a.last||a.pages)+"</a>")),e.join("")}(),next:function(){return a.next?'<a href="javascript:;" class="layui-laypage-next'+(a.curr==a.pages?" "+r:"")+'" data-page="'+(a.curr+1)+'">'+a.next+"</a>":""}(),count:'<span class="layui-laypage-count">共 '+a.count+" 条</span>",limit:function(){var e=['<span class="layui-laypage-limits"><select lay-ignore>'];return layui.each(a.limits,function(t,n){e.push('<option value="'+n+'"'+(n===a.limit?"selected":"")+">"+n+" 条/页</option>")}),e.join("")+"</select></span>"}(),refresh:['<a href="javascript:;" data-page="'+a.curr+'" class="layui-laypage-refresh">','<i class="layui-icon layui-icon-refresh"></i>',"</a>"].join(""),skip:function(){return['<span class="layui-laypage-skip">到第','<input type="text" min="1" value="'+a.curr+'" class="layui-input">','页<button type="button" class="layui-laypage-btn">确定</button>',"</span>"].join("")}()};return['<div class="layui-box layui-laypage layui-laypage-'+(a.theme?/^#/.test(a.theme)?"molv":a.theme:"default")+'" id="layui-laypage-'+a.index+'">',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"</div>"].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;o<y;o++)"a"===r[o].nodeName.toLowerCase()&&s.on(r[o],"click",function(){var e=0|this.getAttribute("data-page");e<1||e>i.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/laytpl.js b/payapi/src/main/resources/static/libs/layui/lay/modules/laytpl.js
new file mode 100755
index 0000000..d482d4e
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/laytpl.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/mobile.js b/payapi/src/main/resources/static/libs/layui/lay/modules/mobile.js
new file mode 100755
index 0000000..35cfdf0
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/mobile.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define(function(i){i("layui.mobile",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var t=(window,document),i="querySelectorAll",n="getElementsByClassName",a=function(e){return t[i](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var i in e)t[i]=e[i];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var o=0,r=["layui-m-layer"],d=function(e){var t=this;t.config=l.extend(e),t.view()};d.prototype.view=function(){var e=this,i=e.config,s=t.createElement("div");e.id=s.id=r[0]+o,s.setAttribute("class",r[0]+" "+r[0]+(i.type||0)),s.setAttribute("index",o);var l=function(){var e="object"==typeof i.title;return i.title?'<h3 style="'+(e?i.title[1]:"")+'">'+(e?i.title[0]:i.title)+"</h3>":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e='<span yes type="1">'+i.btn[0]+"</span>",2===t&&(e='<span no type="0">'+i.btn[1]+"</span>"+e),'<div class="layui-m-layerbtn">'+e+"</div>"):""}();if(i.fixed||(i.top=i.hasOwnProperty("top")?i.top:100,i.style=i.style||"",i.style+=" top:"+(t.body.scrollTop+i.top)+"px"),2===i.type&&(i.content='<i></i><i class="layui-m-layerload"></i><i></i><p>'+(i.content||"")+"</p>"),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"<div "+("string"==typeof i.shade?'style="'+i.shade+'"':"")+' class="layui-m-layershade"></div>':"")+'<div class="layui-m-layermain" '+(i.fixed?"":'style="position:static;"')+'><div class="layui-m-layersection"><div class="layui-m-layerchild '+(i.skin?"layui-m-layer-"+i.skin+" ":"")+(i.className?i.className:"")+" "+(i.anim?"layui-m-anim-"+i.anim:"")+'" '+(i.style?'style="'+i.style+'"':"")+">"+l+'<div class="layui-m-layercont">'+i.content+"</div>"+d+"</div></div></div>",!i.type||2===i.type){var y=t[n](r[0]+i.type),u=y.length;u>=1&&c.close(y[0].getAttribute("index"))}document.body.appendChild(s);var m=e.elem=a("#"+e.id)[0];i.success&&i.success(m),e.index=o++,e.action(i,m)},d.prototype.action=function(e,t){var i=this;e.time&&(l.timer[i.index]=setTimeout(function(){c.close(i.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),c.close(i.index)):e.yes?e.yes(i.index):c.close(i.index)};if(e.btn)for(var s=t[n]("layui-m-layerbtn")[0].children,o=s.length,r=0;r<o;r++)l.touch(s[r],a);if(e.shade&&e.shadeClose){var d=t[n]("layui-m-layershade")[0];l.touch(d,function(){c.close(i.index,e.end)})}e.end&&(l.end[i.index]=e.end)};var c={v:"2.0 m",index:o,open:function(e){var t=new d(e||{});return t.index},close:function(e){var i=a("#"+r[0]+e)[0];i&&(i.innerHTML="",t.body.removeChild(i),clearTimeout(l.timer[e]),delete l.timer[e],"function"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[n](r[0]),i=0,a=e.length;i<a;i++)c.close(0|e[0].getAttribute("index"))}};e("layer-mobile",c)});layui.define(function(t){var e=function(){function t(t){return null==t?String(t):J[W.call(t)]||"object"}function e(e){return"function"==t(e)}function n(t){return null!=t&&t==t.window}function r(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function i(e){return"object"==t(e)}function o(t){return i(t)&&!n(t)&&Object.getPrototypeOf(t)==Object.prototype}function a(t){var e=!!t&&"length"in t&&t.length,r=T.type(t);return"function"!=r&&!n(t)&&("array"==r||0===e||"number"==typeof e&&e>0&&e-1 in t)}function s(t){return A.call(t,function(t){return null!=t})}function u(t){return t.length>0?T.fn.concat.apply([],t):t}function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"}function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),$[t]=n),$[t]}function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes,function(t){if(1==t.nodeType)return t})}function d(t,e){var n,r=t?t.length:0;for(n=0;n<r;n++)this[n]=t[n];this.length=r,this.selector=e||""}function m(t,e,n){for(j in e)n&&(o(e[j])||Q(e[j]))?(o(e[j])&&!o(t[j])&&(t[j]={}),Q(e[j])&&!Q(t[j])&&(t[j]=[]),m(t[j],e[j],n)):e[j]!==E&&(t[j]=e[j])}function v(t,e){return null==e?T(t):T(t).filter(e)}function g(t,n,r,i){return e(n)?n.call(t,r,i):n}function y(t,e,n){null==n?t.removeAttribute(e):t.setAttribute(e,n)}function x(t,e){var n=t.className||"",r=n&&n.baseVal!==E;return e===E?r?n.baseVal:n:void(r?n.baseVal=e:t.className=e)}function b(t){try{return t?"true"==t||"false"!=t&&("null"==t?null:+t+""==t?+t:/^[\[\{]/.test(t)?T.parseJSON(t):t):t}catch(e){return t}}function w(t,e){e(t);for(var n=0,r=t.childNodes.length;n<r;n++)w(t.childNodes[n],e)}var E,j,T,S,C,N,O=[],P=O.concat,A=O.filter,D=O.slice,L=window.document,$={},F={},k={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},M=/^\s*<(\w+|!)[^>]*>/,R=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Z=/^(?:body|html)$/i,q=/([A-Z])/g,H=["val","css","html","text","data","width","height","offset"],I=["after","prepend","before","append"],V=L.createElement("table"),_=L.createElement("tr"),B={tr:L.createElement("tbody"),tbody:V,thead:V,tfoot:V,td:_,th:_,"*":L.createElement("div")},U=/complete|loaded|interactive/,X=/^[\w-]*$/,J={},W=J.toString,Y={},G=L.createElement("div"),K={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(t){return t instanceof Array};return Y.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=G).appendChild(t),r=~Y.qsa(i,e).indexOf(t),o&&G.removeChild(t),r},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return A.call(t,function(e,n){return t.indexOf(e)==n})},Y.fragment=function(t,e,n){var r,i,a;return R.test(t)&&(r=T(L.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(z,"<$1></$2>")),e===E&&(e=M.test(t)&&RegExp.$1),e in B||(e="*"),a=B[e],a.innerHTML=""+t,r=T.each(D.call(a.childNodes),function(){a.removeChild(this)})),o(n)&&(i=T(r),T.each(n,function(t,e){H.indexOf(t)>-1?i[t](e):i.attr(t,e)})),r},Y.Z=function(t,e){return new d(t,e)},Y.isZ=function(t){return t instanceof Y.Z},Y.init=function(t,n){var r;if(!t)return Y.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&M.test(t))r=Y.fragment(t,RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}else{if(e(t))return T(L).ready(t);if(Y.isZ(t))return t;if(Q(t))r=s(t);else if(i(t))r=[t],t=null;else if(M.test(t))r=Y.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}}return Y.Z(r,t)},T=function(t,e){return Y.init(t,e)},T.extend=function(t){var e,n=D.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){m(t,n,e)}),t},Y.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,a=X.test(o);return t.getElementById&&a&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:D.call(a&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},T.contains=L.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},T.type=t,T.isFunction=e,T.isWindow=n,T.isArray=Q,T.isPlainObject=o,T.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},T.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},T.inArray=function(t,e,n){return O.indexOf.call(e,t,n)},T.camelCase=C,T.trim=function(t){return null==t?"":String.prototype.trim.call(t)},T.uuid=0,T.support={},T.expr={},T.noop=function(){},T.map=function(t,e){var n,r,i,o=[];if(a(t))for(r=0;r<t.length;r++)n=e(t[r],r),null!=n&&o.push(n);else for(i in t)n=e(t[i],i),null!=n&&o.push(n);return u(o)},T.each=function(t,e){var n,r;if(a(t)){for(n=0;n<t.length;n++)if(e.call(t[n],n,t[n])===!1)return t}else for(r in t)if(e.call(t[r],r,t[r])===!1)return t;return t},T.grep=function(t,e){return A.call(t,e)},window.JSON&&(T.parseJSON=JSON.parse),T.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(t,e){J["[object "+e+"]"]=e.toLowerCase()}),T.fn={constructor:Y.Z,length:0,forEach:O.forEach,reduce:O.reduce,push:O.push,sort:O.sort,splice:O.splice,indexOf:O.indexOf,concat:function(){var t,e,n=[];for(t=0;t<arguments.length;t++)e=arguments[t],n[t]=Y.isZ(e)?e.toArray():e;return P.apply(Y.isZ(this)?this.toArray():this,n)},map:function(t){return T(T.map(this,function(e,n){return t.call(e,n,e)}))},slice:function(){return T(D.apply(this,arguments))},ready:function(t){return U.test(L.readyState)&&L.body?t(T):L.addEventListener("DOMContentLoaded",function(){t(T)},!1),this},get:function(t){return t===E?D.call(this):this[t>=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return O.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return e(t)?this.not(this.not(t)):T(A.call(this,function(e){return Y.matches(e,t)}))},add:function(t,e){return T(N(this.concat(T(t,e))))},is:function(t){return this.length>0&&Y.matches(this[0],t)},not:function(t){var n=[];if(e(t)&&t.call!==E)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):a(t)&&e(t.item)?D.call(t):T(t);this.forEach(function(t){r.indexOf(t)<0&&n.push(t)})}return T(n)},has:function(t){return this.filter(function(){return i(t)?T.contains(this,t):T(this).find(t).size()})},eq:function(t){return t===-1?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!i(t)?t:T(t)},last:function(){var t=this[this.length-1];return t&&!i(t)?t:T(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?T(t).filter(function(){var t=this;return O.some.call(n,function(e){return T.contains(e,t)})}):1==this.length?T(Y.qsa(this[0],t)):this.map(function(){return Y.qsa(this,t)}):T()},closest:function(t,e){var n=[],i="object"==typeof t&&T(t);return this.each(function(o,a){for(;a&&!(i?i.indexOf(a)>=0:Y.matches(a,t));)a=a!==e&&!r(a)&&a.parentNode;a&&n.indexOf(a)<0&&n.push(a)}),T(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=T.map(n,function(t){if((t=t.parentNode)&&!r(t)&&e.indexOf(t)<0)return e.push(t),t});return v(e,t)},parent:function(t){return v(N(this.pluck("parentNode")),t)},children:function(t){return v(this.map(function(){return p(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||D.call(this.childNodes)})},siblings:function(t){return v(this.map(function(t,e){return A.call(p(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return T.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=h(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var n=e(t);if(this[0]&&!n)var r=T(t).get(0),i=r.parentNode||this.length>1;return this.each(function(e){T(this).wrapAll(n?t.call(this,e):i?r.cloneNode(!0):r)})},wrapAll:function(t){if(this[0]){T(this[0]).before(t=T(t));for(var e;(e=t.children()).length;)t=e.first();T(t).append(this)}return this},wrapInner:function(t){var n=e(t);return this.each(function(e){var r=T(this),i=r.contents(),o=n?t.call(this,e):t;i.length?i.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){T(this).replaceWith(T(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var e=T(this);(t===E?"none"==e.css("display"):t)?e.show():e.hide()})},prev:function(t){return T(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return T(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;T(this).empty().append(g(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=g(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,e){var n;return"string"!=typeof t||1 in arguments?this.each(function(n){if(1===this.nodeType)if(i(t))for(j in t)y(this,j,t[j]);else y(this,t,g(this,e,n,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(n=this[0].getAttribute(t))?n:E},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){y(this,t)},this)})},prop:function(t,e){return t=K[t]||t,1 in arguments?this.each(function(n){this[t]=g(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=K[t]||t,this.each(function(){delete this[t]})},data:function(t,e){var n="data-"+t.replace(q,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,e):this.attr(n);return null!==r?b(r):E},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=g(this,t,e,this.value)})):this[0]&&(this[0].multiple?T(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=T(this),r=g(this,t,e,n.offset()),i=n.offsetParent().offset(),o={top:r.top-i.top,left:r.left-i.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(L.documentElement!==this[0]&&!T.contains(L.documentElement,this[0]))return{top:0,left:0};var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(e,n){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[C(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var i={},o=getComputedStyle(r,"");return T.each(e,function(t,e){i[e]=r.style[C(e)]||o.getPropertyValue(e)}),i}}var a="";if("string"==t(e))n||0===n?a=c(e)+":"+f(e,n):this.each(function(){this.style.removeProperty(c(e))});else for(j in e)e[j]||0===e[j]?a+=c(j)+":"+f(j,e[j])+";":this.each(function(){this.style.removeProperty(c(j))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(T(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&O.some.call(this,function(t){return this.test(x(t))},l(t))},addClass:function(t){return t?this.each(function(e){if("className"in this){S=[];var n=x(this),r=g(this,t,e,n);r.split(/\s+/g).forEach(function(t){T(this).hasClass(t)||S.push(t)},this),S.length&&x(this,n+(n?" ":"")+S.join(" "))}}):this},removeClass:function(t){return this.each(function(e){if("className"in this){if(t===E)return x(this,"");S=x(this),g(this,t,e,S).split(/\s+/g).forEach(function(t){S=S.replace(l(t)," ")}),x(this,S.trim())}})},toggleClass:function(t,e){return t?this.each(function(n){var r=T(this),i=g(this,t,n,x(this));i.split(/\s+/g).forEach(function(t){(e===E?!r.hasClass(t):e)?r.addClass(t):r.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var e="scrollTop"in this[0];return t===E?e?this[0].scrollTop:this[0].pageYOffset:this.each(e?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var e="scrollLeft"in this[0];return t===E?e?this[0].scrollLeft:this[0].pageXOffset:this.each(e?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),r=Z.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(T(t).css("margin-top"))||0,n.left-=parseFloat(T(t).css("margin-left"))||0,r.top+=parseFloat(T(e[0]).css("border-top-width"))||0,r.left+=parseFloat(T(e[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||L.body;t&&!Z.test(t.nodeName)&&"static"==T(t).css("position");)t=t.offsetParent;return t})}},T.fn.detach=T.fn.remove,["width","height"].forEach(function(t){var e=t.replace(/./,function(t){return t[0].toUpperCase()});T.fn[t]=function(i){var o,a=this[0];return i===E?n(a)?a["inner"+e]:r(a)?a.documentElement["scroll"+e]:(o=this.offset())&&o[t]:this.each(function(e){a=T(this),a.css(t,g(this,i,e,a[t]()))})}}),I.forEach(function(e,n){var r=n%2;T.fn[e]=function(){var e,i,o=T.map(arguments,function(n){var r=[];return e=t(n),"array"==e?(n.forEach(function(t){return t.nodeType!==E?r.push(t):T.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(Y.fragment(t)))}),r):"object"==e||null==n?n:Y.fragment(n)}),a=this.length>1;return o.length<1?this:this.each(function(t,e){i=r?e:e.parentNode,e=0==n?e.nextSibling:1==n?e.firstChild:2==n?e:null;var s=T.contains(L.documentElement,i);o.forEach(function(t){if(a)t=t.cloneNode(!0);else if(!i)return T(t).remove();i.insertBefore(t,e),s&&w(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var e=t.ownerDocument?t.ownerDocument.defaultView:window;e.eval.call(e,t.innerHTML)}})})})},T.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(t){return T(t)[e](this),this}}),Y.Z.prototype=d.prototype=T.fn,Y.uniq=N,Y.deserializeValue=b,T.zepto=Y,T}();!function(t){function e(t){return t._zid||(t._zid=h++)}function n(t,n,o,a){if(n=r(n),n.ns)var s=i(n.ns);return(v[e(t)]||[]).filter(function(t){return t&&(!n.e||t.e==n.e)&&(!n.ns||s.test(t.ns))&&(!o||e(t.fn)===e(o))&&(!a||t.sel==a)})}function r(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function i(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function o(t,e){return t.del&&!y&&t.e in x||!!e}function a(t){return b[t]||y&&x[t]||t}function s(n,i,s,u,l,h,p){var d=e(n),m=v[d]||(v[d]=[]);i.split(/\s/).forEach(function(e){if("ready"==e)return t(document).ready(s);var i=r(e);i.fn=s,i.sel=l,i.e in b&&(s=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return i.fn.apply(this,arguments)}),i.del=h;var d=h||s;i.proxy=function(t){if(t=c(t),!t.isImmediatePropagationStopped()){t.data=u;var e=d.apply(n,t._args==f?[t]:[t].concat(t._args));return e===!1&&(t.preventDefault(),t.stopPropagation()),e}},i.i=m.length,m.push(i),"addEventListener"in n&&n.addEventListener(a(i.e),i.proxy,o(i,p))})}function u(t,r,i,s,u){var c=e(t);(r||"").split(/\s/).forEach(function(e){n(t,e,i,s).forEach(function(e){delete v[c][e.i],"removeEventListener"in t&&t.removeEventListener(a(e.e),e.proxy,o(e,u))})})}function c(e,n){return!n&&e.isDefaultPrevented||(n||(n=e),t.each(T,function(t,r){var i=n[t];e[t]=function(){return this[r]=w,i&&i.apply(n,arguments)},e[r]=E}),e.timeStamp||(e.timeStamp=Date.now()),(n.defaultPrevented!==f?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(e.isDefaultPrevented=w)),e}function l(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===f||(n[e]=t[e]);return c(n,t)}var f,h=1,p=Array.prototype.slice,d=t.isFunction,m=function(t){return"string"==typeof t},v={},g={},y="onfocusin"in window,x={focus:"focusin",blur:"focusout"},b={mouseenter:"mouseover",mouseleave:"mouseout"};g.click=g.mousedown=g.mouseup=g.mousemove="MouseEvents",t.event={add:s,remove:u},t.proxy=function(n,r){var i=2 in arguments&&p.call(arguments,2);if(d(n)){var o=function(){return n.apply(r,i?i.concat(p.call(arguments)):arguments)};return o._zid=e(n),o}if(m(r))return i?(i.unshift(n[r],n),t.proxy.apply(null,i)):t.proxy(n[r],n);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var w=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,T={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,n,r,i,o){var a,c,h=this;return e&&!m(e)?(t.each(e,function(t,e){h.on(t,n,r,e,o)}),h):(m(n)||d(i)||i===!1||(i=r,r=n,n=f),i!==f&&r!==!1||(i=r,r=f),i===!1&&(i=E),h.each(function(f,h){o&&(a=function(t){return u(h,t.type,i),i.apply(this,arguments)}),n&&(c=function(e){var r,o=t(e.target).closest(n,h).get(0);if(o&&o!==h)return r=t.extend(l(e),{currentTarget:o,liveFired:h}),(a||i).apply(o,[r].concat(p.call(arguments,1)))}),s(h,e,i,r,n,c||a)}))},t.fn.off=function(e,n,r){var i=this;return e&&!m(e)?(t.each(e,function(t,e){i.off(t,n,e)}),i):(m(n)||d(r)||r===!1||(r=n,n=f),r===!1&&(r=E),i.each(function(){u(this,e,r,n)}))},t.fn.trigger=function(e,n){return e=m(e)||t.isPlainObject(e)?t.Event(e):c(e),e._args=n,this.each(function(){e.type in x&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,r){var i,o;return this.each(function(a,s){i=l(m(e)?t.Event(e):e),i._args=r,i.target=s,t.each(n(s,e.type||e),function(t,e){if(o=e.proxy(i),i.isImmediatePropagationStopped())return!1})}),o},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){m(t)||(e=t,t=e.type);var n=document.createEvent(g[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),c(n)}}(e),function(t){function e(e,n,r){var i=t.Event(n);return t(e).trigger(i,r),!i.isDefaultPrevented()}function n(t,n,r,i){if(t.global)return e(n||x,r,i)}function r(e){e.global&&0===t.active++&&n(e,null,"ajaxStart")}function i(e){e.global&&!--t.active&&n(e,null,"ajaxStop")}function o(t,e){var r=e.context;return e.beforeSend.call(r,t,e)!==!1&&n(e,r,"ajaxBeforeSend",[t,e])!==!1&&void n(e,r,"ajaxSend",[t,e])}function a(t,e,r,i){var o=r.context,a="success";r.success.call(o,t,a,e),i&&i.resolveWith(o,[t,a,e]),n(r,o,"ajaxSuccess",[e,r,t]),u(a,e,r)}function s(t,e,r,i,o){var a=i.context;i.error.call(a,r,e,t),o&&o.rejectWith(a,[r,e,t]),n(i,a,"ajaxError",[r,i,t||e]),u(e,r,i)}function u(t,e,r){var o=r.context;r.complete.call(o,e,t),n(r,o,"ajaxComplete",[e,r]),i(r)}function c(t,e,n){if(n.dataFilter==l)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function l(){}function f(t){return t&&(t=t.split(";",2)[0]),t&&(t==T?"html":t==j?"json":w.test(t)?"script":E.test(t)&&"xml")||"text"}function h(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function p(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()&&"jsonp"!=e.dataType||(e.url=h(e.url,e.data),e.data=void 0)}function d(e,n,r,i){return t.isFunction(n)&&(i=r,r=n,n=void 0),t.isFunction(r)||(i=r,r=void 0),{url:e,data:n,success:r,dataType:i}}function m(e,n,r,i){var o,a=t.isArray(n),s=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),i&&(n=r?i:i+"["+(s||"object"==o||"array"==o?n:"")+"]"),!i&&a?e.add(u.name,u.value):"array"==o||!r&&"object"==o?m(e,u,r,n):e.add(n,u)})}var v,g,y=+new Date,x=window.document,b=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,w=/^(?:text|application)\/javascript/i,E=/^(?:text|application)\/xml/i,j="application/json",T="text/html",S=/^\s*$/,C=x.createElement("a");C.href=window.location.href,t.active=0,t.ajaxJSONP=function(e,n){if(!("type"in e))return t.ajax(e);var r,i,u=e.jsonpCallback,c=(t.isFunction(u)?u():u)||"Zepto"+y++,l=x.createElement("script"),f=window[c],h=function(e){t(l).triggerHandler("error",e||"abort")},p={abort:h};return n&&n.promise(p),t(l).on("load error",function(o,u){clearTimeout(i),t(l).off().remove(),"error"!=o.type&&r?a(r[0],p,e,n):s(null,u||"error",p,e,n),window[c]=f,r&&t.isFunction(f)&&f(r[0]),f=r=void 0}),o(p,e)===!1?(h("abort"),p):(window[c]=function(){r=arguments},l.src=e.url.replace(/\?(.+)=\?/,"?$1="+c),x.head.appendChild(l),e.timeout>0&&(i=setTimeout(function(){h("timeout")},e.timeout)),p)},t.ajaxSettings={type:"GET",beforeSend:l,success:l,error:l,complete:l,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:j,xml:"application/xml, text/xml",html:T,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:l},t.ajax=function(e){var n,i,u=t.extend({},e||{}),d=t.Deferred&&t.Deferred();for(v in t.ajaxSettings)void 0===u[v]&&(u[v]=t.ajaxSettings[v]);r(u),u.crossDomain||(n=x.createElement("a"),n.href=u.url,n.href=n.href,u.crossDomain=C.protocol+"//"+C.host!=n.protocol+"//"+n.host),u.url||(u.url=window.location.toString()),(i=u.url.indexOf("#"))>-1&&(u.url=u.url.slice(0,i)),p(u);var m=u.dataType,y=/\?.+=\?/.test(u.url);if(y&&(m="jsonp"),u.cache!==!1&&(e&&e.cache===!0||"script"!=m&&"jsonp"!=m)||(u.url=h(u.url,"_="+Date.now())),"jsonp"==m)return y||(u.url=h(u.url,u.jsonp?u.jsonp+"=?":u.jsonp===!1?"":"callback=?")),t.ajaxJSONP(u,d);var b,w=u.accepts[m],E={},j=function(t,e){E[t.toLowerCase()]=[t,e]},T=/^([\w-]+:)\/\//.test(u.url)?RegExp.$1:window.location.protocol,N=u.xhr(),O=N.setRequestHeader;if(d&&d.promise(N),u.crossDomain||j("X-Requested-With","XMLHttpRequest"),j("Accept",w||"*/*"),(w=u.mimeType||w)&&(w.indexOf(",")>-1&&(w=w.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(w)),(u.contentType||u.contentType!==!1&&u.data&&"GET"!=u.type.toUpperCase())&&j("Content-Type",u.contentType||"application/x-www-form-urlencoded"),u.headers)for(g in u.headers)j(g,u.headers[g]);if(N.setRequestHeader=j,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=l,clearTimeout(b);var e,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==T){if(m=m||f(u.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)e=N.response;else{e=N.responseText;try{e=c(e,m,u),"script"==m?(0,eval)(e):"xml"==m?e=N.responseXML:"json"==m&&(e=S.test(e)?null:t.parseJSON(e))}catch(r){n=r}if(n)return s(n,"parsererror",N,u,d)}a(e,N,u,d)}else s(N.statusText||null,N.status?"error":"abort",N,u,d)}},o(N,u)===!1)return N.abort(),s(null,"abort",N,u,d),N;var P=!("async"in u)||u.async;if(N.open(u.type,u.url,P,u.username,u.password),u.xhrFields)for(g in u.xhrFields)N[g]=u.xhrFields[g];for(g in E)O.apply(N,E[g]);return u.timeout>0&&(b=setTimeout(function(){N.onreadystatechange=l,N.abort(),s(null,"timeout",N,u,d)},u.timeout)),N.send(u.data?u.data:null),N},t.get=function(){return t.ajax(d.apply(null,arguments))},t.post=function(){var e=d.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=d.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,r){if(!this.length)return this;var i,o=this,a=e.split(/\s/),s=d(e,n,r),u=s.success;return a.length>1&&(s.url=a[0],i=a[1]),s.success=function(e){o.html(i?t("<div>").html(e.replace(b,"")).find(i):e),u&&u.apply(o,arguments)},t.ajax(s),this};var N=encodeURIComponent;t.param=function(e,n){var r=[];return r.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(e)+"="+N(n))},m(r,e,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(t){var e=getComputedStyle;window.getComputedStyle=function(t,n){try{return e(t,n)}catch(r){return null}}}}(),t("zepto",e)});layui.define(["layer-mobile","zepto"],function(e){"use strict";var t=layui.zepto,a=layui["layer-mobile"],i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"};a.msg=function(e){return a.open({content:e||"",skin:"msg",time:2})};var s=function(e){this.options=e};s.prototype.init=function(){var e=this,a=e.options,r=t("body"),s=t(a.elem||".layui-upload-file"),u=t('<iframe id="'+n+'" class="'+n+'" name="'+n+'"></iframe>');return t("#"+n)[0]||r.append(u),s.each(function(r,s){s=t(s);var u='<form target="'+n+'" method="'+(a.method||"post")+'" key="set-mine" enctype="multipart/form-data" action="'+(a.url||"")+'"></form>',l=s.attr("lay-type")||a.type;a.unwrap||(u='<div class="layui-box layui-upload-button">'+u+'<span class="layui-upload-icon"><i class="layui-icon"></i>'+(s.attr("lay-title")||a.title||"上传"+(o[l]||"图片"))+"</span></div>"),u=t(u),a.unwrap||u.on("dragover",function(e){e.preventDefault(),t(this).addClass(i)}).on("dragleave",function(){t(this).removeClass(i)}).on("drop",function(){t(this).removeClass(i)}),s.parent("form").attr("target")===n&&(a.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=t(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return a.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return a.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return a.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return a.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=t("#"+n),f=setInterval(function(){var t;try{t=c.contents().find("body").text()}catch(i){a.msg("上传接口存在跨域",r),clearInterval(f)}if(t){clearInterval(f),c.contents().find("body").html("");try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(t,e)}},30);e.value=""}},e("upload-mobile",function(e){var t=new s(e=e||{});t.init()})});layui.define(function(i){i("layim-mobile",layui.v)});layui["layui.mobile"]||layui.config({base:layui.cache.dir+"lay/modules/mobile/"}).extend({"layer-mobile":"layer-mobile",zepto:"zepto","upload-mobile":"upload-mobile","layim-mobile":"layim-mobile"}),layui.define(["layer-mobile","zepto","layim-mobile"],function(l){l("mobile",{layer:layui["layer-mobile"],layim:layui["layim-mobile"]})});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/rate.js b/payapi/src/main/resources/static/libs/layui/lay/modules/rate.js
new file mode 100755
index 0000000..762fb3a
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/rate.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='<ul class="layui-rate" '+(i.readonly?"readonly":"")+">",u=1;u<=i.length;u++){var r='<li class="layui-inline"><i class="layui-icon '+(u>Math.floor(i.value)?o:s)+'" '+l+"></i></li>";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'<li><i class="layui-icon layui-icon-rate-half" '+l+"></i></li>":n+=r}n+="</ul>"+(i.text?'<span class="layui-inline">'+i.value+"星":"")+"</span>";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/slider.js b/payapi/src/main/resources/static/libs/layui/lay/modules/slider.js
new file mode 100755
index 0000000..446378d
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/slider.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.max<t.min&&(t.max=t.min+t.step),t.range){t.value="object"==typeof t.value?t.value:[t.min,t.value];var a=Math.min(t.value[0],t.value[1]),n=Math.max(t.value[0],t.value[1]);t.value[0]=a>t.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.value<t.min&&(t.value=t.min),t.value>t.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='<div class="layui-slider '+("vertical"===t.type?"layui-slider-vertical":"")+'">'+(t.tips?'<div class="layui-slider-tips"></div>':"")+'<div class="layui-slider-bar" style="background:'+p+"; "+("vertical"===t.type?"height":"width")+":"+m+";"+("vertical"===t.type?"bottom":"left")+":"+(r||0)+';"></div><div class="layui-slider-wrap" style="'+("vertical"===t.type?"bottom":"left")+":"+(r||m)+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+p+';"></div></div>'+(t.range?'<div class="layui-slider-wrap" style="'+("vertical"===t.type?"bottom":"left")+":"+v+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+p+';"></div></div>':"")+"</div>",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x<g+1;x++){var T=100*x/g;T<100&&(b+='<div class="layui-slider-step" style="'+("vertical"===t.type?"bottom":"left")+":"+T+'%"></div>')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('<div class="layui-slider-input layui-input"><div class="layui-slider-input-txt"><input type="text" class="layui-input"></div><div class="layui-slider-input-btn"><i class="layui-icon layui-icon-up"></i><i class="layui-icon layui-icon-down"></i></div></div>');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['<div class="layui-auxiliar-moving" id="LAY-slider-moving"></div'].join("")),M=function(e,t){var a=function(){t&&t(),w.remove()};i("#LAY-slider-moving")[0]||i("body").append(w),w.on("mousemove",e),w.on("mouseup",a).on("mouseleave",a)};if("set"===e)return x(t,a);s.find("."+u).each(function(e){var t=i(this);t.on("mousedown",function(i){i=i||window.event;var a=t.parent()[0].offsetLeft,n=i.clientX;"vertical"===l.type&&(a=f()-t.parent()[0].offsetTop-h.height(),n=i.clientY);var r=function(i){i=i||window.event;var r=a+("vertical"===l.type?n-i.clientY:i.clientX-n);r<0&&(r=0),r>f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.step<l.min?l.min:Number(g)-l.step:Number(g)+l.step>l.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=e<l.min?l.min:e,e=e>l.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/table.js b/payapi/src/main/resources/static/libs/layui/lay/modules/table.js
new file mode 100755
index 0000000..e9217db
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/table.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,layui.hint()),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,u,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)},config:t}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u="table",h=".layui-table",y="layui-hide",f="layui-none",p="layui-table-view",v=".layui-table-tool",m=".layui-table-box",g=".layui-table-init",b=".layui-table-header",x=".layui-table-body",k=".layui-table-main",C=".layui-table-fixed",w=".layui-table-fixed-l",T=".layui-table-fixed-r",A=".layui-table-total",L=".layui-table-page",S=".layui-table-sort",N="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<thead>","{{# layui.each(d.data.cols, function(i1, item1){ }}","<tr>","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'<th data-field="{{ item2.field||i2 }}" data-key="{{d.index}}-{{i1}}-{{i2}}" {{# if( item2.parentKey){ }}data-parentkey="{{ item2.parentKey }}"{{# } }} {{# if(item2.minWidth){ }}data-minwidth="{{item2.minWidth}}"{{# } }} '+t+' {{# if(item2.unresize || item2.colGroup){ }}data-unresize="true"{{# } }} class="{{# if(item2.hide){ }}layui-hide{{# } }}{{# if(isSort){ }} layui-unselect{{# } }}{{# if(!item2.field){ }} layui-table-col-special{{# } }}">','<div class="layui-table-cell laytable-cell-',"{{# if(item2.colGroup){ }}","group","{{# } else { }}","{{d.index}}-{{i1}}-{{i2}}",'{{# if(item2.type !== "normal"){ }}'," laytable-cell-{{ item2.type }}","{{# } }}","{{# } }}",'" {{#if(item2.align){}}align="{{item2.align}}"{{#}}}>','{{# if(item2.type === "checkbox"){ }}','<input type="checkbox" name="layTableCheckbox" lay-skin="primary" lay-filter="layTableAllChoose" {{# if(item2[d.data.checkName]){ }}checked{{# }; }}>',"{{# } else { }}",'<span>{{item2.title||""}}</span>',"{{# if(isSort){ }}",'<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc" title="升序"></i><i class="layui-edge layui-table-sort-desc" title="降序"></i></span>',"{{# } }}","{{# } }}","</div>","</th>",e.fixed?"{{# }; }}":"","{{# }); }}","</tr>","{{# }); }}","</thead>","</table>"].join("")},E=['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<tbody></tbody>","</table>"].join(""),z=['<div class="layui-form layui-border-box {{d.VIEW_CLASS}}" lay-filter="LAY-table-{{d.index}}" lay-id="{{ d.data.id }}" style="{{# if(d.data.width){ }}width:{{d.data.width}}px;{{# } }} {{# if(d.data.height){ }}height:{{d.data.height}}px;{{# } }}">',"{{# if(d.data.toolbar){ }}",'<div class="layui-table-tool">','<div class="layui-table-tool-temp"></div>','<div class="layui-table-tool-self"></div>',"</div>","{{# } }}",'<div class="layui-table-box">',"{{# if(d.data.loading){ }}",'<div class="layui-table-init" style="background-color: #fff;">','<i class="layui-icon layui-icon-loading layui-icon"></i>',"</div>","{{# } }}","{{# var left, right; }}",'<div class="layui-table-header">',_(),"</div>",'<div class="layui-table-body layui-table-main">',E,"</div>","{{# if(left){ }}",'<div class="layui-table-fixed layui-table-fixed-l">','<div class="layui-table-header">',_({fixed:!0}),"</div>",'<div class="layui-table-body">',E,"</div>","</div>","{{# }; }}","{{# if(right){ }}",'<div class="layui-table-fixed layui-table-fixed-r">','<div class="layui-table-header">',_({fixed:"right"}),'<div class="layui-table-mend"></div>',"</div>",'<div class="layui-table-body">',E,"</div>","</div>","{{# }; }}","</div>","{{# if(d.data.totalRow){ }}",'<div class="layui-table-total">','<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>','<tbody><tr><td><div class="layui-table-cell" style="visibility: hidden;">Total</div></td></tr></tbody>',"</table>","</div>","{{# } }}","{{# if(d.data.page){ }}",'<div class="layui-table-page">','<div id="layui-table-page{{d.index}}"></div>',"</div>","{{# } }}","<style>","{{# layui.each(d.data.cols, function(i1, item1){","layui.each(item1, function(i2, item2){ }}",".laytable-cell-{{d.index}}-{{i1}}-{{i2}}{ ","{{# if(item2.width){ }}","width: {{item2.width}}px;","{{# } }}"," }","{{# });","}); }}","</style>","</div>"].join(""),H=t(window),R=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+p),o=e.elem=t(i(z).render({VIEW_CLASS:p,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(v),e.layBox=o.find(m),e.layHeader=o.find(b),e.layMain=o.find(k),e.layBody=o.find(x),e.layFixed=o.find(C),e.layFixLeft=o.find(w),e.layFixRight=o.find(T),e.layTotal=o.find(A),e.layPage=o.find(L),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(b).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['<div class="layui-inline" lay-event="add"><i class="layui-icon layui-icon-add-1"></i></div>','<div class="layui-inline" lay-event="update"><i class="layui-icon layui-icon-edit"></i></div>','<div class="layui-inline" lay-event="delete"><i class="layui-icon layui-icon-delete"></i></div>'].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i=r[t];i&&d.push('<div class="layui-inline" title="'+i.title+'" lay-event="'+i.layEvent+'"><i class="layui-icon '+i.icon+'"></i></div>')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](y),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&l<s&&(a--,c=s):(c=d.width||0,/\d+%$/.test(c)?(c=Math.floor(parseFloat(c)/100*o),c<s&&(c=s)):c||(d.width=c=0,a++)),d.hide&&(c=0),n+=c)):void r.splice(i,1)})}),o>n&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;i.config.data&&i.config.data.constructor===Array&&delete i.config.data,i.config=t.extend({},i.config,e),i.render()},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.layMain.html('<div class="'+f+'">'+(t[n.msgName]||"返回的数据不符合规范,正确的成功状态码 ("+n.statusName+") 应为:"+n.statusCode)+"</div>")):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.layMain.html('<div class="'+f+'">数据接口请求异常:'+t+"</div>"),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,i.renderData(c,e,a.data.length),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=[],p=[],v=[],m=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(a,l){var o=[],u=[],f=[],m=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,h=s.index+"-"+r.key,p=l[c];if(void 0!==p&&null!==p||(p=""),!r.colGroup){var v=['<td data-field="'+c+'" data-key="'+h+'" '+function(){var e=[];return r.edit&&e.push('data-edit="'+r.edit+'"'),r.align&&e.push('align="'+r.align+'"'),r.templet&&e.push('data-content="'+p+'"'),r.toolbar&&e.push('data-off="true"'),r.event&&e.push('lay-event="'+r.event+'"'),r.style&&e.push('style="'+r.style+'"'),r.minWidth&&e.push('data-minwidth="'+r.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return r.hide&&e.push(y),r.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','<div class="layui-table-cell laytable-cell-'+function(){return"normal"===r.type?h:h+" laytable-cell-"+r.type}()+'">'+function(){var n=t.extend(!0,{LAY_INDEX:m},l),o=d.config.checkName;switch(r.type){case"checkbox":return'<input type="checkbox" name="layTableCheckbox" lay-skin="primary" '+function(){return r[o]?(l[o]=r[o],r[o]?"checked":""):n[o]?"checked":""}()+">";case"radio":return n[o]&&(e=a),'<input type="radio" name="layTableRadio_'+s.index+'" '+(n[o]?"checked":"")+' lay-type="layTableRadio">';case"numbers":return m}return r.toolbar?i(t(r.toolbar).html()||"").render(n):r.templet?function(){return"function"==typeof r.templet?r.templet(n):i(t(r.templet).html()||String(p)).render(n)}():p}(),"</div></td>"].join("");o.push(v),r.fixed&&"right"!==r.fixed&&u.push(v),"right"===r.fixed&&f.push(v)}}),h.push('<tr data-index="'+a+'">'+o.join("")+"</tr>"),p.push('<tr data-index="'+a+'">'+u.join("")+"</tr>"),v.push('<tr data-index="'+a+'">'+f.join("")+"</tr>"))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(p.join("")),c.layFixRight.find("tbody").html(v.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return c.key=s.id||s.index,d.cache[c.key]=u,c.layPage[0==o||0===u.length&&1==n?"addClass":"removeClass"](y),r?m():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('<div class="'+f+'">'+s.text.none+"</div>")):(m(),c.renderTotal(u),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'<i class="layui-icon"></i>',next:'<i class="layui-icon"></i>',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.loading(),c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e){var t=this,i=t.config,a={};if(i.totalRow){layui.each(e,function(e,i){0!==i.length&&t.eachCols(function(e,t){var l=t.field||e,n=i[l];t.totalRow&&(a[l]=(a[l]||0)+(parseFloat(n)||0))})});var l=[];t.eachCols(function(e,t){var n=t.field||e,o=['<td data-field="'+n+'" data-key="'+i.index+"-"+t.key+'" '+function(){var e=[];return t.align&&e.push('align="'+t.align+'"'),t.style&&e.push('style="'+t.style+'"'),t.minWidth&&e.push('data-minwidth="'+t.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return t.hide&&e.push(y),t.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','<div class="layui-table-cell laytable-cell-'+function(){var e=i.index+"-"+t.key;return"normal"===t.type?e:e+" laytable-cell-"+t.type}()+'">'+function(){var e=t.totalRowText||"";return t.totalRow?parseFloat(a[n]).toFixed(2)||e:e}(),"</div></td>"].join("");l.push(o)}),t.layTotal.find("tbody").html("<tr>"+l.join("")+"</tr>")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},h=c.config,y=h.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},h.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[h.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,u,"sort("+y+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(g).remove()):(i.layInit=t(['<div class="layui-table-init">','<i class="layui-icon layui-icon-loading layui-icon"></i>',"</div>"].join("")),i.layBox.append(i.layInit)))},F.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},F.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},F.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e=e-(t.layPage.outerHeight()||41)-2),t.layMain.css("height",e))},F.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},F.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('<th class="layui-table-patch"><div class="layui-table-cell"></div></th>');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(x).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](y),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,a=this,o=a.config,c=t("body"),s={},h=a.layHeader.find("th"),f=".layui-table-cell",p=o.elem.attr("lay-filter");a.layTool.on("click","*[lay-event]",function(e){var i=t(this),c=i.attr("lay-event"),s=function(e){var l=t(e.list),n=t('<ul class="layui-table-tool-panel"></ul>');n.html(l),o.height&&n.css("max-height",o.height-(a.layTool.outerHeight()||50)),i.find(".layui-table-tool-panel")[0]||i.append(n),a.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),R.trigger("table.tool.panel.remove"),l.close(a.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return a.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('<li><input type="checkbox" name="'+i.field+'" data-key="'+i.key+'" data-parentkey="'+(i.parentKey||"")+'" lay-skin="primary" '+(i.hide?"":"checked")+' title="'+(i.title||i.field)+'" lay-filter="LAY_TABLE_TOOL_COLS"></li>')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var i=t(e.elem),l=this.checked,n=i.data("key"),r=i.data("parentkey");layui.each(o.cols,function(e,t){layui.each(t,function(t,i){if(e+"-"+t===n){var d=i.hide;i.hide=!l,a.elem.find('*[data-key="'+o.index+"-"+n+'"]')[l?"removeClass":"addClass"](y),d!=i.hide&&a.setParentCol(!l,r),a.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['<li data-type="csv">导出到 Csv 文件</li>','<li data-type="xls">导出到 Excel 文件</li>'].join("")}(),done:function(e,i){i.on("click",function(){var e=t(this).data("type");d.exportFile(o.id,null,e)})}});break;case"LAYTABLE_PRINT":var h=window.open("打印窗口","_blank"),f=["<style>","body{font-size: 12px; color: #666;}","table{width: 100%; border-collapse: collapse; border-spacing: 0;}","th,td{line-height: 20px; padding: 9px 15px; border: 1px solid #ccc; text-align: left; font-size: 12px; color: #666;}","a{color: #666; text-decoration:none;}","*.layui-hide{display: none}","</style>"].join(""),v=t(a.layHeader.html());v.append(a.layMain.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),h.document.write(f+v.prop("outerHTML")),h.document.close(),h.print(),h.close()}layui.event.call(this,u,"toolbar("+p+")",t.extend({event:c,config:o},{}))}),h.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||s.resizeStart||(s.allowResize=i.width()-l<=10,c.css("cursor",s.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);s.resizeStart||c.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(s.allowResize){var l=i.data("key");e.preventDefault(),s.resizeStart=!0,s.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();s.rule=e,s.ruleWidth=parseFloat(t),s.minWidth=i.data("minwidth")||o.cellMinWidth})}}),R.on("mousemove",function(t){if(s.resizeStart){if(t.preventDefault(),s.rule){var i=s.ruleWidth+t.clientX-s.offset[0];i<s.minWidth&&(i=s.minWidth),s.rule.style.width=i+"px",l.close(a.tipsIndex)}e=1}}).on("mouseup",function(t){s.resizeStart&&(s={},c.css("cursor",""),a.scrollPatch()),2===e&&(e=null)}),h.on("click",function(i){var l,n=t(this),o=n.find(S),r=o.attr("lay-sort");return o[0]&&1!==e?(l="asc"===r?"desc":"desc"===r?null:"asc",void a.sort(n,l,null,!0)):e=2}).find(S+" .layui-edge ").on("click",function(e){var i=t(this),l=i.index(),n=i.parents("th").eq(0).data("field");layui.stope(e),0===l?a.sort(n,"asc",null,!0):a.sort(n,"desc",null,!0)});var v=function(e){var l=t(this),n=l.parents("tr").eq(0).data("index"),o=a.layBody.find('tr[data-index="'+n+'"]'),r=d.cache[a.key][n];return t.extend({tr:o,data:d.clearCacheKey(r),del:function(){d.cache[a.key][n]=[],o.remove(),a.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,l){if(e in r){var n,d=o.children('td[data-field="'+e+'"]');r[e]=l,a.eachCols(function(t,i){i.field==e&&i.templet&&(n=i.templet)}),d.children(f).html(function(){return n?function(){return"function"==typeof n?n(r):i(t(n).html()||l).render(r)}():l}()),d.data("content",l)}})}},e)};a.elem.on("click",'input[name="layTableCheckbox"]+',function(){var e=t(this).prev(),i=a.layBody.find('input[name="layTableCheckbox"]'),l=e.parents("tr").eq(0).data("index"),n=e[0].checked,o="layTableAllChoose"===e.attr("lay-filter");o?(i.each(function(e,t){t.checked=n,a.setCheckData(e,n)}),a.syncCheckAll(),a.renderForm("checkbox")):(a.setCheckData(l,n),a.syncCheckAll()),layui.event.call(e[0],u,"checkbox("+p+")",v.call(e[0],{checked:n,type:o?"all":"one"}))}),a.elem.on("click",'input[lay-type="layTableRadio"]+',function(){var e=t(this).prev(),i=e[0].checked,l=d.cache[a.key],n=e.parents("tr").eq(0).data("index");layui.each(l,function(e,t){n===e?t.LAY_CHECKED=!0:delete t.LAY_CHECKED}),a.setThisRowChecked(n),layui.event.call(this,u,"radio("+p+")",v.call(this,{checked:i}))}),a.layBody.on("mouseenter","tr",function(){var e=t(this),i=e.index();a.layBody.find("tr:eq("+i+")").addClass(W)}).on("mouseleave","tr",function(){var e=t(this),i=e.index();a.layBody.find("tr:eq("+i+")").removeClass(W)}).on("click","tr",function(){m.call(this,"row")}).on("dblclick","tr",function(){m.call(this,"rowDouble")});var m=function(e){var i=t(this);layui.event.call(this,u,e+"("+p+")",v.call(i.children("td")[0]))};a.layBody.on("change","."+N,function(){var e=t(this),i=this.value,l=e.parent().data("field"),n=e.parents("tr").eq(0).data("index"),o=d.cache[a.key][n];o[l]=i,layui.event.call(this,u,"edit("+p+")",v.call(this,{value:i,field:l}))}).on("blur","."+N,function(){var e,l=t(this),n=l.parent().data("field"),o=l.parents("tr").eq(0).data("index"),r=d.cache[a.key][o];a.eachCols(function(t,i){i.field==n&&i.templet&&(e=i.templet)}),l.siblings(f).html(function(a){return e?function(){return"function"==typeof e?e(r):i(t(e).html()||this.value).render(r)}():a}(this.value)),l.parent().data("content",this.value),l.remove()}),a.layBody.on("click","td",function(e){var i=t(this),a=(i.data("field"),i.data("edit")),l=i.children(f);if(!i.data("off")&&a){var n=t('<input class="layui-input '+N+'">');return n[0].value=i.data("content")||l.text(),i.find("."+N)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(f);if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('<div class="'+g+'"><i class="layui-icon layui-icon-down"></i></div>')}};a.layBody.on("click","."+g,function(e){var i=t(this),n=i.parent(),d=n.children(f);a.tipsIndex=l.tips(['<div class="layui-table-tips-main" style="margin-top: -'+(d.height()+16)+"px;"+function(){return"sm"===o.size?"padding: 4px 15px; font-size: 12px;":"lg"===o.size?"padding: 14px 15px;":""}()+'">',d.html(),"</div>",'<i class="layui-icon layui-table-tips-c layui-icon-close"></i>'].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:a.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),i=e.parents("tr").eq(0).data("index");layui.event.call(this,u,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),a.setThisRowChecked(i)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layTotal.scrollLeft(i),a.layFixed.find(x).scrollTop(n),l.close(a.tipsIndex)}),R.on("click",function(){R.trigger("table.remove.tool.panel")}),R.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()}),H.on("resize",function(){a.resize()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var a=c.config[e]||{},l={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],n=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(n.href="data:"+l+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],a=[];return layui.each(t,function(t,l){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(l),function(e,t){n.push(t)})):d.eachCols(e,function(e,a){a.field&&"normal"==a.type&&!a.hide&&(0==t&&i.push(a.title||""),n.push(l[a.field]))}),a.push(n.join(","))}),i.join(",")+"\r\n"+a.join("\r\n")}()),n.download=(a.title||"table_"+(a.index||""))+"."+i,document.body.appendChild(n),n.click(),void document.body.removeChild(n))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,i){i=i||{};var a=s(e);if(a)return i.data&&i.data.constructor===Array&&delete a.data,d.render(t.extend(!0,{},a,i))},d.render=function(e){var t=new F(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(u,d)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/tree.js b/payapi/src/main/resources/static/libs/layui/lay/modules/tree.js
new file mode 100755
index 0000000..e8c053d
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/tree.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('<ul class="'+(n.spread?"layui-show":"")+'"></ul>'),s=o(["<li "+(n.spread?'data-spread="'+n.spread+'"':"")+">",function(){return l?'<i class="layui-icon layui-tree-spread">'+(n.spread?t.arrow[1]:t.arrow[0])+"</i>":""}(),function(){return r.check?'<i class="layui-icon layui-tree-check">'+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"</i>":""}(),function(){return'<a href="'+(n.href||"javascript:;")+'" '+(r.target&&n.href?'target="'+r.target+'"':"")+">"+('<i class="layui-icon layui-tree-'+(l?"branch":"leaf")+'">'+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"</i>")+("<cite>"+(n.name||"未命名")+"</cite></a>")}(),"</li>"].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('<div class="layui-box '+t+'"></div>'));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/upload.js b/payapi/src/main/resources/static/libs/layui/lay/modules/upload.js
new file mode 100755
index 0000000..404d534
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/upload.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['<input class="'+u+'" type="file" accept="'+t.acceptMime+'" name="'+t.field+'"',t.multiple?" multiple":"",">"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('<div class="layui-upload-wrap"></div>'),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i('<iframe id="'+f+'" class="'+f+'" name="'+f+'" frameborder="0"></iframe>'),a=i(['<form target="'+f+'" class="'+c+'" method="post" key="set-mine" enctype="multipart/form-data" action="'+t.url+'">',"</form>"].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('<input type="hidden" name="'+i+'" value="'+t+'">')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after('<span class="layui-inline '+s+'">'+o+"</span>")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/util.js b/payapi/src/main/resources/static/libs/layui/lay/modules/util.js
new file mode 100755
index 0000000..8d38508
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/util.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(t){"use strict";var e=layui.$,i={fixbar:function(t){var i,a,n="layui-fixbar",r="layui-fixbar-top",o=e(document),l=e("body");t=e.extend({showHeight:200},t),t.bar1=t.bar1===!0?"":t.bar1,t.bar2=t.bar2===!0?"":t.bar2,t.bgcolor=t.bgcolor?"background-color:"+t.bgcolor:"";var c=[t.bar1,t.bar2,""],g=e(['<ul class="'+n+'">',t.bar1?'<li class="layui-icon" lay-type="bar1" style="'+t.bgcolor+'">'+c[0]+"</li>":"",t.bar2?'<li class="layui-icon" lay-type="bar2" style="'+t.bgcolor+'">'+c[1]+"</li>":"",'<li class="layui-icon '+r+'" lay-type="top" style="'+t.bgcolor+'">'+c[2]+"</li>","</ul>"].join("")),s=g.find("."+r),u=function(){var e=o.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+n)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),a=i.attr("lay-type");"top"===a&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,a)}),o.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var a=this,n="function"==typeof e,r=new Date(t).getTime(),o=new Date(!e||n?(new Date).getTime():e).getTime(),l=r-o,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];n&&(i=e);var g=setTimeout(function(){a.countdown(t,o+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],e,g),l<=0&&clearTimeout(g),g},timeAgo:function(t,e){var i=this,a=[[],[]],n=(new Date).getTime()-new Date(t).getTime();return n>6912e5?(n=new Date(t),a[0][0]=i.digit(n.getFullYear(),4),a[0][1]=i.digit(n.getMonth()+1),a[0][2]=i.digit(n.getDate()),e||(a[1][0]=i.digit(n.getHours()),a[1][1]=i.digit(n.getMinutes()),a[1][2]=i.digit(n.getSeconds())),a[0].join("-")+" "+a[1].join(":")):n>=864e5?(n/1e3/60/60/24|0)+"天前":n>=36e5?(n/1e3/60/60|0)+"小时前":n>=12e4?(n/1e3/60|0)+"分钟前":n<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var a=t.length;a<e;a++)i+="0";return t<Math.pow(10,e)?i+(0|t):t},toDateString:function(t,e){var i=this,a=new Date(t||new Date),n=[i.digit(a.getFullYear(),4),i.digit(a.getMonth()+1),i.digit(a.getDate())],r=[i.digit(a.getHours()),i.digit(a.getMinutes()),i.digit(a.getSeconds())];return e=e||"yyyy-MM-dd HH:mm:ss",e.replace(/yyyy/g,n[0]).replace(/MM/g,n[1]).replace(/dd/g,n[2]).replace(/HH/g,r[0]).replace(/mm/g,r[1]).replace(/ss/g,r[2])},escape:function(t){return String(t||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")}};!function(t,e,i){"$:nomunge";function a(){n=e[l](function(){r.each(function(){var e=t(this),i=e.width(),a=e.height(),n=t.data(this,g);(i!==n.w||a!==n.h)&&e.trigger(c,[n.w=i,n.h=a])}),a()},o[s])}var n,r=t([]),o=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";o[s]=250,o[u]=!0,t.event.special[c]={setup:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===r.length&&a()},teardown:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.not(e),e.removeData(g),r.length||clearTimeout(n)},add:function(e){function a(e,a,r){var o=t(this),l=t.data(this,g)||{};l.w=a!==i?a:o.width(),l.h=r!==i?r:o.height(),n.apply(this,arguments)}if(!o[u]&&this[l])return!1;var n;return t.isFunction(e)?(n=e,a):(n=e.handler,void(e.handler=a))}}}(e,window),t("util",i)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/layui.all.js b/payapi/src/main/resources/static/libs/layui/layui.all.js
new file mode 100755
index 0000000..5cd5973
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/layui.all.js
@@ -0,0 +1,5 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;!function(e){"use strict";var t=document,o={modules:{},status:{},timeout:10,event:{}},n=function(){this.v="2.4.5"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,o=t.scripts,n=o.length-1,r=n;r>0;r--)if("interactive"===o[r].readyState){e=o[r].src;break}return e||o[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),i=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},a="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,i=function(){var e=function(e,t){layui[e]=t,o.status[e]=!0};return"function"==typeof t&&t(function(n,r){e(n,r),o.callback[n]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?i.call(n):(n.use(e,i),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":/^\{\/\}/.test(y.modules[f])?"":o.base||"")+(y.modules[f]||f)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||a?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var a=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?a:(function p(){return++y>1e3*o.timeout/100?i(e+" timeout"):void(1989===parseInt(a.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),a)},o.callback={},n.prototype.factory=function(e){if(layui[e])return"function"==typeof o.callback[e]?o.callback[e]:null},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,"function"==typeof t&&t(n)},void(n.onerror=function(e){n.onerror=null,"function"==typeof o&&o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?i("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),o.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o,n){if(t=t||"layui",n=n||localStorage,e.JSON&&e.JSON.parse){if(null===o)return delete n[t];o="object"==typeof o?o:{key:o};try{var r=JSON.parse(n[t])}catch(i){var r={}}return"value"in o&&(r[o.key]=o.value),o.remove&&delete r[o.key],n[t]=JSON.stringify(r),o.key?r[o.key]:r}},n.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:i}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;o<e.length&&!t.call(e[o],o,e[o]);o++);return n},n.prototype.sort=function(e,t,o){var n=JSON.parse(JSON.stringify(e||[]));return t?(n.sort(function(e,o){var n=/^-?\d+$/,r=e[t],i=o[t];return n.test(r)&&(r=parseFloat(r)),n.test(i)&&(i=parseFloat(i)),r&&!i?1:!r&&i?-1:r>i?1:r<i?-1:0}),o&&n.reverse(),n):n},n.prototype.stope=function(t){t=t||e.event;try{t.stopPropagation()}catch(o){t.cancelBubble=!0}},n.prototype.onevent=function(e,t,o){return"string"!=typeof e||"function"!=typeof o?this:n.event(e,t,null,o)},n.prototype.event=n.event=function(e,t,n,r){var i=this,a=null,u=t.match(/\((.*)\)$/)||[],l=(e+"."+t).replace(u[0],""),s=u[1]||"",c=function(e,t){var o=t&&t.call(i,n);o===!1&&null===a&&(a=!1)};return r?(o.event[l]=o.event[l]||{},o.event[l][s]=[r],this):(layui.each(o.event[l],function(e,t){return"{*}"===s?void layui.each(t,c):(""===e&&layui.each(t,c),void(s&&e===s&&layui.each(t,c)))}),a)},e.layui=new n}(window);layui.define(function(a){var i=layui.cache;layui.config({dir:i.dir.replace(/lay\/dest\/$/,"")}),a("layui.all",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?'<a href="javascript:;" class="layui-laypage-prev'+(1==a.curr?" "+r:"")+'" data-page="'+(a.curr-1)+'">'+a.prev+"</a>":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push('<a href="javascript:;" class="layui-laypage-first" data-page="1" title="首页">'+(a.first||1)+"</a>");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r<t-1&&(r=u-t+1),a.first!==!1&&r>2&&e.push('<span class="layui-laypage-spr">…</span>');r<=u;r++)r===a.curr?e.push('<span class="layui-laypage-curr"><em class="layui-laypage-em" '+(/^#/.test(a.theme)?'style="background-color:'+a.theme+';"':"")+"></em><em>"+r+"</em></span>"):e.push('<a href="javascript:;" data-page="'+r+'">'+r+"</a>");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1<a.pages&&e.push('<span class="layui-laypage-spr">…</span>'),0!==t&&e.push('<a href="javascript:;" class="layui-laypage-last" title="尾页" data-page="'+a.pages+'">'+(a.last||a.pages)+"</a>")),e.join("")}(),next:function(){return a.next?'<a href="javascript:;" class="layui-laypage-next'+(a.curr==a.pages?" "+r:"")+'" data-page="'+(a.curr+1)+'">'+a.next+"</a>":""}(),count:'<span class="layui-laypage-count">共 '+a.count+" 条</span>",limit:function(){var e=['<span class="layui-laypage-limits"><select lay-ignore>'];return layui.each(a.limits,function(t,n){e.push('<option value="'+n+'"'+(n===a.limit?"selected":"")+">"+n+" 条/页</option>")}),e.join("")+"</select></span>"}(),refresh:['<a href="javascript:;" data-page="'+a.curr+'" class="layui-laypage-refresh">','<i class="layui-icon layui-icon-refresh"></i>',"</a>"].join(""),skip:function(){return['<span class="layui-laypage-skip">到第','<input type="text" min="1" value="'+a.curr+'" class="layui-input">','页<button type="button" class="layui-laypage-btn">确定</button>',"</span>"].join("")}()};return['<div class="layui-box layui-laypage layui-laypage-'+(a.theme?/^#/.test(a.theme)?"molv":a.theme:"default")+'" id="layui-laypage-'+a.index+'">',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"</div>"].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;o<y;o++)"a"===r[o].nodeName.toLowerCase()&&s.on(r[o],"click",function(){var e=0|this.getAttribute("data-page");e<1||e>i.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期<br>建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t<n.length;t++)this.push(n[t])};C.prototype=[],C.prototype.constructor=C,w.extend=function(){var e=1,t=arguments,n=function(e,t){e=e||(t.constructor===Array?[]:{});for(var a in t)e[a]=t[a]&&t[a].constructor===Object?n(e[a],t[a]):t[a];return e};for(t[0]="object"==typeof t[0]?t[0]:{};e<t.length;e++)"object"==typeof t[e]&&n(t[0],t[e]);return t[0]},w.ie=function(){var e=navigator.userAgent.toLowerCase();return!!(window.ActiveXObject||"ActiveXObject"in window)&&((e.match(/msie\s(\d+)/)||[])[1]||"11")}(),w.stope=function(e){e=e||window.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},w.each=function(e,t){var n,a=this;if("function"!=typeof t)return a;if(e=e||[],e.constructor===Object){for(n in e)if(t.call(e[n],n,e[n]))break}else for(n=0;n<e.length&&!t.call(e[n],n,e[n]);n++);return a},w.digit=function(e,t,n){var a="";e=String(e),t=t||2;for(var i=e.length;i<t;i++)a+="0";return e<Math.pow(10,t)?a+(0|e):e},w.elem=function(e,t){var n=document.createElement(e);return w.each(t||{},function(e,t){n.setAttribute(e,t)}),n},C.addStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){new RegExp("\\b"+n+"\\b").test(e)||(e=e+" "+n)}),e.replace(/^\s|\s$/,"")},C.removeStr=function(e,t){return e=e.replace(/\s+/," "),t=t.replace(/\s+/," ").split(" "),w.each(t,function(t,n){var a=new RegExp("\\b"+n+"\\b");a.test(e)&&(e=e.replace(a,""))}),e.replace(/\s+/," ").replace(/^\s|\s$/,"")},C.prototype.find=function(e){var t=this,n=0,a=[],i="object"==typeof e;return this.each(function(r,o){for(var s=i?[e]:o.querySelectorAll(e||null);n<s.length;n++)a.push(s[n]);t.shift()}),i||(t.selector=(t.selector?t.selector+" ":"")+e),w.each(a,function(e,n){t.push(n)}),t},C.prototype.each=function(e){return w.each.call(this,this,e)},C.prototype.addClass=function(e,t){return this.each(function(n,a){a.className=C[t?"removeStr":"addStr"](a.className,e)})},C.prototype.removeClass=function(e){return this.addClass(e,!0)},C.prototype.hasClass=function(e){var t=!1;return this.each(function(n,a){new RegExp("\\b"+e+"\\b").test(a.className)&&(t=!0)}),t},C.prototype.attr=function(e,t){var n=this;return void 0===t?function(){if(n.length>0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r<s?o+r*s:r:o);a=[l.getFullYear(),l.getMonth()+1,l.getDate()],r<s||(i=[l.getHours(),l.getMinutes(),l.getSeconds()])}else a=(t[n].match(/\d+-\d+-\d+/)||[""])[0].split("-"),i=(t[n].match(/\d+:\d+:\d+/)||[""])[0].split(":");t[n]={year:0|a[0]||(new Date).getFullYear(),month:a[1]?(0|a[1])-1:(new Date).getMonth(),date:0|a[2]||(new Date).getDate(),hours:0|i[0],minutes:0|i[1],seconds:0|i[2]}}),e.elemID="layui-laydate"+t.elem.attr("lay-key"),(t.show||a)&&e.render(),a||e.events(),t.value&&t.isInitValue&&(t.value.constructor===Date?e.setValue(e.parse(0,e.systemDate(t.value))):e.setValue(t.value)))},T.prototype.render=function(){var e=this,t=e.config,n=e.lang(),a="static"===t.position,i=e.elem=w.elem("div",{id:e.elemID,"class":["layui-laydate",t.range?" layui-laydate-range":"",a?" "+c:"",t.theme&&"default"!==t.theme&&!/^#/.test(t.theme)?" laydate-theme-"+t.theme:""].join("")}),r=e.elemMain=[],o=e.elemHeader=[],s=e.elemCont=[],l=e.table=[],d=e.footer=w.elem("div",{"class":p});if(t.zIndex&&(i.style.zIndex=t.zIndex),w.each(new Array(2),function(e){if(!t.range&&e>0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push('<span lay-type="datetime" class="laydate-btns-time">'+n.timeTips+"</span>"),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push('<span lay-type="'+r+'" class="laydate-btns-'+r+'">'+o+"</span>"))}),e.push('<div class="laydate-footer-btns">'+i.join("")+"</div>"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));t.elem&&(n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3))},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length<l.length&&(a=!0),/yyyy|y/.test(l)?(c<d[0]&&(c=d[0],a=!0),e.year=c):/MM|M/.test(l)?(c<1&&(c=1,a=!0),e.month=c-1):/dd|d/.test(l)?(c<1&&(c=1,a=!0),e.date=c):/HH|H/.test(l)?(c<1&&(c=0,a=!0),e.hours=c,r.range&&(i[o[n]].hours=c)):/mm|m/.test(l)?(c<1&&(c=0,a=!0),e.minutes=c,r.range&&(i[o[n]].minutes=c)):/ss|s/.test(l)&&(c<1&&(c=0,a=!0),e.seconds=c,r.range&&(i[o[n]].seconds=c))}),c(e)};return"limit"===e?(c(o),i):(l=l||r.value,"string"==typeof l&&(l=l.replace(/\s+/g," ").replace(/^\s|\s$/g,"")),i.startState&&!i.endState&&(delete i.startState,i.endState=!0),"string"==typeof l&&l?i.EXP_IF.test(l)?r.range?(l=l.split(" "+r.range+" "),i.startDate=i.startDate||i.systemDate(),i.endDate=i.endDate||i.systemDate(),r.dateTime=w.extend({},i.startDate),w.each([i.startDate,i.endDate],function(e,t){m(t,l[e],e)})):m(o,l):(i.hint("日期格式不合法<br>必须遵循下述格式:<br>"+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"<br>已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html('<span class="laydate-day-mark">'+n+"</span>"),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.now<l.min||l.now>l.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.year<d[0]&&(l.year=d[0],r.hint("最低只能支持到公元"+d[0]+"年")),l.year>d[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e<t?(c=a-t+e,n.addClass("laydate-day-prev"),d=r.getAsYM(l.year,l.month,"sub")):e>=t&&e<i+t?(c=e-t,s.range||c+1===l.date&&n.addClass(o)):(c=e-i-t,n.addClass("laydate-day-next"),d=r.getAsYM(l.year,l.month)),d[1]++,d[2]=c+1,n.attr("lay-ymd",d.join("-")).html(d[2]),r.mark(n,d).limit(n,{year:d[0],month:d[1]-1,date:d[2]},e)}),w(f[0]).attr("lay-ym",l.year+"-"+(l.month+1)),w(f[1]).attr("lay-ym",l.year+"-"+(l.month+1)),"cn"===s.lang?(w(f[0]).attr("lay-type","year").html(l.year+"年"),w(f[1]).attr("lay-type","month").html(l.month+1+"月")):(w(f[0]).attr("lay-type","month").html(m.month[l.month]),w(f[1]).attr("lay-type","year").html(l.year)),u&&(s.range&&(e?r.endDate=r.endDate||{year:l.year+("year"===s.type?1:0),month:l.month+("month"===s.type?0:-1)}:r.startDate=r.startDate||{year:l.year,month:l.month},e&&(r.listYM=[[r.startDate.year,r.startDate.month+1],[r.endDate.year,r.endDate.month+1]],r.list(s.type,0).list(s.type,1),"time"===s.type?r.setBtnStatus("时间",w.extend({},r.systemDate(),r.startTime),w.extend({},r.systemDate(),r.endTime)):r.setBtnStatus(!0))),s.range||(r.listYM=[[l.year,l.month+1]],r.list(s.type,0))),s.range&&!e){var p=r.getAsYM(l.year,l.month);r.calendar(w.extend({},l,{year:p[0],month:p[1]}))}return s.range||r.limit(w(r.footer).find(g),null,0,["hours","minutes","seconds"]),s.range&&e&&!u&&r.stampRange(),r},T.prototype.list=function(e,t){var n=this,a=n.config,i=a.dateTime,r=n.lang(),l=a.range&&"date"!==a.type&&"datetime"!==a.type,d=w.elem("ul",{"class":m+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[e]}),c=n.elemHeader[t],u=w(c[2]).find("span"),h=n.elemCont[t||0],y=w(h).find("."+m)[0],f="cn"===a.lang,p=f?"年":"",T=n.listYM[t]||{},C=["hours","minutes","seconds"],x=["startTime","endTime"][t];if(T[0]<1&&(T[0]=1),"year"===e){var M,b=M=T[0]-7;b<1&&(b=M=1),w.each(new Array(15),function(e){var i=w.elem("li",{"lay-ym":M}),r={year:M};M==T[0]&&w(i).addClass(o),i.innerHTML=M+p,d.appendChild(i),M<n.firstDate.year?(r.month=a.min.month,r.date=a.min.date):M>=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]<n.firstDate.year?s.date=a.min.date:T[0]>=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["<p>"+r.time[e]+"</p><ol>"];w.each(new Array(t),function(t){i.push("<li"+(n[x][C[e]]===t?' class="'+o+'"':"")+">"+w.digit(t,2)+"</li>")}),a.innerHTML=i.join("")+"</ol>",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s<t&&w(i).addClass(u)})},T.prototype.done=function(e,t){var n=this,a=n.config,i=w.extend({},n.startDate?w.extend(n.startDate,n.startTime):a.dateTime),r=w.extend({},w.extend(n.endDate,n.endTime));return w.each([i,r],function(e,t){"month"in t&&w.extend(t,{month:t.month+1})}),e=e||[n.parse(),i,r],"function"==typeof a[t||"done"]&&a[t||"done"].apply(a,e),n},T.prototype.choose=function(e){var t=this,n=t.config,a=n.dateTime,i=w(t.elem).find("td"),r=e.attr("lay-ymd").split("-"),l=function(e){new Date;e&&w.extend(a,r),n.range&&(t.startDate?w.extend(t.startDate,r):t.startDate=w.extend({},r,t.startTime),t.startYMD=r)};if(r={year:0|r[0],month:(0|r[1])-1,date:0|r[2]},!e.hasClass(s))if(n.range){if(w.each(["startTime","endTime"],function(e,n){t[n]=t[n]||{hours:0,minutes:0,seconds:0}}),t.endState)l(),delete t.endState,delete t.endDate,t.startState=!0,i.removeClass(o+" "+u),e.addClass(o);else if(t.startState){if(e.addClass(o),t.endDate?w.extend(t.endDate,r):t.endDate=w.extend({},r,t.endTime),t.newDate(r).getTime()<t.newDate(t.startYMD).getTime()){var d=w.extend({},t.endDate,{hours:t.startDate.hours,minutes:t.startDate.minutes,seconds:t.startDate.seconds});w.extend(t.endDate,t.startDate,{hours:t.endDate.hours,minutes:t.endDate.minutes,seconds:t.endDate.seconds}),t.startDate=d}n.showBottom||t.done(),t.stampRange(),t.endState=!0,t.done(null,"change")}else e.addClass(o),l(),t.startState=!0;w(t.footer).find(g)[t.endDate?"removeClass":"addClass"](s)}else"static"===n.position?(l(!0),t.calendar().done().done(null,"change")):"date"===n.type?(l(!0),t.setValue(t.parse()).remove().done()):"datetime"===n.type&&(l(!0),t.calendar().done(null,"change"))},T.prototype.tool=function(e,t){var n=this,a=n.config,i=a.dateTime,r="static"===a.position,o={datetime:function(){w(e).hasClass(s)||(n.list("time",0),a.range&&n.list("time",1),w(e).attr("lay-type","date").html(n.lang().dateTips))},date:function(){n.closeList(),w(e).attr("lay-type","datetime").html(n.lang().timeTips)},clear:function(){n.setValue("").remove(),r&&(w.extend(i,n.firstDate),n.calendar()),a.range&&(delete n.startState,delete n.endState,delete n.endDate,delete n.startTime,delete n.endTime),n.done(["",{},{}])},now:function(){var e=new Date;w.extend(i,n.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),n.setValue(n.parse()).remove(),r&&n.calendar(),n.done()},confirm:function(){if(a.range){if(!n.endDate)return n.hint("请先选择日期范围");if(w(e).hasClass(s))return n.hint("time"===a.type?l.replace(/日期/g,"时间"):l)}else if(w(e).hasClass(s))return n.hint("不在有效日期或时间范围内");n.done(),n.setValue(n.parse()).remove()}};o[t]&&o[t]()},T.prototype.change=function(e){var t=this,n=t.config,a=n.dateTime,i=n.range&&("year"===n.type||"month"===n.type),r=t.elemCont[e||0],o=t.listYM[e],s=function(s){var l=["startDate","endDate"][e],d=w(r).find(".laydate-year-list")[0],c=w(r).find(".laydate-month-list")[0];return d&&(o[0]=s?o[0]-15:o[0]+15,t.list("year",e)),c&&(s?o[0]--:o[0]++,t.list("month",e)),(d||c)&&(w.extend(a,{year:o[0]}),i&&(t[l].year=o[0]),n.range||t.done(null,"change"),t.setBtnStatus(),n.range||t.limit(w(t.footer).find(g),{year:o[0]})),d||c};return{prevYear:function(){s("sub")||(a.year--,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))},prevMonth:function(){var e=t.getAsYM(a.year,a.month,"sub");w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextMonth:function(){var e=t.getAsYM(a.year,a.month);w.extend(a,{year:e[0],month:e[1]}),t.checkDate("limit").calendar(),n.range||t.done(null,"change")},nextYear:function(){s()||(a.year++,t.checkDate("limit").calendar(),n.range||t.done(null,"change"))}}},T.prototype.changeEvent=function(){var e=this;e.config;w(e.elem).on("click",function(e){w.stope(e)}),w.each(e.elemHeader,function(t,n){w(n[0]).on("click",function(n){e.change(t).prevYear()}),w(n[1]).on("click",function(n){e.change(t).prevMonth()}),w(n[2]).find("span").on("click",function(n){var a=w(this),i=a.attr("lay-ym"),r=a.attr("lay-type");i&&(i=i.split("-"),e.listYM[t]=[0|i[0],0|i[1]],e.list(r,t),w(e.footer).find(D).addClass(s))}),w(n[3]).on("click",function(n){e.change(t).nextMonth()}),w(n[4]).on("click",function(n){e.change(t).nextYear()})}),w.each(e.table,function(t,n){var a=w(n).find("td");a.on("click",function(){e.choose(w(this))})}),w(e.footer).find("span").on("click",function(){var t=w(this).attr("lay-type");e.tool(this,t)})},T.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())},T.prototype.events=function(){var e=this,t=e.config,n=function(n,a){n.on(t.trigger,function(){a&&(e.bindElem=this),e.render()})};t.elem[0]&&!t.elem[0].eventHandler&&(n(t.elem,"bind"),n(t.eventElem),w(document).on("click",function(n){n.target!==t.elem[0]&&n.target!==t.eventElem[0]&&n.target!==w(t.closeStop)[0]&&e.remove()}).on("keydown",function(t){13===t.keyCode&&w("#"+e.elemID)[0]&&e.elemID===T.thisElem&&(t.preventDefault(),w(e.footer).find(g)[0].click())}),w(window).on("resize",function(){return!(!e.elem||!w(r)[0])&&void e.position()}),t.elem[0].eventHandler=!0)},n.render=function(e){var t=new T(e);return a.call(t)},n.getEndDate=function(e,t){var n=new Date;return n.setFullYear(t||n.getFullYear(),e||n.getMonth()+1,1),new Date(n.getTime()-864e5).getDate()},window.lay=window.lay||w,e?(n.ready(),layui.define(function(e){n.path=layui.cache.dir,e(i,n)})):"function"==typeof define&&define.amd?define(function(){return n}):function(){n.ready(),window.laydate=n}()}();!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x<d;x++)if(a=e[x],a||0===a)if("object"===pe.type(a))pe.merge(v,a.nodeType?[a]:a);else if(Ue.test(a)){for(u=u||y.appendChild(t.createElement("div")),l=(We.exec(a)||["",""])[1].toLowerCase(),f=Xe[l]||Xe._default,u.innerHTML=f[1]+pe.htmlPrefilter(a)+f[2],o=f[0];o--;)u=u.lastChild;if(!fe.leadingWhitespace&&$e.test(a)&&v.push(t.createTextNode($e.exec(a)[0])),!fe.tbody)for(a="table"!==l||Ve.test(a)?"<table>"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r<i;r++)pe.event.add(t,n,s[n][r])}a.data&&(a.data=pe.extend({},a.data))}}function k(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!fe.noCloneEvent&&t[pe.expando]){i=pe._data(t);for(r in i.events)pe.removeEvent(t,r,i.handle);t.removeAttribute(pe.expando)}"script"===n&&t.text!==e.text?(C(t).text=e.text,E(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),fe.html5Clone&&e.innerHTML&&!pe.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Be.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}}function S(e,t,n,r){t=oe.apply([],t);var i,o,a,s,u,l,c=0,f=e.length,d=f-1,p=t[0],g=pe.isFunction(p);if(g||f>1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c<f;c++)o=l,c!==d&&(o=pe.clone(o,!0,!0),a&&pe.merge(s,h(o,"script"))),n.call(e[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,pe.map(s,E),c=0;c<a;c++)o=s[c],Ie.test(o.type||"")&&!pe._data(o,"globalEval")&&pe.contains(u,o)&&(o.src?pe._evalUrl&&pe._evalUrl(o.src):pe.globalEval((o.text||o.textContent||o.innerHTML||"").replace(ot,"")));l=i=null}return e}function A(e,t,n){for(var r,i=t?pe.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||pe.cleanData(h(r)),r.parentNode&&(n&&pe.contains(r.ownerDocument,r)&&g(h(r,"script")),r.parentNode.removeChild(r));return e}function D(e,t){var n=pe(t.createElement(e)).appendTo(t.body),r=pe.css(n[0],"display");return n.detach(),r}function j(e){var t=re,n=lt[e];return n||(n=D(e,t),"none"!==n&&n||(ut=(ut||pe("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a<s;a++)r=e[a],r.style&&(o[a]=pe._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&Re(r)&&(o[a]=pe._data(r,"olddisplay",j(r.nodeName)))):(i=Re(r),(n&&"none"!==n||!i)&&pe._data(r,"olddisplay",i?n:pe.css(r,"display"))));for(a=0;a<s;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}function _(e,t,n){var r=bt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function F(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;o<4;o+=2)"margin"===n&&(a+=pe.css(e,n+Oe[o],!0,i)),r?("content"===n&&(a-=pe.css(e,"padding"+Oe[o],!0,i)),"margin"!==n&&(a-=pe.css(e,"border"+Oe[o]+"Width",!0,i))):(a+=pe.css(e,"padding"+Oe[o],!0,i),"padding"!==n&&(a+=pe.css(e,"border"+Oe[o]+"Width",!0,i)));return a}function M(t,n,r){var i=!0,o="width"===n?t.offsetWidth:t.offsetHeight,a=ht(t),s=fe.boxSizing&&"border-box"===pe.css(t,"boxSizing",!1,a);if(re.msFullscreenElement&&e.top!==e&&t.getClientRects().length&&(o=Math.round(100*t.getBoundingClientRect()[n])),o<=0||null==o){if(o=gt(t,n,a),(o<0||null==o)&&(o=t.style[n]),ft.test(o))return o;i=s&&(fe.boxSizingReliable()||o===t.style[n]),o=parseFloat(o)||0}return o+F(t,n,r||(s?"border":"content"),i,a)+"px"}function O(e,t,n,r,i){return new O.prototype.init(e,t,n,r,i)}function R(){return e.setTimeout(function(){Nt=void 0}),Nt=pe.now()}function P(e,t){var n,r={height:e},i=0;for(t=t?1:0;i<4;i+=2-t)n=Oe[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function B(e,t,n){for(var r,i=($.tweeners[t]||[]).concat($.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function W(e,t,n){var r,i,o,a,s,u,l,c,f=this,d={},p=e.style,h=e.nodeType&&Re(e),g=pe._data(e,"fxshow");n.queue||(s=pe._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,u=s.empty.fire,s.empty.fire=function(){s.unqueued||u()}),s.unqueued++,f.always(function(){f.always(function(){s.unqueued--,pe.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],l=pe.css(e,"display"),c="none"===l?pe._data(e,"olddisplay")||j(e.nodeName):l,"inline"===c&&"none"===pe.css(e,"float")&&(fe.inlineBlockNeedsLayout&&"inline"!==j(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",fe.shrinkWrapBlocks()||f.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],St.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(h?"hide":"show")){if("show"!==i||!g||void 0===g[r])continue;h=!0}d[r]=g&&g[r]||pe.style(e,r)}else l=void 0;if(pe.isEmptyObject(d))"inline"===("none"===l?j(e.nodeName):l)&&(p.display=l);else{g?"hidden"in g&&(h=g.hidden):g=pe._data(e,"fxshow",{}),o&&(g.hidden=!h),h?pe(e).show():f.done(function(){pe(e).hide()}),f.done(function(){var t;pe._removeData(e,"fxshow");for(t in d)pe.style(e,t,d[t])});for(r in d)a=B(h?g[r]:0,r,f),r in g||(g[r]=a.start,h&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function I(e,t){var n,r,i,o,a;for(n in e)if(r=pe.camelCase(n),i=t[r],o=e[n],pe.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=pe.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function $(e,t,n){var r,i,o=0,a=$.prefilters.length,s=pe.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Nt||R(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;a<u;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),o<1&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:pe.extend({},t),opts:pe.extend(!0,{specialEasing:{},easing:pe.easing._default},n),originalProperties:t,originalOptions:n,startTime:Nt||R(),duration:n.duration,tweens:[],createTween:function(t,n){var r=pe.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(I(c,l.opts.specialEasing);o<a;o++)if(r=$.prefilters[o].call(l,e,c,l.opts))return pe.isFunction(r.stop)&&(pe._queueHooks(l.elem,l.opts.queue).stop=pe.proxy(r.stop,r)),r;return pe.map(c,B,l),pe.isFunction(l.opts.start)&&l.opts.start.call(e,l),pe.fx.timer(pe.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function z(e){return pe.attr(e,"class")||""}function X(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(De)||[];if(pe.isFunction(n))for(;r=o[i++];)"+"===r.charAt(0)?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function U(e,t,n,r){function i(s){var u;return o[s]=!0,pe.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||a||o[l]?a?!(u=l):void 0:(t.dataTypes.unshift(l),i(l),!1)}),u}var o={},a=e===Qt;return i(t.dataTypes[0])||!o["*"]&&i("*")}function V(e,t){var n,r,i=pe.ajaxSettings.flatOptions||{};for(r in t)void 0!==t[r]&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&pe.extend(!0,e,n),e}function Y(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(a in s)if(s[a]&&s[a].test(i)){u.unshift(a);break}if(u[0]in n)o=u[0];else{for(a in n){if(!u[0]||e.converters[a+" "+u[0]]){o=a;break}r||(r=a)}o=o||r}if(o)return o!==u[0]&&u.unshift(o),n[o]}function J(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(a=l[u+" "+o]||l["* "+o],!a)for(i in l)if(s=i.split(" "),s[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){a===!0?a=l[i]:l[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(f){return{state:"parsererror",error:a?f:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}function G(e){return e.style&&e.style.display||pe.css(e,"display")}function K(e){for(;e&&1===e.nodeType;){if("none"===G(e)||"hidden"===e.type)return!0;e=e.parentNode}return!1}function Q(e,t,n,r){var i;if(pe.isArray(t))pe.each(t,function(t,i){n||rn.test(e)?r(e,i):Q(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==pe.type(t))r(e,t);else for(i in t)Q(e+"["+i+"]",t[i],n,r)}function Z(){try{return new e.XMLHttpRequest}catch(t){}}function ee(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function te(e){return pe.isWindow(e)?e:9===e.nodeType&&(e.defaultView||e.parentWindow)}var ne=[],re=e.document,ie=ne.slice,oe=ne.concat,ae=ne.push,se=ne.indexOf,ue={},le=ue.toString,ce=ue.hasOwnProperty,fe={},de="1.12.3",pe=function(e,t){return new pe.fn.init(e,t)},he=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ge=/^-ms-/,me=/-([\da-z])/gi,ye=function(e,t){return t.toUpperCase()};pe.fn=pe.prototype={jquery:de,constructor:pe,selector:"",length:0,toArray:function(){return ie.call(this)},get:function(e){return null!=e?e<0?this[e+this.length]:this[e]:ie.call(this)},pushStack:function(e){var t=pe.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e){return pe.each(this,e)},map:function(e){return this.pushStack(pe.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(ie.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:ae,sort:ne.sort,splice:ne.splice},pe.extend=pe.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||pe.isFunction(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(i=arguments[s]))for(r in i)e=a[r],n=i[r],a!==n&&(l&&n&&(pe.isPlainObject(n)||(t=pe.isArray(n)))?(t?(t=!1,o=e&&pe.isArray(e)?e:[]):o=e&&pe.isPlainObject(e)?e:{},a[r]=pe.extend(l,o,n)):void 0!==n&&(a[r]=n));return a},pe.extend({expando:"jQuery"+(de+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return"function"===pe.type(e)},isArray:Array.isArray||function(e){return"array"===pe.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){var t=e&&e.toString();return!pe.isArray(e)&&t-parseFloat(t)+1>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;i<r&&t.call(e[i],i,e[i])!==!1;i++);else for(i in e)if(t.call(e[i],i,e[i])===!1)break;return e},trim:function(e){return null==e?"":(e+"").replace(he,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?pe.merge(r,"string"==typeof e?[e]:e):ae.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(se)return se.call(t,e,n);for(r=t.length,n=n?n<0?Math.max(0,r+n):n:0;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;)e[i++]=t[r++];if(n!==n)for(;void 0!==t[r];)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)r=!t(e[o],o),r!==s&&i.push(e[o]);return i},map:function(e,t,r){var i,o,a=0,s=[];if(n(e))for(i=e.length;a<i;a++)o=t(e[a],a,r),null!=o&&s.push(o);else for(a in e)o=t(e[a],a,r),null!=o&&s.push(o);return oe.apply([],s)},guid:1,proxy:function(e,t){var n,r,i;if("string"==typeof t&&(i=e[t],t=e,e=i),pe.isFunction(e))return n=ie.call(arguments,2),r=function(){return e.apply(t||this,n.concat(ie.call(arguments)))},r.guid=e.guid=e.guid||pe.guid++,r},now:function(){return+new Date},support:fe}),"function"==typeof Symbol&&(pe.fn[Symbol.iterator]=ne[Symbol.iterator]),pe.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){ue["[object "+t+"]"]=t.toLowerCase()});var ve=function(e){function t(e,t,n,r){var i,o,a,s,u,l,f,p,h=t&&t.ownerDocument,g=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==g&&9!==g&&11!==g)return n;if(!r&&((t?t.ownerDocument||t:B)!==H&&L(t),t=t||H,_)){if(11!==g&&(l=ye.exec(e)))if(i=l[1]){if(9===g){if(!(a=t.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(h&&(a=h.getElementById(i))&&R(t,a)&&a.id===i)return n.push(a),n}else{if(l[2])return Q.apply(n,t.getElementsByTagName(e)),n;if((i=l[3])&&w.getElementsByClassName&&t.getElementsByClassName)return Q.apply(n,t.getElementsByClassName(i)),n}if(w.qsa&&!X[e+" "]&&(!F||!F.test(e))){if(1!==g)h=t,p=e;else if("object"!==t.nodeName.toLowerCase()){for((s=t.getAttribute("id"))?s=s.replace(xe,"\\$&"):t.setAttribute("id",s=P),f=N(e),o=f.length,u=de.test(s)?"#"+s:"[id='"+s+"']";o--;)f[o]=u+" "+d(f[o]);p=f.join(","),h=ve.test(e)&&c(t.parentNode)||t}if(p)try{return Q.apply(n,h.querySelectorAll(p)),n}catch(m){}finally{s===P&&t.removeAttribute("id")}}}return S(e.replace(se,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>T.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=I++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,u,l,c=[W,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[P]||(t[P]={}),u=l[t.uniqueID]||(l[t.uniqueID]={}),(s=u[r])&&s[0]===W&&s[1]===o)return c[2]=s[2];if(u[r]=c,c[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i<o;i++)t(e,n[i],r);return r}function m(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function y(e,t,n,i,o,a){return i&&!i[P]&&(i=y(i)),o&&!o[P]&&(o=y(o,a)),r(function(r,a,s,u){var l,c,f,d=[],p=[],h=a.length,y=r||g(t||"*",s.nodeType?[s]:s,[]),v=!e||!r&&t?y:m(y,d,e,s,u),x=n?o||(r?e:h||i)?[]:a:v;if(n&&n(v,x,s,u),i)for(l=m(x,p),i(l,[],s,u),c=l.length;c--;)(f=l[c])&&(x[p[c]]=!(v[p[c]]=f));if(r){if(o||e){if(o){for(l=[],c=x.length;c--;)(f=x[c])&&l.push(v[c]=f);o(null,x=[],l,u)}for(c=x.length;c--;)(f=x[c])&&(l=o?ee(r,f):d[c])>-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s<i;s++)if(n=T.relative[e[s].type])c=[p(h(c),n)];else{if(n=T.filter[e[s].type].apply(null,e[s].matches),n[P]){for(r=++s;r<i&&!T.relative[e[r].type];r++);return y(s>1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s<r&&v(e.slice(s,r)),r<i&&v(e=e.slice(r)),r<i&&d(e))}c.push(n)}return h(c)}function x(e,n){var i=n.length>0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},te="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",ne="[\\x20\\t\\r\\n\\f]",re="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",ie="\\["+ne+"*("+re+")(?:"+ne+"*([*^$|!~]?=)"+ne+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+re+"))|)"+ne+"*\\]",oe=":("+re+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+ie+")*)|.*)\\)|)",ae=new RegExp(ne+"+","g"),se=new RegExp("^"+ne+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ne+"+$","g"),ue=new RegExp("^"+ne+"*,"+ne+"*"),le=new RegExp("^"+ne+"*([>+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="<a id='"+P+"'></a><select id='"+P+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),
+l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:l(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:l(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},T.pseudos.nth=T.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})T.pseudos[b]=s(b);for(b in{submit:!0,reset:!0})T.pseudos[b]=u(b);return f.prototype=T.filters=T.pseudos,T.setFilters=new f,N=t.tokenize=function(e,n){var r,i,o,a,s,u,l,c=z[e+" "];if(c)return n?0:c.slice(0);for(s=e,u=[],l=T.preFilter;s;){r&&!(i=ue.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),r=!1,(i=le.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(se," ")}),s=s.slice(r.length));for(a in T.filter)!(i=pe[a].exec(s))||l[a]&&!(i=l[a](i))||(r=i.shift(),o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?t.error(e):z(e,u).slice(0)},k=t.compile=function(e,t){var n,r=[],i=[],o=X[e+" "];if(!o){for(t||(t=N(e)),n=t.length;n--;)o=v(t[n]),o[P]?r.push(o):i.push(o);o=X(e,x(i,r)),o.selector=e}return o},S=t.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,f=!r&&N(e=l.selector||e);if(n=n||[],1===f.length){if(o=f[0]=f[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t<i;t++)if(pe.contains(r[t],this))return!0}));for(t=0;t<i;t++)pe.find(e,r[t],n);return n=this.pushStack(i>1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(pe.contains(this,n[t]))return!0})},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=we.test(e)||"string"!=typeof e?pe(e,t||this.context):0;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u<a.length;)a[u].apply(n[0],n[1])===!1&&e.stopOnFalse&&(u=a.length,n=!1);e.memory||(n=!1),t=!1,i&&(a=n?[]:"")},c={add:function(){return a&&(n&&!t&&(u=a.length-1,s.push(n)),function r(t){pe.each(t,function(t,n){pe.isFunction(n)?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==pe.type(n)&&r(n)})}(arguments),n&&!t&&l()),this},remove:function(){return pe.each(arguments,function(e,t){for(var n;(n=pe.inArray(t,a,n))>-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i<a;i++)o[i]&&pe.isFunction(o[i].promise)?o[i].promise().progress(l(i,n,t)).done(l(i,r,o)).fail(u.reject):--s;return s||u.resolveWith(r,o),u.promise()}});var je;pe.fn.ready=function(e){return pe.ready.promise().done(e),this},pe.extend({isReady:!1,readyWait:1,holdReady:function(e){e?pe.readyWait++:pe.ready(!0)},ready:function(e){(e===!0?--pe.readyWait:pe.isReady)||(pe.isReady=!0,e!==!0&&--pe.readyWait>0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?pe.queue(this[0],e):void 0===t?this:this.each(function(){var n=pe.queue(this,e,t);pe._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&pe.dequeue(this,e)})},dequeue:function(e){return this.each(function(){pe.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=pe.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";a--;)n=pe._data(o[a],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}}),function(){var e;fe.shrinkWrapBlocks=function(){if(null!=e)return e;e=!1;var t,n,r;return n=re.getElementsByTagName("body")[0],n&&n.style?(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",t.appendChild(re.createElement("div")).style.width="5px",e=3!==t.offsetWidth),n.removeChild(r),e):void 0}}();var Fe=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,Me=new RegExp("^(?:([+-])=|)("+Fe+")([a-z%]*)$","i"),Oe=["Top","Right","Bottom","Left"],Re=function(e,t){return e=t||e,"none"===pe.css(e,"display")||!pe.contains(e.ownerDocument,e)},Pe=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===pe.type(n)){i=!0;for(s in n)Pe(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,pe.isFunction(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(pe(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},Be=/^(?:checkbox|radio)$/i,We=/<([\w:-]+)/,Ie=/^$|\/(?:java|ecma)script/i,$e=/^\s+/,ze="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";!function(){var e=re.createElement("div"),t=re.createDocumentFragment(),n=re.createElement("input");e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav></:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="<textarea>x</textarea>",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:fe.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/<tbody/i;!function(){var t,n,r=re.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(fe[t]=n in e)||(r.setAttribute(n,"t"),fe[t]=r.attributes[n].expando===!1);r=null}();var Ye=/^(?:input|select|textarea)$/i,Je=/^key/,Ge=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ke=/^(?:focusinfocus|focusoutblur)$/,Qe=/^([^.]*)(?:\.(.+)|)/;pe.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe._data(e);if(m){for(n.handler&&(u=n,n=u.handler,i=u.selector),n.guid||(n.guid=pe.guid++),(a=m.events)||(a=m.events={}),(c=m.handle)||(c=m.handle=function(e){return"undefined"==typeof pe||e&&pe.event.triggered===e.type?void 0:pe.event.dispatch.apply(c.elem,arguments)},c.elem=e),t=(t||"").match(De)||[""],s=t.length;s--;)o=Qe.exec(t[s])||[],p=g=o[1],h=(o[2]||"").split(".").sort(),p&&(l=pe.event.special[p]||{},p=(i?l.delegateType:l.bindType)||p,l=pe.event.special[p]||{},f=pe.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&pe.expr.match.needsContext.test(i),namespace:h.join(".")},u),(d=a[p])||(d=a[p]=[],d.delegateCount=0,l.setup&&l.setup.call(e,r,h,c)!==!1||(e.addEventListener?e.addEventListener(p,c,!1):e.attachEvent&&e.attachEvent("on"+p,c))),l.add&&(l.add.call(e,f),f.handler.guid||(f.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,f):d.push(f),pe.event.global[p]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,m=pe.hasData(e)&&pe._data(e);if(m&&(c=m.events)){for(t=(t||"").match(De)||[""],l=t.length;l--;)if(s=Qe.exec(t[l])||[],p=g=s[1],h=(s[2]||"").split(".").sort(),p){for(f=pe.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,d=c[p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=d.length;o--;)a=d[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(d.splice(o,1),a.selector&&d.delegateCount--,f.remove&&f.remove.call(e,a));u&&!d.length&&(f.teardown&&f.teardown.call(e,h,m.handle)!==!1||pe.removeEvent(e,p,m.handle),delete c[p])}else for(p in c)pe.event.remove(e,p+t[l],n,r,!0);pe.isEmptyObject(c)&&(delete m.handle,pe._removeData(e,"events"))}},trigger:function(t,n,r,i){var o,a,s,u,l,c,f,d=[r||re],p=ce.call(t,"type")?t.type:t,h=ce.call(t,"namespace")?t.namespace.split("."):[];if(s=c=r=r||re,3!==r.nodeType&&8!==r.nodeType&&!Ke.test(p+pe.event.triggered)&&(p.indexOf(".")>-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n<s;n++)o=t[n],i=o.selector+" ",void 0===r[i]&&(r[i]=o.needsContext?pe(i,this).index(u)>-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s<t.length&&a.push({elem:this,handlers:t.slice(s)}),a},fix:function(e){if(e[pe.expando])return e;var t,n,r,i=e.type,o=e,a=this.fixHooks[i];for(a||(this.fixHooks[i]=a=Ge.test(i)?this.mouseHooks:Je.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new pe.Event(o),t=r.length;t--;)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||re),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,a.filter?a.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,o=t.button,a=t.fromElement;return null==e.pageX&&null!=t.clientX&&(r=e.target.ownerDocument||re,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?t.toElement:a),e.which||void 0===o||(e.which=1&o?1:2&o?3:4&o?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==b()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){if(this===b()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(pe.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1},_default:function(e){return pe.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n){var r=pe.extend(new pe.Event,n,{type:e,isSimulated:!0});pe.event.trigger(r,null,t),r.isDefaultPrevented()&&n.preventDefault()}},pe.removeEvent=re.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)}:function(e,t,n){var r="on"+t;e.detachEvent&&("undefined"==typeof e[r]&&(e[r]=null),e.detachEvent(r,n))},pe.Event=function(e,t){return this instanceof pe.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&e.returnValue===!1?v:x):this.type=e,t&&pe.extend(this,t),this.timeStamp=e&&e.timeStamp||pe.now(),void(this[pe.expando]=!0)):new pe.Event(e,t)},pe.Event.prototype={constructor:pe.Event,isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=v,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=v,e&&!this.isSimulated&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=v,e&&e.stopImmediatePropagation&&e.stopImmediatePropagation(),this.stopPropagation()}},pe.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){pe.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||pe.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),fe.submit||(pe.event.special.submit={setup:function(){return!pe.nodeName(this,"form")&&void pe.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=pe.nodeName(t,"input")||pe.nodeName(t,"button")?pe.prop(t,"form"):void 0;n&&!pe._data(n,"submit")&&(pe.event.add(n,"submit._submit",function(e){e._submitBubble=!0}),pe._data(n,"submit",!0))})},postDispatch:function(e){e._submitBubble&&(delete e._submitBubble,this.parentNode&&!e.isTrigger&&pe.event.simulate("submit",this.parentNode,e))},teardown:function(){return!pe.nodeName(this,"form")&&void pe.event.remove(this,"._submit")}}),fe.change||(pe.event.special.change={setup:function(){return Ye.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(pe.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._justChanged=!0)}),pe.event.add(this,"click._change",function(e){this._justChanged&&!e.isTrigger&&(this._justChanged=!1),pe.event.simulate("change",this,e)})),!1):void pe.event.add(this,"beforeactivate._change",function(e){var t=e.target;Ye.test(t.nodeName)&&!pe._data(t,"change")&&(pe.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||pe.event.simulate("change",this.parentNode,e)}),pe._data(t,"change",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type)return e.handleObj.handler.apply(this,arguments)},teardown:function(){return pe.event.remove(this,"._change"),!Ye.test(this.nodeName)}}),fe.focusin||pe.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){pe.event.simulate(t,e.target,pe.event.fix(e))};pe.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=pe._data(r,t);i||r.addEventListener(e,n,!0),pe._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=pe._data(r,t)-1;i?pe._data(r,t,i):(r.removeEventListener(e,n,!0),pe._removeData(r,t))}}}),pe.fn.extend({on:function(e,t,n,r){return w(this,e,t,n,r)},one:function(e,t,n,r){return w(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,pe(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return t!==!1&&"function"!=typeof t||(n=t,t=void 0),n===!1&&(n=x),this.each(function(){pe.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){pe.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return pe.event.trigger(e,t,n,!0)}});var Ze=/ jQuery\d+="(?:null|\d+)"/g,et=new RegExp("<(?:"+ze+")[\\s/>]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/<script|<style|<link/i,rt=/checked\s*(?:[^=]|=\s*.checked.)/i,it=/^true\/(.*)/,ot=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;n<r;n++)t=this[n]||{},1===t.nodeType&&(pe.cleanData(h(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return S(this,arguments,function(t){var n=this.parentNode;pe.inArray(this,e)<0&&(pe.cleanData(h(this)),
+n&&n.replaceChild(t,this))},e)}}),pe.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){pe.fn[e]=function(e){for(var n,r=0,i=[],o=pe(e),a=o.length-1;r<=a;r++)n=r===a?this:this.clone(!0),pe(o[r])[t](n),ae.apply(i,n.get());return this.pushStack(i)}});var ut,lt={HTML:"block",BODY:"block"},ct=/^margin/,ft=new RegExp("^("+Fe+")(?!px)[a-z%]+$","i"),dt=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i},pt=re.documentElement;!function(){function t(){var t,c,f=re.documentElement;f.appendChild(u),l.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",n=i=s=!1,r=a=!0,e.getComputedStyle&&(c=e.getComputedStyle(l),n="1%"!==(c||{}).top,s="2px"===(c||{}).marginLeft,i="4px"===(c||{width:"4px"}).width,l.style.marginRight="50%",r="4px"===(c||{marginRight:"4px"}).marginRight,t=l.appendChild(re.createElement("div")),t.style.cssText=l.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",t.style.marginRight=t.style.width="0",l.style.width="1px",a=!parseFloat((e.getComputedStyle(t)||{}).marginRight),l.removeChild(t)),l.style.display="none",o=0===l.getClientRects().length,o&&(l.style.display="",l.innerHTML="<table><tr><td></td><td>t</td></tr></table>",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a<i;a++)o[t[a]]=pe.css(e,t[a],!1,r);return o}return void 0!==n?pe.style(e,t,n):pe.css(e,t)},e,t,arguments.length>1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r<i;r++)n=e[r],$.tweeners[n]=$.tweeners[n]||[],$.tweeners[n].unshift(t)},prefilters:[W],prefilter:function(e,t){t?$.prefilters.unshift(e):$.prefilters.push(e)}}),pe.speed=function(e,t,n){var r=e&&"object"==typeof e?pe.extend({},e):{complete:n||!n&&t||pe.isFunction(e)&&e,duration:e,easing:n&&t||t&&!pe.isFunction(t)&&t};return r.duration=pe.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in pe.fx.speeds?pe.fx.speeds[r.duration]:pe.fx.speeds._default,null!=r.queue&&r.queue!==!0||(r.queue="fx"),r.old=r.complete,r.complete=function(){pe.isFunction(r.old)&&r.old.call(this),r.queue&&pe.dequeue(this,r.queue)},r},pe.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Re).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=pe.isEmptyObject(e),o=pe.speed(t,n,r),a=function(){var t=$(this,pe.extend({},e),o);(i||pe._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=pe.timers,a=pe._data(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&At.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||pe.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=pe._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=pe.timers,a=r?r.length:0;for(n.finish=!0,pe.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),pe.each(["toggle","show","hide"],function(e,t){var n=pe.fn[t];pe.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(P(t,!0),e,r,i)}}),pe.each({slideDown:P("show"),slideUp:P("hide"),slideToggle:P("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){pe.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),pe.timers=[],pe.fx.tick=function(){var e,t=pe.timers,n=0;for(Nt=pe.now();n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||pe.fx.stop(),Nt=void 0},pe.fx.timer=function(e){pe.timers.push(e),e()?pe.fx.start():pe.timers.pop()},pe.fx.interval=13,pe.fx.start=function(){kt||(kt=e.setInterval(pe.fx.tick,pe.fx.interval))},pe.fx.stop=function(){e.clearInterval(kt),kt=null},pe.fx.speeds={slow:600,fast:200,_default:400},pe.fn.delay=function(t,n){return t=pe.fx?pe.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e,t=re.createElement("input"),n=re.createElement("div"),r=re.createElement("select"),i=r.appendChild(re.createElement("option"));n=re.createElement("div"),n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u<s;u++)if(n=r[u],(n.selected||u===i)&&(fe.optDisabled?!n.disabled:null===n.getAttribute("disabled"))&&(!n.parentNode.disabled||!pe.nodeName(n.parentNode,"optgroup"))){if(t=pe(n).val(),o)return t;a.push(t)}return a},set:function(e,t){for(var n,r,i=e.options,o=pe.makeArray(t),a=i.length;a--;)if(r=i[a],pe.inArray(pe.valHooks.option.get(r),o)>-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("<div>").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){
+for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe});!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'<div class="layui-layer-title" style="'+(f?r.title[1]:"")+'">'+(f?r.title[0]:r.title)+"</div>":"";return r.zIndex=s,t([r.shade?'<div class="layui-layer-shade" id="layui-layer-shade'+a+'" times="'+a+'" style="'+("z-index:"+(s-1)+"; ")+'"></div>':"",'<div class="'+l[0]+(" layui-layer-"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?"":" layui-layer-border")+" "+(r.skin||"")+'" id="'+l[0]+a+'" type="'+o.type[r.type]+'" times="'+a+'" showtime="'+r.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+s+"; width:"+r.area[0]+";height:"+r.area[1]+(r.fixed?"":";position:absolute;")+'">'+(e&&2!=r.type?"":u)+'<div id="'+(r.id||"")+'" class="layui-layer-content'+(0==r.type&&r.icon!==-1?" layui-layer-padding":"")+(3==r.type?" layui-layer-loading"+r.icon:"")+'">'+(0==r.type&&r.icon!==-1?'<i class="layui-layer-ico layui-layer-ico'+r.icon+'"></i>':"")+(1==r.type&&e?"":r.content||"")+'</div><span class="layui-layer-setwin">'+function(){var e=c?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"";return r.closeBtn&&(e+='<a class="layui-layer-ico '+l[7]+" "+l[7]+(r.title?r.closeBtn:4==r.type?"1":"2")+'" href="javascript:;"></a>'),e}()+"</span>"+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class="'+l[6]+t+'">'+r.btn[t]+"</a>";return'<div class="'+l[6]+" layui-layer-btn-"+(r.btnAlign||"")+'">'+e+"</div>"}():"")+(r.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],u,i('<div class="layui-layer-move"></div>')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='<iframe scrolling="'+(t.content[1]||"auto")+'" allowtransparency="true" id="'+l[4]+a+'" name="'+l[4]+a+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+t.content[0]+'"></iframe>';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'<i class="layui-layer-TipsG"></i>',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'<textarea class="layui-layer-input"'+a+"></textarea>":function(){return'<input type="'+(1==e.formType?"password":"text")+'" class="layui-layer-input">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a='<span class="'+n+'">'+t[0].title+"</span>";i<e;i++)a+="<span>"+t[i].title+"</span>";return a}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=t.length,i=1,a="";if(e>0)for(a='<li class="layui-layer-tabli '+n+'">'+(t[0].content||"no content")+"</li>";i<e;i++)a+='<li class="layui-layer-tabli">'+(t[i].content||"no content")+"</li>";return a}()+"</ul>",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+"px",a[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,isOutAnim:!1,skin:"layui-layer-photos"+c("photos"),content:'<div class="layui-layer-phimg"><img src="'+u[d].src+'" alt="'+(u[d].alt||"")+'" layer-pid="'+u[d].pid+'"><div class="layui-layer-imgsee">'+(u.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(a?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(u[d].alt||"")+"</a><em>"+s.imgIndex+"/"+u.length+"</em></span></div></div></div>",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常<br>是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='<li lay-id="'+(i.id||"")+'"'+(i.attr?' lay-attr="'+i.attr+'"':"")+">"+(i.title||"unnaming")+"</li>";return s[0]?s.before(r):n.append(r),o.append('<div class="layui-tab-item">'+(i.content||"")+"</div>"),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('<span class="layui-unselect layui-tab-bar" '+r+"><i "+r+' class="layui-icon"></i></span>');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('<i class="layui-icon layui-unselect '+l+'">ဆ</i>');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a('<span class="'+c+'"></span>'),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append('<span class="'+y+'"></span>'),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after("<span "+i+">"+e+"</span>")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html('<span class="'+t+'-text">'+l+"</span>")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append('<i class="layui-icon layui-colla-icon">'+(l?"":"")+"</i>"),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)});layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['<input class="'+u+'" type="file" accept="'+t.acceptMime+'" name="'+t.field+'"',t.multiple?" multiple":"",">"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('<div class="layui-upload-wrap"></div>'),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i('<iframe id="'+f+'" class="'+f+'" name="'+f+'" frameborder="0"></iframe>'),a=i(['<form target="'+f+'" class="'+c+'" method="post" key="set-mine" enctype="multipart/form-data" action="'+t.url+'">',"</form>"].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('<input type="hidden" name="'+i+'" value="'+t+'">')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after('<span class="layui-inline '+s+'">'+o+"</span>")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.max<t.min&&(t.max=t.min+t.step),t.range){t.value="object"==typeof t.value?t.value:[t.min,t.value];var a=Math.min(t.value[0],t.value[1]),n=Math.max(t.value[0],t.value[1]);t.value[0]=a>t.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.value<t.min&&(t.value=t.min),t.value>t.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='<div class="layui-slider '+("vertical"===t.type?"layui-slider-vertical":"")+'">'+(t.tips?'<div class="layui-slider-tips"></div>':"")+'<div class="layui-slider-bar" style="background:'+p+"; "+("vertical"===t.type?"height":"width")+":"+m+";"+("vertical"===t.type?"bottom":"left")+":"+(r||0)+';"></div><div class="layui-slider-wrap" style="'+("vertical"===t.type?"bottom":"left")+":"+(r||m)+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+p+';"></div></div>'+(t.range?'<div class="layui-slider-wrap" style="'+("vertical"===t.type?"bottom":"left")+":"+v+';"><div class="layui-slider-wrap-btn" style="border: 2px solid '+p+';"></div></div>':"")+"</div>",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x<g+1;x++){var T=100*x/g;T<100&&(b+='<div class="layui-slider-step" style="'+("vertical"===t.type?"bottom":"left")+":"+T+'%"></div>')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('<div class="layui-slider-input layui-input"><div class="layui-slider-input-txt"><input type="text" class="layui-input"></div><div class="layui-slider-input-btn"><i class="layui-icon layui-icon-up"></i><i class="layui-icon layui-icon-down"></i></div></div>');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['<div class="layui-auxiliar-moving" id="LAY-slider-moving"></div'].join("")),M=function(e,t){var a=function(){t&&t(),w.remove()};i("#LAY-slider-moving")[0]||i("body").append(w),w.on("mousemove",e),w.on("mouseup",a).on("mouseleave",a)};if("set"===e)return x(t,a);s.find("."+u).each(function(e){var t=i(this);t.on("mousedown",function(i){i=i||window.event;var a=t.parent()[0].offsetLeft,n=i.clientX;"vertical"===l.type&&(a=f()-t.parent()[0].offsetTop-h.height(),n=i.clientY);var r=function(i){i=i||window.event;var r=a+("vertical"===l.type?n-i.clientY:i.clientX-n);r<0&&(r=0),r>f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.step<l.min?l.min:Number(g)-l.step:Number(g)+l.step>l.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=e<l.min?l.min:e,e=e>l.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['<div class="layui-unselect layui-colorpicker">',"<span "+("rgb"==o.format&&o.alpha?'class="layui-colorpicker-trigger-bgcolor"':"")+">",'<span class="layui-colorpicker-trigger-span" ','lay-type="'+("rgb"==o.format?o.alpha?"rgba":"torgb":"")+'" ','style="'+function(){var e="";return o.color?(e=o.color,(o.color.match(/[0-9]{1,3}/g)||[]).length>3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','<i class="layui-icon layui-colorpicker-trigger-i '+(o.color?a:s)+'"></i>',"</span>","</span>","</div>"].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['<div id="layui-colorpicker'+e.index+'" data-index="'+e.index+'" class="layui-anim layui-anim-upbit layui-colorpicker-main">','<div class="layui-colorpicker-main-wrapper">','<div class="layui-colorpicker-basis">','<div class="layui-colorpicker-basis-white"></div>','<div class="layui-colorpicker-basis-black"></div>','<div class="layui-colorpicker-basis-cursor"></div>',"</div>",'<div class="layui-colorpicker-side">','<div class="layui-colorpicker-side-slider"></div>',"</div>","</div>",'<div class="layui-colorpicker-main-alpha '+(o.alpha?n:"")+'">','<div class="layui-colorpicker-alpha-bgcolor">','<div class="layui-colorpicker-alpha-slider"></div>',"</div>","</div>",function(){if(o.predefine){var e=['<div class="layui-colorpicker-main-pre">'];return layui.each(o.colors,function(i,o){e.push(['<div class="layui-colorpicker-pre'+((o.match(/[0-9]{1,3}/g)||[]).length>3?" layui-colorpicker-pre-isalpha":"")+'">','<div style="background:'+o+'"></div>',"</div>"].join(""))}),e.push("</div>"),e.join("")}return""}(),'<div class="layui-colorpicker-main-input">','<div class="layui-inline">','<input type="text" class="layui-input">',"</div>",'<div class="layui-btn-container">','<button class="layui-btn layui-btn-primary layui-btn-sm" colorpicker-events="clear">清空</button>','<button class="layui-btn layui-btn-sm" colorpicker-events="confirm">确定</button>',"</div","</div>","</div>"].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:f<s&&(f=s),d+l+s>a()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['<div class="layui-auxiliar-moving" id="LAY-colorpicker-moving"></div'].join("")),Y=function(e){i("#LAY-colorpicker-moving")[0]||i("body").append(M),M.on("mousemove",e),M.on("mouseup",function(){M.remove()}).on("mouseleave",function(){M.remove()})};l.on("mousedown",function(e){var i=this.offsetTop,o=e.clientY,r=function(e){var r=i+(e.clientY-o),t=n[0].offsetHeight;r<0&&(r=0),r>t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)});layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=t(r+'[lay-filter="'+e+'"]');a.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value===t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e)},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),x=i.find("dl"),g=x.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=x.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),g.removeClass(o),y=null,g.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),$()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||T(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},$=function(){var e=x.children("dd."+s);if(e[0]){var t=e.position().top,i=x.height(),a=e.height();t>i&&x.scrollTop(t+x.scrollTop()-i+a-5),t<0&&x.scrollTop(t+x.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),x.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=x.children("dd."+s);if(x.children("dd."+o)[0]&&"next"===t){var i=x.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n<e.index()&&!i.hasClass(s))return i.eq(0).prev()[0]?i.eq(0).prev():x.children(":last")}return a&&a[0]?a:y&&y[0]?y:e}();return l=r[t](),n=r[t]("dd:not(."+o+")"),l[0]?(y=r[t](),n[0]&&!n.hasClass(c)||!y[0]?(n.addClass(s).siblings().removeClass(s),void $()):i(t,y)):y=null};38===t&&i("prev"),40===t&&i("next"),13===t&&(e.preventDefault(),x.children("dd."+s).trigger("click"))});var T=function(e,i,a){var n=0;layui.each(g,function(){var i=t(this),l=i.text(),r=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:r)&&n++,"keyup"===a&&i[r?"addClass":"removeClass"](o)});var l=n===g.length;return i(l),l},j=function(e){var t=this.value,i=e.keyCode;return 9!==i&&13!==i&&37!==i&&38!==i&&39!==i&&40!==i&&(T(t,function(e){e?x.find("."+r)[0]||x.append('<p class="'+r+'">无匹配项</p>'):x.find("."+r).remove()},"keyup"),""===t&&x.find("."+r).remove(),void $())};f&&k.on("keyup",j).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){T(k.val(),function(e){d||k.val("")},"blur")},200)}),g.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['<div class="'+(h?"":"layui-unselect ")+a,(u?" layui-select-disabled":"")+'">','<div class="'+n+'">','<input type="text" placeholder="'+p+'" '+('value="'+(d?f.html():"")+'"')+(h?"":" readonly")+' class="layui-input'+(h?"":" layui-unselect")+(u?" "+c:"")+'">','<i class="layui-edge"></i></div>','<dl class="layui-anim layui-anim-upbit'+(r.find("optgroup")[0]?" layui-select-group":"")+'">',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("<dt>"+a.label+"</dt>"):t.push('<dd lay-value="'+a.value+'" class="'+(d===a.value?s:"")+(a.disabled?" "+c:"")+'">'+a.innerHTML+"</dd>"):t.push('<dd lay-value="" class="layui-select-tips">'+(a.innerHTML||i)+"</dd>")}),0===t.length&&t.push('<dd lay-value="" class="'+c+'">没有选项</dd>'),t.join("")}(r.find("*"))+"</dl>","</div>"].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['<div class="layui-unselect '+u[0],n.checked?" "+u[1]:"",o?" layui-checkbox-disbaled "+c:"",'"',r?' lay-skin="'+r+'"':"",">",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?"<span>"+n.title+"</span>":"",'<i class="layui-icon layui-icon-ok"></i>'].join(""),_switch:"<em>"+((n.checked?s[0]:s[1])||"")+"</em><i></i>"};return t[r]||t.checkbox}(),"</div>"].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=u.find("input[type=radio]"),n=function(a){var n=t(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['<div class="layui-unselect '+e,l.checked?" "+e+"ed":"",(o?" layui-radio-disbaled "+c:"")+'">','<i class="layui-anim layui-icon">'+i[l.checked?0:1]+"</i>","<div>"+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"</div>","</div>"].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=t(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),v=e.parents("form")[0],h=u.find("input,select,textarea"),y=e.attr("lay-filter");if(layui.each(d,function(e,l){var r=t(this),c=r.attr("lay-verify").split("|"),u=r.attr("lay-verType"),d=r.val();if(r.removeClass(o),layui.each(c,function(e,t){var c,f="",v="function"==typeof a[t];if(a[t]){var c=v?f=a[t](d,l):!a[t][0].test(d);if(f=f||a[t][1],c)return"tips"===u?i.tips(f,function(){return"string"==typeof r.attr("lay-ignore")||"select"!==l.tagName.toLowerCase()&&!/^checkbox|radio$/.test(l.type)?r:r.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}}),s)return s}),s)return!1;var p={};return layui.each(h,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];p[i]=0|p[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+p[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(c[t.name]=t.value)}}),layui.event.call(this,l,"submit("+y+")",{elem:this,form:v,field:c})},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('<ul class="'+(n.spread?"layui-show":"")+'"></ul>'),s=o(["<li "+(n.spread?'data-spread="'+n.spread+'"':"")+">",function(){return l?'<i class="layui-icon layui-tree-spread">'+(n.spread?t.arrow[1]:t.arrow[0])+"</i>":""}(),function(){return r.check?'<i class="layui-icon layui-tree-check">'+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"</i>":""}(),function(){return'<a href="'+(n.href||"javascript:;")+'" '+(r.target&&n.href?'target="'+r.target+'"':"")+">"+('<i class="layui-icon layui-tree-'+(l?"branch":"leaf")+'">'+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"</i>")+("<cite>"+(n.name||"未命名")+"</cite></a>")}(),"</li>"].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('<div class="layui-box '+t+'"></div>'));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})});layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,layui.hint()),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,u,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)},config:t}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u="table",h=".layui-table",y="layui-hide",f="layui-none",p="layui-table-view",v=".layui-table-tool",m=".layui-table-box",g=".layui-table-init",b=".layui-table-header",x=".layui-table-body",k=".layui-table-main",C=".layui-table-fixed",w=".layui-table-fixed-l",T=".layui-table-fixed-r",A=".layui-table-total",L=".layui-table-page",S=".layui-table-sort",N="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<thead>","{{# layui.each(d.data.cols, function(i1, item1){ }}","<tr>","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'<th data-field="{{ item2.field||i2 }}" data-key="{{d.index}}-{{i1}}-{{i2}}" {{# if( item2.parentKey){ }}data-parentkey="{{ item2.parentKey }}"{{# } }} {{# if(item2.minWidth){ }}data-minwidth="{{item2.minWidth}}"{{# } }} '+t+' {{# if(item2.unresize || item2.colGroup){ }}data-unresize="true"{{# } }} class="{{# if(item2.hide){ }}layui-hide{{# } }}{{# if(isSort){ }} layui-unselect{{# } }}{{# if(!item2.field){ }} layui-table-col-special{{# } }}">','<div class="layui-table-cell laytable-cell-',"{{# if(item2.colGroup){ }}","group","{{# } else { }}","{{d.index}}-{{i1}}-{{i2}}",'{{# if(item2.type !== "normal"){ }}'," laytable-cell-{{ item2.type }}","{{# } }}","{{# } }}",'" {{#if(item2.align){}}align="{{item2.align}}"{{#}}}>','{{# if(item2.type === "checkbox"){ }}','<input type="checkbox" name="layTableCheckbox" lay-skin="primary" lay-filter="layTableAllChoose" {{# if(item2[d.data.checkName]){ }}checked{{# }; }}>',"{{# } else { }}",'<span>{{item2.title||""}}</span>',"{{# if(isSort){ }}",'<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc" title="升序"></i><i class="layui-edge layui-table-sort-desc" title="降序"></i></span>',"{{# } }}","{{# } }}","</div>","</th>",e.fixed?"{{# }; }}":"","{{# }); }}","</tr>","{{# }); }}","</thead>","</table>"].join("")},E=['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>',"<tbody></tbody>","</table>"].join(""),z=['<div class="layui-form layui-border-box {{d.VIEW_CLASS}}" lay-filter="LAY-table-{{d.index}}" lay-id="{{ d.data.id }}" style="{{# if(d.data.width){ }}width:{{d.data.width}}px;{{# } }} {{# if(d.data.height){ }}height:{{d.data.height}}px;{{# } }}">',"{{# if(d.data.toolbar){ }}",'<div class="layui-table-tool">','<div class="layui-table-tool-temp"></div>','<div class="layui-table-tool-self"></div>',"</div>","{{# } }}",'<div class="layui-table-box">',"{{# if(d.data.loading){ }}",'<div class="layui-table-init" style="background-color: #fff;">','<i class="layui-icon layui-icon-loading layui-icon"></i>',"</div>","{{# } }}","{{# var left, right; }}",'<div class="layui-table-header">',_(),"</div>",'<div class="layui-table-body layui-table-main">',E,"</div>","{{# if(left){ }}",'<div class="layui-table-fixed layui-table-fixed-l">','<div class="layui-table-header">',_({fixed:!0}),"</div>",'<div class="layui-table-body">',E,"</div>","</div>","{{# }; }}","{{# if(right){ }}",'<div class="layui-table-fixed layui-table-fixed-r">','<div class="layui-table-header">',_({fixed:"right"}),'<div class="layui-table-mend"></div>',"</div>",'<div class="layui-table-body">',E,"</div>","</div>","{{# }; }}","</div>","{{# if(d.data.totalRow){ }}",'<div class="layui-table-total">','<table cellspacing="0" cellpadding="0" border="0" class="layui-table" ','{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>','<tbody><tr><td><div class="layui-table-cell" style="visibility: hidden;">Total</div></td></tr></tbody>',"</table>","</div>","{{# } }}","{{# if(d.data.page){ }}",'<div class="layui-table-page">','<div id="layui-table-page{{d.index}}"></div>',"</div>","{{# } }}","<style>","{{# layui.each(d.data.cols, function(i1, item1){","layui.each(item1, function(i2, item2){ }}",".laytable-cell-{{d.index}}-{{i1}}-{{i2}}{ ","{{# if(item2.width){ }}","width: {{item2.width}}px;","{{# } }}"," }","{{# });","}); }}","</style>","</div>"].join(""),H=t(window),R=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+p),o=e.elem=t(i(z).render({VIEW_CLASS:p,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(v),e.layBox=o.find(m),e.layHeader=o.find(b),e.layMain=o.find(k),e.layBody=o.find(x),e.layFixed=o.find(C),e.layFixLeft=o.find(w),e.layFixRight=o.find(T),e.layTotal=o.find(A),e.layPage=o.find(L),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(b).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['<div class="layui-inline" lay-event="add"><i class="layui-icon layui-icon-add-1"></i></div>','<div class="layui-inline" lay-event="update"><i class="layui-icon layui-icon-edit"></i></div>','<div class="layui-inline" lay-event="delete"><i class="layui-icon layui-icon-delete"></i></div>'].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i=r[t];i&&d.push('<div class="layui-inline" title="'+i.title+'" lay-event="'+i.layEvent+'"><i class="layui-icon '+i.icon+'"></i></div>')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](y),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&l<s&&(a--,c=s):(c=d.width||0,/\d+%$/.test(c)?(c=Math.floor(parseFloat(c)/100*o),c<s&&(c=s)):c||(d.width=c=0,a++)),d.hide&&(c=0),n+=c)):void r.splice(i,1)})}),o>n&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;i.config.data&&i.config.data.constructor===Array&&delete i.config.data,i.config=t.extend({},i.config,e),i.render()},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.layMain.html('<div class="'+f+'">'+(t[n.msgName]||"返回的数据不符合规范,正确的成功状态码 ("+n.statusName+") 应为:"+n.statusCode)+"</div>")):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.layMain.html('<div class="'+f+'">数据接口请求异常:'+t+"</div>"),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,i.renderData(c,e,a.data.length),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=[],p=[],v=[],m=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(a,l){var o=[],u=[],f=[],m=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,h=s.index+"-"+r.key,p=l[c];if(void 0!==p&&null!==p||(p=""),!r.colGroup){var v=['<td data-field="'+c+'" data-key="'+h+'" '+function(){var e=[];return r.edit&&e.push('data-edit="'+r.edit+'"'),r.align&&e.push('align="'+r.align+'"'),r.templet&&e.push('data-content="'+p+'"'),r.toolbar&&e.push('data-off="true"'),r.event&&e.push('lay-event="'+r.event+'"'),r.style&&e.push('style="'+r.style+'"'),r.minWidth&&e.push('data-minwidth="'+r.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return r.hide&&e.push(y),r.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','<div class="layui-table-cell laytable-cell-'+function(){return"normal"===r.type?h:h+" laytable-cell-"+r.type}()+'">'+function(){var n=t.extend(!0,{LAY_INDEX:m},l),o=d.config.checkName;switch(r.type){case"checkbox":return'<input type="checkbox" name="layTableCheckbox" lay-skin="primary" '+function(){return r[o]?(l[o]=r[o],r[o]?"checked":""):n[o]?"checked":""}()+">";case"radio":return n[o]&&(e=a),'<input type="radio" name="layTableRadio_'+s.index+'" '+(n[o]?"checked":"")+' lay-type="layTableRadio">';case"numbers":return m}return r.toolbar?i(t(r.toolbar).html()||"").render(n):r.templet?function(){return"function"==typeof r.templet?r.templet(n):i(t(r.templet).html()||String(p)).render(n)}():p}(),"</div></td>"].join("");o.push(v),r.fixed&&"right"!==r.fixed&&u.push(v),"right"===r.fixed&&f.push(v)}}),h.push('<tr data-index="'+a+'">'+o.join("")+"</tr>"),p.push('<tr data-index="'+a+'">'+u.join("")+"</tr>"),v.push('<tr data-index="'+a+'">'+f.join("")+"</tr>"))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(p.join("")),c.layFixRight.find("tbody").html(v.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return c.key=s.id||s.index,d.cache[c.key]=u,c.layPage[0==o||0===u.length&&1==n?"addClass":"removeClass"](y),r?m():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('<div class="'+f+'">'+s.text.none+"</div>")):(m(),c.renderTotal(u),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'<i class="layui-icon"></i>',next:'<i class="layui-icon"></i>',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.loading(),c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e){var t=this,i=t.config,a={};if(i.totalRow){layui.each(e,function(e,i){0!==i.length&&t.eachCols(function(e,t){var l=t.field||e,n=i[l];t.totalRow&&(a[l]=(a[l]||0)+(parseFloat(n)||0))})});var l=[];t.eachCols(function(e,t){var n=t.field||e,o=['<td data-field="'+n+'" data-key="'+i.index+"-"+t.key+'" '+function(){var e=[];return t.align&&e.push('align="'+t.align+'"'),t.style&&e.push('style="'+t.style+'"'),t.minWidth&&e.push('data-minwidth="'+t.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return t.hide&&e.push(y),t.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','<div class="layui-table-cell laytable-cell-'+function(){var e=i.index+"-"+t.key;return"normal"===t.type?e:e+" laytable-cell-"+t.type}()+'">'+function(){var e=t.totalRowText||"";return t.totalRow?parseFloat(a[n]).toFixed(2)||e:e}(),"</div></td>"].join("");l.push(o)}),t.layTotal.find("tbody").html("<tr>"+l.join("")+"</tr>")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},h=c.config,y=h.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},h.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[h.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,u,"sort("+y+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(g).remove()):(i.layInit=t(['<div class="layui-table-init">','<i class="layui-icon layui-icon-loading layui-icon"></i>',"</div>"].join("")),i.layBox.append(i.layInit)))},F.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},F.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},F.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e=e-(t.layPage.outerHeight()||41)-2),t.layMain.css("height",e))},F.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},F.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('<th class="layui-table-patch"><div class="layui-table-cell"></div></th>');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(x).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](y),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,a=this,o=a.config,c=t("body"),s={},h=a.layHeader.find("th"),f=".layui-table-cell",p=o.elem.attr("lay-filter");a.layTool.on("click","*[lay-event]",function(e){var i=t(this),c=i.attr("lay-event"),s=function(e){var l=t(e.list),n=t('<ul class="layui-table-tool-panel"></ul>');n.html(l),o.height&&n.css("max-height",o.height-(a.layTool.outerHeight()||50)),i.find(".layui-table-tool-panel")[0]||i.append(n),a.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),R.trigger("table.tool.panel.remove"),l.close(a.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return a.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('<li><input type="checkbox" name="'+i.field+'" data-key="'+i.key+'" data-parentkey="'+(i.parentKey||"")+'" lay-skin="primary" '+(i.hide?"":"checked")+' title="'+(i.title||i.field)+'" lay-filter="LAY_TABLE_TOOL_COLS"></li>')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var i=t(e.elem),l=this.checked,n=i.data("key"),r=i.data("parentkey");layui.each(o.cols,function(e,t){layui.each(t,function(t,i){if(e+"-"+t===n){var d=i.hide;i.hide=!l,a.elem.find('*[data-key="'+o.index+"-"+n+'"]')[l?"removeClass":"addClass"](y),d!=i.hide&&a.setParentCol(!l,r),a.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['<li data-type="csv">导出到 Csv 文件</li>','<li data-type="xls">导出到 Excel 文件</li>'].join("")}(),done:function(e,i){i.on("click",function(){var e=t(this).data("type");d.exportFile(o.id,null,e)})}});break;case"LAYTABLE_PRINT":var h=window.open("打印窗口","_blank"),f=["<style>","body{font-size: 12px; color: #666;}","table{width: 100%; border-collapse: collapse; border-spacing: 0;}","th,td{line-height: 20px; padding: 9px 15px; border: 1px solid #ccc; text-align: left; font-size: 12px; color: #666;}","a{color: #666; text-decoration:none;}","*.layui-hide{display: none}","</style>"].join(""),v=t(a.layHeader.html());v.append(a.layMain.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),h.document.write(f+v.prop("outerHTML")),h.document.close(),h.print(),h.close()}layui.event.call(this,u,"toolbar("+p+")",t.extend({event:c,config:o},{}))}),h.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||s.resizeStart||(s.allowResize=i.width()-l<=10,c.css("cursor",s.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);s.resizeStart||c.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(s.allowResize){var l=i.data("key");e.preventDefault(),s.resizeStart=!0,s.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();s.rule=e,s.ruleWidth=parseFloat(t),s.minWidth=i.data("minwidth")||o.cellMinWidth})}}),R.on("mousemove",function(t){if(s.resizeStart){if(t.preventDefault(),s.rule){var i=s.ruleWidth+t.clientX-s.offset[0];i<s.minWidth&&(i=s.minWidth),s.rule.style.width=i+"px",l.close(a.tipsIndex)}e=1}}).on("mouseup",function(t){s.resizeStart&&(s={},c.css("cursor",""),a.scrollPatch()),2===e&&(e=null)}),h.on("click",function(i){var l,n=t(this),o=n.find(S),r=o.attr("lay-sort");return o[0]&&1!==e?(l="asc"===r?"desc":"desc"===r?null:"asc",void a.sort(n,l,null,!0)):e=2}).find(S+" .layui-edge ").on("click",function(e){var i=t(this),l=i.index(),n=i.parents("th").eq(0).data("field");layui.stope(e),0===l?a.sort(n,"asc",null,!0):a.sort(n,"desc",null,!0)});var v=function(e){var l=t(this),n=l.parents("tr").eq(0).data("index"),o=a.layBody.find('tr[data-index="'+n+'"]'),r=d.cache[a.key][n];return t.extend({tr:o,data:d.clearCacheKey(r),del:function(){d.cache[a.key][n]=[],o.remove(),a.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,l){if(e in r){var n,d=o.children('td[data-field="'+e+'"]');r[e]=l,a.eachCols(function(t,i){i.field==e&&i.templet&&(n=i.templet)}),d.children(f).html(function(){return n?function(){return"function"==typeof n?n(r):i(t(n).html()||l).render(r)}():l}()),d.data("content",l)}})}},e)};a.elem.on("click",'input[name="layTableCheckbox"]+',function(){var e=t(this).prev(),i=a.layBody.find('input[name="layTableCheckbox"]'),l=e.parents("tr").eq(0).data("index"),n=e[0].checked,o="layTableAllChoose"===e.attr("lay-filter");o?(i.each(function(e,t){t.checked=n,a.setCheckData(e,n)}),a.syncCheckAll(),a.renderForm("checkbox")):(a.setCheckData(l,n),a.syncCheckAll()),layui.event.call(e[0],u,"checkbox("+p+")",v.call(e[0],{checked:n,type:o?"all":"one"}))}),a.elem.on("click",'input[lay-type="layTableRadio"]+',function(){var e=t(this).prev(),i=e[0].checked,l=d.cache[a.key],n=e.parents("tr").eq(0).data("index");layui.each(l,function(e,t){n===e?t.LAY_CHECKED=!0:delete t.LAY_CHECKED}),a.setThisRowChecked(n),layui.event.call(this,u,"radio("+p+")",v.call(this,{checked:i}))}),a.layBody.on("mouseenter","tr",function(){var e=t(this),i=e.index();a.layBody.find("tr:eq("+i+")").addClass(W)}).on("mouseleave","tr",function(){var e=t(this),i=e.index();a.layBody.find("tr:eq("+i+")").removeClass(W)}).on("click","tr",function(){m.call(this,"row")}).on("dblclick","tr",function(){m.call(this,"rowDouble")});var m=function(e){var i=t(this);layui.event.call(this,u,e+"("+p+")",v.call(i.children("td")[0]))};a.layBody.on("change","."+N,function(){var e=t(this),i=this.value,l=e.parent().data("field"),n=e.parents("tr").eq(0).data("index"),o=d.cache[a.key][n];o[l]=i,layui.event.call(this,u,"edit("+p+")",v.call(this,{value:i,field:l}))}).on("blur","."+N,function(){var e,l=t(this),n=l.parent().data("field"),o=l.parents("tr").eq(0).data("index"),r=d.cache[a.key][o];a.eachCols(function(t,i){i.field==n&&i.templet&&(e=i.templet)}),l.siblings(f).html(function(a){return e?function(){return"function"==typeof e?e(r):i(t(e).html()||this.value).render(r)}():a}(this.value)),l.parent().data("content",this.value),l.remove()}),a.layBody.on("click","td",function(e){var i=t(this),a=(i.data("field"),i.data("edit")),l=i.children(f);if(!i.data("off")&&a){var n=t('<input class="layui-input '+N+'">');return n[0].value=i.data("content")||l.text(),i.find("."+N)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(f);if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('<div class="'+g+'"><i class="layui-icon layui-icon-down"></i></div>')}};a.layBody.on("click","."+g,function(e){var i=t(this),n=i.parent(),d=n.children(f);a.tipsIndex=l.tips(['<div class="layui-table-tips-main" style="margin-top: -'+(d.height()+16)+"px;"+function(){return"sm"===o.size?"padding: 4px 15px; font-size: 12px;":"lg"===o.size?"padding: 14px 15px;":""}()+'">',d.html(),"</div>",'<i class="layui-icon layui-table-tips-c layui-icon-close"></i>'].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:a.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),i=e.parents("tr").eq(0).data("index");layui.event.call(this,u,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),a.setThisRowChecked(i)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layTotal.scrollLeft(i),a.layFixed.find(x).scrollTop(n),l.close(a.tipsIndex)}),R.on("click",function(){R.trigger("table.remove.tool.panel")}),R.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()}),H.on("resize",function(){a.resize()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var a=c.config[e]||{},l={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],n=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(n.href="data:"+l+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],a=[];return layui.each(t,function(t,l){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(l),function(e,t){n.push(t)})):d.eachCols(e,function(e,a){a.field&&"normal"==a.type&&!a.hide&&(0==t&&i.push(a.title||""),n.push(l[a.field]))}),a.push(n.join(","))}),i.join(",")+"\r\n"+a.join("\r\n")}()),n.download=(a.title||"table_"+(a.index||""))+"."+i,document.body.appendChild(n),n.click(),void document.body.removeChild(n))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,i){i=i||{};var a=s(e);if(a)return i.data&&i.data.constructor===Array&&delete a.data,d.render(t.extend(!0,{},a,i))},d.render=function(e){var t=new F(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(u,d)});layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['<button class="layui-icon '+u+'" lay-type="sub">'+("updown"===n.anim?"":"")+"</button>",'<button class="layui-icon '+u+'" lay-type="add">'+("updown"===n.anim?"":"")+"</button>"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['<div class="'+c+'"><ul>',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("<li"+(n.index===e?' class="layui-this"':"")+"></li>")}),i.join("")}(),"</ul></div>"].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a<n.index&&e.slide("sub",n.index-a)})},m.prototype.slide=function(e,i){var n=this,l=n.elemItem,u=n.config,c=u.index,m=u.elem.attr("lay-filter");n.haveSlide||("sub"===e?(n.subIndex(i),l.eq(u.index).addClass(d),setTimeout(function(){l.eq(c).addClass(r),l.eq(u.index).addClass(r)},50)):(n.addIndex(i),l.eq(u.index).addClass(s),setTimeout(function(){l.eq(c).addClass(o),l.eq(u.index).addClass(o)},50)),setTimeout(function(){l.removeClass(a+" "+d+" "+s+" "+o+" "+r),l.eq(u.index).addClass(a),n.haveSlide=!1},300),n.elemInd.find("li").eq(u.index).addClass(a).siblings().removeClass(a),n.haveSlide=!0,layui.event.call(this,t,"change("+m+")",{index:u.index,prevIndex:c,item:l.eq(u.index)}))},m.prototype.events=function(){var e=this,i=e.config;i.elem.data("haveEvents")||(i.elem.on("mouseenter",function(){clearInterval(e.timer)}).on("mouseleave",function(){e.autoplay()}),i.elem.data("haveEvents",!0))},n.render=function(e){var i=new m(e);return i},e(t,n)});layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='<ul class="layui-rate" '+(i.readonly?"readonly":"")+">",u=1;u<=i.length;u++){var r='<li class="layui-inline"><i class="layui-icon '+(u>Math.floor(i.value)?o:s)+'" '+l+"></i></li>";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'<li><i class="layui-icon layui-icon-rate-half" '+l+"></i></li>":n+=r}n+="</ul>"+(i.text?'<span class="layui-inline">'+i.value+"星":"")+"</span>";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)});layui.define("jquery",function(t){"use strict";var e=layui.$,i={fixbar:function(t){var i,a,n="layui-fixbar",r="layui-fixbar-top",o=e(document),l=e("body");t=e.extend({showHeight:200},t),t.bar1=t.bar1===!0?"":t.bar1,t.bar2=t.bar2===!0?"":t.bar2,t.bgcolor=t.bgcolor?"background-color:"+t.bgcolor:"";var c=[t.bar1,t.bar2,""],g=e(['<ul class="'+n+'">',t.bar1?'<li class="layui-icon" lay-type="bar1" style="'+t.bgcolor+'">'+c[0]+"</li>":"",t.bar2?'<li class="layui-icon" lay-type="bar2" style="'+t.bgcolor+'">'+c[1]+"</li>":"",'<li class="layui-icon '+r+'" lay-type="top" style="'+t.bgcolor+'">'+c[2]+"</li>","</ul>"].join("")),s=g.find("."+r),u=function(){var e=o.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+n)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),a=i.attr("lay-type");"top"===a&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,a)}),o.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var a=this,n="function"==typeof e,r=new Date(t).getTime(),o=new Date(!e||n?(new Date).getTime():e).getTime(),l=r-o,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];n&&(i=e);var g=setTimeout(function(){a.countdown(t,o+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],e,g),l<=0&&clearTimeout(g),g},timeAgo:function(t,e){var i=this,a=[[],[]],n=(new Date).getTime()-new Date(t).getTime();return n>6912e5?(n=new Date(t),a[0][0]=i.digit(n.getFullYear(),4),a[0][1]=i.digit(n.getMonth()+1),a[0][2]=i.digit(n.getDate()),e||(a[1][0]=i.digit(n.getHours()),a[1][1]=i.digit(n.getMinutes()),a[1][2]=i.digit(n.getSeconds())),a[0].join("-")+" "+a[1].join(":")):n>=864e5?(n/1e3/60/60/24|0)+"天前":n>=36e5?(n/1e3/60/60|0)+"小时前":n>=12e4?(n/1e3/60|0)+"分钟前":n<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var a=t.length;a<e;a++)i+="0";return t<Math.pow(10,e)?i+(0|t):t},toDateString:function(t,e){var i=this,a=new Date(t||new Date),n=[i.digit(a.getFullYear(),4),i.digit(a.getMonth()+1),i.digit(a.getDate())],r=[i.digit(a.getHours()),i.digit(a.getMinutes()),i.digit(a.getSeconds())];return e=e||"yyyy-MM-dd HH:mm:ss",e.replace(/yyyy/g,n[0]).replace(/MM/g,n[1]).replace(/dd/g,n[2]).replace(/HH/g,r[0]).replace(/mm/g,r[1]).replace(/ss/g,r[2])},escape:function(t){return String(t||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")}};!function(t,e,i){"$:nomunge";function a(){n=e[l](function(){r.each(function(){var e=t(this),i=e.width(),a=e.height(),n=t.data(this,g);(i!==n.w||a!==n.h)&&e.trigger(c,[n.w=i,n.h=a])}),a()},o[s])}var n,r=t([]),o=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";o[s]=250,o[u]=!0,t.event.special[c]={setup:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===r.length&&a()},teardown:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.not(e),e.removeData(g),r.length||clearTimeout(n)},add:function(e){function a(e,a,r){var o=t(this),l=t.data(this,g)||{};l.w=a!==i?a:o.width(),l.h=r!==i?r:o.height(),n.apply(this,arguments)}if(!o[u]&&this[l])return!1;var n;return t.isFunction(e)?(n=e,a):(n=e.handler,void(e.handler=a))}}}(e,window),t("util",i)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='<i class="layui-anim layui-anim-rotate layui-anim-loop layui-icon "></i>';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="<cite>加载更多</cite>",h=l('<div class="layui-flow-more"><a href="javascript:;">'+d+"</a></div>");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;s<t.lazyimg.elem.length;s++){var v=t.lazyimg.elem.eq(s),y=a?function(){return v.offset().top-n.offset().top+m}():v.offset().top;if(c(v,f),i=s,y>u)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['<div class="'+r+'">','<div class="layui-unselect layui-layedit-tool">'+f+"</div>",'<div class="layui-layedit-iframe">','<iframe id="'+u+'" name="'+u+'" textarea="'+t+'" frameborder="0"></iframe>',"</div>","</div>"].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e(["<style>","*{margin: 0; padding: 0;}","body{padding: 10px; line-height: 20px; overflow-x: hidden; word-wrap: break-word; font: 14px Helvetica Neue,Helvetica,PingFang SC,Microsoft YaHei,Tahoma,Arial,sans-serif; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}","a{color:#01AAED; text-decoration:none;}a:hover{color:#c00}","p{margin-bottom: 10px;}","img{display: inline-block; border: none; vertical-align: middle;}","pre{margin: 10px 0; padding: 10px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}","</style>"].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"<p>")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"<p>"),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"<p>"),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['<ul class="layui-form" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">URL</label>','<div class="layui-input-block" style="margin-left: 90px">','<input name="url" lay-verify="url" value="'+(t.href||"")+'" autofocus="true" autocomplete="off" class="layui-input">',"</div>","</li>",'<li class="layui-form-item">','<label class="layui-form-label" style="width: 60px;">打开方式</label>','<div class="layui-input-block" style="margin-left: 90px">','<input type="radio" name="target" value="_self" class="layui-input" title="当前窗口"'+("_self"!==t.target&&t.target?"":"checked")+">",'<input type="radio" name="target" value="_blank" class="layui-input" title="新窗口" '+("_blank"===t.target?"checked":"")+">","</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-link-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('<li title="'+e+'"><img src="'+i+'" alt="'+e+'"></li>')}),'<ul class="layui-clear">'+t.join("")+"</ul>"}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['<ul class="layui-form layui-form-pane" style="margin: 15px;">','<li class="layui-form-item">','<label class="layui-form-label">请选择语言</label>','<div class="layui-input-block">','<select name="lang">','<option value="JavaScript">JavaScript</option>','<option value="HTML">HTML</option>','<option value="CSS">CSS</option>','<option value="Java">Java</option>','<option value="PHP">PHP</option>','<option value="C#">C#</option>','<option value="Python">Python</option>','<option value="Ruby">Ruby</option>','<option value="Go">Go</option>',"</select>","</div>","</li>",'<li class="layui-form-item layui-form-text">','<label class="layui-form-label">代码</label>','<div class="layui-input-block">','<textarea name="code" lay-verify="required" autofocus="true" class="layui-textarea" style="height: 200px;"></textarea>',"</div>","</li>",'<li class="layui-form-item" style="text-align: center;">','<button type="button" lay-submit lay-filter="layedit-code-yes" class="layui-btn"> 确定 </button>','<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 取消 </button>',"</li>","</ul>"].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'<i class="layui-icon layedit-tool-html" title="HTML源代码" lay-command="html" layedit-event="html""></i><span class="layedit-tool-mid"></span>',strong:'<i class="layui-icon layedit-tool-b" title="加粗" lay-command="Bold" layedit-event="b""></i>',italic:'<i class="layui-icon layedit-tool-i" title="斜体" lay-command="italic" layedit-event="i""></i>',underline:'<i class="layui-icon layedit-tool-u" title="下划线" lay-command="underline" layedit-event="u""></i>',del:'<i class="layui-icon layedit-tool-d" title="删除线" lay-command="strikeThrough" layedit-event="d""></i>',"|":'<span class="layedit-tool-mid"></span>',left:'<i class="layui-icon layedit-tool-left" title="左对齐" lay-command="justifyLeft" layedit-event="left""></i>',center:'<i class="layui-icon layedit-tool-center" title="居中对齐" lay-command="justifyCenter" layedit-event="center""></i>',right:'<i class="layui-icon layedit-tool-right" title="右对齐" lay-command="justifyRight" layedit-event="right""></i>',link:'<i class="layui-icon layedit-tool-link" title="插入链接" layedit-event="link""></i>',unlink:'<i class="layui-icon layedit-tool-unlink layui-disabled" title="清除链接" lay-command="unlink" layedit-event="unlink""></i>',face:'<i class="layui-icon layedit-tool-face" title="表情" layedit-event="face""></i>',image:'<i class="layui-icon layedit-tool-image" title="图片" layedit-event="image"><input type="file" name="file"></i>',code:'<i class="layui-icon layedit-tool-code" title="插入代码" layedit-event="code"></i>',help:'<i class="layui-icon layedit-tool-help" title="帮助" layedit-event="help"></i>'},w=new c;t(n,w)});layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('<ol class="layui-code-ol"><li>'+o.replace(/[\r\t\n]+/g,"</li><li>")+"</li></ol>"),c.find(">.layui-code-h3")[0]||c.prepend('<h3 class="layui-code-h3">'+(c.attr("lay-title")||e.title||"code")+(e.about?'<a href="'+l+'" target="_blank">layui.code</a>':"")+"</h3>");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss");
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/layui.js b/payapi/src/main/resources/static/libs/layui/layui.js
new file mode 100755
index 0000000..3cd51c2
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/layui.js
@@ -0,0 +1,2 @@
+/** layui-v2.4.5 MIT License By https://www.layui.com */
+ ;!function(e){"use strict";var t=document,o={modules:{},status:{},timeout:10,event:{}},n=function(){this.v="2.4.5"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,o=t.scripts,n=o.length-1,r=n;r>0;r--)if("interactive"===o[r].readyState){e=o[r].src;break}return e||o[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),i=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},a="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,i=function(){var e=function(e,t){layui[e]=t,o.status[e]=!0};return"function"==typeof t&&t(function(n,r){e(n,r),o.callback[n]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?i.call(n):(n.use(e,i),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":/^\{\/\}/.test(y.modules[f])?"":o.base||"")+(y.modules[f]||f)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||a?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var a=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?a:(function p(){return++y>1e3*o.timeout/100?i(e+" timeout"):void(1989===parseInt(a.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),a)},o.callback={},n.prototype.factory=function(e){if(layui[e])return"function"==typeof o.callback[e]?o.callback[e]:null},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,"function"==typeof t&&t(n)},void(n.onerror=function(e){n.onerror=null,"function"==typeof o&&o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?i("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),o.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o,n){if(t=t||"layui",n=n||localStorage,e.JSON&&e.JSON.parse){if(null===o)return delete n[t];o="object"==typeof o?o:{key:o};try{var r=JSON.parse(n[t])}catch(i){var r={}}return"value"in o&&(r[o.key]=o.value),o.remove&&delete r[o.key],n[t]=JSON.stringify(r),o.key?r[o.key]:r}},n.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:i}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;o<e.length&&!t.call(e[o],o,e[o]);o++);return n},n.prototype.sort=function(e,t,o){var n=JSON.parse(JSON.stringify(e||[]));return t?(n.sort(function(e,o){var n=/^-?\d+$/,r=e[t],i=o[t];return n.test(r)&&(r=parseFloat(r)),n.test(i)&&(i=parseFloat(i)),r&&!i?1:!r&&i?-1:r>i?1:r<i?-1:0}),o&&n.reverse(),n):n},n.prototype.stope=function(t){t=t||e.event;try{t.stopPropagation()}catch(o){t.cancelBubble=!0}},n.prototype.onevent=function(e,t,o){return"string"!=typeof e||"function"!=typeof o?this:n.event(e,t,null,o)},n.prototype.event=n.event=function(e,t,n,r){var i=this,a=null,u=t.match(/\((.*)\)$/)||[],l=(e+"."+t).replace(u[0],""),s=u[1]||"",c=function(e,t){var o=t&&t.call(i,n);o===!1&&null===a&&(a=!1)};return r?(o.event[l]=o.event[l]||{},o.event[l][s]=[r],this):(layui.each(o.event[l],function(e,t){return"{*}"===s?void layui.each(t,c):(""===e&&layui.each(t,c),void(s&&e===s&&layui.each(t,c)))}),a)},e.layui=new n}(window);
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/q.js b/payapi/src/main/resources/static/libs/q.js
new file mode 100755
index 0000000..b235b20
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/q.js
@@ -0,0 +1,99 @@
+/**
+ * 路由组件
+ * q.js-1.2 <https://github.com/itorr/q.js>
+ */
+var Q = function (W, D, HTML, hash, view, arg, _arg, i, index, Regex, key, Q) {
+ HTML = D.documentElement;
+ Regex = [];
+ key = '!';
+ onhashchange = function () {
+ Q.hash = hash = location.hash.substring(key.length + 1);
+
+ arg = hash.split(/\?/g).shift();
+
+ arg = arg.split('/');
+
+ i = Regex.length;
+ while (i--)
+ if (_arg = hash.match(Regex[i])) {
+ arg = _arg;
+ arg[0] = Regex[i];
+ break;
+ }
+
+
+ if (!Q[arg[0]]) // default
+ arg[0] = index;
+
+ if (Q.pop)
+ Q.pop.apply(W, arg);
+
+ Q.lash = view = arg.shift();
+
+ HTML.setAttribute('view', view);
+
+ Q[view].apply(W, arg);
+ };
+
+ if (!'onhashchange' in W) {
+ Q.path = location.hash;
+ setInterval(function () {
+ if (Q.path != location.hash) {
+ onhashchange();
+ Q.path = location.hash;
+ }
+ }, 100);
+ }
+
+ Q = {
+ init: function (o) {
+
+ if (o.key !== undefined)
+ key = o.key;
+
+ index = o.index || 'V';
+
+ if (o.pop && typeof o.pop == 'function')
+ Q.pop = o.pop;
+
+ onhashchange();
+
+ return this
+ },
+ reg: function (r, u) {
+ if (!r)
+ return;
+
+ if (u == undefined)
+ u = function () {
+ };
+
+ if (r instanceof RegExp) { //正则注册
+ Q[r] = u;
+ Regex.push(r);
+ } else if (r instanceof Array) { //数组注册
+ for (var i in r) {
+ this.reg.apply(this, [].concat(r[i]).concat(u));
+ }
+ } else if (typeof r == 'string') { //关键字注册
+ if (typeof u == 'function')
+ Q[r] = u;
+ else if (typeof u == 'string' && Q[u])
+ Q[r] = Q[u];
+ }
+
+ return this
+ },
+ V: function () {
+ return this
+ },
+ go: function (u) {
+ location.hash = '#' + key + u;
+ return this
+ },
+ refresh: function () {
+ onhashchange();
+ }
+ };
+ return Q;
+}(this, document);
diff --git a/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/line_conn.png b/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/line_conn.png
new file mode 100755
index 0000000..b211da2
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/line_conn.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/loading.gif b/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/loading.gif
new file mode 100755
index 0000000..e8c2892
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/loading.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.gif b/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.gif
new file mode 100755
index 0000000..664b969
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.png b/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.png
new file mode 100755
index 0000000..e9e58a3
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/metroStyle/metroStyle.css b/payapi/src/main/resources/static/libs/zTree/css/metroStyle/metroStyle.css
new file mode 100755
index 0000000..e20c37d
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/metroStyle/metroStyle.css
@@ -0,0 +1,96 @@
+/*-------------------------------------
+zTree Style
+
+version: 3.4
+author: Hunter.z
+email: hunter.z@263.net
+website: http://code.google.com/p/jquerytree/
+
+-------------------------------------*/
+
+.ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif}
+.ztree {margin:0; padding:5px; color:#333}
+.ztree li{padding:0; margin:0; list-style:none; line-height:17px; text-align:left; white-space:nowrap; outline:0}
+.ztree li ul{ margin:0; padding:0 0 0 18px}
+.ztree li ul.line{ background:url(./img/line_conn.png) 0 0 repeat-y;}
+
+.ztree li a {padding-right:3px; margin:0; cursor:pointer; height:21px; color:#333; background-color: transparent; text-decoration:none; vertical-align:top; display: inline-block}
+.ztree li a:hover {text-decoration:underline}
+.ztree li a.curSelectedNode {padding-top:0px; background-color:#e5e5e5; color:black; height:21px; opacity:0.8;}
+.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#e5e5e5; color:black; height:21px; border:1px #666 solid; opacity:0.8;}
+.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#aaa; color:white; height:21px; border:1px #666 solid;
+ opacity:0.8; filter:alpha(opacity=80)}
+.ztree li a.tmpTargetNode_prev {}
+.ztree li a.tmpTargetNode_next {}
+.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0;
+ font-size:12px; border:1px #585956 solid; *border:0px}
+.ztree li span {line-height:21px; margin-right:2px}
+.ztree li span.button {line-height:0; margin:0; padding: 0; width:21px; height:21px; display: inline-block; vertical-align:middle;
+ border:0 none; cursor: pointer;outline:none;
+ background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+ background-image:url("./img/metro.png"); *background-image:url("./img/metro.gif")}
+
+.ztree li span.button.chk {width:13px; height:13px; margin:0 2px; cursor: auto}
+.ztree li span.button.chk.checkbox_false_full {background-position: -5px -5px;}
+.ztree li span.button.chk.checkbox_false_full_focus {background-position: -5px -26px;}
+.ztree li span.button.chk.checkbox_false_part {background-position: -5px -48px;}
+.ztree li span.button.chk.checkbox_false_part_focus {background-position: -5px -68px;}
+.ztree li span.button.chk.checkbox_false_disable {background-position: -5px -89px;}
+.ztree li span.button.chk.checkbox_true_full {background-position: -26px -5px;}
+.ztree li span.button.chk.checkbox_true_full_focus {background-position: -26px -26px;}
+.ztree li span.button.chk.checkbox_true_part {background-position: -26px -48px;}
+.ztree li span.button.chk.checkbox_true_part_focus {background-position: -26px -68px;}
+.ztree li span.button.chk.checkbox_true_disable {background-position: -26px -89px;}
+.ztree li span.button.chk.radio_false_full {background-position: -47px -5px;}
+.ztree li span.button.chk.radio_false_full_focus {background-position: -47px -26px;}
+.ztree li span.button.chk.radio_false_part {background-position: -47px -47px;}
+.ztree li span.button.chk.radio_false_part_focus {background-position: -47px -68px;}
+.ztree li span.button.chk.radio_false_disable {background-position: -47px -89px;}
+.ztree li span.button.chk.radio_true_full {background-position: -68px -5px;}
+.ztree li span.button.chk.radio_true_full_focus {background-position: -68px -26px;}
+.ztree li span.button.chk.radio_true_part {background-position: -68px -47px;}
+.ztree li span.button.chk.radio_true_part_focus {background-position: -68px -68px;}
+.ztree li span.button.chk.radio_true_disable {background-position: -68px -89px;}
+
+.ztree li span.button.switch {width:21px; height:21px}
+.ztree li span.button.root_open{background-position:-105px -63px}
+.ztree li span.button.root_close{background-position:-126px -63px}
+.ztree li span.button.roots_open{background-position: -105px 0;}
+.ztree li span.button.roots_close{background-position: -126px 0;}
+.ztree li span.button.center_open{background-position: -105px -21px;}
+.ztree li span.button.center_close{background-position: -126px -21px;}
+.ztree li span.button.bottom_open{background-position: -105px -42px;}
+.ztree li span.button.bottom_close{background-position: -126px -42px;}
+.ztree li span.button.noline_open{background-position: -105px -84px;}
+.ztree li span.button.noline_close{background-position: -126px -84px;}
+.ztree li span.button.root_docu{ background:none;}
+.ztree li span.button.roots_docu{background-position: -84px 0;}
+.ztree li span.button.center_docu{background-position: -84px -21px;}
+.ztree li span.button.bottom_docu{background-position: -84px -42px;}
+.ztree li span.button.noline_docu{ background:none;}
+
+.ztree li span.button.ico_open{margin-right:2px; background-position: -147px -21px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_close{margin-right:2px; margin-right:2px; background-position: -147px 0; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_docu{margin-right:2px; background-position: -147px -42px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.edit {margin-left:2px; margin-right: -1px; background-position: -189px -21px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.edit:hover {
+ background-position: -168px -21px;
+}
+.ztree li span.button.remove {margin-left:2px; margin-right: -1px; background-position: -189px -42px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.remove:hover {
+ background-position: -168px -42px;
+}
+.ztree li span.button.add {margin-left:2px; margin-right: -1px; background-position: -189px 0; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.add:hover {
+ background-position: -168px 0;
+}
+.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
+
+ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)}
+
+span.tmpzTreeMove_arrow {width:16px; height:21px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute;
+ background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+ background-position:-168px -84px; background-image:url("./img/metro.png"); *background-image:url("./img/metro.gif")}
+
+ul.ztreeul.ztreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)}
+.ztreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute}
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/1_close.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/1_close.png
new file mode 100755
index 0000000..68ccb3c
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/1_close.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/1_open.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/1_open.png
new file mode 100755
index 0000000..d6ff36d
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/1_open.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/2.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/2.png
new file mode 100755
index 0000000..9eff506
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/2.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/3.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/3.png
new file mode 100755
index 0000000..d7ba6d0
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/3.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/4.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/4.png
new file mode 100755
index 0000000..753e2bf
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/4.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/5.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/5.png
new file mode 100755
index 0000000..0c5eccd
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/5.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/6.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/6.png
new file mode 100755
index 0000000..070b835
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/6.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/7.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/7.png
new file mode 100755
index 0000000..532b037
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/7.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/8.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/8.png
new file mode 100755
index 0000000..a8f3a86
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/8.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/9.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/9.png
new file mode 100755
index 0000000..4db73cd
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/diy/9.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/line_conn.gif b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/line_conn.gif
new file mode 100755
index 0000000..d561d36
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/line_conn.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/loading.gif b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/loading.gif
new file mode 100755
index 0000000..e8c2892
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/loading.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.gif b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.gif
new file mode 100755
index 0000000..50c94fd
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.gif
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.png b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.png
new file mode 100755
index 0000000..ffda01e
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.png
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/zTreeStyle.css b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/zTreeStyle.css
new file mode 100755
index 0000000..3b7190b
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/css/zTreeStyle/zTreeStyle.css
@@ -0,0 +1,102 @@
+/*-------------------------------------
+zTree Style
+
+version: 3.5.17
+author: Hunter.z
+email: hunter.z@263.net
+website: http://code.google.com/p/jquerytree/
+
+-------------------------------------*/
+
+.ztree * {padding:0; margin:0; font-size:14px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif}
+.ztree {margin:0; padding:5px; color:#333}
+.ztree li{padding:0; margin:0; list-style:none; line-height:14px; text-align:left; white-space:nowrap; outline:0}
+.ztree li ul{ margin:0; padding:0 0 0 18px}
+.ztree li ul.line{ background:url(./img/line_conn.gif) 0 0 repeat-y;}
+
+.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:17px; color:#333; background-color: transparent;
+ text-decoration:none; vertical-align:top; display: inline-block}
+.ztree li a:hover {text-decoration:underline}
+.ztree li a.curSelectedNode {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
+.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
+.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:16px; border:1px #316AC5 solid;
+ opacity:0.8; filter:alpha(opacity=80)}
+.ztree li a.tmpTargetNode_prev {}
+.ztree li a.tmpTargetNode_next {}
+.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0;
+ font-size:12px; border:1px #7EC4CC solid; *border:0px}
+.ztree li span {line-height:16px; margin-right:2px}
+.ztree li span.button {line-height:0; margin:0; width:16px; height:16px; display: inline-block; vertical-align:middle;
+ border:0 none; cursor: pointer;outline:none;
+ background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+ background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
+
+.ztree li span.button.chk {width:13px; height:13px; margin:0 3px 0 0; cursor: auto}
+.ztree li span.button.chk.checkbox_false_full {background-position:0 0}
+.ztree li span.button.chk.checkbox_false_full_focus {background-position:0 -14px}
+.ztree li span.button.chk.checkbox_false_part {background-position:0 -28px}
+.ztree li span.button.chk.checkbox_false_part_focus {background-position:0 -42px}
+.ztree li span.button.chk.checkbox_false_disable {background-position:0 -56px}
+.ztree li span.button.chk.checkbox_true_full {background-position:-14px 0}
+.ztree li span.button.chk.checkbox_true_full_focus {background-position:-14px -14px}
+.ztree li span.button.chk.checkbox_true_part {background-position:-14px -28px}
+.ztree li span.button.chk.checkbox_true_part_focus {background-position:-14px -42px}
+.ztree li span.button.chk.checkbox_true_disable {background-position:-14px -56px}
+.ztree li span.button.chk.radio_false_full {background-position:-28px 0}
+.ztree li span.button.chk.radio_false_full_focus {background-position:-28px -14px}
+.ztree li span.button.chk.radio_false_part {background-position:-28px -28px}
+.ztree li span.button.chk.radio_false_part_focus {background-position:-28px -42px}
+.ztree li span.button.chk.radio_false_disable {background-position:-28px -56px}
+.ztree li span.button.chk.radio_true_full {background-position:-42px 0}
+.ztree li span.button.chk.radio_true_full_focus {background-position:-42px -14px}
+.ztree li span.button.chk.radio_true_part {background-position:-42px -28px}
+.ztree li span.button.chk.radio_true_part_focus {background-position:-42px -42px}
+.ztree li span.button.chk.radio_true_disable {background-position:-42px -56px}
+
+.ztree li span.button.switch {width:18px; height:18px}
+.ztree li span.button.root_open{background-position:-92px -54px}
+.ztree li span.button.root_close{background-position:-74px -54px}
+.ztree li span.button.roots_open{background-position:-92px 0}
+.ztree li span.button.roots_close{background-position:-74px 0}
+.ztree li span.button.center_open{background-position:-92px -18px}
+.ztree li span.button.center_close{background-position:-74px -18px}
+.ztree li span.button.bottom_open{background-position:-92px -36px}
+.ztree li span.button.bottom_close{background-position:-74px -36px}
+.ztree li span.button.noline_open{background-position:-92px -72px}
+.ztree li span.button.noline_close{background-position:-74px -72px}
+.ztree li span.button.root_docu{ background:none;}
+.ztree li span.button.roots_docu{background-position:-56px 0}
+.ztree li span.button.center_docu{background-position:-56px -18px}
+.ztree li span.button.bottom_docu{background-position:-56px -36px}
+.ztree li span.button.noline_docu{ background:none;}
+
+.ztree li span.button.ico_open{margin-right:2px; background-position:-110px -16px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_close{margin-right:2px; background-position:-110px 0; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_docu{margin-right:2px; background-position:-110px -32px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.edit {margin-right:2px; background-position:-110px -48px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.remove {margin-right:2px; background-position:-110px -64px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.add {margin-right:2px; background-position:-144px 0; vertical-align:top; *vertical-align:middle}
+
+.ztree li span.button.pIcon01_ico_open, .ztree li span.button.pIcon01_ico_close, .ztree li span.button.pIcon01_ico_docu{margin-right:2px; background: url(./img/diy/1_open.png) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.pIcon02_ico_open, .ztree li span.button.pIcon02_ico_close, .ztree li span.button.pIcon02_ico_docu{margin-right:2px; background: url(./img/diy/3.png) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
+
+
+.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
+
+ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)}
+
+span.tmpzTreeMove_arrow {width:16px; height:16px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute;
+ background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+ background-position:-110px -80px; background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
+
+ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)}
+.zTreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute}
+
+/* level style*/
+/*.ztree li span.button.level0 {
+ display:none;
+}
+.ztree li ul.level0 {
+ padding:0;
+ background:none;
+}*/
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/zTree/js/jquery.ztree.all-3.5.min.js b/payapi/src/main/resources/static/libs/zTree/js/jquery.ztree.all-3.5.min.js
new file mode 100755
index 0000000..8ff9481
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/zTree/js/jquery.ztree.all-3.5.min.js
@@ -0,0 +1,161 @@
+
+/*
+ * JQuery zTree common v3.5.18
+ * http://zTree.me/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2015-06-18
+ */
+(function(p){var G,H,I,J,K,L,r={},u={},v={},M={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nameIsHTML:!1,selectedMulti:!0,showIcon:!0,showLine:!0,showTitle:!0,txtSelectedEnable:!1},data:{key:{children:"children",name:"name",title:"",url:"url"},simpleData:{enable:!1,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:!1,leaf:!1}},async:{enable:!1,contentType:"application/x-www-form-urlencoded",type:"post",dataType:"text",url:"",autoParam:[],
+otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},w=[function(b){var a=b.treeObj,c=e.event;a.bind(c.NODECREATED,function(a,c,g){j.apply(b.callback.onNodeCreated,
+[a,c,g])});a.bind(c.CLICK,function(a,c,g,l,h){j.apply(b.callback.onClick,[c,g,l,h])});a.bind(c.EXPAND,function(a,c,g){j.apply(b.callback.onExpand,[a,c,g])});a.bind(c.COLLAPSE,function(a,c,g){j.apply(b.callback.onCollapse,[a,c,g])});a.bind(c.ASYNC_SUCCESS,function(a,c,g,l){j.apply(b.callback.onAsyncSuccess,[a,c,g,l])});a.bind(c.ASYNC_ERROR,function(a,c,g,l,h,e){j.apply(b.callback.onAsyncError,[a,c,g,l,h,e])});a.bind(c.REMOVE,function(a,c,g){j.apply(b.callback.onRemove,[a,c,g])});a.bind(c.SELECTED,
+function(a,c,g,l){j.apply(b.callback.onSelected,[c,g,l])});a.bind(c.UNSELECTED,function(a,c,g,l){j.apply(b.callback.onUnSelected,[c,g,l])})}],x=[function(b){var a=e.event;b.treeObj.unbind(a.NODECREATED).unbind(a.CLICK).unbind(a.EXPAND).unbind(a.COLLAPSE).unbind(a.ASYNC_SUCCESS).unbind(a.ASYNC_ERROR).unbind(a.REMOVE).unbind(a.SELECTED).unbind(a.UNSELECTED)}],y=[function(b){var a=h.getCache(b);a||(a={},h.setCache(b,a));a.nodes=[];a.doms=[]}],z=[function(b,a,c,d,f,g){if(c){var l=h.getRoot(b),e=b.data.key.children;
+c.level=a;c.tId=b.treeId+"_"+ ++l.zId;c.parentTId=d?d.tId:null;c.open=typeof c.open=="string"?j.eqs(c.open,"true"):!!c.open;c[e]&&c[e].length>0?(c.isParent=!0,c.zAsync=!0):(c.isParent=typeof c.isParent=="string"?j.eqs(c.isParent,"true"):!!c.isParent,c.open=c.isParent&&!b.async.enable?c.open:!1,c.zAsync=!c.isParent);c.isFirstNode=f;c.isLastNode=g;c.getParentNode=function(){return h.getNodeCache(b,c.parentTId)};c.getPreNode=function(){return h.getPreNode(b,c)};c.getNextNode=function(){return h.getNextNode(b,
+c)};c.isAjaxing=!1;h.fixPIdKeyValue(b,c)}}],s=[function(b){var a=b.target,c=h.getSetting(b.data.treeId),d="",f=null,g="",l="",i=null,o=null,k=null;if(j.eqs(b.type,"mousedown"))l="mousedown";else if(j.eqs(b.type,"mouseup"))l="mouseup";else if(j.eqs(b.type,"contextmenu"))l="contextmenu";else if(j.eqs(b.type,"click"))if(j.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+e.id.SWITCH)!==null)d=j.getNodeMainDom(a).id,g="switchNode";else{if(k=j.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+e.id.A}]))d=j.getNodeMainDom(k).id,
+g="clickNode"}else if(j.eqs(b.type,"dblclick")&&(l="dblclick",k=j.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+e.id.A}])))d=j.getNodeMainDom(k).id,g="switchNode";if(l.length>0&&d.length==0&&(k=j.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+e.id.A}])))d=j.getNodeMainDom(k).id;if(d.length>0)switch(f=h.getNodeCache(c,d),g){case "switchNode":f.isParent?j.eqs(b.type,"click")||j.eqs(b.type,"dblclick")&&j.apply(c.view.dblClickExpand,[c.treeId,f],c.view.dblClickExpand)?i=G:g="":g="";break;case "clickNode":i=
+H}switch(l){case "mousedown":o=I;break;case "mouseup":o=J;break;case "dblclick":o=K;break;case "contextmenu":o=L}return{stop:!1,node:f,nodeEventType:g,nodeEventCallback:i,treeEventType:l,treeEventCallback:o}}],A=[function(b){var a=h.getRoot(b);a||(a={},h.setRoot(b,a));a[b.data.key.children]=[];a.expandTriggerFlag=!1;a.curSelectedList=[];a.noSelection=!0;a.createdNodes=[];a.zId=0;a._ver=(new Date).getTime()}],B=[],C=[],D=[],E=[],F=[],h={addNodeCache:function(b,a){h.getCache(b).nodes[h.getNodeCacheId(a.tId)]=
+a},getNodeCacheId:function(b){return b.substring(b.lastIndexOf("_")+1)},addAfterA:function(b){C.push(b)},addBeforeA:function(b){B.push(b)},addInnerAfterA:function(b){E.push(b)},addInnerBeforeA:function(b){D.push(b)},addInitBind:function(b){w.push(b)},addInitUnBind:function(b){x.push(b)},addInitCache:function(b){y.push(b)},addInitNode:function(b){z.push(b)},addInitProxy:function(b,a){a?s.splice(0,0,b):s.push(b)},addInitRoot:function(b){A.push(b)},addNodesData:function(b,a,c){var d=b.data.key.children;
+a[d]||(a[d]=[]);if(a[d].length>0)a[d][a[d].length-1].isLastNode=!1,i.setNodeLineIcos(b,a[d][a[d].length-1]);a.isParent=!0;a[d]=a[d].concat(c)},addSelectedNode:function(b,a){var c=h.getRoot(b);h.isSelectedNode(b,a)||c.curSelectedList.push(a)},addCreatedNode:function(b,a){(b.callback.onNodeCreated||b.view.addDiyDom)&&h.getRoot(b).createdNodes.push(a)},addZTreeTools:function(b){F.push(b)},exSetting:function(b){p.extend(!0,M,b)},fixPIdKeyValue:function(b,a){b.data.simpleData.enable&&(a[b.data.simpleData.pIdKey]=
+a.parentTId?a.getParentNode()[b.data.simpleData.idKey]:b.data.simpleData.rootPId)},getAfterA:function(b,a,c){for(var d=0,f=C.length;d<f;d++)C[d].apply(this,arguments)},getBeforeA:function(b,a,c){for(var d=0,f=B.length;d<f;d++)B[d].apply(this,arguments)},getInnerAfterA:function(b,a,c){for(var d=0,f=E.length;d<f;d++)E[d].apply(this,arguments)},getInnerBeforeA:function(b,a,c){for(var d=0,f=D.length;d<f;d++)D[d].apply(this,arguments)},getCache:function(b){return v[b.treeId]},getNextNode:function(b,a){if(!a)return null;
+for(var c=b.data.key.children,d=a.parentTId?a.getParentNode():h.getRoot(b),f=0,g=d[c].length-1;f<=g;f++)if(d[c][f]===a)return f==g?null:d[c][f+1];return null},getNodeByParam:function(b,a,c,d){if(!a||!c)return null;for(var f=b.data.key.children,g=0,l=a.length;g<l;g++){if(a[g][c]==d)return a[g];var e=h.getNodeByParam(b,a[g][f],c,d);if(e)return e}return null},getNodeCache:function(b,a){if(!a)return null;var c=v[b.treeId].nodes[h.getNodeCacheId(a)];return c?c:null},getNodeName:function(b,a){return""+
+a[b.data.key.name]},getNodeTitle:function(b,a){return""+a[b.data.key.title===""?b.data.key.name:b.data.key.title]},getNodes:function(b){return h.getRoot(b)[b.data.key.children]},getNodesByParam:function(b,a,c,d){if(!a||!c)return[];for(var f=b.data.key.children,g=[],l=0,e=a.length;l<e;l++)a[l][c]==d&&g.push(a[l]),g=g.concat(h.getNodesByParam(b,a[l][f],c,d));return g},getNodesByParamFuzzy:function(b,a,c,d){if(!a||!c)return[];for(var f=b.data.key.children,g=[],d=d.toLowerCase(),l=0,e=a.length;l<e;l++)typeof a[l][c]==
+"string"&&a[l][c].toLowerCase().indexOf(d)>-1&&g.push(a[l]),g=g.concat(h.getNodesByParamFuzzy(b,a[l][f],c,d));return g},getNodesByFilter:function(b,a,c,d,f){if(!a)return d?null:[];for(var g=b.data.key.children,e=d?null:[],i=0,o=a.length;i<o;i++){if(j.apply(c,[a[i],f],!1)){if(d)return a[i];e.push(a[i])}var k=h.getNodesByFilter(b,a[i][g],c,d,f);if(d&&k)return k;e=d?k:e.concat(k)}return e},getPreNode:function(b,a){if(!a)return null;for(var c=b.data.key.children,d=a.parentTId?a.getParentNode():h.getRoot(b),
+f=0,g=d[c].length;f<g;f++)if(d[c][f]===a)return f==0?null:d[c][f-1];return null},getRoot:function(b){return b?u[b.treeId]:null},getRoots:function(){return u},getSetting:function(b){return r[b]},getSettings:function(){return r},getZTreeTools:function(b){return(b=this.getRoot(this.getSetting(b)))?b.treeTools:null},initCache:function(b){for(var a=0,c=y.length;a<c;a++)y[a].apply(this,arguments)},initNode:function(b,a,c,d,f,g){for(var e=0,h=z.length;e<h;e++)z[e].apply(this,arguments)},initRoot:function(b){for(var a=
+0,c=A.length;a<c;a++)A[a].apply(this,arguments)},isSelectedNode:function(b,a){for(var c=h.getRoot(b),d=0,f=c.curSelectedList.length;d<f;d++)if(a===c.curSelectedList[d])return!0;return!1},removeNodeCache:function(b,a){var c=b.data.key.children;if(a[c])for(var d=0,f=a[c].length;d<f;d++)arguments.callee(b,a[c][d]);h.getCache(b).nodes[h.getNodeCacheId(a.tId)]=null},removeSelectedNode:function(b,a){for(var c=h.getRoot(b),d=0,f=c.curSelectedList.length;d<f;d++)if(a===c.curSelectedList[d]||!h.getNodeCache(b,
+c.curSelectedList[d].tId))c.curSelectedList.splice(d,1),d--,f--},setCache:function(b,a){v[b.treeId]=a},setRoot:function(b,a){u[b.treeId]=a},setZTreeTools:function(b,a){for(var c=0,d=F.length;c<d;c++)F[c].apply(this,arguments)},transformToArrayFormat:function(b,a){if(!a)return[];var c=b.data.key.children,d=[];if(j.isArray(a))for(var f=0,g=a.length;f<g;f++)d.push(a[f]),a[f][c]&&(d=d.concat(h.transformToArrayFormat(b,a[f][c])));else d.push(a),a[c]&&(d=d.concat(h.transformToArrayFormat(b,a[c])));return d},
+transformTozTreeFormat:function(b,a){var c,d,f=b.data.simpleData.idKey,g=b.data.simpleData.pIdKey,e=b.data.key.children;if(!f||f==""||!a)return[];if(j.isArray(a)){var h=[],i=[];for(c=0,d=a.length;c<d;c++)i[a[c][f]]=a[c];for(c=0,d=a.length;c<d;c++)i[a[c][g]]&&a[c][f]!=a[c][g]?(i[a[c][g]][e]||(i[a[c][g]][e]=[]),i[a[c][g]][e].push(a[c])):h.push(a[c]);return h}else return[a]}},m={bindEvent:function(b){for(var a=0,c=w.length;a<c;a++)w[a].apply(this,arguments)},unbindEvent:function(b){for(var a=0,c=x.length;a<
+c;a++)x[a].apply(this,arguments)},bindTree:function(b){var a={treeId:b.treeId},c=b.treeObj;b.view.txtSelectedEnable||c.bind("selectstart",function(a){a=a.originalEvent.srcElement.nodeName.toLowerCase();return a==="input"||a==="textarea"}).css({"-moz-user-select":"-moz-none"});c.bind("click",a,m.proxy);c.bind("dblclick",a,m.proxy);c.bind("mouseover",a,m.proxy);c.bind("mouseout",a,m.proxy);c.bind("mousedown",a,m.proxy);c.bind("mouseup",a,m.proxy);c.bind("contextmenu",a,m.proxy)},unbindTree:function(b){b.treeObj.unbind("click",
+m.proxy).unbind("dblclick",m.proxy).unbind("mouseover",m.proxy).unbind("mouseout",m.proxy).unbind("mousedown",m.proxy).unbind("mouseup",m.proxy).unbind("contextmenu",m.proxy)},doProxy:function(b){for(var a=[],c=0,d=s.length;c<d;c++){var f=s[c].apply(this,arguments);a.push(f);if(f.stop)break}return a},proxy:function(b){var a=h.getSetting(b.data.treeId);if(!j.uCanDo(a,b))return!0;for(var a=m.doProxy(b),c=!0,d=0,f=a.length;d<f;d++){var g=a[d];g.nodeEventCallback&&(c=g.nodeEventCallback.apply(g,[b,g.node])&&
+c);g.treeEventCallback&&(c=g.treeEventCallback.apply(g,[b,g.node])&&c)}return c}};G=function(b,a){var c=h.getSetting(b.data.treeId);if(a.open){if(j.apply(c.callback.beforeCollapse,[c.treeId,a],!0)==!1)return!0}else if(j.apply(c.callback.beforeExpand,[c.treeId,a],!0)==!1)return!0;h.getRoot(c).expandTriggerFlag=!0;i.switchNode(c,a);return!0};H=function(b,a){var c=h.getSetting(b.data.treeId),d=c.view.autoCancelSelected&&(b.ctrlKey||b.metaKey)&&h.isSelectedNode(c,a)?0:c.view.autoCancelSelected&&(b.ctrlKey||
+b.metaKey)&&c.view.selectedMulti?2:1;if(j.apply(c.callback.beforeClick,[c.treeId,a,d],!0)==!1)return!0;d===0?i.cancelPreSelectedNode(c,a):i.selectNode(c,a,d===2);c.treeObj.trigger(e.event.CLICK,[b,c.treeId,a,d]);return!0};I=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeMouseDown,[c.treeId,a],!0)&&j.apply(c.callback.onMouseDown,[b,c.treeId,a]);return!0};J=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeMouseUp,[c.treeId,a],!0)&&j.apply(c.callback.onMouseUp,
+[b,c.treeId,a]);return!0};K=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeDblClick,[c.treeId,a],!0)&&j.apply(c.callback.onDblClick,[b,c.treeId,a]);return!0};L=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeRightClick,[c.treeId,a],!0)&&j.apply(c.callback.onRightClick,[b,c.treeId,a]);return typeof c.callback.onRightClick!="function"};var j={apply:function(b,a,c){return typeof b=="function"?b.apply(N,a?a:[]):c},canAsync:function(b,a){var c=b.data.key.children;
+return b.async.enable&&a&&a.isParent&&!(a.zAsync||a[c]&&a[c].length>0)},clone:function(b){if(b===null)return null;var a=j.isArray(b)?[]:{},c;for(c in b)a[c]=b[c]instanceof Date?new Date(b[c].getTime()):typeof b[c]==="object"?arguments.callee(b[c]):b[c];return a},eqs:function(b,a){return b.toLowerCase()===a.toLowerCase()},isArray:function(b){return Object.prototype.toString.apply(b)==="[object Array]"},$:function(b,a,c){a&&typeof a!="string"&&(c=a,a="");return typeof b=="string"?p(b,c?c.treeObj.get(0).ownerDocument:
+null):p("#"+b.tId+a,c?c.treeObj:null)},getMDom:function(b,a,c){if(!a)return null;for(;a&&a.id!==b.treeId;){for(var d=0,f=c.length;a.tagName&&d<f;d++)if(j.eqs(a.tagName,c[d].tagName)&&a.getAttribute(c[d].attrName)!==null)return a;a=a.parentNode}return null},getNodeMainDom:function(b){return p(b).parent("li").get(0)||p(b).parentsUntil("li").parent().get(0)},isChildOrSelf:function(b,a){return p(b).closest("#"+a).length>0},uCanDo:function(){return!0}},i={addNodes:function(b,a,c,d){if(!b.data.keep.leaf||
+!a||a.isParent)if(j.isArray(c)||(c=[c]),b.data.simpleData.enable&&(c=h.transformTozTreeFormat(b,c)),a){var f=k(a,e.id.SWITCH,b),g=k(a,e.id.ICON,b),l=k(a,e.id.UL,b);if(!a.open)i.replaceSwitchClass(a,f,e.folder.CLOSE),i.replaceIcoClass(a,g,e.folder.CLOSE),a.open=!1,l.css({display:"none"});h.addNodesData(b,a,c);i.createNodes(b,a.level+1,c,a);d||i.expandCollapseParentNode(b,a,!0)}else h.addNodesData(b,h.getRoot(b),c),i.createNodes(b,0,c,null)},appendNodes:function(b,a,c,d,f,g){if(!c)return[];for(var e=
+[],j=b.data.key.children,k=0,m=c.length;k<m;k++){var n=c[k];if(f){var t=(d?d:h.getRoot(b))[j].length==c.length&&k==0;h.initNode(b,a,n,d,t,k==c.length-1,g);h.addNodeCache(b,n)}t=[];n[j]&&n[j].length>0&&(t=i.appendNodes(b,a+1,n[j],n,f,g&&n.open));g&&(i.makeDOMNodeMainBefore(e,b,n),i.makeDOMNodeLine(e,b,n),h.getBeforeA(b,n,e),i.makeDOMNodeNameBefore(e,b,n),h.getInnerBeforeA(b,n,e),i.makeDOMNodeIcon(e,b,n),h.getInnerAfterA(b,n,e),i.makeDOMNodeNameAfter(e,b,n),h.getAfterA(b,n,e),n.isParent&&n.open&&i.makeUlHtml(b,
+n,e,t.join("")),i.makeDOMNodeMainAfter(e,b,n),h.addCreatedNode(b,n))}return e},appendParentULDom:function(b,a){var c=[],d=k(a,b);!d.get(0)&&a.parentTId&&(i.appendParentULDom(b,a.getParentNode()),d=k(a,b));var f=k(a,e.id.UL,b);f.get(0)&&f.remove();f=i.appendNodes(b,a.level+1,a[b.data.key.children],a,!1,!0);i.makeUlHtml(b,a,c,f.join(""));d.append(c.join(""))},asyncNode:function(b,a,c,d){var f,g;if(a&&!a.isParent)return j.apply(d),!1;else if(a&&a.isAjaxing)return!1;else if(j.apply(b.callback.beforeAsync,
+[b.treeId,a],!0)==!1)return j.apply(d),!1;if(a)a.isAjaxing=!0,k(a,e.id.ICON,b).attr({style:"","class":e.className.BUTTON+" "+e.className.ICO_LOADING});var l={};for(f=0,g=b.async.autoParam.length;a&&f<g;f++){var q=b.async.autoParam[f].split("="),o=q;q.length>1&&(o=q[1],q=q[0]);l[o]=a[q]}if(j.isArray(b.async.otherParam))for(f=0,g=b.async.otherParam.length;f<g;f+=2)l[b.async.otherParam[f]]=b.async.otherParam[f+1];else for(var m in b.async.otherParam)l[m]=b.async.otherParam[m];var n=h.getRoot(b)._ver;
+p.ajax({contentType:b.async.contentType,cache:!1,type:b.async.type,url:j.apply(b.async.url,[b.treeId,a],b.async.url),data:l,dataType:b.async.dataType,success:function(f){if(n==h.getRoot(b)._ver){var g=[];try{g=!f||f.length==0?[]:typeof f=="string"?eval("("+f+")"):f}catch(l){g=f}if(a)a.isAjaxing=null,a.zAsync=!0;i.setNodeLineIcos(b,a);g&&g!==""?(g=j.apply(b.async.dataFilter,[b.treeId,a,g],g),i.addNodes(b,a,g?j.clone(g):[],!!c)):i.addNodes(b,a,[],!!c);b.treeObj.trigger(e.event.ASYNC_SUCCESS,[b.treeId,
+a,f]);j.apply(d)}},error:function(c,d,f){if(n==h.getRoot(b)._ver){if(a)a.isAjaxing=null;i.setNodeLineIcos(b,a);b.treeObj.trigger(e.event.ASYNC_ERROR,[b.treeId,a,c,d,f])}}});return!0},cancelPreSelectedNode:function(b,a,c){var d=h.getRoot(b).curSelectedList,f,g;for(f=d.length-1;f>=0;f--)if(g=d[f],a===g||!a&&(!c||c!==g))if(k(g,e.id.A,b).removeClass(e.node.CURSELECTED),a){h.removeSelectedNode(b,a);b.treeObj.trigger(e.event.UNSELECTED,[m,b.treeId,g]);break}else d.splice(f,1),b.treeObj.trigger(e.event.UNSELECTED,
+[m,b.treeId,g])},createNodeCallback:function(b){if(b.callback.onNodeCreated||b.view.addDiyDom)for(var a=h.getRoot(b);a.createdNodes.length>0;){var c=a.createdNodes.shift();j.apply(b.view.addDiyDom,[b.treeId,c]);b.callback.onNodeCreated&&b.treeObj.trigger(e.event.NODECREATED,[b.treeId,c])}},createNodes:function(b,a,c,d){if(c&&c.length!=0){var f=h.getRoot(b),g=b.data.key.children,g=!d||d.open||!!k(d[g][0],b).get(0);f.createdNodes=[];a=i.appendNodes(b,a,c,d,!0,g);d?(d=k(d,e.id.UL,b),d.get(0)&&d.append(a.join(""))):
+b.treeObj.append(a.join(""));i.createNodeCallback(b)}},destroy:function(b){b&&(h.initCache(b),h.initRoot(b),m.unbindTree(b),m.unbindEvent(b),b.treeObj.empty(),delete r[b.treeId])},expandCollapseNode:function(b,a,c,d,f){var g=h.getRoot(b),l=b.data.key.children;if(a){if(g.expandTriggerFlag){var q=f,f=function(){q&&q();a.open?b.treeObj.trigger(e.event.EXPAND,[b.treeId,a]):b.treeObj.trigger(e.event.COLLAPSE,[b.treeId,a])};g.expandTriggerFlag=!1}if(!a.open&&a.isParent&&(!k(a,e.id.UL,b).get(0)||a[l]&&a[l].length>
+0&&!k(a[l][0],b).get(0)))i.appendParentULDom(b,a),i.createNodeCallback(b);if(a.open==c)j.apply(f,[]);else{var c=k(a,e.id.UL,b),g=k(a,e.id.SWITCH,b),o=k(a,e.id.ICON,b);a.isParent?(a.open=!a.open,a.iconOpen&&a.iconClose&&o.attr("style",i.makeNodeIcoStyle(b,a)),a.open?(i.replaceSwitchClass(a,g,e.folder.OPEN),i.replaceIcoClass(a,o,e.folder.OPEN),d==!1||b.view.expandSpeed==""?(c.show(),j.apply(f,[])):a[l]&&a[l].length>0?c.slideDown(b.view.expandSpeed,f):(c.show(),j.apply(f,[]))):(i.replaceSwitchClass(a,
+g,e.folder.CLOSE),i.replaceIcoClass(a,o,e.folder.CLOSE),d==!1||b.view.expandSpeed==""||!(a[l]&&a[l].length>0)?(c.hide(),j.apply(f,[])):c.slideUp(b.view.expandSpeed,f))):j.apply(f,[])}}else j.apply(f,[])},expandCollapseParentNode:function(b,a,c,d,f){a&&(a.parentTId?(i.expandCollapseNode(b,a,c,d),a.parentTId&&i.expandCollapseParentNode(b,a.getParentNode(),c,d,f)):i.expandCollapseNode(b,a,c,d,f))},expandCollapseSonNode:function(b,a,c,d,f){var g=h.getRoot(b),e=b.data.key.children,g=a?a[e]:g[e],e=a?!1:
+d,j=h.getRoot(b).expandTriggerFlag;h.getRoot(b).expandTriggerFlag=!1;if(g)for(var k=0,m=g.length;k<m;k++)g[k]&&i.expandCollapseSonNode(b,g[k],c,e);h.getRoot(b).expandTriggerFlag=j;i.expandCollapseNode(b,a,c,d,f)},isSelectedNode:function(b,a){if(!a)return!1;var c=h.getRoot(b).curSelectedList,d;for(d=c.length-1;d>=0;d--)if(a===c[d])return!0;return!1},makeDOMNodeIcon:function(b,a,c){var d=h.getNodeName(a,c),d=a.view.nameIsHTML?d:d.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");b.push("<span id='",
+c.tId,e.id.ICON,"' title='' treeNode",e.id.ICON," class='",i.makeNodeIcoClass(a,c),"' style='",i.makeNodeIcoStyle(a,c),"'></span><span id='",c.tId,e.id.SPAN,"'>",d,"</span>")},makeDOMNodeLine:function(b,a,c){b.push("<span id='",c.tId,e.id.SWITCH,"' title='' class='",i.makeNodeLineClass(a,c),"' treeNode",e.id.SWITCH,"></span>")},makeDOMNodeMainAfter:function(b){b.push("</li>")},makeDOMNodeMainBefore:function(b,a,c){b.push("<li id='",c.tId,"' class='",e.className.LEVEL,c.level,"' tabindex='0' hidefocus='true' treenode>")},
+makeDOMNodeNameAfter:function(b){b.push("</a>")},makeDOMNodeNameBefore:function(b,a,c){var d=h.getNodeTitle(a,c),f=i.makeNodeUrl(a,c),g=i.makeNodeFontCss(a,c),l=[],k;for(k in g)l.push(k,":",g[k],";");b.push("<a id='",c.tId,e.id.A,"' class='",e.className.LEVEL,c.level,"' treeNode",e.id.A,' onclick="',c.click||"",'" ',f!=null&&f.length>0?"href='"+f+"'":""," target='",i.makeNodeTarget(c),"' style='",l.join(""),"'");j.apply(a.view.showTitle,[a.treeId,c],a.view.showTitle)&&d&&b.push("title='",d.replace(/'/g,
+"'").replace(/</g,"<").replace(/>/g,">"),"'");b.push(">")},makeNodeFontCss:function(b,a){var c=j.apply(b.view.fontCss,[b.treeId,a],b.view.fontCss);return c&&typeof c!="function"?c:{}},makeNodeIcoClass:function(b,a){var c=["ico"];a.isAjaxing||(c[0]=(a.iconSkin?a.iconSkin+"_":"")+c[0],a.isParent?c.push(a.open?e.folder.OPEN:e.folder.CLOSE):c.push(e.folder.DOCU));return e.className.BUTTON+" "+c.join("_")},makeNodeIcoStyle:function(b,a){var c=[];if(!a.isAjaxing){var d=a.isParent&&a.iconOpen&&
+a.iconClose?a.open?a.iconOpen:a.iconClose:a.icon;d&&c.push("background:url(",d,") 0 0 no-repeat;");(b.view.showIcon==!1||!j.apply(b.view.showIcon,[b.treeId,a],!0))&&c.push("width:0px;height:0px;")}return c.join("")},makeNodeLineClass:function(b,a){var c=[];b.view.showLine?a.level==0&&a.isFirstNode&&a.isLastNode?c.push(e.line.ROOT):a.level==0&&a.isFirstNode?c.push(e.line.ROOTS):a.isLastNode?c.push(e.line.BOTTOM):c.push(e.line.CENTER):c.push(e.line.NOLINE);a.isParent?c.push(a.open?e.folder.OPEN:e.folder.CLOSE):
+c.push(e.folder.DOCU);return i.makeNodeLineClassEx(a)+c.join("_")},makeNodeLineClassEx:function(b){return e.className.BUTTON+" "+e.className.LEVEL+b.level+" "+e.className.SWITCH+" "},makeNodeTarget:function(b){return b.target||"_blank"},makeNodeUrl:function(b,a){var c=b.data.key.url;return a[c]?a[c]:null},makeUlHtml:function(b,a,c,d){c.push("<ul id='",a.tId,e.id.UL,"' class='",e.className.LEVEL,a.level," ",i.makeUlLineClass(b,a),"' style='display:",a.open?"block":"none","'>");c.push(d);c.push("</ul>")},
+makeUlLineClass:function(b,a){return b.view.showLine&&!a.isLastNode?e.line.LINE:""},removeChildNodes:function(b,a){if(a){var c=b.data.key.children,d=a[c];if(d){for(var f=0,g=d.length;f<g;f++)h.removeNodeCache(b,d[f]);h.removeSelectedNode(b);delete a[c];b.data.keep.parent?k(a,e.id.UL,b).empty():(a.isParent=!1,a.open=!1,c=k(a,e.id.SWITCH,b),d=k(a,e.id.ICON,b),i.replaceSwitchClass(a,c,e.folder.DOCU),i.replaceIcoClass(a,d,e.folder.DOCU),k(a,e.id.UL,b).remove())}}},setFirstNode:function(b,a){var c=b.data.key.children;
+if(a[c].length>0)a[c][0].isFirstNode=!0},setLastNode:function(b,a){var c=b.data.key.children,d=a[c].length;if(d>0)a[c][d-1].isLastNode=!0},removeNode:function(b,a){var c=h.getRoot(b),d=b.data.key.children,f=a.parentTId?a.getParentNode():c;a.isFirstNode=!1;a.isLastNode=!1;a.getPreNode=function(){return null};a.getNextNode=function(){return null};if(h.getNodeCache(b,a.tId)){k(a,b).remove();h.removeNodeCache(b,a);h.removeSelectedNode(b,a);for(var g=0,l=f[d].length;g<l;g++)if(f[d][g].tId==a.tId){f[d].splice(g,
+1);break}i.setFirstNode(b,f);i.setLastNode(b,f);var j,g=f[d].length;if(!b.data.keep.parent&&g==0)f.isParent=!1,f.open=!1,g=k(f,e.id.UL,b),l=k(f,e.id.SWITCH,b),j=k(f,e.id.ICON,b),i.replaceSwitchClass(f,l,e.folder.DOCU),i.replaceIcoClass(f,j,e.folder.DOCU),g.css("display","none");else if(b.view.showLine&&g>0){var o=f[d][g-1],g=k(o,e.id.UL,b),l=k(o,e.id.SWITCH,b);j=k(o,e.id.ICON,b);f==c?f[d].length==1?i.replaceSwitchClass(o,l,e.line.ROOT):(c=k(f[d][0],e.id.SWITCH,b),i.replaceSwitchClass(f[d][0],c,e.line.ROOTS),
+i.replaceSwitchClass(o,l,e.line.BOTTOM)):i.replaceSwitchClass(o,l,e.line.BOTTOM);g.removeClass(e.line.LINE)}}},replaceIcoClass:function(b,a,c){if(a&&!b.isAjaxing&&(b=a.attr("class"),b!=void 0)){b=b.split("_");switch(c){case e.folder.OPEN:case e.folder.CLOSE:case e.folder.DOCU:b[b.length-1]=c}a.attr("class",b.join("_"))}},replaceSwitchClass:function(b,a,c){if(a){var d=a.attr("class");if(d!=void 0){d=d.split("_");switch(c){case e.line.ROOT:case e.line.ROOTS:case e.line.CENTER:case e.line.BOTTOM:case e.line.NOLINE:d[0]=
+i.makeNodeLineClassEx(b)+c;break;case e.folder.OPEN:case e.folder.CLOSE:case e.folder.DOCU:d[1]=c}a.attr("class",d.join("_"));c!==e.folder.DOCU?a.removeAttr("disabled"):a.attr("disabled","disabled")}}},selectNode:function(b,a,c){c||i.cancelPreSelectedNode(b,null,a);k(a,e.id.A,b).addClass(e.node.CURSELECTED);h.addSelectedNode(b,a);b.treeObj.trigger(e.event.SELECTED,[m,b.treeId,a])},setNodeFontCss:function(b,a){var c=k(a,e.id.A,b),d=i.makeNodeFontCss(b,a);d&&c.css(d)},setNodeLineIcos:function(b,a){if(a){var c=
+k(a,e.id.SWITCH,b),d=k(a,e.id.UL,b),f=k(a,e.id.ICON,b),g=i.makeUlLineClass(b,a);g.length==0?d.removeClass(e.line.LINE):d.addClass(g);c.attr("class",i.makeNodeLineClass(b,a));a.isParent?c.removeAttr("disabled"):c.attr("disabled","disabled");f.removeAttr("style");f.attr("style",i.makeNodeIcoStyle(b,a));f.attr("class",i.makeNodeIcoClass(b,a))}},setNodeName:function(b,a){var c=h.getNodeTitle(b,a),d=k(a,e.id.SPAN,b);d.empty();b.view.nameIsHTML?d.html(h.getNodeName(b,a)):d.text(h.getNodeName(b,a));j.apply(b.view.showTitle,
+[b.treeId,a],b.view.showTitle)&&k(a,e.id.A,b).attr("title",!c?"":c)},setNodeTarget:function(b,a){k(a,e.id.A,b).attr("target",i.makeNodeTarget(a))},setNodeUrl:function(b,a){var c=k(a,e.id.A,b),d=i.makeNodeUrl(b,a);d==null||d.length==0?c.removeAttr("href"):c.attr("href",d)},switchNode:function(b,a){a.open||!j.canAsync(b,a)?i.expandCollapseNode(b,a,!a.open):b.async.enable?i.asyncNode(b,a)||i.expandCollapseNode(b,a,!a.open):a&&i.expandCollapseNode(b,a,!a.open)}};p.fn.zTree={consts:{className:{BUTTON:"button",
+LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch"},event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open",CLOSE:"close",
+DOCU:"docu"},node:{CURSELECTED:"curSelectedNode"}},_z:{tools:j,view:i,event:m,data:h},getZTreeObj:function(b){return(b=h.getZTreeTools(b))?b:null},destroy:function(b){if(b&&b.length>0)i.destroy(h.getSetting(b));else for(var a in r)i.destroy(r[a])},init:function(b,a,c){var d=j.clone(M);p.extend(!0,d,a);d.treeId=b.attr("id");d.treeObj=b;d.treeObj.empty();r[d.treeId]=d;if(typeof document.body.style.maxHeight==="undefined")d.view.expandSpeed="";h.initRoot(d);b=h.getRoot(d);a=d.data.key.children;c=c?j.clone(j.isArray(c)?
+c:[c]):[];b[a]=d.data.simpleData.enable?h.transformTozTreeFormat(d,c):c;h.initCache(d);m.unbindTree(d);m.bindTree(d);m.unbindEvent(d);m.bindEvent(d);c={setting:d,addNodes:function(a,b,c){function e(){i.addNodes(d,a,h,c==!0)}if(!b)return null;a||(a=null);if(a&&!a.isParent&&d.data.keep.leaf)return null;var h=j.clone(j.isArray(b)?b:[b]);j.canAsync(d,a)?i.asyncNode(d,a,c,e):e();return h},cancelSelectedNode:function(a){i.cancelPreSelectedNode(d,a)},destroy:function(){i.destroy(d)},expandAll:function(a){a=
+!!a;i.expandCollapseSonNode(d,null,a,!0);return a},expandNode:function(a,b,c,e,m){if(!a||!a.isParent)return null;b!==!0&&b!==!1&&(b=!a.open);if((m=!!m)&&b&&j.apply(d.callback.beforeExpand,[d.treeId,a],!0)==!1)return null;else if(m&&!b&&j.apply(d.callback.beforeCollapse,[d.treeId,a],!0)==!1)return null;b&&a.parentTId&&i.expandCollapseParentNode(d,a.getParentNode(),b,!1);if(b===a.open&&!c)return null;h.getRoot(d).expandTriggerFlag=m;if(!j.canAsync(d,a)&&c)i.expandCollapseSonNode(d,a,b,!0,function(){if(e!==
+!1)try{k(a,d).focus().blur()}catch(b){}});else if(a.open=!b,i.switchNode(this.setting,a),e!==!1)try{k(a,d).focus().blur()}catch(p){}return b},getNodes:function(){return h.getNodes(d)},getNodeByParam:function(a,b,c){return!a?null:h.getNodeByParam(d,c?c[d.data.key.children]:h.getNodes(d),a,b)},getNodeByTId:function(a){return h.getNodeCache(d,a)},getNodesByParam:function(a,b,c){return!a?null:h.getNodesByParam(d,c?c[d.data.key.children]:h.getNodes(d),a,b)},getNodesByParamFuzzy:function(a,b,c){return!a?
+null:h.getNodesByParamFuzzy(d,c?c[d.data.key.children]:h.getNodes(d),a,b)},getNodesByFilter:function(a,b,c,e){b=!!b;return!a||typeof a!="function"?b?null:[]:h.getNodesByFilter(d,c?c[d.data.key.children]:h.getNodes(d),a,b,e)},getNodeIndex:function(a){if(!a)return null;for(var b=d.data.key.children,c=a.parentTId?a.getParentNode():h.getRoot(d),e=0,i=c[b].length;e<i;e++)if(c[b][e]==a)return e;return-1},getSelectedNodes:function(){for(var a=[],b=h.getRoot(d).curSelectedList,c=0,e=b.length;c<e;c++)a.push(b[c]);
+return a},isSelectedNode:function(a){return h.isSelectedNode(d,a)},reAsyncChildNodes:function(a,b,c){if(this.setting.async.enable){var j=!a;j&&(a=h.getRoot(d));if(b=="refresh"){for(var b=this.setting.data.key.children,m=0,p=a[b]?a[b].length:0;m<p;m++)h.removeNodeCache(d,a[b][m]);h.removeSelectedNode(d);a[b]=[];j?this.setting.treeObj.empty():k(a,e.id.UL,d).empty()}i.asyncNode(this.setting,j?null:a,!!c)}},refresh:function(){this.setting.treeObj.empty();var a=h.getRoot(d),b=a[d.data.key.children];h.initRoot(d);
+a[d.data.key.children]=b;h.initCache(d);i.createNodes(d,0,a[d.data.key.children])},removeChildNodes:function(a){if(!a)return null;var b=a[d.data.key.children];i.removeChildNodes(d,a);return b?b:null},removeNode:function(a,b){a&&(b=!!b,b&&j.apply(d.callback.beforeRemove,[d.treeId,a],!0)==!1||(i.removeNode(d,a),b&&this.setting.treeObj.trigger(e.event.REMOVE,[d.treeId,a])))},selectNode:function(a,b){if(a&&j.uCanDo(d)){b=d.view.selectedMulti&&b;if(a.parentTId)i.expandCollapseParentNode(d,a.getParentNode(),
+!0,!1,function(){try{k(a,d).focus().blur()}catch(b){}});else try{k(a,d).focus().blur()}catch(c){}i.selectNode(d,a,b)}},transformTozTreeNodes:function(a){return h.transformTozTreeFormat(d,a)},transformToArray:function(a){return h.transformToArrayFormat(d,a)},updateNode:function(a){a&&k(a,d).get(0)&&j.uCanDo(d)&&(i.setNodeName(d,a),i.setNodeTarget(d,a),i.setNodeUrl(d,a),i.setNodeLineIcos(d,a),i.setNodeFontCss(d,a))}};b.treeTools=c;h.setZTreeTools(d,c);b[a]&&b[a].length>0?i.createNodes(d,0,b[a]):d.async.enable&&
+d.async.url&&d.async.url!==""&&i.asyncNode(d);return c}};var N=p.fn.zTree,k=j.$,e=N.consts})(jQuery);
+
+/*
+ * JQuery zTree excheck v3.5.18
+ * http://zTree.me/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2015-06-18
+ */
+(function(m){var p,q,r,o={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},v={check:{enable:!1,autoCheckTrigger:!1,chkStyle:o.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:o.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};p=function(c,
+a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=b.data.key.checked;if(k.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;a[d]=!a[d];e.checkNodeRelation(b,a);d=n(a,j.id.CHECK,b);e.setChkClass(b,d,a);e.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(j.event.CHECK,[c,b.treeId,a]);return!0};q=function(c,a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,j.id.CHECK,b);a.check_Focus=!0;e.setChkClass(b,d,a);return!0};r=function(c,a){if(a.chkDisabled===
+!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,j.id.CHECK,b);a.check_Focus=!1;e.setChkClass(b,d,a);return!0};m.extend(!0,m.fn.zTree.consts,o);m.extend(!0,m.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,h,i=c.data.key.children,l=c.data.key.checked;b=j.radio;if(c.check.chkStyle==b.STYLE){var g=f.getRadioCheckedList(c);if(a[l])if(c.check.radioType==b.TYPE_ALL){for(d=g.length-1;d>=0;d--)b=g[d],b[l]&&b!=a&&(b[l]=!1,g.splice(d,1),e.setChkClass(c,n(b,j.id.CHECK,c),b),b.parentTId!=
+a.parentTId&&e.repairParentChkClassWithSelf(c,b));g.push(a)}else{g=a.parentTId?a.getParentNode():f.getRoot(c);for(d=0,h=g[i].length;d<h;d++)b=g[i][d],b[l]&&b!=a&&(b[l]=!1,e.setChkClass(c,n(b,j.id.CHECK,c),b))}else if(c.check.radioType==b.TYPE_ALL)for(d=0,h=g.length;d<h;d++)if(a==g[d]){g.splice(d,1);break}}else a[l]&&(!a[i]||a[i].length==0||c.check.chkboxType.Y.indexOf("s")>-1)&&e.setSonNodeCheckBox(c,a,!0),!a[l]&&(!a[i]||a[i].length==0||c.check.chkboxType.N.indexOf("s")>-1)&&e.setSonNodeCheckBox(c,
+a,!1),a[l]&&c.check.chkboxType.Y.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!0),!a[l]&&c.check.chkboxType.N.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=c.data.key.checked,d=j.checkbox,h=j.radio,i="",i=a.chkDisabled===!0?d.DISABLED:a.halfCheck?d.PART:c.check.chkStyle==h.STYLE?a.check_Child_State<1?d.FULL:d.PART:a[b]?a.check_Child_State===2||a.check_Child_State===-1?d.FULL:d.PART:a.check_Child_State<1?d.FULL:d.PART,b=c.check.chkStyle+"_"+(a[b]?d.TRUE:d.FALSE)+
+"_"+i,b=a.check_Focus&&a.chkDisabled!==!0?b+"_"+d.FOCUS:b;return j.className.BUTTON+" "+d.DEFAULT+" "+b},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===j.checkbox.STYLE)for(var b=c.data.key.checked,d=c.data.key.children,h=f.getRoot(c),i=0,l=h[d].length;i<l;i++){var g=h[d][i];g.nocheck!==!0&&g.chkDisabled!==!0&&(g[b]=a);e.setSonNodeCheckBox(c,g,a)}},repairChkClass:function(c,a){if(a&&(f.makeChkFlag(c,a),a.nocheck!==!0)){var b=n(a,j.id.CHECK,c);e.setChkClass(c,b,a)}},repairParentChkClass:function(c,
+a){if(a&&a.parentTId){var b=a.getParentNode();e.repairChkClass(c,b);e.repairParentChkClass(c,b)}},repairParentChkClassWithSelf:function(c,a){if(a){var b=c.data.key.children;a[b]&&a[b].length>0?e.repairParentChkClass(c,a[b][0]):e.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){var h=c.data.key.children;if(a.chkDisabled!=b)a.chkDisabled=b;e.repairChkClass(c,a);if(a[h]&&d)for(var i=0,l=a[h].length;i<l;i++)e.repairSonChkDisabled(c,a[h][i],b,d)}},repairParentChkDisabled:function(c,
+a,b,d){if(a){if(a.chkDisabled!=b&&d)a.chkDisabled=b;e.repairChkClass(c,a);e.repairParentChkDisabled(c,a.getParentNode(),b,d)}},setChkClass:function(c,a,b){a&&(b.nocheck===!0?a.hide():a.show(),a.attr("class",e.makeChkClass(c,b)))},setParentNodeCheckBox:function(c,a,b,d){var h=c.data.key.children,i=c.data.key.checked,l=n(a,j.id.CHECK,c);d||(d=a);f.makeChkFlag(c,a);a.nocheck!==!0&&a.chkDisabled!==!0&&(a[i]=b,e.setChkClass(c,l,a),c.check.autoCheckTrigger&&a!=d&&c.treeObj.trigger(j.event.CHECK,[null,c.treeId,
+a]));if(a.parentTId){l=!0;if(!b)for(var h=a.getParentNode()[h],g=0,k=h.length;g<k;g++)if(h[g].nocheck!==!0&&h[g].chkDisabled!==!0&&h[g][i]||(h[g].nocheck===!0||h[g].chkDisabled===!0)&&h[g].check_Child_State>0){l=!1;break}l&&e.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var h=c.data.key.children,i=c.data.key.checked,l=n(a,j.id.CHECK,c);d||(d=a);var g=!1;if(a[h])for(var k=0,m=a[h].length;k<m&&a.chkDisabled!==!0;k++){var o=a[h][k];e.setSonNodeCheckBox(c,
+o,b,d);o.chkDisabled===!0&&(g=!0)}if(a!=f.getRoot(c)&&a.chkDisabled!==!0){g&&a.nocheck!==!0&&f.makeChkFlag(c,a);if(a.nocheck!==!0&&a.chkDisabled!==!0){if(a[i]=b,!g)a.check_Child_State=a[h]&&a[h].length>0?b?2:0:-1}else a.check_Child_State=-1;e.setChkClass(c,l,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(j.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=f.getRoot(c).radioCheckedList,b=0,d=a.length;b<d;b++)f.getNodeCache(c,
+a[b].tId)||(a.splice(b,1),b--,d--);return a},getCheckStatus:function(c,a){if(!c.check.enable||a.nocheck||a.chkDisabled)return null;var b=c.data.key.checked;return{checked:a[b],half:a.halfCheck?a.halfCheck:c.check.chkStyle==j.radio.STYLE?a.check_Child_State===2:a[b]?a.check_Child_State>-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var h=c.data.key.children,i=c.data.key.checked,e=b&&c.check.chkStyle==j.radio.STYLE&&c.check.radioType==j.radio.TYPE_ALL,
+d=!d?[]:d,g=0,k=a.length;g<k;g++){if(a[g].nocheck!==!0&&a[g].chkDisabled!==!0&&a[g][i]==b&&(d.push(a[g]),e))break;f.getTreeCheckedNodes(c,a[g][h],b,d);if(e&&d.length>0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var d=c.data.key.children,h=c.data.key.checked,b=!b?[]:b,i=0,e=a.length;i<e;i++)a[i].nocheck!==!0&&a[i].chkDisabled!==!0&&a[i][h]!=a[i].checkedOld&&b.push(a[i]),f.getTreeChangeCheckedNodes(c,a[i][d],b);return b},makeChkFlag:function(c,a){if(a){var b=c.data.key.children,
+d=c.data.key.checked,h=-1;if(a[b])for(var i=0,e=a[b].length;i<e;i++){var g=a[b][i],f=-1;if(c.check.chkStyle==j.radio.STYLE)if(f=g.nocheck===!0||g.chkDisabled===!0?g.check_Child_State:g.halfCheck===!0?2:g[d]?2:g.check_Child_State>0?2:0,f==2){h=2;break}else f==0&&(h=0);else if(c.check.chkStyle==j.checkbox.STYLE)if(f=g.nocheck===!0||g.chkDisabled===!0?g.check_Child_State:g.halfCheck===!0?1:g[d]?g.check_Child_State===-1||g.check_Child_State===2?2:1:g.check_Child_State>0?1:0,f===1){h=1;break}else if(f===
+2&&h>-1&&i>0&&f!==h){h=1;break}else if(h===2&&f>-1&&f<2){h=1;break}else f>-1&&(h=f)}a.check_Child_State=h}}}});var m=m.fn.zTree,k=m._z.tools,j=m.consts,e=m._z.view,f=m._z.data,n=k.$;f.exSetting(v);f.addInitBind(function(c){c.treeObj.bind(j.event.CHECK,function(a,b,d,h){a.srcEvent=b;k.apply(c.callback.onCheck,[a,d,h])})});f.addInitUnBind(function(c){c.treeObj.unbind(j.event.CHECK)});f.addInitCache(function(){});f.addInitNode(function(c,a,b,d){if(b){a=c.data.key.checked;typeof b[a]=="string"&&(b[a]=
+k.eqs(b[a],"true"));b[a]=!!b[a];b.checkedOld=b[a];if(typeof b.nocheck=="string")b.nocheck=k.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=k.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=k.eqs(b.halfCheck,"true");b.halfCheck=!!b.halfCheck;b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return f.getCheckStatus(c,
+b)};c.check.chkStyle==j.radio.STYLE&&c.check.radioType==j.radio.TYPE_ALL&&b[a]&&f.getRoot(c).radioCheckedList.push(b)}});f.addInitProxy(function(c){var a=c.target,b=f.getSetting(c.data.treeId),d="",h=null,e="",l=null;if(k.eqs(c.type,"mouseover")){if(b.check.enable&&k.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+j.id.CHECK)!==null)d=k.getNodeMainDom(a).id,e="mouseoverCheck"}else if(k.eqs(c.type,"mouseout")){if(b.check.enable&&k.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+j.id.CHECK)!==null)d=
+k.getNodeMainDom(a).id,e="mouseoutCheck"}else if(k.eqs(c.type,"click")&&b.check.enable&&k.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+j.id.CHECK)!==null)d=k.getNodeMainDom(a).id,e="checkNode";if(d.length>0)switch(h=f.getNodeCache(b,d),e){case "checkNode":l=p;break;case "mouseoverCheck":l=q;break;case "mouseoutCheck":l=r}return{stop:e==="checkNode",node:h,nodeEventType:e,nodeEventCallback:l,treeEventType:"",treeEventCallback:null}},!0);f.addInitRoot(function(c){f.getRoot(c).radioCheckedList=[]});
+f.addBeforeA(function(c,a,b){c.check.enable&&(f.makeChkFlag(c,a),b.push("<span ID='",a.tId,j.id.CHECK,"' class='",e.makeChkClass(c,a),"' treeNode",j.id.CHECK,a.nocheck===!0?" style='display:none;'":"","></span>"))});f.addZTreeTools(function(c,a){a.checkNode=function(a,b,c,f){var g=this.setting.data.key.checked;if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!a[g]),f=!!f,(a[g]!==b||c)&&!(f&&k.apply(this.setting.callback.beforeCheck,[this.setting.treeId,a],!0)==!1)&&k.uCanDo(this.setting)&&this.setting.check.enable&&
+a.nocheck!==!0))a[g]=b,b=n(a,j.id.CHECK,this.setting),(c||this.setting.check.chkStyle===j.radio.STYLE)&&e.checkNodeRelation(this.setting,a),e.setChkClass(this.setting,b,a),e.repairParentChkClassWithSelf(this.setting,a),f&&this.setting.treeObj.trigger(j.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){e.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var b=this.setting.data.key.children;return f.getTreeCheckedNodes(this.setting,f.getRoot(this.setting)[b],a!==!1)};
+a.getChangeCheckedNodes=function(){var a=this.setting.data.key.children;return f.getTreeChangeCheckedNodes(this.setting,f.getRoot(this.setting)[a])};a.setChkDisabled=function(a,b,c,f){b=!!b;c=!!c;e.repairSonChkDisabled(this.setting,a,b,!!f);e.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,f){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&n(c,this.setting).get(0)&&k.uCanDo(this.setting)){var i=n(c,j.id.CHECK,this.setting);(f==!0||this.setting.check.chkStyle===
+j.radio.STYLE)&&e.checkNodeRelation(this.setting,c);e.setChkClass(this.setting,i,c);e.repairParentChkClassWithSelf(this.setting,c)}}});var s=e.createNodes;e.createNodes=function(c,a,b,d){s&&s.apply(e,arguments);b&&e.repairParentChkClassWithSelf(c,d)};var t=e.removeNode;e.removeNode=function(c,a){var b=a.getParentNode();t&&t.apply(e,arguments);a&&b&&(e.repairChkClass(c,b),e.repairParentChkClass(c,b))};var u=e.appendNodes;e.appendNodes=function(c,a,b,d,h,i){var j="";u&&(j=u.apply(e,arguments));d&&f.makeChkFlag(c,
+d);return j}})(jQuery);
+
+/*
+ * JQuery zTree exedit v3.5.18
+ * http://zTree.me/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2015-06-18
+ */
+(function(w){var I={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},x={onHoverOverNode:function(b,a){var c=m.getSetting(b.data.treeId),d=m.getRoot(c);if(d.curHoverNode!=a)x.onHoverOutNode(b);d.curHoverNode=a;f.addHoverDom(c,a)},onHoverOutNode:function(b){var b=
+m.getSetting(b.data.treeId),a=m.getRoot(b);if(a.curHoverNode&&!m.isSelectedNode(b,a.curHoverNode))f.removeTreeDom(b,a.curHoverNode),a.curHoverNode=null},onMousedownNode:function(b,a){function c(b){if(C.dragFlag==0&&Math.abs(N-b.clientX)<e.edit.drag.minMoveSize&&Math.abs(O-b.clientY)<e.edit.drag.minMoveSize)return!0;var a,c,n,k,i;i=e.data.key.children;M.css("cursor","pointer");if(C.dragFlag==0){if(g.apply(e.callback.beforeDrag,[e.treeId,l],!0)==!1)return r(b),!0;for(a=0,c=l.length;a<c;a++){if(a==0)C.dragNodeShowBefore=
+[];n=l[a];n.isParent&&n.open?(f.expandCollapseNode(e,n,!n.open),C.dragNodeShowBefore[n.tId]=!0):C.dragNodeShowBefore[n.tId]=!1}C.dragFlag=1;t.showHoverDom=!1;g.showIfameMask(e,!0);n=!0;k=-1;if(l.length>1){var j=l[0].parentTId?l[0].getParentNode()[i]:m.getNodes(e);i=[];for(a=0,c=j.length;a<c;a++)if(C.dragNodeShowBefore[j[a].tId]!==void 0&&(n&&k>-1&&k+1!==a&&(n=!1),i.push(j[a]),k=a),l.length===i.length){l=i;break}}n&&(H=l[0].getPreNode(),R=l[l.length-1].getNextNode());D=o("<ul class='zTreeDragUL'></ul>",
+e);for(a=0,c=l.length;a<c;a++)n=l[a],n.editNameFlag=!1,f.selectNode(e,n,a>0),f.removeTreeDom(e,n),a>e.edit.drag.maxShowNodeNum-1||(k=o("<li id='"+n.tId+"_tmp'></li>",e),k.append(o(n,d.id.A,e).clone()),k.css("padding","0"),k.children("#"+n.tId+d.id.A).removeClass(d.node.CURSELECTED),D.append(k),a==e.edit.drag.maxShowNodeNum-1&&(k=o("<li id='"+n.tId+"_moretmp'><a> ... </a></li>",e),D.append(k)));D.attr("id",l[0].tId+d.id.UL+"_tmp");D.addClass(e.treeObj.attr("class"));D.appendTo(M);B=o("<span class='tmpzTreeMove_arrow'></span>",
+e);B.attr("id","zTreeMove_arrow_tmp");B.appendTo(M);e.treeObj.trigger(d.event.DRAG,[b,e.treeId,l])}if(C.dragFlag==1){s&&B.attr("id")==b.target.id&&u&&b.clientX+F.scrollLeft()+2>w("#"+u+d.id.A,s).offset().left?(n=w("#"+u+d.id.A,s),b.target=n.length>0?n.get(0):b.target):s&&(s.removeClass(d.node.TMPTARGET_TREE),u&&w("#"+u+d.id.A,s).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));
+u=s=null;J=!1;h=e;n=m.getSettings();for(var y in n)if(n[y].treeId&&n[y].edit.enable&&n[y].treeId!=e.treeId&&(b.target.id==n[y].treeId||w(b.target).parents("#"+n[y].treeId).length>0))J=!0,h=n[y];y=F.scrollTop();k=F.scrollLeft();i=h.treeObj.offset();a=h.treeObj.get(0).scrollHeight;n=h.treeObj.get(0).scrollWidth;c=b.clientY+y-i.top;var p=h.treeObj.height()+i.top-b.clientY-y,q=b.clientX+k-i.left,x=h.treeObj.width()+i.left-b.clientX-k;i=c<e.edit.drag.borderMax&&c>e.edit.drag.borderMin;var j=p<e.edit.drag.borderMax&&
+p>e.edit.drag.borderMin,K=q<e.edit.drag.borderMax&&q>e.edit.drag.borderMin,G=x<e.edit.drag.borderMax&&x>e.edit.drag.borderMin,p=c>e.edit.drag.borderMin&&p>e.edit.drag.borderMin&&q>e.edit.drag.borderMin&&x>e.edit.drag.borderMin,q=i&&h.treeObj.scrollTop()<=0,x=j&&h.treeObj.scrollTop()+h.treeObj.height()+10>=a,P=K&&h.treeObj.scrollLeft()<=0,Q=G&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=n;if(b.target&&g.isChildOrSelf(b.target,h.treeId)){for(var E=b.target;E&&E.tagName&&!g.eqs(E.tagName,"li")&&E.id!=
+h.treeId;)E=E.parentNode;var S=!0;for(a=0,c=l.length;a<c;a++)if(n=l[a],E.id===n.tId){S=!1;break}else if(o(n,e).find("#"+E.id).length>0){S=!1;break}if(S&&b.target&&g.isChildOrSelf(b.target,E.id+d.id.A))s=w(E),u=E.id}n=l[0];if(p&&g.isChildOrSelf(b.target,h.treeId)){if(!s&&(b.target.id==h.treeId||q||x||P||Q)&&(J||!J&&n.parentTId))s=h.treeObj;i?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):j&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);K?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):G&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+
+10);s&&s!=h.treeObj&&s.offset().left<h.treeObj.offset().left&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+s.offset().left-h.treeObj.offset().left)}D.css({top:b.clientY+y+3+"px",left:b.clientX+k+3+"px"});i=a=0;if(s&&s.attr("id")!=h.treeId){var z=u==null?null:m.getNodeCache(h,u);c=(b.ctrlKey||b.metaKey)&&e.edit.drag.isMove&&e.edit.drag.isCopy||!e.edit.drag.isMove&&e.edit.drag.isCopy;a=!!(H&&u===H.tId);i=!!(R&&u===R.tId);k=n.parentTId&&n.parentTId==u;n=(c||!i)&&g.apply(h.edit.drag.prev,[h.treeId,l,z],
+!!h.edit.drag.prev);a=(c||!a)&&g.apply(h.edit.drag.next,[h.treeId,l,z],!!h.edit.drag.next);G=(c||!k)&&!(h.data.keep.leaf&&!z.isParent)&&g.apply(h.edit.drag.inner,[h.treeId,l,z],!!h.edit.drag.inner);if(!n&&!a&&!G){if(s=null,u="",v=d.move.TYPE_INNER,B.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null}else{c=w("#"+u+d.id.A,s);i=z.isLastNode?null:w("#"+z.getNextNode().tId+d.id.A,s.next());j=c.offset().top;k=c.offset().left;K=n?G?0.25:a?
+0.5:1:-1;G=a?G?0.75:n?0.5:0:-1;y=(b.clientY+y-j)/c.height();(K==1||y<=K&&y>=-0.2)&&n?(a=1-B.width(),i=j-B.height()/2,v=d.move.TYPE_PREV):(G==0||y>=G&&y<=1.2)&&a?(a=1-B.width(),i=i==null||z.isParent&&z.open?j+c.height()-B.height()/2:i.offset().top-B.height()/2,v=d.move.TYPE_NEXT):(a=5-B.width(),i=j,v=d.move.TYPE_INNER);B.css({display:"block",top:i+"px",left:k+a+"px"});c.addClass(d.node.TMPTARGET_NODE+"_"+v);if(T!=u||U!=v)L=(new Date).getTime();if(z&&z.isParent&&v==d.move.TYPE_INNER&&(y=!0,window.zTreeMoveTimer&&
+window.zTreeMoveTargetNodeTId!==z.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===z.tId&&(y=!1),y))window.zTreeMoveTimer=setTimeout(function(){v==d.move.TYPE_INNER&&z&&z.isParent&&!z.open&&(new Date).getTime()-L>h.edit.drag.autoOpenTime&&g.apply(h.callback.beforeDragOpen,[h.treeId,z],!0)&&(f.switchNode(h,z),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND,[h.treeId,z]))},h.edit.drag.autoOpenTime+50),
+window.zTreeMoveTargetNodeTId=z.tId}}else if(v=d.move.TYPE_INNER,s&&g.apply(h.edit.drag.inner,[h.treeId,l,null],!!h.edit.drag.inner)?s.addClass(d.node.TMPTARGET_TREE):s=null,B.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;T=u;U=v;e.treeObj.trigger(d.event.DRAGMOVE,[b,e.treeId,l])}return!1}function r(b){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;U=T=null;F.unbind("mousemove",c);
+F.unbind("mouseup",r);F.unbind("selectstart",k);M.css("cursor","auto");s&&(s.removeClass(d.node.TMPTARGET_TREE),u&&w("#"+u+d.id.A,s).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));g.showIfameMask(e,!1);t.showHoverDom=!0;if(C.dragFlag!=0){C.dragFlag=0;var a,i,j;for(a=0,i=l.length;a<i;a++)j=l[a],j.isParent&&C.dragNodeShowBefore[j.tId]&&!j.open&&(f.expandCollapseNode(e,j,!j.open),
+delete C.dragNodeShowBefore[j.tId]);D&&D.remove();B&&B.remove();var p=(b.ctrlKey||b.metaKey)&&e.edit.drag.isMove&&e.edit.drag.isCopy||!e.edit.drag.isMove&&e.edit.drag.isCopy;!p&&s&&u&&l[0].parentTId&&u==l[0].parentTId&&v==d.move.TYPE_INNER&&(s=null);if(s){var q=u==null?null:m.getNodeCache(h,u);if(g.apply(e.callback.beforeDrop,[h.treeId,l,q,v,p],!0)==!1)f.selectNodes(x,l);else{var A=p?g.clone(l):l;a=function(){if(J){if(!p)for(var a=0,c=l.length;a<c;a++)f.removeNode(e,l[a]);if(v==d.move.TYPE_INNER)f.addNodes(h,
+q,A);else if(f.addNodes(h,q.getParentNode(),A),v==d.move.TYPE_PREV)for(a=0,c=A.length;a<c;a++)f.moveNode(h,q,A[a],v,!1);else for(a=-1,c=A.length-1;a<c;c--)f.moveNode(h,q,A[c],v,!1)}else if(p&&v==d.move.TYPE_INNER)f.addNodes(h,q,A);else if(p&&f.addNodes(h,q.getParentNode(),A),v!=d.move.TYPE_NEXT)for(a=0,c=A.length;a<c;a++)f.moveNode(h,q,A[a],v,!1);else for(a=-1,c=A.length-1;a<c;c--)f.moveNode(h,q,A[c],v,!1);f.selectNodes(h,A);o(A[0],e).focus().blur();e.treeObj.trigger(d.event.DROP,[b,h.treeId,A,q,
+v,p])};v==d.move.TYPE_INNER&&g.canAsync(h,q)?f.asyncNode(h,q,!1,a):a()}}else f.selectNodes(x,l),e.treeObj.trigger(d.event.DROP,[b,e.treeId,l,null,null,null])}}function k(){return!1}var i,j,e=m.getSetting(b.data.treeId),C=m.getRoot(e),t=m.getRoots();if(b.button==2||!e.edit.enable||!e.edit.drag.isCopy&&!e.edit.drag.isMove)return!0;var p=b.target,q=m.getRoot(e).curSelectedList,l=[];if(m.isSelectedNode(e,a))for(i=0,j=q.length;i<j;i++){if(q[i].editNameFlag&&g.eqs(p.tagName,"input")&&p.getAttribute("treeNode"+
+d.id.INPUT)!==null)return!0;l.push(q[i]);if(l[0].parentTId!==q[i].parentTId){l=[a];break}}else l=[a];f.editNodeBlur=!0;f.cancelCurEditNode(e);var F=w(e.treeObj.get(0).ownerDocument),M=w(e.treeObj.get(0).ownerDocument.body),D,B,s,J=!1,h=e,x=e,H,R,T=null,U=null,u=null,v=d.move.TYPE_INNER,N=b.clientX,O=b.clientY,L=(new Date).getTime();g.uCanDo(e)&&F.bind("mousemove",c);F.bind("mouseup",r);F.bind("selectstart",k);b.preventDefault&&b.preventDefault();return!0}};w.extend(!0,w.fn.zTree.consts,I);w.extend(!0,
+w.fn.zTree._z,{tools:{getAbs:function(b){b=b.getBoundingClientRect();return[b.left+(document.body.scrollLeft+document.documentElement.scrollLeft),b.top+(document.body.scrollTop+document.documentElement.scrollTop)]},inputFocus:function(b){b.get(0)&&(b.focus(),g.setCursorPosition(b.get(0),b.val().length))},inputSelect:function(b){b.get(0)&&(b.focus(),b.select())},setCursorPosition:function(b,a){if(b.setSelectionRange)b.focus(),b.setSelectionRange(a,a);else if(b.createTextRange){var c=b.createTextRange();
+c.collapse(!0);c.moveEnd("character",a);c.moveStart("character",a);c.select()}},showIfameMask:function(b,a){for(var c=m.getRoot(b);c.dragMaskList.length>0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(a)for(var d=o("iframe",b),f=0,i=d.length;f<i;f++){var j=d.get(f),e=g.getAbs(j),j=o("<div id='zTreeMask_"+f+"' class='zTreeMask' style='top:"+e[1]+"px; left:"+e[0]+"px; width:"+j.offsetWidth+"px; height:"+j.offsetHeight+"px;'></div>",b);j.appendTo(o("body",b));c.dragMaskList.push(j)}}},view:{addEditBtn:function(b,
+a){if(!(a.editNameFlag||o(a,d.id.EDIT,b).length>0)&&g.apply(b.edit.showRenameBtn,[b.treeId,a],b.edit.showRenameBtn)){var c=o(a,d.id.A,b),r="<span class='"+d.className.BUTTON+" edit' id='"+a.tId+d.id.EDIT+"' title='"+g.apply(b.edit.renameTitle,[b.treeId,a],b.edit.renameTitle)+"' treeNode"+d.id.EDIT+" style='display:none;'></span>";c.append(r);o(a,d.id.EDIT,b).bind("click",function(){if(!g.uCanDo(b)||g.apply(b.callback.beforeEditName,[b.treeId,a],!0)==!1)return!1;f.editNode(b,a);return!1}).show()}},
+addRemoveBtn:function(b,a){if(!(a.editNameFlag||o(a,d.id.REMOVE,b).length>0)&&g.apply(b.edit.showRemoveBtn,[b.treeId,a],b.edit.showRemoveBtn)){var c=o(a,d.id.A,b),r="<span class='"+d.className.BUTTON+" remove' id='"+a.tId+d.id.REMOVE+"' title='"+g.apply(b.edit.removeTitle,[b.treeId,a],b.edit.removeTitle)+"' treeNode"+d.id.REMOVE+" style='display:none;'></span>";c.append(r);o(a,d.id.REMOVE,b).bind("click",function(){if(!g.uCanDo(b)||g.apply(b.callback.beforeRemove,[b.treeId,a],!0)==!1)return!1;f.removeNode(b,
+a);b.treeObj.trigger(d.event.REMOVE,[b.treeId,a]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(b,a){if(m.getRoots().showHoverDom)a.isHover=!0,b.edit.enable&&(f.addEditBtn(b,a),f.addRemoveBtn(b,a)),g.apply(b.view.addHoverDom,[b.treeId,a])},cancelCurEditNode:function(b,a,c){var r=m.getRoot(b),k=b.data.key.name,i=r.curEditNode;if(i){var j=r.curEditInput,a=a?a:c?i[k]:j.val();if(g.apply(b.callback.beforeRename,[b.treeId,i,a,c],!0)===!1)return!1;i[k]=a;o(i,d.id.A,b).removeClass(d.node.CURSELECTED_EDIT);
+j.unbind();f.setNodeName(b,i);i.editNameFlag=!1;r.curEditNode=null;r.curEditInput=null;f.selectNode(b,i,!1);b.treeObj.trigger(d.event.RENAME,[b.treeId,i,c])}return r.noSelection=!0},editNode:function(b,a){var c=m.getRoot(b);f.editNodeBlur=!1;if(m.isSelectedNode(b,a)&&c.curEditNode==a&&a.editNameFlag)setTimeout(function(){g.inputFocus(c.curEditInput)},0);else{var r=b.data.key.name;a.editNameFlag=!0;f.removeTreeDom(b,a);f.cancelCurEditNode(b);f.selectNode(b,a,!1);o(a,d.id.SPAN,b).html("<input type=text class='rename' id='"+
+a.tId+d.id.INPUT+"' treeNode"+d.id.INPUT+" >");var k=o(a,d.id.INPUT,b);k.attr("value",a[r]);b.edit.editNameSelectAll?g.inputSelect(k):g.inputFocus(k);k.bind("blur",function(){f.editNodeBlur||f.cancelCurEditNode(b)}).bind("keydown",function(a){a.keyCode=="13"?(f.editNodeBlur=!0,f.cancelCurEditNode(b)):a.keyCode=="27"&&f.cancelCurEditNode(b,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});o(a,d.id.A,b).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=k;c.noSelection=
+!1;c.curEditNode=a}},moveNode:function(b,a,c,r,k,i){var j=m.getRoot(b),e=b.data.key.children;if(a!=c&&(!b.data.keep.leaf||!a||a.isParent||r!=d.move.TYPE_INNER)){var g=c.parentTId?c.getParentNode():j,t=a===null||a==j;t&&a===null&&(a=j);if(t)r=d.move.TYPE_INNER;j=a.parentTId?a.getParentNode():j;if(r!=d.move.TYPE_PREV&&r!=d.move.TYPE_NEXT)r=d.move.TYPE_INNER;if(r==d.move.TYPE_INNER)if(t)c.parentTId=null;else{if(!a.isParent)a.isParent=!0,a.open=!!a.open,f.setNodeLineIcos(b,a);c.parentTId=a.tId}var p;
+t?p=t=b.treeObj:(!i&&r==d.move.TYPE_INNER?f.expandCollapseNode(b,a,!0,!1):i||f.expandCollapseNode(b,a.getParentNode(),!0,!1),t=o(a,b),p=o(a,d.id.UL,b),t.get(0)&&!p.get(0)&&(p=[],f.makeUlHtml(b,a,p,""),t.append(p.join(""))),p=o(a,d.id.UL,b));var q=o(c,b);q.get(0)?t.get(0)||q.remove():q=f.appendNodes(b,c.level,[c],null,!1,!0).join("");p.get(0)&&r==d.move.TYPE_INNER?p.append(q):t.get(0)&&r==d.move.TYPE_PREV?t.before(q):t.get(0)&&r==d.move.TYPE_NEXT&&t.after(q);var l=-1,w=0,x=null,t=null,D=c.level;if(c.isFirstNode){if(l=
+0,g[e].length>1)x=g[e][1],x.isFirstNode=!0}else if(c.isLastNode)l=g[e].length-1,x=g[e][l-1],x.isLastNode=!0;else for(p=0,q=g[e].length;p<q;p++)if(g[e][p].tId==c.tId){l=p;break}l>=0&&g[e].splice(l,1);if(r!=d.move.TYPE_INNER)for(p=0,q=j[e].length;p<q;p++)j[e][p].tId==a.tId&&(w=p);if(r==d.move.TYPE_INNER){a[e]||(a[e]=[]);if(a[e].length>0)t=a[e][a[e].length-1],t.isLastNode=!1;a[e].splice(a[e].length,0,c);c.isLastNode=!0;c.isFirstNode=a[e].length==1}else a.isFirstNode&&r==d.move.TYPE_PREV?(j[e].splice(w,
+0,c),t=a,t.isFirstNode=!1,c.parentTId=a.parentTId,c.isFirstNode=!0,c.isLastNode=!1):a.isLastNode&&r==d.move.TYPE_NEXT?(j[e].splice(w+1,0,c),t=a,t.isLastNode=!1,c.parentTId=a.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(r==d.move.TYPE_PREV?j[e].splice(w,0,c):j[e].splice(w+1,0,c),c.parentTId=a.parentTId,c.isFirstNode=!1,c.isLastNode=!1);m.fixPIdKeyValue(b,c);m.setSonNodeLevel(b,c.getParentNode(),c);f.setNodeLineIcos(b,c);f.repairNodeLevelClass(b,c,D);!b.data.keep.parent&&g[e].length<1?(g.isParent=!1,
+g.open=!1,a=o(g,d.id.UL,b),r=o(g,d.id.SWITCH,b),e=o(g,d.id.ICON,b),f.replaceSwitchClass(g,r,d.folder.DOCU),f.replaceIcoClass(g,e,d.folder.DOCU),a.css("display","none")):x&&f.setNodeLineIcos(b,x);t&&f.setNodeLineIcos(b,t);b.check&&b.check.enable&&f.repairChkClass&&(f.repairChkClass(b,g),f.repairParentChkClassWithSelf(b,g),g!=c.parent&&f.repairParentChkClassWithSelf(b,c));i||f.expandCollapseParentNode(b,c.getParentNode(),!0,k)}},removeEditBtn:function(b,a){o(a,d.id.EDIT,b).unbind().remove()},removeRemoveBtn:function(b,
+a){o(a,d.id.REMOVE,b).unbind().remove()},removeTreeDom:function(b,a){a.isHover=!1;f.removeEditBtn(b,a);f.removeRemoveBtn(b,a);g.apply(b.view.removeHoverDom,[b.treeId,a])},repairNodeLevelClass:function(b,a,c){if(c!==a.level){var f=o(a,b),g=o(a,d.id.A,b),b=o(a,d.id.UL,b),c=d.className.LEVEL+c,a=d.className.LEVEL+a.level;f.removeClass(c);f.addClass(a);g.removeClass(c);g.addClass(a);b.removeClass(c);b.addClass(a)}},selectNodes:function(b,a){for(var c=0,d=a.length;c<d;c++)f.selectNode(b,a[c],c>0)}},event:{},
+data:{setSonNodeLevel:function(b,a,c){if(c){var d=b.data.key.children;c.level=a?a.level+1:0;if(c[d])for(var a=0,f=c[d].length;a<f;a++)c[d][a]&&m.setSonNodeLevel(b,c,c[d][a])}}}});var H=w.fn.zTree,g=H._z.tools,d=H.consts,f=H._z.view,m=H._z.data,o=g.$;m.exSetting({edit:{enable:!1,editNameSelectAll:!1,showRemoveBtn:!0,showRenameBtn:!0,removeTitle:"remove",renameTitle:"rename",drag:{autoExpandTrigger:!1,isCopy:!0,isMove:!0,prev:!0,next:!0,inner:!0,minMoveSize:5,borderMax:10,borderMin:-5,maxShowNodeNum:5,
+autoOpenTime:500}},view:{addHoverDom:null,removeHoverDom:null},callback:{beforeDrag:null,beforeDragOpen:null,beforeDrop:null,beforeEditName:null,beforeRename:null,onDrag:null,onDragMove:null,onDrop:null,onRename:null}});m.addInitBind(function(b){var a=b.treeObj,c=d.event;a.bind(c.RENAME,function(a,c,d,f){g.apply(b.callback.onRename,[a,c,d,f])});a.bind(c.DRAG,function(a,c,d,f){g.apply(b.callback.onDrag,[c,d,f])});a.bind(c.DRAGMOVE,function(a,c,d,f){g.apply(b.callback.onDragMove,[c,d,f])});a.bind(c.DROP,
+function(a,c,d,f,e,m,o){g.apply(b.callback.onDrop,[c,d,f,e,m,o])})});m.addInitUnBind(function(b){var b=b.treeObj,a=d.event;b.unbind(a.RENAME);b.unbind(a.DRAG);b.unbind(a.DRAGMOVE);b.unbind(a.DROP)});m.addInitCache(function(){});m.addInitNode(function(b,a,c){if(c)c.isHover=!1,c.editNameFlag=!1});m.addInitProxy(function(b){var a=b.target,c=m.getSetting(b.data.treeId),f=b.relatedTarget,k="",i=null,j="",e=null,o=null;if(g.eqs(b.type,"mouseover")){if(o=g.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+d.id.A}]))k=
+g.getNodeMainDom(o).id,j="hoverOverNode"}else if(g.eqs(b.type,"mouseout"))o=g.getMDom(c,f,[{tagName:"a",attrName:"treeNode"+d.id.A}]),o||(k="remove",j="hoverOutNode");else if(g.eqs(b.type,"mousedown")&&(o=g.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+d.id.A}])))k=g.getNodeMainDom(o).id,j="mousedownNode";if(k.length>0)switch(i=m.getNodeCache(c,k),j){case "mousedownNode":e=x.onMousedownNode;break;case "hoverOverNode":e=x.onHoverOverNode;break;case "hoverOutNode":e=x.onHoverOutNode}return{stop:!1,
+node:i,nodeEventType:j,nodeEventCallback:e,treeEventType:"",treeEventCallback:null}});m.addInitRoot(function(b){var b=m.getRoot(b),a=m.getRoots();b.curEditNode=null;b.curEditInput=null;b.curHoverNode=null;b.dragFlag=0;b.dragNodeShowBefore=[];b.dragMaskList=[];a.showHoverDom=!0});m.addZTreeTools(function(b,a){a.cancelEditName=function(a){m.getRoot(this.setting).curEditNode&&f.cancelCurEditNode(this.setting,a?a:null,!0)};a.copyNode=function(a,b,k,i){if(!b)return null;if(a&&!a.isParent&&this.setting.data.keep.leaf&&
+k===d.move.TYPE_INNER)return null;var j=this,e=g.clone(b);if(!a)a=null,k=d.move.TYPE_INNER;k==d.move.TYPE_INNER?(b=function(){f.addNodes(j.setting,a,[e],i)},g.canAsync(this.setting,a)?f.asyncNode(this.setting,a,i,b):b()):(f.addNodes(this.setting,a.parentNode,[e],i),f.moveNode(this.setting,a,e,k,!1,i));return e};a.editName=function(a){a&&a.tId&&a===m.getNodeCache(this.setting,a.tId)&&(a.parentTId&&f.expandCollapseParentNode(this.setting,a.getParentNode(),!0),f.editNode(this.setting,a))};a.moveNode=
+function(a,b,k,i){function j(){f.moveNode(e.setting,a,b,k,!1,i)}if(!b)return b;if(a&&!a.isParent&&this.setting.data.keep.leaf&&k===d.move.TYPE_INNER)return null;else if(a&&(b.parentTId==a.tId&&k==d.move.TYPE_INNER||o(b,this.setting).find("#"+a.tId).length>0))return null;else a||(a=null);var e=this;g.canAsync(this.setting,a)&&k===d.move.TYPE_INNER?f.asyncNode(this.setting,a,i,j):j();return b};a.setEditable=function(a){this.setting.edit.enable=a;return this.refresh()}});var N=f.cancelPreSelectedNode;
+f.cancelPreSelectedNode=function(b,a){for(var c=m.getRoot(b).curSelectedList,d=0,g=c.length;d<g;d++)if(!a||a===c[d])if(f.removeTreeDom(b,c[d]),a)break;N&&N.apply(f,arguments)};var O=f.createNodes;f.createNodes=function(b,a,c,d){O&&O.apply(f,arguments);c&&f.repairParentChkClassWithSelf&&f.repairParentChkClassWithSelf(b,d)};var V=f.makeNodeUrl;f.makeNodeUrl=function(b,a){return b.edit.enable?null:V.apply(f,arguments)};var L=f.removeNode;f.removeNode=function(b,a){var c=m.getRoot(b);if(c.curEditNode===
+a)c.curEditNode=null;L&&L.apply(f,arguments)};var P=f.selectNode;f.selectNode=function(b,a,c){var d=m.getRoot(b);if(m.isSelectedNode(b,a)&&d.curEditNode==a&&a.editNameFlag)return!1;P&&P.apply(f,arguments);f.addHoverDom(b,a);return!0};var Q=g.uCanDo;g.uCanDo=function(b,a){var c=m.getRoot(b);if(a&&(g.eqs(a.type,"mouseover")||g.eqs(a.type,"mouseout")||g.eqs(a.type,"mousedown")||g.eqs(a.type,"mouseup")))return!0;if(c.curEditNode)f.editNodeBlur=!1,c.curEditInput.focus();return!c.curEditNode&&(Q?Q.apply(f,
+arguments):!0)}})(jQuery);
+
diff --git a/payapi/src/main/resources/templates/error/403.html b/payapi/src/main/resources/templates/error/403.html
new file mode 100755
index 0000000..a3843f7
--- /dev/null
+++ b/payapi/src/main/resources/templates/error/403.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" >
+<head>
+ <meta charset="utf-8">
+ <title>403 无权限</title>
+ <meta name="renderer" content="webkit">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+ <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}" media="all"/>
+ <link rel="stylesheet" th:href="@{/static/custom/css/admin.css}" media="all"/>
+</head>
+<body>
+<div class="layui-fluid">
+ <div class="layadmin-tips">
+ <i class="layui-icon" face></i>
+ <div class="layui-text">
+ <p>没有权限</p>
+ <h1>
+ <span class="layui-anim layui-anim-loop layui-anim-">4</span>
+ <span class="layui-anim layui-anim-loop layui-anim-rotate">0</span>
+ <span class="layui-anim layui-anim-loop layui-anim-">3</span>
+ </h1>
+ </div>
+ </div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/error/404.html b/payapi/src/main/resources/templates/error/404.html
new file mode 100755
index 0000000..b818658
--- /dev/null
+++ b/payapi/src/main/resources/templates/error/404.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" >
+<head>
+ <meta charset="utf-8">
+ <title>404 页面不存在</title>
+ <meta name="renderer" content="webkit">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+ <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}" media="all"/>
+ <link rel="stylesheet" th:href="@{/static/custom/css/admin.css}" media="all"/>
+</head>
+<body>
+
+<div class="layui-fluid">
+ <div class="layadmin-tips">
+ <i class="layui-icon" face></i>
+ <div class="layui-text">
+ <p>页面不存在</p>
+ <h1>
+ <span class="layui-anim layui-anim-loop layui-anim-">4</span>
+ <span class="layui-anim layui-anim-loop layui-anim-rotate">0</span>
+ <span class="layui-anim layui-anim-loop layui-anim-">4</span>
+ </h1>
+ </div>
+ </div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/error/500.html b/payapi/src/main/resources/templates/error/500.html
new file mode 100755
index 0000000..fc442c7
--- /dev/null
+++ b/payapi/src/main/resources/templates/error/500.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" >
+<head>
+ <meta charset="utf-8">
+ <title>500 服务出错</title>
+ <meta name="renderer" content="webkit">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+ <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}" media="all"/>
+ <link rel="stylesheet" th:href="@{/static/custom/css/admin.css}" media="all"/>
+</head>
+<body>
+
+<div class="layui-fluid">
+ <div class="layadmin-tips">
+ <i class="layui-icon" face></i>
+ <div class="layui-text">
+ <p>服务器出错了</p>
+ <h1>
+ <span class="layui-anim layui-anim-loop layui-anim-">5</span>
+ <span class="layui-anim layui-anim-loop layui-anim-rotate">0</span>
+ <span class="layui-anim layui-anim-loop layui-anim-">0</span>
+ </h1>
+ </div>
+ </div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/home/console.html b/payapi/src/main/resources/templates/home/console.html
new file mode 100755
index 0000000..76b0b79
--- /dev/null
+++ b/payapi/src/main/resources/templates/home/console.html
@@ -0,0 +1,28 @@
+<div class="layui-row layui-col-space15">
+
+</div>
+
+
+
+
+
+<script>
+ layui.use(['carousel', 'element'], function () {
+ var carousel = layui.carousel;
+ var element = layui.element;
+ var device = layui.device;
+
+ layui.link('[[@{/static/custom/css/console.css}]]');
+
+ // 渲染轮播
+ carousel.render({
+ elem: '.layui-carousel',
+ width: '100%',
+ height: '60px',
+ arrow: 'none',
+ autoplay: true,
+ trigger: device.ios || device.android ? 'click' : 'hover',
+ anim: 'fade'
+ });
+ });
+</script>
diff --git a/payapi/src/main/resources/templates/home/message.html b/payapi/src/main/resources/templates/home/message.html
new file mode 100755
index 0000000..71a097b
--- /dev/null
+++ b/payapi/src/main/resources/templates/home/message.html
@@ -0,0 +1,92 @@
+<div id="message-view" class="layui-card-body layui-tab layui-tab-brief" style="padding: 5px 0;margin: 0;">
+ <ul class="layui-tab-title" style="text-align: center;">
+ <li class="layui-this">通知(5)</li>
+ <li>私信(12)</li>
+ <li>待办(3)</li>
+ </ul>
+ <div class="layui-tab-content" style="padding: 5px 0;">
+ <!-- tab1 -->
+ <div class="layui-tab-item message-list layui-show">
+ <!-- 实际项目请使用后台数据循环出来 -->
+ <a class="message-list-item" href="javascript:;">
+ <img class="message-item-icon" th:src="@{/static/assets/images/message.png}">
+ <div class="message-item-right">
+ <h2 class="message-item-title">你收到了14份新周报</h2>
+ <p class="message-item-text">10个月前</p>
+ </div>
+ </a>
+ <a class="message-list-item" href="javascript:;">
+ <img class="message-item-icon" th:src="@{/static/assets/images/message.png}">
+ <div class="message-item-right">
+ <h2 class="message-item-title">你收到了14份新周报</h2>
+ <p class="message-item-text">10个月前</p>
+ </div>
+ </a>
+ <a class="message-list-item" href="javascript:;">
+ <img class="message-item-icon" th:src="@{/static/assets/images/message.png}">
+ <div class="message-item-right">
+ <h2 class="message-item-title">你收到了14份新周报</h2>
+ <p class="message-item-text">10个月前</p>
+ </div>
+ </a>
+ </div>
+ <!-- tab2 -->
+ <div class="layui-tab-item">
+ <a class="message-list-item" href="javascript:;">
+ <img class="message-item-icon" th:src="@{/static/assets/images/head.png}">
+ <div class="message-item-right">
+ <h2 class="message-item-title">xx评论了你</h2>
+ <p class="message-item-text">哈哈哈哈哈哈</p>
+ <p class="message-item-text">10个月前</p>
+ </div>
+ </a>
+ <a class="message-list-item" href="javascript:;">
+ <img class="message-item-icon" th:src="@{/static/assets/images/head.png}">
+ <div class="message-item-right">
+ <h2 class="message-item-title">xx评论了你</h2>
+ <p class="message-item-text">哈哈哈哈哈哈</p>
+ <p class="message-item-text">10个月前</p>
+ </div>
+ </a>
+ <a class="message-list-item" href="javascript:;">
+ <img class="message-item-icon" th:src="@{/static/assets/images/head.png}">
+ <div class="message-item-right">
+ <h2 class="message-item-title">xx评论了你</h2>
+ <p class="message-item-text">哈哈哈哈哈哈</p>
+ <p class="message-item-text">10个月前</p>
+ </div>
+ </a>
+ </div>
+ <!-- tab3 -->
+ <div class="layui-tab-item">
+ <a class="message-list-item" href="javascript:;">
+ <div class="message-item-right">
+ <span class="layui-badge pull-right">待完成</span>
+ <h2 class="message-item-title">你收到了14份新周报</h2>
+ <p class="message-item-text">10个月前</p>
+ </div>
+ </a>
+ <a class="message-list-item" href="javascript:;">
+ <div class="message-item-right">
+ <span class="layui-badge layui-bg-gray pull-right">已完成</span>
+ <h2 class="message-item-title">你收到了14份新周报</h2>
+ <p class="message-item-text">10个月前</p>
+ </div>
+ </a>
+ <a class="message-list-item" href="javascript:;">
+ <div class="message-item-right">
+ <span class="layui-badge layui-bg-gray pull-right">已完成</span>
+ <h2 class="message-item-title">你收到了14份新周报</h2>
+ <p class="message-item-text">10个月前</p>
+ </div>
+ </a>
+ </div>
+ </div>
+</div>
+
+<script>
+ layui.use('element', function () {
+ var element = layui.element;
+
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/home/password.html b/payapi/src/main/resources/templates/home/password.html
new file mode 100755
index 0000000..e74beba
--- /dev/null
+++ b/payapi/src/main/resources/templates/home/password.html
@@ -0,0 +1,58 @@
+<div class="layui-card-header">
+ <h2 class="header-title">修改密码</h2>
+</div>
+<div class="layui-card-body" style="padding: 30px;">
+ <form class="layui-form" id="form-psw">
+ <div class="layui-form-item">
+ <input type="password" name="oldPsw" required lay-verify="required" class="layui-input"
+ placeholder="请输入原密码" lay-verType="tips">
+ </div>
+ <div class="layui-form-item">
+ <input type="password" name="newPsw" required lay-verify="required|psw" class="layui-input"
+ placeholder="请输入新密码" lay-verType="tips">
+ </div>
+ <div class="layui-form-item">
+ <input type="password" name="rePsw" required lay-verify="required|repsw" class="layui-input"
+ placeholder="再次输入新密码" lay-verType="tips">
+ </div>
+ <div class="layui-form-item">
+ <button class="layui-btn layui-btn-fluid" lay-submit lay-filter="submit-psw">确认修改</button>
+ </div>
+ </form>
+</div>
+
+<script>
+ layui.use(['form', 'admin', 'layer'], function () {
+ var form = layui.form;
+ var admin = layui.admin;
+ var layer = layui.layer;
+
+ // 监听提交
+ form.on('submit(submit-psw)', function (data) {
+ layer.load(2);
+ $.post('[[@{/system/user/updatePsw}]]', data.field, function (data) {
+ if (data.code == 200) {
+ layer.closeAll('loading');
+ admin.closePopupRight();
+ layer.msg(data.msg, {icon: 1, time: 1000}, function () {
+ location.replace('logout');
+ });
+ } else {
+ layer.closeAll('loading');
+ layer.msg(data.msg, {icon: 2});
+ }
+ });
+ return false;
+ });
+
+ // 添加表单验证方法
+ form.verify({
+ psw: [/^[\S]{5,12}$/, '密码必须5到12位,且不能出现空格'],
+ repsw: function (t) {
+ if (t !== $('#form-psw input[name=newPsw]').val()) {
+ return '两次密码输入不一致';
+ }
+ }
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/home/theme.html b/payapi/src/main/resources/templates/home/theme.html
new file mode 100755
index 0000000..71700a0
--- /dev/null
+++ b/payapi/src/main/resources/templates/home/theme.html
@@ -0,0 +1,37 @@
+<div class="layui-card-header">
+ <h2 class="header-title">多标签:</h2>
+ <div class="pull-right layui-form">
+ <input type="checkbox" lay-skin="switch" lay-text="ON|OFF" id="set-tab" lay-filter="set-tab" checked/>
+ </div>
+</div>
+
+<div class="layui-card-header"><h2 class="header-title">设置主题:</h2></div>
+<div class="layui-card-body layui-text">
+ <a th:href="@{/home/setTheme}" class="layui-btn" style="background-color: #009688;">默认主题</a>
+ <a th:href="@{/home/setTheme?themeName=blue}" class="layui-btn layui-btn-normal">蓝色主题</a>
+ <br><br><br>
+
+</div>
+
+<script>
+ layui.use(['form', 'index', 'admin'], function () {
+ var form = layui.form;
+ var index = layui.index;
+ var admin = layui.admin;
+
+ $('#set-tab').prop('checked', index.pageTabs);
+ form.render('checkbox');
+
+ form.on('switch(set-tab)', function (data) {
+ if (data.elem.checked) {
+ location.reload();
+ } else {
+ index.pageTabs = false;
+ index.checkPageTabs();
+ admin.refresh();
+ admin.closePopupRight();
+ }
+ });
+
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/index.html b/payapi/src/main/resources/templates/index.html
new file mode 100755
index 0000000..bfea46b
--- /dev/null
+++ b/payapi/src/main/resources/templates/index.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
+
+<head>
+ <title>首页</title>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}" />
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}" />
+ <meta charset="utf-8"/>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+ <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}"/>
+ <link rel="stylesheet" th:href="@{/static/libs/zTree/css/zTreeStyle/zTreeStyle.css}"/>
+ <link rel="stylesheet" th:href="@{/static/custom/module/formSelects/formSelects-v4.css}"/>
+ <link rel="stylesheet" th:href="@{/static/custom/css/admin.css}"/>
+ <link th:if="${session.theme != null}" rel="stylesheet" th:href="@{/static/custom/css/theme-blue.css}"/>
+</head>
+
+<body class="layui-layout-body">
+<div class="layui-layout layui-layout-admin">
+ <!-- 头部 -->
+ <div class="layui-header">
+ <div class="layui-logo">
+ <img th:src="@{/static/custom/images/logo.png}"/>
+ <cite>支付中心</cite>
+ </div>
+ <ul class="layui-nav layui-layout-left">
+ <li class="layui-nav-item" lay-unselect>
+ <a ew-event="flexible" title="侧边伸缩"><i class="layui-icon layui-icon-shrink-right"></i></a>
+ </li>
+ <li class="layui-nav-item" lay-unselect>
+ <a ew-event="refresh" title="刷新"><i class="layui-icon layui-icon-refresh-3"></i></a>
+ </li>
+ </ul>
+ <ul class="layui-nav layui-layout-right">
+ <li class="layui-nav-item" lay-unselect>
+ <a ew-event="refreshDict" title="刷新字典"><i class="layui-icon layui-icon-read"></i></a>
+ </li>
+ <!--<li class="layui-nav-item" lay-unselect>-->
+ <!--<a id="btnMessage" title="消息"><i class="layui-icon layui-icon-notice"></i></a>-->
+ <!--</li>-->
+ <li class="layui-nav-item layui-hide-xs" lay-unselect>
+ <a ew-event="fullScreen" title="全屏"><i class="layui-icon layui-icon-screen-full"></i></a>
+ </li>
+ <li class="layui-nav-item" lay-unselect>
+ <a href="javascript:;">
+ <img th:src="@{/static/custom/images/head.png}" class="layui-nav-img">
+ <cite>[[${loginOper.opername}]]</cite>
+ </a>
+ <dl class="layui-nav-child">
+ <dd ay-unselect><a lay-href="/operator/userinfor">基本资料</a></dd>
+ <dd ay-unselect><a lay-href="/operator/setpwd">修改密码</a></dd>
+ <hr>
+ <dd layadmin-event="logout" style="text-align: center;" ><a th:href="@{/logout}">退出</a></dd>
+ </dl>
+ </li>
+ <li class="layui-nav-item" lay-unselect>
+ <a ew-event="theme" title="主题"><i class="layui-icon layui-icon-more-vertical"></i></a>
+ </li>
+ </ul>
+ </div>
+
+ <!-- 侧边栏 -->
+ <div class="layui-side">
+ <div class="layui-side-scroll">
+ <ul class="layui-nav layui-nav-tree" style="margin-top: 15px;">
+
+ <li class="layui-nav-item" th:each="menu : ${menus}">
+ <a th:lay-href="${menu.menuUrl}"><i th:class="'layui-icon '+${menu.menuIcon}"></i> <cite>[[${menu.menuName}]]</cite></a>
+ <dl class="layui-nav-child" th:if="${menu.subMenus.size()} > 0">
+ <dd th:each="subMenu : ${menu.subMenus}">
+ <a th:lay-href="${subMenu.menuUrl}">[[${subMenu.menuName}]]</a>
+ <dl class="layui-nav-child" th:if="${subMenu.subMenus.size()} > 0">
+ <dd th:each="temp : ${subMenu.subMenus}"><a th:lay-href="${temp.menuUrl}">
+ <i th:class="'layui-icon '+${temp.menuIcon}"></i>
+ [[${temp.menuName}]]
+ </a>
+ </dd>
+ </dl>
+ </dd>
+ </dl>
+ </li>
+
+ <!--<li class="layui-nav-item">-->
+ <!--<a href="javascript:;"><i class="layui-icon layui-icon-unlink"></i> <cite>多级菜单</cite></a>-->
+ <!--<dl class="layui-nav-child">-->
+ <!--<dd>-->
+ <!--<a href="javascript:;">二级菜单</a>-->
+ <!--<dl class="layui-nav-child">-->
+ <!--<dd><a href="javascript:;">三级菜单</a></dd>-->
+ <!--<dd><a href="javascript:;">三级菜单</a></dd>-->
+ <!--</dl>-->
+ <!--</dd>-->
+ <!--</dl>-->
+ <!--</li>-->
+ </ul>
+ </div>
+ </div>
+
+
+ <!-- 主体部分 -->
+ <div class="layui-body">
+ <div class="layui-tab" lay-allowClose="true" lay-filter="admin-pagetabs">
+ <ul class="layui-tab-title">
+ </ul>
+ <div class="layui-tab-content">
+ </div>
+ </div>
+ <div class="layui-icon admin-tabs-control layui-icon-prev" ew-event="leftPage"></div>
+ <div class="layui-icon admin-tabs-control layui-icon-next" ew-event="rightPage"></div>
+ <div class="layui-icon admin-tabs-control layui-icon-down">
+ <ul class="layui-nav admin-tabs-select" lay-filter="admin-pagetabs-nav">
+ <li class="layui-nav-item" lay-unselect>
+ <a href="javascript:;"></a>
+ <dl class="layui-nav-child layui-anim-fadein">
+ <dd ew-event="closeThisTabs" lay-unselect><a href="javascript:;">关闭当前标签页</a></dd>
+ <dd ew-event="closeOtherTabs" lay-unselect><a href="javascript:;">关闭其它标签页</a></dd>
+ <dd ew-event="closeAllTabs" lay-unselect><a href="javascript:;">关闭全部标签页</a></dd>
+ </dl>
+ </li>
+ </ul>
+ </div>
+ </div>
+
+ <!-- 底部 -->
+ <div class="layui-footer">Copyright © 2018 supwisdom All rights reserved. <span class="pull-right" th:text="${payapiVersion}">Version 1.0</span>
+ </div>
+
+ <!-- 手机屏幕遮罩层 -->
+ <div class="site-mobile-shade"></div>
+</div>
+
+<script type="text/javascript" th:src="@{/static/libs/jquery/jquery-3.2.1.min.js}"></script>
+<script type="text/javascript" th:src="@{/static/libs/q.js}"></script>
+<script type="text/javascript" th:src="@{/static/libs/layui/layui.js}"></script>
+<script type="text/javascript" th:src="@{/static/libs/zTree/js/jquery.ztree.all-3.5.min.js}"></script>
+<script type="text/javascript" th:src="@{/static/libs/custom.js}"></script>
+
+<script>
+ layui.config({
+ base: 'static/custom/module/'
+ }).extend({
+ formSelects: 'formSelects/formSelects-v4',
+ treetable: 'treetable-lay/treetable',
+ treeSelect: 'treeSelect/treeSelect'
+ }).use(['admin'], function () {
+ var admin = layui.admin;
+ });
+</script>
+
+<script>
+ layui.use(['index'], function () {
+ var index = layui.index;
+ index.checkPageTabs(true); // 检查多标签是否开启
+ index.initRouter(); // 导航栏和tab联动
+ index.bindEvent(); // 绑定事件
+
+ var dictpool = DictPoolToolkit();
+ dictpool.initAll("[[@{/dictpool}]]"); //加载字典
+ });
+</script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/login.html b/payapi/src/main/resources/templates/login.html
new file mode 100644
index 0000000..a87ae82
--- /dev/null
+++ b/payapi/src/main/resources/templates/login.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+
+<head>
+ <title>用户登录</title>
+ <meta name="_csrf" th:content="${_csrf.token}" />
+ <!-- default header name is X-CSRF-TOKEN -->
+ <meta name="_csrf_header" th:content="${_csrf.headerName}" />
+ <link rel="stylesheet" type="text/css" th:href="@{/static/libs/layui/css/layui.css}" />
+ <link rel="stylesheet" type="text/css" th:href="@{/static/custom/css/login.css}" />
+</head>
+<body>
+<div class="login-wrapper">
+
+ <div class="login-header">
+ <img th:src="@{/static/custom/images/logo.png}"> logo
+ </div>
+
+ <div class=" login-body">
+ <div class="layui-card">
+ <div class="layui-card-header">
+ <i class="layui-icon layui-icon-engine"></i> 用户登录
+ </div>
+ <div class="layui-card-body layui-form layui-form-pane">
+ <div class="layui-form-item">
+ <label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
+ <div class="layui-input-block">
+ <input name="username" type="text" lay-verify="required" placeholder="账号"
+ class="layui-input">
+ <input type="hidden"
+ th:name="${_csrf.parameterName}"
+ th:value="${_csrf.token}"/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label"><i class="layui-icon layui-icon-password"></i></label>
+ <div class="layui-input-block">
+ <input name="password" type="password" lay-verify="required" placeholder="密码"
+ class="layui-input">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
+ <div class="layui-input-block">
+ <div class="layui-row inline-block">
+ <div class="layui-col-xs7">
+ <input name="verifyCodeActual" type="text" placeholder="验证码"
+ class="layui-input">
+ </div>
+ <div class="layui-col-xs5" style="padding-left: 10px;">
+ <img width="100px" height="35px" class="login-captcha" th:src="@{/code/image}">
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <!--<a href="javascript:;" class="layui-link">帐号注册</a>-->
+ <a href="javascript:;" class="layui-link pull-right">忘记密码?</a>
+ </div>
+ <div class="layui-form-item">
+ <button lay-filter="login-submit" class="layui-btn layui-btn-fluid" lay-submit>登 录</button>
+ </div>
+ <!--<div class="layui-form-item login-other">-->
+ <!--<label>第三方登录</label>-->
+ <!--<a href="javascript:;"><i class="layui-icon layui-icon-login-qq"></i></a>-->
+ <!--<a href="javascript:;"><i class="layui-icon layui-icon-login-wechat"></i></a>-->
+ <!--<a href="javascript:;"><i class="layui-icon layui-icon-login-weibo"></i></a>-->
+ <!--</div>-->
+ </div>
+ </div>
+ </div>
+
+ <div class="login-footer">
+ <p>© 2019 <a href="javascript:;" target="_blank">上海树维信息科技有限公司 版权所有</a></p>
+ <!--<p>-->
+ <!--<span><a href="javascript:;" target="_blank">前往github</a></span>-->
+ <!--<span><a href="https://gitee.com/andyzy/zy-admin.git" target="_blank">前往gitee</a></span>-->
+ <!--<span><a href="javascript:;" target="_blank">文档说明</a></span>-->
+ <!--</p>-->
+ </div>
+</div>
+
+<script type="text/javascript" th:src="@{/static/libs/layui/layui.js}" ></script>
+<script>
+ layui.config({
+ base: 'custom/module/'
+ }).use(['form'], function () {
+ var $ = layui.jquery;
+ var form = layui.form;
+ // 表单提交
+ form.on('submit(login-submit)', function (obj) {
+ var field = obj.field;
+ layer.load(2);
+ $.ajax({
+ url: '[[@{/login/form}]]',
+ data: field,
+ type: 'POST',
+ success: function (data) {
+ console.log(data);
+ if (200 == data.code) {
+ layer.msg('登录成功', {icon: 1, time: 1500}, function () {
+ location.replace('./');
+ });
+ } else {
+ layer.closeAll('loading');
+ layer.msg(data.msg, {icon: 5});
+ $('.login-captcha').trigger('click');
+ }
+ },
+ error: function (xhr) {
+ console.log(xhr);
+ layer.closeAll('loading');
+ layer.msg('登录失败', {icon: 5});
+ }
+ });
+ });
+
+ // 图形验证码
+ $('.login-captcha').click(function () {
+ this.src = this.src + '?t=' + (new Date).getTime();
+ });
+ });
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/ologin.html b/payapi/src/main/resources/templates/ologin.html
new file mode 100644
index 0000000..ac043c3
--- /dev/null
+++ b/payapi/src/main/resources/templates/ologin.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+
+<head>
+ <title>统一身份认证</title>
+ <meta name="_csrf" th:content="${_csrf.token}"/>
+ <!-- default header name is X-CSRF-TOKEN -->
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/static/libs/layui/css/layui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/static/custom/css/login.css}"/>
+</head>
+<body>
+<div class="login-wrapper">
+ <div class=" login-body">
+ <div class="layui-card">
+ <div class="layui-card-header">
+ <i class="layui-icon layui-icon-engine"></i> 统一身份认证
+ </div>
+ <div class="layui-card-body layui-form layui-form-pane">
+ <p style="color:red;padding: 0 0 10px 0;" th:if="${session['SPRING_SECURITY_LAST_EXCEPTION']!=null and session['SPRING_SECURITY_LAST_EXCEPTION'].message!=null}" th:text="${session['SPRING_SECURITY_LAST_EXCEPTION'].message}"></p>
+ <form th:action="@{/login/form}" method="post">
+ <div class="layui-form-item">
+ <label class="layui-form-label"><i class="layui-icon layui-icon-username"></i></label>
+ <div class="layui-input-block">
+ <input name="username" type="text" lay-verify="required" placeholder="账号"
+ class="layui-input">
+ <input type="hidden"
+ th:name="${_csrf.parameterName}"
+ th:value="${_csrf.token}"/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label"><i class="layui-icon layui-icon-password"></i></label>
+ <div class="layui-input-block">
+ <input name="password" type="password" lay-verify="required" placeholder="密码"
+ class="layui-input">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label"><i class="layui-icon layui-icon-vercode"></i></label>
+ <div class="layui-input-block">
+ <div class="layui-row inline-block">
+ <div class="layui-col-xs7">
+ <input name="verifyCodeActual" type="text" placeholder="验证码"
+ class="layui-input">
+ </div>
+ <div class="layui-col-xs5" style="padding-left: 10px;">
+ <img width="100px" height="35px" class="login-captcha" th:src="@{/code/image}">
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <!--<a href="javascript:;" class="layui-link">帐号注册</a>-->
+ <a href="javascript:;" class="layui-link pull-right">忘记密码?</a>
+ </div>
+ <div class="layui-form-item">
+ <button type="submit" lay-filter="login-submit" class="layui-btn layui-btn-fluid" lay-submit>登 录</button>
+ </div>
+ </form>
+ <!--<div class="layui-form-item login-other">-->
+ <!--<label>第三方登录</label>-->
+ <!--<a href="javascript:;"><i class="layui-icon layui-icon-login-qq"></i></a>-->
+ <!--<a href="javascript:;"><i class="layui-icon layui-icon-login-wechat"></i></a>-->
+ <!--<a href="javascript:;"><i class="layui-icon layui-icon-login-weibo"></i></a>-->
+ <!--</div>-->
+ </div>
+ </div>
+ </div>
+
+ <div class="login-footer">
+ <p>© 2019 <a href="javascript:;" target="_blank">上海树维信息科技有限公司 版权所有</a></p>
+ <!--<p>-->
+ <!--<span><a href="javascript:;" target="_blank">前往github</a></span>-->
+ <!--<span><a href="https://gitee.com/andyzy/zy-admin.git" target="_blank">前往gitee</a></span>-->
+ <!--<span><a href="javascript:;" target="_blank">文档说明</a></span>-->
+ <!--</p>-->
+ </div>
+</div>
+
+<script type="text/javascript" th:src="@{/static/libs/layui/layui.js}" ></script>
+<script>
+ layui.config({
+ base: 'custom/module/'
+ }).use(['form'], function () {
+ var $ = layui.jquery;
+
+ // 图形验证码
+ $('.login-captcha').click(function () {
+ this.src = this.src + '?t=' + (new Date).getTime();
+ });
+ });
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/dtl/shopdtl.html b/payapi/src/main/resources/templates/system/dtl/shopdtl.html
new file mode 100644
index 0000000..a83361b
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/dtl/shopdtl.html
@@ -0,0 +1,289 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">商户流水查询</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">流水管理</a>
+ <a><cite>商户流水查询</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form" lay-filter="shopdtl-search-form">
+ <div class="layui-form-item" style="margin-bottom: 10px;">
+ <div class="layui-inline">
+ <label class="layui-form-label">记账日期</label>
+ <div class="layui-input-inline" style="width: 120px;">
+ <input type="text" name="startAccdate" id="shopdtl-search-startAccdate"
+ placeholder="开始日期"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ <div class="layui-form-mid">-</div>
+ <div class="layui-input-inline" style="width: 120px;">
+ <input type="text" name="endAccdate" id="shopdtl-search-endAccdate" placeholder="结束日期"
+ autocomplete="off"
+ class="layui-input"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">支付方式</label>
+ <div class="layui-input-block" style="height: 38px;">
+ <select name="sourcetype" id="shopdtl-search-sourcetype" class="layui-select">
+ <option value=""> 全部</option>
+ <option th:each="pt:${paytypelist}" th:value="${pt.sourceType}"
+ th:text="${pt.paydesc}"></option>
+ </select> 
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">状态</label>
+ <div class="layui-input-block" style="height: 38px;">
+ <select name="transStatus" id="shopdtl-search-transStatus" class="layui-select">
+ <option value=""> 全部</option>
+ <option th:each="st:${dtlStatusList}" th:value="${st.dictval}"
+ th:text="${st.dictcaption}"></option>
+ </select> 
+ </div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-bottom: 10px;">
+ <div class="layui-inline">
+ <label class="layui-form-label">交易日期</label>
+ <div class="layui-input-inline" style="width: 120px;">
+ <input type="text" name="startTransdate" id="shopdtl-search-startTransdate"
+ placeholder="开始日期"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ <div class="layui-form-mid">-</div>
+ <div class="layui-input-inline" style="width: 120px;">
+ <input type="text" name="endTransdate" id="shopdtl-search-endTransdate"
+ placeholder="结束日期"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">选择商户</label>
+ <div class="layui-input-block" style="height: 38px;">
+ <input type="text" name="shopaccno" id="shopdtl-search-shopaccno" placeholder="选择商户"
+ lay-filter="shopdtl-search-shopaccno-filter"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">类型</label>
+ <div class="layui-input-block" style="height: 38px;">
+ <select name="tradeflag" id="shopdtl-search-tradeflag" class="layui-select">
+ <option value=""> 全部</option>
+ <option value="in">收入</option>
+ <option value="out">支出</option>
+ </select> 
+ </div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-bottom: 0;">
+ <div class="layui-inline" style="margin-right: 20px;">
+ <label class="layui-form-label">商户名称</label>
+ <div class="layui-input-block" style="width: 265px;">
+ <input type="text" name="shopname" id="shopdtl-search-shopname" placeholder="商户名称"
+ autocomplete="off" class="layui-input" maxlength="20"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">交易码</label>
+ <div class="layui-input-block" style="height: 38px;">
+ <select name="transcode" id="shopdtl-search-transcode" class="layui-select">
+ <option value=""> 全部</option>
+ <option th:each="tc:${transcodeList}" th:value="${tc.transcode}"
+ th:text="${tc.transname}"></option>
+ </select>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <div class="toolbar">
+ <button id="btn-search-shopdtl" class="layui-btn icon-btn" data-type="search"><i
+ class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-reset-shopdtl" class="layui-btn layui-btn-primary" data-type="reset"><i
+ class="layui-icon"></i>清 空
+ </button>
+ </div>
+ <table class="layui-table" id="shopdtlSearchTable" lay-filter="shopdtlSearchTable-filter"></table>
+ </div>
+</div>
+
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element', 'laydate', 'treeSelect'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ var laydate = layui.laydate;
+ var treeSelect = layui.treeSelect;
+
+ form.render("select");
+
+ laydate.render({
+ elem: '#shopdtl-search-startAccdate'
+ });
+ laydate.render({
+ elem: '#shopdtl-search-endAccdate'
+ });
+ laydate.render({
+ elem: '#shopdtl-search-startTransdate'
+ });
+ laydate.render({
+ elem: '#shopdtl-search-endTransdate'
+ });
+
+ treeSelect.render({
+ elem: '#shopdtl-search-shopaccno',
+ data: '[[@{/dtl/shoptreeselect}]]',
+ type: 'get',
+ placeholder: '选择商户',
+ search: false,
+ style: {
+ folder: {
+ enable: false
+ },
+ line: {
+ enable: true
+ }
+ },
+ // 点击回调
+ click: function (d) {
+ var treeNode = d.current;
+ console.log(treeNode);
+ if (undefined == treeNode.accno || null == treeNode.accno) {
+ layer.msg("请选择结算商户", {icon: 2, time: 1500});
+ $("#shopdtl-search-shopaccno").val("");
+ treeSelect.revokeNode('shopdtl-search-shopaccno-filter');
+ return false;
+ }
+ return true;
+ },
+ success: function (d) {
+ console.log(d); // 加载完成后的回调函数
+ }
+ });
+
+
+ $("#btn-search-shopdtl").click(function () {
+ table.reload('shopdtlSearchTable', {
+ where: {
+ startAccdate: $("#shopdtl-search-startAccdate").val(),
+ endAccdate: $("#shopdtl-search-endAccdate").val(),
+ startTransdate: $("#shopdtl-search-startTransdate").val(),
+ endTransdate: $("#shopdtl-search-endTransdate").val(),
+ personname: $("#shopdtl-search-personname").val(),
+ shopaccno: $("#shopdtl-search-shopaccno").val(),
+ sourcetype: $("#shopdtl-search-sourcetype").val(),
+ tradeflag: $("#shopdtl-search-tradeflag").val(),
+ transcode: $("#shopdtl-search-transcode").val(),
+ transStatus: $("#shopdtl-search-transStatus").val()
+ }, page: {curr: 1}
+ });
+ });
+
+ $("#btn-reset-shopdtl").click(function () {
+ form.val("shopdtl-search-form", {
+ "startAccdate": "",
+ "endAccdate": "",
+ "startTransdate": "",
+ "endTransdate": "",
+ "shopname": "",
+ "shopaccno": "",
+ "sourcetype": "",
+ "tradeflag": "",
+ "transcode": "",
+ "transStatus": ""
+ });
+ form.render("select");
+ treeSelect.revokeNode('shopdtl-search-shopaccno-filter');
+ });
+
+ // 渲染表格
+ table.render({
+ elem: '#shopdtlSearchTable',
+ url: '[[@{/dtl/shopdtllist}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'refno', title: '参考号', align: 'center', width: 200, sort: true},
+ {field: 'accdate', title: '记账日期', align: 'center', width: 100, sort: true},
+ {field: 'transdesc', title: '交易描述', align: 'center', width: 175},
+ {field: 'shopname', title: '商户名称', align: 'center', width: 250},
+ {field: 'amount', title: '交易金额', align: 'center', width: 120, sort: true},
+ {
+ field: 'transStatus',
+ title: '状态',
+ align: 'center',
+ width: 90,
+ templet: function (item) {
+ if (item.status === 'init') {
+ return '<span class="layui-badge layui-bg-gray">初始化</span>';
+ } else if (item.status === 'success') {
+ return '<span class="layui-badge layui-bg-green">成功</span>';
+ } else if (item.status === 'fail') {
+ return '<span class="layui-badge">失败</span>';
+ } else if (item.status === 'wip') {
+ return '<span class="layui-badge layui-bg-orange">待支付</span>';
+ } else {
+ return item.status;
+ }
+ }
+ },
+ {
+ field: 'tradeflag',
+ title: '类型',
+ align: 'center',
+ width: 60,
+ templet: function (item) {
+ if (item.tradeflag === 'in') {
+ return '<span style="color: green;">收入</span>';
+ } else if (item.tradeflag === 'out') {
+ return '<span style="color: red;">支出</span>';
+ } else {
+ return item.tradeflag;
+ }
+ }
+ },
+ {field: 'transdate', title: '交易日期', align: 'center', width: 100, sort: true},
+ {field: 'transtime', title: '交易时间', align: 'center', width: 100, sort: true},
+ {
+ field: 'sourceType',
+ title: '支付方式',
+ align: 'center',
+ width: 130,
+ sort: true,
+ templet: function (item) {
+ return getTempDictValue('sourcetypeList', item.sourceType);
+ }
+ },
+ {
+ field: 'reverseFlag',
+ title: '冲正状态',
+ align: 'center',
+ width: 100,
+ templet: function (item) {
+ return getTempDictValue('reverseFlagList', item.reverseFlag);
+ }
+ },
+ {field: 'oppositeAccName', title: '交易对象', align: 'center', width: 150},
+ // {field: 'outtradeno', title: '子系统订单号', align: 'center', width: 200},
+ {field: 'transcode', title: '交易码', align: 'center', width: 100},
+ {field: 'remark', title: '备注信息', align: 'center', width: 200}
+ ]
+ ]
+ });
+
+
+ });
+</script>
diff --git a/payapi/src/main/resources/templates/system/dtl/userdtl.html b/payapi/src/main/resources/templates/system/dtl/userdtl.html
new file mode 100644
index 0000000..ead6ab2
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/dtl/userdtl.html
@@ -0,0 +1,252 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">个人流水查询</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">流水管理</a>
+ <a><cite>个人流水查询</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form" lay-filter="userdtl-search-form">
+ <div class="layui-form-item" style="margin-bottom: 10px;">
+ <div class="layui-inline">
+ <label class="layui-form-label">记账日期</label>
+ <div class="layui-input-inline" style="width: 120px;">
+ <input type="text" name="startAccdate" id="userdtl-search-startAccdate"
+ placeholder="开始日期"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ <div class="layui-form-mid">-</div>
+ <div class="layui-input-inline" style="width: 120px;">
+ <input type="text" name="endAccdate" id="userdtl-search-endAccdate" placeholder="结束日期"
+ autocomplete="off"
+ class="layui-input"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">姓名</label>
+ <div class="layui-input-block" style="width: 211px;">
+ <input type="text" name="personname" id="userdtl-search-personname" placeholder="姓名"
+ autocomplete="off" class="layui-input" maxlength="20"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">支付方式</label>
+ <div class="layui-input-block" style="height: 38px;">
+ <select name="sourcetype" id="userdtl-search-sourcetype" class="layui-select">
+ <option value=""> 全部</option>
+ <option th:each="pt:${paytypelist}" th:value="${pt.sourceType}"
+ th:text="${pt.paydesc}"></option>
+ </select> 
+ </div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-bottom: 10px;">
+ <div class="layui-inline">
+ <label class="layui-form-label">交易日期</label>
+ <div class="layui-input-inline" style="width: 120px;">
+ <input type="text" name="startTransdate" id="userdtl-search-startTransdate"
+ placeholder="开始日期"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ <div class="layui-form-mid">-</div>
+ <div class="layui-input-inline" style="width: 120px;">
+ <input type="text" name="endTransdate" id="userdtl-search-endTransdate"
+ placeholder="结束日期"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">状态</label>
+ <div class="layui-input-block" style="height:38px;">
+ <select name="transStatus" id="userdtl-search-transStatus" class="layui-select">
+ <option value=""> 全部</option>
+ <option th:each="st:${dtlStatusList}" th:value="${st.dictval}"
+ th:text="${st.dictcaption}"></option>
+ </select> 
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">类型</label>
+ <div class="layui-input-block" style="height: 38px;">
+ <select name="tradeflag" id="userdtl-search-tradeflag" class="layui-select">
+ <option value=""> 全部</option>
+ <option value="in">收入</option>
+ <option value="out">支出</option>
+ </select> 
+ </div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-bottom: 0;">
+ <div class="layui-inline" style="margin-right: 20px;">
+ <label class="layui-form-label">市民卡号</label>
+ <div class="layui-input-block" style="width: 265px;">
+ <input type="text" name="cardno" id="userdtl-search-cardno" placeholder="市民卡号"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label">交易码</label>
+ <div class="layui-input-block">
+ <select name="transcode" id="userdtl-search-transcode" class="layui-select">
+ <option value=""> 全部</option>
+ <option th:each="tc:${transcodeList}" th:value="${tc.transcode}"
+ th:text="${tc.transname}"></option>
+ </select>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <div class="toolbar">
+ <button id="btn-search-userdtl" class="layui-btn icon-btn" data-type="search"><i
+ class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-reset-userdtl" class="layui-btn layui-btn-primary" data-type="reset"><i
+ class="layui-icon"></i>清 空
+ </button>
+ </div>
+ <table class="layui-table" id="userdtlSearchTable" lay-filter="userdtlSearchTable-filter"></table>
+ </div>
+</div>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element', 'laydate'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ var laydate = layui.laydate;
+
+ form.render("select");
+
+ laydate.render({
+ elem: '#userdtl-search-startAccdate'
+ });
+ laydate.render({
+ elem: '#userdtl-search-endAccdate'
+ });
+ laydate.render({
+ elem: '#userdtl-search-startTransdate'
+ });
+ laydate.render({
+ elem: '#userdtl-search-endTransdate'
+ });
+
+ $("#btn-search-userdtl").click(function () {
+ table.reload('userdtlSearchTable', {
+ where: {
+ startAccdate: $("#userdtl-search-startAccdate").val(),
+ endAccdate: $("#userdtl-search-endAccdate").val(),
+ startTransdate: $("#userdtl-search-startTransdate").val(),
+ endTransdate: $("#userdtl-search-endTransdate").val(),
+ personname: $("#userdtl-search-personname").val(),
+ cardno: $("#userdtl-search-cardno").val(),
+ sourcetype: $("#userdtl-search-sourcetype").val(),
+ tradeflag: $("#userdtl-search-tradeflag").val(),
+ transcode: $("#userdtl-search-transcode").val(),
+ transStatus: $("#userdtl-search-transStatus").val()
+ }, page: {curr: 1}
+ });
+ });
+
+ $("#btn-reset-userdtl").click(function () {
+ form.val("userdtl-search-form", {
+ "startAccdate": "",
+ "endAccdate": "",
+ "startTransdate": "",
+ "endTransdate": "",
+ "personname": "",
+ "cardno": "",
+ "sourcetype": "",
+ "tradeflag": "",
+ "transcode": "",
+ "transStatus": ""
+ });
+ form.render("select");
+ });
+
+ // 渲染表格
+ table.render({
+ elem: '#userdtlSearchTable',
+ url: '[[@{/dtl/userdtllist}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'refno', title: '参考号', align: 'center', width: 200, sort: true},
+ {field: 'accdate', title: '记账日期', align: 'center', width: 100, sort: true},
+ {field: 'transdesc', title: '交易描述', align: 'center', width: 175},
+ {field: 'userName', title: '姓名', align: 'center', width: 150},
+ {field: 'amount', title: '交易金额', align: 'center', width: 120, sort: true},
+ {
+ field: 'status',
+ title: '状态',
+ align: 'center',
+ width: 90,
+ templet: function (item) {
+ if (item.status === 'init') {
+ return '<span class="layui-badge layui-bg-gray">初始化</span>';
+ } else if (item.status === 'success') {
+ return '<span class="layui-badge layui-bg-green">成功</span>';
+ } else if (item.status === 'fail') {
+ return '<span class="layui-badge">失败</span>';
+ } else if (item.status === 'wip') {
+ return '<span class="layui-badge layui-bg-orange">待支付</span>';
+ } else {
+ return item.status;
+ }
+ }
+ },
+ {
+ field: 'tradeflag',
+ title: '类型',
+ align: 'center',
+ width: 60,
+ templet: function (item) {
+ if (item.tradeflag === 'in') {
+ return '<span style="color: green;">收入</span>';
+ } else if (item.tradeflag === 'out') {
+ return '<span style="color: red;">支出</span>';
+ } else {
+ return item.tradeflag;
+ }
+ }
+ },
+ {field: 'transdate', title: '交易日期', align: 'center', width: 100, sort: true},
+ {field: 'transtime', title: '交易时间', align: 'center', width: 100, sort: true},
+ {
+ field: 'sourceType',
+ title: '支付方式',
+ align: 'center',
+ width: 130,
+ sort: true,
+ templet: function (item) {
+ return getTempDictValue('sourcetypeList', item.sourceType);
+ }
+ },
+ {
+ field: 'reverseFlag',
+ title: '冲正状态',
+ align: 'center',
+ width: 100,
+ templet: function (item) {
+ return getTempDictValue('reverseFlagList', item.reverseFlag);
+ }
+ },
+ {field: 'oppositeAccName', title: '交易对象', align: 'center', width: 250},
+ {field: 'outtradeno', title: '子系统订单号', align: 'center', width: 200},
+ {field: 'transcode', title: '交易码', align: 'center', width: 100},
+ {field: 'remark', title: '备注信息', align: 'center', width: 200}
+ ]
+ ]
+ });
+
+
+ });
+</script>
diff --git a/payapi/src/main/resources/templates/system/function/form.html b/payapi/src/main/resources/templates/system/function/form.html
new file mode 100755
index 0000000..fa8d43b
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/function/form.html
@@ -0,0 +1,117 @@
+<!-- operator表单弹窗 -->
+<form id="form" lay-filter="form" class="layui-form model-form">
+ <input name="id" id="id" type="hidden"/>
+ <div class="layui-form-item">
+ <label class="layui-form-label">功能名称</label>
+ <div class="layui-input-block">
+ <input name="name" placeholder="请输入功能名称" type="text" class="layui-input" maxlength="20"
+ lay-verify="required|name" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">路径</label>
+ <div class="layui-input-block">
+ <input name="menuUrl" placeholder="请输入路径,父节点默认为 # " type="text" class="layui-input" maxlength="60" value="#" lay-verify="required" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">节点</label>
+ <div class="layui-input-block">
+ <input type="radio" name="isLeaf" value="0" title="父" checked/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">序号</label>
+ <div class="layui-input-block">
+ <input name="orderNum" placeholder="请输入序号" type="text" class="layui-input" />
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">图标</label>
+ <div class="layui-input-block">
+ <input name="menuIcon" placeholder="请输入图标 例:layui-icon-xx " type="text" class="layui-input" />
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="form-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+<script>
+ layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ var formSelects = layui.formSelects;
+ form.render('radio');
+ form.verify({
+ "name": function (e) {
+ var msg = "";
+ $.ajax({
+ type: "GET",
+ url: '[[@{/function/checkname}]]',
+ async: false,
+ data: {
+ name: e,
+ id: $("#id").val()
+ },
+ success: function (result) {
+ if (result.code != 200) {
+ msg = result.msg;
+ }
+ },
+ error: function (error) {
+ msg = "请求服务器校验账号失败";
+ }
+ });
+ }
+ });
+
+ var url = '[[@{/function/add}]]';
+ // 回显user数据
+ var func = admin.getTempData('t_func');
+ if (func) {
+ $('input[name="id"]').attr('readonly', 'readonly');
+ form.val('form', func);
+ }
+ // 表单提交事件
+ form.on('submit(form-submit)', function (data) {
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ debugger
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : url,
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'X-CSRF-TOKEN':token,
+ },
+ data : JSON.stringify(data.field),
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function() {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/function/index.html b/payapi/src/main/resources/templates/system/function/index.html
new file mode 100755
index 0000000..5cff759
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/function/index.html
@@ -0,0 +1,175 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">功能维护</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">系统中心</a>
+ <a><cite>功能维护</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-value" class="layui-input search-input" type="text" placeholder="输入功能名称"/> 
+ <button id="btn-search-func" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-add-func" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加父功能</button>
+ </div>
+ <table class="layui-table" id="table" lay-filter="table"></table>
+ </div>
+</div>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let table = layui.table;
+ let admin = layui.admin;
+
+ form.render('select');
+
+ // 渲染表格
+ table.render({
+ elem: '#table',
+ url: '[[@{/function/list}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'id', title: '功能ID', width: 80,fixed: 'left', sort: true},
+ {field: 'name', title: '功能名称', sort: true},
+ {
+ field: 'isLeaf', title: '节点', sort: true, width: 80, align: 'center', templet: function (item) {
+ if (item.isLeaf == 0) {
+ return '<span class="layui-badge ">父</span>'
+ } else if (item.isLeaf == 1) {
+ return '<span class="layui-badge layui-bg-green">子</span>'
+ } else {
+ return ''
+ }
+ }
+ },
+ {field: 'menuUrl', title: '路径'},
+ {field: 'orderNum', sort: true, width: 80,title: '序号'},
+ {
+ field: 'menuIcon', title: '图标', width: 80,align: 'center', templet: function (item) {
+ return '<i class="layui-icon ' + item.menuIcon + '"></i> '
+ }
+ },
+ {
+ field: 'id', align: 'center', title: '操作', fixed: 'right', width:350, templet: function (item) {
+ if (item.isLeaf == 0) {
+ return ' <a class="layui-btn layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ' +
+ ' <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="addsub"><i class="layui-icon layui-icon-set-sm"></i>添加子功能</a> ' +
+ ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'
+ } else {
+ return ' <a class="layui-btn layui-btn-xs" lay-event="editsub"><i class="layui-icon layui-icon-edit"></i>编辑</a> ' +
+ ' <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="addres"><i class="layui-icon layui-icon-set-sm"></i>添加资源</a> ' +
+ ' <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="listres"><i class="layui-icon layui-icon-set-sm"></i>维护资源</a> ' +
+ ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'
+ }
+ }
+ }
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#btn-search-func').click(function () {
+ let key = $('#search-value').val();
+ table.reload('table', {where: {searchkey: key}, page: {curr: 1}});
+ });
+ $('#btn-add-func').click(function () {
+ showModel();
+ });
+ let showModel = function (data) {
+ let title = data ? '编辑父功能' : '添加父功能';
+ admin.putTempData('t_func', data);
+ admin.popupCenter({
+ title: title,
+ path: '[[@{/function/loadadd}]]',
+ finish: function () {
+ table.reload('table', {});
+ }
+ });
+ };
+ let showModelSub = function (data,parentid) {
+ let title = data ? '编辑子功能' : '添加子功能';
+ admin.putTempData('parentId', parentid);
+ admin.putTempData('t_func', data);
+ admin.popupCenter({
+ title: title,
+ path: '[[@{/function/loadsubadd}]]',
+ finish: function () {
+ table.reload('table', {});
+ }
+ });
+ };
+
+ let showResModel = function (functionid) {
+ let title = '维护资源';
+ admin.putTempData('functionid', functionid);
+ admin.popupCenter({
+ title: title,
+ area:'70%',
+ path: '[[@{/function/loadres}]]?functionid='+functionid
+ });
+ };
+ let showAddResModelSub = function (functionid) {
+ let title = '添加资源';
+ admin.putTempData('functionid', functionid);
+ admin.popupCenter({
+ title: title,
+ path: '[[@{/function/loadresadd}]]',
+ finish: function () {
+ table.reload('table', {});
+ }
+ });
+ };
+ // 工具条点击事件
+ table.on('tool(table)', function (obj) {
+ let data = obj.data;
+ let layEvent = obj.event;
+ console.log(data);
+ if (layEvent === 'edit') {
+ showModel(data);
+ } else if (layEvent === 'addsub') {
+ showModelSub(null,data.id);
+ } else if (layEvent === 'editsub') {
+ showModelSub(data,data.parentId);
+ } else if (layEvent === 'del') {
+ showDelete(data);
+ } else if(layEvent === 'listres'){
+ showResModel(data.id);
+ } else if(layEvent === 'addres'){
+ showAddResModelSub(data.id);
+ }
+ });
+ let showDelete = function (data) {
+ layer.confirm('确定删除吗,该功能下的子功能、资源、角色分配的该功能都将被删除?', function (i) {
+ layer.close(i);
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/function/delfunc}]]', {
+ funcid: data.id,
+ _csrf:token
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ }
+ else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('table', {});
+ },function(ret){
+ console.log(ret);
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ });
+ }
+ });
+</script>
diff --git a/payapi/src/main/resources/templates/system/function/resform.html b/payapi/src/main/resources/templates/system/function/resform.html
new file mode 100755
index 0000000..50cd1aa
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/function/resform.html
@@ -0,0 +1,94 @@
+<!-- operator表单弹窗 -->
+<form id="resform" lay-filter="resform" class="layui-form model-form">
+ <input name="id" id="id" type="hidden"/>
+ <div class="layui-form-item">
+ <label class="layui-form-label">资源名称</label>
+ <div class="layui-input-block">
+ <input name="name" placeholder="请输入资源名称" type="text" class="layui-input" maxlength="60"
+ lay-verify="required|name" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">路径</label>
+ <div class="layui-input-block">
+ <input name="uri" placeholder="请输入资源路径 " type="text" class="layui-input" maxlength="100"
+ lay-verify="required" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">所属功能</label>
+ <div class="layui-input-block">
+ <select name="functionId" id="functionId" lay-verify="required">
+ <option th:each="func : ${list}" th:value="${func.id}">[[${func.name}]]</option>
+ </select>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">代码</label>
+ <div class="layui-input-block">
+ <input name="code" placeholder="请输入代码" type="text" class="layui-input"/>
+ </div>
+ </div>
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="resform-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+<script>
+ layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ form.render('select');
+ form.render('radio');
+ var url = '[[@{/function/addres}]]';
+ // 回显user数据
+ var func = admin.getTempData('t_res');
+ if (func) {
+ $('input[name="id"]').attr('readonly', 'readonly');
+ form.val('resform', func);
+ }
+ let functionid = admin.getTempData("functionid");
+ if (functionid) {
+ form.val('resform', {"functionId": functionid});
+ }
+ // 表单提交事件
+ form.on('submit(resform-submit)', function (data) {
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ debugger
+ $.ajax({
+ type: "POST",
+ dataType: "json",
+ url: url,
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'X-CSRF-TOKEN': token,
+ },
+ data: JSON.stringify(data.field),
+ success: function (result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error: function () {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/function/reslist.html b/payapi/src/main/resources/templates/system/function/reslist.html
new file mode 100755
index 0000000..9a39b92
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/function/reslist.html
@@ -0,0 +1,90 @@
+<div style="padding:20px;">
+ <table class="layui-table" id="restable" lay-filter="restable">
+ </table>
+ <input type="hidden" id="functionid" th:value="${function.id}">
+ <input type="hidden" id="functionname" th:value="${function.name}">
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let admin = layui.admin;
+ form.render('select');
+ let table = layui.table;
+ let func = admin.getTempData('functionid');
+ table.render({
+ elem: '#restable',
+ url: '[[@{/function/reslist}]]?functionid=' + func,
+ cols: [
+ [
+ {field: 'id', title: '资源ID', width: 80, fixed: 'left', sort: true},
+ {field: 'name', title: '资源名称', sort: true},
+ {
+ field: 'functionId', title: '所属功能', sort: true, align: 'center', templet: function (item) {
+ return $("#functionname").val();
+ }
+ },
+ {field: 'uri', title: '路径'},
+ {field: 'code', sort: true, width: 80, title: '代码'},
+ {
+ field: 'id', align: 'center', title: '操作', templet: function (item) {
+ return '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'
+ }
+ }
+ ]
+ ]
+ });
+ // 工具条点击事件
+ table.on('tool(restable)', function (obj) {
+ let data = obj.data;
+ let layEvent = obj.event;
+ console.log(data);
+ if (layEvent === 'edit') {
+ showAddResModelSub(data);
+ } else if (layEvent === 'del') {
+ showDelete(data);
+ }
+ });
+ let showAddResModelSub = function (data) {
+ let title = '编辑资源';
+ admin.putTempData('functionid', $("#functionid").val());
+ admin.putTempData('t_data',data);
+ admin.popupCenter({
+ title: title,
+ path: '[[@{/function/loadresadd}]]',
+ finish: function () {
+ table.reload('table', {});
+ }
+ });
+ };
+ let showDelete = function (data) {
+ layer.confirm('确定删除吗?', function (i) {
+ layer.close(i);
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/function/delres}]]', {
+ resid: data.id,
+ _csrf:token
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ }
+ else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('restable', {});
+ },function(ret){
+ console.log(ret);
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ });
+ }
+ });
+</script>
diff --git a/payapi/src/main/resources/templates/system/function/subform.html b/payapi/src/main/resources/templates/system/function/subform.html
new file mode 100755
index 0000000..d207807
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/function/subform.html
@@ -0,0 +1,106 @@
+<!-- operator表单弹窗 -->
+<form id="form" lay-filter="subform" class="layui-form model-form">
+ <input name="id" id="id" type="hidden"/>
+ <div class="layui-form-item">
+ <label class="layui-form-label">功能名称</label>
+ <div class="layui-input-block">
+ <input name="name" placeholder="请输入功能名称" type="text" class="layui-input" maxlength="20"
+ lay-verify="required|name" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">路径</label>
+ <div class="layui-input-block">
+ <input name="menuUrl" placeholder="请输入路径,父节点默认为 # " type="text" class="layui-input" maxlength="60" lay-verify="required" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">父功能</label>
+ <div class="layui-input-block">
+ <select name="parentId" id="parentId" lay-verify="required">
+ <option th:each="func : ${list}" th:value="${func.id}">[[${func.name}]]</option>
+ </select>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">节点</label>
+ <div class="layui-input-block">
+ <input type="radio" name="isLeaf" value="1" title="子" checked/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">序号</label>
+ <div class="layui-input-block">
+ <input name="orderNum" placeholder="请输入序号" type="text" class="layui-input" />
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">图标</label>
+ <div class="layui-input-block">
+ <input name="menuIcon" placeholder="请输入图标 例:layui-icon-xx " type="text" class="layui-input" />
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="subform-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+<script>
+ layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ form.render('select');
+ form.render('radio');
+ var url = '[[@{/function/add}]]';
+ // 回显user数据
+ var func = admin.getTempData('t_func');
+ if (func) {
+ $('input[name="id"]').attr('readonly', 'readonly');
+ form.val('subform', func);
+ }
+ let parentId = admin.getTempData("parentId");
+ if(parentId){
+ form.val('subform', {"parentId":parentId});
+ }
+ // 表单提交事件
+ form.on('submit(subform-submit)', function (data) {
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ debugger
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : url,
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'X-CSRF-TOKEN':token,
+ },
+ data : JSON.stringify(data.field),
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function() {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/operator/index.html b/payapi/src/main/resources/templates/system/operator/index.html
new file mode 100644
index 0000000..49e4ab1
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/operator/index.html
@@ -0,0 +1,206 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">管理员维护</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#!_operator_index">系统中心</a>
+ <a><cite>管理员维护</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <select id="oper-search-key">
+ <!--<option value="">-请选择-</option>-->
+ <option value="opercode">账号</option>
+ <option value="opername">用户名</option>
+ <option value="mobile">手机号</option>
+ </select> 
+ <input id="oper-search-value" class="layui-input search-input" type="text" placeholder="输入关键字"/> 
+ <button id="oper-btn-search" class="layui-btn icon-btn"><i class="layui-icon"></i>搜索</button>
+ <button id="oper-btn-add" class="layui-btn icon-btn" lay-tips="新用户密码为123456"
+ sec:authorize="hasPermission('/operator/load4add','')" ><i
+ class="layui-icon"></i>添加
+ </button>
+ </div>
+
+ <table class="layui-table" id="oper-table" lay-filter="oper-table"></table>
+ </div>
+</div>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="oper-tpl-state">
+ {{# if(d.opercode == 'system') { }}
+ <input type="checkbox" lay-filter="oper-tpl-state" value="{{d.operid}}" lay-skin="switch" lay-text="正常|注销"
+ {{d.status=='normal'?'checked':''}} disabled/>
+ {{# }else{ }}
+ <input type="checkbox" lay-filter="oper-tpl-state" value="{{d.operid}}" lay-skin="switch" lay-text="正常|注销"
+ {{d.status=='normal'?'checked':''}} />
+ {{# } }}
+</script>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="oper-table-bar">
+ <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
+ <a class="layui-btn layui-btn-xs" lay-event="resetpwd">重置密码</a>
+</script>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var element = layui.element;
+
+ form.render('select');
+
+ // 渲染表格
+ table.render({
+ elem: '#oper-table',
+ url: '[[@{/operator/list}]]',
+ page: true,
+ cols: [
+ [
+ {type: 'numbers', fixed: 'left', width: 50},
+ {field: 'opercode', title: '管理员账号', fixed: 'left',width: 150, sort: true},
+ {field: 'opername', title: '管理员名称', sort: true},
+ {field: 'transStatus', title: '状态', sort: true, width: 100, templet: '#oper-tpl-state'},
+ {
+ field: 'sex', title: '性别', sort: true, width: 80, align: 'center', templet: function (item) {
+ if (item.sex == 'male') {
+ return '男'
+ } else if (item.sex == 'female') {
+ return '女'
+ } else {
+ return ''
+ }
+ }
+ },
+ {field: 'mobile', sort: true, title: '手机号'},
+ {field: 'email', sort: true, title: '电子邮箱'},
+ {field: 'opendate', sort: true, width: 120, title: '注册日期', align: 'center', templet: function (d) {
+ return admin.formatDate(d.opendate);
+ }},
+ {align: 'center', toolbar: '#oper-table-bar', title: '操作',width: 160, fixed: 'right'}
+ ]
+ ]
+ });
+
+ // 搜索按钮点击事件
+ $('#oper-btn-search').click(function () {
+ var key = $('#oper-search-key').val();
+ var value = $('#oper-search-value').val();
+ table.reload('oper-table', {where: {searchkey: key, searchvalue: value}, page: {curr: 1}});
+ });
+
+ // 添加按钮点击事件
+ $('#oper-btn-add').click(function () {
+ showEditModel();
+ });
+
+
+ // 显示表单弹窗
+ var showEditModel = function (data) {
+ var title = data ? '修改用户' : '添加用户';
+ admin.putTempData('tmp_user', data);
+ admin.popupCenter({
+ title: title,
+ path: '[[@{/operator/load4add}]]',
+ finish: function () {
+ table.reload('oper-table', {});
+ }
+ });
+ };
+
+ // 工具条点击事件
+ table.on('tool(oper-table)', function (obj) {
+ console.log(obj);
+ var data = obj.data;
+ var layEvent = obj.event;
+
+ if (layEvent === 'edit') { // 修改
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/operator/getoperatorrole}]]', {
+ operid: data.operid,
+ _csrf: token
+ }, function (ret) {
+ console.log(ret.code);
+ layer.closeAll('loading');
+ if (ret.code == 200) {
+ data['roles'] = ret.roles;
+ showEditModel(data);
+ } else if (ret.code == 401) {
+ layer.msg(ret.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ }
+ else {
+ layer.msg(ret.msg, {icon: 2});
+ }
+ },function(){
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ } else if (layEvent === 'resetpwd') { // 重置密码
+ layer.confirm('确定重置此用户的密码吗?', function (i) {
+ layer.close(i);
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/operator/resetpwd}]]', {
+ operid: data.operid,
+ _csrf: token
+ }, function (ret) {
+ console.log(ret.code);
+ layer.closeAll('loading');
+ if (ret.code == 200) {
+ layer.msg(ret.msg, {icon: 1});
+ } else if (ret.code == 401) {
+ layer.msg(ret.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ }
+ else {
+ layer.msg(ret.msg, {icon: 2});
+ }
+ },function(){
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ });
+ }
+ });
+
+ // 修改user状态
+ form.on('switch(oper-tpl-state)', function (obj) {
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/operator/updatestate}]]', {
+ operid: obj.elem.value,
+ _csrf: token,
+ state: obj.elem.checked ? 'normal' : 'closed'
+ }, function (data) {
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ //table.reload('table-user', {});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ }
+ },function () {
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ });
+
+ });
+</script>
diff --git a/payapi/src/main/resources/templates/system/operator/logs.html b/payapi/src/main/resources/templates/system/operator/logs.html
new file mode 100644
index 0000000..3f6f6ff
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/operator/logs.html
@@ -0,0 +1,50 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">操作日志</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">系统中心</a>
+ <a><cite>操作日志</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-operlog-value" class="layui-input search-input" type="text" placeholder="输入管理员账号"/> 
+ <button id="btn-operlog-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ </div>
+ <table class="layui-table" id="logtable" lay-filter="logtable"></table>
+ </div>
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let table = layui.table;
+ let admin = layui.admin;
+ form.render('select');
+ // 渲染表格
+ table.render({
+ elem: '#logtable',
+ url: '[[@{/operator/logslist}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'opername', title: '管理员账号', width: 160,fixed: 'left', sort: true},
+ {field: 'functionname', title: '所属功能', sort: true},
+ {field: 'resname', title: '操作内容', sort: true},
+ {field: 'respath', title: '操作路径'},
+ {
+ field: 'logdate', align: 'center', title: '操作时间', width: 200, fixed: 'right', templet: function (item) {
+ return admin.formatDate(item.logdate);
+ }
+ }
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#btn-operlog-search').click(function () {
+ let key = $('#search-operlog-value').val();
+ table.reload('logtable', {where: {searchkey: key}, page: {curr: 1}});
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/operator/operator.html b/payapi/src/main/resources/templates/system/operator/operator.html
new file mode 100644
index 0000000..0a50551
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/operator/operator.html
@@ -0,0 +1,156 @@
+<!-- operator表单弹窗 -->
+<form id="oper-form" lay-filter="oper-form" class="layui-form model-form">
+ <input name="operid" id="operid" type="hidden"/>
+ <div class="layui-form-item">
+ <label class="layui-form-label">账号</label>
+ <div class="layui-input-block">
+ <input name="opercode" placeholder="请输入账号" type="text" class="layui-input" maxlength="20"
+ lay-verify="required|opercode" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">用户名</label>
+ <div class="layui-input-block">
+ <input name="opername" placeholder="请输入用户名" type="text" class="layui-input" maxlength="60"
+ lay-verify="required" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label" title="用于第三方授权登录,但不能访问本系统资源" style="width: 90px;">授权登录用户</label>
+ <div class="layui-input-block">
+ <input type="checkbox" name="thirdadmin" lay-skin="switch" lay-text="启用|关闭" value="yes" />
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">性别</label>
+ <div class="layui-input-block">
+ <input type="radio" name="sex" value="male" title="男" checked/>
+ <input type="radio" name="sex" value="female" title="女"/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">手机号</label>
+ <div class="layui-input-block">
+ <input name="mobile" placeholder="请输入手机号" type="text" class="layui-input" lay-verify="mobile" />
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">邮箱</label>
+ <div class="layui-input-block">
+ <input name="email" placeholder="请输入邮箱" type="text" class="layui-input" lay-verify="swEmail" />
+ </div>
+ </div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">角色</label>
+ <div class="layui-input-block">
+ <select name="roleId" xm-select="roleId" lay-verify="required">
+ <option th:each="role : ${roles}" th:value="${role.roleId}">[[${role.roleName}]]</option>
+ </select>
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="oper-form-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+
+<script>
+ layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ var formSelects = layui.formSelects;
+
+ form.render('radio');
+ form.render('checkbox');
+ form.verify({
+ "mobile": function (e) {
+ if (null != e && e.length > 0 && !(/^1\d{10}$/.test(e))) {
+ return "请输入正确的手机号";
+ }
+ },
+ "swEmail": function (e) {
+ if (null != e && e.length > 0 && !(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(e))) {
+ return "邮箱格式不正确";
+ }
+ },
+ "opercode": function (e) {
+ if(null!=e && e.length>0 && !(/^[0-9a-zA-Z]*$/.test(e))){
+ return "账号非法,请填入字母、数字或它们的组合";
+ }
+
+ var msg = "";
+ $.ajax({
+ type: "GET",
+ url: '[[@{/operator/checkopercode}]]',
+ async: false, //同步提交。不设置则默认异步,异步的话,最后执行ajax
+ data: {
+ opercode: e,
+ operid: $("#operid").val()
+ },
+ success: function (result) {
+ if (result.code != 200) {
+ msg = result.msg;
+ }
+ },
+ error: function (error) {
+ msg = "请求服务器校验账号失败";
+ }
+ });
+ if (msg != "") {
+ return msg;
+ }
+ }
+ });
+
+ var url = '[[@{/operator/add}]]';
+ // 回显user数据
+ var user = admin.getTempData('tmp_user');
+ if (user) {
+ $('input[name="opercode"]').attr('readonly', 'readonly');
+ form.val('oper-form', user);
+ var rds = new Array();
+ for (var i = 0; i < user.roles.length; i++) {
+ rds.push(user.roles[i].roleId);
+ }
+ formSelects.value('roleId', rds);
+ }
+ // 表单提交事件
+ form.on('submit(oper-form-submit)', function (data) {
+ debugger
+ layer.load(2);
+ var token_name = $("meta[name='_csrf_token']").attr("content");
+ var token = $("meta[name='_csrf_token']").attr("value");
+ data.field[token_name] = token;
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : url,
+ data : data.field,
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (data.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function(data) {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/operator/setpwd.html b/payapi/src/main/resources/templates/system/operator/setpwd.html
new file mode 100644
index 0000000..7b77f60
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/operator/setpwd.html
@@ -0,0 +1,81 @@
+<div class="layui-card">
+ <div class="layui-card-header">修改密码</div>
+ <div class="layui-card-body" pad15>
+ <form lay-filter="setpwd-form" class="layui-form model-form">
+ <div class="layui-form" lay-filter="">
+ <div class="layui-form-item">
+ <label class="layui-form-label">当前密码</label>
+ <div class="layui-input-inline">
+ <input type="password" name="curpwd" lay-verify="required" lay-verType="tips" required
+ class="layui-input">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">新密码</label>
+ <div class="layui-input-inline">
+ <input type="password" name="newpwd" lay-verify="pass" lay-verType="tips" autocomplete="off" required
+ id="LAY_password" class="layui-input">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">确认新密码</label>
+ <div class="layui-input-inline">
+ <input type="password" name="renewpwd" lay-verify="repass" lay-verType="tips" required
+ autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-input-block">
+ <button class="layui-btn" lay-submit lay-filter="setmypass">确认修改</button>
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeThisTabs">取消</button>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let admin = layui.admin;
+ $('#cancelBtn').click(function () {
+ admin.closeThisTabs()
+ });
+
+ let url = '[[@{/operator/dosetpwd}]]';
+ // 表单提交事件
+ form.on('submit(setmypass)', function (data) {
+ layer.load(2);
+ var token_name = $("meta[name='_csrf_token']").attr("content");
+ var token = $("meta[name='_csrf_token']").attr("value");
+ data.field[token_name] = token;
+ $.ajax({
+ type: "POST",
+ dataType: "json",
+ url: url,
+ data: data.field,
+ success: function (result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ } else if (data.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error: function (data) {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/operator/userinfor.html b/payapi/src/main/resources/templates/system/operator/userinfor.html
new file mode 100644
index 0000000..7cb1bce
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/operator/userinfor.html
@@ -0,0 +1,97 @@
+<div class="layui-card">
+ <div class="layui-card-header">设置我的资料</div>
+ <div class="layui-card-body" pad15>
+ <form lay-filter="userinfor-form" class="layui-form model-form">
+ <div class="layui-form">
+ <div class="layui-form-item">
+ <label class="layui-form-label">登录名</label>
+ <div class="layui-input-inline">
+ <input type="text" name="opercode" th:value="${user.opercode}" readonly class="layui-input">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">名称</label>
+ <div class="layui-input-inline">
+ <input type="text" name="opername" th:value="${user.opername}" lay-verify="nickname"
+ autocomplete="off"
+ placeholder="请输入名称" class="layui-input">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">性别</label>
+ <div class="layui-input-block">
+ <input type="radio" name="sex" value="male" title="男" th:checked="${user.sex}=='male'">
+ <input type="radio" name="sex" value="female" title="女" th:checked="${user.sex}=='female'">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">手机</label>
+ <div class="layui-input-inline">
+ <input type="text" name="mobile" th:value="${user.mobile}" autocomplete="off"
+ class="layui-input">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">邮箱</label>
+ <div class="layui-input-inline">
+ <input type="text" name="email" th:value="${user.mobile}" autocomplete="off"
+ class="layui-input">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-input-block">
+ <button class="layui-btn" lay-filter="infor-form-submit" lay-submit>确认修改</button>
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeThisTabs">取消</button>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let admin = layui.admin;
+ $('#cancelBtn').click(function () {
+ admin.closeThisTabs()
+ });
+ form.render('radio');
+ let url = '[[@{/operator/updateinfor}]]';
+ // 表单提交事件
+ form.on('submit(infor-form-submit)', function (data) {
+ layer.load(2);
+ var token_name = $("meta[name='_csrf_token']").attr("content");
+ var token = $("meta[name='_csrf_token']").attr("value");
+ data.field[token_name] = token;
+ $.ajax({
+ type: "POST",
+ dataType: "json",
+ url: url,
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'X-CSRF-TOKEN': token,
+ },
+ data: JSON.stringify(data.field),
+ success: function (result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error: function (data) {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/param/apiclientform.html b/payapi/src/main/resources/templates/system/param/apiclientform.html
new file mode 100644
index 0000000..16ace93
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/param/apiclientform.html
@@ -0,0 +1,78 @@
+<form id="appid-form" lay-filter="form" class="layui-form model-form">
+ <div class="layui-form-item">
+ <label class="layui-form-label">APPID</label>
+ <div class="layui-input-block">
+ <input name="appid" placeholder="请输入APPID" type="text" class="layui-input" maxlength="30"
+ lay-verify="required|number" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">权限</label>
+ <div class="layui-input-block">
+ <select name="roles" xm-select="roles" lay-verify="required">
+ <option th:each="role : ${rolelist}" th:value="${role.key}">[[${role.value}]]</option>
+ </select>
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="form-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+
+<script>
+ layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ var formSelects = layui.formSelects;
+
+ var url = '[[@{/param/addapiclientpara}]]';
+ // 回显user数据
+ var apiparam = admin.getTempData('t_appclient');
+ debugger
+ if (undefined != apiparam && null != apiparam) {
+ url = '[[@{/param/updateapiclientpara}]]';
+ $('input[name="appid"]').attr('readonly', 'readonly');
+ $('input[name="appid"]').val(apiparam.appid);
+ var rds = apiparam.roles.split(";");
+ formSelects.value('roles', rds);
+ }
+ // 表单提交事件
+ form.on('submit(form-submit)', function (data) {
+ layer.load(2);
+ var token_name = $("meta[name='_csrf_token']").attr("content");
+ var token = $("meta[name='_csrf_token']").attr("value");
+ data.field[token_name] = token;
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : url,
+ data : data.field,
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (data.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function(data) {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
+
diff --git a/payapi/src/main/resources/templates/system/param/apiclientpara.html b/payapi/src/main/resources/templates/system/param/apiclientpara.html
new file mode 100644
index 0000000..9f18342
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/param/apiclientpara.html
@@ -0,0 +1,169 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">应用权限参数管理</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">参数管理</a>
+ <a><cite>应用权限参数管理</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-appid" class="layui-input search-input" type="text" maxlength="40" style="width: 300px;"
+ placeholder="输入APPID查询"/>
+ <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>新 增</button>
+ <button id="btn-reset" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
+ </div>
+ <table class="layui-table" id="apiClientTable" lay-filter="apiClientTable-filter"></table>
+ </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="apiclient-table-bar">
+ <a class="layui-btn layui-btn-xs" lay-event="editRole">修改</a>
+ <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+</script>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="api-tpl-state">
+ <input type="checkbox" lay-filter="api-tpl-state" value="{{d.appid}}" lay-skin="switch" lay-text="启用|关闭"
+ {{d.status=='normal'?'checked':''}} />
+</script>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ // 渲染表格
+ table.render({
+ elem: '#apiClientTable',
+ url: '[[@{/param/apiclientparalist}]]',
+ toolbar:'',
+ page: true,
+ cols: [
+ [
+ {field: 'appid', title: 'APPID', width: 120, align: 'right', fixed: 'left', sort: true},
+ {field: 'secret', title: '密钥', align: 'center', edit: 'text'},
+ {field: 'status', title: '状态', width: 100, templet: '#api-tpl-state',sort: true},
+ {field: 'roles', title: '权限', align: 'center' },
+ {align: 'center', title: '操作', width: 150, toolbar: '#apiclient-table-bar', fixed: 'right'}
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#btn-search').click(function () {
+ var paraname = $("#search-appid").val();
+ table.reload('apiClientTable', {where: {appid: paraname}, page: {curr: 1}});
+ });
+
+ $('#btn-add').click(function () {
+ showEditModel();
+ });
+
+ $('#btn-reset').click(function () {
+ $("#search-appid").val("");
+ });
+
+ function showEditModel(data) {
+ var title = data ? '修改应用' : '新增应用';
+ admin.putTempData('t_appclient', data);
+ admin.popupCenter({
+ title: title,
+ path: '[[@{/param/load4addapiclient}]]',
+ finish: function () {
+ table.reload('apiClientTable');
+ }
+ });
+ }
+
+ // 修改user状态
+ form.on('switch(api-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/param/updateapiclientstate}]]', {
+ appid: obj.elem.value,
+ state: obj.elem.checked ? 'normal' : 'closed',
+ _csrf: token
+ }, function (data) {
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ }
+ },function () {
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ });
+ });
+
+ //监听单元格
+ table.on('tool(apiClientTable-filter)', function (obj) {
+ var data = obj.data;
+ if('del' == obj.event){
+ if(confirm("确定要删除应用参数["+data.appid+"]吗?")){
+ layer.load(2);
+ admin.go('[[@{/param/deleteapiclient}]]', {
+ appid: data.appid,
+ _csrf: $("meta[name='_csrf_token']").attr("value")
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('apiClientTable');
+ }, function (ret) {
+ console.log(ret);
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ }
+ }else if('editRole' ==obj.event){
+ showEditModel(data);
+ }
+ });
+
+ table.on('edit(apiClientTable-filter)', function (obj) {
+ var row = obj.data; //得到所在行所有键值
+ var newval = obj.value; //得到修改后的值
+ admin.go('[[@{/param/updateapiclientpara}]]', {
+ appid: row.appid,
+ secret: newval,
+ _csrf: $("meta[name='_csrf_token']").attr("value"),
+ }, function (data) {
+ if (data.code == 200) {
+ layer.msg("修改成功", {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ table.reload('apiClientTable');
+ }
+ },function () {
+ layer.msg('修改失败了,请稍后再试', {icon: 2});
+ table.reload('apiClientTable');
+ });
+ })
+
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/param/businesspara.html b/payapi/src/main/resources/templates/system/param/businesspara.html
new file mode 100644
index 0000000..0da59dd
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/param/businesspara.html
@@ -0,0 +1,129 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">业务参数管理</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">参数管理</a>
+ <a><cite>业务参数管理</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-business-paraname" class="layui-input search-input" type="text" maxlength="40" style="width: 300px;"
+ placeholder="输入参数名查询"/> 
+ <button id="search-business-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ <button id="search-business-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>新 增</button>
+ <button id="search-business-reset" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
+ </div>
+ <table class="layui-table" id="businessparaTable" lay-filter="businessparaTable-filter"></table>
+ </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="busipara-table-bar">
+ <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+</script>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ // 渲染表格
+ table.render({
+ elem: '#businessparaTable',
+ url: '[[@{/param/businessparalist}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'parakey', title: '参数名', width: 366, align: 'right', fixed: 'left', sort: true},
+ {field: 'paraval', title: '参数值', align: 'left', style:'cursor: pointer;', event: 'modifyValue'},
+ {align: 'center', title: '操作', width: 80, toolbar: '#busipara-table-bar', fixed: 'right'}
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#search-business-search').click(function () {
+ var paraname = $("#search-business-paraname").val();
+ table.reload('businessparaTable', {where: {paraname: paraname}, page: {curr: 1}});
+ });
+
+ $('#search-business-add').click(function () {
+ admin.popupCenter({
+ title: "新增业务参数",
+ area:["600px","300px"],
+ path: '[[@{/param/load4addbuspara}]]',
+ finish: function () {
+ table.reload('businessparaTable');
+ }
+ });
+ });
+
+ $('#search-business-reset').click(function () {
+ $("#search-business-paraname").val("");
+ });
+
+ //监听单元格
+ table.on('tool(businessparaTable-filter)', function (obj) {
+ var data = obj.data;
+ if('del' == obj.event){
+ if(confirm("确定要删除业务参数["+data.parakey+"]吗?")){
+ layer.load(2);
+ admin.go('[[@{/param/deletebusinesspara}]]', {
+ parakey: data.parakey,
+ _csrf: $("meta[name='_csrf_token']").attr("value")
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('businessparaTable');
+ }, function (ret) {
+ console.log(ret);
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ }
+ }else if('modifyValue' == obj.event){
+ layer.prompt({
+ formType: 2,
+ title: '修改参数名为 ['+ data.parakey +'] 的值:',
+ area: ['500px', '200px'],
+ maxlength: 1000,
+ value: data.paraval
+ }, function(value, index){
+ layer.close(index);
+ admin.go('[[@{/param/businessparaupdate}]]', {
+ parakey: data.parakey,
+ paraval: value,
+ _csrf: $("meta[name='_csrf_token']").attr("value"),
+ }, function (data) {
+ if (data.code == 200) {
+ layer.msg("修改成功", {icon: 1});
+ obj.update({ paraval: value });
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ },function () {
+ layer.msg('修改失败了,请稍后再试', {icon: 2});
+ });
+ });
+ }
+ });
+
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/param/busparaform.html b/payapi/src/main/resources/templates/system/param/busparaform.html
new file mode 100644
index 0000000..39dd9de
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/param/busparaform.html
@@ -0,0 +1,89 @@
+<form id="form" lay-filter="form" class="layui-form model-form">
+ <div class="layui-form-item">
+ <label class="layui-form-label">参数名</label>
+ <div class="layui-input-block">
+ <input name="parakey" placeholder="请输入参数名" type="text" class="layui-input" maxlength="30"
+ lay-verify="required|businame" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">参数值</label>
+ <div class="layui-input-block">
+ <textarea name="paraval" placeholder="请输入内容" class="layui-textarea" required></textarea>
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="form-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+
+<script>
+ layui.use(['layer', 'admin', 'form'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ form.render('radio');
+ form.verify({
+ "businame": function (e) {
+ var msg = "";
+ $.ajax({
+ type: "GET",
+ url: '[[@{/param/checkbusname}]]',
+ async: false,
+ data: {
+ parakey: e
+ },
+ success: function (result) {
+ if (result.code != 200) {
+ msg = result.msg;
+ }
+ },
+ error: function (error) {
+ msg = "请求服务器校验参数名失败";
+ }
+ });
+ if (msg != "") {
+ return msg;
+ }
+ }
+ });
+
+ var url = '[[@{/param/addbusinesspara}]]';
+ // 表单提交事件
+ form.on('submit(form-submit)', function (data) {
+ layer.load(2);
+ var vdata = data.field;
+ vdata["_csrf"] = $("meta[name='_csrf_token']").attr("value");
+ console.log("postdata=",data)
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : url,
+ data : vdata,
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function() {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/param/paytype.html b/payapi/src/main/resources/templates/system/param/paytype.html
new file mode 100644
index 0000000..8c5d102
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/param/paytype.html
@@ -0,0 +1,309 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">支付能力配置</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">参数管理</a>
+ <a><cite>支付能力配置</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-global-sourceType" class="layui-input search-input" type="text" maxlength="40" style="width: 300px;"
+ placeholder="输入支付方式查询"/>
+ <button id="btn-search-param" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-add-param" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>新 增
+ </button>
+ <button id="btn-reset-param" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空
+ </button>
+ </div>
+ <table class="layui-table" id="paytypeTable" lay-filter="paytypeTable-filter"></table>
+ </div>
+</div>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="enable-tpl-state">
+ <input type="checkbox" lay-filter="enable-tpl-state" value="{{d.sourceType}}" lay-skin="switch" lay-text="启用|关闭"
+ {{d.enable== true?'checked':''}}/>
+</script>
+<script type="text/html" id="chargeenable-tpl-state">
+ {{# if(d.enable == true){ }}
+ <input type="checkbox" lay-filter="chargeenable-tpl-state" value="{{d.sourceType}}" lay-skin="switch" lay-text="启用|关闭"
+ {{(d.enable== true && d.chargeEnable== true)?'checked':''}}/>
+ {{# }else{ }}
+ <input type="checkbox" lay-filter="chargeenable-tpl-state" value="{{d.sourceType}}" lay-skin="switch" lay-text="启用|关闭"
+ {{(d.enable== true && d.chargeEnable== true)?'checked':''}} disabled/>
+ {{# } }}
+</script>
+<script type="text/html" id="consumeenable-tpl-state">
+ {{# if(d.enable == true){ }}
+ <input type="checkbox" lay-filter="consumeenable-tpl-state" value="{{d.sourceType}}" lay-skin="switch" lay-text="启用|关闭"
+ {{(d.enable== true && d.consumeEnable== true)?'checked':''}}/>
+ {{# }else{ }}
+ <input type="checkbox" lay-filter="consumeenable-tpl-state" value="{{d.sourceType}}" lay-skin="switch" lay-text="启用|关闭"
+ {{(d.enable== true && d.consumeEnable== true)?'checked':''}} disabled/>
+ {{# } }}
+</script>
+<script type="text/html" id="anonymousenable-tpl-state">
+ {{# if(d.enable == true ){ }}
+ <input type="checkbox" lay-filter="anonymousenable-tpl-state" value="{{d.sourceType}}" lay-skin="switch"
+ lay-text="启用|关闭"
+ {{(d.enable==true && d.anonymousEnable==true)?'checked':''}}/>
+ {{# }else{ }}
+ <input type="checkbox" lay-filter="anonymousenable-tpl-state" value="{{d.sourceType}}" lay-skin="switch"
+ lay-text="启用|关闭"
+ {{(d.enable==true && d.anonymousEnable==true)?'checked':''}} disabled/>
+ {{# } }}
+</script>
+<script type="text/html" id="reversable-tpl-state">
+ {{# if(d.enable == true ){ }}
+ <input type="checkbox" lay-filter="reversable-tpl-state" value="{{d.sourceType}}" lay-skin="switch"
+ lay-text="启用|关闭"
+ {{(d.enable==true && d.reversable==true)?'checked':''}}/>
+ {{# }else{ }}
+ <input type="checkbox" lay-filter="reversable-tpl-state" value="{{d.sourceType}}" lay-skin="switch"
+ lay-text="启用|关闭"
+ {{(d.enable==true && d.reversable==true)?'checked':''}} disabled/>
+ {{# } }}
+</script>
+<script type="text/html" id="checkable-tpl-state">
+ {{# if(d.enable == true ){ }}
+ <input type="checkbox" lay-filter="checkable-tpl-state" value="{{d.sourceType}}" lay-skin="switch"
+ lay-text="启用|关闭"
+ {{(d.enable==true && d.checkable==true)?'checked':''}}/>
+ {{# }else{ }}
+ <input type="checkbox" lay-filter="checkable-tpl-state" value="{{d.sourceType}}" lay-skin="switch"
+ lay-text="启用|关闭"
+ {{(d.enable==true && d.checkable==true)?'checked':''}} disabled/>
+ {{# } }}
+</script>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ // 渲染表格
+ table.render({
+ elem: '#paytypeTable',
+ url: '[[@{/param/paytypelist}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'sourceType', title: '支付方式', width: 200, align: 'center', fixed: 'left', sort: true},
+ {field: 'paydesc', title: '名称', align: 'center', sort: true, edit:'text'},
+ {field: 'enable', title: '状态', align: 'center', templet: '#enable-tpl-state', sort: true},
+ {
+ field: 'chargeEnable',
+ title: '能否充值',
+ align: 'center',
+ templet: '#chargeenable-tpl-state',
+ sort: true
+ },
+ {
+ field: 'consumeEnable',
+ title: '能否消费',
+ align: 'center',
+ templet: '#consumeenable-tpl-state',
+ sort: true
+ },
+ {
+ field: 'anonymousEnable',
+ title: '匿名消费',
+ align: 'center',
+ templet: '#anonymousenable-tpl-state',
+ sort: true
+ },
+ {
+ field: 'reversable',
+ title: '能否冲正',
+ align: 'center',
+ templet: '#reversable-tpl-state',
+ sort: true
+ },
+ {
+ field: 'checkable',
+ title: '是否清算',
+ align: 'center',
+ templet: '#anonymousenable-tpl-state',
+ sort: true
+ },
+ {
+ align: 'center', title: '操作', width: 150, fixed: 'right', templet: function (item) {
+ if (item.sourceType != 'balance') {
+ return '<a class="layui-btn layui-btn-xs" lay-event="config">配置</a> <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+ }
+ return '';
+ }
+ }
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#btn-search-param').click(function () {
+ var sourceType = $("#search-global-sourceType").val();
+ table.reload('paytypeTable', {where: {paytype: sourceType}, page: {curr: 1}});
+ });
+
+ $('#btn-add-param').click(function () {
+ admin.popupCenter({
+ title: "新增支付能力",
+ path: '[[@{/param/load4addpaytype}]]',
+ finish: function () {
+ table.reload('paytypeTable');
+ }
+ });
+ });
+
+ $('#btn-reset-param').click(function () {
+ $("#search-global-sourceType").val("");
+ });
+
+ // 修改总状态
+ form.on('switch(enable-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/param/updatepaytypestate}]]', {
+ paytype: obj.elem.value,
+ state: obj.elem.checked,
+ _csrf: token
+ }, function (data) {
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1, time:1000});
+ table.reload('paytypeTable');
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ }
+ },function () {
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ });
+ });
+
+ form.on('switch(chargeenable-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ updatePaytypeState(obj, "charge", token);
+ });
+
+ form.on('switch(consumeenable-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ updatePaytypeState(obj, "consume", token);
+ });
+
+ form.on('switch(anonymousenable-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ updatePaytypeState(obj, "anonymous", token);
+ });
+
+ form.on('switch(reversable-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ updatePaytypeState(obj, "reversable", token);
+ });
+
+ form.on('switch(checkable-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ updatePaytypeState(obj, "checkable", token);
+ });
+
+
+ function updatePaytypeState(obj, optype, token) {
+ admin.go('[[@{/param/updatepaytypestate}]]', {
+ paytype: obj.elem.value,
+ state: obj.elem.checked,
+ optype: optype,
+ _csrf: token
+ }, function (data) {
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1, time: 1000});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ }
+ }, function () {
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ });
+ }
+
+ table.on('edit(paytypeTable-filter)', function (obj) {
+ var row = obj.data; //得到所在行所有键值
+ var newval = obj.value; //得到修改后的值
+ admin.go('[[@{/param/updatepaytypename}]]', {
+ paytype: row.sourceType,
+ paydesc: newval,
+ _csrf: $("meta[name='_csrf_token']").attr("value"),
+ }, function (data) {
+ if (data.code == 200) {
+ layer.msg("修改成功", {icon: 1, time: 1000});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ table.reload('paytypeTable');
+ }
+ },function () {
+ layer.msg('修改失败了,请稍后再试', {icon: 2});
+ table.reload('paytypeTable');
+ });
+ })
+
+ //监听单元格
+ table.on('tool(paytypeTable-filter)', function (obj) {
+ var data = obj.data;
+ if('del' == obj.event){
+ if (confirm("确定要删除支付方式[" + data.sourceType + "_" + data.paydesc + "]吗?")) {
+ layer.load(2);
+ admin.go('[[@{/param/deletepaytype}]]', {
+ paytype: data.sourceType,
+ _csrf: $("meta[name='_csrf_token']").attr("value")
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1, time: 1000});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('paytypeTable');
+ }, function (ret) {
+ console.log(ret);
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ }
+ }else if('config' ==obj.event){
+ admin.popupCenter({
+ title: "配置参数【" + data.sourceType + "_" + data.paydesc + "】",
+ path: '[[@{/param/load4paytypeconfig}]]?paytype='+data.sourceType,
+ area: '800px',
+ finish: function () {
+ table.reload('paytypeTable');
+ }
+ });
+ }
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/param/paytypeconfig.html b/payapi/src/main/resources/templates/system/param/paytypeconfig.html
new file mode 100644
index 0000000..ad6c9cf
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/param/paytypeconfig.html
@@ -0,0 +1,77 @@
+<form id="sourceType-config-form" lay-filter="sourceType-config-form" class="layui-form model-form">
+ <div class="layui-form-item" style="display: none;">
+ <input type="hidden" class="layui-input" id="hid_paytype" th:value="${paytype}"/>
+ </div>
+
+ <div class="layui-form-item" style="text-align: center;" th:if="${configlist.size()} le 0">
+ 无配置项
+ </div>
+
+ <div class="layui-form-item" th:if="${configlist.size()} gt 0" th:each="config:${configlist}">
+ <div class="layui-input-block" style="margin:0;display: inline;float: left;width: 20%;">
+ <label class="layui-form-label" style="float: right;width: 100%;" th:text="${config.configid}">参数名</label>
+ </div>
+ <div class="layui-input-block" style="margin:0;display: inline;float: right;width: 80%;">
+ <input type="text" th:name="${config.configid}" class="layui-input" th:value="${config.configValue}" autocomplete="off"/>
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="form-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+
+<script>
+ layui.use(['layer', 'admin', 'form'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ // 表单提交事件
+ form.on('submit(form-submit)', function (data) {
+ layer.load(2);
+ var vdata = data.field;
+ if(JSON.stringify(vdata)=="{}"){
+ layer.closeAll('loading');
+ admin.closePopupCenter();
+ return; //无配置项,直接关闭
+ }
+ var token=$("meta[name='_csrf_token']").attr("value");
+ vdata["hid_paytype"] = $("#hid_paytype").val();
+ console.log('addpaytype:',vdata);
+ debugger
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : '[[@{/param/addpaytypeconfig}]]',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'X-CSRF-TOKEN':token,
+ },
+ data : JSON.stringify(vdata),
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function() {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/param/paytypeform.html b/payapi/src/main/resources/templates/system/param/paytypeform.html
new file mode 100644
index 0000000..1ec0c3d
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/param/paytypeform.html
@@ -0,0 +1,128 @@
+<form id="sourceType-form" lay-filter="form" class="layui-form model-form">
+ <div class="layui-form-item">
+ <label class="layui-form-label">支付方式</label>
+ <div class="layui-input-block">
+ <input name="paytype" placeholder="请输入支付方式代码" type="text" class="layui-input" maxlength="20"
+ lay-verify="required|sourceType" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">名称</label>
+ <div class="layui-input-block">
+ <input name="paydesc" placeholder="请输入支付方式名称" type="text" class="layui-input" maxlength="30"
+ lay-verify="required" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">状态</label>
+ <div class="layui-input-block">
+ <input name="enable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+ </div>
+ </div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">能否充值</label>
+ <div class="layui-input-block">
+ <input name="chargeEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+ </div>
+ </div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">能否消费</label>
+ <div class="layui-input-block">
+ <input name="consumeEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+ </div>
+ </div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">匿名消费</label>
+ <div class="layui-input-block">
+ <input name="anonymousEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+ </div>
+ </div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">能否冲正</label>
+ <div class="layui-input-block">
+ <input name="reversable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+ </div>
+ </div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">是否清算</label>
+ <div class="layui-input-block">
+ <input name="checkable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="form-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+
+<script>
+ layui.use(['layer', 'admin', 'form'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ form.render('checkbox');
+ form.verify({
+ "sourceType": function (e) {
+ var msg = "";
+ $.ajax({
+ type: "GET",
+ url: '[[@{/param/checkpaytype}]]',
+ async: false,
+ data: {
+ paytype: e
+ },
+ success: function (result) {
+ if (result.code != 200) {
+ msg = result.msg;
+ }
+ },
+ error: function (error) {
+ msg = "请求服务器校验支付方式失败";
+ }
+ });
+ if (msg != "") {
+ return msg;
+ }
+ }
+ });
+
+ // 表单提交事件
+ form.on('submit(form-submit)', function (data) {
+ layer.load(2);
+ var vdata = data.field;
+ vdata["_csrf"] = $("meta[name='_csrf_token']").attr("value");
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : '[[@{/param/addpaytype}]]',
+ data : vdata,
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function(err){
+ admin.errorBack(err);
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/param/syspara.html b/payapi/src/main/resources/templates/system/param/syspara.html
new file mode 100644
index 0000000..f49293b
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/param/syspara.html
@@ -0,0 +1,96 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">全局参数管理</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">参数管理</a>
+ <a><cite>全局参数管理</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-syspara-paraid" class="layui-input search-input" maxlength="9" type="text" placeholder="输入参数ID"/> 
+ <input id="search-syspara-paraname" class="layui-input search-input" type="text" maxlength="30" placeholder="输入参数名称"/> 
+ <button id="btn-search-sysparam" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-reset-sysparam" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
+ </div>
+ <table class="layui-table" id="sysparaTable" lay-filter="sysparaTable-filter"></table>
+ </div>
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ // 渲染表格
+ table.render({
+ elem: '#sysparaTable',
+ url: '[[@{/param/sysparalist}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'paraid', title: 'ID', width: 80, align: 'center', fixed: 'left', sort: true},
+ {field: 'paraname', title: '参数名称', width: 250, align: 'center', fixed: 'left'},
+ {field: 'paraval', title: '参数值', fixed: 'left', edit: 'text'},
+ {
+ field: 'valueType', title: '格式', width: 75, align: 'center', templet: function (item) {
+ if("amount"==item["valueType"]) return "金额";
+ else if("switch"==item["valueType"]) return "开关";
+ else if("date"==item["valueType"]) return "yyyyMMdd";
+ else if("datetime"==item["valueType"]) return "yyyyMMddHHmmss";
+ else if("decimal"==item["valueType"]) return "数值";
+ else if("number"==item["valueType"]) return "整数";
+ else return "字符串";
+ }
+ },
+ {field: 'paraunit', title: '单位', width: 75, align: 'center'},
+ {field: 'remark', title: '备注'}
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#btn-search-sysparam').click(function () {
+ var paraid = $("#search-syspara-paraid").val();
+ var paraname = $("#search-syspara-paraname").val();
+ if (null != paraid && paraid.length > 0 && !(/^\d+$/.test(paraid))) {
+ layer.msg("参数ID请输入数字", {icon: 2});
+ }else{
+ table.reload('sysparaTable', {where: {paraid: paraid, paraname: paraname}, page: {curr: 1}});
+ }
+ });
+
+ $('#btn-reset-sysparam').click(function () {
+ $("#search-syspara-paraid").val("");
+ $("#search-syspara-paraname").val("");
+ });
+
+
+ //监听单元格编辑
+ table.on('edit(sysparaTable-filter)', function (obj) {
+ var row = obj.data; //得到所在行所有键值
+ var newval = obj.value; //得到修改后的值
+ admin.go('[[@{/param/sysparaupdate}]]', {
+ paraid: row.paraid,
+ paraval: newval,
+ _csrf: $("meta[name='_csrf_token']").attr("value"),
+ }, function (data) {
+ if (data.code == 200) {
+ layer.msg("修改成功", {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ table.reload('sysparaTable');
+ }
+ },function () {
+ layer.msg('修改失败了,请稍后再试', {icon: 2});
+ table.reload('sysparaTable');
+ });
+ });
+
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/report/shopbusiness.html b/payapi/src/main/resources/templates/system/report/shopbusiness.html
new file mode 100644
index 0000000..c1c042e
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/report/shopbusiness.html
@@ -0,0 +1,179 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">商户营业情况表</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">结算中心</a>
+ <a><cite>商户营业情况表</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form" lay-filter="shopbusiness-search-form">
+ <input type="hidden" id="shopbusiness-hidden-maxdate" th:value="${maxdate}" />
+ <input type="hidden" id="shopbusiness-hidden-parentId" value="0"/>
+ <div class="layui-form-item" style="margin-bottom: 0;">
+ <div class="layui-inline">
+ <label class="layui-form-label">记账日期</label>
+ <div class="layui-input-inline">
+ <input type="text" name="startdate" id="shopbusiness-search-startdate" placeholder="起始日期" th:value="${maxdate}"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ <div class="layui-form-mid">-</div>
+ <div class="layui-input-inline">
+ <input type="text" name="enddate" id="shopbusiness-search-enddate" placeholder="截止日期" th:value="${maxdate}"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">选择商户</label>
+ <div class="layui-input-block">
+ <input type="text" name="shopid" id="shopbusiness-search-shopid" placeholder="选择商户" lay-filter="shopbusiness-search-shopid-filter"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <div class="layui-input-block" style="margin-left: 0;">
+ <input type="checkbox" name="nodealshow" id="shopbusiness-search-nodealshow" lay-skin="primary" title="显示未交易商户"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <button id="shopbusiness-search-btn" class="layui-btn icon-btn" data-type="search"><i
+ class="layui-icon"></i>搜索
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <table class="layui-table" id="shopbusinessTable" lay-filter="shopbusinessTable-filter"></table>
+ </div>
+</div>
+
+<script type="text/html" id="shopbusiness-toolbar">
+ <div class="layui-btn-container">
+ <button class="layui-btn layui-btn-sm" id="btn-fold-shopbusiness" lay-event="shopbusinessShowFold">全部折叠</button>
+ <button class="layui-btn layui-btn-sm" id="btn-expand-shopbusiness" lay-event="shopbusinessExpandAll">全部展开</button>
+ </div>
+</script>
+
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element', 'laydate', 'treeSelect', 'treetable'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ var laydate = layui.laydate;
+ var treetable = layui.treetable;
+ var treeSelect = layui.treeSelect;
+
+ form.render("checkbox");
+ laydate.render({
+ elem: '#shopbusiness-search-startdate',
+ max: $("#shopbusiness-hidden-maxdate").val()
+ });
+ laydate.render({
+ elem: '#shopbusiness-search-enddate',
+ max: $("#shopbusiness-hidden-maxdate").val()
+ });
+
+ treeSelect.render({
+ elem: '#shopbusiness-search-shopid',
+ data: '[[@{/report/selectshoptree}]]',
+ type: 'get',
+ placeholder: '选择商户',
+ search: false,
+ style: {
+ folder: {
+ enable: false
+ },
+ line: {
+ enable: true
+ }
+ },
+ // 点击回调
+ click: function (d) {
+ var treeNode = d.current;
+ console.log(treeNode);
+ $("#shopbusiness-hidden-parentId").val(treeNode.pId);
+ return true;
+ },
+ success: function (d) {
+ console.log(d); // 加载完成后的回调函数
+ }
+ });
+
+ var renderTable = function (obj) {
+ layer.load(2);
+ var parentId = $("#shopbusiness-hidden-parentId").val();
+ console.log(parentId);
+ treetable.render({
+ id: 'ShopBusinessReport',
+ title: '商户营业情况表',
+ treeColIndex: 0,
+ treeSpid: parentId,
+ treeIdName: 'shopid',
+ treePidName: 'fshopid',
+ treeDefaultClose: false,
+ treeLinkage: false,
+ elem: '#shopbusinessTable',
+ url: '[[@{/report/shopbusinesslist}]]',
+ page: false,
+ where: obj,
+ showicon: false,
+ toolbar:'#shopbusiness-toolbar',
+ cols: [
+ [
+ {field: 'shopname', title: '商户名称', align: 'left'},
+ {field: 'summary', title: '交易摘要', align: 'center'},
+ {field: 'transcnt', title: '交易次数', align: 'center'},
+ {field: 'transamt', title: '交易金额', align: 'center'}
+ ]
+ ],
+ done: function (res, curr, count) {
+ console.log(res);
+ layer.closeAll('loading');
+ }
+ });
+ }
+ renderTable({
+ startdate: $("#shopbusiness-search-startdate").val(),
+ enddate: $("#shopbusiness-search-enddate").val(),
+ shopid: "",
+ nodealshow: false
+ });
+
+ $('#shopbusiness-search-btn').click(function () {
+ var startdate = $("#shopbusiness-search-startdate").val();
+ var enddate = $("#shopbusiness-search-enddate").val();
+ var shopid = $("#shopbusiness-search-shopid").val();
+ var nodealshow = $("#shopbusiness-search-nodealshow").is(':checked');
+ if (null == startdate || "" == $.trim(startdate)) {
+ layer.msg('请选择起始日期', {icon: 2, time: 1500});
+ return;
+ }
+ if (null == enddate || "" == $.trim(enddate)) {
+ layer.msg('请选择截止日期', {icon: 2, time: 1500});
+ return;
+ }
+ renderTable({
+ startdate: startdate,
+ enddate: enddate,
+ shopid: shopid,
+ nodealshow: nodealshow
+ });
+ });
+
+ table.on('toolbar(shopbusinessTable-filter)', function(obj){
+ switch(obj.event){
+ case 'shopbusinessShowFold':
+ treetable.foldAll('#shopbusinessTable');
+ break;
+ case 'shopbusinessExpandAll':
+ treetable.expandAll('#shopbusinessTable');
+ break;
+ }
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/report/subjectday.html b/payapi/src/main/resources/templates/system/report/subjectday.html
new file mode 100644
index 0000000..41cdf17
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/report/subjectday.html
@@ -0,0 +1,187 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">科目汇总表</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">结算中心</a>
+ <a><cite>科目汇总表</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form" lay-filter="subjectday-search-form">
+ <input type="hidden" id="subjectday-hidden-maxdate" th:value="${maxdate}" />
+ <div class="layui-form-item" style="margin-bottom: 0;">
+ <div class="layui-inline">
+ <label class="layui-form-label">记账日期</label>
+ <div class="layui-input-inline">
+ <input type="text" name="startdate" id="subjectday-search-startdate" placeholder="起始日期" th:value="${maxdate}"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ <div class="layui-form-mid">-</div>
+ <div class="layui-input-inline">
+ <input type="text" name="enddate" id="subjectday-search-enddate" placeholder="截止日期" th:value="${maxdate}"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <div class="layui-input-block" style="margin-left: 0;">
+ <input type="checkbox" name="nodealshow" id="subjectday-search-nodealshow" lay-skin="primary" title="显示未交易科目"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <button id="subjectday-search-btn" class="layui-btn icon-btn" data-type="search"><i
+ class="layui-icon"></i>搜索
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <!--<div class="layui-btn-group">-->
+ <!--<button class="layui-btn" id="btn-fold-subjectday">仅看一级</button>-->
+ <!--<button class="layui-btn" id="btn-expand-subjectday">查看二级</button>-->
+ <!--</div>-->
+ <table class="layui-table" id="subjectDayTable" lay-filter="subjectDayTable-filter"></table>
+ </div>
+</div>
+
+<script type="text/html" id="subjectday-toolbar">
+ <div class="layui-btn-container">
+ <button class="layui-btn layui-btn-sm" id="btn-fold-subjectday" lay-event="subjectdayShowFold">仅看一级</button>
+ <button class="layui-btn layui-btn-sm" id="btn-expand-subjectday" lay-event="subjectdayExpandAll">查看二级</button>
+ </div>
+</script>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element', 'laydate', 'treetable'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ var laydate = layui.laydate;
+ var treetable = layui.treetable;
+
+ form.render("checkbox");
+ laydate.render({
+ elem: '#subjectday-search-startdate',
+ max: $("#subjectday-hidden-maxdate").val()
+ });
+ laydate.render({
+ elem: '#subjectday-search-enddate',
+ max: $("#subjectday-hidden-maxdate").val()
+ });
+
+ var renderTable = function (obj) {
+ layer.load(2);
+ treetable.render({
+ id: 'SubjectDayReport',
+ title: '科目汇总表',
+ treeColIndex: 0,
+ treeSpid: '-1',
+ treeIdName: 'subjno',
+ treePidName: 'fsubjno',
+ treeDefaultClose: false,
+ treeLinkage: false,
+ elem: '#subjectDayTable',
+ url: '[[@{/report/subjectdaylist}]]',
+ page: false,
+ where: obj,
+ showicon: false,
+ toolbar:'#subjectday-toolbar',
+ cols: [
+ [
+ {field: 'subjno', title: '科目号', align: 'left', rowspan: 2},
+ {
+ field: 'subjname', title: '科目名称', align: 'left', rowspan: 2, templet: function (d) {
+ if (d.subjlevel == 1) {
+ return '<span>' + d.subjname + '</span>';
+ } else {
+ return '<span> ' + d.subjname + '</span>';
+ }
+
+ }
+ },
+ {align: 'center', title: '期初余额', colspan: 2},
+ {align: 'center', title: '本期发生额', colspan: 2},
+ {align: 'center', title: '期末余额', colspan: 2}
+ ], [
+ {field: 'lastdaydrbal', title: '借方', align: 'center'},
+ {field: 'lastdaycrbal', title: '贷方', align: 'center'},
+ {field: 'dramt', title: '借方', align: 'center'},
+ {field: 'cramt', title: '贷方', align: 'center'},
+ {field: 'drbal', title: '借方', align: 'center'},
+ {field: 'crbal', title: '贷方', align: 'center'}
+ ]
+ ],
+ // cols: [
+ // [
+ // {field: 'subjno', title: '科目号', align: 'left'},
+ // {
+ // field: 'subjname', title: '科目名称', align: 'left', templet: function (d) {
+ // if (d.subjlevel == 1) {
+ // return '<span>' + d.subjname + '</span>';
+ // } else {
+ // return '<span> ' + d.subjname + '</span>';
+ // }
+ //
+ // }
+ // },
+ // {field: 'lastdaydrbal', title: '期初余额(借方)', align: 'center'},
+ // {field: 'lastdaycrbal', title: '期初余额(贷方)', align: 'center'},
+ // {field: 'dramt', title: '本期发生额(借方)', align: 'center'},
+ // {field: 'cramt', title: '本期发生额(贷方)', align: 'center'},
+ // {field: 'drbal', title: '期末余额(借方)', align: 'center'},
+ // {field: 'crbal', title: '期末余额(贷方)', align: 'center'}
+ // ]
+ // ],
+ done: function (res, curr, count) {
+ console.log(res);
+ layer.closeAll('loading');
+ }
+ });
+ }
+ renderTable({
+ startdate: $("#subjectday-search-startdate").val(),
+ enddate: $("#subjectday-search-enddate").val(),
+ nodealshow: false
+ });
+
+ $('#btn-expand-subjectday').click(function () {
+ treetable.expandAll('#subjectDayTable');
+ });
+
+ $('#btn-fold-subjectday').click(function () {
+ treetable.foldAll('#subjectDayTable');
+ });
+
+ $('#subjectday-search-btn').click(function () {
+ var startdate = $("#subjectday-search-startdate").val();
+ var enddate = $("#subjectday-search-enddate").val();
+ var nodealshow = $("#subjectday-search-nodealshow").is(':checked');
+ if (null == startdate || "" == $.trim(startdate)) {
+ layer.msg('请选择起始日期', {icon: 2, time: 1500});
+ return;
+ }
+ if (null == enddate || "" == $.trim(enddate)) {
+ layer.msg('请选择截止日期', {icon: 2, time: 1500});
+ return;
+ }
+ renderTable({
+ startdate: startdate,
+ enddate: enddate,
+ nodealshow: nodealshow
+ });
+ });
+
+ table.on('toolbar(subjectDayTable-filter)', function(obj){
+ switch(obj.event){
+ case 'subjectdayShowFold':
+ treetable.foldAll('#subjectDayTable');
+ break;
+ case 'subjectdayExpandAll':
+ treetable.expandAll('#subjectDayTable');
+ break;
+ }
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/report/subjectdetail.html b/payapi/src/main/resources/templates/system/report/subjectdetail.html
new file mode 100644
index 0000000..7776301
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/report/subjectdetail.html
@@ -0,0 +1,174 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">科目明细账</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">结算中心</a>
+ <a><cite>科目明细账</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form" lay-filter="subjectdetail-search-form">
+ <input type="hidden" id="subjectdetail-hidden-maxdate" th:value="${maxdate}" />
+ <div class="layui-form-item" style="margin-bottom: 0;">
+ <div class="layui-inline">
+ <label class="layui-form-label">结算日期</label>
+ <div class="layui-input-inline">
+ <input type="text" name="startdate" id="subjectdetail-search-startdate" placeholder="起始日期" th:value="${maxdate}"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ <div class="layui-form-mid">-</div>
+ <div class="layui-input-inline">
+ <input type="text" name="enddate" id="subjectdetail-search-enddate" placeholder="截止日期" th:value="${maxdate}"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">选择科目</label>
+ <div class="layui-input-block">
+ <input type="text" name="subjno" id="subjectdetail-search-subjno" placeholder="选择科目" lay-filter="subjectdetail-search-subjno-filter"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <button id="subjectdetail-search-btn" class="layui-btn icon-btn" data-type="search"><i
+ class="layui-icon"></i>搜索
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <table class="layui-table" id="subjectDetailTable" lay-filter="subjectDetailTable-filter"></table>
+ </div>
+</div>
+
+<script type="text/html" id="subjectdetail-toolbar">
+ <div class="layui-btn-container">
+
+ </div>
+</script>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element', 'laydate', 'treeSelect'], function () {
+ var $ = layui.jquery;
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ var laydate = layui.laydate;
+ var treeSelect = layui.treeSelect;
+
+ form.render("select");
+ laydate.render({
+ elem: '#subjectdetail-search-startdate',
+ max: $("#subjectdetail-hidden-maxdate").val()
+ });
+ laydate.render({
+ elem: '#subjectdetail-search-enddate',
+ max: $("#subjectdetail-hidden-maxdate").val()
+ });
+
+ treeSelect.render({
+ elem: '#subjectdetail-search-subjno',
+ data: '[[@{/report/subjectselecttree}]]',
+ type: 'get',
+ placeholder: '选择科目',
+ search: false,
+ style: {
+ folder: {
+ enable: false
+ },
+ line: {
+ enable: true
+ }
+ },
+ // 点击回调
+ click: function (d) {
+ var treeNode = d.current;
+ console.log(treeNode);
+ if(treeNode.accno == '0'){
+ layer.msg("请选择末级科目", {icon: 2, time:1500});
+ $("#subjectdetail-search-subjno").val("");
+ treeSelect.revokeNode('subjectdetail-search-subjno-filter');
+ return false;
+ }
+ return true;
+ },
+ success: function (d) {
+ console.log(d); // 加载完成后的回调函数
+ }
+ });
+
+ // 渲染表格
+ var renderTable = function(obj){
+ table.render({
+ id: 'SubjectDetailReport',
+ title: '科目明细账',
+ elem: '#subjectDetailTable',
+ url: '[[@{/report/subjectdetaillist}]]',
+ page: true,
+ where: obj,
+ toolbar: '#subjectdetail-toolbar',
+ cols: [
+ [
+ {
+ field: 'voucherdate', title: '结算日期', align: 'center', width: 120, sort: true, templet: function (d) {
+ return dateFormat('' + d.voucherdate);
+ }
+ },
+ {field: 'voucherno', title: '凭证号', align: 'center', width: 80, sort: true},
+ {field: 'summary', title: '摘要', align: 'center'},
+ {field: 'dramt', title: '借方发生额', align: 'center'},
+ {field: 'cramt', title: '贷方发生额', align: 'center'},
+ {
+ field: 'balflag', title: '方向', align: 'center', width: 80, templet: function (d) {
+ if (d.balflag == 1) {
+ return '借';
+ } else {
+ return '贷';
+ }
+ }
+ },
+ {field: 'balance', title: '余额', align: 'center'},
+ {field: 'oppname', title: '对方户名', align: 'center'}
+ ]
+ ]
+ });
+ }
+ renderTable({
+ startdate: $('#subjectdetail-search-startdate').val(),
+ enddate: $('#subjectdetail-search-enddate').val(),
+ subjno: null
+ })
+
+
+ $('#subjectdetail-search-btn').click(function () {
+ var startdate = $("#subjectdetail-search-startdate").val();
+ var enddate = $("#subjectdetail-search-enddate").val();
+ var subjno = $("#subjectdetail-search-subjno").val();
+ if (null == startdate || "" == $.trim(startdate)) {
+ layer.msg('请选择起始日期', {icon: 2, time: 1500});
+ return;
+ }
+ if (null == enddate || "" == $.trim(enddate)) {
+ layer.msg('请选择截止日期', {icon: 2, time: 1500});
+ return;
+ }
+ if (null == subjno || "" == $.trim(subjno)) {
+ layer.msg('请选择科目', {icon: 2, time: 1500});
+ return;
+ }
+ //数据重载
+ renderTable({
+ startdate: startdate,
+ enddate: enddate,
+ subjno: subjno
+ })
+ });
+
+ table.on('toolbar(subjectDetailTable-filter)', function(obj){
+ //
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/role/form.html b/payapi/src/main/resources/templates/system/role/form.html
new file mode 100755
index 0000000..607c1f3
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/role/form.html
@@ -0,0 +1,73 @@
+<!-- operator表单弹窗 -->
+<form id="form" lay-filter="form" class="layui-form model-form">
+ <input name="roleId" id="roleId" type="hidden"/>
+ <div class="layui-form-item">
+ <label class="layui-form-label">角色名称</label>
+ <div class="layui-input-block">
+ <input name="roleName" placeholder="请输入角色名称" type="text" class="layui-input" maxlength="20"
+ lay-verify="required|roleName" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">角色描述</label>
+ <div class="layui-input-block">
+ <textarea name="roleDesc" placeholder="请输入描述" class="layui-textarea"></textarea>
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="form-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+<script>
+ layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ var url = '[[@{/role/add}]]';
+ // 回显user数据
+ var func = admin.getTempData('t_func');
+ if (func) {
+ $('input[name="roleId"]').attr('readonly', 'readonly');
+ form.val('form', func);
+ }
+ // 表单提交事件
+ form.on('submit(form-submit)', function (data) {
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : url,
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'X-CSRF-TOKEN':token,
+ },
+ data : JSON.stringify(data.field),
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function() {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/role/func.html b/payapi/src/main/resources/templates/system/role/func.html
new file mode 100755
index 0000000..917c8d9
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/role/func.html
@@ -0,0 +1,89 @@
+<div style="padding: 0 20px">
+ <div class="layui-form-item" style="max-height: 490px;overflow: auto;">
+ <ul id="funclist" class="ztree"></ul>
+ </div>
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="form-submit" id="submitbtn">保存</button>
+ </div>
+</div>
+<script>
+ layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ var func = admin.getTempData('roleId');
+ let initTree = function (nodes) {
+ let menuSetting = {
+ view: {
+ dblClickExpand: true,
+ showLine: true,
+ showIcon: false
+ },
+ check: {
+ enable: true,
+ },
+ data: {
+ simpleData: {
+ enable: true
+ }
+ }
+ };
+ $.fn.zTree.init($("#funclist"), menuSetting, nodes);
+ }
+ admin.dgo('[[@{/role/func}]]', {
+ roleId: func,
+ }, function (data) {
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ initTree(data.node);
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ }, function (ret) {
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ $("#submitbtn").on('click', function (e) {
+ let ids = [];
+ let treeObj = $.fn.zTree.getZTreeObj("funclist");
+ let nodes = treeObj.getCheckedNodes(true);
+ for (let i = 0; i < nodes.length; i++) {
+
+ ids.push(nodes[i].id);//存功能ID
+ }
+ if (ids.length < 1) {
+ return;
+ }
+ let idStr = ids.toString();
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/role/addfunc}]]', {
+ roleId: func,
+ funcs: idStr,
+ _csrf: token,
+ }, function (data) {
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ }, function (ret) {
+ console.log(ret);
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ })
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/role/index.html b/payapi/src/main/resources/templates/system/role/index.html
new file mode 100644
index 0000000..535ecf3
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/role/index.html
@@ -0,0 +1,121 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">角色管理</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">系统中心</a>
+ <a><cite>角色管理</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-value" class="layui-input search-input" type="text" placeholder="输入角色名称"/> 
+ <button id="btn-search-role" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-add-role" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加角色</button>
+ </div>
+ <table class="layui-table" id="roletable" lay-filter="roletable"></table>
+ </div>
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let table = layui.table;
+ let admin = layui.admin;
+ form.render('select');
+
+ // 渲染表格
+ table.render({
+ elem: '#roletable',
+ url: '[[@{/role/list}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'roleName', title: '角色名称', width: 200,fixed: 'left', sort: true},
+ {field: 'roleCode', title: '角色代码', width: 200,fixed: 'left', sort: true},
+ {field: 'roleDesc', title: '描述'},
+ {
+ field: 'roleId', align: 'center', title: '操作', width: 300, fixed: 'right', templet: function (item) {
+ let html = ' <a class="layui-btn layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ' +
+ ' <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="addfunc"><i class="layui-icon layui-icon-set-sm"></i>分配功能</a> ';
+ if(item.editflag===1){
+ html +='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+ }
+ return html;
+ }
+ }
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#btn-search-role').click(function () {
+ let key = $('#search-value').val();
+ table.reload('roletable', {where: {searchkey: key}, page: {curr: 1}});
+ });
+ $('#btn-add-role').click(function () {
+ showModel();
+ });
+ let showModel = function (data) {
+ let title = data ? '编辑角色' : '添加角色';
+ admin.putTempData('t_func', data);
+ admin.popupCenter({
+ title: title,
+ path: '[[@{/role/loadadd}]]',
+ finish: function () {
+ table.reload('roletable', {});
+ }
+ });
+ };
+ let showFuncModel = function (data) {
+ let title = '分配功能';
+ admin.putTempData('roleId', data.roleId);
+ admin.popupCenter({
+ title: title,
+ area:['400px','600px'],
+ path: '[[@{/role/loadfunc}]]'
+ });
+ };
+ // 工具条点击事件
+ table.on('tool(roletable)', function (obj) {
+ let data = obj.data;
+ let layEvent = obj.event;
+ console.log(data);
+ if (layEvent === 'edit') {
+ showModel(data);
+ } else if (layEvent === 'addfunc') {
+ showFuncModel(data);
+ } else if (layEvent === 'del') {
+ showDelete(data);
+ }
+ });
+ let showDelete = function (data) {
+ layer.confirm('用户分配的该角色都将被删除,确定删除吗?', function (i) {
+ layer.close(i);
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/role/del}]]', {
+ roleid: data.roleId,
+ _csrf: token
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('roletable', {});
+ }, function (ret) {
+ console.log(ret);
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ });
+ }
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/shop/config.html b/payapi/src/main/resources/templates/system/shop/config.html
new file mode 100644
index 0000000..56400e7
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/shop/config.html
@@ -0,0 +1,281 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">商户支付能力管理</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">商户中心</a>
+ <a><cite>商户支付能力管理</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-row">
+ <div class="layui-col-xs5 layui-col-md3">
+ <div class="layui-card">
+ <div class="layui-card-header">
+ 商户树<span style="font-size: 12px;">(双击结算商户查询)</span>
+ </div>
+ <div class="layui-card-body layui-show">
+ <ul id="shopacctree" class="ztree" style="background-color: #D7F9F7;max-height: 560px;overflow:auto;"></ul>
+ </div>
+ </div>
+ </div>
+ <div class="layui-col-xs7 layui-col-md9">
+ <div class="layui-card" style="min-height: 600px;">
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 支付方式:
+ <select id="search-sourceType">
+ <option value=""> 全部</option>
+ <option th:each="pt:${paytypelist}" th:value="${pt.sourceType}"
+ th:text="${pt.paydesc}"></option>
+ </select> 
+ <button id="btn-search-shoppaytype" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-add-shoppaytype" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>新
+ 增
+ </button>
+ <button id="btn-reset-shoppaytype" class="layui-btn layui-btn-primary" data-type="reset"><i
+ class="layui-icon"></i>清 空
+ </button>
+ </div>
+ <table class="layui-table" id="shopPaytypeTable" lay-filter="shopPaytypeTable-filter"></table>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="shop-consumeenable-tpl-state">
+ <input type="checkbox" lay-filter="shop-consumeenable-tpl-state" value="{{d.shopaccno}}" def-sourceType="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
+ {{d.consumeEnable==true?'checked':''}}/>
+</script>
+<script type="text/html" id="shop-anonymousenable-tpl-state">
+ {{# if(d.consumeEnable == true ){ }}
+ <input type="checkbox" lay-filter="shop-anonymousenable-tpl-state" value="{{d.shopaccno}}" def-sourceType="{{d.paytype}}" lay-skin="switch"
+ lay-text="启用|关闭"
+ {{(d.consumeEnable==true && d.anonymousEnable==true)?'checked':''}}/>
+ {{# }else{ }}
+ <input type="checkbox" lay-filter="shop-anonymousenable-tpl-state" value="{{d.shopaccno}}" def-sourceType="{{d.paytype}}" lay-skin="switch"
+ lay-text="启用|关闭"
+ {{(d.consumeEnable==true && d.anonymousEnable==true)?'checked':''}} disabled/>
+ {{# } }}
+</script>
+<script type="text/html" id="shop-reverseenable-tpl-state">
+ <input type="checkbox" lay-filter="shop-reverseenable-tpl-state" value="{{d.shopaccno}}" def-sourceType="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
+ {{d.reverseEnable==true?'checked':''}}/>
+</script>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ form.render('select');
+ var initTree = function (nodes) {
+ var menuSetting = {
+ view: {
+ dblClickExpand: false,
+ showLine: true,
+ showIcon: true,
+ selectedMulti: false
+ },
+ data: {
+ simpleData: {
+ enable: true
+ }
+ },
+ callback: {
+ onDblClick: ondblclick
+ }
+ };
+ $.fn.zTree.init($("#shopacctree"), menuSetting, nodes);
+ }
+ admin.dgo('[[@{/shop/shopacctree}]]', {}, function (data) {
+ if (data.code === 200) {
+ initTree(data.data);
+ } else if (data.code === 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ } else {
+ layer.msg(data.msg, {icon: 2, time: 2000});
+ }
+ }, function (ret) {
+ console.log(ret);
+ layer.msg('查询商户树失败了,请稍后再试', {icon: 2});
+ });
+
+ $('#btn-reset-shoppaytype').click(function () {
+ $("#search-sourceType").val("");
+ form.render('select');
+ });
+ $('#btn-search-shoppaytype').click(function(){
+ var ptype = $("#search-sourceType").val();
+ table.reload('shopPaytypeTable', {where: {paytype: ptype, shopaccno:""}, page: {curr: 1}});
+ });
+
+ function ondblclick(event, treeId, treeNode) {
+ if (treeNode.shoptype !== 1 || ""===treeNode.shopaccno) {
+ layer.msg("请选择结算商户查询", {icon: 2, time: 1000});
+ return;
+ }
+ var ptype = $("#search-sourceType").val();
+ table.reload('shopPaytypeTable', {where: {paytype: ptype, shopaccno: treeNode.shopaccno}, page: {curr: 1}});
+ }
+
+ // 渲染表格
+ table.render({
+ elem: '#shopPaytypeTable',
+ url: '[[@{/shop/shoppaytypelist}]]',
+ page: true,
+ width: 1010,
+ cols: [
+ [
+ {field: 'shopaccno', title: '商户账号', width: 150, align: 'center', fixed: 'left', sort: true},
+ {field: 'shopname', title: '商户名称', align: 'center', fixed: 'left', sort: true},
+ {field: 'paydesc', title: '支付方式', align: 'center', sort: true},
+ {
+ field: 'consumeEnable',
+ title: '能否消费',
+ align: 'center',
+ width: 110,
+ templet: '#shop-consumeenable-tpl-state',
+ sort: true
+ },
+ {
+ field: 'anonymousEnable',
+ title: '匿名消费',
+ align: 'center',
+ width: 110,
+ templet: '#shop-anonymousenable-tpl-state',
+ sort: true
+ },
+ {
+ field: 'reverseEnable',
+ title: '能否冲正',
+ align: 'center',
+ width: 110,
+ templet: '#shop-reverseenable-tpl-state',
+ sort: true
+ },
+ {align: 'center', title: '操作', width: 90, fixed: 'right', templet: function (item) {
+ if (item.paytype !== 'balance') {
+ return '<a class="layui-btn layui-btn-xs" lay-event="config">配置</a>';
+ }
+ return '<span style="font-size: 12px;color: #D3D4D3;">无配置</span>';
+ }
+ }
+ ]
+ ]
+ });
+
+ // 修改总状态
+ form.on('switch(shop-consumeenable-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/shop/updatepaytypestat}]]', {
+ shopaccno: obj.elem.value,
+ paytype: $(obj.elem).attr("def-sourceType"),
+ optype: "consume",
+ state: obj.elem.checked ? 'yes' : 'no',
+ _csrf: token
+ }, function (data) {
+ if (data.code === 200) {
+ layer.msg(data.msg, {icon: 1, time:1000});
+ table.reload('shopPaytypeTable');
+ } else if (data.code === 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ }
+ },function () {
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ });
+ });
+
+ form.on('switch(shop-anonymousenable-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ updateShopPaytypeState(obj, "anonymous", token);
+ });
+
+ form.on('switch(shop-reverseenable-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ updateShopPaytypeState(obj, "reverse", token);
+ });
+
+ function updateShopPaytypeState(obj, optype, token) {
+ admin.go('[[@{/shop/updatepaytypestat}]]', {
+ shopaccno: obj.elem.value,
+ paytype: $(obj.elem).attr("def-sourceType"),
+ state: obj.elem.checked ? 'yes' : 'no',
+ optype: optype,
+ _csrf: token
+ }, function (data) {
+ if (data.code === 200) {
+ layer.msg(data.msg, {icon: 1, time: 1000});
+ } else if (data.code === 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ }
+ }, function () {
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ });
+ }
+
+ $('#btn-add-shoppaytype').click(function () {
+ var ztree = $.fn.zTree.getZTreeObj("shopacctree");
+ var shopNodes = ztree.getSelectedNodes();
+ if (undefined === shopNodes || null == shopNodes || shopNodes.length < 1) {
+ layer.msg("请先选中左侧的一个结算商户", {icon: 2, time: 1000});
+ return;
+ }
+ var shopNode = shopNodes[0]; //选中商户
+ if(shopNode.shoptype!==1 || ""===shopNode.shopaccno){
+ layer.msg("请选择结算商户!", {icon: 2, time: 1000});
+ return;
+ }
+ admin.putTempData('t_addshoppaytype', {
+ shopaccno:shopNode.shopaccno,
+ shopname: shopNode.name.slice(shopNode.id.length+1) //23_第一食堂,截取商户名称
+ });
+ admin.popupCenter({
+ title: "新增支付能力",
+ path: '[[@{/shop/load4addpaytype}]]',
+ finish: function () {
+ table.reload('shopPaytypeTable', {
+ where: {paytype: "", shopaccno: shopNode.shopaccno},
+ page: {curr: 1}
+ });
+ }
+ });
+ });
+
+ //监听单元格
+ table.on('tool(shopPaytypeTable-filter)', function (obj) {
+ var data = obj.data;
+ if ('config' === obj.event) {
+ admin.popupCenter({
+ title: "配置参数【" + data.shopname + "_" + data.paydesc + "】",
+ path: '[[@{/shop/load4paytypepara}]]?shopaccno=' + data.shopaccno + '&paytype=' + data.paytype,
+ area: '800px',
+ finish: function () {
+ table.reload('shopPaytypeTable');
+ }
+ });
+ }
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/shop/configform.html b/payapi/src/main/resources/templates/system/shop/configform.html
new file mode 100644
index 0000000..e0bd620
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/shop/configform.html
@@ -0,0 +1,101 @@
+<form id="shop-sourceType-form" lay-filter="shop-sourceType-form" class="layui-form model-form">
+ <div class="layui-form-item">
+ <label class="layui-form-label">商户账号</label>
+ <div class="layui-input-block">
+ <input name="shopaccno" class="layui-input" readonly="readonly" lay-verify="required"/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">商户名称</label>
+ <div class="layui-input-block">
+ <input name="shopname" class="layui-input" readonly="readonly"/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">支付方式</label>
+ <div class="layui-input-block">
+ <select name="paytype" lay-verify="required">
+ <option th:each="pt:${paytypelist}" th:value="${pt.sourceType}"
+ th:text="${pt.paydesc}"></option>
+ </select> 
+ </div>
+ </div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">能否消费</label>
+ <div class="layui-input-block">
+ <input name="consumeEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+ </div>
+ </div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">匿名消费</label>
+ <div class="layui-input-block">
+ <input name="anonymousEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+ </div>
+ </div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">能否冲正</label>
+ <div class="layui-input-block">
+ <input name="reverseEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="form-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+
+<script>
+ layui.use(['layer', 'admin', 'form'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ form.render('checkbox');
+ form.render('select');
+ // 回显数据
+ var shop = admin.getTempData('t_addshoppaytype');
+ if (shop) {
+ form.val('shop-sourceType-form', {
+ shopaccno: shop.shopaccno,
+ shopname: shop.shopname
+ });
+ }
+
+ // 表单提交事件
+ form.on('submit(form-submit)', function (data) {
+ layer.load(2);
+ var vdata = data.field;
+ vdata["_csrf"] = $("meta[name='_csrf_token']").attr("value");
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : '[[@{/shop/addshoppaytype}]]',
+ data : vdata,
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:', result);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function() {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/shop/configpara.html b/payapi/src/main/resources/templates/system/shop/configpara.html
new file mode 100644
index 0000000..6e77151
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/shop/configpara.html
@@ -0,0 +1,79 @@
+<form id="shop-sourceType-config-form" lay-filter="shop-sourceType-config-form" class="layui-form model-form">
+ <div class="layui-form-item" style="display: none;">
+ <input type="hidden" class="layui-input" id="hid_shopaccno" th:value="${shopaccno}"/>
+ <input type="hidden" class="layui-input" id="hid_paytype" th:value="${paytype}"/>
+ </div>
+
+ <div class="layui-form-item" style="text-align: center;" th:if="${configlist.size()} le 0">
+ 无配置项
+ </div>
+
+ <div class="layui-form-item" th:if="${configlist.size()} gt 0" th:each="config:${configlist}">
+ <div class="layui-input-block" style="margin:0;display: inline;float: left;width: 20%;">
+ <label class="layui-form-label" style="float: right;width: 100%;" th:text="${config.configid}">参数名</label>
+ </div>
+ <div class="layui-input-block" style="margin:0;display: inline;float: right;width: 80%;">
+ <input type="text" th:name="${config.configid}" class="layui-input" th:value="${config.configValue}" autocomplete="off"/>
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="form-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+
+<script>
+ layui.use(['layer', 'admin', 'form'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ // 表单提交事件
+ form.on('submit(form-submit)', function (data) {
+ layer.load(2);
+ var vdata = data.field;
+ if(JSON.stringify(vdata)=="{}"){
+ layer.closeAll('loading');
+ admin.closePopupCenter();
+ return; //无配置项,直接关闭
+ }
+ var token = $("meta[name='_csrf_token']").attr("value");
+ vdata["hid_paytype"] = $("#hid_paytype").val();
+ vdata["hid_shopaccno"] = $("#hid_shopaccno").val();
+ console.log('addShopPaytype:', vdata);
+ debugger
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : '[[@{/shop/addpaytypepara}]]',
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'X-CSRF-TOKEN':token,
+ },
+ data : JSON.stringify(vdata),
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function() {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/shop/index.html b/payapi/src/main/resources/templates/system/shop/index.html
new file mode 100644
index 0000000..5e441ae
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/shop/index.html
@@ -0,0 +1,384 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">商户管理</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">商户中心</a>
+ <a><cite>商户管理</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-row">
+ <div class="layui-col-xs5 layui-col-md3">
+ <div class="layui-card">
+ <div class="layui-card-body layui-show">
+ <ul id="shoptree" class="ztree" style="background-color: #D7F9F7;max-height: 560px;overflow:auto;"></ul>
+ </div>
+ </div>
+ </div>
+ <div class="layui-col-xs7 layui-col-md9">
+ <div class="layui-card" style="min-height: 600px;">
+ <div id="shop-info" class="layui-form toolbar" lay-filter="shop-info-form" style="display: none;">
+ <div class="layui-card-header">商户基本信息</div>
+ <div class="layui-card-body">
+ <div class="layui-form-item">
+ <div class="layui-inline" style="width: 40%;">
+ <label class="layui-form-label">商户号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="shopid" class="layui-input"
+ readonly="readonly"/>
+ </div>
+ </div>
+ <div class="layui-inline" style="width: 55%;">
+ <label class="layui-form-label">商户名</label>
+ <div class="layui-input-inline" style="width: 65%;">
+ <input type="text" name="shopname" autocomplete="off"
+ class="layui-input" maxlength="30" lay-verify="required"/>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline" style="width: 40%;">
+ <label class="layui-form-label">上级商户号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="fshopid" id="fshopid" class="layui-input" autocomplete="off"
+ lay-verify="required|number"/>
+ </div>
+ </div>
+ <div class="layui-inline" style="width: 55%;">
+ <label class="layui-form-label">商户账号</label>
+ <div class="layui-input-inline" style="width: 65%;">
+ <input type="text" name="shopaccno" autocomplete="off"
+ class="layui-input" readonly="readonly"/>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label" style="color: red;">商户类型</label>
+ <div class="layui-input-inline">
+ <select name="shoptype" id="shoptype" lay-filter="shoptype-filter" lay-verify="required">
+ <option value="0">商户组</option>
+ <option value="1">结算商户</option>
+ </select>
+ </div>
+ <div class="layui-form-mid layui-word-aux">
+ 注意:商户组无商户账号,且能创建下级商户。结算商户是叶子商户,会创建商户账号。保存后无法修改!!!
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline" style="width: 40%;">
+ <label class="layui-form-label">邮编</label>
+ <div class="layui-input-inline">
+ <input type="text" name="zipcode" class="layui-input" autocomplete="off" />
+ </div>
+ </div>
+ <div class="layui-inline" style="width: 55%;">
+ <label class="layui-form-label">地址</label>
+ <div class="layui-input-inline" style="width: 65%;">
+ <input type="text" name="addr" class="layui-input" maxlength="40" autocomplete="off" />
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-header">商户联系人信息</div>
+ <div class="layui-card-body">
+ <div class="layui-form-item">
+ <div class="layui-inline" style="width: 40%;">
+ <label class="layui-form-label">姓名</label>
+ <div class="layui-input-inline">
+ <input type="text" name="contactman" class="layui-input" autocomplete="off"/>
+ </div>
+ </div>
+ <div class="layui-inline" style="width: 55%;">
+ <label class="layui-form-label">手机号</label>
+ <div class="layui-input-inline" style="width: 65%;">
+ <input type="text" name="mobile" class="layui-input" maxlength="20" autocomplete="off"
+ lay-verify="mobile" />
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline" style="width: 40%;">
+ <label class="layui-form-label">证件类型</label>
+ <div class="layui-input-inline">
+ <select name="idtype" lay-filter="idtype-filter">
+ <option value="1">身份证</option>
+ <option value="2">护照</option>
+ <option value="3">驾照</option>
+ <option value="4">港澳通行证</option>
+ <option value="5">学生证</option>
+ <option value="9">其他</option>
+ </select>
+ </div>
+ </div>
+ <div class="layui-inline" style="width: 55%;">
+ <label class="layui-form-label">证件号</label>
+ <div class="layui-input-inline" style="width: 65%;">
+ <input type="text" name="idno" class="layui-input" maxlength="20" autocomplete="off"/>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline" style="width: 40%;">
+ <label class="layui-form-label">邮箱</label>
+ <div class="layui-input-inline">
+ <input type="text" name="email" class="layui-input" autocomplete="off" lay-verify="swEmail"/>
+ </div>
+ </div>
+ <div class="layui-inline" style="width: 55%;">
+ <label class="layui-form-label">电话</label>
+ <div class="layui-input-inline" style="width: 65%;">
+ <input type="text" name="tel" class="layui-input" maxlength="20" autocomplete="off" />
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="padding-bottom: 20px;text-align: center;">
+ <button class="layui-btn" lay-filter="form-submit-shop-btn" lay-submit id="submitbtn-shop-btn">保存</button>
+ <button class="layui-btn layui-btn-primary" type="button" id="cancelbtn">取消</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ form.render('select');
+ form.verify({
+ "mobile": function (e) {
+ if (null != e && e.length > 0 && !(/^1\d{10}$/.test(e))) {
+ return "请输入正确的手机号";
+ }
+ },
+ "swEmail": function (e) {
+ if (null != e && e.length > 0 && !(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(e))) {
+ return "邮箱格式不正确";
+ }
+ }
+ });
+
+ var initTree = function (nodes) {
+ var menuSetting = {
+ view: {
+ dblClickExpand: false,
+ showLine: true,
+ showIcon: true,
+ selectedMulti: false,
+ addHoverDom: addHoverDom,
+ removeHoverDom: removeHoverDom
+ },
+ data: {
+ simpleData: {
+ enable: true
+ }
+ },
+ edit: {
+ enable: true,
+ showRemoveBtn: true,
+ removeTitle: "删除商户",
+ showRenameBtn: false,
+ drag: {
+ isCopy: false,
+ isMove: false
+ }
+ },
+ callback: {
+ beforeRemove: beforeRemove,
+ onDblClick: ondblclick
+ }
+ };
+ $.fn.zTree.init($("#shoptree"), menuSetting, nodes);
+ }
+
+ function beforeRemove(treeId, treeNode) {
+ var zTree = $.fn.zTree.getZTreeObj("shoptree");
+ if (treeNode.isParent) {
+ var childrenNodes = treeNode.children;
+ if (childrenNodes && childrenNodes.length != 0) {
+ layer.msg("请先删除下级商户", {icon: 2, time: 2000});
+ return false;
+ }
+ }
+ zTree.selectNode(treeNode);
+ var flag = false;
+ if (confirm("确认删除商户【" + treeNode.name + "】吗?")) {
+ layer.load(2);
+ $.ajax({
+ type: "POST",
+ dataType: "json",
+ url: '[[@{/shop/deleteshop}]]',
+ async: false, //必须同步
+ data: {
+ shopid: treeNode.id,
+ _csrf: $("meta[name='_csrf_token']").attr("value")
+ },
+ success: function (result) {
+ console.log(result);
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ flag = true;
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error: function () {
+ console.log(ret);
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ }
+ return flag;
+ }
+
+ function removeHoverDom(treeId, treeNode) {
+ $("#addBtn_" + treeNode.tId).unbind().remove();
+ }
+
+ $('#cancelbtn').click(function () {
+ $("#shop-info").hide();
+ });
+
+ form.on('submit(form-submit-shop-btn)', function (data) {
+ layer.load(2);
+ var vdata = data.field;
+ vdata["_csrf"] = $("meta[name='_csrf_token']").attr("value");
+ $.ajax({
+ type: "POST",
+ dataType: "json",
+ url: '[[@{/shop/saveorupdate}]]',
+ data: vdata,
+ success: function (result) {
+ layer.closeAll('loading');
+ debugger
+ if (result.code == 200) {
+ var zTree = $.fn.zTree.getZTreeObj("shoptree");
+ var treeNode = zTree.getNodeByParam("id", '' + result.shop.shopid, null);
+ if (undefined != treeNode && null != treeNode) {
+ treeNode.id = ''+result.shop.shopid;
+ treeNode.pId = '' + result.shop.fshopid;
+ treeNode.name = '' + result.shop.shopid + '_' + result.shop.shopname;
+ zTree.updateNode(treeNode); //修改节点
+ } else {
+ var ftreeNode = zTree.getNodeByParam("id", '' + result.shop.fshopid, null);
+ var newNode = {
+ id: '' + result.shop.shopid,
+ pId: '' + result.shop.fshopid,
+ name: '' + result.shop.shopid + '_' + result.shop.shopname,
+ shoptype: result.shop.shoptype
+ }
+ if (result.shop.shoptype == 1) {
+ newNode["iconSkin"] = "pIcon02";
+ } else {
+ newNode["iconSkin"] = "pIcon01";
+ }
+ zTree.addNodes(ftreeNode, newNode); //新加树节点
+ }
+ layer.msg(result.msg, {icon: 1});
+ $("#shop-info").hide();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error: function () {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ });
+
+ function addHoverDom(treeId, treeNode) {
+ if (treeNode.shoptype == 0) {
+ var sObj = $("#" + treeNode.tId + "_span");
+ if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0) return;
+ var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
+ + "' title='新增下级商户' onfocus='this.blur();'></span>";
+ sObj.after(addStr);
+ var btn = $("#addBtn_" + treeNode.tId);
+ if (btn) btn.bind("click", function () {
+ form.val("shop-info-form",{
+ "shopid":"0",
+ "shopname": "",
+ "shopaccno":"",
+ "fshopid":treeNode.id,
+ "shoptype":"1",
+ "zipcode":"",
+ "addr":"",
+ "contactman":"",
+ "idtype":"1",
+ "idno":"",
+ "mobile":"",
+ "email":"",
+ "tel":""
+ });
+ $("#fshopid").attr("readonly", "readonly");
+ $("#shoptype").removeAttr("disabled");
+ form.render('select');
+ $("#submitbtn-shop-btn").text("新增");
+ $("#shop-info").show();
+ return false;
+ });
+ }
+ }
+
+ function ondblclick(event, treeId, treeNode) {
+ admin.dgo('[[@{/shop/getshopinfo}]]', {
+ "shopid": treeNode.id
+ }, function (data) {
+ console.log("getshopinfo返回",data);
+ if (data.code == 200) {
+ form.val("shop-info-form",data.shop);
+ $("#fshopid").removeAttr("readonly");
+ $("#shoptype").attr('disabled', 'disabled');
+ form.render('select');
+ $("#submitbtn-shop-btn").text("保存");
+ $("#shop-info").show();
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2, time: 2000});
+ }
+ }, function (ret) {
+ console.log(ret);
+ layer.msg('查询商户失败了,请求服务器异常', {icon: 2});
+ });
+ }
+
+ admin.dgo('[[@{/shop/shoptree}]]', {}, function (data) {
+ if (data.code == 200) {
+ initTree(data.data);
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2, time: 2000});
+ }
+ }, function (ret) {
+ console.log(ret);
+ layer.msg('查询商户树失败了,请稍后再试', {icon: 2});
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/user/account.html b/payapi/src/main/resources/templates/system/user/account.html
new file mode 100644
index 0000000..988fa72
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/user/account.html
@@ -0,0 +1,138 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">账户管理</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">用户中心</a>
+ <a><cite>账户管理</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-value-account" class="layui-input search-input" type="text"
+ placeholder="输入用户名称"/> 
+ <button id="btn-search-account" class="layui-btn icon-btn" data-type="search"><i
+ class="layui-icon"></i>搜索
+ </button>
+ </div>
+ <table class="layui-table" id="accounttable" lay-filter="accounttable"></table>
+ </div>
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let table = layui.table;
+ let admin = layui.admin;
+ form.render('select');
+ // 渲染表格
+ table.render({
+ elem: '#accounttable',
+ url: '[[@{/user/account}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'accno', title: '账号', fixed: 'left', width: 100},
+ {
+ field: 'person',
+ title: '名称',
+ width: 80,
+ fixed: 'left',
+ sort: true,
+ templet: function (item) {
+ if (item.accname != null) {
+ return item.accname;
+ }
+ return item.person.name;
+ }
+ },
+ {
+ field: 'transStatus',
+ title: '状态',
+ fixed: 'left',
+ width: 80,
+ templet: function (item) {
+ let desc = getTempDictValue('accountStatusList', item.transStatus)
+ if (item.transStatus === 'normal') {
+ return '<span class="layui-badge layui-bg-green">' + desc + '</span>'
+ } else if (item.transStatus === 'closed') {
+ return '<span class="layui-badge">' + desc + '</span>'
+ } else if (item.transStatus === 'locked') {
+ return '<span class="layui-badge layui-bg-orange">' + desc + '</span>'
+ } else {
+ return '异常'
+ }
+ }
+ },
+ {field: 'availbal', title: '可用余额', width: 100, fixed: 'left', sort: true},
+ {field: 'balance', title: '总余额', width: 100, fixed: 'left', sort: true},
+ {field: 'frozebal', title: '冻结余额', width: 100, fixed: 'left', sort: true},
+ {field: 'lasttranstime', title: '最后交易日期', width: 120, fixed: 'left', sort: true},
+ {field: 'opendate', title: '开户日期', width: 100, fixed: 'left', sort: true},
+ {
+ field: 'accno',
+ align: 'center',
+ title: '操作',
+ fixed: 'right',
+ templet: function (item) {
+ if (item.transStatus !== 'closed') {
+ let html = ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>注销</a> ';
+ return html;
+ } else {
+ return '';
+ }
+ }
+ }
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#btn-search-account').click(function () {
+ let key = $('#search-value-account').val();
+ table.reload('accounttable', {where: {searchkey: key}, page: {curr: 1}});
+ });
+ // 工具条点击事件
+ table.on('tool(accounttable)', function (obj) {
+ let data = obj.data;
+ let layEvent = obj.event;
+ console.log(data);
+ if (layEvent === 'edit') {
+ showModel(data);
+ } else if (layEvent === 'del') {
+ showDelete(data);
+ }
+ });
+ let showDelete = function (data) {
+ layer.confirm('确定注销账户吗,注销后该用户将无法使用余额?', function (i) {
+ layer.close(i);
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/user/delacc}]]', {
+ accno: data.accno,
+ _csrf: token
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code === 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code === 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('accounttable', {});
+ }, function (ret) {
+ console.log(ret);
+ layer.closeAll('loading');
+ if (ret.transStatus === 403) {
+ layer.msg('没有权限', {icon: 2});
+ } else {
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ }
+ });
+ });
+ }
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/user/add.html b/payapi/src/main/resources/templates/system/user/add.html
new file mode 100755
index 0000000..7badc58
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/user/add.html
@@ -0,0 +1,110 @@
+<!-- operator表单弹窗 -->
+<form id="user-form" lay-filter="user-form" class="layui-form model-form">
+ <input name="userid" id="userid" type="hidden"/>
+ <div class="layui-form-item">
+ <label class="layui-form-label">姓名*</label>
+ <div class="layui-input-block">
+ <input name="name" placeholder="请输入名称" type="text" class="layui-input" maxlength="100"
+ lay-verify="required" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">性别</label>
+ <div class="layui-input-block">
+ <input type="radio" name="sex" value="male" title="男" checked/>
+ <input type="radio" name="sex" value="female" title="女"/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">证件类型*</label>
+ <div class="layui-input-block">
+ <select name="idtype" id="idtype" lay-verify="required">
+ <option th:each="bean : ${idtypeList}" th:value="${bean.dictval}">[[${bean.dictcaption}]]</option>
+ </select>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">证件号*</label>
+ <div class="layui-input-block">
+ <input name="idno" placeholder="请输入证件号" type="text" class="layui-input" maxlength="100"
+ lay-verify="required" required/>
+ </div>
+ </div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">手机号*</label>
+ <div class="layui-input-block">
+ <input name="mobile" placeholder="请输入手机号" type="text" class="layui-input" maxlength="11"
+ lay-verify="required" required/>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">邮箱</label>
+ <div class="layui-input-block">
+ <input name="email" placeholder="请输入邮箱" type="text" class="layui-input" maxlength="100" />
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">地址</label>
+ <div class="layui-input-block">
+ <input name="addr" placeholder="请输入地址" type="text" class="layui-input" maxlength="300" />
+ </div>
+ </div>
+
+ <div class="layui-form-item model-form-footer">
+ <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+ <button class="layui-btn" lay-filter="user-form-submit" lay-submit id="submitbtn">保存</button>
+ </div>
+</form>
+
+<script>
+ layui.use(['layer', 'admin', 'form', 'formSelects'], function () {
+ var layer = layui.layer;
+ var admin = layui.admin;
+ var form = layui.form;
+ var url = '[[@{/user/add}]]';
+ form.render('radio');
+ form.render('select');
+ // 回显user数据
+ var bean = admin.getTempData('t_bean');
+ if (bean) {
+ form.val('user-form', bean);
+ }
+ // 表单提交事件
+ form.on('submit(user-form-submit)', function (data) {
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ $.ajax({
+ type : "POST",
+ dataType : "json",
+ url : url,
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json',
+ 'X-CSRF-TOKEN':token,
+ },
+ data : JSON.stringify(data.field),
+ success : function(result) {
+ layer.closeAll('loading');
+ if (result.code == 200) {
+ layer.msg(result.msg, {icon: 1});
+ admin.finishPopupCenter();
+ } else if (result.code == 401) {
+ layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ console.log('err:' + result.code);
+ layer.msg(result.msg, {icon: 2});
+ }
+ },
+ error : function() {
+ layer.closeAll('loading');
+ layer.msg("请求服务器失败!", {icon: 2});
+ }
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/user/bind.html b/payapi/src/main/resources/templates/system/user/bind.html
new file mode 100755
index 0000000..cba5937
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/user/bind.html
@@ -0,0 +1,76 @@
+<div style="padding:20px;">
+ <table class="layui-table" id="userbindtable" lay-filter="userbindtable">
+ </table>
+ <input type="hidden" id="userid" th:value="${userid}">
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let admin = layui.admin;
+ form.render('select');
+ let table = layui.table;
+ let userid = admin.getTempData('userid');
+ table.render({
+ elem: '#userbindtable',
+ url: '[[@{/user/bind}]]?userid=' + userid,
+ cols: [
+ [
+ {field: 'id', title: '资源ID', width: 80, fixed: 'left', sort: true},
+ {field: 'name', title: '资源名称', sort: true},
+ {
+ field: 'functionId', title: '所属功能', sort: true, align: 'center', templet: function (item) {
+ return $("#functionname").val();
+ }
+ },
+ {field: 'uri', title: '路径'},
+ {field: 'code', sort: true, width: 80, title: '代码'},
+ {
+ field: 'id', align: 'center', title: '操作', templet: function (item) {
+ return '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>'
+ }
+ }
+ ]
+ ]
+ });
+ // 工具条点击事件
+ table.on('tool(userbindtable)', function (obj) {
+ let data = obj.data;
+ let layEvent = obj.event;
+ console.log(data);
+ if (layEvent === 'del') {
+ showDelete(data);
+ }
+ });
+
+ let showDelete = function (data) {
+ layer.confirm('确定删除吗?', function (i) {
+ layer.close(i);
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/user/delbind}]]', {
+ resid: data.id,
+ _csrf:token
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ }
+ else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('restable', {});
+ },function(ret){
+ console.log(ret);
+ layer.closeAll('loading');
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ });
+ });
+ }
+ });
+</script>
diff --git a/payapi/src/main/resources/templates/system/user/index.html b/payapi/src/main/resources/templates/system/user/index.html
new file mode 100644
index 0000000..5507955
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/user/index.html
@@ -0,0 +1,149 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">用户管理</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">用户中心</a>
+ <a><cite>用户管理</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-value-user" class="layui-input search-input" type="text" placeholder="输入用户名称"/> 
+ <button id="btn-search-user" class="layui-btn icon-btn" data-type="search"><i
+ class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-add-user" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>添加用户
+ </button>
+ </div>
+ <table class="layui-table" id="usertable" lay-filter="usertable"></table>
+ </div>
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let table = layui.table;
+ let admin = layui.admin;
+ form.render('select');
+ // 渲染表格
+ table.render({
+ elem: '#usertable',
+ url: '[[@{/user/list}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'name', title: '名称', width: 150, fixed: 'left', sort: true},
+ {field: 'sex', title: '性别', align: 'center', width: 80, templet: function(item){
+ return getTempDictValue('sexList', item.sex);
+ }},
+ {
+ field: 'status', title: '状态', align: 'center', width: 80, templet: function (item) {
+ let desc = getTempDictValue('accountStatusList', item.status);
+ if (item.status === 'normal') {
+ return '<span class="layui-badge layui-bg-green">' + desc + '</span>';
+ } else if (item.status === 'closed') {
+ return '<span class="layui-badge">' + desc + '</span>';
+ } else if (item.status === 'locked') {
+ return '<span class="layui-badge layui-bg-orange">' + desc + '</span>';
+ } else {
+ return '异常';
+ }
+ }
+ },
+ {
+ field: 'idtype', align: 'center', width: 100, title: '证件类型',
+ templet: function (item) {
+ return getTempDictValue('idtypeList', item.idtype);
+ }
+ },
+ {field: 'idno', title: '证件号', width: 120, align: 'center', sort: true},
+ {field: 'email', title: '邮箱', width: 100, align: 'center', sort: true},
+ {field: 'mobile', title: '手机', width: 120, align: 'center', sort: true},
+ {field: 'tel', title: '电话', align: 'center'},
+ {field: 'addr', title: '地址', align: 'center' },
+ {
+ field: 'lastsaved', title: '最后修改时间', width: 180, sort: true, templet: function (d) {
+ return admin.formatDate(d.lastsaved);
+ }
+ },
+ {
+ align: 'center',
+ title: '操作',
+ fixed: 'right',
+ width: 170,
+ templet: function (item) {
+ let html = ' <a class="layui-btn layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> ';
+ html += '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+ /*html += '<a class="layui-btn layui-btn-xs" lay-event="other"><i class="layui-icon layui-icon-link"></i>交易记录</a> ';*/
+ return html;
+ }
+ }
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#btn-search-user').click(function () {
+ let key = $('#search-value-user').val();
+ table.reload('usertable', {where: {searchkey: key}, page: {curr: 1}});
+ });
+ $('#btn-add-user').click(function () {
+ showModel();
+ });
+ let showModel = function (data) {
+ let title = data ? '编辑用户' : '添加用户';
+ admin.putTempData('t_bean', data);
+ admin.popupCenter({
+ title: title,
+ path: '[[@{/user/loadadd}]]',
+ finish: function () {
+ table.reload('usertable', {});
+ }
+ });
+ };
+ // 工具条点击事件
+ table.on('tool(usertable)', function (obj) {
+ let data = obj.data;
+ let layEvent = obj.event;
+ if (layEvent === 'edit') {
+ showModel(data);
+ } else if (layEvent === 'other') {
+ showOtherModel(data);
+ } else if (layEvent === 'del') {
+ showDelete(data);
+ }
+ });
+ let showDelete = function (data) {
+ layer.confirm('确定删除该用户吗?', function (i) {
+ layer.close(i);
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/user/del}]]', {
+ userid: data.userid,
+ _csrf: token
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code === 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code === 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('usertable', {});
+ }, function (ret) {
+ console.log(ret);
+ layer.closeAll('loading');
+ if (ret.transStatus === 403) {
+ layer.msg('没有权限', {icon: 2});
+ } else {
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ }
+ });
+ });
+ }
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/user/point.html b/payapi/src/main/resources/templates/system/user/point.html
new file mode 100644
index 0000000..f14be80
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/user/point.html
@@ -0,0 +1,96 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">积分管理</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">用户中心</a>
+ <a><cite>积分管理</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-value-point" class="layui-input search-input" type="text" placeholder="输入用户名称"/> 
+ <button id="btn-search-point" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ </div>
+ <table class="layui-table" id="pointtable" lay-filter="pointtable"></table>
+ </div>
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let table = layui.table;
+ let admin = layui.admin;
+ form.render('select');
+ // 渲染表格
+ table.render({
+ elem: '#pointtable',
+ url: '[[@{/user/pointlist}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'person', title: '名称',fixed: 'left', sort: true, templet: function (item) {
+ return item.person.name;
+ }},
+ {field: 'points', title: '可用积分', fixed: 'left', sort: true},
+ {field: 'lastsaved', title: '最后修改时间', fixed: 'left', sort: true},
+ {field: 'accumPoints', title: '累计获得积分', fixed: 'left', sort: true},
+ {field: 'sumpayPoints', title: '累计消费积分',fixed: 'left', sort: true},
+ {
+ field: 'userid', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+ let html ='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+ /*html += '<a class="layui-btn layui-btn-xs" th:lay-href="/user/pointdtl?userid="'+item.userid+'><i class="layui-icon layui-icon-link"></i>交易记录</a> ';*/
+ return html;
+ }
+ }
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#btn-search-point').click(function () {
+ let key = $('#search-value-point').val();
+ table.reload('pointtable', {where: {searchkey: key}, page: {curr: 1}});
+ });
+ // 工具条点击事件
+ table.on('tool(pointtable)', function (obj) {
+ let data = obj.data;
+ let layEvent = obj.event;
+ if (layEvent === 'del') {
+ showDelete(data);
+ }
+ });
+ let showDelete = function (data) {
+ layer.confirm('确认删除吗,删除后将无法恢复', function (i) {
+ layer.close(i);
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/user/delpoint}]]', {
+ userid: data.userid,
+ _csrf: token
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('pointtable', {});
+ }, function (ret) {
+ console.log(ret);
+ layer.closeAll('loading');
+ if(ret.transStatus==403){
+ layer.msg('没有权限', {icon: 2});
+ }else{
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ }
+ });
+ });
+ }
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/user/pointdtl.html b/payapi/src/main/resources/templates/system/user/pointdtl.html
new file mode 100644
index 0000000..07448c0
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/user/pointdtl.html
@@ -0,0 +1,97 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">积分交易记录</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#">用户中心</a>
+ <a><cite>积分交易记录</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 搜索:
+ <input id="search-value-point" class="layui-input search-input" type="text" placeholder="输入用户名称"/> 
+ <button id="btn-search-point" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ </div>
+ <table class="layui-table" id="pointtable" lay-filter="pointtable"></table>
+ </div>
+ <input type="hidden" id="userid" th:value="${userid}">
+</div>
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ let form = layui.form;
+ let table = layui.table;
+ let admin = layui.admin;
+ form.render('select');
+ // 渲染表格
+ table.render({
+ elem: '#pointtable',
+ url: '[[@{/user/pointlist}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'person', title: '名称',fixed: 'left', sort: true, templet: function (item) {
+ return item.person.name;
+ }},
+ {field: 'points', title: '可用积分', fixed: 'left', sort: true},
+ {field: 'lastsaved', title: '最后修改时间', fixed: 'left', sort: true},
+ {field: 'accumPoints', title: '累计获得积分', fixed: 'left', sort: true},
+ {field: 'sumpayPoints', title: '累计消费积分',fixed: 'left', sort: true},
+ {
+ field: 'userid', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+ let html ='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
+ html += '<a class="layui-btn layui-btn-xs" th:lay-href="[[@{/user/pointdtl}]]?userid="'+item.userid+'><i class="layui-icon layui-icon-link"></i>交易记录</a> ';
+ return html;
+ }
+ }
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#btn-search-point').click(function () {
+ let key = $('#search-value-point').val();
+ table.reload('pointtable', {where: {searchkey: key}, page: {curr: 1}});
+ });
+ // 工具条点击事件
+ table.on('tool(pointtable)', function (obj) {
+ let data = obj.data;
+ let layEvent = obj.event;
+ if (layEvent === 'del') {
+ showDelete(data);
+ }
+ });
+ let showDelete = function (data) {
+ layer.confirm('确认删除吗,删除后将无法恢复', function (i) {
+ layer.close(i);
+ layer.load(2);
+ let token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/user/delpoint}]]', {
+ userid: data.userid,
+ _csrf: token
+ }, function (data) {
+ console.log(data.code);
+ layer.closeAll('loading');
+ if (data.code == 200) {
+ layer.msg(data.msg, {icon: 1});
+ } else if (data.code == 401) {
+ layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+ location.replace('[[@{/login}]]');
+ }, 1000);
+ return;
+ } else {
+ layer.msg(data.msg, {icon: 2});
+ }
+ table.reload('pointtable', {});
+ }, function (ret) {
+ console.log(ret);
+ layer.closeAll('loading');
+ if(ret.transStatus==403){
+ layer.msg('没有权限', {icon: 2});
+ }else{
+ layer.msg('请求失败了,请稍后再试', {icon: 2});
+ }
+ });
+ });
+ }
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/webapp/WEB-INF/web.xml b/payapi/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..bdc24e9
--- /dev/null
+++ b/payapi/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
+ version="4.0">
+
+</web-app>
\ No newline at end of file
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/DlpayApplicationTests.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/DlpayApplicationTests.kt
new file mode 100644
index 0000000..c8b875f
--- /dev/null
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/DlpayApplicationTests.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay
+
+import org.junit.runner.RunWith
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.test.context.junit4.SpringRunner
+
+@RunWith(SpringRunner::class)
+@SpringBootTest
+abstract class DlpayApplicationTests{
+
+}
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt
new file mode 100644
index 0000000..62a56a3
--- /dev/null
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay
+
+import com.google.gson.Gson
+import org.junit.runner.RunWith
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.test.context.junit4.SpringRunner
+import org.springframework.test.web.servlet.MockMvc
+
+/**
+ * mvc 基础测试类
+ * 放置基础方法,如认证信息等
+ */
+@RunWith(SpringRunner::class)
+@SpringBootTest
+@AutoConfigureMockMvc
+abstract class MvcBaseTest{
+ @Autowired
+ protected lateinit var mvc: MockMvc
+ val gson = Gson()
+}
\ No newline at end of file
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt
new file mode 100644
index 0000000..0899c9a
--- /dev/null
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt
@@ -0,0 +1,24 @@
+package com.supwisdom.dlpay.controller
+
+import com.supwisdom.dlpay.MvcBaseTest
+import org.junit.Test
+import org.springframework.http.MediaType
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
+import org.springframework.test.web.servlet.result.MockMvcResultHandlers
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers
+
+/**
+ * Created by shuwei on 2019/4/16.
+ */
+class ApiControllerTest : MvcBaseTest() {
+ @Test
+ fun testYktPay() {
+ //TODO prepare data
+ val stuempno="10000097"
+ val ret = mvc.perform(MockMvcRequestBuilders.post("/ykt/payinit").content("")
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(MockMvcResultMatchers.status().isOk)
+ .andDo(MockMvcResultHandlers.print())
+ .andReturn()
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ShopControllerTest.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ShopControllerTest.kt
new file mode 100644
index 0000000..c8fd5ec
--- /dev/null
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ShopControllerTest.kt
@@ -0,0 +1,79 @@
+package com.supwisdom.dlpay.controller
+
+import com.google.gson.Gson
+import com.supwisdom.dlpay.MvcBaseTest
+import com.supwisdom.dlpay.api.bean.OpenShopParam
+import com.supwisdom.dlpay.api.bean.QueryShopParam
+import com.supwisdom.dlpay.framework.domain.TShop
+import org.junit.Assert
+import org.junit.Test
+import org.springframework.http.MediaType
+import org.springframework.test.context.ActiveProfiles
+
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
+import org.springframework.test.web.servlet.result.MockMvcResultHandlers.print
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
+
+/**
+ * Created by shuwei on 2019/4/15.
+ */
+@ActiveProfiles("devel-pg")
+class ShopControllerTest : MvcBaseTest() {
+ class RetBean {
+ var shopid: Int = 0
+ var retcode: Int = 0
+ lateinit var shop: TShop
+ }
+
+ @Test
+ fun open() {
+ val shopParam = OpenShopParam()
+ shopParam.shopUniqueId = "ykt_shop_20001"
+ shopParam.shopname = "测试名称"
+ val gson = Gson()
+ val ret = mvc.perform(post("/api/shop/open").content(gson.toJson(shopParam))
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk)
+ .andDo(print())
+ .andReturn()
+ val res = ret.response.contentAsString
+ Assert.assertNotNull(res)
+ val retBean = gson.fromJson(res, RetBean::class.java)
+ Assert.assertNotNull(retBean)
+ Assert.assertEquals(0, retBean.retcode)
+ Assert.assertNotNull(retBean.shopid)
+ Assert.assertNotEquals(0, retBean.shopid)
+ }
+
+ @Test
+ fun get() {
+ val shopParam = QueryShopParam()
+ shopParam.shopUniqueId = "ykt_shop_20001"
+ val gson = Gson()
+ val ret = mvc.perform(post("/shop/open").content(gson.toJson(shopParam))
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk)
+ .andDo(print())
+ .andReturn()
+ val resOpen = ret.response.contentAsString
+ Assert.assertNotNull(resOpen)
+ val retBeanOpen = gson.fromJson(resOpen, RetBean::class.java)
+ Assert.assertNotNull(retBeanOpen)
+ Assert.assertNotNull(retBeanOpen.shopid)
+ shopParam.shopid = retBeanOpen.shopid
+
+ val retGet = mvc.perform(get("/shop/get").content(gson.toJson(shopParam))
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk)
+ .andDo(print())
+ .andReturn()
+ val res = retGet.response.contentAsString
+ Assert.assertNotNull(res)
+ val retBean = gson.fromJson(res, RetBean::class.java)
+ Assert.assertNotNull(retBean)
+ Assert.assertEquals(0, retBean.retcode)
+ Assert.assertNotNull(retBean.shop)
+ Assert.assertEquals(retBeanOpen.shopid, retBean.shop.shopid)
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt
new file mode 100644
index 0000000..c76eb14
--- /dev/null
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt
@@ -0,0 +1,80 @@
+package com.supwisdom.dlpay.controller
+
+import com.google.gson.Gson
+import com.supwisdom.dlpay.MvcBaseTest
+import com.supwisdom.dlpay.api.bean.OpenUserParam
+import com.supwisdom.dlpay.api.bean.QueryUserParam
+import com.supwisdom.dlpay.api.domain.TAccount
+import com.supwisdom.dlpay.api.domain.TPerson
+import org.junit.Assert
+import org.junit.Test
+import org.springframework.http.MediaType
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
+import org.springframework.test.web.servlet.result.MockMvcResultHandlers
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers
+
+
+class UserControllerTest : MvcBaseTest() {
+
+ class RetBean {
+ var userid: String = ""
+ var retcode: Int = 0
+ lateinit var person: TPerson
+ lateinit var account: TAccount
+ }
+
+ @Test
+ fun open() {
+ val userParam = OpenUserParam()
+ userParam.uid = ""//random req
+ userParam.name = "测试名称"
+
+ val ret = mvc.perform(MockMvcRequestBuilders.post("/api/user/open").content(gson.toJson(userParam))
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(MockMvcResultMatchers.status().isOk)
+ .andDo(MockMvcResultHandlers.print())
+ .andReturn()
+ val res = ret.response.contentAsString
+ Assert.assertNotNull(res)
+ val retBean = gson.fromJson(res, RetBean::class.java)
+ Assert.assertNotNull(retBean)
+ Assert.assertEquals(0, retBean.retcode)
+ Assert.assertNotNull(retBean.userid)
+ Assert.assertNotEquals("", retBean.userid)
+ }
+
+ @Test
+ fun get() {
+
+ val userParam = QueryUserParam()
+ userParam.uid = "testuseruniqueId"//测试用
+ val gson = Gson()
+ val ret = mvc.perform(MockMvcRequestBuilders.post("/api/user/open").content(gson.toJson(userParam))
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(MockMvcResultMatchers.status().isOk)
+ .andDo(MockMvcResultHandlers.print())
+ .andReturn()
+ val resOpen = ret.response.contentAsString
+ Assert.assertNotNull(resOpen)
+ val retBeanOpen = gson.fromJson(resOpen, RetBean::class.java)
+ Assert.assertNotNull(retBeanOpen)
+ Assert.assertNotNull(retBeanOpen.userid)
+ userParam.userid = retBeanOpen.userid
+
+ val retGet = mvc.perform(MockMvcRequestBuilders.get("/api/user/query").content(gson.toJson(userParam))
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(MockMvcResultMatchers.status().isOk)
+ .andDo(MockMvcResultHandlers.print())
+ .andReturn()
+ val res = retGet.response.contentAsString
+ Assert.assertNotNull(res)
+ val retBean = gson.fromJson(res, RetBean::class.java)
+ Assert.assertNotNull(retBean)
+ Assert.assertEquals(0, retBean.retcode)
+ Assert.assertNotNull(retBean.person)
+ Assert.assertEquals(retBeanOpen.userid, retBean.person.userid)
+ Assert.assertNotNull(retBeanOpen.account)
+ Assert.assertEquals(retBeanOpen.person.userid, retBean.account.userid)
+ }
+
+}
\ No newline at end of file
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/security_controller_test.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/security_controller_test.kt
new file mode 100644
index 0000000..24853db
--- /dev/null
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/security_controller_test.kt
@@ -0,0 +1,126 @@
+package com.supwisdom.dlpay.controller
+
+import com.supwisdom.dlpay.MvcBaseTest
+import com.supwisdom.dlpay.framework.core.JwtConfig
+import com.supwisdom.dlpay.framework.util.HmacUtil
+import io.restassured.RestAssured
+import io.restassured.RestAssured.*
+import io.restassured.http.ContentType
+import io.restassured.path.json.JsonPath.from
+import org.hamcrest.MatcherAssert.assertThat
+import org.hamcrest.Matchers.*
+import org.junit.Before
+import org.junit.Test
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.boot.web.server.LocalServerPort
+import org.springframework.test.context.ActiveProfiles
+import java.text.SimpleDateFormat
+import java.util.*
+
+@ActiveProfiles("devel-pg-local")
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+class SecurityControllerTest : MvcBaseTest() {
+ val appid = "100001"
+ val appsecret = "oUw2NmA09ficiVWD4TUQLDOkPyzQa3VzbjjsW0B2qTk="
+
+ @LocalServerPort
+ private var port: Int = 0
+
+ @Autowired
+ lateinit var jwtConfig: JwtConfig
+
+ @Before
+ fun setUp() {
+ RestAssured.port = port
+ }
+
+ fun getJwt(id: String, secret: String): String {
+ val token = given().param("appid", id)
+ .`when`()
+ .get("/api/auth/gettoken")
+ .then()
+ .contentType(ContentType.JSON)
+ .statusCode(200)
+ .body("token", notNullValue())
+ .extract().path<String>("token")
+
+ val tokenCrypt = HmacUtil.HMACSHA256(token, secret)
+
+ return given().param("appid", id)
+ .param("secret", tokenCrypt)
+ .`when`()
+ .get("/api/auth/authentication")
+ .then()
+ .statusCode(200)
+ .contentType(ContentType.JSON)
+ .body("jwt", notNullValue())
+ .extract().response().let {
+ val exp = it.path<String>("expiredAt").run {
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").parse(this)
+ }
+ val now = Calendar.getInstance()
+ assertThat(now.time, lessThanOrEqualTo(exp))
+ it.path<String>("jwt")
+ }
+ }
+
+ @Test
+ fun testGetJwt() {
+ getJwt(appid, appsecret)
+ }
+
+ @Test
+ fun testGetJwtClient() {
+ val clientid = "000030450"
+ val response = given().param("appid", appid)
+ .`when`()
+ .get("/api/auth/gettoken/$clientid")
+ .then()
+ .statusCode(200)
+ .body("token", notNullValue())
+ .extract()
+
+ val token = from(response.body().asString()).getString("token")
+ val secret = HmacUtil.HMACSHA256(token, appsecret)
+
+ given().param("appid", appid)
+ .param("secret", secret)
+ .`when`()
+ .get("/api/auth/authentication/$clientid")
+ .then()
+ .statusCode(200)
+ .body("jwt", notNullValue())
+ }
+
+ @Test
+ fun testJwtRefresh() {
+ getJwt(appid, appsecret).also { jwt ->
+ given().header(jwtConfig.header, "${jwtConfig.tokenHeader}$jwt")
+ .`when`()
+ .get("/api/auth/refresh")
+ .then()
+ .statusCode(200)
+ .body("jwt", notNullValue())
+ }
+ }
+
+ @Test
+ fun testAuthencationFail() {
+ given().param("appid", appid)
+ .`when`()
+ .get("/api/auth/gettoken")
+ .then()
+ .body("token", notNullValue())
+ .extract()
+ .path<String>("token").also { token ->
+ given().param("appid", appid)
+ .param("secret", token)
+ .`when`()
+ .get("/api/auth/authentication")
+ .then()
+ .statusCode(401)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/password_test.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/password_test.kt
new file mode 100644
index 0000000..a89d759
--- /dev/null
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/password_test.kt
@@ -0,0 +1,27 @@
+package com.supwisdom.dlpay
+
+import org.junit.Test
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
+import org.springframework.security.crypto.password.DelegatingPasswordEncoder
+import org.springframework.security.crypto.password.PasswordEncoder
+import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder
+import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder
+import java.util.*
+
+
+class PasswordTest {
+ private fun encodePassword(pswd: String) {
+ val encoders = HashMap<String, PasswordEncoder>()
+ encoders["bcrypt"] = BCryptPasswordEncoder()
+ encoders["pbkdf2"] = Pbkdf2PasswordEncoder()
+ encoders["scrypt"] = SCryptPasswordEncoder()
+ val passwordEncoder = DelegatingPasswordEncoder("bcrypt", encoders)
+ println(passwordEncoder.encode(pswd))
+
+ }
+
+ @Test
+ fun testPassword() {
+ encodePassword("123456")
+ }
+}
\ No newline at end of file