Merge branch 'hotfix/1.0.2'
diff --git a/Makefile b/Makefile
index f9357b8..ffe6866 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,16 @@
GRADLE=./gradlew
+GIT=git
+
+VERSION=$(shell git describe --tags --abbrev=7 --always)
+TAG=$(shell echo $(VERSION) | awk -F'-' '{print $$1}')
+DISTANCE=$(shell echo $(VERSION) | awk -F'-' '{print $$2}')
+HASH=$(shell echo $(VERSION) | awk -F'-' '{print $$3}')
+
+ifneq ($(DISTANCE), 0)
+IMAGE_VERSION=dev
+else
+IMAGE_VERSION=$(TAG)
+endif
.PHONY: clean build
@@ -16,8 +28,8 @@
$(GRADLE) ynrcc-agent:docker
push: docker
- docker push harbor.supwisdom.com/dali/payapi
- docker push harbor.supwisdom.com/dali/ynrcc
+ docker push harbor.supwisdom.com/dali/payapi:$(IMAGE_VERSION)
+ docker push harbor.supwisdom.com/dali/ynrcc:$(IMAGE_VERSION)
publish: build
$(GRADLE) publish
diff --git a/build.gradle b/build.gradle
index 5892649..0b1c3c0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.1.6.RELEASE'
+ id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'org.jetbrains.kotlin.jvm' version '1.3.31'
id 'org.jetbrains.kotlin.plugin.spring' version '1.3.31'
id "com.palantir.git-version" version "0.12.0-rc2"
diff --git a/config/application-devel-pg-xkx.properties b/config/application-devel-pg-xkx.properties
index bd19698..3a19f2e 100644
--- a/config/application-devel-pg-xkx.properties
+++ b/config/application-devel-pg-xkx.properties
@@ -11,6 +11,8 @@
spring.datasource.username=admin
spring.datasource.password=123456
database.dbtype=postgresql
+
+logging.level.org.hibernate.SQL=ERROR
# Redis settings
spring.redis.host=localhost
spring.redis.port=16379
@@ -25,7 +27,38 @@
##################################################
## quartz task scheduler
shopbalance.updater.cron=-
+#download.ynrcc.chkfile.cron =3 0/2 * * * ?
+#query.third.transdtl.result.cron=7 0/1 * * * ?
+#dayend.settletask.cron=0 0/2 * * * ?
+#payapi.sourcetype.checker.scheduler=0 0/2 * * * ?
+citizencard.dolosstask.cron=3 0/1 * * * ?
#############################################
spring.cloud.consul.enabled=false
spring.cloud.consul.host=172.28.201.70
spring.cloud.consul.port=8500
+################# proxy ############################
+resttemplate.proxy.type=direct
+resttemplate.proxy.host=127.0.0.1
+resttemplate.proxy.port=8087
+
+#============== kafka ===================
+# 指定kafka 代理地址,可以多个
+spring.kafka.bootstrap-servers=172.28.201.101:9192
+#=============== provider =======================
+spring.kafka.producer.retries=3
+# 每次批量发送消息的数量
+spring.kafka.producer.batch-size=16384
+spring.kafka.producer.buffer-memory=33554432
+# 指定消息key和消息体的编解码方式
+spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
+spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
+
+#===============kafka consumer =======================
+# 指定默认消费者group id
+spring.kafka.consumer.group-id=epaymessager1
+spring.kafka.consumer.auto-offset-reset=earliest
+spring.kafka.consumer.enable-auto-commit=true
+spring.kafka.consumer.auto-commit-interval=100
+# 指定消息key和消息体的编解码方式
+spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
+spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 8e2b45e..26e1499 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -31,4 +31,27 @@
#############################################
spring.cloud.consul.enabled=false
spring.cloud.consul.host=172.28.201.70
-spring.cloud.consul.port=8500
\ No newline at end of file
+spring.cloud.consul.port=8500
+
+#============== kafka ===================
+# 指定kafka 代理地址,可以多个
+spring.kafka.bootstrap-servers=172.28.201.101:9192
+#=============== provider =======================
+spring.kafka.producer.retries=3
+# 每次批量发送消息的数量
+spring.kafka.producer.batch-size=16384
+spring.kafka.producer.buffer-memory=33554432
+# 指定消息key和消息体的编解码方式
+spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
+spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
+
+#===============kafka consumer =======================
+# 指定默认消费者group id
+spring.kafka.listen.auto.start=false
+spring.kafka.consumer.group-id=epaymessager1
+spring.kafka.consumer.auto-offset-reset=earliest
+spring.kafka.consumer.enable-auto-commit=true
+spring.kafka.consumer.auto-commit-interval=100
+# 指定消息key和消息体的编解码方式
+spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
+spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
\ No newline at end of file
diff --git a/oauth/build.gradle b/oauth/build.gradle
new file mode 100644
index 0000000..aeffb67
--- /dev/null
+++ b/oauth/build.gradle
@@ -0,0 +1,90 @@
+plugins {
+ id 'java'
+ id 'org.springframework.boot'
+ id 'org.jetbrains.kotlin.jvm'
+ id 'org.jetbrains.kotlin.plugin.jpa' version '1.3.31'
+ id 'org.jetbrains.kotlin.plugin.spring'
+ id "com.palantir.git-version"
+}
+
+apply plugin: 'java'
+apply plugin: 'io.spring.dependency-management'
+
+def version = gitVersion()
+def details = versionDetails()
+
+group = rootProject.group
+version = '1'
+sourceCompatibility = jdkVersion
+def startClass = 'com.supwisdom.oauth.OAuthApplication'
+
+println("Build version: $version")
+
+bootJar {
+ mainClassName = startClass
+ manifest {
+ attributes('oauth-Version': version)
+ }
+}
+
+jar {
+ baseName = 'oauth'
+}
+
+
+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.apache.commons:commons-lang3:3.9'
+ implementation 'net.javacrumbs.shedlock:shedlock-spring:2.5.0'
+ implementation 'net.javacrumbs.shedlock:shedlock-provider-redis-spring:2.5.0'
+
+ implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
+
+ 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.5'
+ implementation 'io.github.microutils:kotlin-logging:1.6.26'
+ implementation 'org.slf4j:slf4j-parent:1.7.26'
+
+ implementation 'commons-dbcp:commons-dbcp:1.4'
+
+ implementation project(':payapi-common')
+
+ 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/oauth/src/main/java/com/supwisdom/oauth/ServletInitializer.kt b/oauth/src/main/java/com/supwisdom/oauth/ServletInitializer.kt
new file mode 100644
index 0000000..3fc369d
--- /dev/null
+++ b/oauth/src/main/java/com/supwisdom/oauth/ServletInitializer.kt
@@ -0,0 +1,12 @@
+package com.supwisdom.oauth
+
+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(OAuthApplication::class.java)
+ }
+
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/OAuthApplication.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/OAuthApplication.kt
new file mode 100644
index 0000000..8339e74
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/OAuthApplication.kt
@@ -0,0 +1,83 @@
+package com.supwisdom.oauth
+
+import io.lettuce.core.ReadFrom
+import net.javacrumbs.shedlock.core.LockProvider
+import net.javacrumbs.shedlock.provider.redis.spring.RedisLockProvider
+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.ServletComponentScan
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
+import org.springframework.cache.annotation.EnableCaching
+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)
+ }
+
+ @Bean
+ fun lockProvider(connectionFactory: RedisConnectionFactory): LockProvider {
+ return RedisLockProvider(connectionFactory, "prod")
+ }
+}
+
+@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
+@EnableScheduling
+@EnableCaching
+@ServletComponentScan
+class OAuthApplication : SpringBootServletInitializer() {
+
+ override fun configure(builder: SpringApplicationBuilder): SpringApplicationBuilder {
+ return builder.sources(OAuthApplication::class.java)
+ }
+}
+
+fun main(args: Array<String>) {
+ SpringApplication.run(OAuthApplication::class.java, * args)
+}
\ No newline at end of file
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/bean/JsonResult.java b/oauth/src/main/kotlin/com/supwisdom/oauth/bean/JsonResult.java
new file mode 100755
index 0000000..9447e97
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/bean/JsonResult.java
@@ -0,0 +1,78 @@
+package com.supwisdom.oauth.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/oauth/src/main/kotlin/com/supwisdom/oauth/bean/UserInfor.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/bean/UserInfor.kt
new file mode 100644
index 0000000..37ce46a
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/bean/UserInfor.kt
@@ -0,0 +1,19 @@
+package com.supwisdom.oauth.bean
+
+class UserInfor {
+ var name: String? = null
+
+ var availbal: Double? = null
+
+ var daylimit: Double? = null
+
+ var lowfreelimit: Double? = null
+
+ var lowfreeflag: Boolean? = null
+
+ var userid: String? = null
+
+ var loginid: String? = null
+
+ var points: Int? = null
+}
\ No newline at end of file
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/dao/ApiClientDao.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/dao/ApiClientDao.kt
new file mode 100644
index 0000000..e2a80a5
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/dao/ApiClientDao.kt
@@ -0,0 +1,17 @@
+package com.supwisdom.oauth.dao
+
+import com.supwisdom.oauth.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
+import org.springframework.transaction.annotation.Propagation
+import org.springframework.transaction.annotation.Transactional
+
+@Repository
+interface ApiClientDao : JpaRepository<TApiClient, String> {
+
+ @Transactional(propagation = Propagation.REQUIRED, readOnly = true, rollbackFor = [Exception::class])
+ fun findByAppid(appid: String): TApiClient?
+
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/dao/OAuthUserDao.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/dao/OAuthUserDao.kt
new file mode 100644
index 0000000..c706e81
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/dao/OAuthUserDao.kt
@@ -0,0 +1,16 @@
+package com.supwisdom.oauth.dao
+
+import com.supwisdom.oauth.domain.OAuthUser
+import org.springframework.data.jpa.repository.JpaRepository
+import org.springframework.stereotype.Repository
+
+@Repository
+interface OAuthUserDao : JpaRepository<OAuthUser, String> {
+ fun findByLoginid(loginid: String): OAuthUser?
+
+ fun findByPhone(phone: String): OAuthUser?
+
+ fun findByEmail(email: String): OAuthUser?
+}
+
+
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/domain/OAuthUser.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/domain/OAuthUser.kt
new file mode 100644
index 0000000..ce3c0c6
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/domain/OAuthUser.kt
@@ -0,0 +1,293 @@
+package com.supwisdom.oauth.domain
+
+import com.supwisdom.dlpay.api.util.DateUtil
+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
+
+/*
+*
+* 与支付平台中的 MobileUser 一致
+*
+* */
+
+@Entity
+@Table(name = "TB_MOBILE_USER", indexes = [Index(name = "oauth_user_loginid_idx", columnList = "loginid", unique = true)])
+class OAuthUser : UserDetails {
+ override fun getAuthorities(): Collection<GrantedAuthority>? {
+ return this.auths
+ }
+
+ override fun isEnabled(): Boolean {
+ return "closed" != this.status
+ }
+
+ override fun getUsername(): String {
+ return this.loginid
+ }
+
+ override fun isCredentialsNonExpired(): Boolean {
+ return true
+ }
+
+ override fun getPassword(): String {
+ return this.loginpwd
+ }
+
+ override fun isAccountNonExpired(): Boolean {
+ if(expiredate.isNullOrEmpty()){
+ return true
+ }
+ return this.expiredate!! >= DateUtil.getNow("yyyyMMdd")
+ }
+
+ override fun isAccountNonLocked(): Boolean {
+ return "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 = ""
+ /**
+ * 登录id
+ * */
+
+ @Column(name = "loginid", length = 64)
+ @NotNull
+ var loginid: String = ""
+
+ /**
+ * 登录密码
+ * */
+ @Column(name = "loginpwd", length = 64)
+ var loginpwd: 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 = "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 = "signedtime", length = 20)
+ var signedtime: String? = null
+
+ /**
+ * 头像
+ * */
+ @Column(name = "ulogo", length = 100)
+ var ulogo: String? = null
+
+ /**
+ * rsa 加密二维码等使用
+ * */
+ @Column(name = "rsaprivate", length = 1000)
+ var rsaprivate: String? = null
+
+ /**
+ * rsa 加密二维码等使用
+ * */
+ @Column(name = "rsapublic", length = 1000)
+ var rsapublic: String? = null
+
+ /**
+ * 秘钥 加密二维码等使用
+ * */
+ @Column(name = "secertkey", length = 64)
+ var secertkey: String? = null
+
+ /**
+ * 租户id
+ * */
+ @Column(name = "tenantid", length = 32)
+ var tenantid:String? = null
+
+ /**
+ * 有效期
+ * */
+ @Column(name = "expiredate", length = 8)
+ var expiredate: String? = null
+
+ /**
+ * 邮箱
+ * */
+ @Column(name = "email", length = 100)
+ var email: String? = null
+
+ /**
+ * 手机
+ * */
+ @Column(name = "phone", length = 15)
+ var phone: String? = null
+
+ /**
+ * 证件类型
+ * */
+ @Column(name = "idtype", length = 20)
+ var idtype: String? = null
+
+ /**
+ * 证件号
+ * */
+ @Column(name = "idno", length = 32)
+ var idno: String? = null
+
+ /**
+ * 部门编号
+ * */
+ @Column(name = "deptcode", length = 32)
+ var deptcode: String? = null
+
+ /**
+ * 部门
+ * */
+ @Column(name = "deptname", length = 100)
+ var deptname: String? = null
+
+
+ fun checkLoginpwdtime():Int{
+ if (this.loginpwderror >= 5 && (System.currentTimeMillis() - this.loginpwderrortime!!) < 1000 * 60 * 30) {
+ return -1
+ } else if (this.loginpwderror >= 5 && (System.currentTimeMillis() - this.loginpwderrortime!!) > 1000 * 60 * 30) {
+ //更新时间
+ this.loginpwderror = 0
+ this.loginpwderrortime = null
+ return 1
+ }
+ return 0
+ }
+
+ fun updateLoginpwderror(ok: Boolean): Boolean {
+ return if (ok) {
+ if (this.loginpwderror > 0) {
+ this.loginpwderror = 0
+ this.loginpwderrortime = null
+ true
+ } else {
+ false
+ }
+ } else {
+ if (this.loginpwderror == 0) {
+ this.loginpwderrortime = System.currentTimeMillis()
+ }
+ this.loginpwderror += 1
+ true
+ }
+ }
+
+ fun checkPaypwdtime():Int{
+ if (this.paypwderror >= 5 && (System.currentTimeMillis() - this.paypwderrortime!!) < 1000 * 60 * 30) {
+ return -1
+ } else if (this.paypwderror >= 5 && (System.currentTimeMillis() - this.paypwderrortime!!) > 1000 * 60 * 30) {
+ //更新时间
+ this.paypwderror = 0
+ this.paypwderrortime = null
+ return 1
+ }
+ return 0
+ }
+
+ fun updatePaypwderror(ok: Boolean): Boolean {
+ return if (ok) {
+ if (this.paypwderror > 0) {
+ this.paypwderror = 0
+ this.paypwderrortime = null
+ true
+ } else {
+ false
+ }
+ } else {
+ if (this.paypwderror == 0) {
+ this.paypwderrortime = System.currentTimeMillis()
+ }
+ this.paypwderror += 1
+ true
+ }
+ }
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/domain/TApiClient.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/domain/TApiClient.kt
new file mode 100644
index 0000000..404e64a
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/domain/TApiClient.kt
@@ -0,0 +1,48 @@
+package com.supwisdom.oauth.domain
+
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
+
+import javax.persistence.*
+import javax.validation.constraints.NotNull
+
+@Entity
+@Table(name = "TB_APICLIENT", indexes = [Index(name = "apiclient_idx", columnList = "appid, tenantid", unique = true)])
+class TApiClient {
+ @Id
+ @SequenceGenerator(name = "apiclient_id", sequenceName = "SEQ_APICLIENT", allocationSize = 1, initialValue = 10)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "apiclient_id")
+ @Column(name = "id")
+ @NotNull
+ var id: Int? = null
+
+ @Column(name = "appid", length = 20)
+ @NotNull
+ var appid: String? = null
+
+ @Column(name = "secret", length = 64)
+ @NotNull
+ var secret: String? = null
+ set(secret) {
+ field = secret
+ this.bcryptSecret = BCryptPasswordEncoder().encode(secret)
+ }
+
+ @Column(name = "status", length = 10)
+ @NotNull
+ var status: String? = null
+
+ @Column(name = "roles", length = 300)
+ var roles: String? = null
+
+ @Column(name = "BCRYPT_SECRET", length = 64)
+ @NotNull
+ var bcryptSecret: String? = null
+ private set
+
+ @Column(name = "THIRDURL", length = 200)
+ var thirdurl: String? = null
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ var tenantId: String? = null
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/oauth.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/oauth.kt
new file mode 100644
index 0000000..a5253c4
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/oauth.kt
@@ -0,0 +1,156 @@
+package com.supwisdom.oauth
+
+import com.supwisdom.oauth.dao.ApiClientDao
+import com.supwisdom.oauth.domain.OAuthUser
+import com.supwisdom.oauth.service.OAuthUserService
+import com.supwisdom.oauth.util.Constants
+import com.supwisdom.oauth.util.JwtConfig
+import com.supwisdom.oauth.util.PasswordBCryptConfig
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.data.redis.connection.RedisConnectionFactory
+import org.springframework.http.HttpStatus
+import org.springframework.http.ResponseEntity
+import org.springframework.security.core.GrantedAuthority
+import org.springframework.security.core.annotation.AuthenticationPrincipal
+import org.springframework.security.core.authority.SimpleGrantedAuthority
+import org.springframework.security.core.userdetails.UserDetails
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
+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.configurers.AuthorizationServerEndpointsConfigurer
+import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer
+import org.springframework.security.oauth2.provider.ClientDetails
+import org.springframework.security.oauth2.provider.ClientDetailsService
+import org.springframework.security.oauth2.provider.OAuth2Authentication
+import org.springframework.security.oauth2.provider.client.BaseClientDetails
+import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore
+import org.springframework.stereotype.Controller
+import org.springframework.ui.Model
+import org.springframework.web.bind.annotation.*
+import java.security.SecureRandom
+import java.util.*
+
+@RestController
+class UserInforController {
+ @Autowired
+ lateinit var jwtConfig: JwtConfig
+ @Autowired
+ private lateinit var redisConnectionFactory: RedisConnectionFactory
+
+ @RequestMapping("/userinfor")
+ fun user(@RequestParam("access_token") access_token: String?,
+ @RequestHeader(Constants.HEADER_AUTHORIZATION) auth: String?): ResponseEntity<Any> {
+ if (access_token.isNullOrEmpty() && auth.isNullOrEmpty()) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ }
+ var jwt = if(!auth.isNullOrEmpty()){
+ auth.substring(jwtConfig.tokenHeader.length)
+ }else{
+ access_token!!
+ }
+ val obj: OAuth2Authentication? = RedisTokenStore(redisConnectionFactory).readAuthentication(jwt) ?: return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ val user = obj!!.userAuthentication.principal as UserDetails
+ if(user.username.isNullOrEmpty()){
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ }
+ return ResponseEntity.status(HttpStatus.OK).body("""{"outid":"${user.username}"}""")
+ }
+}
+@Controller
+class WebMainController {
+ @Autowired
+ lateinit var oauthUserService: OAuthUserService
+
+ @GetMapping("/login")
+ fun loginView() = "login"
+
+ @GetMapping(value = ["/", "/index"])
+ fun indexView(@AuthenticationPrincipal princp: UserDetails, model: Model):String {
+ val user = princp as OAuthUser
+ model.addAttribute("loginid",user.loginid)
+ if(!user.userid.isNullOrEmpty()){
+ var uinfor = oauthUserService.findUserInfor(user.userid!!)
+ if(uinfor!=null){
+ model.addAttribute("uinfor",uinfor)
+ }
+ }
+ return "index"
+ }
+}
+
+
+class OAuthDetailService : ClientDetailsService {
+ @Autowired
+ private lateinit var apiClientDao: ApiClientDao
+ override fun loadClientByClientId(clientId: String?): ClientDetails {
+ val details = BaseClientDetails()
+ if (clientId.isNullOrEmpty()) {
+ return details
+ }
+ details.clientId = clientId
+ apiClientDao.findByAppid(clientId)?.let {
+ details.setAuthorizedGrantTypes(listOf("password", "authorization_code", "refresh_token"))
+ details.setScope(listOf("read"))
+ details.setResourceIds(listOf("oauth2-resource"))
+ val authorities = HashSet<GrantedAuthority>()
+ authorities.add(SimpleGrantedAuthority("ROLE_THIRD_ADMIN"))
+ details.authorities = authorities
+ details.setAutoApproveScopes(listOf("true"))
+ details.clientSecret = it.bcryptSecret
+ details.accessTokenValiditySeconds = 3600
+ details.refreshTokenValiditySeconds=43200
+ if(!it.thirdurl.isNullOrEmpty()){
+ val redir = HashSet<String>()
+ when {
+ it.thirdurl!!.contains(",") -> redir.addAll(it.thirdurl!!.split(","))
+ it.thirdurl!!.contains(";") -> redir.addAll(it.thirdurl!!.split(";"))
+ else -> redir.add(it.thirdurl!!)
+ }
+ details.registeredRedirectUri = redir
+ }
+
+ }
+ return details
+ }
+}
+
+
+@Configuration
+class OAuth2Config {
+
+ @Configuration
+ @EnableAuthorizationServer
+ class AuthorizationServerConfigure : AuthorizationServerConfigurerAdapter() {
+
+ @Autowired
+ private lateinit var redisConnectionFactory: RedisConnectionFactory
+
+ @Autowired
+ lateinit var passwordBCryptConfig: PasswordBCryptConfig
+
+ override fun configure(security: AuthorizationServerSecurityConfigurer?) {
+ security?.allowFormAuthenticationForClients()
+ security?.passwordEncoder(pwdEncoder())
+ }
+ @Bean
+ fun pwdEncoder(): BCryptPasswordEncoder {
+ return if (passwordBCryptConfig.seed.isBlank()) {
+ BCryptPasswordEncoder()
+ } else {
+ BCryptPasswordEncoder(passwordBCryptConfig.length,
+ SecureRandom(passwordBCryptConfig.seed.toByteArray()))
+ }
+ }
+
+ override fun configure(clients: ClientDetailsServiceConfigurer?) {
+ clients?.withClientDetails(OAuthDetailService())
+ }
+
+ override fun configure(endpoints: AuthorizationServerEndpointsConfigurer?) {
+ endpoints?.tokenStore(RedisTokenStore(redisConnectionFactory))
+ }
+ }
+}
\ No newline at end of file
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/security.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/security.kt
new file mode 100644
index 0000000..8f3710e
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/security.kt
@@ -0,0 +1,161 @@
+package com.supwisdom.oauth
+
+import com.supwisdom.oauth.domain.OAuthUser
+import com.supwisdom.oauth.service.OAuthUserService
+import com.supwisdom.oauth.util.*
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.security.authentication.*
+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.Authentication
+import org.springframework.security.core.AuthenticationException
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler
+import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher
+import org.springframework.stereotype.Component
+import java.io.IOException
+import java.security.SecureRandom
+import javax.servlet.ServletException
+import javax.servlet.http.HttpServletRequest
+import javax.servlet.http.HttpServletResponse
+import javax.sql.DataSource
+
+@Component("authLoginSuccessHandler")
+class AuthLoginSuccessHandler : SimpleUrlAuthenticationSuccessHandler() {
+ @Autowired
+ lateinit var oAuthUserService: OAuthUserService
+
+ @Override
+ override fun onAuthenticationSuccess(request: HttpServletRequest, response: HttpServletResponse, authentication: Authentication) {
+ val temp = authentication.principal as OAuthUser
+ val user = oAuthUserService.getByUid(temp.uid)
+ if (user != null) {
+ if (user.loginpwderror > 0) {
+ user.loginpwderror = 0
+ user.loginpwderrortime = null
+ }
+ user.lastlogin = CommonUtil.getNow()
+ oAuthUserService.saveUser(user)
+ defaultTargetUrl = "/index"
+ super.onAuthenticationSuccess(request, response, authentication)
+ } else {
+ throw UserLoginFailException("登录错误")
+ }
+ }
+}
+@Component("authLoginFailHandler")
+class AuthLoginFailHandler : SimpleUrlAuthenticationFailureHandler() {
+ @Autowired
+ lateinit var oAuthUserService: OAuthUserService
+
+ @Throws(IOException::class, ServletException::class)
+ override fun onAuthenticationFailure(request: HttpServletRequest,
+ response: HttpServletResponse, exception: AuthenticationException) {
+ val errmsg = when (exception) {
+ is BadCredentialsException -> "手机号或密码错误"
+ is LockedException -> "账户被锁定"
+ is DisabledException -> "用户状态错误"
+ is AccountExpiredException -> "用户有效期已过期"
+ else -> exception.message!!
+ }
+ val temp = request.getParameter("username")
+ if(!temp.isNullOrEmpty()) {
+ oAuthUserService.findByLoginid(temp)?.let {
+ if (it.loginpwderror == 0) {
+ it.loginpwderror = 0
+ it.loginpwderrortime = System.currentTimeMillis()
+ }
+ it.loginpwderror += 1
+ oAuthUserService.saveUser(it)
+ }
+ }
+ setDefaultFailureUrl("/login")
+ super.onAuthenticationFailure(request, response, ValidateCodeException(errmsg))
+ }
+}
+
+@EnableWebSecurity
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+class WebSecurityConfig {
+
+ companion object {
+ @Configuration
+ class MvcWebSecurityConfigurationAdapter : WebSecurityConfigurerAdapter() {
+ @Autowired
+ lateinit var dataSource: DataSource
+ @Autowired
+ lateinit var authLoginFailHandler: AuthLoginFailHandler
+ @Autowired
+ lateinit var authLoginSuccessHandler: AuthLoginSuccessHandler
+ @Autowired
+ lateinit var passwordBCryptConfig: PasswordBCryptConfig
+ @Autowired
+ lateinit var oAuthUserService: OAuthUserService
+
+ override fun configure(auth: AuthenticationManagerBuilder) {
+ auth.authenticationProvider(authenticationProvider())
+ }
+
+ @Bean
+ fun authenticationProvider(): DaoAuthenticationProvider {
+ return DaoAuthenticationProvider().apply {
+ setUserDetailsService(oAuthUserService)
+ 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) {
+ http.authorizeRequests()
+ .antMatchers("/login", "/login/form", "/userinfor").permitAll()
+ .antMatchers("/css/**").permitAll()
+ .antMatchers("/img/**").permitAll()
+ .antMatchers("/js/**").permitAll()
+ .antMatchers("/code/image").permitAll()
+ .antMatchers("/**").hasAnyRole("USER", "ADMIN")
+ .anyRequest().authenticated()
+ .and()
+ .sessionManagement()
+ .sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
+ .and()
+ .formLogin()
+ .loginPage("/login")
+ .loginProcessingUrl("/login/form")
+ .successHandler(authLoginSuccessHandler)
+ .failureHandler(authLoginFailHandler)
+ .and()
+ .logout()
+ .logoutRequestMatcher(AntPathRequestMatcher("/logout"))
+ .logoutSuccessUrl("/login")
+ .deleteCookies("JSESSIONID")
+ .invalidateHttpSession(true)
+ .and().csrf().ignoringAntMatchers("oauth/**")
+
+ }
+ }
+ }
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/service/OAuthUserService.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/service/OAuthUserService.kt
new file mode 100644
index 0000000..ab77a54
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/service/OAuthUserService.kt
@@ -0,0 +1,20 @@
+package com.supwisdom.oauth.service
+
+import com.supwisdom.oauth.bean.UserInfor
+import com.supwisdom.oauth.domain.OAuthUser
+import org.springframework.security.core.userdetails.UserDetailsService
+import org.springframework.transaction.annotation.Propagation
+import javax.transaction.Transactional
+
+interface OAuthUserService:UserDetailsService{
+ fun getByUid(uid: String): OAuthUser?
+
+ fun findByLoginid(loginid: String): OAuthUser?
+
+ fun saveUser(oAuthUser: OAuthUser):OAuthUser
+
+ fun findUserInfor(userid:String):UserInfor?
+
+ @org.springframework.transaction.annotation.Transactional(propagation = Propagation.REQUIRED,rollbackFor = [Exception::class])
+ fun updateFlag(userid: String,flag:Boolean,low:Double,day:Double):Int
+}
\ No newline at end of file
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/service/impl/OAuthUserServiceImpl.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/service/impl/OAuthUserServiceImpl.kt
new file mode 100644
index 0000000..75c1f0e
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/service/impl/OAuthUserServiceImpl.kt
@@ -0,0 +1,95 @@
+package com.supwisdom.oauth.service.impl
+
+import com.supwisdom.oauth.bean.UserInfor
+import com.supwisdom.oauth.dao.OAuthUserDao
+import com.supwisdom.oauth.domain.OAuthUser
+import com.supwisdom.oauth.service.OAuthUserService
+import com.supwisdom.oauth.util.UserLoginFailException
+import org.hibernate.query.NativeQuery
+import org.hibernate.transform.Transformers
+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 javax.persistence.EntityManager
+
+@Service
+class OAuthUserServiceImpl :OAuthUserService {
+ companion object {
+ const val TIME_INTERVAL = 1000 * 60 * 30
+ }
+ @Autowired
+ lateinit var oAuthUserDao: OAuthUserDao
+ @Autowired
+ lateinit var entityManager: EntityManager
+
+ override fun loadUserByUsername(username: String?): UserDetails {
+ if (username.isNullOrEmpty()) {
+ throw UsernameNotFoundException("用户不存在")
+ }
+ var temp = oAuthUserDao.findByLoginid(username)
+ if(temp==null){
+ temp = oAuthUserDao.findByPhone(username)
+ if(temp==null){
+ temp = oAuthUserDao.findByEmail(username)
+ }
+ }
+ if (temp != null) {
+ if (temp.loginpwd.isEmpty()) {
+ throw UserLoginFailException("用户注册后未设置登录密码,请找回密码或重新注册")
+ }
+ if (temp.loginpwderror >= 5 && (System.currentTimeMillis() - temp.loginpwderrortime!!) < TIME_INTERVAL) {
+ throw UserLoginFailException("密码错误次数过多,请30分钟后再试")
+ } else if (temp.loginpwderror >= 5 && (System.currentTimeMillis() - temp.loginpwderrortime!!) > TIME_INTERVAL) {
+ //更新时间
+ temp.loginpwderror = 0
+ temp.loginpwderrortime = null
+ oAuthUserDao.save(temp)
+ }
+ val authorities: Collection<GrantedAuthority> = AuthorityUtils.createAuthorityList("ROLE_USER","ROLE_ADMIN")
+ temp.auths = authorities
+ } else {
+ throw UsernameNotFoundException("用户不存在")
+ }
+ return temp
+ }
+
+ override fun getByUid(uid: String): OAuthUser? {
+ return oAuthUserDao.findById(uid).let {
+ if (it.isPresent) it.get() else null
+ }
+ }
+
+ override fun findByLoginid(loginid: String): OAuthUser? {
+ return oAuthUserDao.findByLoginid(loginid)
+ }
+
+ override fun saveUser(oAuthUser: OAuthUser): OAuthUser {
+ return oAuthUserDao.save(oAuthUser)
+ }
+
+ override fun findUserInfor(userid: String): UserInfor? {
+ var sql = "select ac.availbal as availbal, ac.LOWFREE_FLAG as lowfreeflag,ac.LOWFREE_LIMIT as lowfreelimit,ac.DAY_LIMIT as daylimit, ac.ACCNAME as name,pa.points " +
+ "from tb_account ac left join tb_points_account pa on pa.userid=ac.userid where ac.trans_status<>'closed' and ac.userid =:uid "
+ var query = entityManager.createNativeQuery(sql)
+ query.setParameter("uid",userid)
+ query.unwrap(NativeQuery::class.java).setResultTransformer(Transformers.aliasToBean(UserInfor::class.java))
+ val ret = query.resultList as List<UserInfor>
+ if(ret.isNotEmpty()){
+ return ret[0]
+ }
+ return null
+ }
+
+ override fun updateFlag(userid: String,flag:Boolean,low:Double,day:Double):Int {
+ var sql = "update tb_account set lowfree_flag=:flag,lowfree_limit=:low, day_limit=:day where trans_status<>'closed' and userid=:uid "
+ var query = entityManager.createNativeQuery(sql)
+ query.setParameter("uid",userid)
+ query.setParameter("flag",flag)
+ query.setParameter("low",low)
+ query.setParameter("day",day)
+ return query.executeUpdate()
+ }
+}
\ No newline at end of file
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/system_ctrl.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/system_ctrl.kt
new file mode 100644
index 0000000..085fe58
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/system_ctrl.kt
@@ -0,0 +1,328 @@
+package com.supwisdom.oauth
+
+import com.supwisdom.dlpay.api.util.MobileNumberCheck
+import com.supwisdom.oauth.bean.JsonResult
+import com.supwisdom.oauth.domain.OAuthUser
+import com.supwisdom.oauth.service.OAuthUserService
+import com.supwisdom.oauth.util.CommonUtil
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.data.redis.core.RedisTemplate
+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.crypto.bcrypt.BCryptPasswordEncoder
+import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler
+import org.springframework.stereotype.Controller
+import org.springframework.ui.Model
+import org.springframework.web.bind.annotation.*
+import java.time.Duration
+import java.util.regex.Pattern
+import javax.servlet.http.HttpServletRequest
+import javax.servlet.http.HttpServletResponse
+
+@Controller
+@RequestMapping("/u")
+class SystemController {
+ @Autowired
+ lateinit var oauthUserService: OAuthUserService
+ @Autowired
+ lateinit var redisTemplate: RedisTemplate<String, String>
+
+ @GetMapping("/editpwd")
+ fun indexView(): String {
+ return "editpwd"
+ }
+
+ @GetMapping("/infor")
+ fun infor(@AuthenticationPrincipal princp: UserDetails, model: Model): String {
+ val temp = princp as OAuthUser
+ var user = oauthUserService.findByLoginid(temp.loginid) ?: return "redirect:/login"
+ model.addAttribute("loginid", user.loginid)
+ model.addAttribute("deptname", user.deptname)
+ model.addAttribute("email", user.email)
+ model.addAttribute("phone", user.phone)
+ model.addAttribute("idno", user.idno)
+ model.addAttribute("expiredate", user.expiredate)
+ if (!user.userid.isNullOrEmpty()) {
+ var uinfor = oauthUserService.findUserInfor(user.userid!!)
+ if (uinfor != null) {
+ model.addAttribute("uinfor", uinfor)
+ }
+ }
+ return "infor"
+ }
+
+ @GetMapping("/limit")
+ fun limit(@AuthenticationPrincipal princp: UserDetails, model: Model): String {
+ val user = princp as OAuthUser
+ if (!user.userid.isNullOrEmpty()) {
+ var uinfor = oauthUserService.findUserInfor(user.userid!!)
+ if (uinfor != null) {
+ model.addAttribute("uinfor", uinfor)
+ }
+ }
+ return "limit"
+ }
+ @GetMapping("/paypwd")
+ fun paypwd(@AuthenticationPrincipal princp: UserDetails): String {
+ val temp = princp as OAuthUser
+ var user = oauthUserService.findByLoginid(temp.loginid) ?: return "redirect:/logout"
+ return if(user.paypwd.isNullOrEmpty()){
+ "setpaypwd"
+ }else{
+ "paypwdmng"
+ }
+ }
+ @GetMapping("/setpaypwd")
+ fun setpaypwd(@RequestParam randcode: String, model: Model): String {
+ model.addAttribute("randcode",randcode)
+ return "setpaypwd"
+ }
+
+ @GetMapping("/selectfind")
+ fun selectfind(@RequestParam pwdtype: String,@AuthenticationPrincipal princp: UserDetails, model: Model): String {
+ val temp = princp as OAuthUser
+ var user = oauthUserService.findByLoginid(temp.loginid) ?: return "redirect:/logout"
+ model.addAttribute("pwdtype",pwdtype)
+ model.addAttribute("email",user.email)
+ model.addAttribute("phone",user.phone)
+ return "selectfind"
+ }
+ @GetMapping("/findby")
+ fun findby(@RequestParam pwdtype: String,@RequestParam type: String,@AuthenticationPrincipal princp: UserDetails, model: Model): String {
+ val temp = princp as OAuthUser
+ var user = oauthUserService.findByLoginid(temp.loginid) ?: return "redirect:/logout"
+ model.addAttribute("pwdtype",pwdtype)
+ model.addAttribute("type",type)
+ if("email"==type&&!user.email.isNullOrEmpty()){
+ model.addAttribute("email",user.email)
+ return "findby"
+ }
+ if("phone"==type&&!user.phone.isNullOrEmpty()){
+ model.addAttribute("phone",user.phone)
+ return "findby"
+ }
+ model.addAttribute("email",user.email)
+ model.addAttribute("phone",user.phone)
+ return "selectfind"
+ }
+
+ @GetMapping("/editpaypwd")
+ fun editpaypwd(): String {
+ return "editpaypwd"
+ }
+ @GetMapping("/findpaypwd")
+ fun findpaypwd(): String {
+ return "editpaypwd"
+ }
+
+ @PostMapping("/doeditpwd")
+ @ResponseBody
+ fun doeditpwd(@RequestParam oldpwd: String,
+ @RequestParam newpwd: String,
+ @RequestParam renewpwd: String,
+ @AuthenticationPrincipal princp: UserDetails, request: HttpServletRequest, response: HttpServletResponse): JsonResult {
+ val user = princp as OAuthUser
+ var temp = oauthUserService.findByLoginid(user.loginid) ?: return JsonResult.error("用户不存在")
+ if (!newpwd.matches(Regex("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,32}$"))) {
+ return JsonResult.error("密码必须包含数字和字符,长度6~32位")
+ }
+ if (newpwd.isEmpty() || newpwd.length < 6) {
+ return JsonResult.error("请重新设置密码,密码不能小于6位字符")
+ }
+ if (newpwd != renewpwd) {
+ return JsonResult.error("两次密码不一致")
+ }
+ val pwdtimes = temp.checkLoginpwdtime()
+ if (pwdtimes == -1) {
+ SecurityContextHolder.getContext().authentication?.also {
+ SecurityContextLogoutHandler().logout(request, response, it)
+ }
+ return JsonResult.error(-1, "原密码错误次数过多,将退出系统,如有问题请在登录页面点击忘记密码功能找回密码")
+ } else if (pwdtimes == 1) {
+ oauthUserService.saveUser(temp)
+ }
+ val encoder = BCryptPasswordEncoder()
+ if (!encoder.matches(oldpwd, temp.loginpwd)) {
+ temp.updateLoginpwderror(false).also {
+ if (it) oauthUserService.saveUser(temp)
+ }
+ return JsonResult.error("原密码错误")
+ } else {
+ temp.updateLoginpwderror(true)
+ }
+ temp.loginpwd = encoder.encode(newpwd)
+ oauthUserService.saveUser(temp)
+ return JsonResult.ok("ok")
+ }
+
+ @PostMapping("/doinfor")
+ @ResponseBody
+ fun doeditpwd(@RequestParam type: String,
+ @RequestParam vale: String,
+ @AuthenticationPrincipal princp: UserDetails): JsonResult {
+ val user = princp as OAuthUser
+ var temp = oauthUserService.findByLoginid(user.loginid) ?: return JsonResult.error("用户不存在")
+ if ("email" == type) {
+ if (!Pattern.matches("^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$", vale)) {
+ return JsonResult.error("邮箱不合法")
+ }
+ temp.email = vale
+ } else if ("phone" == type) {
+ if (vale.isEmpty() || !MobileNumberCheck.isPhone(vale)) {
+ return JsonResult.error("手机号不合法")
+ }
+ temp.phone = vale
+ }
+ oauthUserService.saveUser(temp)
+ return JsonResult.ok("ok")
+ }
+
+ @PostMapping("/editlimit")
+ @ResponseBody
+ fun editlimit(@RequestParam low: Double,
+ @RequestParam flag: Int,
+ @RequestParam day: Double,
+ @AuthenticationPrincipal princp: UserDetails): JsonResult {
+ val user = princp as OAuthUser
+ var temp = oauthUserService.findByLoginid(user.loginid) ?: return JsonResult.error("用户不存在")
+ if (low > day) {
+ return JsonResult.error("免密限额不能大于日累计消费限额")
+ }
+ if (!temp.userid.isNullOrEmpty()) {
+ var uinfor = oauthUserService.findUserInfor(user.userid!!)
+ if (uinfor != null) {
+ var f = false
+ if (flag == 1) {
+ f = true
+ }
+ oauthUserService.updateFlag(temp.userid!!, f, low, day)
+ return JsonResult.ok("修改成功")
+ }
+ }
+ return JsonResult.error("用户账户未绑定")
+ }
+
+ @RequestMapping("/dopaypwd")
+ @ResponseBody
+ fun dopaypwd(@RequestParam pwd: String, @RequestParam repwd: String, @RequestParam(required = false) oldpwd: String?,
+ @RequestParam type: String, randcode: String?,@AuthenticationPrincipal princp: UserDetails): JsonResult {
+ val temp = princp as OAuthUser
+ var user = oauthUserService.findByLoginid(temp.loginid) ?: return JsonResult.error("用户不存在")
+ if (pwd != repwd) {
+ return JsonResult.error("两次密码不一致,请确认")
+ }
+ if (pwd.length != 6) {
+ return JsonResult.error("支付密码为6位数字")
+ }
+ if (!org.apache.commons.lang3.math.NumberUtils.isDigits(pwd)) {
+ return JsonResult.error("支付密码为6位数字")
+ }
+ val encoder = BCryptPasswordEncoder()
+ if (user.paypwd.isNullOrEmpty()) {
+ user.paypwd = encoder.encode(pwd)
+ oauthUserService.saveUser(user)
+ return JsonResult.ok("OK")
+ ?.put("paypwdset", true)!!
+ } else {
+ when (type) {
+ "new" -> return JsonResult.error("支付密码已设置,不能重复设置")
+ "renew" -> {
+ if (oldpwd.isNullOrEmpty()) {
+ return JsonResult.error("原支付密码错误")
+ }
+ val paypwdtimes = user.checkPaypwdtime()
+ if (paypwdtimes == -1) {
+ return JsonResult.error("密码错误次数过多,请30分钟后再试")
+ } else if (paypwdtimes == 1) {
+ oauthUserService.saveUser(user)
+ }
+ if (!encoder.matches(oldpwd, user.paypwd)) {
+ user.updatePaypwderror(false).also {
+ if (it) oauthUserService.saveUser(user)
+ }
+ return JsonResult.error("原支付密码错误")
+ } else {
+ user.updatePaypwderror(true).also {
+ if (it) oauthUserService.saveUser(user)
+ }
+ }
+ user.paypwd = encoder.encode(pwd)
+ oauthUserService.saveUser(user)
+ return JsonResult.ok("OK")
+ ?.put("paypwdset", true)!!
+ }
+ "find" -> {
+ if (randcode.isNullOrEmpty()) {
+ return JsonResult.error("信息有误,请返回并重新设置")
+ }
+ val code = redisTemplate.opsForValue().get(user.uid)
+ if (randcode != code) {
+ return JsonResult.error(-1, "长时间未操作,请返回上一步,并重新发送验证码")
+ }
+ user.paypwd = encoder.encode(pwd)
+ oauthUserService.saveUser(user)
+ return JsonResult.ok("OK")
+ }
+ else -> return JsonResult.error("请求错误")
+ }
+ }
+ }
+
+ @PostMapping("/code")
+ @ResponseBody
+ fun code(@RequestParam pwdtype: String,@RequestParam type: String,@AuthenticationPrincipal princp: UserDetails): JsonResult {
+ val u = princp as OAuthUser
+ var user = oauthUserService.findByLoginid(u.loginid) ?: return JsonResult.error("用户不存在")
+ var key = pwdtype
+ val code = CommonUtil.randomNumber(6)
+ if("email"==type){
+ if(user.email.isNullOrEmpty()){
+ return JsonResult.error("未配置邮箱")
+ }
+ key.plus(user.email)
+ }else if("phone"==type){
+ if(user.phone.isNullOrEmpty()){
+ return JsonResult.error("未配置手机号")
+ }
+ key.plus(user.phone)
+ }
+ println(code)
+ //TODO 调用发送验证码的方法
+ redisTemplate.opsForValue().set(key, code!!, Duration.ofMinutes(10))
+ return JsonResult.ok("ok")
+ }
+ @PostMapping("/checkcode")
+ @ResponseBody
+ fun checkcode(@RequestParam pwdtype: String,@RequestParam code: String,
+ @RequestParam type: String,@AuthenticationPrincipal princp: UserDetails): JsonResult {
+ val u = princp as OAuthUser
+ var user = oauthUserService.findByLoginid(u.loginid) ?: return JsonResult.error("用户不存在")
+ var key = pwdtype
+ if("email"==type){
+ if(user.email.isNullOrEmpty()){
+ return JsonResult.error("未配置邮箱")
+ }
+ key.plus(user.email)
+ }else if("phone"==type){
+ if(user.phone.isNullOrEmpty()){
+ return JsonResult.error("未配置手机号")
+ }
+ key.plus(user.phone)
+ }
+ //TODO 调用发送验证码的方法
+ val temp = redisTemplate.opsForValue().get(key)
+ if (!temp.isNullOrEmpty()) {
+ if (temp != code) {
+ return JsonResult.error("验证码错误")
+ }
+ redisTemplate.delete(key)
+ val newCode = CommonUtil.getRandomString(30)
+ redisTemplate.opsForValue().set(user.uid, newCode, Duration.ofMinutes(30))
+ //防止直接访问页面设置密码
+ return JsonResult.ok("OK").put("randcode", newCode)!!
+ } else {
+ return JsonResult.error(-1, "验证码无效或已过期,请重新获取")
+ }
+ }
+}
\ No newline at end of file
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/tenant.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant.kt
new file mode 100644
index 0000000..ef0c5b4
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant.kt
@@ -0,0 +1,26 @@
+package com.supwisdom.oauth
+import com.supwisdom.oauth.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
+
+@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/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/HibernateConfig.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/HibernateConfig.kt
new file mode 100644
index 0000000..7e9d591
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/HibernateConfig.kt
@@ -0,0 +1,53 @@
+package com.supwisdom.oauth.tenant
+
+import org.hibernate.MultiTenancyStrategy
+import org.hibernate.cfg.Environment
+import org.hibernate.context.spi.CurrentTenantIdentifierResolver
+import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings
+import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.orm.jpa.JpaVendorAdapter
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter
+
+import javax.sql.DataSource
+import java.util.HashMap
+
+
+@Configuration
+class HibernateConfig(@param:Autowired private val jpaProperties: JpaProperties,
+ private val hibernateProperties: HibernateProperties) {
+
+ val jpaVendorAdapter: JpaVendorAdapter
+ @Bean
+ get() {
+ val adapter = HibernateJpaVendorAdapter()
+ adapter.setGenerateDdl(true)
+ return adapter
+ }
+
+ @Bean("entityManagerFactory")
+ fun entityManagerFactoryBean(dataSource: DataSource,
+ multiTenantConnectionProvider: MultiTenantConnectionProvider,
+ currentTenantIdentifierResolver: CurrentTenantIdentifierResolver): LocalContainerEntityManagerFactoryBean {
+ val properties = HashMap<String, Any>()
+ properties.putAll(hibernateProperties
+ .determineHibernateProperties(jpaProperties.properties,
+ HibernateSettings()))
+ properties[Environment.MULTI_TENANT] = MultiTenancyStrategy.SCHEMA
+ properties[Environment.MULTI_TENANT_CONNECTION_PROVIDER] = multiTenantConnectionProvider
+ properties[Environment.MULTI_TENANT_IDENTIFIER_RESOLVER] = currentTenantIdentifierResolver
+
+ val em = LocalContainerEntityManagerFactoryBean()
+ em.dataSource = dataSource
+ em.setPackagesToScan("com.supwisdom")
+ em.setJpaPropertyMap(properties)
+ em.jpaVendorAdapter = jpaVendorAdapter
+ return em
+ }
+
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/MultiTenantConnectionProviderImpl.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/MultiTenantConnectionProviderImpl.kt
new file mode 100644
index 0000000..32f0da5
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/MultiTenantConnectionProviderImpl.kt
@@ -0,0 +1,65 @@
+package com.supwisdom.oauth.tenant
+
+import mu.KotlinLogging
+import org.hibernate.HibernateException
+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
+class MultiTenantConnectionProviderImpl : MultiTenantConnectionProvider {
+ @Autowired
+ private val dataSource: DataSource? = null
+ private val logger = KotlinLogging.logger { }
+ @Throws(SQLException::class)
+ override fun getAnyConnection(): Connection {
+ return dataSource!!.connection
+ }
+
+ @Throws(SQLException::class)
+ override fun releaseAnyConnection(connection: Connection) {
+ connection.close()
+ }
+
+ @Throws(SQLException::class)
+ override fun getConnection(ti: String): Connection {
+ val tenantIdentifier = TenantContext.tenantSchema
+ val connection = anyConnection
+ try {
+ logger.debug { "tenantid=$tenantIdentifier" }
+ if (tenantIdentifier.isNullOrEmpty()||"default"==tenantIdentifier) {
+ connection.createStatement().execute("SET search_path = public")
+ } else {
+ connection.createStatement().execute("SET search_path = \"$tenantIdentifier\", public")
+ }
+ } catch (e: SQLException) {
+ throw HibernateException("Problem setting schema to " + tenantIdentifier!!, e)
+ }
+
+ return connection
+ }
+
+ @Throws(SQLException::class)
+ override fun releaseConnection(tenantIdentifier: String, connection: Connection) {
+ connection.close()
+ }
+
+ override fun supportsAggressiveRelease(): Boolean {
+ return false
+ }
+
+ override fun isUnwrappableAs(unwrapType: Class<*>): Boolean {
+ return false
+ }
+
+ override fun <T> unwrap(unwrapType: Class<T>): T? {
+ return null
+ }
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/MultiTenantIdentifierResolver.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/MultiTenantIdentifierResolver.kt
new file mode 100644
index 0000000..8e793dd
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/MultiTenantIdentifierResolver.kt
@@ -0,0 +1,22 @@
+package com.supwisdom.oauth.tenant
+
+import org.hibernate.context.spi.CurrentTenantIdentifierResolver
+import org.springframework.stereotype.Component
+
+/**
+ * Created by shuwei on 2018/12/4.
+ */
+@Component
+class MultiTenantIdentifierResolver : CurrentTenantIdentifierResolver {
+ override fun resolveCurrentTenantIdentifier(): String? {
+ return if(TenantContext.tenantSchema.isNullOrEmpty()){
+ "default"
+ }else{
+ TenantContext.tenantSchema
+ }
+ }
+
+ override fun validateExistingCurrentSessions(): Boolean {
+ return true
+ }
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/TenantContext.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/TenantContext.kt
new file mode 100644
index 0000000..2d6116f
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/TenantContext.kt
@@ -0,0 +1,44 @@
+package com.supwisdom.oauth.tenant
+
+import org.springframework.web.context.request.RequestContextHolder
+import org.springframework.web.context.request.ServletRequestAttributes
+
+/**
+ * Created by shuwei on 2018/11/29.
+ */
+object TenantContext {
+ private val currentTenant = ThreadLocal<String>()
+
+ var tenantSchema: String?
+ get() = getId()
+ set(tid) = currentTenant.set(tid)
+
+ fun clear() {
+ currentTenant.set(null)
+ }
+
+ private fun getId(): String? {
+ try {
+ if (!currentTenant.get().isNullOrEmpty()) {
+ return currentTenant.get()
+ }
+ val requestAttributes = RequestContextHolder.getRequestAttributes() as ServletRequestAttributes?
+ if (requestAttributes != null) {
+ val schema = requestAttributes.request.getAttribute("X-TENANT-ID") as String?
+ if (!schema.isNullOrEmpty()) {
+ return schema
+ }
+ val session = requestAttributes.request.session
+ if (session != null) {
+ val tenantId = session.getAttribute("X-TENANT-ID") as String?
+ if (tenantId != null) {
+ return tenantId
+ }
+ }
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ return null
+ }
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/TenantInterceptor.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/TenantInterceptor.kt
new file mode 100644
index 0000000..f710228
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/tenant/TenantInterceptor.kt
@@ -0,0 +1,29 @@
+package com.supwisdom.oauth.tenant
+
+
+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
+class TenantInterceptor : HandlerInterceptorAdapter() {
+ @Throws(Exception::class)
+ override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
+ var tid = request.getParameter("tenant_id")
+ var session = request.session
+ if(tid.isNullOrEmpty()){
+ tid = request.getHeader("X-TENANT-ID")
+ if(tid.isNullOrEmpty()){
+ tid = session.getAttribute("X-TENANT-ID") as String?
+ }
+ }
+ if(!tid.isNullOrEmpty()){
+ session.setAttribute("X-TENANT-ID",tid)
+ TenantContext.tenantSchema = tid
+ }
+ return true
+ }
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/util/CommonUtil.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/util/CommonUtil.kt
new file mode 100644
index 0000000..8f1a3c7
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/util/CommonUtil.kt
@@ -0,0 +1,44 @@
+package com.supwisdom.oauth.util
+import java.text.SimpleDateFormat
+import java.util.*
+
+object CommonUtil {
+ /**
+ * Description: 根据类型返回一个当前时间 @param partten String @return String 格式:partten
+ */
+ fun getNow(partten: String): String {
+ val sdf = SimpleDateFormat(partten)
+ return sdf.format(Date())
+ }
+ fun getNow(): String {
+ val sdf = java.text.SimpleDateFormat("yyyyMMddHHmmss")
+ return sdf.format(Date())
+ }
+
+ fun randomNumber(length: Int): String? {
+ var numbersAndLetters: CharArray? = null
+ var randGen: Random? = null
+ if (length < 1) {
+ return null
+ }
+ if (randGen == null) {
+ randGen = Random()
+ numbersAndLetters = "0123456789".toCharArray()
+ }
+ val randBuffer = CharArray(length)
+ for (i in randBuffer.indices) {
+ randBuffer[i] = numbersAndLetters!![randGen.nextInt(9)]
+ }
+ return String(randBuffer)
+ }
+ fun getRandomString(length: Int): String {
+ val base = "abcdefghijklmnopqrstuvwxyz234567"
+ val random = Random()
+ val sb = StringBuffer()
+ for (i in 0 until length) {
+ val number = random.nextInt(base.length)
+ sb.append(base[number])
+ }
+ return sb.toString()
+ }
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/util/Constants.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/util/Constants.kt
new file mode 100644
index 0000000..8860143
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/util/Constants.kt
@@ -0,0 +1,5 @@
+package com.supwisdom.oauth.util
+
+object Constants {
+ const val HEADER_AUTHORIZATION = "Authorization"
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/util/JwtConfig.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/util/JwtConfig.kt
new file mode 100644
index 0000000..70cc74e
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/util/JwtConfig.kt
@@ -0,0 +1,16 @@
+package com.supwisdom.oauth.util
+
+import org.springframework.beans.factory.annotation.Value
+import org.springframework.context.annotation.Configuration
+
+@Configuration
+class JwtConfig {
+ @Value("\${jwt.secret}")
+ val secret: String? = null
+ @Value("\${jwt.expiration:3600}")
+ var expiration: Long? = 3600L
+ @Value("\${jwt.header:Authorization}")
+ val header = "Authorization"
+ @Value("\${jwt.token_header:Bearer }")
+ val tokenHeader = "Bearer"
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/util/JwtToken.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/util/JwtToken.kt
new file mode 100644
index 0000000..7a7fb7b
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/util/JwtToken.kt
@@ -0,0 +1,5 @@
+package com.supwisdom.oauth.util
+
+import org.jose4j.jwt.NumericDate
+
+class JwtToken(var jti: String?, var jwtToken: String?, var expiration: NumericDate?)
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/util/PasswordBCryptConfig.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/util/PasswordBCryptConfig.kt
new file mode 100644
index 0000000..139508c
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/util/PasswordBCryptConfig.kt
@@ -0,0 +1,12 @@
+package com.supwisdom.oauth.util
+
+import org.springframework.beans.factory.annotation.Value
+import org.springframework.context.annotation.Configuration
+
+@Configuration
+class PasswordBCryptConfig {
+ @Value("\${auth.password.bcrypt.length:10}")
+ var length: Int = 0
+ @Value("\${auth.password.bcrypt.seed}")
+ var seed = ""
+}
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/util/Test.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/util/Test.kt
new file mode 100644
index 0000000..b89841f
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/util/Test.kt
@@ -0,0 +1,20 @@
+package com.supwisdom.oauth.util
+
+
+class Test{
+ companion object {
+ @JvmStatic
+ fun main(args: Array<String>) {
+
+ }
+ }
+
+ private fun <T : Number> min(values: Array<T>?): T? where T : Comparable<T> {
+ if (values == null || values.size == 0) return null
+ var min = values[0]
+ for (i in 1 until values.size) {
+ if (min.compareTo(values[i]) > 0) min = values[i]
+ }
+ return min
+ }
+}
\ No newline at end of file
diff --git a/oauth/src/main/kotlin/com/supwisdom/oauth/util/UserLoginFailException.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/util/UserLoginFailException.kt
new file mode 100644
index 0000000..ca7317a
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/util/UserLoginFailException.kt
@@ -0,0 +1,7 @@
+package com.supwisdom.oauth.util
+
+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/oauth/src/main/kotlin/com/supwisdom/oauth/util/ValidateCodeException.kt b/oauth/src/main/kotlin/com/supwisdom/oauth/util/ValidateCodeException.kt
new file mode 100644
index 0000000..b5459dc
--- /dev/null
+++ b/oauth/src/main/kotlin/com/supwisdom/oauth/util/ValidateCodeException.kt
@@ -0,0 +1,19 @@
+/**
+ *
+ */
+package com.supwisdom.oauth.util
+
+import org.springframework.security.core.AuthenticationException
+
+/**
+ * @author lenovo
+ */
+class ValidateCodeException(msg: String) : AuthenticationException(msg) {
+ companion object {
+
+ /**
+ *
+ */
+ private val serialVersionUID = 1170189980006964105L
+ }
+}
diff --git a/oauth/src/main/resources/static/css/aui-iconfont.ttf b/oauth/src/main/resources/static/css/aui-iconfont.ttf
new file mode 100755
index 0000000..2c9d80e
--- /dev/null
+++ b/oauth/src/main/resources/static/css/aui-iconfont.ttf
Binary files differ
diff --git a/oauth/src/main/resources/static/css/aui.css b/oauth/src/main/resources/static/css/aui.css
new file mode 100644
index 0000000..6e98b5d
--- /dev/null
+++ b/oauth/src/main/resources/static/css/aui.css
@@ -0,0 +1,2734 @@
+/*
+ * =========================================================================
+ * APIClud - AUI UI 框架 流浪男 QQ:343757327 http://www.auicss.com
+ * Verson 2.1
+ * =========================================================================
+ */
+ /*初始化类*/
+@charset "UTF-8";
+html{
+ font-family: "Helvetica Neue", Helvetica, sans-serif;
+ font-size: 20px;
+}
+html,body {
+ -webkit-touch-callout:none;
+ -webkit-text-size-adjust:none;
+ -webkit-tap-highlight-color:rgba(0, 0, 0, 0);
+ -webkit-user-select:none;
+ width: 100%;
+}
+body {
+ line-height: 1.5;
+ font-size: 0.8rem;
+ color: #212121;
+ background-color: #f5f5f5;
+ outline: 0;
+}
+html,body,header,section,footer,div,ul,ol,li,img,a,span,em,del,legend,center,strong,var,fieldset,form,label,dl,dt,dd,cite,input,hr,time,mark,code,figcaption,figure,textarea,h1,h2,h3,h4,h5,h6,p{
+ margin:0;
+ border:0;
+ padding:0;
+ font-style:normal;
+}
+* {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-user-select: none;
+ -webkit-tap-highlight-color: transparent;
+ outline: none;
+}
+@media only screen and (min-width: 400px) {
+ html {
+ font-size: 21.33333333px !important;
+ }
+}
+@media only screen and (min-width: 414px) {
+ html {
+ font-size: 21px !important;
+ }
+}
+@media only screen and (min-width: 480px) {
+ html {
+ font-size: 25.6px !important;
+ }
+}
+ul, li {
+ list-style: none;
+}
+p {
+ font-size: 0.7rem;
+ color: #757575;
+}
+a {
+ color: #0062cc;
+ text-decoration: none;
+ background-color: transparent;
+}
+textarea {
+ overflow: hidden;
+ resize: none;
+}
+button {
+ overflow: visible;
+}
+button,select {
+ text-transform: none;
+}
+button,input,select,textarea {
+ font: inherit;
+ color: inherit;
+}
+/*自动隐藏文字*/
+.aui-ellipsis-1 {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+.aui-ellipsis {
+ display: -webkit-box;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-wrap: break-word;
+ word-break: break-all;
+ white-space: normal !important;
+ -webkit-line-clamp: 1;
+ -webkit-box-orient: vertical;
+}
+.aui-ellipsis-2 {
+ display: -webkit-box;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-wrap: break-word;
+ word-break: break-all;
+ white-space: normal !important;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+}
+/*水平线*/
+.aui-hr {
+ width: 100%;
+ position: relative;
+ border-top: 1px solid #dddddd;
+ height: 1px;
+}
+@media screen and (-webkit-min-device-pixel-ratio:1.5) {
+ .aui-hr{
+ border: none;
+ background-size: 100% 1px;
+ background-repeat: no-repeat;
+ background-position: top;
+ background-image: linear-gradient(0,#dddddd,#dddddd 50%,transparent 50%);
+ background-image: -webkit-linear-gradient(90deg,#dddddd,#dddddd 50%,transparent 50%);
+ }
+}
+/*内外边距类*/
+.aui-padded-0 {
+ padding: 0 !important;
+}
+.aui-padded-5 {
+ padding: 0.25rem !important;
+}
+.aui-padded-10 {
+ padding: 0.5rem !important;
+}
+.aui-padded-15 {
+ padding: 0.75rem !important;
+}
+.aui-padded-t-0 {
+ padding-top: 0 !important;
+}
+.aui-padded-t-5 {
+ padding-top: 0.25rem !important;
+}
+.aui-padded-t-10 {
+ padding-top: 0.5rem !important;
+}
+.aui-padded-t-15 {
+ padding-top: 0.75rem !important;
+}
+.aui-padded-b-0 {
+ padding-bottom: 0 !important;
+}
+.aui-padded-b-5 {
+ padding-bottom: 0.25rem !important;
+}
+.aui-padded-b-10 {
+ padding-bottom: 0.5rem !important;
+}
+.aui-padded-b-15 {
+ padding-bottom: 0.75rem !important;
+}
+.aui-padded-l-0 {
+ padding-left: 0 !important;
+}
+.aui-padded-l-5 {
+ padding-left: 0.25rem !important;
+}
+.aui-padded-l-10 {
+ padding-left: 0.5rem !important;
+}
+.aui-padded-l-15 {
+ padding-left: 0.75rem !important;
+}
+.aui-padded-r-0 {
+ padding-right: 0 !important;
+}
+.aui-padded-r-5 {
+ padding-right: 0.25rem !important;
+}
+.aui-padded-r-10 {
+ padding-right: 0.5rem !important;
+}
+.aui-padded-r-15 {
+ padding-right: 0.75rem !important;
+}
+.aui-margin-0 {
+ margin: 0 !important;
+}
+.aui-margin-5 {
+ margin: 0.25rem !important;
+}
+.aui-margin-10 {
+ margin: 0.5rem !important;
+}
+.aui-margin-15 {
+ margin: 0.75rem !important;
+}
+.aui-margin-t-0 {
+ margin-top: 0.25rem !important;
+}
+.aui-margin-t-5 {
+ margin-top: 0 !important;
+}
+.aui-margin-t-10 {
+ margin-top: 0.5rem !important;
+}
+.aui-margin-t-15 {
+ margin-top: 0.75rem !important;
+}
+.aui-margin-b-0 {
+ margin-bottom: 0 !important;
+}
+.aui-margin-b-5 {
+ margin-bottom: 0.25rem !important;
+}
+.aui-margin-b-10 {
+ margin-bottom: 0.5rem !important;
+}
+.aui-margin-b-15 {
+ margin-bottom: 0.75rem !important;
+}
+.aui-margin-l-0 {
+ margin-left: 0 !important;
+}
+.aui-margin-l-5 {
+ margin-left: 0.25rem !important;
+}
+.aui-margin-l-10 {
+ margin-left: 0.5rem !important;
+}
+.aui-margin-l-15 {
+ margin-left: 0.75rem !important;
+}
+.aui-margin-r-0 {
+ margin-right: 0 !important;
+}
+.aui-margin-r-5 {
+ margin-right: 0.25rem !important;
+}
+.aui-margin-r-10 {
+ margin-right: 0.5rem !important;
+}
+.aui-margin-r-15 {
+ margin-right: 0.75rem !important;
+}
+.aui-clearfix {
+ clear: both;
+}
+.aui-clearfix:before {
+ display: table;
+ content: " ";
+}
+.aui-clearfix:after {
+ clear: both;
+}
+/*文字对齐*/
+.aui-text-left {
+ text-align: left !important;
+}
+.aui-text-center {
+ text-align: center !important;
+}
+.aui-text-justify {
+ text-align: justify !important;
+}
+.aui-text-right {
+ text-align: right !important;
+}
+/*文字、背景颜色*/
+h1,h2,h3,h4,h5,h6 {
+ font-weight: 400;
+}
+h1 {
+ font-size: 1.2rem;
+}
+h2 {
+ font-size: 1rem;
+}
+h3 {
+ font-size: 0.8rem;
+}
+h4 {
+ font-size: 0.7rem;
+}
+h5 {
+ font-size: 0.7rem;
+ font-weight: normal;
+ color: #757575;
+}
+h6 {
+ font-size: 0.7rem;
+ font-weight: normal;
+ color: #757575;
+}
+h1 small,h2 small,h3 small,h4 small {
+ font-weight: normal;
+ line-height: 1;
+ color: #757575;
+}
+h5 small,h6 small {
+ font-weight: normal;
+ line-height: 1;
+ color: #757575;
+}
+h1 small,h2 small,h3 small {
+ font-size: 65%;
+}
+h4 small,h5 small,h6 small {
+ font-size: 75%;
+}
+img {
+ max-width: 100%;
+ display: block;
+}
+.aui-font-size-12 {
+ font-size: 0.6rem !important;
+}
+.aui-font-size-14 {
+ font-size: 0.7rem !important;
+}
+.aui-font-size-16 {
+ font-size: 0.8rem !important;
+}
+.aui-font-size-18 {
+ font-size: 0.9rem !important;
+}
+.aui-font-size-20 {
+ font-size: 1rem !important;
+}
+.aui-text-default {
+ color: #212121 !important;
+}
+.aui-text-white {
+ color: #ffffff !important;
+}
+.aui-text-primary {
+ color: #00bcd4 !important;
+}
+.aui-text-success {
+ color: #009688 !important;
+}
+.aui-text-info {
+ color: #03a9f4 !important;
+}
+.aui-text-warning {
+ color: #ffc107 !important;
+}
+.aui-text-danger {
+ color: #e51c23 !important;
+}
+.aui-text-pink {
+ color: #e91e63 !important;
+}
+.aui-text-purple {
+ color: #673ab7 !important;
+}
+.aui-text-indigo {
+ color: #3f51b5 !important;
+}
+.aui-text-green {
+ color: #7cba59 !important;
+}
+.aui-text-orange {
+ color: #e0620d !important;
+}
+.aui-bg-default {
+ background-color: #f5f5f5 !important;
+}
+.aui-bg-primary {
+ background-color: #00bcd4 !important;
+}
+.aui-bg-success {
+ background-color: #009688 !important;
+}
+.aui-bg-info {
+ background-color: #03a9f4 !important;
+}
+.aui-bg-warning {
+ background-color: #f1c40f !important;
+}
+.aui-bg-danger {
+ background-color: #e51c23 !important;
+}
+.aui-bg-pink {
+ background-color: #e91e63 !important;
+}
+.aui-bg-purple {
+ background-color: #673ab7 !important;
+}
+.aui-bg-indigo {
+ background-color: #3f51b5 !important;
+}
+.aui-bg-gray {
+ background-color: #8a8a8a !important;
+}
+
+/*警告、成功颜色*/
+.aui-warning,
+.aui-warning label,
+.aui-warning .aui-input,
+.aui-warning .aui-iconfont {
+ color: #e51c23 !important;
+}
+.aui-success,
+.aui-success label,
+.aui-success .aui-input,
+.aui-success .aui-iconfont {
+ color: #009688 !important;
+}
+/*对齐,显示,隐藏等*/
+.aui-pull-right {
+ float: right !important;
+}
+.aui-pull-left {
+ float: left !important;
+}
+.aui-hide {
+ display: none !important;
+}
+.aui-show {
+ display: block !important;
+}
+.aui-invisible {
+ visibility: hidden;
+}
+.aui-inline {
+ display: inline-block;
+ vertical-align: top;
+}
+.aui-mask {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ background: rgba(0, 0, 0, 0.3);
+ opacity: 0;
+ z-index: 8;
+ visibility: hidden;
+ -webkit-transition: opacity .3s,-webkit-transform .3s;
+ transition: opacity .3s,transform .3s;
+}
+.aui-mask.aui-mask-in {
+ visibility: visible;
+ opacity: 1;
+}
+.aui-mask.aui-mask-out {
+ opacity: 0;
+}
+img.aui-img-round {
+ border-radius: 50%;
+}
+/*基本容器*/
+.aui-content {
+ -webkit-overflow-scrolling: touch;
+ overflow-x: hidden;
+ word-break: break-all;
+}
+.aui-content-padded {
+ margin: 0.75rem;
+ position: relative;
+ word-break: break-all;
+ -webkit-overflow-scrolling: touch;
+}
+/*栅格类*/
+.aui-row {
+ overflow: hidden;
+ margin: 0;
+}
+.aui-row-padded {
+ margin-left: -0.125rem;
+ margin-right: -0.125rem;
+}
+.aui-row-padded [class*=aui-col-xs-] {
+ padding: 0.125rem;
+}
+.aui-col-xs-1,.aui-col-xs-2,.aui-col-xs-3,.aui-col-xs-4,.aui-col-xs-5,.aui-col-xs-6,.aui-col-xs-7,.aui-col-xs-8,.aui-col-xs-9,.aui-col-xs-10,.aui-col-xs-11,.aui-col-5 {
+ position: relative;
+ float: left;
+}
+.aui-col-xs-12 {
+ width: 100%;
+ position: relative;
+}
+.aui-col-xs-11 {
+ width: 91.66666667%;
+}
+.aui-col-xs-10 {
+ width: 83.33333333%;
+}
+.aui-col-xs-9 {
+ width: 75%;
+}
+.aui-col-xs-8 {
+ width: 66.66666667%;
+}
+.aui-col-xs-7 {
+ width: 58.33333333%;
+}
+.aui-col-xs-6 {
+ width: 50%;
+}
+.aui-col-xs-5 {
+ width: 41.66666667%;
+}
+.aui-col-xs-4 {
+ width: 33.33333333%;
+}
+.aui-col-xs-3 {
+ width: 25%;
+}
+.aui-col-xs-2 {
+ width: 16.66666667%;
+}
+.aui-col-xs-1 {
+ width: 8.33333333%;
+}
+.aui-col-5 {
+ width: 20%;
+}
+/*标签*/
+.aui-label {
+ display: inline-block;
+ padding: 0.2em 0.25em;
+ font-size: 0.6rem;
+ line-height: 1;
+ color: #616161;
+ background-color: #dddddd;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ border-radius: 0.15em;
+ position: relative;
+}
+
+.aui-label-primary {
+ color: #ffffff;
+ background-color: #00bcd4;
+}
+.aui-label-success {
+ color: #ffffff;
+ background-color: #009688;
+}
+.aui-label-info {
+ color: #ffffff;
+ background-color: #03a9f4;
+}
+.aui-label-warning {
+ color: #ffffff;
+ background-color: #ffc107;
+}
+.aui-label-danger {
+ color: #ffffff;
+ background-color: #e51c23;
+}
+.aui-label-outlined {
+ background-color: transparent;
+ position: relative;
+}
+.aui-label-outlined:after {
+ -webkit-border-radius: 2px;
+ border-radius: 2px;
+ height: 200%;
+ content: '';
+ width: 200%;
+ border: 1px solid #d9d9d9;
+ position: absolute;
+ top: -1px;
+ left: -1px;
+ transform: scale(0.5);
+ -webkit-transform: scale(0.5);
+ transform-origin: 0 0;
+ -webkit-transform-origin: 0 0;
+ z-index: 1;
+}
+.aui-label-outlined.aui-label-primary,
+.aui-label-outlined.aui-label-primary:after {
+ color: #00bcd4;
+ border-color: #00bcd4;
+}
+.aui-label-outlined.aui-label-success,
+.aui-label-outlined.aui-label-success:after {
+ color: #009688;
+ border-color: #009688;
+}
+.aui-label-outlined.aui-label-info,
+.aui-label-outlined.aui-label-info:after {
+ color: #03a9f4;
+ border-color: #03a9f4;
+}
+.aui-label-outlined.aui-label-warning,
+.aui-label-outlined.aui-label-warning:after {
+ color: #ffc107;
+ border-color: #ffc107;
+}
+.aui-label-outlined.aui-label-danger,
+.aui-label-outlined.aui-label-danger:after {
+ color: #e51c23;
+ border-color: #e51c23;
+}
+.aui-label .aui-iconfont {
+ font-size: 0.6rem;
+}
+/*角标*/
+.aui-badge {
+ display: inline-block;
+ width: auto;
+ text-align: center;
+ min-width: 0.8rem;
+ height: 0.8rem;
+ line-height: 0.8rem;
+ padding: 0 0.2rem;
+ font-size: 0.6rem;
+ color: #ffffff;
+ background-color: #ff2600;
+ border-radius: 0.4rem;
+ position: absolute;
+ top: 0.2rem;
+ left: 60%;
+ z-index: 99;
+}
+.aui-dot {
+ display: inline-block;
+ width: 0.4rem;
+ height: 0.4rem;
+ background: #ff2600;
+ border-radius: 0.5rem;
+ position: absolute;
+ top: 0.3rem;
+ right: 20%;
+ z-index: 99;
+}
+/*按钮样式*/
+button, .aui-btn {
+ position: relative;
+ display: inline-block;
+ font-size: 0.7rem;
+ font-weight: 400;
+ font-family: inherit;
+ text-decoration: none;
+ text-align: center;
+ margin: 0;
+ background: #dddddd;
+ padding: 0 0.6rem;
+ height: 1.5rem;
+ line-height: 1.5rem;
+ border-radius: 0.2rem;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ vertical-align: middle;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-user-select: none;
+ user-select: none;
+}
+.aui-btn:active {
+ color: #212121;
+ background-color: #bdbdbd;
+}
+.aui-btn-primary {
+ color: #ffffff;
+ background-color: #00bcd4;
+}
+.aui-btn-primary.aui-active, .aui-btn-primary:active {
+ color: #ffffff;
+ background-color: #00acc1;
+}
+.aui-btn-success {
+ color: #ffffff;
+ background-color: #009688;
+}
+.aui-btn-success.aui-active, .aui-btn-success:active {
+ color: #fff;
+ background-color: #00897b;
+}
+.aui-btn-info {
+ color: #ffffff !important;
+ background-color: #03a9f4 !important;
+}
+.aui-btn-info.aui-active, .aui-btn-info:active {
+ color: #fff !important;
+ background-color: #067cb1 !important;
+}
+.aui-btn-warning {
+ color: #ffffff !important;
+ background-color: #ffc107 !important;
+}
+.aui-btn-warning.aui-active, .aui-btn-warning:active {
+ color: #ffffff !important;
+ background-color: #ffb300 !important;
+}
+.aui-btn-danger {
+ color: #ffffff !important;
+ background-color: #e51c23 !important;
+}
+.aui-btn-danger.aui-active, .aui-btn-danger:active {
+ color: #ffffff !important;
+ background-color: #dd191b !important;
+}
+.aui-btn-orangle {
+ color: #ffffff !important;
+ background-color: #efb336 !important;
+}
+.aui-btn-orangle.aui-active, .aui-btn-orangle:active {
+ color: #fff !important;
+ background-color: #e98f36 !important;
+}
+.aui-btn-blue {
+ color: #ffffff !important;
+ background-color: #17abe3 !important;
+}
+.aui-btn-blue.aui-active, .aui-btn-blue:active {
+ color: #fff !important;
+ background-color: #1195db !important;
+}
+.aui-btn-green {
+ color: #ffffff !important;
+ background-color: #36ab60 !important;
+}
+.aui-btn-green.aui-active, .aui-btn-green:active {
+ color: #fff !important;
+ background-color: #36ab60 !important;
+}
+.aui-btn-block {
+ display: block;
+ width: 100%;
+ height: 2.5rem;
+ line-height: 2.55rem;
+ margin-bottom: 0;
+ font-size: 0.9rem;
+}
+.aui-btn-block.aui-btn-sm {
+ font-size: 0.7rem;
+ height: 1.8rem;
+ line-height: 1.85rem;
+}
+.aui-btn .aui-iconfont, .aui-btn-block .aui-iconfont {
+ margin-right: 0.3rem;
+}
+.aui-btn .aui-badge, .aui-btn-block .aui-badge {
+ margin-left: 0.3rem;
+}
+.aui-btn-outlined {
+ background: transparent !important;
+ border: 1px solid #bdbdbd;
+}
+.aui-btn-outlined:active {
+ background: transparent !important;
+}
+.aui-btn-default.aui-btn-outlined {
+ color: #bdc3c7 !important;
+ border: 1px solid #dcdcdc !important;
+}
+.aui-btn-primary.aui-btn-outlined {
+ color: #00bcd4 !important;
+ border: 1px solid #00bcd4 !important;
+}
+.aui-btn-success.aui-btn-outlined {
+ color: #009688 !important;
+ border: 1px solid #009688 !important;
+}
+.aui-btn-info.aui-btn-outlined {
+ color: #03a9f4 !important;
+ border: 1px solid #03a9f4 !important;
+}
+.aui-btn-warning.aui-btn-outlined {
+ color: #ffc107 !important;
+ border: 1px solid #ffc107 !important;
+}
+.aui-btn-danger.aui-btn-outlined {
+ color: #e51c23 !important;
+ border: 1px solid #e51c23 !important;
+}
+/*
+*表单类\输入框\radio\checkbox
+**/
+.aui-input,
+input[type="text"],
+input[type="password"],
+input[type="search"],
+input[type="email"],
+input[type="tel"],
+input[type="url"],
+input[type="date"],
+input[type="datetime-local"],
+input[type="time"],
+input[type="number"],
+select,
+textarea {
+ border: none;
+ background-color: transparent;
+ border-radius: 0;
+ box-shadow: none;
+ display: block;
+ padding: 0;
+ margin: 0;
+ width: 100%;
+ height: 2.2rem;
+ line-height: normal;
+ color: #424242;
+ font-size: 0.8rem;
+ font-family: inherit;
+ box-sizing: border-box;
+ -webkit-user-select: text;
+ user-select: text;
+ -webkit-appearance: none;
+ appearance: none;
+}
+input[type="search"]::-webkit-search-cancel-button {
+ display: none;
+}
+.aui-scroll-x {
+ position: relative;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
+.aui-scroll-y {
+ position: relative;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+::-webkit-scrollbar{
+ width:0px;
+}
+/*列表*/
+.aui-list {
+ position: relative;
+ font-size: 0.8rem;
+ background-color: #ffffff;
+ border-top: 1px solid #dddddd;
+}
+.aui-list .aui-content {
+ overflow: hidden;
+}
+.aui-list.aui-list-noborder,
+.aui-list.aui-list-noborder {
+ border-top: none;
+}
+.aui-list .aui-list-header {
+ background-color: #dddddd;
+ color: #212121;
+ position: relative;
+ font-size: 0.6rem;
+ padding: 0.4rem 0.75rem;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.aui-list .aui-list-item {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ padding-left: 0.75rem;
+ color: #212121;
+ border-bottom: 1px solid #f2f2f2;
+ position: relative;
+ min-height: 2.2rem;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+}
+.aui-list.aui-list-noborder .aui-list-item:last-child {
+ border-bottom: 0;
+}
+.aui-list .aui-list-item-inner {
+ position: relative;
+ min-height: 2.2rem;
+ padding-right: 0.75rem;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-flex: 1;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+}
+
+.aui-list .aui-list-item:active {
+ background-color: #f5f5f5;
+}
+.aui-list .aui-list-item-text {
+ font-size: 0.7rem;
+ color: #757575;
+ position: relative;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.aui-list .aui-list-item-title {
+ font-size: 0.8rem;
+ position: relative;
+ max-width: 100%;
+ color: #212121;
+}
+.aui-list .aui-list-item-right,
+.aui-list-item-title-row em {
+ max-width: 50%;
+ position: relative;
+ font-size: 0.6rem;
+ color: #757575;
+ margin-left: 0.25rem;
+}
+.aui-list .aui-list-item-inner p {
+ overflow: hidden;
+}
+.aui-list .aui-list-media-list {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+}
+.aui-media-list-item-inner {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+}
+.aui-media-list .aui-list-item {
+ display: block;
+}
+.aui-media-list .aui-list-item-inner {
+ display: block;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+.aui-media-list-item-inner + .aui-info {
+ margin-right: 0.75rem;
+}
+.aui-list .aui-list-item-media {
+ width: 4.5rem;
+ position: relative;
+ padding: 0.5rem 0;
+ padding-right: 0.75rem;
+ display: inherit;
+ -webkit-flex-shrink: 0;
+ flex-shrink: 0;
+ -webkit-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: flex-start;
+ align-items: flex-start;
+}
+.aui-list .aui-list-item-media img {
+ width: 100%;
+ display: block;
+}
+.aui-list .aui-list-item-media-list {
+ margin-top: 0.25rem;
+ padding-right: 0;
+ display: block;
+}
+.aui-list [class*=aui-col-xs-] img{
+ max-width: 100%;
+ width: 100%;
+ display: block;
+}
+.aui-list-item-middle .aui-list-item-inner:after {
+ display: block;
+}
+.aui-list .aui-list-item-middle > .aui-list-item-media,
+.aui-list .aui-list-item-middle > .aui-list-item-inner,
+.aui-list .aui-list-item-middle > * {
+ -webkit-box-align: center;
+ box-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.aui-list .aui-list-item-center > .aui-list-item-media,
+.aui-list .aui-list-item-center > .aui-list-item-inner,
+.aui-list .aui-list-item-center {
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ justify-content: center;
+}
+.aui-list .aui-list-item i.aui-iconfont {
+ -webkit-align-self: center;
+ align-self: center;
+ font-size: 0.8rem;
+}
+.aui-list-item-inner.aui-list-item-arrow {
+ overflow: hidden;
+ padding-right: 1.5rem;
+}
+.aui-list-item-arrow:before {
+ content: '';
+ width: 0.4rem;
+ height: 0.4rem;
+ position: absolute;
+ top: 50%;
+ right: 0.75rem;
+ margin-top: -0.2rem;
+ background: transparent;
+ border: 1px solid #dddddd;
+ border-top: none;
+ border-right: none;
+ z-index: 2;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ -webkit-transform: rotate(-135deg);
+ transform: rotate(-135deg);
+}
+.aui-list-item.aui-list-item-arrow {
+ padding-right: 0.75rem;
+}
+.aui-list label {
+ line-height: 1.3rem;
+}
+.aui-list.aui-form-list .aui-list-item:active {
+ background-color: #ffffff;
+}
+.aui-list.aui-form-list .aui-list-item-inner {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ padding: 0;
+}
+.aui-list .aui-list-item-label,
+.aui-list .aui-list-item-label-icon {
+ color: #212121;
+ width: 35%;
+ min-width: 1.5rem;
+ margin: 0;
+ padding: 0;
+ padding-right: 0.25rem;
+ line-height: 2.2rem;
+ position: relative;
+ overflow: hidden;
+ white-space: nowrap;
+ max-width: 100%;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.aui-list .aui-list-item-label-icon {
+ width: auto;
+ padding-right: 0.75rem;
+}
+.aui-list .aui-list-item-input {
+ width: 100%;
+ padding: 0;
+ padding-right: 0.75rem;
+ -webkit-box-flex: 1;
+ box-flex: 1;
+ -webkit-flex-shrink: 1;
+ flex-shrink: 1;
+}
+.aui-list.aui-select-list .aui-list-item:active {
+ background-color: #ffffff;
+}
+.aui-list.aui-select-list .aui-list-item-inner {
+ display: block;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ -webkit-align-self: stretch;
+ align-self: stretch;
+}
+.aui-list.aui-select-list .aui-list-item-label {
+ width: auto;
+ min-width: 2.2rem;
+ padding: 0.5rem 0;
+ padding-right: 0.75rem;
+}
+.aui-list.aui-form-list .aui-list-item-btn {
+ padding: 0.75rem 0.75rem 0.75rem 0;
+}
+.aui-list textarea {
+ overflow: auto;
+ margin: 0.5rem 0;
+ height: 3rem;
+ line-height: 1rem;
+ resize: none;
+}
+.aui-list .aui-list-item-right .aui-badge,
+.aui-list .aui-list-item-right .aui-dot {
+ display: inherit;
+}
+@media screen and (-webkit-min-device-pixel-ratio:1.5) {
+ .aui-list {
+ border: none;
+ background-size: 100% 1px;
+ background-repeat: no-repeat;
+ background-position: top;
+ background-image: linear-gradient(0,#dddddd,#dddddd 50%,transparent 50%);
+ }
+ .aui-list .aui-list-item {
+ border: none;
+ background-size: 100% 1px;
+ background-repeat: no-repeat;
+ background-position: bottom;
+ background-image: linear-gradient(0,#dddddd,#dddddd 50%,transparent 50%);
+ background-image: -webkit-linear-gradient(90deg,#dddddd,#dddddd 50%,transparent 50%);
+ }
+
+ .aui-list.aui-list-in .aui-list-item {
+ border: none;
+ background-size: 100% 1px;
+ background-repeat: no-repeat;
+ background-position: 0.75rem bottom;
+ background-image: linear-gradient(0,#dddddd,#dddddd 50%,transparent 50%);
+ background-image: -webkit-linear-gradient(90deg,#dddddd,#dddddd 50%,transparent 50%);
+ }
+ .aui-list.aui-list-in .aui-list-item:last-child {
+ background-position: bottom;
+ }
+ .aui-list.aui-list-noborder,
+ .aui-list.aui-list-noborder .aui-list-item:last-child {
+ border: none;
+ background-size: 100% 0;
+ background-image: none;
+ }
+}
+/*tab切换类*/
+.aui-tab {
+ position: relative;
+ background-color: #ffffff;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-self: center;
+ align-self: center;
+}
+.aui-tab-item {
+ width: 100%;
+ height: 2.2rem;
+ line-height: 2.2rem;
+ position: relative;
+ font-size: 0.7rem;
+ text-align: center;
+ color: #212121;
+ margin-left: -1px;
+ -webkit-box-flex: 1;
+ box-flex: 1;
+}
+.aui-tab-item.aui-active {
+ color: #03a9f4;
+ border-bottom: 2px solid #03a9f4;
+}
+/*卡片列表布局*/
+.aui-card-list {
+ position: relative;
+ margin-bottom: 0.35rem;
+ background: #ffffff;
+}
+.aui-card-list-header,
+.aui-card-list-footer {
+ position: relative;
+ min-height: 2.2rem;
+ padding: 0.5rem 0.75rem;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.aui-card-list-header {
+ font-size: 0.8rem;
+ color: #212121;
+}
+.aui-card-list-header.aui-card-list-user {
+ display: block;
+}
+.aui-card-list-user-avatar {
+ width: 2rem;
+ float: left;
+ margin-right: 0.5rem;
+}
+.aui-card-list-user-avatar img {
+ width: 100%;
+ display: block;
+}
+.aui-card-list-user-name {
+ color: #212121;
+ position: relative;
+ font-size: 0.7rem;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.aui-card-list-user-name > *,
+.aui-card-list-user-name small {
+ position: relative;
+}
+.aui-card-list-user-name small {
+ color: #757575;
+}
+.aui-card-list-user-info {
+ color: #757575;
+ font-size: 0.6rem;
+}
+.aui-card-list-content {
+ position: relative;
+}
+.aui-card-list-content-padded {
+ position: relative;
+ padding: 0.5rem 0.75rem;
+}
+.aui-card-list-content,
+.aui-card-list-content-padded {
+ word-break: break-all;
+ font-size: 0.7rem;
+ color: #212121;
+}
+.aui-card-list-content img,
+.aui-card-list-content-padded img {
+ width: 100%;
+ display: block;
+}
+.aui-card-list-footer {
+ font-size: 0.7rem;
+ color: #757575;
+}
+.aui-card-list-footer > * {
+ position: relative;
+}
+.aui-card-list-footer.aui-text-center {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: center;
+ box-pack: center;
+ -webkit-justify-content: center;
+ justify-content: center;
+}
+.aui-card-list-footer .aui-iconfont {
+ font-size: 0.9rem;
+}
+/*宫格布局*/
+.aui-grid {
+ width: 100%;
+ background-color: #ffffff;
+ display: table;
+ table-layout: fixed;
+}
+.aui-grid [class*=aui-col-] {
+ display: table-cell;
+ position: relative;
+ text-align: center;
+ vertical-align: middle;
+ padding: 0.6rem 0;
+}
+.aui-grid [class*=aui-col-xs-]:active {
+ background-color: #f5f5f5;
+}
+.aui-grid [class*=top-btn]:active {
+ background-color: #048cca;
+}
+.aui-grid .aui-iconfont {
+ position: relative;
+ z-index: 20;
+ top: 0;
+ height: 1.4rem;
+ font-size: 1.4rem;
+ line-height: 1.4rem;
+}
+.aui-grid .aui-grid-label {
+ display: block;
+ font-size: 0.7rem;
+ position: relative;
+ margin-top: 0.25rem;
+}
+.aui-grid .aui-badge {
+ position: absolute;
+ top: 0.5rem;
+ left: 60%;
+ z-index: 99;
+}
+.aui-grid .aui-dot {
+ position: absolute;
+ top: 0.5rem;
+ right: 20%;
+ z-index: 99;
+}
+/*单选、多选、开关*/
+.aui-radio,
+.aui-checkbox {
+ width: 1.2rem;
+ height: 1.2rem;
+ background-color: #ffffff;
+ border: solid 1px #dddddd;
+ -webkit-border-radius: 0.6rem;
+ border-radius: 0.6rem;
+ font-size: 0.8rem;
+ margin: 0;
+ padding: 0;
+ position: relative;
+ display: inline-block;
+ vertical-align: top;
+ cursor: default;
+ -webkit-appearance: none;
+ -webkit-user-select: none;
+ user-select: none;
+ -webkit-transition: background-color ease 0.1s;
+ transition: background-color ease 0.1s;
+}
+.aui-checkbox {
+ border-radius: 0.1rem;
+}
+.aui-radio:checked,
+.aui-radio.aui-checked,
+.aui-checkbox:checked,
+.aui-checkbox.aui-checked {
+ background-color: #03a9f4;
+ border: solid 1px #03a9f4;
+ text-align: center;
+ background-clip: padding-box;
+}
+.aui-radio:checked:before,
+.aui-radio.aui-checked:before,
+.aui-checkbox:checked:before,
+.aui-checkbox.aui-checked:before,
+.aui-radio:checked:after,
+.aui-radio.aui-checked:after,
+.aui-checkbox:checked:after,
+.aui-checkbox.aui-checked:after {
+ content: '';
+ width: 0.5rem;
+ height: 0.3rem;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-left: -0.25rem;
+ margin-top: -0.25rem;
+ background: transparent;
+ border: 1px solid #ffffff;
+ border-top: none;
+ border-right: none;
+ z-index: 2;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+}
+.aui-radio:disabled,
+.aui-radio.aui-disabled,
+.aui-checkbox:disabled,
+.aui-checkbox.aui-disabled {
+ background-color: #dddddd;
+ border: solid 1px #dddddd;
+}
+.aui-radio:disabled:before,
+.aui-radio.aui-disabled:before,
+.aui-radio:disabled:after,
+.aui-radio.aui-disabled:after,
+.aui-checkbox:disabled:before,
+.aui-checkbox.aui-disabled:before,
+.aui-checkbox:disabled:after,
+.aui-checkbox.aui-disabled:after {
+ content: '';
+ width: 0.5rem;
+ height: 0.3rem;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-left: -0.25rem;
+ margin-top: -0.25rem;
+ background: transparent;
+ border: 1px solid #ffffff;
+ border-top: none;
+ border-right: none;
+ z-index: 2;
+ -webkit-border-radius: 0;
+ border-radius: 0;
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+}
+.aui-switch {
+ width: 2.3rem;
+ height: 1.2rem;
+ position: relative;
+ vertical-align: top;
+ border: 1px solid #dddddd;
+ background-color: #dddddd;
+ border-radius: 0.6rem;
+ background-clip: content-box;
+ display: inline-block;
+ outline: none;
+ -webkit-appearance: none;
+ appearance: none;
+ -webkit-user-select: none;
+ user-select: none;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-background-clip: padding-box;
+ background-clip: padding-box;
+ -webkit-transition: all 0.2s linear;
+ transition: all 0.2s linear;
+}
+.aui-switch:before {
+ width: 1.1rem;
+ height: 1.1rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ border-radius: 0.6rem;
+ background-color: #fff;
+ content: '';
+ -webkit-transition: left 0.2s;
+ transition: left 0.2s;
+}
+.aui-switch:checked {
+ border-color: #03a9f4;
+ background-color: #03a9f4;
+}
+.aui-switch:checked:before {
+ left: 1.1rem;
+}
+/*导航栏*/
+.aui-bar {
+ position: relative;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 10;
+ width: 100%;
+ min-height: 2.25rem;
+ font-size: 0.9rem;
+ text-align: center;
+ display: table;
+}
+.aui-bar-nav {
+ top: 0;
+ line-height: 2.25rem;
+ background-color: #03a9f4;
+ color: #ffffff;
+}
+.aui-title a {
+ color: inherit;
+}
+.aui-bar-nav .aui-title {
+ min-height: 2.25rem;
+ position: absolute;
+ margin: 0;
+ text-align: center;
+ white-space: nowrap;
+ right: 2rem;
+ left: 2rem;
+ width: auto;
+ overflow: hidden;
+ /*text-overflow: ellipsis;*/
+ z-index: 2;
+}
+.aui-bar-nav a {
+ color: #ffffff;
+}
+.aui-bar-nav .aui-iconfont {
+ position: relative;
+ z-index: 20;
+ font-size: 0.9rem;
+ color: #ffffff;
+ font-weight: 400;
+ line-height: 2.25rem;
+}
+.aui-bar-nav .aui-pull-left {
+ padding: 0 0.5rem;
+ font-size: 0.8rem;
+ font-weight: 400;
+ z-index: 2;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.aui-bar-nav .aui-pull-right {
+ padding: 0 0.5rem;
+ font-size: 0.8rem;
+ font-weight: 400;
+ z-index: 2;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.aui-bar-nav .aui-btn {
+ position: relative;
+ z-index: 20;
+ height: 2.25rem;
+ line-height: 2.25rem;
+ padding-top: 0;
+ padding-bottom: 0;
+ margin: 0;
+ border-radius: 0.1rem;
+ border-width: 0;
+ background: transparent !important;
+}
+.aui-bar-nav .aui-btn.aui-btn-outlined {
+ position: relative;
+ padding: 0 0.15rem;
+ margin: 0.5rem;
+ height: 1.25rem;
+ line-height: 1.25rem;
+ border-width: 1px;
+ background: transparent !important;
+ border-color: #ffffff;
+}
+.aui-bar-nav .aui-btn:active {
+ background: none;
+}
+.aui-bar-nav .aui-btn .aui-iconfont {
+ font-size: 0.9rem;
+ line-height: 1.25rem;
+ padding: 0;
+ margin: 0;
+ color: #ffffff;
+}
+.aui-bar-light {
+ color: #03a9f4;
+ background-color: #ffffff;
+ border-bottom: 1px solid #dddddd;
+}
+.aui-bar-nav.aui-bar-light .aui-iconfont {
+ color: #03a9f4;
+}
+.aui-bar-nav.aui-bar-light .aui-btn-outlined {
+ border-color: #03a9f4;
+}
+@media screen and (-webkit-min-device-pixel-ratio:1.5) {
+ .aui-bar.aui-bar-light {
+ border: none;
+ background-size: 100% 1px;
+ background-repeat: no-repeat;
+ background-position: bottom;
+ background-image: linear-gradient(0,#dddddd,#dddddd 50%,transparent 50%);
+ background-image: -webkit-linear-gradient(90deg,#dddddd,#dddddd 50%,transparent 50%);
+ }
+}
+/*底部切换栏*/
+.aui-bar-tab {
+ position: fixed;
+ top: auto;
+ bottom: 0;
+ table-layout: fixed;
+ background-color: #ffffff;
+ color: #757575;
+}
+.aui-bar-tab .aui-bar-tab-item {
+ display: table-cell;
+ position: relative;
+ width: 1%;
+ height: 2.5rem;
+ text-align: center;
+ vertical-align: middle;
+}
+.aui-bar-tab .aui-active {
+ color: #03a9f4;
+}
+.aui-bar-tab .aui-bar-tab-item .aui-iconfont {
+ position: relative;
+ z-index: 20;
+ top: 0.1rem;
+ height: 1.2rem;
+ font-size: 1rem;
+ line-height: 1rem;
+}
+.aui-bar-tab .aui-bar-tab-label {
+ display: block;
+ font-size: 0.6rem;
+ position: relative;
+}
+.aui-bar-tab .aui-badge {
+ position: absolute;
+ top: 0.1rem;
+ left: 55%;
+ z-index: 99;
+}
+.aui-bar-tab .aui-dot {
+ position: absolute;
+ top: 0.1rem;
+ right: 30%;
+ z-index: 99;
+}
+/*按钮工具栏*/
+.aui-bar-btn {
+ position: relative;
+ font-size: 0.7rem;
+ display: table;
+ white-space: nowrap;
+ margin: 0 auto;
+ padding: 0;
+ border: none;
+ width: 100%;
+ min-height: 1.8rem;
+}
+.aui-bar-btn-item {
+ display: table-cell;
+ position: relative;
+ width: 1%;
+ line-height: 1.6rem;
+ text-align: center;
+ vertical-align: middle;
+ border-radius: 0;
+ position: relative;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #03a9f4;
+ border-left-width: 0;
+}
+.aui-bar-btn .aui-input,
+.aui-bar-btn input,
+.aui-bar-btn select {
+ padding-left: 0.25rem;
+ padding-right: 0.25rem;
+ height: 1.8rem;
+}
+.aui-bar-btn-sm {
+ min-height: 1.3rem;
+}
+.aui-bar-btn.aui-bar-btn-sm .aui-input,
+.aui-bar-btn.aui-bar-btn-sm input,
+.aui-bar-btn.aui-bar-btn-sm select {
+ height: 1.2rem;
+}
+.aui-bar-btn-sm .aui-bar-btn-item {
+ line-height: 1.3rem;
+ font-size: 0.6rem;
+}
+.aui-bar-btn-item.aui-active {
+ background-color: #03a9f4;
+ color: #ffffff;
+}
+.aui-bar-btn-item:first-child {
+ border-left-width: 1px;
+ border-top-left-radius: 0.2rem;
+ border-bottom-left-radius: 0.2rem;
+}
+.aui-bar-btn-item:last-child {
+ border-top-right-radius: 0.2rem;
+ border-bottom-right-radius: 0.2rem;
+ border-left: 0px;
+}
+.aui-bar-btn.aui-bar-btn-full .aui-bar-btn-item:first-child {
+ border-left-width: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.aui-bar-btn.aui-bar-btn-full .aui-bar-btn-item:last-child {
+ border-right-width: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.aui-bar-btn.aui-bar-btn-round .aui-bar-btn-item:first-child {
+ border-top-left-radius: 1.5rem;
+ border-bottom-left-radius: 1.5rem;
+}
+.aui-bar-btn.aui-bar-btn-round .aui-bar-btn-item:last-child {
+ border-top-right-radius: 1.5rem;
+ border-bottom-right-radius: 1.5rem;
+}
+.aui-bar-nav .aui-bar-btn {
+ margin-top: 0.45rem;
+ margin-bottom: 0.4rem;
+ min-height: 1.3rem;
+}
+.aui-bar-nav .aui-bar-btn-item {
+ line-height: 1.3rem;
+ border-color: #ffffff;
+}
+.aui-bar-nav .aui-bar-btn-item.aui-active {
+ background-color: #ffffff;
+ color: #03a9f4;
+}
+.aui-bar-nav.aui-bar-light .aui-bar-btn-item {
+ border-color: #03a9f4;
+}
+.aui-bar-nav.aui-bar-light .aui-bar-btn-item.aui-active {
+ background-color: #03a9f4;
+ color: #ffffff;
+}
+.aui-bar-nav > .aui-bar-btn {
+ width: 50%;
+}
+.aui-info {
+ position: relative;
+ padding: 0.5rem 0;
+ font-size: 0.7rem;
+ color: #757575;
+ background-color: transparent;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+
+}
+.aui-info-item {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.aui-info-item > *,
+.aui-info > * {
+ display: inherit;
+ position: relative;
+}
+/*进度条*/
+.aui-progress {
+ width: 100%;
+ height: 1rem;
+ border-radius: 0.2rem;
+ overflow: hidden;
+ background-color: #f0f0f0;
+}
+.aui-progress-bar {
+ float: left;
+ width: 0;
+ height: 100%;
+ font-size: 0.6rem;
+ line-height: 1rem;
+ color: #ffffff;
+ text-align: center;
+ background-color: #03a9f4;
+}
+.aui-progress.sm,
+.aui-progress-sm {
+ height: 0.5rem;
+}
+.aui-progress.sm,
+.aui-progress-sm,
+.aui-progress.sm .aui-progress-bar,
+.aui-progress-sm .aui-progress-bar {
+ border-radius: 1px;
+}
+.aui-progress.xs,
+.aui-progress-xs {
+ height: 0.35rem;
+}
+.aui-progress.xs,
+.aui-progress-xs,
+.aui-progress.xs .progress-bar,
+.aui-progress-xs .progress-bar {
+ border-radius: 1px;
+}
+.aui-progress.xxs,
+.aui-progress-xxs {
+ height: 0.15rem;
+}
+.aui-progress.xxs,
+.aui-progress-xxs,
+.aui-progress.xxs .progress-bar,
+.aui-progress-xxs .progress-bar {
+ border-radius: 1px;
+}
+/*滑块*/
+.aui-range {
+ position: relative;
+ display: inline-block;
+}
+.aui-range input[type='range']{
+ height: 0.2rem;
+ border: 0;
+ border-radius: 2px;
+ background-color: #f0f0f0;
+ position: relative;
+ -webkit-appearance: none !important;
+}
+.aui-range input[type='range']::-webkit-slider-thumb {
+ width: 1.2rem;
+ height: 1.2rem;
+ border-radius: 50%;
+ border-color: #03a9f4;
+ background-color: #03a9f4;
+ -webkit-appearance: none !important;
+}
+.aui-range .aui-range-tip {
+ font-size: 1rem;
+ position: absolute;
+ z-index: 999;
+ top: -1.5rem;
+ width: 2.4rem;
+ height: 1.5rem;
+ line-height: 1.5rem;
+ text-align: center;
+ color: #666666;
+ border: 1px solid #dddddd;
+ border-radius: 0.3rem;
+ background-color: #ffffff;
+}
+.aui-input-row .aui-range input[type='range'] {
+ width: 90%;
+ margin-left: 5%;
+}
+/*搜索条*/
+.aui-searchbar {
+ display: -webkit-box;
+ -webkit-box-pack: center;
+ -webkit-box-align: center;
+ height: 2.2rem;
+ overflow: hidden;
+ width: 100%;
+ background-color: #ebeced;
+ color: #9e9e9e;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+.aui-searchbar.focus {
+ -webkit-box-pack: start;
+}
+.aui-searchbar-input {
+ margin: 0 0.5rem;
+ background-color: #ffffff;
+ border-radius: 0.25rem;
+ height: 1.4rem;
+ line-height: 1.4rem;
+ font-size: 0.7rem;
+ position: relative;
+ padding-left: 0.5rem;
+ display: -webkit-box;
+ -webkit-box-flex: 1;
+}
+.aui-searchbar form {
+ width: 90%;
+}
+.aui-searchbar-input input {
+ color: #666666;
+ width: 80%;
+ padding: 0;
+ margin: 0;
+ height: 1.4rem;
+ line-height: normal;
+ border: 0;
+ -webkit-appearance: none;
+ font-size: 0.7rem;
+}
+.aui-searchbar input::-webkit-input-placeholder {
+ color: #ccc;
+}
+.aui-searchbar .aui-iconfont {
+ line-height: 1.4rem;
+ margin-right: 0.25rem;
+ color: #9e9e9e !important;
+}
+.aui-searchbar .aui-searchbar-btn {
+ font-size: 0.7rem;
+ color: #666666;
+ margin-right: -2.2rem;
+ width: 2.2rem;
+ height: 1.4rem;
+ padding-right: 0.5rem;
+ line-height: 1.4rem;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+}
+.aui-searchbar-clear-btn {
+ position: absolute;
+ right: 5px;
+ top: 3px;
+ width: 1.1rem;
+ height: 1.1rem;
+ background: #eeeeee;
+ border-radius: 50%;
+ line-height: 0.6rem;
+ text-align: center;
+ display: none;
+}
+.aui-searchbar-clear-btn .aui-iconfont {
+ font-size: 0.6rem;
+ margin: 0 auto;
+ position: relative;
+ top: -2px;
+}
+.aui-searchbar .aui-searchbar-btn .aui-iconfont {
+ color: #666666;
+}
+/*信息提示条*/
+.aui-tips {
+ padding: 0 0.75rem;
+ width: 100%;
+ z-index: 99;
+ height: 1.9rem;
+ line-height: 1.9rem;
+ position: relative;
+ background-color: rgba(0,0,0,.6);
+ color: #ffffff;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.aui-tips .aui-tips-title {
+ padding: 0 0.5rem;
+ font-size: 0.7rem;
+ position: relative;
+ max-width: 100%;
+}
+/*toast*/
+.aui-toast {
+ background: rgba(0, 0, 0, 0.7);
+ text-align: center;
+ border-radius: 0.25rem;
+ color: #ffffff;
+ position: fixed;
+ z-index: 300;
+ top: 45%;
+ left: 50%;
+ width: 7.5em;
+ min-height: 6em;
+ margin-left: -3.75em;
+ margin-top: -4rem;
+ display: none;
+}
+.aui-toast .aui-iconfont {
+ margin-top: 0.2rem;
+ display: block;
+ font-size: 2.6rem;
+}
+.aui-toast-content {
+ margin: 0 0 0.75rem;
+}
+.aui-toast-loading {
+ background-color: #ffffff;
+ border-radius: 100%;
+ margin: 0.75rem 0;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+ border: 2px solid #ffffff;
+ border-bottom-color: transparent;
+ height: 2.25rem;
+ width: 2.25rem;
+ background: transparent !important;
+ display: inline-block;
+ -webkit-animation: rotate 1s 0s linear infinite;
+ animation: rotate 1s 0s linear infinite;
+}
+/*dialog*/
+.aui-dialog {
+ width: 13.5rem;
+ text-align: center;
+ position: fixed;
+ z-index: 999;
+ left: 50%;
+ margin-left: -6.75rem;
+ margin-top: 0;
+ top: 45%;
+ border-radius: 0.3rem;
+ opacity: 0;
+ background-color: #ffffff;
+ -webkit-transform: translate3d(0, 0, 0) scale(1.2);
+ transform: translate3d(0, 0, 0) scale(1.2);
+ -webkit-transition-property: -webkit-transform, opacity;
+ transition-property: transform, opacity;
+ /*display: none;*/
+}
+.aui-dialog-header {
+ padding: 0.5rem 0.75rem 0 0.75rem;
+ text-align: center;
+ font-size: 1em;
+ color: #212121;
+}
+.aui-dialog-body {
+ padding: 0.75rem;
+ overflow: hidden;
+ font-size: 0.875em;
+ color: #757575;
+}
+.aui-dialog-body input {
+ border: 1px solid #dddddd;
+ height: 1.8rem;
+ line-height: 1.8rem;
+ min-height: 1.8rem;
+ padding-left: 0.25rem;
+ padding-right: 0.25rem;
+}
+.aui-dialog-footer {
+ position: relative;
+ font-size: 1em;
+ border-top: 1px solid #dddddd;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ justify-content: center;
+}
+.aui-dialog-btn {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 0 0.25rem;
+ height: 2.2rem;
+ font-size: 0.8rem;
+ line-height: 2.2rem;
+ text-align: center;
+ color: #0894ec;
+ border-right: 1px solid #dddddd;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-box-flex: 1;
+ box-flex: 1;
+}
+.aui-dialog-btn:last-child {
+ border-right: none;
+}
+.aui-dialog.aui-dialog-in {
+ opacity: 1;
+ -webkit-transition-duration: 300ms;
+ transition-duration: 300ms;
+ -webkit-transform: translate3d(0, 0, 0) scale(1);
+ transform: translate3d(0, 0, 0) scale(1);
+}
+.aui-dialog.aui-dialog-out {
+ opacity: 0;
+ -webkit-transition-duration: 300ms;
+ transition-duration: 300ms;
+ -webkit-transform: translate3d(0, 0, 0) scale(0.815);
+ transform: translate3d(0, 0, 0) scale(0.815);
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5) {
+ .aui-dialog-footer {
+ border: none;
+ background-size: 100% 1px;
+ background-repeat: no-repeat;
+ background-position: top;
+ background-image: linear-gradient(0,#dddddd,#dddddd 50%,transparent 50%);
+ background-image: -webkit-linear-gradient(90deg,#dddddd,#dddddd 50%,transparent 50%);
+ }
+ .aui-dialog-btn {
+ border: none;
+ background-image: -webkit-linear-gradient(0deg, #dddddd, #dddddd 50%, transparent 50%);
+ background-image: linear-gradient(270deg, #dddddd, #dddddd 50%, transparent 50%);
+ background-size: 1px 100%;
+ background-repeat: no-repeat;
+ background-position: right;
+ }
+ .aui-dialog-btn:last-child {
+ border: none;
+ background-size: 0 100%;
+ }
+ .aui-dialog-body input {
+ border: none;
+ background-image: -webkit-linear-gradient(270deg, #dddddd, #dddddd 50%, transparent 50%), -webkit-linear-gradient(180deg, #dddddd, #dddddd 50%, transparent 50%), -webkit-linear-gradient(90deg, #dddddd, #dddddd 50%, transparent 50%), -webkit-linear-gradient(0, #dddddd, #dddddd 50%, transparent 50%);
+ background-image: linear-gradient(180deg, #dddddd, #dddddd 50%, transparent 50%), linear-gradient(270deg, #dddddd, #dddddd 50%, transparent 50%), linear-gradient(0deg, #dddddd, #dddddd 50%, transparent 50%), linear-gradient(90deg, #dddddd, #dddddd 50%, transparent 50%);
+ background-size: 100% 1px, 1px 100%, 100% 1px, 1px 100%;
+ background-repeat: no-repeat;
+ background-position: top, right top, bottom, left top;
+ }
+}
+/*popup*/
+.aui-popup {
+ padding: 0;
+ margin: 0;
+ background: transparent;
+ position: fixed;
+ height: auto;
+ min-width: 7rem;
+ min-height: 4.5rem;
+ z-index: 999;
+ opacity: 0;
+ -webkit-transition-property: -webkit-transform, opacity;
+ transition-property: transform, opacity;
+}
+.aui-popup.aui-popup-in {
+ opacity: 1;
+ -webkit-transition-duration: 300ms;
+ transition-duration: 300ms;
+}
+.aui-popup.aui-popup-out {
+ opacity: 0;
+ -webkit-transition-duration: 300ms;
+ transition-duration: 300ms;
+}
+.aui-popup-right {
+ right: 0.75rem;
+}
+.aui-popup-content {
+ background-color: #ffffff;
+ border-radius: 0.2rem;
+ overflow: hidden;
+ min-height: 4.5rem;
+ height: 100%;
+}
+.aui-popup-top,
+.aui-popup-top-left,
+.aui-popup-top-right {
+ top: 0.45rem;
+}
+.aui-popup-top {
+ left: 50%;
+ margin-left: -3.5rem;
+}
+.aui-popup-top-left {
+ left: 0.45rem;
+}
+.aui-popup-top-right {
+ right: 0.45rem;
+}
+.aui-popup-arrow {
+ position: absolute;
+ width: 10px;
+ height: 10px;
+ -webkit-transform-origin: 50% 50% 0;
+ transform-origin: 50% 50% 0;
+ background-color: transparent;
+ background-image: -webkit-linear-gradient(45deg, #ffffff, #ffffff 50%, transparent 50%);
+ background-image: linear-gradient(45deg, #ffffff, #ffffff 50%, transparent 50%);
+}
+.aui-popup-top .aui-popup-arrow,
+.aui-popup-top-left .aui-popup-arrow,
+.aui-popup-top-right .aui-popup-arrow {
+ top: 0.2rem;
+ -webkit-transform: rotate(135deg);
+ transform: rotate(135deg);
+}
+.aui-popup-top .aui-popup-arrow {
+ left: 50%;
+ margin-left: -0.25rem;
+ margin-top: -0.4rem;
+}
+.aui-popup-top-left .aui-popup-arrow {
+ left: 0.25rem;
+ margin-top: -0.4rem;
+}
+.aui-popup-top-right .aui-popup-arrow {
+ right: 0.25rem;
+ margin-top: -0.4rem;
+}
+.aui-popup-bottom,
+.aui-popup-bottom-left,
+.aui-popup-bottom-right {
+ bottom: 0.45rem;
+}
+.aui-popup-bottom {
+ left: 50%;
+ margin-left: -3.5rem;
+}
+.aui-popup-bottom-left {
+ left: 0.45rem;
+}
+.aui-popup-bottom-right {
+ right: 0.45rem;
+}
+.aui-popup-bottom .aui-popup-arrow,
+.aui-popup-bottom-left .aui-popup-arrow,
+.aui-popup-bottom-right .aui-popup-arrow {
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+ bottom: 0.2rem;
+}
+.aui-popup-bottom .aui-popup-arrow {
+ left: 50%;
+ margin-left: -0.25rem;
+ margin-bottom: -0.4rem;
+}
+.aui-popup-bottom-left .aui-popup-arrow {
+ left: 0.25rem;
+ margin-bottom: -0.4rem;
+}
+.aui-popup-bottom-right .aui-popup-arrow {
+ right: 0.25rem;
+ margin-bottom: -0.4rem;
+}
+.aui-popup .aui-list {
+ background: transparent;
+}
+.aui-popup-content .aui-list img {
+ display: block;
+ width: 1rem;
+}
+/*actionsheet*/
+.aui-actionsheet {
+ width: 100%;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ padding: 0 0.5rem;
+ z-index: 999;
+ opacity: 0;
+ -webkit-transition: opacity .3s,-webkit-transform .3s;
+ transition: opacity .3s,transform .3s;
+ -webkit-transform: translate3d(0,100%,0);
+ transform: translate3d(0,100%,0);
+}
+.aui-actionsheet-btn {
+ background-color: #ffffff;
+ border-radius: 6px;
+ text-align: center;
+ margin-bottom: 0.5rem;
+}
+.aui-actionsheet-title {
+ font-size: 0.6rem;
+ color: #999999;
+ line-height: 1.8rem;
+}
+.aui-actionsheet-btn-item {
+ height: 2.2rem;
+ line-height: 2.2rem;
+ color: #0075f0;
+}
+/*sharebox*/
+.aui-sharebox {
+ width: 100%;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ z-index: 999;
+ background-color: #ffffff;
+ opacity: 0;
+ -webkit-transition: opacity .3s,-webkit-transform .3s;
+ transition: opacity .3s,transform .3s;
+ -webkit-transform: translate3d(0,100%,0);
+ transform: translate3d(0,100%,0);
+}
+.aui-sharebox .aui-row {
+ padding: 0.5rem 0;
+}
+.aui-sharebox img {
+ display: block;
+ width: 50%;
+ margin: 0 auto;
+}
+.aui-sharebox.aui-grid [class*=aui-col-] {
+ padding: 0.5rem 0;
+}
+.aui-sharebox.aui-grid .aui-grid-label {
+ font-size: 0.6rem;
+ color: #757575;
+}
+.aui-sharebox-close-btn {
+ width: 100%;
+ height: 2.2rem;
+ line-height: 2.2rem;
+ color: #757575;
+ text-align: center;
+ font-size: 0.7rem;
+}
+/*折叠菜单*/
+.aui-collapse-header.aui-active {
+ background: #ececec;
+}
+.aui-collapse .aui-list-item:active{
+ background: #ececec;
+}
+.aui-collapse-content {
+ display: none;
+}
+.aui-collapse-content .aui-list-item:last-child {
+ border-bottom: 0;
+}
+@media screen and (-webkit-min-device-pixel-ratio:1.5) {
+ .aui-collapse-content .aui-list-item:last-child {
+ background-position: bottom;
+ }
+ .aui-list.aui-collapse.aui-list-noborder,
+ .aui-list.aui-collapse.aui-list-noborder .aui-collapse-content:last-child .aui-list-item:last-child {
+ border: none;
+ background-size: 100% 1px;
+ background-repeat: no-repeat;
+ background-position: 0 bottom;
+ background-image: linear-gradient(0,#dddddd,#dddddd 50%,transparent 50%);
+ background-image: -webkit-linear-gradient(90deg,#dddddd,#dddddd 50%,transparent 50%);
+ }
+ .aui-list.aui-collapse.aui-list-noborder,
+ .aui-list.aui-collapse.aui-list-noborder .aui-collapse-item:last-child .aui-list-item:last-child {
+ border: none;
+ background-size: 100% 0;
+ background-image: none;
+ }
+ .aui-list.aui-collapse.aui-list-noborder .aui-collapse-item:last-child .aui-list-item.aui-collapse-header,
+ .aui-list.aui-collapse.aui-list-noborder .aui-collapse-content .aui-list-item:last-child {
+ border: none;
+ background-size: 100% 0;
+ background-image: none;
+ }
+}
+.aui-collapse-header.aui-active .aui-collapse-arrow {
+ display: block;
+ transform: rotate(180deg);
+ -webkit-transform: rotate(180deg);
+}
+/*聊天气泡*/
+.aui-chat {
+ width: 100%;
+ height: 100%;
+ padding: 0.5rem;
+}
+.aui-chat .aui-chat-item {
+ position: relative;
+ width: 100%;
+ margin-bottom: 0.75rem;
+ overflow: hidden;
+ display: block;
+}
+.aui-chat .aui-chat-header {
+ width: 100%;
+ text-align: center;
+ margin-bottom: 0.75rem;
+ font-size: 0.6rem;
+ color: #757575;
+}
+.aui-chat .aui-chat-left {
+ float: left;
+}
+.aui-chat .aui-chat-right {
+ float: right;
+}
+.aui-chat .aui-chat-media {
+ display: inline-block;
+ max-width: 2rem;
+}
+.aui-chat .aui-chat-media img {
+ width: 100%;
+ border-radius: 50%;
+}
+.aui-chat .aui-chat-inner {
+ position: relative;
+ overflow: hidden;
+ display: inherit;
+}
+.aui-chat .aui-chat-arrow {
+ content: '';
+ position: absolute;
+ width: 0.6rem;
+ height: 0.6rem;
+ top: 0.2rem;
+ -webkit-transform-origin: 50% 50% 0;
+ transform-origin: 50% 50% 0;
+ background-color: transparent;
+}
+.aui-chat .aui-chat-left .aui-chat-arrow {
+ background-image: -webkit-linear-gradient(45deg, #b3e5fc, #b3e5fc 50%, transparent 50%);
+ background-image: linear-gradient(45deg, #b3e5fc, #b3e5fc 50%, transparent 50%);
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+ left: -0.25rem;
+}
+.aui-chat .aui-chat-right .aui-chat-arrow {
+ background-image: -webkit-linear-gradient(45deg, #ffffff, #ffffff 50%, transparent 50%);
+ background-image: linear-gradient(45deg, #ffffff, #ffffff 50%, transparent 50%);
+ -webkit-transform: rotate(-135deg);
+ transform: rotate(-135deg);
+ right: -0.25rem;
+}
+.aui-chat .aui-chat-content {
+ color: #212121;
+ font-size: 0.7rem;
+ border-radius: 0.2rem;
+ min-height: 2rem;
+ position: relative;
+ padding: 0.5rem;
+ max-width: 80%;
+ word-break: break-all;
+ word-wrap: break-word;
+}
+.aui-chat .aui-chat-content img {
+ max-width: 100%;
+ display: block;
+}
+.aui-chat .aui-chat-status {
+ position: relative;
+ width: 2rem;
+ height: 2rem;
+ line-height: 2rem;
+ text-align: center;
+}
+.aui-chat .aui-chat-name {
+ width: 100%;
+ position: relative;
+ font-size: 0.6rem;
+ color: #757575;
+ margin-bottom: 0.25rem;
+}
+.aui-chat .aui-chat-left .aui-chat-name {
+ left: 0.5rem;
+}
+.aui-chat .aui-chat-left .aui-chat-status {
+ left: 0.5rem;
+ float: left;
+}
+.aui-chat .aui-chat-left .aui-chat-media {
+ width: 2rem;
+ float: left;
+}
+.aui-chat .aui-chat-left .aui-chat-inner {
+ max-width: 70%;
+}
+.aui-chat .aui-chat-left .aui-chat-content{
+ background-color: #b3e5fc;
+ float: left;
+ left: 0.5rem;
+}
+.aui-chat .aui-chat-right .aui-chat-media {
+ width: 2rem;
+ float: right;
+}
+.aui-chat .aui-chat-right .aui-chat-inner {
+ float: right;
+ max-width: 70%;
+}
+.aui-chat .aui-chat-right .aui-chat-name {
+ float: right;
+ right: 0.5rem;
+ text-align: right;
+}
+.aui-chat .aui-chat-right .aui-chat-content {
+ background-color: #ffffff;
+ right: 0.5rem;
+ float: right;
+}
+.aui-chat .aui-chat-right .aui-chat-status {
+ float: right;
+ right: 0.5rem;
+}
+/*边框样式*/
+.aui-border-l {
+ border-left: 1px solid #dddddd;
+}
+.aui-border-r {
+ border-right: 1px solid #dddddd;
+}
+.aui-border-t {
+ border-top: 1px solid #dddddd;
+}
+.aui-border-b {
+ border-bottom: 1px solid #dddddd;
+}
+.aui-border {
+ border: 1px solid #dddddd;
+}
+@media screen and (-webkit-min-device-pixel-ratio:1.5) {
+ .aui-border-l {
+ border: none;
+ background-image: -webkit-linear-gradient(0deg, #dddddd, #dddddd 50%, transparent 50%);
+ background-image: linear-gradient(270deg, #dddddd, #dddddd 50%, transparent 50%);
+ background-size: 1px 100%;
+ background-repeat: no-repeat;
+ background-position: left;
+ }
+ .aui-border-r {
+ border: none;
+ background-image: -webkit-linear-gradient(0deg, #dddddd, #dddddd 50%, transparent 50%);
+ background-image: linear-gradient(270deg, #dddddd, #dddddd 50%, transparent 50%);
+ background-size: 1px 100%;
+ background-repeat: no-repeat;
+ background-position: right;
+ }
+ .aui-border-t{
+ border: none;
+ background-size: 100% 1px;
+ background-repeat: no-repeat;
+ background-position: top;
+ background-image: linear-gradient(0,#dddddd,#dddddd 50%,transparent 50%);
+ background-image: -webkit-linear-gradient(90deg,#dddddd,#dddddd 50%,transparent 50%);
+ }
+ .aui-border-b {
+ border: none;
+ background-size: 100% 1px;
+ background-repeat: no-repeat;
+ background-position: bottom;
+ background-image: linear-gradient(0,#dddddd,#dddddd 50%,transparent 50%);
+ background-image: -webkit-linear-gradient(90deg,#dddddd,#dddddd 50%,transparent 50%);
+ }
+ .aui-border{
+ border: none;
+ background-image: -webkit-linear-gradient(270deg, #dddddd, #dddddd 50%, transparent 50%), -webkit-linear-gradient(180deg, #dddddd, #dddddd 50%, transparent 50%), -webkit-linear-gradient(90deg, #dddddd, #dddddd 50%, transparent 50%), -webkit-linear-gradient(0, #dddddd, #dddddd 50%, transparent 50%);
+ background-image: linear-gradient(180deg, #dddddd, #dddddd 50%, transparent 50%), linear-gradient(270deg, #dddddd, #dddddd 50%, transparent 50%), linear-gradient(0deg, #dddddd, #dddddd 50%, transparent 50%), linear-gradient(90deg, #dddddd, #dddddd 50%, transparent 50%);
+ background-size: 100% 1px, 1px 100%, 100% 1px, 1px 100%;
+ background-repeat: no-repeat;
+ background-position: top, right top, bottom, left top;
+ }
+}
+/*时间轴*/
+.aui-timeline {
+ position: relative;
+ padding: 0;
+ list-style: none;
+}
+.aui-timeline:before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 1.85rem;
+ width: 2px;
+ height: 100%;
+ background: #ececec;
+ z-index: 0;
+}
+.aui-timeline .aui-timeline-item {
+ position: relative;
+ margin-bottom: 0.35rem;
+}
+.aui-timeline .aui-timeline-item-header {
+ background-color: #ececec;
+ padding: 0.2rem 0.5rem;
+ margin: 0.75rem;
+ text-align: center;
+ display: inline-block;
+ position: relative;
+ z-index: 1;
+ font-size: 0.7rem;
+}
+.aui-timeline .aui-timeline-item-label {
+ width: 2.5rem;
+ height: 1.5rem;
+ line-height: 1.5rem;
+ font-size: 0.7em;
+ background-color: #ececec;
+ position: absolute;
+ text-align: center;
+ left: 0.75rem;
+ top: 0;
+}
+.aui-timeline .aui-timeline-item-label-icon {
+ width: 1.5rem;
+ height: 1.5rem;
+ font-size: 0.7rem;
+ line-height: 1.5rem;
+ background-color: #ececec;
+ position: absolute;
+ border-radius: 50%;
+ text-align: center;
+ left: 1.15rem;
+ top: 0;
+}
+.aui-timeline .aui-timeline-item-inner {
+ margin-left: 3.75rem;
+ margin-right: 0.75rem;
+ padding: 0;
+ position: relative;
+}
+/*基础动画类*/
+@keyframes rotate {
+ 0% {
+ -webkit-transform: rotate(0deg) scale(1);
+ transform: rotate(0deg) scale(1);
+ }
+ 50% {
+ -webkit-transform: rotate(180deg) scale(1);
+ transform: rotate(180deg) scale(1);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg) scale(1);
+ transform: rotate(360deg) scale(1);
+ }
+}
+@-webkit-keyframes rotate {
+ 0% {
+ -webkit-transform: rotate(0deg) scale(1);
+ transform: rotate(0deg) scale(1);
+ }
+ 50% {
+ -webkit-transform: rotate(180deg) scale(1);
+ transform: rotate(180deg) scale(1);
+ }
+ 100% {
+ -webkit-transform: rotate(360deg) scale(1);
+ transform: rotate(360deg) scale(1);
+ }
+}
+@keyframes bounce {
+ 0%, 100% {
+ -webkit-transform: scale(0.0);
+ transform: scale(0.0);
+ }
+ 50% {
+ -webkit-transform: scale(1.0);
+ transform: scale(1.0);
+ }
+}
+@-webkit-keyframes bounce {
+ 0%, 100% {
+ -webkit-transform: scale(0.0);
+ transform: scale(0.0);
+ }
+ 50% {
+ -webkit-transform: scale(1.0);
+ transform: scale(1.0);
+ }
+}
+@keyframes fadeIn {
+ from { opacity: 0.3; }
+ to { opacity: 1; }
+}
+@-webkit-keyframes fadeIn {
+ from { opacity: 0.3; }
+ to { opacity: 1; }
+}
+@font-face {
+ font-family: "aui_iconfont";
+ src: url('aui-iconfont.ttf') format('truetype');
+}
+.aui-iconfont {
+ position: relative;
+ font-family:"aui_iconfont" !important;
+ font-size: 0.7rem;
+ font-style:normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.aui-icon-menu:before { content: "\e6eb"; }
+.aui-icon-paper:before { content: "\e6ec"; }
+.aui-icon-info:before { content: "\e6ed"; }
+.aui-icon-question:before { content: "\e6ee"; }
+.aui-icon-left:before { content: "\e6f4"; }
+.aui-icon-right:before { content: "\e6f5"; }
+.aui-icon-top:before { content: "\e6f6"; }
+.aui-icon-down:before { content: "\e6f7"; }
+.aui-icon-share:before { content: "\e700"; }
+.aui-icon-comment:before { content: "\e701"; }
+.aui-icon-edit:before { content: "\e6d3"; }
+.aui-icon-trash:before { content: "\e6d4"; }
+.aui-icon-recovery:before { content: "\e6dc"; }
+.aui-icon-refresh:before { content: "\e6dd"; }
+.aui-icon-close:before { content: "\e6d8"; }
+.aui-icon-cart:before { content: "\e6df"; }
+.aui-icon-star:before { content: "\e6e0"; }
+.aui-icon-plus:before { content: "\e6e3"; }
+.aui-icon-minus:before { content: "\e62d"; }
+.aui-icon-correct:before { content: "\e6e5"; }
+.aui-icon-search:before { content: "\e6e6"; }
+.aui-icon-gear:before { content: "\e6e8"; }
+.aui-icon-map:before { content: "\e6d2"; }
+.aui-icon-location:before { content: "\e6d1"; }
+.aui-icon-image:before { content: "\e6ce"; }
+.aui-icon-phone:before { content: "\e6c4"; }
+.aui-icon-camera:before { content: "\e6cd"; }
+.aui-icon-video:before { content: "\e6cc"; }
+.aui-icon-qq:before { content: "\e6cb"; }
+.aui-icon-wechat:before { content: "\e6c9"; }
+.aui-icon-weibo:before { content: "\e6c8"; }
+.aui-icon-note:before { content: "\e6c6"; }
+.aui-icon-mail:before { content: "\e6c5"; }
+.aui-icon-wechat-circle:before { content: "\e6ca"; }
+.aui-icon-home:before { content: "\e706"; }
+.aui-icon-forward:before { content: "\e6d9"; }
+.aui-icon-back:before { content: "\e6da"; }
+.aui-icon-laud:before { content: "\e64b"; }
+.aui-icon-lock:before { content: "\e6ef"; }
+.aui-icon-unlock:before { content: "\e62f"; }
+.aui-icon-like:before { content: "\e62b"; }
+.aui-icon-my:before { content: "\e610"; }
+.aui-icon-more:before { content: "\e625"; }
+.aui-icon-mobile:before { content: "\e697"; }
+.aui-icon-calendar:before { content: "\e68a"; }
+.aui-icon-date:before { content: "\e68c"; }
+.aui-icon-display:before { content: "\e612"; }
+.aui-icon-hide:before { content: "\e624"; }
+.aui-icon-pencil:before { content: "\e615"; }
+.aui-icon-flag:before { content: "\e6f1"; }
+.aui-icon-cert:before { content: "\e704"; }
+
+.aui-card-list-user:after {
+ width: 100%;
+ height: 1px;
+ background-color: #f2f2f2;
+ display: block;
+ content: '';
+ position: absolute;
+ top: auto;
+ right: auto;
+ bottom: 0;
+ left: 0;
+ z-index: 2;
+ -webkit-transform-origin: 50% 100%;
+ transform-origin: 50% 100%;
+ pointer-events: none;
+}
+.aui-list [class*=top-btn]:active {
+ background-color: #048cca;
+}
+.vcodedisabled {
+ color: #999 !important;
+}
diff --git a/oauth/src/main/resources/static/css/index.css b/oauth/src/main/resources/static/css/index.css
new file mode 100644
index 0000000..b23e33c
--- /dev/null
+++ b/oauth/src/main/resources/static/css/index.css
@@ -0,0 +1,149 @@
+body {
+ background: #F1F4F4;
+}
+
+.mainbg {
+ background: #03a9f4;
+}
+
+.lightbg {
+ background: #54C8FF;
+}
+
+.tab-bottom button.active::after {
+ background-color: transparent;
+}
+
+.maincolor {
+ color: #03a9f4;
+}
+
+.qrscanner {
+ width: 100%;
+ background: transparent none !important;
+ padding-top: 52px;
+}
+
+.qrscanner-area {
+ height: 100mm;
+ background: url(../img/scanner.svg) no-repeat center center;
+ background-size: contain;
+}
+
+.through-line {
+ left: 20%;
+ width: 60%;
+ height: 2px;
+ background: red;
+ position: absolute;
+ animation: myfirst 2s linear infinite alternate;
+}
+
+@keyframes myfirst {
+ 0% {
+ background: #03a9f4;
+ top: 180px;
+ }
+
+ 25% {
+ background: #03a9f4;
+ top: 215px;
+ }
+
+ 50% {
+ background: #03a9f4;
+ top: 250px;
+ }
+
+ 75% {
+ background: #03a9f4;
+ top: 285px;
+ }
+
+ 100% {
+ background: #03a9f4;
+ top: 320px;
+ }
+}
+
+.button-bottom {
+ width: 128px;
+ position: absolute;
+ left: 50%;
+ bottom: 80px;
+ margin-left: -64px;
+}
+
+.icon-camera {
+ float: left;
+}
+
+.vcodedisabled {
+ color: #999 !important;
+}
+
+.login-top {
+ height: 200px;
+ background: #03a9f4;
+ color: #fff;
+ font-size: 36px;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+}
+
+.weui-toast_content {
+ color: #fff;
+}
+
+.center-in {
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ display: flex;
+}
+
+.top-title {
+ color: #fff;
+ font-size: 20px !important;
+ margin-top: 5px;
+}
+
+.user-info {
+ width: 150%;
+ position: relative;
+ left: -25%;
+ padding-left: 25%;
+ border-bottom-left-radius: 50%;
+ border-bottom-right-radius: 50%;
+ padding-bottom: 1.5rem;
+}
+
+.text-white {
+ color: #ffffff !important;
+}
+
+.text-light {
+ color: #999 !important;
+}
+
+.bg-white {
+ background-color: #ffffff;
+}
+.demos-header {
+ padding: 20px 0;
+ background-color: #03a9f4;
+}
+.demos-title {
+ text-align: center;
+ font-size: 40px;
+ color: #fff;
+ font-weight: 400;
+ margin: 0 15%;
+}
+.detail-title{
+ text-align: center;
+ font-size: 16px;
+ color: #fff;
+}
diff --git a/oauth/src/main/resources/static/css/jquery-weui.css b/oauth/src/main/resources/static/css/jquery-weui.css
new file mode 100644
index 0000000..333bdc9
--- /dev/null
+++ b/oauth/src/main/resources/static/css/jquery-weui.css
@@ -0,0 +1,2345 @@
+/**
+* jQuery WeUI V1.2.0
+* By 言川
+* http://lihongxun945.github.io/jquery-weui/
+ */
+.preloader {
+ width: 20px;
+ height: 20px;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+ -webkit-animation: preloader-spin 1s steps(12, end) infinite;
+ animation: preloader-spin 1s steps(12, end) infinite;
+}
+.preloader:after {
+ display: block;
+ width: 100%;
+ height: 100%;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
+ background-repeat: no-repeat;
+ background-position: 50%;
+ background-size: 100%;
+}
+@-webkit-keyframes preloader-spin {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+@keyframes preloader-spin {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+/*
+.hairline(@position, @color) when (@position = top) {
+ border-top: 1px solid @color;
+}
+.hairline(@position, @color) when (@position = left) {
+ border-left: 1px solid @color;
+}
+.hairline(@position, @color) when (@position = bottom) {
+ border-bottom: 1px solid @color;
+}
+.hairline(@position, @color) when (@position = right) {
+ border-right: 1px solid @color;
+}
+// For right and bottom
+.hairline-remove(@position) when not (@position = left) and not (@position = top) {
+ border-left: 0;
+ border-bottom: 0;
+}
+// For left and top
+.hairline-remove(@position) when not (@position = right) and not (@position = bottom) {
+ border-right: 0;
+ border-top: 0;
+}
+// For right and bottom
+.hairline-color(@position, @color) when not (@position = left) and not (@position = top) {
+ border-right-color: @color;
+ border-bottom-color: @color;
+}
+// For left and top
+.hairline-color(@position, @color) when not (@position = right) and not (@position = bottom) {
+ border-left-color: @color;
+ border-top-color: @color;
+}
+*/
+label > * {
+ pointer-events: none;
+}
+html {
+ font-size: 20px;
+}
+body {
+ font-size: 16px;
+}
+@media only screen and (min-width: 400px) {
+ html {
+ font-size: 21.33333333px !important;
+ }
+}
+@media only screen and (min-width: 414px) {
+ html {
+ font-size: 22.08px !important;
+ }
+}
+@media only screen and (min-width: 480px) {
+ html {
+ font-size: 25.6px !important;
+ }
+}
+.weui_navbar {
+ z-index: 10;
+}
+.weui-popup-overlay,
+.weui-popup-container {
+ z-index: 1000;
+}
+.weui-mask {
+ z-index: 1000;
+}
+/* === Grid === */
+.weui-row {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: justify;
+ -ms-flex-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ -webkit-box-lines: multiple;
+ -moz-box-lines: multiple;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-align: start;
+ -ms-flex-align: start;
+ -webkit-align-items: flex-start;
+ align-items: flex-start;
+}
+.weui-row > [class*="col-"] {
+ box-sizing: border-box;
+}
+.weui-row .col-auto {
+ width: 100%;
+}
+.weui-row .weui-col-100 {
+ width: 100%;
+ width: calc((100% - 15px*0) / 1);
+}
+.weui-row.weui-no-gutter .weui-col-100 {
+ width: 100%;
+}
+.weui-row .weui-col-95 {
+ width: 95%;
+ width: calc((100% - 15px*0.05263157894736836) / 1.0526315789473684);
+}
+.weui-row.weui-no-gutter .weui-col-95 {
+ width: 95%;
+}
+.weui-row .weui-col-90 {
+ width: 90%;
+ width: calc((100% - 15px*0.11111111111111116) / 1.1111111111111112);
+}
+.weui-row.weui-no-gutter .weui-col-90 {
+ width: 90%;
+}
+.weui-row .weui-col-85 {
+ width: 85%;
+ width: calc((100% - 15px*0.17647058823529416) / 1.1764705882352942);
+}
+.weui-row.weui-no-gutter .weui-col-85 {
+ width: 85%;
+}
+.weui-row .weui-col-80 {
+ width: 80%;
+ width: calc((100% - 15px*0.25) / 1.25);
+}
+.weui-row.weui-no-gutter .weui-col-80 {
+ width: 80%;
+}
+.weui-row .weui-col-75 {
+ width: 75%;
+ width: calc((100% - 15px*0.33333333333333326) / 1.3333333333333333);
+}
+.weui-row.weui-no-gutter .weui-col-75 {
+ width: 75%;
+}
+.weui-row .weui-col-66 {
+ width: 66.66666666666666%;
+ width: calc((100% - 15px*0.5000000000000002) / 1.5000000000000002);
+}
+.weui-row.weui-no-gutter .weui-col-66 {
+ width: 66.66666666666666%;
+}
+.weui-row .weui-col-60 {
+ width: 60%;
+ width: calc((100% - 15px*0.6666666666666667) / 1.6666666666666667);
+}
+.weui-row.weui-no-gutter .weui-col-60 {
+ width: 60%;
+}
+.weui-row .weui-col-50 {
+ width: 50%;
+ width: calc((100% - 15px*1) / 2);
+}
+.weui-row.weui-no-gutter .weui-col-50 {
+ width: 50%;
+}
+.weui-row .weui-col-40 {
+ width: 40%;
+ width: calc((100% - 15px*1.5) / 2.5);
+}
+.weui-row.weui-no-gutter .weui-col-40 {
+ width: 40%;
+}
+.weui-row .weui-col-33 {
+ width: 33.333333333333336%;
+ width: calc((100% - 15px*2) / 3);
+}
+.weui-row.weui-no-gutter .weui-col-33 {
+ width: 33.333333333333336%;
+}
+.weui-row .weui-col-25 {
+ width: 25%;
+ width: calc((100% - 15px*3) / 4);
+}
+.weui-row.weui-no-gutter .weui-col-25 {
+ width: 25%;
+}
+.weui-row .weui-col-20 {
+ width: 20%;
+ width: calc((100% - 15px*4) / 5);
+}
+.weui-row.weui-no-gutter .weui-col-20 {
+ width: 20%;
+}
+.weui-row .weui-col-15 {
+ width: 15%;
+ width: calc((100% - 15px*5.666666666666667) / 6.666666666666667);
+}
+.weui-row.weui-no-gutter .weui-col-15 {
+ width: 15%;
+}
+.weui-row .weui-col-10 {
+ width: 10%;
+ width: calc((100% - 15px*9) / 10);
+}
+.weui-row.weui-no-gutter .weui-col-10 {
+ width: 10%;
+}
+.weui-row .weui-col-5 {
+ width: 5%;
+ width: calc((100% - 15px*19) / 20);
+}
+.weui-row.weui-no-gutter .weui-col-5 {
+ width: 5%;
+}
+.weui-row .weui-col-auto:nth-last-child(1),
+.weui-row .weui-col-auto:nth-last-child(1) ~ .weui-col-auto {
+ width: 100%;
+ width: calc((100% - 15px*0) / 1);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(1),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(1) ~ .weui-col-auto {
+ width: 100%;
+}
+.weui-row .weui-col-auto:nth-last-child(2),
+.weui-row .weui-col-auto:nth-last-child(2) ~ .weui-col-auto {
+ width: 50%;
+ width: calc((100% - 15px*1) / 2);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(2),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(2) ~ .weui-col-auto {
+ width: 50%;
+}
+.weui-row .weui-col-auto:nth-last-child(3),
+.weui-row .weui-col-auto:nth-last-child(3) ~ .weui-col-auto {
+ width: 33.33333333%;
+ width: calc((100% - 15px*2) / 3);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(3),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(3) ~ .weui-col-auto {
+ width: 33.33333333%;
+}
+.weui-row .weui-col-auto:nth-last-child(4),
+.weui-row .weui-col-auto:nth-last-child(4) ~ .weui-col-auto {
+ width: 25%;
+ width: calc((100% - 15px*3) / 4);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(4),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(4) ~ .weui-col-auto {
+ width: 25%;
+}
+.weui-row .weui-col-auto:nth-last-child(5),
+.weui-row .weui-col-auto:nth-last-child(5) ~ .weui-col-auto {
+ width: 20%;
+ width: calc((100% - 15px*4) / 5);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(5),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(5) ~ .weui-col-auto {
+ width: 20%;
+}
+.weui-row .weui-col-auto:nth-last-child(6),
+.weui-row .weui-col-auto:nth-last-child(6) ~ .weui-col-auto {
+ width: 16.66666667%;
+ width: calc((100% - 15px*5) / 6);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(6),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(6) ~ .weui-col-auto {
+ width: 16.66666667%;
+}
+.weui-row .weui-col-auto:nth-last-child(7),
+.weui-row .weui-col-auto:nth-last-child(7) ~ .weui-col-auto {
+ width: 14.28571429%;
+ width: calc((100% - 15px*6) / 7);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(7),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(7) ~ .weui-col-auto {
+ width: 14.28571429%;
+}
+.weui-row .weui-col-auto:nth-last-child(8),
+.weui-row .weui-col-auto:nth-last-child(8) ~ .weui-col-auto {
+ width: 12.5%;
+ width: calc((100% - 15px*7) / 8);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(8),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(8) ~ .weui-col-auto {
+ width: 12.5%;
+}
+.weui-row .weui-col-auto:nth-last-child(9),
+.weui-row .weui-col-auto:nth-last-child(9) ~ .weui-col-auto {
+ width: 11.11111111%;
+ width: calc((100% - 15px*8) / 9);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(9),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(9) ~ .weui-col-auto {
+ width: 11.11111111%;
+}
+.weui-row .weui-col-auto:nth-last-child(10),
+.weui-row .weui-col-auto:nth-last-child(10) ~ .weui-col-auto {
+ width: 10%;
+ width: calc((100% - 15px*9) / 10);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(10),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(10) ~ .weui-col-auto {
+ width: 10%;
+}
+.weui-row .weui-col-auto:nth-last-child(11),
+.weui-row .weui-col-auto:nth-last-child(11) ~ .weui-col-auto {
+ width: 9.09090909%;
+ width: calc((100% - 15px*10) / 11);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(11),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(11) ~ .weui-col-auto {
+ width: 9.09090909%;
+}
+.weui-row .weui-col-auto:nth-last-child(12),
+.weui-row .weui-col-auto:nth-last-child(12) ~ .weui-col-auto {
+ width: 8.33333333%;
+ width: calc((100% - 15px*11) / 12);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(12),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(12) ~ .weui-col-auto {
+ width: 8.33333333%;
+}
+.weui-row .weui-col-auto:nth-last-child(13),
+.weui-row .weui-col-auto:nth-last-child(13) ~ .weui-col-auto {
+ width: 7.69230769%;
+ width: calc((100% - 15px*12) / 13);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(13),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(13) ~ .weui-col-auto {
+ width: 7.69230769%;
+}
+.weui-row .weui-col-auto:nth-last-child(14),
+.weui-row .weui-col-auto:nth-last-child(14) ~ .weui-col-auto {
+ width: 7.14285714%;
+ width: calc((100% - 15px*13) / 14);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(14),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(14) ~ .weui-col-auto {
+ width: 7.14285714%;
+}
+.weui-row .weui-col-auto:nth-last-child(15),
+.weui-row .weui-col-auto:nth-last-child(15) ~ .weui-col-auto {
+ width: 6.66666667%;
+ width: calc((100% - 15px*14) / 15);
+}
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(15),
+.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(15) ~ .weui-col-auto {
+ width: 6.66666667%;
+}
+@media all and (min-width: 768px) {
+ .row .tablet-100 {
+ width: 100%;
+ width: calc((100% - 15px*0) / 1);
+ }
+ .row.no-gutter .tablet-100 {
+ width: 100%;
+ }
+ .row .tablet-95 {
+ width: 95%;
+ width: calc((100% - 15px*0.05263157894736836) / 1.0526315789473684);
+ }
+ .row.no-gutter .tablet-95 {
+ width: 95%;
+ }
+ .row .tablet-90 {
+ width: 90%;
+ width: calc((100% - 15px*0.11111111111111116) / 1.1111111111111112);
+ }
+ .row.no-gutter .tablet-90 {
+ width: 90%;
+ }
+ .row .tablet-85 {
+ width: 85%;
+ width: calc((100% - 15px*0.17647058823529416) / 1.1764705882352942);
+ }
+ .row.no-gutter .tablet-85 {
+ width: 85%;
+ }
+ .row .tablet-80 {
+ width: 80%;
+ width: calc((100% - 15px*0.25) / 1.25);
+ }
+ .row.no-gutter .tablet-80 {
+ width: 80%;
+ }
+ .row .tablet-75 {
+ width: 75%;
+ width: calc((100% - 15px*0.33333333333333326) / 1.3333333333333333);
+ }
+ .row.no-gutter .tablet-75 {
+ width: 75%;
+ }
+ .row .tablet-66 {
+ width: 66.66666666666666%;
+ width: calc((100% - 15px*0.5000000000000002) / 1.5000000000000002);
+ }
+ .row.no-gutter .tablet-66 {
+ width: 66.66666666666666%;
+ }
+ .row .tablet-60 {
+ width: 60%;
+ width: calc((100% - 15px*0.6666666666666667) / 1.6666666666666667);
+ }
+ .row.no-gutter .tablet-60 {
+ width: 60%;
+ }
+ .row .tablet-50 {
+ width: 50%;
+ width: calc((100% - 15px*1) / 2);
+ }
+ .row.no-gutter .tablet-50 {
+ width: 50%;
+ }
+ .row .tablet-40 {
+ width: 40%;
+ width: calc((100% - 15px*1.5) / 2.5);
+ }
+ .row.no-gutter .tablet-40 {
+ width: 40%;
+ }
+ .row .tablet-33 {
+ width: 33.333333333333336%;
+ width: calc((100% - 15px*2) / 3);
+ }
+ .row.no-gutter .tablet-33 {
+ width: 33.333333333333336%;
+ }
+ .row .tablet-25 {
+ width: 25%;
+ width: calc((100% - 15px*3) / 4);
+ }
+ .row.no-gutter .tablet-25 {
+ width: 25%;
+ }
+ .row .tablet-20 {
+ width: 20%;
+ width: calc((100% - 15px*4) / 5);
+ }
+ .row.no-gutter .tablet-20 {
+ width: 20%;
+ }
+ .row .tablet-15 {
+ width: 15%;
+ width: calc((100% - 15px*5.666666666666667) / 6.666666666666667);
+ }
+ .row.no-gutter .tablet-15 {
+ width: 15%;
+ }
+ .row .tablet-10 {
+ width: 10%;
+ width: calc((100% - 15px*9) / 10);
+ }
+ .row.no-gutter .tablet-10 {
+ width: 10%;
+ }
+ .row .tablet-5 {
+ width: 5%;
+ width: calc((100% - 15px*19) / 20);
+ }
+ .row.no-gutter .tablet-5 {
+ width: 5%;
+ }
+ .row .tablet-auto:nth-last-child(1),
+ .row .tablet-auto:nth-last-child(1) ~ .col-auto {
+ width: 100%;
+ width: calc((100% - 15px*0) / 1);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(1),
+ .row.no-gutter .tablet-auto:nth-last-child(1) ~ .tablet-auto {
+ width: 100%;
+ }
+ .row .tablet-auto:nth-last-child(2),
+ .row .tablet-auto:nth-last-child(2) ~ .col-auto {
+ width: 50%;
+ width: calc((100% - 15px*1) / 2);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(2),
+ .row.no-gutter .tablet-auto:nth-last-child(2) ~ .tablet-auto {
+ width: 50%;
+ }
+ .row .tablet-auto:nth-last-child(3),
+ .row .tablet-auto:nth-last-child(3) ~ .col-auto {
+ width: 33.33333333%;
+ width: calc((100% - 15px*2) / 3);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(3),
+ .row.no-gutter .tablet-auto:nth-last-child(3) ~ .tablet-auto {
+ width: 33.33333333%;
+ }
+ .row .tablet-auto:nth-last-child(4),
+ .row .tablet-auto:nth-last-child(4) ~ .col-auto {
+ width: 25%;
+ width: calc((100% - 15px*3) / 4);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(4),
+ .row.no-gutter .tablet-auto:nth-last-child(4) ~ .tablet-auto {
+ width: 25%;
+ }
+ .row .tablet-auto:nth-last-child(5),
+ .row .tablet-auto:nth-last-child(5) ~ .col-auto {
+ width: 20%;
+ width: calc((100% - 15px*4) / 5);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(5),
+ .row.no-gutter .tablet-auto:nth-last-child(5) ~ .tablet-auto {
+ width: 20%;
+ }
+ .row .tablet-auto:nth-last-child(6),
+ .row .tablet-auto:nth-last-child(6) ~ .col-auto {
+ width: 16.66666667%;
+ width: calc((100% - 15px*5) / 6);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(6),
+ .row.no-gutter .tablet-auto:nth-last-child(6) ~ .tablet-auto {
+ width: 16.66666667%;
+ }
+ .row .tablet-auto:nth-last-child(7),
+ .row .tablet-auto:nth-last-child(7) ~ .col-auto {
+ width: 14.28571429%;
+ width: calc((100% - 15px*6) / 7);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(7),
+ .row.no-gutter .tablet-auto:nth-last-child(7) ~ .tablet-auto {
+ width: 14.28571429%;
+ }
+ .row .tablet-auto:nth-last-child(8),
+ .row .tablet-auto:nth-last-child(8) ~ .col-auto {
+ width: 12.5%;
+ width: calc((100% - 15px*7) / 8);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(8),
+ .row.no-gutter .tablet-auto:nth-last-child(8) ~ .tablet-auto {
+ width: 12.5%;
+ }
+ .row .tablet-auto:nth-last-child(9),
+ .row .tablet-auto:nth-last-child(9) ~ .col-auto {
+ width: 11.11111111%;
+ width: calc((100% - 15px*8) / 9);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(9),
+ .row.no-gutter .tablet-auto:nth-last-child(9) ~ .tablet-auto {
+ width: 11.11111111%;
+ }
+ .row .tablet-auto:nth-last-child(10),
+ .row .tablet-auto:nth-last-child(10) ~ .col-auto {
+ width: 10%;
+ width: calc((100% - 15px*9) / 10);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(10),
+ .row.no-gutter .tablet-auto:nth-last-child(10) ~ .tablet-auto {
+ width: 10%;
+ }
+ .row .tablet-auto:nth-last-child(11),
+ .row .tablet-auto:nth-last-child(11) ~ .col-auto {
+ width: 9.09090909%;
+ width: calc((100% - 15px*10) / 11);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(11),
+ .row.no-gutter .tablet-auto:nth-last-child(11) ~ .tablet-auto {
+ width: 9.09090909%;
+ }
+ .row .tablet-auto:nth-last-child(12),
+ .row .tablet-auto:nth-last-child(12) ~ .col-auto {
+ width: 8.33333333%;
+ width: calc((100% - 15px*11) / 12);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(12),
+ .row.no-gutter .tablet-auto:nth-last-child(12) ~ .tablet-auto {
+ width: 8.33333333%;
+ }
+ .row .tablet-auto:nth-last-child(13),
+ .row .tablet-auto:nth-last-child(13) ~ .col-auto {
+ width: 7.69230769%;
+ width: calc((100% - 15px*12) / 13);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(13),
+ .row.no-gutter .tablet-auto:nth-last-child(13) ~ .tablet-auto {
+ width: 7.69230769%;
+ }
+ .row .tablet-auto:nth-last-child(14),
+ .row .tablet-auto:nth-last-child(14) ~ .col-auto {
+ width: 7.14285714%;
+ width: calc((100% - 15px*13) / 14);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(14),
+ .row.no-gutter .tablet-auto:nth-last-child(14) ~ .tablet-auto {
+ width: 7.14285714%;
+ }
+ .row .tablet-auto:nth-last-child(15),
+ .row .tablet-auto:nth-last-child(15) ~ .col-auto {
+ width: 6.66666667%;
+ width: calc((100% - 15px*14) / 15);
+ }
+ .row.no-gutter .tablet-auto:nth-last-child(15),
+ .row.no-gutter .tablet-auto:nth-last-child(15) ~ .tablet-auto {
+ width: 6.66666667%;
+ }
+}
+.weui-cell__hd img {
+ display: block;
+ margin-right: 5px;
+}
+.weui-cell_swiped .weui-cell__bd {
+ -webkit-transition: -webkit-transform .3s;
+ transition: -webkit-transform .3s;
+ transition: transform .3s;
+ transition: transform .3s, -webkit-transform .3s;
+}
+.swipeout-touching .weui-cell__bd {
+ -webkit-transition: none;
+ transition: none;
+}
+.weui-dialog,
+.weui-toast {
+ -webkit-transition-duration: .2s;
+ transition-duration: .2s;
+ opacity: 0;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ visibility: hidden;
+ margin: 0;
+ top: 45%;
+ z-index: 2000;
+}
+.weui-dialog .weui-dialog__btn.default,
+.weui-toast .weui-dialog__btn.default {
+ color: #5f646e;
+}
+.weui-dialog .weui-dialog__btn + .weui-dialog__btn,
+.weui-toast .weui-dialog__btn + .weui-dialog__btn {
+ position: relative;
+}
+.weui-dialog .weui-dialog__btn + .weui-dialog__btn:after,
+.weui-toast .weui-dialog__btn + .weui-dialog__btn:after {
+ content: " ";
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 1px;
+ height: 100%;
+ border-left: 1px solid #D5D5D6;
+ color: #D5D5D6;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: scaleX(0.5);
+ transform: scaleX(0.5);
+}
+.weui-dialog.weui-dialog--visible,
+.weui-toast.weui-dialog--visible,
+.weui-dialog.weui-toast--visible,
+.weui-toast.weui-toast--visible {
+ opacity: 1;
+ visibility: visible;
+}
+.weui-toast_forbidden {
+ color: #F76260;
+}
+.weui-toast_cancel .weui-icon-toast:before {
+ content: "\EA0D";
+}
+.weui-toast_forbidden .weui-icon-toast:before {
+ content: "\EA0B";
+ color: #F76260;
+}
+.weui-toast_text {
+ min-height: 1em;
+ width: auto;
+ height: 45px;
+ border-radius: 25px;
+ margin-left: 0;
+ -webkit-transform: scale(0.9) translate3d(-50%, 0, 0);
+ transform: scale(0.9) translate3d(-50%, 0, 0);
+ -webkit-transform-origin: left;
+ transform-origin: left;
+}
+.weui-toast_text.weui-toast--visible {
+ -webkit-transform: scale(1) translate3d(-50%, 0, 0);
+ transform: scale(1) translate3d(-50%, 0, 0);
+}
+.weui-toast_text .weui-icon-toast {
+ display: none;
+}
+.weui-toast_text .weui-toast_content {
+ margin: 10px 15px;
+}
+.weui-mask {
+ opacity: 0;
+ -webkit-transition-duration: .3s;
+ transition-duration: .3s;
+ visibility: hidden;
+}
+.weui-mask.weui-mask--visible {
+ opacity: 1;
+ visibility: visible;
+}
+.weui-prompt-input {
+ padding: 4px 6px;
+ border: 1px solid #ccc;
+ box-sizing: border-box;
+ height: 2em;
+ width: 80%;
+ margin-top: 10px;
+}
+.weui-pull-to-refresh {
+ margin-top: -50px;
+ -webkit-transition: -webkit-transform .4s;
+ transition: -webkit-transform .4s;
+ transition: transform .4s;
+ transition: transform .4s, -webkit-transform .4s;
+}
+.weui-pull-to-refresh.refreshing {
+ -webkit-transform: translate3d(0, 50px, 0);
+ transform: translate3d(0, 50px, 0);
+}
+.weui-pull-to-refresh.touching {
+ -webkit-transition-duration: 0s;
+ transition-duration: 0s;
+}
+.weui-pull-to-refresh__layer {
+ height: 30px;
+ line-height: 30px;
+ padding: 10px;
+ text-align: center;
+}
+.weui-pull-to-refresh__layer .down {
+ display: inline-block;
+}
+.weui-pull-to-refresh__layer .up,
+.weui-pull-to-refresh__layer .refresh {
+ display: none;
+}
+.weui-pull-to-refresh__layer .weui-pull-to-refresh__arrow {
+ display: inline-block;
+ z-index: 10;
+ width: 20px;
+ height: 20px;
+ margin-right: 4px;
+ vertical-align: -4px;
+ background: no-repeat center;
+ background-size: 13px 20px;
+ -webkit-transition-duration: 300ms;
+ transition-duration: 300ms;
+ -webkit-transform: rotate(0deg) translate3d(0, 0, 0);
+ transform: rotate(0deg) translate3d(0, 0, 0);
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2026%2040'%3E%3Cpolygon%20points%3D'9%2C22%209%2C0%2017%2C0%2017%2C22%2026%2C22%2013.5%2C40%200%2C22'%20fill%3D'%238c8c8c'%2F%3E%3C%2Fsvg%3E");
+}
+.weui-pull-to-refresh__layer .weui-pull-to-refresh__preloader {
+ display: none;
+ vertical-align: -4px;
+ margin-right: 4px;
+ width: 20px;
+ height: 20px;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+ -webkit-animation: preloader-spin 1s steps(12, end) infinite;
+ animation: preloader-spin 1s steps(12, end) infinite;
+}
+.weui-pull-to-refresh__layer .weui-pull-to-refresh__preloader:after {
+ display: block;
+ width: 100%;
+ height: 100%;
+ content: "";
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
+ background-repeat: no-repeat;
+ background-position: 50%;
+ background-size: 100%;
+}
+.pull-up .weui-pull-to-refresh__layer .down,
+.refreshing .weui-pull-to-refresh__layer .down {
+ display: none;
+}
+.pull-up .weui-pull-to-refresh__layer .weui-pull-to-refresh__arrow {
+ display: inline-block;
+ -webkit-transform: rotate(180deg) translate3d(0, 0, 0);
+ transform: rotate(180deg) translate3d(0, 0, 0);
+}
+.pull-up .weui-pull-to-refresh__layer .up {
+ display: inline-block;
+}
+.pull-down .weui-pull-to-refresh__layer .weui-pull-to-refresh__arrow {
+ display: inline-block;
+}
+.pull-down .weui-pull-to-refresh__layer .down {
+ display: inline-block;
+}
+.refreshing .weui-pull-to-refresh__layer .weui-pull-to-refresh__arrow {
+ display: none;
+}
+.refreshing .weui-pull-to-refresh__layer .weui-pull-to-refresh__preloader {
+ display: inline-block;
+}
+.refreshing .weui-pull-to-refresh__layer .refresh {
+ display: inline-block;
+}
+@keyframes preloader-spin {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+.weui-tab__bd-item.weui-pull-to-refresh {
+ position: absolute;
+ top: 50px;
+}
+.weui-tabbar__item {
+ position: relative;
+}
+.weui-tabbar__item.weui-bar__item--on .weui-tabbar__label {
+ color: #04BE02;
+}
+.weui-navbar__item {
+ color: #888;
+}
+.weui-navbar__item.weui-bar__item--on {
+ color: #666;
+ background-color: #f1f1f1;
+}
+.weui-tab__bd {
+ box-sizing: border-box;
+ height: 100%;
+}
+.weui-tab__bd .weui-tab__bd-item {
+ display: none;
+ height: 100%;
+ overflow: auto;
+}
+.weui-tab__bd .weui-tab__bd-item.weui-tab__bd-item--active {
+ display: block;
+}
+.weui-navbar + .weui-tab__bd {
+ padding-top: 50px;
+}
+.toolbar {
+ position: relative;
+ width: 100%;
+ font-size: .85rem;
+ line-height: 1.5;
+ color: #3d4145;
+ background: #f7f7f8;
+}
+.toolbar:before {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: auto;
+ right: auto;
+ height: 1px;
+ width: 100%;
+ background-color: #d9d9d9;
+ display: block;
+ z-index: 15;
+ -webkit-transform-origin: 50% 0%;
+ transform-origin: 50% 0%;
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 2) {
+ .toolbar:before {
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+ }
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 3) {
+ .toolbar:before {
+ -webkit-transform: scaleY(0.33);
+ transform: scaleY(0.33);
+ }
+}
+.toolbar .toolbar-inner {
+ height: 2.2rem;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ text-align: center;
+}
+.toolbar .title {
+ position: absolute;
+ display: block;
+ width: 100%;
+ padding: 0;
+ font-size: .85rem;
+ font-weight: normal;
+ line-height: 2.2rem;
+ color: #3d4145;
+ text-align: center;
+ white-space: nowrap;
+}
+.toolbar .picker-button {
+ position: absolute;
+ right: 0;
+ box-sizing: border-box;
+ height: 2.2rem;
+ line-height: 2.2rem;
+ color: #04BE02;
+ z-index: 1;
+ padding: 0 .5rem;
+}
+/* === Columns Picker === */
+.weui-picker-modal {
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+ text-align: center;
+ border-radius: 0;
+ opacity: 0.6;
+ color: #3d4145;
+ -webkit-transition-duration: .3s;
+ transition-duration: .3s;
+ height: 13rem;
+ background: #EFEFF4;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ -webkit-transition-property: opacity, -webkit-transform;
+ transition-property: opacity, -webkit-transform;
+ transition-property: transform, opacity;
+ transition-property: transform, opacity, -webkit-transform;
+}
+.weui-picker-modal.picker-modal-inline {
+ height: 10.8rem;
+ opacity: 1;
+ position: static;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+.weui-picker-modal.picker-modal-inline .toolbar {
+ display: none;
+}
+.weui-picker-modal.picker-columns-single .picker-items-col {
+ width: 100%;
+}
+.weui-picker-modal.weui-picker-modal-visible {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+.weui-picker-modal .picker-modal-inner {
+ position: relative;
+ height: 10.8rem;
+}
+.weui-picker-modal .picker-columns {
+ width: 100%;
+ height: 13rem;
+ z-index: 11500;
+}
+.weui-picker-modal .picker-columns.picker-modal-inline,
+.popover .weui-picker-modal .picker-columns {
+ height: 10rem;
+}
+@media (orientation: landscape) and (max-height: 415px) {
+ .weui-picker-modal .picker-columns:not(.picker-modal-inline) {
+ height: 10rem;
+ }
+}
+.weui-picker-modal .popover.popover-picker-columns {
+ width: 14rem;
+}
+.weui-picker-modal .picker-items {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ justify-content: center;
+ width: 100%;
+ padding: 0;
+ text-align: right;
+ font-size: 1rem;
+ font-weight: normal;
+ -webkit-mask-box-image: -webkit-linear-gradient(bottom, transparent, transparent 5%, white 20%, white 80%, transparent 95%, transparent);
+ -webkit-mask-box-image: linear-gradient(to top, transparent, transparent 5%, white 20%, white 80%, transparent 95%, transparent);
+}
+.weui-picker-modal .bar + .picker-items {
+ height: 10.8rem;
+}
+.weui-picker-modal .picker-items-col {
+ overflow: hidden;
+ position: relative;
+ max-height: 100%;
+}
+.weui-picker-modal .picker-items-col.picker-items-col-left {
+ text-align: left;
+}
+.weui-picker-modal .picker-items-col.picker-items-col-center {
+ text-align: center;
+}
+.weui-picker-modal .picker-items-col.picker-items-col-right {
+ text-align: right;
+}
+.weui-picker-modal .picker-items-col.picker-items-col-divider {
+ color: #3d4145;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+}
+.weui-picker-modal .picker-items-col-wrapper {
+ -webkit-transition: 300ms;
+ transition: 300ms;
+ -webkit-transition-timing-function: ease-out;
+ transition-timing-function: ease-out;
+}
+.weui-picker-modal .picker-item {
+ height: 32px;
+ line-height: 32px;
+ padding: 0 10px;
+ white-space: nowrap;
+ position: relative;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: #9b9b9b;
+ left: 0;
+ top: 0;
+ width: 100%;
+ box-sizing: border-box;
+ -webkit-transition: 300ms;
+ transition: 300ms;
+}
+.picker-items-col-absolute .weui-picker-modal .picker-item {
+ position: absolute;
+}
+.weui-picker-modal .picker-item.picker-item-far {
+ pointer-events: none;
+}
+.weui-picker-modal .picker-item.picker-selected {
+ color: #3d4145;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ -webkit-transform: rotateX(0deg);
+ transform: rotateX(0deg);
+}
+.weui-picker-modal .picker-center-highlight {
+ height: 32px;
+ box-sizing: border-box;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ top: 50%;
+ margin-top: -16px;
+ pointer-events: none;
+}
+.weui-picker-modal .picker-center-highlight:before {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: auto;
+ right: auto;
+ height: 1px;
+ width: 100%;
+ background-color: #D9D9D9;
+ display: block;
+ z-index: 15;
+ -webkit-transform-origin: 50% 0%;
+ transform-origin: 50% 0%;
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 2) {
+ .weui-picker-modal .picker-center-highlight:before {
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+ }
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 3) {
+ .weui-picker-modal .picker-center-highlight:before {
+ -webkit-transform: scaleY(0.33);
+ transform: scaleY(0.33);
+ }
+}
+.weui-picker-modal .picker-center-highlight:after {
+ content: '';
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ right: auto;
+ top: auto;
+ height: 1px;
+ width: 100%;
+ background-color: #D9D9D9;
+ display: block;
+ z-index: 15;
+ -webkit-transform-origin: 50% 100%;
+ transform-origin: 50% 100%;
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 2) {
+ .weui-picker-modal .picker-center-highlight:after {
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+ }
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 3) {
+ .weui-picker-modal .picker-center-highlight:after {
+ -webkit-transform: scaleY(0.33);
+ transform: scaleY(0.33);
+ }
+}
+.weui-picker-modal .picker-3d .picker-items {
+ overflow: hidden;
+ -webkit-perspective: 1200px;
+ perspective: 1200px;
+}
+.weui-picker-modal .picker-3d .picker-items-col,
+.weui-picker-modal .picker-3d .picker-items-col-wrapper,
+.weui-picker-modal .picker-3d .picker-item {
+ -webkit-transform-style: preserve-3d;
+ transform-style: preserve-3d;
+}
+.weui-picker-modal .picker-3d .picker-items-col {
+ overflow: visible;
+}
+.weui-picker-modal .picker-3d .picker-item {
+ -webkit-transform-origin: center center -110px;
+ transform-origin: center center -110px;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-transition-timing-function: ease-out;
+ transition-timing-function: ease-out;
+}
+.weui-picker-overlay,
+.weui-picker-container {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 0;
+ width: 100%;
+ z-index: 1000;
+}
+.city-picker .picker-items-col {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ max-width: 7rem;
+}
+.weui-picker-container .weui-cells {
+ margin: 0;
+ text-align: left;
+}
+.datetime-picker .picker-item {
+ text-overflow: initial;
+}
+.weui-select-modal {
+ height: auto;
+}
+.weui-select-modal .weui-cells {
+ margin: 0;
+ text-align: left;
+ overflow-y: auto;
+ overflow-x: hidden;
+ max-height: 16rem;
+}
+.weui-select-modal .weui-cells:after {
+ display: none;
+}
+/* === Calendar === */
+.weui-picker-calendar {
+ background: #fff;
+ height: 15rem;
+ width: 100%;
+ overflow: hidden;
+}
+.weui-picker-calendar .picker-modal-inner {
+ overflow: hidden;
+ height: 12.8rem;
+}
+.picker-calendar-week-days {
+ height: .9rem;
+ background: #f7f7f8;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ font-size: 11px;
+ box-sizing: border-box;
+ position: relative;
+}
+.picker-calendar-week-days:after {
+ content: '';
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ right: auto;
+ top: auto;
+ height: 1px;
+ width: 100%;
+ background-color: #c4c4c4;
+ display: block;
+ z-index: 15;
+ -webkit-transform-origin: 50% 100%;
+ transform-origin: 50% 100%;
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 2) {
+ .picker-calendar-week-days:after {
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+ }
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 3) {
+ .picker-calendar-week-days:after {
+ -webkit-transform: scaleY(0.33);
+ transform: scaleY(0.33);
+ }
+}
+.picker-calendar-week-days .picker-calendar-week-day {
+ -webkit-flex-shrink: 1;
+ -ms-flex: 0 1 auto;
+ -webkit-flex-shrink: 1;
+ -ms-flex-negative: 1;
+ flex-shrink: 1;
+ width: 14.28571429%;
+ width: calc(100% / 7);
+ line-height: 17px;
+ text-align: center;
+}
+.picker-calendar-week-days + .picker-calendar-months {
+ height: 11.9rem;
+}
+.picker-calendar-months {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ position: relative;
+}
+.picker-calendar-months-wrapper {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ -webkit-transition: 300ms;
+ transition: 300ms;
+}
+.picker-calendar-month {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -ms-flex-direction: column;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ left: 0;
+ top: 0;
+}
+.picker-calendar-row {
+ height: 16.66666667%;
+ height: calc(100% / 6);
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-flex-shrink: 1;
+ -ms-flex: 0 1 auto;
+ -webkit-flex-shrink: 1;
+ -ms-flex-negative: 1;
+ flex-shrink: 1;
+ width: 100%;
+ position: relative;
+}
+.picker-calendar-row:after {
+ content: '';
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ right: auto;
+ top: auto;
+ height: 1px;
+ width: 100%;
+ background-color: #ccc;
+ display: block;
+ z-index: 15;
+ -webkit-transform-origin: 50% 100%;
+ transform-origin: 50% 100%;
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 2) {
+ .picker-calendar-row:after {
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+ }
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 3) {
+ .picker-calendar-row:after {
+ -webkit-transform: scaleY(0.33);
+ transform: scaleY(0.33);
+ }
+}
+.weui-picker-modal .picker-calendar-row:last-child:after {
+ display: none;
+}
+.picker-calendar-day {
+ -webkit-flex-shrink: 1;
+ -ms-flex: 0 1 auto;
+ -webkit-flex-shrink: 1;
+ -ms-flex-negative: 1;
+ flex-shrink: 1;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ -webkit-justify-content: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+ box-sizing: border-box;
+ width: 14.28571429%;
+ width: calc(100% / 7);
+ text-align: center;
+ color: #3d4145;
+ font-size: 15px;
+ cursor: pointer;
+}
+.picker-calendar-day.picker-calendar-day-prev,
+.picker-calendar-day.picker-calendar-day-next {
+ color: #ccc;
+}
+.picker-calendar-day.picker-calendar-day-disabled {
+ color: #d4d4d4;
+ cursor: auto;
+}
+.picker-calendar-day.picker-calendar-day-today span {
+ background: #e3e3e3;
+}
+.picker-calendar-day.picker-calendar-day-selected span {
+ background: #04BE02;
+ color: #fff;
+}
+.picker-calendar-day span {
+ display: inline-block;
+ border-radius: 100%;
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+}
+.picker-calendar-month-picker,
+.picker-calendar-year-picker {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ -webkit-align-items: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ -ms-flex-pack: justify;
+ -webkit-justify-content: space-between;
+ justify-content: space-between;
+ width: 50%;
+ max-width: 200px;
+ -webkit-flex-shrink: 10;
+ -ms-flex: 0 10 auto;
+ -webkit-flex-shrink: 10;
+ -ms-flex-negative: 10;
+ flex-shrink: 10;
+}
+.picker-calendar-month-picker a.icon-only,
+.picker-calendar-year-picker a.icon-only {
+ min-width: 36px;
+}
+.picker-calendar-month-picker span,
+.picker-calendar-year-picker span {
+ -webkit-flex-shrink: 1;
+ -ms-flex: 0 1 auto;
+ -webkit-flex-shrink: 1;
+ -ms-flex-negative: 1;
+ flex-shrink: 1;
+ position: relative;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.popover .picker-calendar .picker-calendar-week-days,
+.picker-calendar.picker-modal-inline .picker-calendar-week-days {
+ background: none;
+}
+.popover .picker-calendar .toolbar:before,
+.picker-calendar.picker-modal-inline .toolbar:before,
+.popover .picker-calendar .picker-calendar-week-days:before,
+.picker-calendar.picker-modal-inline .picker-calendar-week-days:before {
+ display: none;
+}
+.popover .picker-calendar .toolbar:after,
+.picker-calendar.picker-modal-inline .toolbar:after,
+.popover .picker-calendar .picker-calendar-week-days:after,
+.picker-calendar.picker-modal-inline .picker-calendar-week-days:after {
+ display: none;
+}
+.popover .picker-calendar .toolbar ~ .picker-modal-inner .picker-calendar-months:before,
+.picker-calendar.picker-modal-inline .toolbar ~ .picker-modal-inner .picker-calendar-months:before,
+.popover .picker-calendar .picker-calendar-week-days ~ .picker-calendar-months:before,
+.picker-calendar.picker-modal-inline .picker-calendar-week-days ~ .picker-calendar-months:before {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: auto;
+ right: auto;
+ height: 1px;
+ width: 100%;
+ background-color: #c4c4c4;
+ display: block;
+ z-index: 15;
+ -webkit-transform-origin: 50% 0%;
+ transform-origin: 50% 0%;
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 2) {
+ .popover .picker-calendar .toolbar ~ .picker-modal-inner .picker-calendar-months:before,
+ .picker-calendar.picker-modal-inline .toolbar ~ .picker-modal-inner .picker-calendar-months:before,
+ .popover .picker-calendar .picker-calendar-week-days ~ .picker-calendar-months:before,
+ .picker-calendar.picker-modal-inline .picker-calendar-week-days ~ .picker-calendar-months:before {
+ -webkit-transform: scaleY(0.5);
+ transform: scaleY(0.5);
+ }
+}
+@media only screen and (-webkit-min-device-pixel-ratio: 3) {
+ .popover .picker-calendar .toolbar ~ .picker-modal-inner .picker-calendar-months:before,
+ .picker-calendar.picker-modal-inline .toolbar ~ .picker-modal-inner .picker-calendar-months:before,
+ .popover .picker-calendar .picker-calendar-week-days ~ .picker-calendar-months:before,
+ .picker-calendar.picker-modal-inline .picker-calendar-week-days ~ .picker-calendar-months:before {
+ -webkit-transform: scaleY(0.33);
+ transform: scaleY(0.33);
+ }
+}
+.picker-calendar-month-picker,
+.picker-calendar-year-picker {
+ display: block;
+ line-height: 2.2rem;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+}
+.picker-calendar-month-picker a.icon-only,
+.picker-calendar-year-picker a.icon-only {
+ float: left;
+ width: 25%;
+ height: 2.2rem;
+ line-height: 2rem;
+}
+.picker-calendar-month-picker .current-month-value,
+.picker-calendar-year-picker .current-month-value,
+.picker-calendar-month-picker .current-year-value,
+.picker-calendar-year-picker .current-year-value {
+ float: left;
+ width: 50%;
+ height: 2.2rem;
+}
+i.icon {
+ display: inline-block;
+ vertical-align: middle;
+ background-size: 100% auto;
+ background-position: center;
+ background-repeat: no-repeat;
+ font-style: normal;
+ position: relative;
+}
+i.icon.icon-next,
+i.icon.icon-prev {
+ width: 0.75rem;
+ height: 0.75rem;
+}
+i.icon.icon-next {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2015%2015'%3E%3Cg%3E%3Cpath%20fill%3D'%2304BE02'%20d%3D'M1%2C1.6l11.8%2C5.8L1%2C13.4V1.6%20M0%2C0v15l15-7.6L0%2C0L0%2C0z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
+}
+i.icon.icon-prev {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2015%2015'%3E%3Cg%3E%3Cpath%20fill%3D'%2304BE02'%20d%3D'M14%2C1.6v11.8L2.2%2C7.6L14%2C1.6%20M15%2C0L0%2C7.6L15%2C15V0L15%2C0z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
+}
+/**
+ * Swiper 3.3.1
+ * Most modern mobile touch slider and framework with hardware accelerated transitions
+ *
+ * http://www.idangero.us/swiper/
+ *
+ * Copyright 2016, Vladimir Kharlampidi
+ * The iDangero.us
+ * http://www.idangero.us/
+ *
+ * Licensed under MIT
+ *
+ * Released on: February 7, 2016
+ */
+.swiper-container {
+ margin: 0 auto;
+ position: relative;
+ overflow: hidden;
+ /* Fix of Webkit flickering */
+ z-index: 1;
+}
+.swiper-container-no-flexbox .swiper-slide {
+ float: left;
+}
+.swiper-container-vertical > .swiper-wrapper {
+ -webkit-box-orient: vertical;
+ -ms-flex-direction: column;
+ -webkit-flex-direction: column;
+ flex-direction: column;
+}
+.swiper-wrapper {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ z-index: 1;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-transition-property: -webkit-transform;
+ transition-property: -webkit-transform;
+ transition-property: transform;
+ transition-property: transform, -webkit-transform;
+ box-sizing: content-box;
+}
+.swiper-container-android .swiper-slide,
+.swiper-wrapper {
+ -webkit-transform: translate3d(0px, 0, 0);
+ transform: translate3d(0px, 0, 0);
+}
+.swiper-container-multirow > .swiper-wrapper {
+ -webkit-box-lines: multiple;
+ -moz-box-lines: multiple;
+ -ms-flex-wrap: wrap;
+ -webkit-flex-wrap: wrap;
+ flex-wrap: wrap;
+}
+.swiper-container-free-mode > .swiper-wrapper {
+ -webkit-transition-timing-function: ease-out;
+ transition-timing-function: ease-out;
+ margin: 0 auto;
+}
+.swiper-slide {
+ -webkit-flex-shrink: 0;
+ -ms-flex: 0 0 auto;
+ -webkit-flex-shrink: 0;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ width: 100%;
+ height: 100%;
+ position: relative;
+}
+/* Auto Height */
+.swiper-container-autoheight,
+.swiper-container-autoheight .swiper-slide {
+ height: auto;
+}
+.swiper-container-autoheight .swiper-wrapper {
+ -webkit-box-align: start;
+ -ms-flex-align: start;
+ -webkit-align-items: flex-start;
+ align-items: flex-start;
+ -webkit-transition-property: -webkit-transform, height;
+ -webkit-transition-property: height, -webkit-transform;
+ transition-property: height, -webkit-transform;
+ transition-property: transform, height;
+ transition-property: transform, height, -webkit-transform;
+}
+/* a11y */
+.swiper-container .swiper-notification {
+ position: absolute;
+ left: 0;
+ top: 0;
+ pointer-events: none;
+ opacity: 0;
+ z-index: -1000;
+}
+/* IE10 Windows Phone 8 Fixes */
+.swiper-wp8-horizontal {
+ -ms-touch-action: pan-y;
+ touch-action: pan-y;
+}
+.swiper-wp8-vertical {
+ -ms-touch-action: pan-x;
+ touch-action: pan-x;
+}
+/* Arrows */
+.swiper-button-prev,
+.swiper-button-next {
+ position: absolute;
+ top: 50%;
+ width: 27px;
+ height: 44px;
+ margin-top: -22px;
+ z-index: 10;
+ cursor: pointer;
+ background-size: 27px 44px;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+.swiper-button-prev.swiper-button-disabled,
+.swiper-button-next.swiper-button-disabled {
+ opacity: 0.35;
+ cursor: auto;
+ pointer-events: none;
+}
+.swiper-button-prev,
+.swiper-container-rtl .swiper-button-next {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
+ left: 10px;
+ right: auto;
+}
+.swiper-button-prev.swiper-button-black,
+.swiper-container-rtl .swiper-button-next.swiper-button-black {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E");
+}
+.swiper-button-prev.swiper-button-white,
+.swiper-container-rtl .swiper-button-next.swiper-button-white {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E");
+}
+.swiper-button-next,
+.swiper-container-rtl .swiper-button-prev {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
+ right: 10px;
+ left: auto;
+}
+.swiper-button-next.swiper-button-black,
+.swiper-container-rtl .swiper-button-prev.swiper-button-black {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E");
+}
+.swiper-button-next.swiper-button-white,
+.swiper-container-rtl .swiper-button-prev.swiper-button-white {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E");
+}
+/* Pagination Styles */
+.swiper-pagination {
+ position: absolute;
+ text-align: center;
+ -webkit-transition: 300ms;
+ transition: 300ms;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ z-index: 10;
+}
+.swiper-pagination.swiper-pagination-hidden {
+ opacity: 0;
+}
+/* Common Styles */
+.swiper-pagination-fraction,
+.swiper-pagination-custom,
+.swiper-container-horizontal > .swiper-pagination-bullets {
+ bottom: 10px;
+ left: 0;
+ width: 100%;
+}
+/* Bullets */
+.swiper-pagination-bullet {
+ width: 8px;
+ height: 8px;
+ display: inline-block;
+ border-radius: 100%;
+ background: #000;
+ opacity: 0.2;
+}
+button.swiper-pagination-bullet {
+ border: none;
+ margin: 0;
+ padding: 0;
+ box-shadow: none;
+ -moz-appearance: none;
+ -ms-appearance: none;
+ -webkit-appearance: none;
+ appearance: none;
+}
+.swiper-pagination-clickable .swiper-pagination-bullet {
+ cursor: pointer;
+}
+.swiper-pagination-white .swiper-pagination-bullet {
+ background: #fff;
+}
+.swiper-pagination-bullet-active {
+ opacity: 1;
+ background: #04BE02;
+}
+.swiper-pagination-white .swiper-pagination-bullet-active {
+ background: #fff;
+}
+.swiper-pagination-black .swiper-pagination-bullet-active {
+ background: #000;
+}
+.swiper-container-vertical > .swiper-pagination-bullets {
+ right: 10px;
+ top: 50%;
+ -webkit-transform: translate3d(0px, -50%, 0);
+ transform: translate3d(0px, -50%, 0);
+}
+.swiper-container-vertical > .swiper-pagination-bullets .swiper-pagination-bullet {
+ margin: 5px 0;
+ display: block;
+}
+.swiper-container-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet {
+ margin: 0 5px;
+}
+/* Progress */
+.swiper-pagination-progress {
+ background: rgba(0, 0, 0, 0.25);
+ position: absolute;
+}
+.swiper-pagination-progress .swiper-pagination-progressbar {
+ background: #007aff;
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ -webkit-transform-origin: left top;
+ transform-origin: left top;
+}
+.swiper-container-rtl .swiper-pagination-progress .swiper-pagination-progressbar {
+ -webkit-transform-origin: right top;
+ transform-origin: right top;
+}
+.swiper-container-horizontal > .swiper-pagination-progress {
+ width: 100%;
+ height: 4px;
+ left: 0;
+ top: 0;
+}
+.swiper-container-vertical > .swiper-pagination-progress {
+ width: 4px;
+ height: 100%;
+ left: 0;
+ top: 0;
+}
+.swiper-pagination-progress.swiper-pagination-white {
+ background: rgba(255, 255, 255, 0.5);
+}
+.swiper-pagination-progress.swiper-pagination-white .swiper-pagination-progressbar {
+ background: #fff;
+}
+.swiper-pagination-progress.swiper-pagination-black .swiper-pagination-progressbar {
+ background: #000;
+}
+/* 3D Container */
+.swiper-container-3d {
+ -webkit-perspective: 1200px;
+ -o-perspective: 1200px;
+ perspective: 1200px;
+}
+.swiper-container-3d .swiper-wrapper,
+.swiper-container-3d .swiper-slide,
+.swiper-container-3d .swiper-slide-shadow-left,
+.swiper-container-3d .swiper-slide-shadow-right,
+.swiper-container-3d .swiper-slide-shadow-top,
+.swiper-container-3d .swiper-slide-shadow-bottom,
+.swiper-container-3d .swiper-cube-shadow {
+ -webkit-transform-style: preserve-3d;
+ transform-style: preserve-3d;
+}
+.swiper-container-3d .swiper-slide-shadow-left,
+.swiper-container-3d .swiper-slide-shadow-right,
+.swiper-container-3d .swiper-slide-shadow-top,
+.swiper-container-3d .swiper-slide-shadow-bottom {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ z-index: 10;
+}
+.swiper-container-3d .swiper-slide-shadow-left {
+ background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
+ /* Safari 4+, Chrome */
+ background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
+ /* Chrome 10+, Safari 5.1+, iOS 5+ */
+ /* Firefox 3.6-15 */
+ /* Opera 11.10-12.00 */
+ background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
+ /* Firefox 16+, IE10, Opera 12.50+ */
+}
+.swiper-container-3d .swiper-slide-shadow-right {
+ background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
+ /* Safari 4+, Chrome */
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
+ /* Chrome 10+, Safari 5.1+, iOS 5+ */
+ /* Firefox 3.6-15 */
+ /* Opera 11.10-12.00 */
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
+ /* Firefox 16+, IE10, Opera 12.50+ */
+}
+.swiper-container-3d .swiper-slide-shadow-top {
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
+ /* Safari 4+, Chrome */
+ background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
+ /* Chrome 10+, Safari 5.1+, iOS 5+ */
+ /* Firefox 3.6-15 */
+ /* Opera 11.10-12.00 */
+ background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
+ /* Firefox 16+, IE10, Opera 12.50+ */
+}
+.swiper-container-3d .swiper-slide-shadow-bottom {
+ background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));
+ /* Safari 4+, Chrome */
+ background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
+ /* Chrome 10+, Safari 5.1+, iOS 5+ */
+ /* Firefox 3.6-15 */
+ /* Opera 11.10-12.00 */
+ background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));
+ /* Firefox 16+, IE10, Opera 12.50+ */
+}
+/* Coverflow */
+.swiper-container-coverflow .swiper-wrapper,
+.swiper-container-flip .swiper-wrapper {
+ /* Windows 8 IE 10 fix */
+ -ms-perspective: 1200px;
+}
+/* Cube + Flip */
+.swiper-container-cube,
+.swiper-container-flip {
+ overflow: visible;
+}
+.swiper-container-cube .swiper-slide,
+.swiper-container-flip .swiper-slide {
+ pointer-events: none;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ z-index: 1;
+}
+.swiper-container-cube .swiper-slide .swiper-slide,
+.swiper-container-flip .swiper-slide .swiper-slide {
+ pointer-events: none;
+}
+.swiper-container-cube .swiper-slide-active,
+.swiper-container-flip .swiper-slide-active,
+.swiper-container-cube .swiper-slide-active .swiper-slide-active,
+.swiper-container-flip .swiper-slide-active .swiper-slide-active {
+ pointer-events: auto;
+}
+.swiper-container-cube .swiper-slide-shadow-top,
+.swiper-container-flip .swiper-slide-shadow-top,
+.swiper-container-cube .swiper-slide-shadow-bottom,
+.swiper-container-flip .swiper-slide-shadow-bottom,
+.swiper-container-cube .swiper-slide-shadow-left,
+.swiper-container-flip .swiper-slide-shadow-left,
+.swiper-container-cube .swiper-slide-shadow-right,
+.swiper-container-flip .swiper-slide-shadow-right {
+ z-index: 0;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+/* Cube */
+.swiper-container-cube .swiper-slide {
+ visibility: hidden;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ width: 100%;
+ height: 100%;
+}
+.swiper-container-cube.swiper-container-rtl .swiper-slide {
+ -webkit-transform-origin: 100% 0;
+ transform-origin: 100% 0;
+}
+.swiper-container-cube .swiper-slide-active,
+.swiper-container-cube .swiper-slide-next,
+.swiper-container-cube .swiper-slide-prev,
+.swiper-container-cube .swiper-slide-next + .swiper-slide {
+ pointer-events: auto;
+ visibility: visible;
+}
+.swiper-container-cube .swiper-cube-shadow {
+ position: absolute;
+ left: 0;
+ bottom: 0px;
+ width: 100%;
+ height: 100%;
+ background: #000;
+ opacity: 0.6;
+ -webkit-filter: blur(50px);
+ filter: blur(50px);
+ z-index: 0;
+}
+/* Fade */
+.swiper-container-fade.swiper-container-free-mode .swiper-slide {
+ -webkit-transition-timing-function: ease-out;
+ transition-timing-function: ease-out;
+}
+.swiper-container-fade .swiper-slide {
+ pointer-events: none;
+ -webkit-transition-property: opacity;
+ transition-property: opacity;
+}
+.swiper-container-fade .swiper-slide .swiper-slide {
+ pointer-events: none;
+}
+.swiper-container-fade .swiper-slide-active,
+.swiper-container-fade .swiper-slide-active .swiper-slide-active {
+ pointer-events: auto;
+}
+/* Scrollbar */
+.swiper-scrollbar {
+ border-radius: 10px;
+ position: relative;
+ -ms-touch-action: none;
+ background: rgba(0, 0, 0, 0.1);
+}
+.swiper-container-horizontal > .swiper-scrollbar {
+ position: absolute;
+ left: 1%;
+ bottom: 3px;
+ z-index: 50;
+ height: 5px;
+ width: 98%;
+}
+.swiper-container-vertical > .swiper-scrollbar {
+ position: absolute;
+ right: 3px;
+ top: 1%;
+ z-index: 50;
+ width: 5px;
+ height: 98%;
+}
+.swiper-scrollbar-drag {
+ height: 100%;
+ width: 100%;
+ position: relative;
+ background: rgba(0, 0, 0, 0.5);
+ border-radius: 10px;
+ left: 0;
+ top: 0;
+}
+.swiper-scrollbar-cursor-drag {
+ cursor: move;
+}
+/* Preloader */
+.swiper-lazy-preloader {
+ width: 42px;
+ height: 42px;
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin-left: -21px;
+ margin-top: -21px;
+ z-index: 10;
+ -webkit-transform-origin: 50%;
+ transform-origin: 50%;
+ -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite;
+ animation: swiper-preloader-spin 1s steps(12, end) infinite;
+}
+.swiper-lazy-preloader:after {
+ display: block;
+ content: "";
+ width: 100%;
+ height: 100%;
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
+ background-position: 50%;
+ background-size: 100%;
+ background-repeat: no-repeat;
+}
+.swiper-lazy-preloader-white:after {
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
+}
+@-webkit-keyframes swiper-preloader-spin {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ }
+}
+@keyframes swiper-preloader-spin {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+}
+.weui-actionsheet {
+ z-index: 10000;
+}
+.weui-popup__overlay,
+.weui-popup__container {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 10;
+}
+.weui-popup__overlay {
+ background-color: rgba(0, 0, 0, 0.6);
+ opacity: 0;
+ -webkit-transition: opacity .3s;
+ transition: opacity .3s;
+}
+.weui-popup__container {
+ display: none;
+}
+.weui-popup__container.weui-popup__container--visible {
+ display: block;
+}
+.weui-popup__container .weui-cells {
+ margin: 0;
+ text-align: left;
+}
+.weui-popup__modal {
+ width: 100%;
+ position: absolute;
+ z-index: 100;
+ bottom: 0;
+ border-radius: 0;
+ opacity: 0.6;
+ color: #3d4145;
+ -webkit-transition-duration: .3s;
+ transition-duration: .3s;
+ height: 100%;
+ background: #EFEFF4;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ -webkit-transition-property: opacity, -webkit-transform;
+ transition-property: opacity, -webkit-transform;
+ transition-property: transform, opacity;
+ transition-property: transform, opacity, -webkit-transform;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+.popup-bottom .weui-popup__modal {
+ height: auto;
+}
+.weui-popup__modal .toolbar {
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ z-index: 1;
+}
+.weui-popup__modal .modal-content {
+ height: 100%;
+ padding-top: 2.2rem;
+ overflow: auto;
+ box-sizing: border-box;
+}
+.weui-popup__container--visible .weui-popup__overlay {
+ opacity: 1;
+}
+.weui-popup__container--visible .weui-popup__modal {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+.weui-notification {
+ position: fixed;
+ width: 100%;
+ min-height: 3.4rem;
+ top: -2rem;
+ padding-top: 2rem;
+ left: 0;
+ right: 0;
+ z-index: 9999;
+ background-color: rgba(0, 0, 0, 0.85);
+ color: white;
+ font-size: .65rem;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ -webkit-transition: .4s;
+ transition: .4s;
+}
+.weui-notification.weui-notification--in {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+.weui-notification.weui-notification--touching {
+ -webkit-transition-duration: 0s;
+ transition-duration: 0s;
+}
+.weui-notification .weui-notification__inner {
+ padding: .4rem .6rem 1rem .6rem;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: -webkit-flex;
+ display: flex;
+ -webkit-box-align: start;
+ -ms-flex-align: start;
+ -webkit-align-items: flex-start;
+ align-items: flex-start;
+}
+.weui-notification .weui-notification__content {
+ width: 100%;
+ margin: 0rem .4rem;
+}
+.weui-notification .weui-notification__title {
+ font-weight: bold;
+}
+.weui-notification .weui-notification__text {
+ line-height: 1;
+}
+.weui-notification .weui-notification__media {
+ height: 1rem;
+ width: 1rem;
+}
+.weui-notification .weui-notification__media img {
+ width: 100%;
+}
+.weui-notification .weui-notification__handle-bar {
+ position: absolute;
+ bottom: .2rem;
+ left: 50%;
+ -webkit-transform: translate3d(-50%, 0, 0);
+ transform: translate3d(-50%, 0, 0);
+ width: 2rem;
+ height: .3rem;
+ border-radius: .15rem;
+ background: white;
+ opacity: .5;
+}
+.weui-photo-browser-modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: black;
+ display: none;
+ opacity: 0;
+ -webkit-transition: opacity .3s;
+ transition: opacity .3s;
+}
+.weui-photo-browser-modal.weui-photo-browser-modal-visible {
+ opacity: 1;
+}
+.weui-photo-browser-modal .swiper-container {
+ height: 100%;
+ -webkit-transform: scale(0.2);
+ transform: scale(0.2);
+ -webkit-transition: -webkit-transform .5s;
+ transition: -webkit-transform .5s;
+ transition: transform .5s;
+ transition: transform .5s, -webkit-transform .5s;
+}
+.weui-photo-browser-modal .swiper-container .swiper-pagination-bullet {
+ background: white;
+ visibility: hidden;
+}
+.weui-photo-browser-modal .swiper-container.swiper-container-visible {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+}
+.weui-photo-browser-modal .swiper-container.swiper-container-visible .swiper-pagination-bullet {
+ visibility: visible;
+ -webkit-transition-property: visibility;
+ transition-property: visibility;
+ -webkit-transition-delay: .5s;
+ transition-delay: .5s;
+}
+.weui-photo-browser-modal .swiper-container .swiper-pagination {
+ bottom: 10px;
+ left: 0;
+ width: 100%;
+}
+.weui-photo-browser-modal .photo-container {
+ height: 100%;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ overflow: hidden;
+}
+.weui-photo-browser-modal .photo-container img {
+ max-width: 100%;
+ margin-top: -30px;
+}
+.weui-photo-browser-modal .caption {
+ position: absolute;
+ bottom: 40px;
+ left: 0;
+ right: 0;
+ color: white;
+ text-align: center;
+ padding: 0 12px;
+ min-height: 3rem;
+ font-size: 14px;
+ z-index: 10;
+ -webkit-transition: opacity .3s;
+ transition: opacity .3s;
+ -webkit-transition-delay: .5s;
+ transition-delay: .5s;
+ opacity: 0;
+}
+.weui-photo-browser-modal .caption .caption-item {
+ display: none;
+ opacity: 0;
+ -webkit-transition: opacity .15s;
+ transition: opacity .15s;
+}
+.weui-photo-browser-modal .caption .caption-item.active {
+ display: block;
+ opacity: 1;
+}
+.weui-photo-browser-modal .swiper-container-visible .caption {
+ opacity: 1;
+}
+.color-primary {
+ color: #04BE02;
+}
+.color-danger,
+.color-error {
+ color: #f6383a;
+}
+.color-warning {
+ color: #f60;
+}
+.color-success {
+ color: #4cd964;
+}
+.bg-primary,
+.bg-success,
+.bg-danger,
+.bg-error,
+.bg-warning {
+ color: white;
+}
+.bg-primary {
+ background-color: #04BE02;
+}
+.bg-danger,
+.bg-error {
+ background-color: #f6383a;
+}
+.bg-warning {
+ background-color: #f60;
+}
+.bg-success {
+ background-color: #4cd964;
+}
+.weui-toptips {
+ z-index: 100;
+ opacity: 0;
+ -webkit-transition: opacity .3s;
+ transition: opacity .3s;
+}
+.weui-toptips.weui-toptips_visible {
+ opacity: 1;
+}
+.weui-icon_toast {
+ font-size: 55px;
+ color: white;
+ margin-bottom: 6px;
+}
+.weui-toast--forbidden .weui-icon_toast {
+ color: #f6383a;
+}
+.weui-toast--text {
+ min-height: initial;
+ font-size: 18px;
+ padding: 8px 16px;
+ width: auto;
+ top: 40%;
+}
+.weui-toast--text .weui-icon_toast {
+ display: none;
+}
+.weui-count {
+ display: inline-block;
+ height: 25px;
+ line-height: 25px;
+}
+.weui-count .weui-count__btn {
+ height: 21px;
+ width: 21px;
+ line-height: 21px;
+ display: inline-block;
+ position: relative;
+ border: 1px solid #04BE02;
+ border-radius: 50%;
+ vertical-align: -6px;
+}
+.weui-count .weui-count__btn:after,
+.weui-count .weui-count__btn:before {
+ content: " ";
+ position: absolute;
+ height: 1px;
+ width: 11px;
+ background-color: #04BE02;
+ left: 50%;
+ top: 50%;
+ margin-left: -5.5px;
+}
+.weui-count .weui-count__btn:after {
+ height: 11px;
+ width: 1px;
+ margin-top: -5.5px;
+ margin-left: -1px;
+}
+.weui-count .weui-count__decrease:after {
+ display: none;
+}
+.weui-count .weui-count__increase {
+ background-color: #04BE02;
+}
+.weui-count .weui-count__increase:after,
+.weui-count .weui-count__increase:before {
+ background-color: white;
+}
+.weui-count .weui-count__number {
+ background-color: transparent;
+ font-size: .8rem;
+ border: 0;
+ width: 1.3rem;
+ text-align: center;
+ color: #5f646e;
+}
+.weui-panel .weui-media-box__title-after {
+ color: #9b9b9b;
+ font-size: .65rem;
+ float: right;
+}
diff --git a/oauth/src/main/resources/static/css/jquery-weui.min.css b/oauth/src/main/resources/static/css/jquery-weui.min.css
new file mode 100755
index 0000000..145c336
--- /dev/null
+++ b/oauth/src/main/resources/static/css/jquery-weui.min.css
@@ -0,0 +1,6 @@
+/**
+* jQuery WeUI V1.2.1
+* By 言川
+* http://lihongxun945.github.io/jquery-weui/
+ */
+.preloader{width:20px;height:20px;-webkit-transform-origin:50%;transform-origin:50%;-webkit-animation:preloader-spin 1s steps(12,end) infinite;animation:preloader-spin 1s steps(12,end) infinite}.preloader:after{display:block;width:100%;height:100%;content:"";background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%}@-webkit-keyframes preloader-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}label>*{pointer-events:none}html{font-size:20px}body{font-size:16px}@media only screen and (min-width:400px){html{font-size:21.33px!important}}@media only screen and (min-width:414px){html{font-size:22.08px!important}}@media only screen and (min-width:480px){html{font-size:25.6px!important}}.weui_navbar{z-index:10}.weui-mask,.weui-popup-container,.weui-popup-overlay{z-index:1000}.weui-row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.weui-row>[class*=col-]{box-sizing:border-box}.weui-row .col-auto{width:100%}.weui-row .weui-col-100{width:100%;width:calc((100% - 15px*0)/ 1)}.weui-row.weui-no-gutter .weui-col-100{width:100%}.weui-row .weui-col-95{width:95%;width:calc((100% - 15px*.05263157894736836)/ 1.0526315789473684)}.weui-row.weui-no-gutter .weui-col-95{width:95%}.weui-row .weui-col-90{width:90%;width:calc((100% - 15px*.11111111111111116)/ 1.1111111111111112)}.weui-row.weui-no-gutter .weui-col-90{width:90%}.weui-row .weui-col-85{width:85%;width:calc((100% - 15px*.17647058823529416)/ 1.1764705882352942)}.weui-row.weui-no-gutter .weui-col-85{width:85%}.weui-row .weui-col-80{width:80%;width:calc((100% - 15px*.25)/ 1.25)}.weui-row.weui-no-gutter .weui-col-80{width:80%}.weui-row .weui-col-75{width:75%;width:calc((100% - 15px*.33333333333333326)/ 1.3333333333333333)}.weui-row.weui-no-gutter .weui-col-75{width:75%}.weui-row .weui-col-66{width:66.66666666666666%;width:calc((100% - 15px*.5000000000000002)/ 1.5000000000000002)}.weui-row.weui-no-gutter .weui-col-66{width:66.66666666666666%}.weui-row .weui-col-60{width:60%;width:calc((100% - 15px*.6666666666666667)/ 1.6666666666666667)}.weui-row.weui-no-gutter .weui-col-60{width:60%}.weui-row .weui-col-50{width:50%;width:calc((100% - 15px*1)/ 2)}.weui-row.weui-no-gutter .weui-col-50{width:50%}.weui-row .weui-col-40{width:40%;width:calc((100% - 15px*1.5)/ 2.5)}.weui-row.weui-no-gutter .weui-col-40{width:40%}.weui-row .weui-col-33{width:33.333333333333336%;width:calc((100% - 15px*2)/ 3)}.weui-row.weui-no-gutter .weui-col-33{width:33.333333333333336%}.weui-row .weui-col-25{width:25%;width:calc((100% - 15px*3)/ 4)}.weui-row.weui-no-gutter .weui-col-25{width:25%}.weui-row .weui-col-20{width:20%;width:calc((100% - 15px*4)/ 5)}.weui-row.weui-no-gutter .weui-col-20{width:20%}.weui-row .weui-col-15{width:15%;width:calc((100% - 15px*5.666666666666667)/ 6.666666666666667)}.weui-row.weui-no-gutter .weui-col-15{width:15%}.weui-row .weui-col-10{width:10%;width:calc((100% - 15px*9)/ 10)}.weui-row.weui-no-gutter .weui-col-10{width:10%}.weui-row .weui-col-5{width:5%;width:calc((100% - 15px*19)/ 20)}.weui-row.weui-no-gutter .weui-col-5{width:5%}.weui-row .weui-col-auto:nth-last-child(1),.weui-row .weui-col-auto:nth-last-child(1)~.weui-col-auto{width:100%;width:calc((100% - 15px*0)/ 1)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(1),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(1)~.weui-col-auto{width:100%}.weui-row .weui-col-auto:nth-last-child(2),.weui-row .weui-col-auto:nth-last-child(2)~.weui-col-auto{width:50%;width:calc((100% - 15px*1)/ 2)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(2),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(2)~.weui-col-auto{width:50%}.weui-row .weui-col-auto:nth-last-child(3),.weui-row .weui-col-auto:nth-last-child(3)~.weui-col-auto{width:33.33333333%;width:calc((100% - 15px*2)/ 3)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(3),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(3)~.weui-col-auto{width:33.33333333%}.weui-row .weui-col-auto:nth-last-child(4),.weui-row .weui-col-auto:nth-last-child(4)~.weui-col-auto{width:25%;width:calc((100% - 15px*3)/ 4)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(4),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(4)~.weui-col-auto{width:25%}.weui-row .weui-col-auto:nth-last-child(5),.weui-row .weui-col-auto:nth-last-child(5)~.weui-col-auto{width:20%;width:calc((100% - 15px*4)/ 5)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(5),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(5)~.weui-col-auto{width:20%}.weui-row .weui-col-auto:nth-last-child(6),.weui-row .weui-col-auto:nth-last-child(6)~.weui-col-auto{width:16.66666667%;width:calc((100% - 15px*5)/ 6)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(6),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(6)~.weui-col-auto{width:16.66666667%}.weui-row .weui-col-auto:nth-last-child(7),.weui-row .weui-col-auto:nth-last-child(7)~.weui-col-auto{width:14.28571429%;width:calc((100% - 15px*6)/ 7)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(7),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(7)~.weui-col-auto{width:14.28571429%}.weui-row .weui-col-auto:nth-last-child(8),.weui-row .weui-col-auto:nth-last-child(8)~.weui-col-auto{width:12.5%;width:calc((100% - 15px*7)/ 8)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(8),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(8)~.weui-col-auto{width:12.5%}.weui-row .weui-col-auto:nth-last-child(9),.weui-row .weui-col-auto:nth-last-child(9)~.weui-col-auto{width:11.11111111%;width:calc((100% - 15px*8)/ 9)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(9),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(9)~.weui-col-auto{width:11.11111111%}.weui-row .weui-col-auto:nth-last-child(10),.weui-row .weui-col-auto:nth-last-child(10)~.weui-col-auto{width:10%;width:calc((100% - 15px*9)/ 10)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(10),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(10)~.weui-col-auto{width:10%}.weui-row .weui-col-auto:nth-last-child(11),.weui-row .weui-col-auto:nth-last-child(11)~.weui-col-auto{width:9.09090909%;width:calc((100% - 15px*10)/ 11)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(11),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(11)~.weui-col-auto{width:9.09090909%}.weui-row .weui-col-auto:nth-last-child(12),.weui-row .weui-col-auto:nth-last-child(12)~.weui-col-auto{width:8.33333333%;width:calc((100% - 15px*11)/ 12)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(12),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(12)~.weui-col-auto{width:8.33333333%}.weui-row .weui-col-auto:nth-last-child(13),.weui-row .weui-col-auto:nth-last-child(13)~.weui-col-auto{width:7.69230769%;width:calc((100% - 15px*12)/ 13)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(13),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(13)~.weui-col-auto{width:7.69230769%}.weui-row .weui-col-auto:nth-last-child(14),.weui-row .weui-col-auto:nth-last-child(14)~.weui-col-auto{width:7.14285714%;width:calc((100% - 15px*13)/ 14)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(14),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(14)~.weui-col-auto{width:7.14285714%}.weui-row .weui-col-auto:nth-last-child(15),.weui-row .weui-col-auto:nth-last-child(15)~.weui-col-auto{width:6.66666667%;width:calc((100% - 15px*14)/ 15)}.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(15),.weui-row.weui-no-gutter .weui-col-auto:nth-last-child(15)~.weui-col-auto{width:6.66666667%}@media all and (min-width:768px){.row .tablet-100{width:100%;width:calc((100% - 15px*0)/ 1)}.row.no-gutter .tablet-100{width:100%}.row .tablet-95{width:95%;width:calc((100% - 15px*.05263157894736836)/ 1.0526315789473684)}.row.no-gutter .tablet-95{width:95%}.row .tablet-90{width:90%;width:calc((100% - 15px*.11111111111111116)/ 1.1111111111111112)}.row.no-gutter .tablet-90{width:90%}.row .tablet-85{width:85%;width:calc((100% - 15px*.17647058823529416)/ 1.1764705882352942)}.row.no-gutter .tablet-85{width:85%}.row .tablet-80{width:80%;width:calc((100% - 15px*.25)/ 1.25)}.row.no-gutter .tablet-80{width:80%}.row .tablet-75{width:75%;width:calc((100% - 15px*.33333333333333326)/ 1.3333333333333333)}.row.no-gutter .tablet-75{width:75%}.row .tablet-66{width:66.66666666666666%;width:calc((100% - 15px*.5000000000000002)/ 1.5000000000000002)}.row.no-gutter .tablet-66{width:66.66666666666666%}.row .tablet-60{width:60%;width:calc((100% - 15px*.6666666666666667)/ 1.6666666666666667)}.row.no-gutter .tablet-60{width:60%}.row .tablet-50{width:50%;width:calc((100% - 15px*1)/ 2)}.row.no-gutter .tablet-50{width:50%}.row .tablet-40{width:40%;width:calc((100% - 15px*1.5)/ 2.5)}.row.no-gutter .tablet-40{width:40%}.row .tablet-33{width:33.333333333333336%;width:calc((100% - 15px*2)/ 3)}.row.no-gutter .tablet-33{width:33.333333333333336%}.row .tablet-25{width:25%;width:calc((100% - 15px*3)/ 4)}.row.no-gutter .tablet-25{width:25%}.row .tablet-20{width:20%;width:calc((100% - 15px*4)/ 5)}.row.no-gutter .tablet-20{width:20%}.row .tablet-15{width:15%;width:calc((100% - 15px*5.666666666666667)/ 6.666666666666667)}.row.no-gutter .tablet-15{width:15%}.row .tablet-10{width:10%;width:calc((100% - 15px*9)/ 10)}.row.no-gutter .tablet-10{width:10%}.row .tablet-5{width:5%;width:calc((100% - 15px*19)/ 20)}.row.no-gutter .tablet-5{width:5%}.row .tablet-auto:nth-last-child(1),.row .tablet-auto:nth-last-child(1)~.col-auto{width:100%;width:calc((100% - 15px*0)/ 1)}.row.no-gutter .tablet-auto:nth-last-child(1),.row.no-gutter .tablet-auto:nth-last-child(1)~.tablet-auto{width:100%}.row .tablet-auto:nth-last-child(2),.row .tablet-auto:nth-last-child(2)~.col-auto{width:50%;width:calc((100% - 15px*1)/ 2)}.row.no-gutter .tablet-auto:nth-last-child(2),.row.no-gutter .tablet-auto:nth-last-child(2)~.tablet-auto{width:50%}.row .tablet-auto:nth-last-child(3),.row .tablet-auto:nth-last-child(3)~.col-auto{width:33.33333333%;width:calc((100% - 15px*2)/ 3)}.row.no-gutter .tablet-auto:nth-last-child(3),.row.no-gutter .tablet-auto:nth-last-child(3)~.tablet-auto{width:33.33333333%}.row .tablet-auto:nth-last-child(4),.row .tablet-auto:nth-last-child(4)~.col-auto{width:25%;width:calc((100% - 15px*3)/ 4)}.row.no-gutter .tablet-auto:nth-last-child(4),.row.no-gutter .tablet-auto:nth-last-child(4)~.tablet-auto{width:25%}.row .tablet-auto:nth-last-child(5),.row .tablet-auto:nth-last-child(5)~.col-auto{width:20%;width:calc((100% - 15px*4)/ 5)}.row.no-gutter .tablet-auto:nth-last-child(5),.row.no-gutter .tablet-auto:nth-last-child(5)~.tablet-auto{width:20%}.row .tablet-auto:nth-last-child(6),.row .tablet-auto:nth-last-child(6)~.col-auto{width:16.66666667%;width:calc((100% - 15px*5)/ 6)}.row.no-gutter .tablet-auto:nth-last-child(6),.row.no-gutter .tablet-auto:nth-last-child(6)~.tablet-auto{width:16.66666667%}.row .tablet-auto:nth-last-child(7),.row .tablet-auto:nth-last-child(7)~.col-auto{width:14.28571429%;width:calc((100% - 15px*6)/ 7)}.row.no-gutter .tablet-auto:nth-last-child(7),.row.no-gutter .tablet-auto:nth-last-child(7)~.tablet-auto{width:14.28571429%}.row .tablet-auto:nth-last-child(8),.row .tablet-auto:nth-last-child(8)~.col-auto{width:12.5%;width:calc((100% - 15px*7)/ 8)}.row.no-gutter .tablet-auto:nth-last-child(8),.row.no-gutter .tablet-auto:nth-last-child(8)~.tablet-auto{width:12.5%}.row .tablet-auto:nth-last-child(9),.row .tablet-auto:nth-last-child(9)~.col-auto{width:11.11111111%;width:calc((100% - 15px*8)/ 9)}.row.no-gutter .tablet-auto:nth-last-child(9),.row.no-gutter .tablet-auto:nth-last-child(9)~.tablet-auto{width:11.11111111%}.row .tablet-auto:nth-last-child(10),.row .tablet-auto:nth-last-child(10)~.col-auto{width:10%;width:calc((100% - 15px*9)/ 10)}.row.no-gutter .tablet-auto:nth-last-child(10),.row.no-gutter .tablet-auto:nth-last-child(10)~.tablet-auto{width:10%}.row .tablet-auto:nth-last-child(11),.row .tablet-auto:nth-last-child(11)~.col-auto{width:9.09090909%;width:calc((100% - 15px*10)/ 11)}.row.no-gutter .tablet-auto:nth-last-child(11),.row.no-gutter .tablet-auto:nth-last-child(11)~.tablet-auto{width:9.09090909%}.row .tablet-auto:nth-last-child(12),.row .tablet-auto:nth-last-child(12)~.col-auto{width:8.33333333%;width:calc((100% - 15px*11)/ 12)}.row.no-gutter .tablet-auto:nth-last-child(12),.row.no-gutter .tablet-auto:nth-last-child(12)~.tablet-auto{width:8.33333333%}.row .tablet-auto:nth-last-child(13),.row .tablet-auto:nth-last-child(13)~.col-auto{width:7.69230769%;width:calc((100% - 15px*12)/ 13)}.row.no-gutter .tablet-auto:nth-last-child(13),.row.no-gutter .tablet-auto:nth-last-child(13)~.tablet-auto{width:7.69230769%}.row .tablet-auto:nth-last-child(14),.row .tablet-auto:nth-last-child(14)~.col-auto{width:7.14285714%;width:calc((100% - 15px*13)/ 14)}.row.no-gutter .tablet-auto:nth-last-child(14),.row.no-gutter .tablet-auto:nth-last-child(14)~.tablet-auto{width:7.14285714%}.row .tablet-auto:nth-last-child(15),.row .tablet-auto:nth-last-child(15)~.col-auto{width:6.66666667%;width:calc((100% - 15px*14)/ 15)}.row.no-gutter .tablet-auto:nth-last-child(15),.row.no-gutter .tablet-auto:nth-last-child(15)~.tablet-auto{width:6.66666667%}}.weui-cell__hd img{display:block;margin-right:5px}.weui-cell_swiped .weui-cell__bd{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.swipeout-touching .weui-cell__bd{-webkit-transition:none;transition:none}.weui-dialog,.weui-toast{-webkit-transition-duration:.2s;transition-duration:.2s;opacity:0;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:0 0;transform-origin:0 0;visibility:hidden;margin:0;top:45%;z-index:2000}.weui-dialog .weui-dialog__btn.default,.weui-toast .weui-dialog__btn.default{color:#5f646e}.weui-dialog .weui-dialog__btn+.weui-dialog__btn,.weui-toast .weui-dialog__btn+.weui-dialog__btn{position:relative}.weui-dialog .weui-dialog__btn+.weui-dialog__btn:after,.weui-toast .weui-dialog__btn+.weui-dialog__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;height:100%;border-left:1px solid #D5D5D6;color:#D5D5D6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-dialog.weui-dialog--visible,.weui-dialog.weui-toast--visible,.weui-toast.weui-dialog--visible,.weui-toast.weui-toast--visible{opacity:1;visibility:visible}.weui-toast_forbidden{color:#F76260}.weui-toast_cancel .weui-icon-toast:before{content:"\EA0D"}.weui-toast_forbidden .weui-icon-toast:before{content:"\EA0B";color:#F76260}.weui-toast_text{min-height:1em;width:auto;height:45px;border-radius:25px;margin-left:0;-webkit-transform:scale(.9) translate3d(-50%,0,0);transform:scale(.9) translate3d(-50%,0,0);-webkit-transform-origin:left;transform-origin:left}.weui-toast_text.weui-toast--visible{-webkit-transform:scale(1) translate3d(-50%,0,0);transform:scale(1) translate3d(-50%,0,0)}.weui-toast_text .weui-icon-toast{display:none}.weui-toast_text .weui-toast_content{margin:10px 15px}.weui-mask{opacity:0;-webkit-transition-duration:.3s;transition-duration:.3s;visibility:hidden}.weui-mask.weui-mask--visible{opacity:1;visibility:visible}.weui-prompt-input{padding:4px 6px;border:1px solid #ccc;box-sizing:border-box;height:2em;width:80%;margin-top:10px}.weui-pull-to-refresh{margin-top:-50px;-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.weui-pull-to-refresh.refreshing{-webkit-transform:translate3d(0,50px,0);transform:translate3d(0,50px,0)}.weui-pull-to-refresh.touching{-webkit-transition-duration:0s;transition-duration:0s}.weui-pull-to-refresh__layer{height:30px;line-height:30px;padding:10px;text-align:center}.weui-pull-to-refresh__layer .down{display:inline-block}.weui-pull-to-refresh__layer .refresh,.weui-pull-to-refresh__layer .up{display:none}.weui-pull-to-refresh__layer .weui-pull-to-refresh__arrow{display:inline-block;z-index:10;width:20px;height:20px;margin-right:4px;vertical-align:-4px;background:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2026%2040'%3E%3Cpolygon%20points%3D'9%2C22%209%2C0%2017%2C0%2017%2C22%2026%2C22%2013.5%2C40%200%2C22'%20fill%3D'%238c8c8c'%2F%3E%3C%2Fsvg%3E") center no-repeat;background-size:13px 20px;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transform:rotate(0) translate3d(0,0,0);transform:rotate(0) translate3d(0,0,0)}.weui-pull-to-refresh__layer .weui-pull-to-refresh__preloader{display:none;vertical-align:-4px;margin-right:4px;width:20px;height:20px;-webkit-transform-origin:50%;transform-origin:50%;-webkit-animation:preloader-spin 1s steps(12,end) infinite;animation:preloader-spin 1s steps(12,end) infinite}.weui-pull-to-refresh__layer .weui-pull-to-refresh__preloader:after{display:block;width:100%;height:100%;content:"";background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%}.pull-up .weui-pull-to-refresh__layer .down,.refreshing .weui-pull-to-refresh__layer .down{display:none}.pull-up .weui-pull-to-refresh__layer .weui-pull-to-refresh__arrow{display:inline-block;-webkit-transform:rotate(180deg) translate3d(0,0,0);transform:rotate(180deg) translate3d(0,0,0)}.pull-down .weui-pull-to-refresh__layer .down,.pull-down .weui-pull-to-refresh__layer .weui-pull-to-refresh__arrow,.pull-up .weui-pull-to-refresh__layer .up{display:inline-block}.refreshing .weui-pull-to-refresh__layer .weui-pull-to-refresh__arrow{display:none}.refreshing .weui-pull-to-refresh__layer .refresh,.refreshing .weui-pull-to-refresh__layer .weui-pull-to-refresh__preloader{display:inline-block}@keyframes preloader-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.weui-tab__bd-item.weui-pull-to-refresh{position:absolute;top:50px}.toolbar,.weui-tabbar__item{position:relative}.weui-tabbar__item.weui-bar__item--on .weui-tabbar__label{color:#04BE02}.weui-navbar__item{color:#888}.weui-navbar__item.weui-bar__item--on{color:#666;background-color:#f1f1f1}.toolbar,.toolbar .title{font-size:.85rem;color:#3d4145;width:100%}.weui-tab__bd{box-sizing:border-box;height:100%}.weui-tab__bd .weui-tab__bd-item{display:none;height:100%;overflow:auto}.weui-tab__bd .weui-tab__bd-item.weui-tab__bd-item--active{display:block}.weui-navbar+.weui-tab__bd{padding-top:50px}.toolbar{line-height:1.5;background:#f7f7f8}.toolbar:before{content:'';position:absolute;left:0;top:0;bottom:auto;right:auto;height:1px;width:100%;background-color:#d9d9d9;display:block;z-index:15;-webkit-transform-origin:50% 0;transform-origin:50% 0}@media only screen and (-webkit-min-device-pixel-ratio:2){.toolbar:before{-webkit-transform:scaleY(.5);transform:scaleY(.5)}}@media only screen and (-webkit-min-device-pixel-ratio:3){.toolbar:before{-webkit-transform:scaleY(.33);transform:scaleY(.33)}}.toolbar .toolbar-inner{height:2.2rem;display:-webkit-box;display:-ms-flexbox;display:flex;text-align:center}.toolbar .title{position:absolute;display:block;padding:0;font-weight:400;line-height:2.2rem;text-align:center;white-space:nowrap}.toolbar .picker-button{position:absolute;right:0;box-sizing:border-box;height:2.2rem;line-height:2.2rem;color:#04BE02;z-index:1;padding:0 .5rem}.weui-picker-modal{width:100%;position:absolute;bottom:0;text-align:center;border-radius:0;opacity:.6;color:#3d4145;-webkit-transition-duration:.3s;transition-duration:.3s;height:13rem;background:#EFEFF4;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform}.weui-picker-modal.picker-modal-inline{height:10.8rem;opacity:1;position:static;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.weui-picker-modal.picker-modal-inline .toolbar{display:none}.weui-picker-modal.picker-columns-single .picker-items-col{width:100%}.weui-picker-modal.weui-picker-modal-visible{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.weui-picker-modal .picker-modal-inner{position:relative;height:10.8rem}.weui-picker-modal .picker-columns{width:100%;height:13rem;z-index:11500}.popover .weui-picker-modal .picker-columns,.weui-picker-modal .picker-columns.picker-modal-inline{height:10rem}@media (orientation:landscape) and (max-height:415px){.weui-picker-modal .picker-columns:not(.picker-modal-inline){height:10rem}}.weui-picker-modal .popover.popover-picker-columns{width:14rem}.weui-picker-modal .picker-items{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;padding:0;text-align:right;font-size:1rem;font-weight:400;-webkit-mask-box-image:-webkit-linear-gradient(bottom,transparent,transparent 5%,#fff 20%,#fff 80%,transparent 95%,transparent);-webkit-mask-box-image:linear-gradient(to top,transparent,transparent 5%,#fff 20%,#fff 80%,transparent 95%,transparent)}.weui-picker-modal .bar+.picker-items{height:10.8rem}.weui-picker-modal .picker-items-col{overflow:hidden;position:relative;max-height:100%}.weui-picker-modal .picker-items-col.picker-items-col-left{text-align:left}.weui-picker-modal .picker-items-col.picker-items-col-center{text-align:center}.weui-picker-modal .picker-items-col.picker-items-col-right{text-align:right}.weui-picker-modal .picker-items-col.picker-items-col-divider{color:#3d4145;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.weui-picker-modal .picker-items-col-wrapper{-webkit-transition:.3s;transition:.3s;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out}.weui-picker-modal .picker-item{height:32px;line-height:32px;padding:0 10px;white-space:nowrap;position:relative;overflow:hidden;text-overflow:ellipsis;color:#9b9b9b;left:0;top:0;width:100%;box-sizing:border-box;-webkit-transition:.3s;transition:.3s}.picker-items-col-absolute .weui-picker-modal .picker-item{position:absolute}.weui-picker-modal .picker-item.picker-item-far{pointer-events:none}.weui-picker-modal .picker-item.picker-selected{color:#3d4145;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transform:rotateX(0);transform:rotateX(0)}.weui-picker-modal .picker-center-highlight{height:32px;box-sizing:border-box;position:absolute;left:0;width:100%;top:50%;margin-top:-16px;pointer-events:none}.weui-picker-modal .picker-center-highlight:after,.weui-picker-modal .picker-center-highlight:before{content:'';position:absolute;right:auto;height:1px;background-color:#D9D9D9;display:block;z-index:15;left:0;width:100%}.weui-picker-modal .picker-center-highlight:before{top:0;bottom:auto;-webkit-transform-origin:50% 0;transform-origin:50% 0}@media only screen and (-webkit-min-device-pixel-ratio:2){.weui-picker-modal .picker-center-highlight:before{-webkit-transform:scaleY(.5);transform:scaleY(.5)}}@media only screen and (-webkit-min-device-pixel-ratio:3){.weui-picker-modal .picker-center-highlight:before{-webkit-transform:scaleY(.33);transform:scaleY(.33)}}.weui-picker-modal .picker-center-highlight:after{bottom:0;top:auto;-webkit-transform-origin:50% 100%;transform-origin:50% 100%}@media only screen and (-webkit-min-device-pixel-ratio:2){.weui-picker-modal .picker-center-highlight:after{-webkit-transform:scaleY(.5);transform:scaleY(.5)}}@media only screen and (-webkit-min-device-pixel-ratio:3){.weui-picker-modal .picker-center-highlight:after{-webkit-transform:scaleY(.33);transform:scaleY(.33)}}.weui-picker-modal .picker-3d .picker-items{overflow:hidden;-webkit-perspective:1200px;perspective:1200px}.weui-picker-modal .picker-3d .picker-item,.weui-picker-modal .picker-3d .picker-items-col,.weui-picker-modal .picker-3d .picker-items-col-wrapper{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.weui-picker-modal .picker-3d .picker-items-col{overflow:visible}.weui-picker-modal .picker-3d .picker-item{-webkit-transform-origin:center center -110px;transform-origin:center center -110px;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out}.weui-picker-container,.weui-picker-overlay{position:fixed;bottom:0;left:0;right:0;height:0;width:100%;z-index:1000}.picker-calendar-row:after,.picker-calendar-week-days:after{content:'';z-index:15;left:0;right:auto}.city-picker .picker-items-col{-webkit-box-flex:1;-ms-flex:1;flex:1;max-width:7rem}.weui-picker-container .weui-cells{margin:0;text-align:left}.datetime-picker .picker-item{text-overflow:initial}.weui-select-modal{height:auto}.weui-select-modal .weui-cells{margin:0;text-align:left;overflow-y:auto;overflow-x:hidden;max-height:16rem}.weui-select-modal .weui-cells:after{display:none}.weui-picker-calendar{background:#fff;height:15rem;width:100%;overflow:hidden}.weui-picker-calendar .picker-modal-inner{overflow:hidden;height:12.8rem}.picker-calendar-week-days{height:.9rem;background:#f7f7f8;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:11px;box-sizing:border-box;position:relative}.picker-calendar-week-days:after{position:absolute;bottom:0;top:auto;height:1px;width:100%;background-color:#c4c4c4;display:block;-webkit-transform-origin:50% 100%;transform-origin:50% 100%}@media only screen and (-webkit-min-device-pixel-ratio:2){.picker-calendar-week-days:after{-webkit-transform:scaleY(.5);transform:scaleY(.5)}}@media only screen and (-webkit-min-device-pixel-ratio:3){.picker-calendar-week-days:after{-webkit-transform:scaleY(.33);transform:scaleY(.33)}}.picker-calendar-week-days .picker-calendar-week-day{-webkit-flex-shrink:1;-ms-flex:0 1 auto;-ms-flex-negative:1;flex-shrink:1;width:14.28571429%;width:calc(100% / 7);line-height:17px;text-align:center}.picker-calendar-week-days+.picker-calendar-months{height:11.9rem}.picker-calendar-months{width:100%;height:100%;overflow:hidden;position:relative}.picker-calendar-months-wrapper{position:relative;width:100%;height:100%;-webkit-transition:.3s;transition:.3s}.picker-calendar-month{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;width:100%;height:100%;position:absolute;left:0;top:0}.picker-calendar-row{height:16.66666667%;height:calc(100% / 6);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-flex-shrink:1;-ms-flex:0 1 auto;-ms-flex-negative:1;flex-shrink:1;width:100%;position:relative}.picker-calendar-row:after{position:absolute;bottom:0;top:auto;height:1px;width:100%;background-color:#ccc;display:block;-webkit-transform-origin:50% 100%;transform-origin:50% 100%}@media only screen and (-webkit-min-device-pixel-ratio:2){.picker-calendar-row:after{-webkit-transform:scaleY(.5);transform:scaleY(.5)}}@media only screen and (-webkit-min-device-pixel-ratio:3){.picker-calendar-row:after{-webkit-transform:scaleY(.33);transform:scaleY(.33)}}.weui-picker-modal .picker-calendar-row:last-child:after{display:none}.picker-calendar-day{-webkit-flex-shrink:1;-ms-flex:0 1 auto;-ms-flex-negative:1;flex-shrink:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;box-sizing:border-box;width:14.28571429%;width:calc(100% / 7);text-align:center;color:#3d4145;font-size:15px;cursor:pointer}.picker-calendar-day.picker-calendar-day-next,.picker-calendar-day.picker-calendar-day-prev{color:#ccc}.picker-calendar-day.picker-calendar-day-disabled{color:#d4d4d4;cursor:auto}.picker-calendar-day.picker-calendar-day-today span{background:#e3e3e3}.picker-calendar-day.picker-calendar-day-selected span{background:#04BE02;color:#fff}.picker-calendar-day span{display:inline-block;border-radius:100%;width:30px;height:30px;line-height:30px}.picker-calendar-month-picker,.picker-calendar-year-picker{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;width:50%;max-width:200px;-webkit-flex-shrink:10;-ms-flex-negative:10;flex-shrink:10}.picker-calendar-month-picker span,.picker-calendar-year-picker span{-webkit-flex-shrink:1;-ms-flex:0 1 auto;-ms-flex-negative:1;flex-shrink:1;position:relative;overflow:hidden;text-overflow:ellipsis}.picker-calendar.picker-modal-inline .picker-calendar-week-days,.popover .picker-calendar .picker-calendar-week-days{background:0 0}.swiper-button-next,.swiper-button-prev,i.icon{background-position:center;background-repeat:no-repeat}.picker-calendar.picker-modal-inline .picker-calendar-week-days:after,.picker-calendar.picker-modal-inline .picker-calendar-week-days:before,.picker-calendar.picker-modal-inline .toolbar:after,.picker-calendar.picker-modal-inline .toolbar:before,.popover .picker-calendar .picker-calendar-week-days:after,.popover .picker-calendar .picker-calendar-week-days:before,.popover .picker-calendar .toolbar:after,.popover .picker-calendar .toolbar:before{display:none}.picker-calendar.picker-modal-inline .picker-calendar-week-days~.picker-calendar-months:before,.picker-calendar.picker-modal-inline .toolbar~.picker-modal-inner .picker-calendar-months:before,.popover .picker-calendar .picker-calendar-week-days~.picker-calendar-months:before,.popover .picker-calendar .toolbar~.picker-modal-inner .picker-calendar-months:before{content:'';position:absolute;left:0;top:0;bottom:auto;right:auto;height:1px;width:100%;background-color:#c4c4c4;display:block;z-index:15;-webkit-transform-origin:50% 0;transform-origin:50% 0}@media only screen and (-webkit-min-device-pixel-ratio:2){.picker-calendar.picker-modal-inline .picker-calendar-week-days~.picker-calendar-months:before,.picker-calendar.picker-modal-inline .toolbar~.picker-modal-inner .picker-calendar-months:before,.popover .picker-calendar .picker-calendar-week-days~.picker-calendar-months:before,.popover .picker-calendar .toolbar~.picker-modal-inner .picker-calendar-months:before{-webkit-transform:scaleY(.5);transform:scaleY(.5)}}@media only screen and (-webkit-min-device-pixel-ratio:3){.picker-calendar.picker-modal-inline .picker-calendar-week-days~.picker-calendar-months:before,.picker-calendar.picker-modal-inline .toolbar~.picker-modal-inner .picker-calendar-months:before,.popover .picker-calendar .picker-calendar-week-days~.picker-calendar-months:before,.popover .picker-calendar .toolbar~.picker-modal-inner .picker-calendar-months:before{-webkit-transform:scaleY(.33);transform:scaleY(.33)}}.picker-calendar-month-picker,.picker-calendar-year-picker{display:block;line-height:2.2rem;-webkit-box-flex:1;-ms-flex:1;flex:1}.picker-calendar-month-picker a.icon-only,.picker-calendar-year-picker a.icon-only{min-width:36px;float:left;width:25%;height:2.2rem;line-height:2rem}.picker-calendar-month-picker .current-month-value,.picker-calendar-month-picker .current-year-value,.picker-calendar-year-picker .current-month-value,.picker-calendar-year-picker .current-year-value{float:left;width:50%;height:2.2rem}i.icon{display:inline-block;vertical-align:middle;background-size:100% auto;font-style:normal;position:relative}i.icon.icon-next,i.icon.icon-prev{width:.75rem;height:.75rem}.swiper-slide,.swiper-wrapper{width:100%;height:100%;position:relative}i.icon.icon-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2015%2015'%3E%3Cg%3E%3Cpath%20fill%3D'%2304BE02'%20d%3D'M1%2C1.6l11.8%2C5.8L1%2C13.4V1.6%20M0%2C0v15l15-7.6L0%2C0L0%2C0z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}i.icon.icon-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2015%2015'%3E%3Cg%3E%3Cpath%20fill%3D'%2304BE02'%20d%3D'M14%2C1.6v11.8L2.2%2C7.6L14%2C1.6%20M15%2C0L0%2C7.6L15%2C15V0L15%2C0z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}.swiper-container{margin:0 auto;position:relative;overflow:hidden;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.swiper-wrapper{z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{-webkit-flex-shrink:0;-ms-flex:0 0 auto;-ms-flex-negative:0;flex-shrink:0}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-webkit-transition-property:height,-webkit-transform;transition-property:height,-webkit-transform;transition-property:transform,height;transition-property:transform,height,-webkit-transform}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;background-size:27px 44px}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:.3s;transition:.3s;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1;background:#04BE02}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination-bullets{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 5px}.swiper-pagination-progress{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progress .swiper-pagination-progressbar{background:#007aff;position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:scale(0);transform:scale(0);-webkit-transform-origin:left top;transform-origin:left top}.swiper-container-rtl .swiper-pagination-progress .swiper-pagination-progressbar{-webkit-transform-origin:right top;transform-origin:right top}.swiper-container-horizontal>.swiper-pagination-progress{width:100%;height:4px;left:0;top:0}.swiper-container-vertical>.swiper-pagination-progress{width:4px;height:100%;left:0;top:0}.swiper-pagination-progress.swiper-pagination-white{background:rgba(255,255,255,.5)}.swiper-pagination-progress.swiper-pagination-white .swiper-pagination-progressbar{background:#fff}.swiper-pagination-progress.swiper-pagination-black .swiper-pagination-progressbar{background:#000}.swiper-container-3d{-webkit-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-coverflow .swiper-wrapper,.swiper-container-flip .swiper-wrapper{-ms-perspective:1200px}.swiper-container-cube,.swiper-container-flip{overflow:visible}.swiper-container-cube .swiper-slide,.swiper-container-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-container-cube .swiper-slide .swiper-slide,.swiper-container-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-active .swiper-slide-active,.swiper-container-flip .swiper-slide-active,.swiper-container-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top,.swiper-container-flip .swiper-slide-shadow-bottom,.swiper-container-flip .swiper-slide-shadow-left,.swiper-container-flip .swiper-slide-shadow-right,.swiper-container-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-slide{visibility:hidden;-webkit-transform-origin:0 0;transform-origin:0 0;width:100%;height:100%}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none;-webkit-transition-property:opacity;transition-property:opacity}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.weui-actionsheet{z-index:10000}.weui-popup__container,.weui-popup__overlay{position:fixed;bottom:0;left:0;right:0;width:100%;height:100%;z-index:10}.weui-popup__overlay{background-color:rgba(0,0,0,.6);opacity:0;-webkit-transition:opacity .3s;transition:opacity .3s}.weui-popup__container{display:none}.weui-popup__container.weui-popup__container--visible{display:block}.weui-popup__container .weui-cells{margin:0;text-align:left}.weui-popup__modal{width:100%;position:absolute;z-index:100;bottom:0;border-radius:0;opacity:.6;color:#3d4145;-webkit-transition-duration:.3s;transition-duration:.3s;height:100%;background:#EFEFF4;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;overflow-x:hidden;overflow-y:auto}.popup-bottom .weui-popup__modal{height:auto}.weui-popup__modal .toolbar{position:absolute;left:0;top:0;right:0;z-index:1}.weui-popup__modal .modal-content{height:100%;padding-top:2.2rem;overflow:auto;box-sizing:border-box}.weui-popup__container--visible .weui-popup__overlay{opacity:1}.weui-popup__container--visible .weui-popup__modal{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.weui-notification{position:fixed;width:100%;min-height:3.4rem;top:-2rem;padding-top:2rem;left:0;right:0;z-index:9999;background-color:rgba(0,0,0,.85);color:#fff;font-size:.65rem;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);-webkit-transition:.4s;transition:.4s}.weui-notification.weui-notification--in{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.weui-notification.weui-notification--touching{-webkit-transition-duration:0s;transition-duration:0s}.weui-notification .weui-notification__inner{padding:.4rem .6rem 1rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.weui-notification .weui-notification__content{width:100%;margin:0 .4rem}.weui-notification .weui-notification__title{font-weight:700}.weui-notification .weui-notification__text{line-height:1}.weui-notification .weui-notification__media{height:1rem;width:1rem}.weui-notification .weui-notification__media img{width:100%}.weui-notification .weui-notification__handle-bar{position:absolute;bottom:.2rem;left:50%;-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0);width:2rem;height:.3rem;border-radius:.15rem;background:#fff;opacity:.5}.weui-photo-browser-modal{position:fixed;top:0;left:0;right:0;bottom:0;background:#000;display:none;opacity:0;-webkit-transition:opacity .3s;transition:opacity .3s}.weui-photo-browser-modal.weui-photo-browser-modal-visible{opacity:1}.weui-photo-browser-modal .swiper-container{height:100%;-webkit-transform:scale(.2);transform:scale(.2);-webkit-transition:-webkit-transform .5s;transition:-webkit-transform .5s;transition:transform .5s;transition:transform .5s,-webkit-transform .5s}.weui-photo-browser-modal .swiper-container .swiper-pagination-bullet{background:#fff;visibility:hidden}.weui-photo-browser-modal .swiper-container.swiper-container-visible{-webkit-transform:scale(1);transform:scale(1)}.weui-photo-browser-modal .swiper-container.swiper-container-visible .swiper-pagination-bullet{visibility:visible;-webkit-transition-property:visibility;transition-property:visibility;-webkit-transition-delay:.5s;transition-delay:.5s}.weui-photo-browser-modal .swiper-container .swiper-pagination{bottom:10px;left:0;width:100%}.weui-photo-browser-modal .photo-container{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;overflow:hidden}.weui-photo-browser-modal .photo-container img{max-width:100%;margin-top:-30px}.weui-photo-browser-modal .caption{position:absolute;bottom:40px;left:0;right:0;color:#fff;text-align:center;padding:0 12px;min-height:3rem;font-size:14px;z-index:10;-webkit-transition:opacity .3s;transition:opacity .3s;-webkit-transition-delay:.5s;transition-delay:.5s;opacity:0}.weui-photo-browser-modal .caption .caption-item{display:none;opacity:0;-webkit-transition:opacity .15s;transition:opacity .15s}.weui-photo-browser-modal .caption .caption-item.active{display:block;opacity:1}.weui-photo-browser-modal .swiper-container-visible .caption{opacity:1}.color-primary{color:#04BE02}.color-danger,.color-error{color:#f6383a}.color-warning{color:#f60}.color-success{color:#4cd964}.bg-danger,.bg-error,.bg-primary,.bg-success,.bg-warning{color:#fff}.bg-primary{background-color:#04BE02}.bg-danger,.bg-error{background-color:#f6383a}.bg-warning{background-color:#f60}.bg-success{background-color:#4cd964}.weui-toptips{z-index:100;opacity:0;-webkit-transition:opacity .3s;transition:opacity .3s}.weui-toptips.weui-toptips_visible{opacity:1}.weui-icon_toast{font-size:55px;color:#fff;margin-bottom:6px}.weui-toast--forbidden .weui-icon_toast{color:#f6383a}.weui-toast--text{min-height:initial;font-size:18px;padding:8px 16px;width:auto;top:40%}.weui-toast--text .weui-icon_toast{display:none}.weui-count{display:inline-block;height:25px;line-height:25px}.weui-count .weui-count__btn{height:21px;width:21px;line-height:21px;display:inline-block;position:relative;border:1px solid #04BE02;border-radius:50%;vertical-align:-6px}.weui-count .weui-count__btn:after,.weui-count .weui-count__btn:before{content:" ";position:absolute;height:1px;width:11px;background-color:#04BE02;left:50%;top:50%;margin-left:-5.5px}.weui-count .weui-count__btn:after{height:11px;width:1px;margin-top:-5.5px;margin-left:-1px}.weui-count .weui-count__decrease:after{display:none}.weui-count .weui-count__increase{background-color:#04BE02}.weui-count .weui-count__increase:after,.weui-count .weui-count__increase:before{background-color:#fff}.weui-count .weui-count__number{background-color:transparent;font-size:.8rem;border:0;width:1.3rem;text-align:center;color:#5f646e}.weui-panel .weui-media-box__title-after{color:#9b9b9b;font-size:.65rem;float:right}
\ No newline at end of file
diff --git a/oauth/src/main/resources/static/css/weui.min.css b/oauth/src/main/resources/static/css/weui.min.css
new file mode 100755
index 0000000..1371e18
--- /dev/null
+++ b/oauth/src/main/resources/static/css/weui.min.css
@@ -0,0 +1,5 @@
+/*!
+ * WeUI v1.1.3 (https://github.com/weui/weui)
+ * Copyright 2018 Tencent, Inc.
+ * Licensed under the MIT license
+ */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{line-height:1.6;font-family:-apple-system-font,Helvetica Neue,sans-serif}*{margin:0;padding:0}a img{border:0}a{text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}@font-face{font-weight:400;font-style:normal;font-family:weui;src:url('data:application/octet-stream;base64,AAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzJAKEx+AAABfAAAAFZjbWFw65cFHQAAAhwAAAJQZ2x5ZvCRR/EAAASUAAAKtGhlYWQMPROtAAAA4AAAADZoaGVhCCwD+gAAALwAAAAkaG10eEJo//8AAAHUAAAASGxvY2EYqhW4AAAEbAAAACZtYXhwASEAVQAAARgAAAAgbmFtZeNcHtgAAA9IAAAB5nBvc3T6bLhLAAARMAAAAOYAAQAAA+gAAABaA+j/////A+kAAQAAAAAAAAAAAAAAAAAAABIAAQAAAAEAACbZbxtfDzz1AAsD6AAAAADUm2dvAAAAANSbZ2///wAAA+kD6gAAAAgAAgAAAAAAAAABAAAAEgBJAAUAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQOwAZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6gHqEQPoAAAAWgPqAAAAAAABAAAAAAAAAAAAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+j//wPoAAAD6AAAAAAABQAAAAMAAAAsAAAABAAAAXQAAQAAAAAAbgADAAEAAAAsAAMACgAAAXQABABCAAAABAAEAAEAAOoR//8AAOoB//8AAAABAAQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAANwAAAAAAAAAEQAA6gEAAOoBAAAAAQAA6gIAAOoCAAAAAgAA6gMAAOoDAAAAAwAA6gQAAOoEAAAABAAA6gUAAOoFAAAABQAA6gYAAOoGAAAABgAA6gcAAOoHAAAABwAA6ggAAOoIAAAACAAA6gkAAOoJAAAACQAA6goAAOoKAAAACgAA6gsAAOoLAAAACwAA6gwAAOoMAAAADAAA6g0AAOoNAAAADQAA6g4AAOoOAAAADgAA6g8AAOoPAAAADwAA6hAAAOoQAAAAEAAA6hEAAOoRAAAAEQAAAAAARgCMANIBJAF4AcQCMgJgAqgC/ANIA6YD/gROBKAE9AVaAAAAAgAAAAADrwOtABQAKQAAASIHBgcGFBcWFxYyNzY3NjQnJicmAyInJicmNDc2NzYyFxYXFhQHBgcGAfV4Z2Q7PDw7ZGfwZmQ7PDw7ZGZ4bl5bNjc3Nlte215bNjc3NlteA608O2Rn8GdjOzw8O2Nn8GdkOzz8rzc1W17bXlw1Nzc1XF7bXls1NwAAAAACAAAAAAOzA7MAFwAtAAABIgcGBwYVFBcWFxYzMjc2NzY1NCcmJyYTBwYiLwEmNjsBETQ2OwEyFhURMzIWAe52Z2Q7PT07ZGd2fGpmOz4+O2ZpIXYOKA52Dg0XXQsHJgcLXRcNA7M+O2ZqfHZnZDs9PTtkZ3Z9aWY7Pv3wmhISmhIaARcICwsI/ukaAAMAAAAAA+UD5QAXACMALAAAASIHBgcGFRQXFhcWMzI3Njc2NTQnJicmAxQrASI1AzQ7ATIHJyImNDYyFhQGAe6Ecm9BRERBb3KEiXZxQkREQnF1aQIxAwgCQgMBIxIZGSQZGQPkREJxdomEcm9BRERBb3KEinVxQkT9HQICAWICAjEZIxkZIxkAAAAAAgAAAAADsQPkABkALgAAAQYHBgc2BREUFxYXFhc2NzY3NjURJBcmJyYTAQYvASY/ATYyHwEWNjclNjIfARYB9VVVQk+v/tFHPmxebGxdbT1I/tGvT0JVo/7VBASKAwMSAQUBcQEFAgESAgUBEQQD4xMYEhk3YP6sjnVlSD8cHD9IZXWOAVRgNxkSGP62/tkDA48EBBkCAVYCAQHlAQIQBAAAAAADAAAAAAOxA+QAGwAqADMAAAEGBwYHBgcGNxEUFxYXFhc2NzY3NjURJBcmJyYHMzIWFQMUBisBIicDNDYTIiY0NjIWFAYB9UFBODssO38gRz5sXmxsXW09SP7YqFBBVW80BAYMAwImBQELBh4PFhYeFRUD5A8SDhIOEikK/q2PdWRJPh0dPklkdY8BU141GRIY/AYE/sYCAwUBOgQG/kAVHxUVHxUAAAACAAAAAAPkA+QAFwAtAAABIgcGBwYVFBcWFxYzMjc2NzY1NCcmJyYTAQYiLwEmPwE2Mh8BFjI3ATYyHwEWAe6Ecm9BQ0NCbnODiXVxQkREQnF1kf6gAQUBowMDFgEFAYUCBQEBQwIFARUEA+NEQnF1iYNzbkJDQ0FvcoSJdXFCRP6j/qUBAagEBR4CAWYBAQENAgIVBAAAAAQAAAAAA68DrQAUACkAPwBDAAABIgcGBwYUFxYXFjI3Njc2NCcmJyYDIicmJyY0NzY3NjIXFhcWFAcGBwYTBQ4BLwEmBg8BBhYfARYyNwE+ASYiFzAfAQH1eGdkOzw8O2Rn8GZkOzw8O2RmeG5eWzY3NzZbXtteWzY3NzZbXmn+9gYSBmAGDwUDBQEGfQUQBgElBQELEBUBAQOtPDtkZ/BnYzs8PDtjZ/BnZDs8/K83NVte215cNTc3NVxe215bNTcCJt0FAQVJBQIGBAcRBoAGBQEhBQ8LBAEBAAABAAAAAAO7AzoAFwAAEy4BPwE+AR8BFjY3ATYWFycWFAcBBiInPQoGBwUHGgzLDCELAh0LHwsNCgr9uQoeCgGzCyEOCw0HCZMJAQoBvgkCCg0LHQv9sQsKAAAAAAIAAAAAA+UD5gAXACwAAAEiBwYHBhUUFxYXFjMyNzY3NjU0JyYnJhMHBi8BJicmNRM0NjsBMhYVExceAQHvhHJvQUNDQm5zg4l1cUJEREJxdVcQAwT6AwIEEAMCKwIDDsUCAQPlREJxdYmDc25CQ0NBb3KEiXVxQkT9VhwEAncCAgMGAXoCAwMC/q2FAgQAAAQAAAAAA68DrQADABgALQAzAAABMB8BAyIHBgcGFBcWFxYyNzY3NjQnJicmAyInJicmNDc2NzYyFxYXFhQHBgcGAyMVMzUjAuUBAfJ4Z2Q7PDw7ZGfwZmQ7PDw7ZGZ4bl5bNjc3Nlte215bNjc3NltemyT92QKDAQEBLDw7ZGfwZ2M7PDw7Y2fwZ2Q7PPyvNzVbXtteXDU3NzVcXtteWzU3AjH9JAAAAAMAAAAAA+QD5AAXACcAMAAAASIHBgcGFRQXFhcWMzI3Njc2NTQnJicmAzMyFhUDFAYrASImNQM0NhMiJjQ2MhYUBgHuhHJvQUNDQm5zg4l1cUJEREJxdZ42BAYMAwInAwMMBh8PFhYeFhYD40RCcXWJg3NuQkNDQW9yhIl1cUJE/vYGBf7AAgMDAgFABQb+NhYfFhYfFgAABAAAAAADwAPAAAgAEgAoAD0AAAEyNjQmIgYUFhcjFTMRIxUzNSMDIgcGBwYVFBYXFjMyNzY3NjU0Jy4BAyInJicmNDc2NzYyFxYXFhQHBgcGAfQYISEwISFRjzk5yTorhG5rPT99am+DdmhlPD4+PMyFbV5bNTc3NVte2l5bNTc3NVteAqAiLyIiLyI5Hf7EHBwCsT89a26Ed8w8Pj48ZWh2g29qffyjNzVbXtpeWzU3NzVbXtpeWzU3AAADAAAAAAOoA6gACwAgADUAAAEHJwcXBxc3FzcnNwMiBwYHBhQXFhcWMjc2NzY0JyYnJgMiJyYnJjQ3Njc2MhcWFxYUBwYHBgKOmpocmpocmpocmpq2dmZiOjs7OmJm7GZiOjs7OmJmdmtdWTQ2NjRZXdZdWTQ2NjRZXQKqmpocmpocmpocmpoBGTs6YmbsZmI6Ozs6YmbsZmI6O/zCNjRZXdZdWTQ2NjRZXdZdWTQ2AAMAAAAAA+kD6gAaAC8AMAAAAQYHBiMiJyYnJjQ3Njc2MhcWFxYVFAcGBwEHATI3Njc2NCcmJyYiBwYHBhQXFhcWMwKONUBCR21dWjU3NzVaXdpdWzU2GBcrASM5/eBXS0grKysrSEuuSkkqLCwqSUpXASMrFxg2NVtd2l1aNTc3NVpdbUdCQDX+3jkBGSsrSEuuSkkqLCwqSUquS0grKwAC//8AAAPoA+gAFAAwAAABIgcGBwYQFxYXFiA3Njc2ECcmJyYTFg4BIi8BBwYuATQ/AScmPgEWHwE3Nh4BBg8BAfSIdHFDRERDcXQBEHRxQ0REQ3F0SQoBFBsKoqgKGxMKqKIKARQbCqKoChsUAQqoA+hEQ3F0/vB0cUNERENxdAEQdHFDRP1jChsTCqiiCgEUGwqiqAobFAEKqKIKARQbCqIAAAIAAAAAA+QD5AAXADQAAAEiBwYHBhUUFxYXFjMyNzY3NjU0JyYnJhMUBiMFFxYUDwEGLwEuAT8BNh8BFhQPAQUyFh0BAe6Ecm9BQ0NCbnODiXVxQkREQnF1fwQC/pGDAQEVAwTsAgEC7AQEFAIBhAFwAgMD40RCcXWJg3NuQkNDQW9yhIl1cUJE/fYCAwuVAgQCFAQE0AIFAtEEBBQCBQGVCwMDJwAAAAUAAAAAA9QD0wAjACcANwBHAEgAAAERFAYjISImNREjIiY9ATQ2MyE1NDYzITIWHQEhMhYdARQGIyERIREHIgYVERQWOwEyNjURNCYjISIGFREUFjsBMjY1ETQmKwEDeyYb/XYbJkMJDQ0JAQYZEgEvExkBBgkNDQn9CQJc0QkNDQktCQ0NCf7sCQ0NCS0JDQ0JLQMi/TQbJiYbAswMCiwJDS4SGRkSLg0JLAoM/UwCtGsNCf5NCQ0NCQGzCQ0NCf5NCQ0NCQGzCQ0AAAAAEADGAAEAAAAAAAEABAAAAAEAAAAAAAIABwAEAAEAAAAAAAMABAALAAEAAAAAAAQABAAPAAEAAAAAAAUACwATAAEAAAAAAAYABAAeAAEAAAAAAAoAKwAiAAEAAAAAAAsAEwBNAAMAAQQJAAEACABgAAMAAQQJAAIADgBoAAMAAQQJAAMACAB2AAMAAQQJAAQACAB+AAMAAQQJAAUAFgCGAAMAAQQJAAYACACcAAMAAQQJAAoAVgCkAAMAAQQJAAsAJgD6d2V1aVJlZ3VsYXJ3ZXVpd2V1aVZlcnNpb24gMS4wd2V1aUdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAHcAZQB1AGkAUgBlAGcAdQBsAGEAcgB3AGUAdQBpAHcAZQB1AGkAVgBlAHIAcwBpAG8AbgAgADEALgAwAHcAZQB1AGkARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETAAZjaXJjbGUIZG93bmxvYWQEaW5mbwxzYWZlX3N1Y2Nlc3MJc2FmZV93YXJuB3N1Y2Nlc3MOc3VjY2Vzcy1jaXJjbGURc3VjY2Vzcy1uby1jaXJjbGUHd2FpdGluZw53YWl0aW5nLWNpcmNsZQR3YXJuC2luZm8tY2lyY2xlBmNhbmNlbAZzZWFyY2gFY2xlYXIEYmFjawZkZWxldGUAAAAA') format('truetype')}[class*=" weui-icon-"],[class^=weui-icon-]{display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 weui;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}[class*=" weui-icon-"]:before,[class^=weui-icon-]:before{display:inline-block;margin-left:.2em;margin-right:.2em}.weui-icon-circle:before{content:"\EA01"}.weui-icon-download:before{content:"\EA02"}.weui-icon-info:before{content:"\EA03"}.weui-icon-safe-success:before{content:"\EA04"}.weui-icon-safe-warn:before{content:"\EA05"}.weui-icon-success:before{content:"\EA06"}.weui-icon-success-circle:before{content:"\EA07"}.weui-icon-success-no-circle:before{content:"\EA08"}.weui-icon-waiting:before{content:"\EA09"}.weui-icon-waiting-circle:before{content:"\EA0A"}.weui-icon-warn:before{content:"\EA0B"}.weui-icon-info-circle:before{content:"\EA0C"}.weui-icon-cancel:before{content:"\EA0D"}.weui-icon-search:before{content:"\EA0E"}.weui-icon-clear:before{content:"\EA0F"}.weui-icon-back:before{content:"\EA10"}.weui-icon-delete:before{content:"\EA11"}[class*=" weui-icon_"]:before,[class^=weui-icon_]:before{margin:0}.weui-icon-success{font-size:23px;color:#09bb07}.weui-icon-waiting{font-size:23px;color:#10aeff}.weui-icon-warn{font-size:23px;color:#f43530}.weui-icon-info{font-size:23px;color:#10aeff}.weui-icon-success-circle,.weui-icon-success-no-circle{font-size:23px;color:#09bb07}.weui-icon-waiting-circle{font-size:23px;color:#10aeff}.weui-icon-circle{font-size:23px;color:#c9c9c9}.weui-icon-download,.weui-icon-info-circle{font-size:23px;color:#09bb07}.weui-icon-safe-success{color:#09bb07}.weui-icon-safe-warn{color:#ffbe00}.weui-icon-cancel{color:#f43530;font-size:22px}.weui-icon-clear,.weui-icon-search{color:#b2b2b2;font-size:14px}.weui-icon-delete.weui-icon_gallery-delete{color:#fff;font-size:22px}.weui-icon_msg{font-size:93px}.weui-icon_msg.weui-icon-warn{color:#f76260}.weui-icon_msg-primary{font-size:93px}.weui-icon_msg-primary.weui-icon-warn{color:#ffbe00}.weui-btn{position:relative;display:block;margin-left:auto;margin-right:auto;padding-left:14px;padding-right:14px;box-sizing:border-box;font-size:18px;text-align:center;text-decoration:none;color:#fff;line-height:2.55555556;border-radius:5px;-webkit-tap-highlight-color:rgba(0,0,0,0);overflow:hidden}.weui-btn:after{content:" ";width:200%;height:200%;position:absolute;top:0;left:0;border:1px solid rgba(0,0,0,.2);-webkit-transform:scale(.5);transform:scale(.5);-webkit-transform-origin:0 0;transform-origin:0 0;box-sizing:border-box;border-radius:10px}.weui-btn_inline{display:inline-block}.weui-btn_default{color:#000;background-color:#f8f8f8}.weui-btn_default:not(.weui-btn_disabled):visited{color:#000}.weui-btn_default:not(.weui-btn_disabled):active{color:rgba(0,0,0,.6);background-color:#dedede}.weui-btn_primary{background-color:#1aad19}.weui-btn_primary:not(.weui-btn_disabled):visited{color:#fff}.weui-btn_primary:not(.weui-btn_disabled):active{color:hsla(0,0%,100%,.6);background-color:#179b16}.weui-btn_warn{background-color:#e64340}.weui-btn_warn:not(.weui-btn_disabled):visited{color:#fff}.weui-btn_warn:not(.weui-btn_disabled):active{color:hsla(0,0%,100%,.6);background-color:#ce3c39}.weui-btn_disabled{color:hsla(0,0%,100%,.6)}.weui-btn_disabled.weui-btn_default{color:rgba(0,0,0,.3);background-color:#f7f7f7}.weui-btn_disabled.weui-btn_primary{background-color:#9ed99d}.weui-btn_disabled.weui-btn_warn{background-color:#ec8b89}.weui-btn_loading .weui-loading{margin:-.2em .34em 0 0}.weui-btn_loading.weui-btn_primary,.weui-btn_loading.weui-btn_warn{color:hsla(0,0%,100%,.6)}.weui-btn_loading.weui-btn_primary{background-color:#179b16}.weui-btn_loading.weui-btn_warn{background-color:#ce3c39}.weui-btn_plain-primary{color:#1aad19;border:1px solid #1aad19}.weui-btn_plain-primary:not(.weui-btn_plain-disabled):active{color:rgba(26,173,25,.6);border-color:rgba(26,173,25,.6)}.weui-btn_plain-primary:after{border-width:0}.weui-btn_plain-default{color:#353535;border:1px solid #353535}.weui-btn_plain-default:not(.weui-btn_plain-disabled):active{color:rgba(53,53,53,.6);border-color:rgba(53,53,53,.6)}.weui-btn_plain-default:after{border-width:0}.weui-btn_plain-disabled{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}button.weui-btn,input.weui-btn{width:100%;border-width:0;outline:0;-webkit-appearance:none}button.weui-btn:focus,input.weui-btn:focus{outline:0}button.weui-btn_inline,button.weui-btn_mini,input.weui-btn_inline,input.weui-btn_mini{width:auto}button.weui-btn_plain-default,button.weui-btn_plain-primary,input.weui-btn_plain-default,input.weui-btn_plain-primary{border-width:1px;background-color:transparent}.weui-btn_mini{display:inline-block;padding:0 1.32em;line-height:2.3;font-size:13px}.weui-btn+.weui-btn{margin-top:15px}.weui-btn.weui-btn_inline+.weui-btn.weui-btn_inline{margin-top:auto;margin-left:15px}.weui-btn-area{margin:1.17647059em 15px .3em}.weui-btn-area_inline{display:-webkit-box;display:-webkit-flex;display:flex}.weui-btn-area_inline .weui-btn{margin-top:auto;margin-right:15px;width:100%;-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-btn-area_inline .weui-btn:last-child{margin-right:0}.weui-cells{margin-top:1.17647059em;background-color:#fff;line-height:1.47058824;font-size:17px;overflow:hidden;position:relative}.weui-cells:before{top:0;border-top:1px solid #e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-cells:after,.weui-cells:before{content:" ";position:absolute;left:0;right:0;height:1px;color:#e5e5e5;z-index:2}.weui-cells:after{bottom:0;border-bottom:1px solid #e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-cells__title{margin-top:.77em;margin-bottom:.3em;padding-left:15px;padding-right:15px;color:#999;font-size:14px}.weui-cells__title+.weui-cells{margin-top:0}.weui-cells__tips{margin-top:.3em;color:#999;padding-left:15px;padding-right:15px;font-size:14px}.weui-cell{padding:10px 15px;position:relative;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-cell:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:15px;z-index:2}.weui-cell:first-child:before{display:none}.weui-cell_primary{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start}.weui-cell__bd{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-cell__ft{text-align:right;color:#999}.weui-cell_swiped{display:block;padding:0}.weui-cell_swiped>.weui-cell__bd{position:relative;z-index:1;background-color:#fff}.weui-cell_swiped>.weui-cell__ft{position:absolute;right:0;top:0;bottom:0;display:-webkit-box;display:-webkit-flex;display:flex;color:#fff}.weui-swiped-btn{display:block;padding:10px 1em;line-height:1.47058824;color:inherit}.weui-swiped-btn_default{background-color:#c7c7cc}.weui-swiped-btn_warn{background-color:#ff3b30}.weui-cell_access{-webkit-tap-highlight-color:rgba(0,0,0,0);color:inherit}.weui-cell_access:active{background-color:#ececec}.weui-cell_access .weui-cell__ft{padding-right:13px;position:relative}.weui-cell_access .weui-cell__ft:after{content:" ";display:inline-block;height:6px;width:6px;border-width:2px 2px 0 0;border-color:#c8c8cd;border-style:solid;-webkit-transform:matrix(.71,.71,-.71,.71,0,0);transform:matrix(.71,.71,-.71,.71,0,0);position:relative;top:-2px;position:absolute;top:50%;margin-top:-4px;right:2px}.weui-cell_link{color:#586c94;font-size:14px}.weui-cell_link:first-child:before{display:block}.weui-check__label{-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-check__label:active{background-color:#ececec}.weui-check{position:absolute;left:-9999em}.weui-cells_radio .weui-cell__ft{padding-left:.35em}.weui-cells_radio .weui-check+.weui-icon-checked{min-width:16px}.weui-cells_radio .weui-check:checked+.weui-icon-checked:before{display:block;content:'\EA08';color:#09bb07;font-size:16px}.weui-cells_checkbox .weui-cell__hd{padding-right:.35em}.weui-cells_checkbox .weui-icon-checked:before{content:'\EA01';color:#c9c9c9;font-size:23px;display:block}.weui-cells_checkbox .weui-check:checked+.weui-icon-checked:before{content:'\EA06';color:#09bb07}.weui-label{display:block;width:105px;word-wrap:break-word;word-break:break-all}.weui-input{width:100%;border:0;outline:0;-webkit-appearance:none;background-color:transparent;font-size:inherit;color:inherit;height:1.47058824em;line-height:1.47058824}.weui-input::-webkit-inner-spin-button,.weui-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.weui-textarea{display:block;border:0;resize:none;width:100%;color:inherit;font-size:1em;line-height:inherit;outline:0}.weui-textarea-counter{color:#b2b2b2;text-align:right}.weui-cell_warn .weui-textarea-counter{color:#e64340}.weui-toptips{display:none;position:fixed;-webkit-transform:translateZ(0);transform:translateZ(0);top:0;left:0;right:0;padding:5px;font-size:14px;text-align:center;color:#fff;z-index:5000;word-wrap:break-word;word-break:break-all}.weui-toptips_warn{background-color:#e64340}.weui-cells_form .weui-cell__ft{font-size:0}.weui-cells_form .weui-icon-warn{display:none}.weui-cells_form input,.weui-cells_form label[for],.weui-cells_form textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-cell_warn{color:#e64340}.weui-cell_warn .weui-icon-warn{display:inline-block}.weui-form-preview{position:relative;background-color:#fff}.weui-form-preview:before{top:0;border-top:1px solid #e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-form-preview:after,.weui-form-preview:before{content:" ";position:absolute;left:0;right:0;height:1px;color:#e5e5e5}.weui-form-preview:after{bottom:0;border-bottom:1px solid #e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-form-preview__hd{position:relative;padding:10px 15px;text-align:right;line-height:2.5em}.weui-form-preview__hd:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:15px}.weui-form-preview__hd .weui-form-preview__value{font-style:normal;font-size:1.6em}.weui-form-preview__bd{padding:10px 15px;font-size:.9em;text-align:right;color:#999;line-height:2}.weui-form-preview__ft{position:relative;line-height:50px;display:-webkit-box;display:-webkit-flex;display:flex}.weui-form-preview__ft:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-form-preview__item{overflow:hidden}.weui-form-preview__label{float:left;margin-right:1em;min-width:4em;color:#999;text-align:justify;text-align-last:justify}.weui-form-preview__value{display:block;overflow:hidden;word-break:normal;word-wrap:break-word}.weui-form-preview__btn{position:relative;display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#3cc51f;text-align:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}button.weui-form-preview__btn{background-color:transparent;border:0;outline:0;line-height:inherit;font-size:inherit}.weui-form-preview__btn:active{background-color:#eee}.weui-form-preview__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-form-preview__btn:first-child:after{display:none}.weui-form-preview__btn_default{color:#999}.weui-form-preview__btn_primary{color:#0bb20c}.weui-cell_select{padding:0}.weui-cell_select .weui-select{padding-right:30px}.weui-cell_select .weui-cell__bd:after{content:" ";display:inline-block;height:6px;width:6px;border-width:2px 2px 0 0;border-color:#c8c8cd;border-style:solid;-webkit-transform:matrix(.71,.71,-.71,.71,0,0);transform:matrix(.71,.71,-.71,.71,0,0);position:relative;top:-2px;position:absolute;top:50%;right:15px;margin-top:-4px}.weui-select{-webkit-appearance:none;border:0;outline:0;background-color:transparent;width:100%;font-size:inherit;height:45px;line-height:45px;position:relative;z-index:1;padding-left:15px}.weui-cell_select-before{padding-right:15px}.weui-cell_select-before .weui-select{width:105px;box-sizing:border-box}.weui-cell_select-before .weui-cell__hd{position:relative}.weui-cell_select-before .weui-cell__hd:after{content:" ";position:absolute;right:0;top:0;width:1px;bottom:0;border-right:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-cell_select-before .weui-cell__hd:before{content:" ";display:inline-block;height:6px;width:6px;border-width:2px 2px 0 0;border-color:#c8c8cd;border-style:solid;-webkit-transform:matrix(.71,.71,-.71,.71,0,0);transform:matrix(.71,.71,-.71,.71,0,0);position:relative;top:-2px;position:absolute;top:50%;right:15px;margin-top:-4px}.weui-cell_select-before .weui-cell__bd{padding-left:15px}.weui-cell_select-before .weui-cell__bd:after{display:none}.weui-cell_select-after{padding-left:15px}.weui-cell_select-after .weui-select{padding-left:0}.weui-cell_vcode{padding-top:0;padding-right:0;padding-bottom:0}.weui-vcode-btn,.weui-vcode-img{margin-left:5px;height:45px;vertical-align:middle}.weui-vcode-btn{display:inline-block;padding:0 .6em 0 .7em;border-left:1px solid #e5e5e5;line-height:45px;font-size:17px;color:#3cc51f}button.weui-vcode-btn{background-color:transparent;border-top:0;border-right:0;border-bottom:0;outline:0}.weui-vcode-btn:active{color:#52a341}.weui-gallery{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background-color:#000;z-index:1000}.weui-gallery__img{position:absolute;top:0;right:0;bottom:60px;left:0;background:50% no-repeat;background-size:contain}.weui-gallery__opr{position:absolute;right:0;bottom:0;left:0;background-color:#0d0d0d;color:#fff;line-height:60px;text-align:center}.weui-gallery__del{display:block}.weui-cell_switch{padding-top:6.5px;padding-bottom:6.5px}.weui-switch{-webkit-appearance:none;appearance:none}.weui-switch,.weui-switch-cp__box{position:relative;width:52px;height:32px;border:1px solid #dfdfdf;outline:0;border-radius:16px;box-sizing:border-box;background-color:#dfdfdf;-webkit-transition:background-color .1s,border .1s;transition:background-color .1s,border .1s}.weui-switch-cp__box:before,.weui-switch:before{content:" ";position:absolute;top:0;left:0;width:50px;height:30px;border-radius:15px;background-color:#fdfdfd;-webkit-transition:-webkit-transform .35s cubic-bezier(.45,1,.4,1);transition:-webkit-transform .35s cubic-bezier(.45,1,.4,1);transition:transform .35s cubic-bezier(.45,1,.4,1);transition:transform .35s cubic-bezier(.45,1,.4,1),-webkit-transform .35s cubic-bezier(.45,1,.4,1)}.weui-switch-cp__box:after,.weui-switch:after{content:" ";position:absolute;top:0;left:0;width:30px;height:30px;border-radius:15px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4);-webkit-transition:-webkit-transform .35s cubic-bezier(.4,.4,.25,1.35);transition:-webkit-transform .35s cubic-bezier(.4,.4,.25,1.35);transition:transform .35s cubic-bezier(.4,.4,.25,1.35);transition:transform .35s cubic-bezier(.4,.4,.25,1.35),-webkit-transform .35s cubic-bezier(.4,.4,.25,1.35)}.weui-switch-cp__input:checked~.weui-switch-cp__box,.weui-switch:checked{border-color:#04be02;background-color:#04be02}.weui-switch-cp__input:checked~.weui-switch-cp__box:before,.weui-switch:checked:before{-webkit-transform:scale(0);transform:scale(0)}.weui-switch-cp__input:checked~.weui-switch-cp__box:after,.weui-switch:checked:after{-webkit-transform:translateX(20px);transform:translateX(20px)}.weui-switch-cp__input{position:absolute;left:-9999px}.weui-switch-cp__box{display:block}.weui-uploader__hd{display:-webkit-box;display:-webkit-flex;display:flex;padding-bottom:10px;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-uploader__title{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-uploader__info{color:#b2b2b2}.weui-uploader__bd{margin-bottom:-4px;margin-right:-9px;overflow:hidden}.weui-uploader__files{list-style:none}.weui-uploader__file{float:left;margin-right:9px;margin-bottom:9px;width:79px;height:79px;background:no-repeat 50%;background-size:cover}.weui-uploader__file_status{position:relative}.weui-uploader__file_status:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.5)}.weui-uploader__file_status .weui-uploader__file-content{display:block}.weui-uploader__file-content{display:none;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#fff}.weui-uploader__file-content .weui-icon-warn{display:inline-block}.weui-uploader__input-box{float:left;position:relative;margin-right:9px;margin-bottom:9px;width:77px;height:77px;border:1px solid #d9d9d9}.weui-uploader__input-box:after,.weui-uploader__input-box:before{content:" ";position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:#d9d9d9}.weui-uploader__input-box:before{width:2px;height:39.5px}.weui-uploader__input-box:after{width:39.5px;height:2px}.weui-uploader__input-box:active{border-color:#999}.weui-uploader__input-box:active:after,.weui-uploader__input-box:active:before{background-color:#999}.weui-uploader__input{position:absolute;z-index:1;top:0;left:0;width:100%;height:100%;opacity:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-msg{padding-top:36px;text-align:center}.weui-msg__icon-area{margin-bottom:30px}.weui-msg__text-area{margin-bottom:25px;padding:0 20px}.weui-msg__text-area a{color:#586c94}.weui-msg__title{margin-bottom:5px;font-weight:400;font-size:20px}.weui-msg__desc,.weui-msg__title{word-wrap:break-word;word-break:break-all}.weui-msg__desc{font-size:14px;color:#999}.weui-msg__opr-area{margin-bottom:25px}.weui-msg__extra-area{margin-bottom:15px;font-size:14px;color:#999}.weui-msg__extra-area a{color:#586c94}@media screen and (min-height:438px){.weui-msg__extra-area{position:fixed;left:0;bottom:0;width:100%;text-align:center}}@media only screen and (device-width:375px) and (device-height:812px) and (-webkit-device-pixel-ratio:3){.weui-msg__extra-area{margin-bottom:49px}}.weui-article{padding:20px 15px;font-size:15px}.weui-article section{margin-bottom:1.5em}.weui-article h1{font-size:18px;font-weight:400;margin-bottom:.9em}.weui-article h2{font-size:16px}.weui-article h2,.weui-article h3{font-weight:400;margin-bottom:.34em}.weui-article h3{font-size:15px}.weui-article *{max-width:100%;box-sizing:border-box;word-wrap:break-word}.weui-article p{margin:0 0 .8em}.weui-tabbar{display:-webkit-box;display:-webkit-flex;display:flex;position:absolute;z-index:500;bottom:0;width:100%;background-color:#f7f7fa}.weui-tabbar:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #c0bfc4;color:#c0bfc4;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-tabbar__item{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;padding:5px 0 0;font-size:0;color:#999;text-align:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon,.weui-tabbar__item.weui-bar__item_on .weui-tabbar__icon>i,.weui-tabbar__item.weui-bar__item_on .weui-tabbar__label{color:#09bb07}.weui-tabbar__icon{display:inline-block;width:27px;height:27px}.weui-tabbar__icon>i,i.weui-tabbar__icon{font-size:24px;color:#999}.weui-tabbar__icon img{width:100%;height:100%}.weui-tabbar__label{text-align:center;color:#999;font-size:10px;line-height:1.8}.weui-navbar{display:-webkit-box;display:-webkit-flex;display:flex;position:absolute;z-index:500;top:0;width:100%;background-color:#fafafa}.weui-navbar:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid #ccc;color:#ccc;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-navbar+.weui-tab__panel{padding-top:50px;padding-bottom:0}.weui-navbar__item{position:relative;display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;padding:13px 0;text-align:center;font-size:15px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.weui-navbar__item:active{background-color:#ededed}.weui-navbar__item.weui-bar__item_on{background-color:#eaeaea}.weui-navbar__item:after{content:" ";position:absolute;right:0;top:0;width:1px;bottom:0;border-right:1px solid #ccc;color:#ccc;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-navbar__item:last-child:after{display:none}.weui-tab{position:relative;height:100%}.weui-tab__panel{box-sizing:border-box;height:100%;padding-bottom:50px;overflow:auto;-webkit-overflow-scrolling:touch}.weui-tab__content{display:none}.weui-progress{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-progress__bar{background-color:#ebebeb;height:3px;-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-progress__inner-bar{width:0;height:100%;background-color:#09bb07}.weui-progress__opr{display:block;margin-left:15px;font-size:0}.weui-panel{background-color:#fff;margin-top:10px;position:relative;overflow:hidden}.weui-panel:first-child{margin-top:0}.weui-panel:before{top:0;border-top:1px solid #e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-panel:after,.weui-panel:before{content:" ";position:absolute;left:0;right:0;height:1px;color:#e5e5e5}.weui-panel:after{bottom:0;border-bottom:1px solid #e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-panel__hd{padding:14px 15px 10px;color:#999;font-size:13px;position:relative}.weui-panel__hd:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:15px}.weui-media-box{padding:15px;position:relative}.weui-media-box:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5);left:15px}.weui-media-box:first-child:before{display:none}a.weui-media-box{color:#000;-webkit-tap-highlight-color:rgba(0,0,0,0)}a.weui-media-box:active{background-color:#ececec}.weui-media-box__title{font-weight:400;font-size:17px;width:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap:normal;word-wrap:break-word;word-break:break-all}.weui-media-box__desc{color:#999;font-size:13px;line-height:1.2;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.weui-media-box__info{margin-top:15px;padding-bottom:5px;font-size:13px;color:#cecece;line-height:1em;list-style:none;overflow:hidden}.weui-media-box__info__meta{float:left;padding-right:1em}.weui-media-box__info__meta_extra{padding-left:1em;border-left:1px solid #cecece}.weui-media-box_text .weui-media-box__title{margin-bottom:8px}.weui-media-box_appmsg{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-media-box_appmsg .weui-media-box__hd{margin-right:.8em;width:60px;height:60px;line-height:60px;text-align:center}.weui-media-box_appmsg .weui-media-box__thumb{width:100%;max-height:100%;vertical-align:top}.weui-media-box_appmsg .weui-media-box__bd{-webkit-box-flex:1;-webkit-flex:1;flex:1;min-width:0}.weui-media-box_small-appmsg{padding:0}.weui-media-box_small-appmsg .weui-cells{margin-top:0}.weui-media-box_small-appmsg .weui-cells:before{display:none}.weui-grids{position:relative;overflow:hidden}.weui-grids:before{right:0;height:1px;border-top:1px solid #d9d9d9;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-grids:after,.weui-grids:before{content:" ";position:absolute;left:0;top:0;color:#d9d9d9}.weui-grids:after{width:1px;bottom:0;border-left:1px solid #d9d9d9;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-grid{position:relative;float:left;padding:20px 10px;width:33.33333333%;box-sizing:border-box}.weui-grid:before{top:0;width:1px;border-right:1px solid #d9d9d9;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-grid:after,.weui-grid:before{content:" ";position:absolute;right:0;bottom:0;color:#d9d9d9}.weui-grid:after{left:0;height:1px;border-bottom:1px solid #d9d9d9;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-grid:active{background-color:#ececec}.weui-grid__icon{width:28px;height:28px;margin:0 auto}.weui-grid__icon img{display:block;width:100%;height:100%}.weui-grid__icon+.weui-grid__label{margin-top:5px}.weui-grid__label{display:block;color:#000;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.weui-footer,.weui-grid__label{text-align:center;font-size:14px}.weui-footer{color:#999}.weui-footer a{color:#586c94}.weui-footer_fixed-bottom{position:fixed;bottom:.52em;left:0;right:0}.weui-footer__links{font-size:0}.weui-footer__link{display:inline-block;vertical-align:top;margin:0 .62em;position:relative;font-size:14px}.weui-footer__link:before{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid #c7c7c7;color:#c7c7c7;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5);left:-.65em;top:.36em;bottom:.36em}.weui-footer__link:first-child:before{display:none}.weui-footer__text{padding:0 .34em;font-size:12px}.weui-flex{display:-webkit-box;display:-webkit-flex;display:flex}.weui-flex__item{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-dialog{position:fixed;z-index:5000;width:80%;max-width:300px;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background-color:#fff;text-align:center;border-radius:3px;overflow:hidden}.weui-dialog__hd{padding:1.3em 1.6em .5em}.weui-dialog__title{font-weight:400;font-size:18px}.weui-dialog__bd{padding:0 1.6em .8em;min-height:40px;font-size:15px;line-height:1.3;word-wrap:break-word;word-break:break-all;color:#999}.weui-dialog__bd:first-child{padding:2.7em 20px 1.7em;color:#353535}.weui-dialog__ft{position:relative;line-height:48px;font-size:18px;display:-webkit-box;display:-webkit-flex;display:flex}.weui-dialog__ft:after{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-dialog__btn{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#3cc51f;text-decoration:none;-webkit-tap-highlight-color:rgba(0,0,0,0);position:relative}.weui-dialog__btn:active{background-color:#eee}.weui-dialog__btn:after{content:" ";position:absolute;left:0;top:0;width:1px;bottom:0;border-left:1px solid #d5d5d6;color:#d5d5d6;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.5);transform:scaleX(.5)}.weui-dialog__btn:first-child:after{display:none}.weui-dialog__btn_default{color:#353535}.weui-dialog__btn_primary{color:#0bb20c}.weui-skin_android .weui-dialog{text-align:left;box-shadow:0 6px 30px 0 rgba(0,0,0,.1)}.weui-skin_android .weui-dialog__title{font-size:21px}.weui-skin_android .weui-dialog__hd{text-align:left}.weui-skin_android .weui-dialog__bd{color:#999;padding:.25em 1.6em 2em;font-size:17px;text-align:left}.weui-skin_android .weui-dialog__bd:first-child{padding:1.6em 1.6em 2em;color:#353535}.weui-skin_android .weui-dialog__ft{display:block;text-align:right;line-height:42px;font-size:16px;padding:0 1.6em .7em}.weui-skin_android .weui-dialog__ft:after{display:none}.weui-skin_android .weui-dialog__btn{display:inline-block;vertical-align:top;padding:0 .8em}.weui-skin_android .weui-dialog__btn:after{display:none}.weui-skin_android .weui-dialog__btn:active,.weui-skin_android .weui-dialog__btn:visited{background-color:rgba(0,0,0,.06)}.weui-skin_android .weui-dialog__btn:last-child{margin-right:-.8em}.weui-skin_android .weui-dialog__btn_default{color:gray}@media screen and (min-width:1024px){.weui-dialog{width:35%}}.weui-toast{position:fixed;z-index:5000;width:7.6em;min-height:7.6em;top:180px;left:50%;margin-left:-3.8em;background:hsla(0,0%,7%,.7);text-align:center;border-radius:5px;color:#fff}.weui-icon_toast{margin:22px 0 0;display:block}.weui-icon_toast.weui-icon-success-no-circle:before{color:#fff;font-size:55px}.weui-icon_toast.weui-loading{margin:30px 0 0;width:38px;height:38px;vertical-align:baseline}.weui-toast__content{margin:0 0 15px}.weui-mask{background:rgba(0,0,0,.6)}.weui-mask,.weui-mask_transparent{position:fixed;z-index:1000;top:0;right:0;left:0;bottom:0}.weui-actionsheet{position:fixed;left:0;bottom:0;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:5000;width:100%;background-color:#efeff4;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.weui-actionsheet__title{position:relative;height:65px;padding:0 20px;line-height:1.4;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;text-align:center;font-size:14px;color:#888;background:#fcfcfd}.weui-actionsheet__title:before{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-actionsheet__title .weui-actionsheet__title-text{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.weui-actionsheet__menu{background-color:#fcfcfd}.weui-actionsheet__action{margin-top:6px;background-color:#fcfcfd}.weui-actionsheet__cell{position:relative;padding:10px 0;text-align:center;font-size:18px}.weui-actionsheet__cell:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-actionsheet__cell:active{background-color:#ececec}.weui-actionsheet__cell:first-child:before{display:none}.weui-skin_android .weui-actionsheet{position:fixed;left:50%;top:50%;bottom:auto;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:274px;box-sizing:border-box;-webkit-backface-visibility:hidden;backface-visibility:hidden;background:transparent;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.weui-skin_android .weui-actionsheet__action{display:none}.weui-skin_android .weui-actionsheet__menu{border-radius:2px;box-shadow:0 6px 30px 0 rgba(0,0,0,.1)}.weui-skin_android .weui-actionsheet__cell{padding:13px 24px;font-size:16px;line-height:1.4;text-align:left}.weui-skin_android .weui-actionsheet__cell:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.weui-skin_android .weui-actionsheet__cell:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.weui-actionsheet_toggle{-webkit-transform:translate(0);transform:translate(0)}.weui-loadmore{width:65%;margin:1.5em auto;line-height:1.6em;font-size:14px;text-align:center}.weui-loadmore__tips{display:inline-block;vertical-align:middle}.weui-loadmore_line{border-top:1px solid #e5e5e5;margin-top:2.4em}.weui-loadmore_line .weui-loadmore__tips{position:relative;top:-.9em;padding:0 .55em;background-color:#fff;color:#999}.weui-loadmore_dot .weui-loadmore__tips{padding:0 .16em}.weui-loadmore_dot .weui-loadmore__tips:before{content:" ";width:4px;height:4px;border-radius:50%;background-color:#e5e5e5;display:inline-block;position:relative;vertical-align:0;top:-.16em}.weui-badge{display:inline-block;padding:.15em .4em;min-width:8px;border-radius:18px;background-color:#f43530;color:#fff;line-height:1.2;text-align:center;font-size:12px;vertical-align:middle}.weui-badge_dot{padding:.4em;min-width:0}.weui-search-bar{position:relative;padding:8px 10px;display:-webkit-box;display:-webkit-flex;display:flex;box-sizing:border-box;background-color:#efeff4;-webkit-text-size-adjust:100%;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-search-bar:before{top:0;border-top:1px solid #d7d6dc;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-search-bar:after,.weui-search-bar:before{content:" ";position:absolute;left:0;right:0;height:1px;color:#d7d6dc}.weui-search-bar:after{bottom:0;border-bottom:1px solid #d7d6dc;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-search-bar.weui-search-bar_focusing .weui-search-bar__cancel-btn{display:block}.weui-search-bar.weui-search-bar_focusing .weui-search-bar__label{display:none}.weui-search-bar__form{position:relative;-webkit-box-flex:1;-webkit-flex:auto;flex:auto;background-color:#efeff4}.weui-search-bar__form:after{content:'';position:absolute;left:0;top:0;width:200%;height:200%;-webkit-transform:scale(.5);transform:scale(.5);-webkit-transform-origin:0 0;transform-origin:0 0;border-radius:10px;border:1px solid #e6e6ea;box-sizing:border-box;background:#fff}.weui-search-bar__box{position:relative;padding-left:30px;padding-right:30px;height:100%;width:100%;box-sizing:border-box;z-index:1}.weui-search-bar__box .weui-search-bar__input{padding:4px 0;width:100%;height:1.42857143em;border:0;font-size:14px;line-height:1.42857143em;box-sizing:content-box;background:transparent}.weui-search-bar__box .weui-search-bar__input:focus{outline:none}.weui-search-bar__box .weui-icon-search{position:absolute;top:50%;left:10px;margin-top:-14px;line-height:28px}.weui-search-bar__box .weui-icon-clear{position:absolute;top:50%;right:0;margin-top:-14px;padding:0 10px;line-height:28px}.weui-search-bar__label{position:absolute;top:1px;right:1px;bottom:1px;left:1px;z-index:2;border-radius:3px;text-align:center;color:#9b9b9b;background:#fff}.weui-search-bar__label span{display:inline-block;font-size:14px;vertical-align:middle}.weui-search-bar__label .weui-icon-search{margin-right:5px}.weui-search-bar__cancel-btn{display:none;margin-left:10px;line-height:28px;color:#09bb07;white-space:nowrap}.weui-search-bar__input:not(:valid)~.weui-icon-clear{display:none}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-results-button,input[type=search]::-webkit-search-results-decoration{display:none}.weui-picker{position:fixed;width:100%;left:0;bottom:0;z-index:5000;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%);-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.weui-picker__hd{display:-webkit-box;display:-webkit-flex;display:flex;padding:9px 15px;background-color:#fff;position:relative;text-align:center;font-size:17px}.weui-picker__hd:after{content:" ";position:absolute;left:0;bottom:0;right:0;height:1px;border-bottom:1px solid #e5e5e5;color:#e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-picker__action{display:block;-webkit-box-flex:1;-webkit-flex:1;flex:1;color:#1aad19}.weui-picker__action:first-child{text-align:left;color:#888}.weui-picker__action:last-child{text-align:right}.weui-picker__bd{display:-webkit-box;display:-webkit-flex;display:flex;position:relative;background-color:#fff;height:238px;overflow:hidden}.weui-picker__group{-webkit-box-flex:1;-webkit-flex:1;flex:1;position:relative;height:100%}.weui-picker__mask{top:0;height:100%;margin:0 auto;background:-webkit-linear-gradient(top,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),-webkit-linear-gradient(bottom,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background:linear-gradient(180deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6)),linear-gradient(0deg,hsla(0,0%,100%,.95),hsla(0,0%,100%,.6));background-position:top,bottom;background-size:100% 102px;background-repeat:no-repeat;-webkit-transform:translateZ(0);transform:translateZ(0)}.weui-picker__indicator,.weui-picker__mask{position:absolute;left:0;width:100%;z-index:3}.weui-picker__indicator{height:34px;top:102px}.weui-picker__indicator:before{top:0;border-top:1px solid #e5e5e5;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-picker__indicator:after,.weui-picker__indicator:before{content:" ";position:absolute;left:0;right:0;height:1px;color:#e5e5e5}.weui-picker__indicator:after{bottom:0;border-bottom:1px solid #e5e5e5;-webkit-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.weui-picker__content{position:absolute;top:0;left:0;width:100%}.weui-picker__item{padding:0;height:34px;line-height:34px;text-align:center;color:#000;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.weui-picker__item_disabled{color:#999}@-webkit-keyframes a{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes a{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.weui-animate-slide-up{-webkit-animation:a ease .3s forwards;animation:a ease .3s forwards}@-webkit-keyframes b{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes b{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.weui-animate-slide-down{-webkit-animation:b ease .3s forwards;animation:b ease .3s forwards}@-webkit-keyframes c{0%{opacity:0}to{opacity:1}}@keyframes c{0%{opacity:0}to{opacity:1}}.weui-animate-fade-in{-webkit-animation:c ease .3s forwards;animation:c ease .3s forwards}@-webkit-keyframes d{0%{opacity:1}to{opacity:0}}@keyframes d{0%{opacity:1}to{opacity:0}}.weui-animate-fade-out{-webkit-animation:d ease .3s forwards;animation:d ease .3s forwards}.weui-agree{display:block;padding:.5em 15px;font-size:13px}.weui-agree a{color:#586c94}.weui-agree__text{color:#999}.weui-agree__checkbox{-webkit-appearance:none;appearance:none;outline:0;font-size:0;border:1px solid #d1d1d1;background-color:#fff;border-radius:3px;width:13px;height:13px;position:relative;vertical-align:0;top:2px}.weui-agree__checkbox:checked:before{font-family:weui;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-align:center;speak:none;display:inline-block;vertical-align:middle;text-decoration:inherit;content:"\EA08";color:#09bb07;font-size:13px;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-48%) scale(.73);transform:translate(-50%,-48%) scale(.73)}.weui-agree__checkbox:disabled{background-color:#e1e1e1}.weui-agree__checkbox:disabled:before{color:#adadad}.weui-loading{width:20px;height:20px;display:inline-block;vertical-align:middle;-webkit-animation:e 1s steps(12) infinite;animation:e 1s steps(12) infinite;background:transparent url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E9E9E9' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23989697' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%239B999A' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23A3A1A2' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23ABA9AA' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23B2B2B2' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23BAB8B9' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23C2C0C1' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23CBCBCB' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23D2D2D2' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23DADADA' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='%23E2E2E2' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E") no-repeat;background-size:100%}.weui-btn_loading.weui-btn_primary .weui-loading,.weui-btn_loading.weui-btn_warn .weui-loading,.weui-loading.weui-loading_transparent{background-image:url("data:image/svg+xml;charset=utf8, %3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect xmlns='http://www.w3.org/2000/svg' width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.56)' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.5)' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.43)' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.38)' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.32)' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.28)' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.25)' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.2)' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.17)' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.14)' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.1)' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.03)' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E")}@-webkit-keyframes e{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes e{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.weui-slider{padding:15px 18px;-webkit-user-select:none;user-select:none}.weui-slider__inner{position:relative;height:2px;background-color:#e9e9e9}.weui-slider__track{height:2px;background-color:#1aad19;width:0}.weui-slider__handler{position:absolute;left:0;top:50%;width:28px;height:28px;margin-left:-14px;margin-top:-14px;border-radius:50%;background-color:#fff;box-shadow:0 0 4px rgba(0,0,0,.2)}.weui-slider-box{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.weui-slider-box .weui-slider{-webkit-box-flex:1;-webkit-flex:1;flex:1}.weui-slider-box__value{margin-left:.5em;min-width:24px;color:#888;text-align:center;font-size:14px}
\ No newline at end of file
diff --git a/oauth/src/main/resources/static/img/icon_header.png b/oauth/src/main/resources/static/img/icon_header.png
new file mode 100644
index 0000000..b3a7ebe
--- /dev/null
+++ b/oauth/src/main/resources/static/img/icon_header.png
Binary files differ
diff --git a/oauth/src/main/resources/static/js/jquery-2.1.4.js b/oauth/src/main/resources/static/js/jquery-2.1.4.js
new file mode 100644
index 0000000..eed1777
--- /dev/null
+++ b/oauth/src/main/resources/static/js/jquery-2.1.4.js
@@ -0,0 +1,9210 @@
+/*!
+ * jQuery JavaScript Library v2.1.4
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-04-28T16:01Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+//
+
+var arr = [];
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.4",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ // adding 1 corrects loss of precision from parseFloat (#15100)
+ return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ // Support: Android<4.0, iOS<6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Support: IE9-11+
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+
+ // Support: iOS 8.2 (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = "length" in obj && obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.0-pre
+ * http://sizzlejs.com/
+ *
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-12-16
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // http://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+ nodeType = context.nodeType;
+
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ if ( !seed && documentIsHTML ) {
+
+ // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType !== 1 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, parent,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+ parent = doc.defaultView;
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", unloadHandler, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Support tests
+ ---------------------------------------------------------------------- */
+ documentIsHTML = !isXML( doc );
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
+ "<select id='" + expando + "-\f]' msallowcapture=''>" +
+ "<option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibing-combinator selector` fails
+ if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "<input/>";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Support: Blackberry 4.6
+ // gEBID returns nodes no longer in the document (#6963)
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // Add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // If we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+});
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // We once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+function Data() {
+ // Support: Android<4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
+
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
+
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
+
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
+
+ // Support: Android<4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
+ }
+
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
+ }
+};
+var data_priv = new Data();
+
+var data_user = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend({
+ hasData: function( elem ) {
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return data_user.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ data_user.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return data_priv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ data_priv.remove( elem, name );
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = data_user.get( elem );
+
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ data_priv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ data_user.set( this, key );
+ });
+ }
+
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
+ }
+});
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = data_priv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Safari<=5.1
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari<=5.1, Android<4.2
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<=11+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome<28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android<4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && e.preventDefault ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// Support: Firefox, Chrome, Safari
+// Create "bubbling" focus and blur events
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+
+ // Support: IE9
+ 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, "", "" ]
+ };
+
+// Support: IE9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ data_user.set( dest, udataCur );
+ }
+}
+
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Fix IE cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit, PhantomJS
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: QtWebKit, PhantomJS
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ remove: function( selector, keepData /* Internal Use Only */ ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var arg = arguments[ 0 ];
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ arg = this.parentNode;
+
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
+ }
+ });
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+
+var iframe,
+ elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+ // Use of this method is a temporary fix (more like optimization) until something better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
+
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
+
+ return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
+
+ // Support: IE
+ doc.write();
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+ // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+ // IE throws on elements created in popups
+ // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+ if ( elem.ownerDocument.defaultView.opener ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ }
+
+ return window.getComputedStyle( elem, null );
+ };
+
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') (#12537)
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due
+ // to missing dependency), remove it.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+ return (this.get = hookFn).apply( this, arguments );
+ }
+ };
+}
+
+
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ if ( !div.style ) {
+ return;
+ }
+
+ // Support: IE9-11+
+ // Style of cloned element affects source element cloned (#8908)
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
+
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
+
+ docElem.removeChild( container );
+ }
+
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
+
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
+ }
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+ div.removeChild( marginDiv );
+
+ return ret;
+ }
+ });
+ }
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var
+ // Swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// Return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // Shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // Check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // Both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // At this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // At this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // At this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // Some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // Check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // Use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = data_priv.get( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ }
+ } else {
+ hidden = isHidden( elem );
+
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.extend({
+
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ "float": "cssFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // Gets hook for the prefixed version, then unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // Convert "+=" or "-=" to relative numbers (#7345)
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set (#7116)
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Support: IE9-11+
+ // background-* props affect original clone's values
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+ style[ name ] = value;
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // Try prefixed name followed by the unprefixed name
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ // Convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Make numeric if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+
+ // Certain elements can have dimension info if we invisibly show them
+ // but it must have a current display style that would benefit
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
+ if ( computed ) {
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // Assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // Passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails.
+ // Simple values such as "10px" are parsed to Float;
+ // complex values such as "rotate(1rad)" are returned as-is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // Use step hook for back compat.
+ // Use cssHook if its there.
+ // Use .style if available and use plain properties where available.
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur(),
+ // break the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ } ]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // If we include width, step value is 1 to do all cssExpand values,
+ // otherwise step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // We're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // Handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // Ensure the complete handler is called before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // Height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
+
+ // Store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+ style.display = display;
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // Not quite $.extend, this won't overwrite existing keys.
+ // Reusing 'index' because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // Don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // Support: Android 2.3
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // If we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // Resolve when we played the last frame; otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // Normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // Show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // Animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Start the next in the queue if the last step wasn't forced.
+ // Timers currently will call their complete callbacks, which
+ // will dequeue but only if they were gotoEnd.
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // Enable finishing flag on private data
+ data.finish = true;
+
+ // Empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // Look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // Turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS<=5.1, Android<=4.2+
+ // Default value for a checkbox should be "on"
+ support.checkOn = input.value !== "";
+
+ // Support: IE<=11+
+ // Must access selectedIndex to make default options select
+ support.optSelected = opt.selected;
+
+ // Support: Android<=2.3
+ // Options inside disabled selects are incorrectly marked as disabled
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Support: IE<=11+
+ // An input loses its value after becoming a radio
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
+ }
+});
+
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // Don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
+ }
+});
+
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // Toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // Check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed `false`,
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // Handle most common string cases
+ ret.replace(rreturn, "") :
+ // Handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // Force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.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( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat( "*" ),
+
+ // Document location
+ ajaxLocation = window.location.href,
+
+ // Segment location into parts
+ ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+ fireGlobals = jQuery.event && s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // Aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // Extract error from statusText and normalize for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // Shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+// See https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+ window.attachEvent( "onunload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
+ }
+ });
+}
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+ var callback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
+
+ xhr.open( options.type, options.url, options.async, options.username, options.password );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
+
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery("<script>").prop({
+ async: true,
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ }
+ );
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = jQuery.trim( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+});
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+};
+
+
+
+
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
+}
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+ // Need to be able to calculate position if either
+ // top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend({
+ offset: function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ elem = this[ 0 ],
+ box = { top: 0, left: 0 },
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // Support: BlackBerry 5, iOS 3 (original iPhone)
+ // If we don't have gBCR, just use 0,0 rather than error
+ if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + win.pageYOffset - docElem.clientTop,
+ left: box.left + win.pageXOffset - docElem.clientLeft
+ };
+ },
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // Assume getBoundingClientRect is there when computed position is fixed
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || docElem;
+
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || docElem;
+ });
+ }
+});
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : window.pageXOffset,
+ top ? val : window.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+// Support: Safari<7+, Chrome<37+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // If curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+});
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // Margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ });
+}
+
+
+
+
+var
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/oauth/src/main/resources/static/js/jquery-weui.min.js b/oauth/src/main/resources/static/js/jquery-weui.min.js
new file mode 100755
index 0000000..38b8d10
--- /dev/null
+++ b/oauth/src/main/resources/static/js/jquery-weui.min.js
@@ -0,0 +1,13 @@
+/**
+* jQuery WeUI V1.2.1
+* By 言川
+* http://lihongxun945.github.io/jquery-weui/
+ */
+!function(t){"use strict";t.fn.transitionEnd=function(t){function e(r){if(r.target===this)for(t.call(this,r),n=0;n<i.length;n++)a.off(i[n],e)}var n,i=["webkitTransitionEnd","transitionend","oTransitionEnd","MSTransitionEnd","msTransitionEnd"],a=this;if(t)for(n=0;n<i.length;n++)a.on(i[n],e);return this},t.support=function(){var t={touch:!!("ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch)};return t}(),t.touchEvents={start:t.support.touch?"touchstart":"mousedown",move:t.support.touch?"touchmove":"mousemove",end:t.support.touch?"touchend":"mouseup"},t.getTouchPosition=function(t){return t=t.originalEvent||t,"touchstart"===t.type||"touchmove"===t.type||"touchend"===t.type?{x:t.targetTouches[0].pageX,y:t.targetTouches[0].pageY}:{x:t.pageX,y:t.pageY}},t.fn.scrollHeight=function(){return this[0].scrollHeight},t.fn.transform=function(t){for(var e=0;e<this.length;e++){var n=this[e].style;n.webkitTransform=n.MsTransform=n.msTransform=n.MozTransform=n.OTransform=n.transform=t}return this},t.fn.transition=function(t){"string"!=typeof t&&(t+="ms");for(var e=0;e<this.length;e++){var n=this[e].style;n.webkitTransitionDuration=n.MsTransitionDuration=n.msTransitionDuration=n.MozTransitionDuration=n.OTransitionDuration=n.transitionDuration=t}return this},t.getTranslate=function(t,e){var n,i,a,r;return"undefined"==typeof e&&(e="x"),a=window.getComputedStyle(t,null),window.WebKitCSSMatrix?r=new WebKitCSSMatrix("none"===a.webkitTransform?"":a.webkitTransform):(r=a.MozTransform||a.OTransform||a.MsTransform||a.msTransform||a.transform||a.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,"),n=r.toString().split(",")),"x"===e&&(i=window.WebKitCSSMatrix?r.m41:16===n.length?parseFloat(n[12]):parseFloat(n[4])),"y"===e&&(i=window.WebKitCSSMatrix?r.m42:16===n.length?parseFloat(n[13]):parseFloat(n[5])),i||0},t.requestAnimationFrame=function(t){return window.requestAnimationFrame?window.requestAnimationFrame(t):window.webkitRequestAnimationFrame?window.webkitRequestAnimationFrame(t):window.mozRequestAnimationFrame?window.mozRequestAnimationFrame(t):window.setTimeout(t,1e3/60)},t.cancelAnimationFrame=function(t){return window.cancelAnimationFrame?window.cancelAnimationFrame(t):window.webkitCancelAnimationFrame?window.webkitCancelAnimationFrame(t):window.mozCancelAnimationFrame?window.mozCancelAnimationFrame(t):window.clearTimeout(t)},t.fn.join=function(t){return this.toArray().join(t)}}($),+function(t){"use strict";t.Template7=t.t7=function(){function t(t){return"[object Array]"===Object.prototype.toString.apply(t)}function e(t){return"function"==typeof t}function n(t){var e,n,i,a=t.replace(/[{}#}]/g,"").split(" "),r=[];for(n=0;n<a.length;n++){var o=a[n];if(0===n)r.push(o);else if(0===o.indexOf('"'))if(2===o.match(/"/g).length)r.push(o);else{for(e=0,i=n+1;i<a.length;i++)if(o+=" "+a[i],a[i].indexOf('"')>=0){e=i,r.push(o);break}e&&(n=e)}else if(o.indexOf("=")>0){var s=o.split("="),c=s[0],l=s[1];if(2!==l.match(/"/g).length){for(e=0,i=n+1;i<a.length;i++)if(l+=" "+a[i],a[i].indexOf('"')>=0){e=i;break}e&&(n=e)}var u=[c,l.replace(/"/g,"")];r.push(u)}else r.push(o)}return r}function i(e){var i,a,r=[];if(!e)return[];var o=e.split(/({{[^{^}]*}})/);for(i=0;i<o.length;i++){var s=o[i];if(""!==s)if(s.indexOf("{{")<0)r.push({type:"plain",content:s});else{if(s.indexOf("{/")>=0)continue;if(s.indexOf("{#")<0&&s.indexOf(" ")<0&&s.indexOf("else")<0){r.push({type:"variable",contextName:s.replace(/[{}]/g,"")});continue}var c=n(s),l=c[0],u=[],p={};for(a=1;a<c.length;a++){var h=c[a];t(h)?p[h[0]]="false"!==h[1]&&h[1]:u.push(h)}if(s.indexOf("{#")>=0){var d,f="",m="",v=0,g=!1,w=!1,y=0;for(a=i+1;a<o.length;a++)if(o[a].indexOf("{{#")>=0&&y++,o[a].indexOf("{{/")>=0&&y--,o[a].indexOf("{{#"+l)>=0)f+=o[a],w&&(m+=o[a]),v++;else if(o[a].indexOf("{{/"+l)>=0){if(!(v>0)){d=a,g=!0;break}v--,f+=o[a],w&&(m+=o[a])}else o[a].indexOf("else")>=0&&0===y?w=!0:(w||(f+=o[a]),w&&(m+=o[a]));g&&(d&&(i=d),r.push({type:"helper",helperName:l,contextName:u,content:f,inverseContent:m,hash:p}))}else s.indexOf(" ")>0&&r.push({type:"helper",helperName:l,contextName:u,hash:p})}}return r}var a=function(t){function e(t,e){return t.content?o(t.content,e):function(){return""}}function n(t,e){return t.inverseContent?o(t.inverseContent,e):function(){return""}}function a(t,e){var n,i,a=0;if(0===t.indexOf("../")){a=t.split("../").length-1;var r=e.split("_")[1]-a;e="ctx_"+(r>=1?r:1),i=t.split("../")[a].split(".")}else 0===t.indexOf("@global")?(e="$.Template7.global",i=t.split("@global.")[1].split(".")):0===t.indexOf("@root")?(e="ctx_1",i=t.split("@root.")[1].split(".")):i=t.split(".");n=e;for(var o=0;o<i.length;o++){var s=i[o];0===s.indexOf("@")?o>0?n+="[(data && data."+s.replace("@","")+")]":n="(data && data."+t.replace("@","")+")":isFinite(s)?n+="["+s+"]":0===s.indexOf("this")?n=s.replace("this",e):n+="."+s}return n}function r(t,e){for(var n=[],i=0;i<t.length;i++)0===t[i].indexOf('"')?n.push(t[i]):n.push(a(t[i],e));return n.join(", ")}function o(t,o){if(o=o||1,t=t||s.template,"string"!=typeof t)throw new Error("Template7: Template must be a string");var c=i(t);if(0===c.length)return function(){return""};var l="ctx_"+o,u="(function ("+l+", data) {\n";1===o&&(u+="function isArray(arr){return Object.prototype.toString.apply(arr) === '[object Array]';}\n",u+="function isFunction(func){return (typeof func === 'function');}\n",u+='function c(val, ctx) {if (typeof val !== "undefined") {if (isFunction(val)) {return val.call(ctx);} else return val;} else return "";}\n'),u+="var r = '';\n";var p;for(p=0;p<c.length;p++){var h=c[p];if("plain"!==h.type){var d,f;if("variable"===h.type&&(d=a(h.contextName,l),u+="r += c("+d+", "+l+");"),"helper"===h.type)if(h.helperName in s.helpers)f=r(h.contextName,l),u+="r += ($.Template7.helpers."+h.helperName+").call("+l+", "+(f&&f+", ")+"{hash:"+JSON.stringify(h.hash)+", data: data || {}, fn: "+e(h,o+1)+", inverse: "+n(h,o+1)+", root: ctx_1});";else{if(h.contextName.length>0)throw new Error('Template7: Missing helper: "'+h.helperName+'"');d=a(h.helperName,l),u+="if ("+d+") {",u+="if (isArray("+d+")) {",u+="r += ($.Template7.helpers.each).call("+l+", "+d+", {hash:"+JSON.stringify(h.hash)+", data: data || {}, fn: "+e(h,o+1)+", inverse: "+n(h,o+1)+", root: ctx_1});",u+="}else {",u+="r += ($.Template7.helpers.with).call("+l+", "+d+", {hash:"+JSON.stringify(h.hash)+", data: data || {}, fn: "+e(h,o+1)+", inverse: "+n(h,o+1)+", root: ctx_1});",u+="}}"}}else u+="r +='"+h.content.replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/'/g,"\\'")+"';"}return u+="\nreturn r;})",eval.call(window,u)}var s=this;s.template=t,s.compile=function(t){return s.compiled||(s.compiled=o(t)),s.compiled}};a.prototype={options:{},helpers:{"if":function(t,n){return e(t)&&(t=t.call(this)),t?n.fn(this,n.data):n.inverse(this,n.data)},unless:function(t,n){return e(t)&&(t=t.call(this)),t?n.inverse(this,n.data):n.fn(this,n.data)},each:function(n,i){var a="",r=0;if(e(n)&&(n=n.call(this)),t(n)){for(i.hash.reverse&&(n=n.reverse()),r=0;r<n.length;r++)a+=i.fn(n[r],{first:0===r,last:r===n.length-1,index:r});i.hash.reverse&&(n=n.reverse())}else for(var o in n)r++,a+=i.fn(n[o],{key:o});return r>0?a:i.inverse(this)},"with":function(t,n){return e(t)&&(t=t.call(this)),n.fn(t)},join:function(t,n){return e(t)&&(t=t.call(this)),t.join(n.hash.delimiter||n.hash.delimeter)},js:function(t,e){var n;return n=t.indexOf("return")>=0?"(function(){"+t+"})":"(function(){return ("+t+")})",eval.call(this,n).call(this)},js_compare:function(t,e){var n;n=t.indexOf("return")>=0?"(function(){"+t+"})":"(function(){return ("+t+")})";var i=eval.call(this,n).call(this);return i?e.fn(this,e.data):e.inverse(this,e.data)}}};var r=function(t,e){if(2===arguments.length){var n=new a(t),i=n.compile()(e);return n=null,i}return new a(t)};return r.registerHelper=function(t,e){a.prototype.helpers[t]=e},r.unregisterHelper=function(t){a.prototype.helpers[t]=void 0,delete a.prototype.helpers[t]},r.compile=function(t,e){var n=new a(t,e);return n.compile()},r.options=a.prototype.options,r.helpers=a.prototype.helpers,r}()}($),/*! Hammer.JS - v2.0.8 - 2016-04-23
+ * http://hammerjs.github.io/
+ *
+ * Copyright (c) 2016 Jorik Tangelder;
+ * Licensed under the MIT license */
+function(t,e,n,i){"use strict";function a(t,e,n){return setTimeout(l(t,n),e)}function r(t,e,n){return!!Array.isArray(t)&&(o(t,n[e],n),!0)}function o(t,e,n){var a;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==i)for(a=0;a<t.length;)e.call(n,t[a],a,t),a++;else for(a in t)t.hasOwnProperty(a)&&e.call(n,t[a],a,t)}function s(e,n,i){var a="DEPRECATED METHOD: "+n+"\n"+i+" AT \n";return function(){var n=new Error("get-stack-trace"),i=n&&n.stack?n.stack.replace(/^[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^Object.<anonymous>\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",r=t.console&&(t.console.warn||t.console.log);return r&&r.call(t.console,a,i),e.apply(this,arguments)}}function c(t,e,n){var i,a=e.prototype;i=t.prototype=Object.create(a),i.constructor=t,i._super=a,n&&pt(i,n)}function l(t,e){return function(){return t.apply(e,arguments)}}function u(t,e){return typeof t==ft?t.apply(e?e[0]||i:i,e):t}function p(t,e){return t===i?e:t}function h(t,e,n){o(v(e),function(e){t.addEventListener(e,n,!1)})}function d(t,e,n){o(v(e),function(e){t.removeEventListener(e,n,!1)})}function f(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function m(t,e){return t.indexOf(e)>-1}function v(t){return t.trim().split(/\s+/g)}function g(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var i=0;i<t.length;){if(n&&t[i][n]==e||!n&&t[i]===e)return i;i++}return-1}function w(t){return Array.prototype.slice.call(t,0)}function y(t,e,n){for(var i=[],a=[],r=0;r<t.length;){var o=e?t[r][e]:t[r];g(a,o)<0&&i.push(t[r]),a[r]=o,r++}return n&&(i=e?i.sort(function(t,n){return t[e]>n[e]}):i.sort()),i}function T(t,e){for(var n,a,r=e[0].toUpperCase()+e.slice(1),o=0;o<ht.length;){if(n=ht[o],a=n?n+r:e,a in t)return a;o++}return i}function k(){return Tt++}function x(e){var n=e.ownerDocument||e;return n.defaultView||n.parentWindow||t}function C(t,e){var n=this;this.manager=t,this.callback=e,this.element=t.element,this.target=t.options.inputTarget,this.domHandler=function(e){u(t.options.enable,[t])&&n.handler(e)},this.init()}function b(t){var e,n=t.options.inputClass;return new(e=n?n:Ct?F:bt?z:xt?j:N)(t,M)}function M(t,e,n){var i=n.pointers.length,a=n.changedPointers.length,r=e&Ot&&i-a===0,o=e&(It|Ht)&&i-a===0;n.isFirst=!!r,n.isFinal=!!o,r&&(t.session={}),n.eventType=e,_(t,n),t.emit("hammer.input",n),t.recognize(n),t.session.prevInput=n}function _(t,e){var n=t.session,i=e.pointers,a=i.length;n.firstInput||(n.firstInput=P(e)),a>1&&!n.firstMultiple?n.firstMultiple=P(e):1===a&&(n.firstMultiple=!1);var r=n.firstInput,o=n.firstMultiple,s=o?o.center:r.center,c=e.center=O(i);e.timeStamp=gt(),e.deltaTime=e.timeStamp-r.timeStamp,e.angle=S(s,c),e.distance=H(s,c),E(n,e),e.offsetDirection=I(e.deltaX,e.deltaY);var l=A(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=l.x,e.overallVelocityY=l.y,e.overallVelocity=vt(l.x)>vt(l.y)?l.x:l.y,e.scale=o?V(o.pointers,i):1,e.rotation=o?Y(o.pointers,i):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,D(n,e);var u=t.element;f(e.srcEvent.target,u)&&(u=e.srcEvent.target),e.target=u}function E(t,e){var n=e.center,i=t.offsetDelta||{},a=t.prevDelta||{},r=t.prevInput||{};e.eventType!==Ot&&r.eventType!==It||(a=t.prevDelta={x:r.deltaX||0,y:r.deltaY||0},i=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=a.x+(n.x-i.x),e.deltaY=a.y+(n.y-i.y)}function D(t,e){var n,a,r,o,s=t.lastInterval||e,c=e.timeStamp-s.timeStamp;if(e.eventType!=Ht&&(c>Pt||s.velocity===i)){var l=e.deltaX-s.deltaX,u=e.deltaY-s.deltaY,p=A(c,l,u);a=p.x,r=p.y,n=vt(p.x)>vt(p.y)?p.x:p.y,o=I(l,u),t.lastInterval=e}else n=s.velocity,a=s.velocityX,r=s.velocityY,o=s.direction;e.velocity=n,e.velocityX=a,e.velocityY=r,e.direction=o}function P(t){for(var e=[],n=0;n<t.pointers.length;)e[n]={clientX:mt(t.pointers[n].clientX),clientY:mt(t.pointers[n].clientY)},n++;return{timeStamp:gt(),pointers:e,center:O(e),deltaX:t.deltaX,deltaY:t.deltaY}}function O(t){var e=t.length;if(1===e)return{x:mt(t[0].clientX),y:mt(t[0].clientY)};for(var n=0,i=0,a=0;a<e;)n+=t[a].clientX,i+=t[a].clientY,a++;return{x:mt(n/e),y:mt(i/e)}}function A(t,e,n){return{x:e/t||0,y:n/t||0}}function I(t,e){return t===e?St:vt(t)>=vt(e)?t<0?Yt:Vt:e<0?Nt:Ft}function H(t,e,n){n||(n=Lt);var i=e[n[0]]-t[n[0]],a=e[n[1]]-t[n[1]];return Math.sqrt(i*i+a*a)}function S(t,e,n){n||(n=Lt);var i=e[n[0]]-t[n[0]],a=e[n[1]]-t[n[1]];return 180*Math.atan2(a,i)/Math.PI}function Y(t,e){return S(e[1],e[0],jt)+S(t[1],t[0],jt)}function V(t,e){return H(e[0],e[1],jt)/H(t[0],t[1],jt)}function N(){this.evEl=$t,this.evWin=Wt,this.pressed=!1,C.apply(this,arguments)}function F(){this.evEl=Bt,this.evWin=Gt,C.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function R(){this.evTarget=Zt,this.evWin=Qt,this.started=!1,C.apply(this,arguments)}function q(t,e){var n=w(t.touches),i=w(t.changedTouches);return e&(It|Ht)&&(n=y(n.concat(i),"identifier",!0)),[n,i]}function z(){this.evTarget=ee,this.targetIds={},C.apply(this,arguments)}function L(t,e){var n=w(t.touches),i=this.targetIds;if(e&(Ot|At)&&1===n.length)return i[n[0].identifier]=!0,[n,n];var a,r,o=w(t.changedTouches),s=[],c=this.target;if(r=n.filter(function(t){return f(t.target,c)}),e===Ot)for(a=0;a<r.length;)i[r[a].identifier]=!0,a++;for(a=0;a<o.length;)i[o[a].identifier]&&s.push(o[a]),e&(It|Ht)&&delete i[o[a].identifier],a++;return s.length?[y(r.concat(s),"identifier",!0),s]:void 0}function j(){C.apply(this,arguments);var t=l(this.handler,this);this.touch=new z(this.manager,t),this.mouse=new N(this.manager,t),this.primaryTouch=null,this.lastTouches=[]}function X(t,e){t&Ot?(this.primaryTouch=e.changedPointers[0].identifier,$.call(this,e)):t&(It|Ht)&&$.call(this,e)}function $(t){var e=t.changedPointers[0];if(e.identifier===this.primaryTouch){var n={x:e.clientX,y:e.clientY};this.lastTouches.push(n);var i=this.lastTouches,a=function(){var t=i.indexOf(n);t>-1&&i.splice(t,1)};setTimeout(a,ne)}}function W(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,i=0;i<this.lastTouches.length;i++){var a=this.lastTouches[i],r=Math.abs(e-a.x),o=Math.abs(n-a.y);if(r<=ie&&o<=ie)return!0}return!1}function K(t,e){this.manager=t,this.set(e)}function U(t){if(m(t,le))return le;var e=m(t,ue),n=m(t,pe);return e&&n?le:e||n?e?ue:pe:m(t,ce)?ce:se}function B(){if(!re)return!1;var e={},n=t.CSS&&t.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach(function(i){e[i]=!n||t.CSS.supports("touch-action",i)}),e}function G(t){this.options=pt({},this.defaults,t||{}),this.id=k(),this.manager=null,this.options.enable=p(this.options.enable,!0),this.state=de,this.simultaneous={},this.requireFail=[]}function J(t){return t&we?"cancel":t&ve?"end":t&me?"move":t&fe?"start":""}function Z(t){return t==Ft?"down":t==Nt?"up":t==Yt?"left":t==Vt?"right":""}function Q(t,e){var n=e.manager;return n?n.get(t):t}function tt(){G.apply(this,arguments)}function et(){tt.apply(this,arguments),this.pX=null,this.pY=null}function nt(){tt.apply(this,arguments)}function it(){G.apply(this,arguments),this._timer=null,this._input=null}function at(){tt.apply(this,arguments)}function rt(){tt.apply(this,arguments)}function ot(){G.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function st(t,e){return e=e||{},e.recognizers=p(e.recognizers,st.defaults.preset),new ct(t,e)}function ct(t,e){this.options=pt({},st.defaults,e||{}),this.options.inputTarget=this.options.inputTarget||t,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=t,this.input=b(this),this.touchAction=new K(this,this.options.touchAction),lt(this,!0),o(this.options.recognizers,function(t){var e=this.add(new t[0](t[1]));t[2]&&e.recognizeWith(t[2]),t[3]&&e.requireFailure(t[3])},this)}function lt(t,e){var n=t.element;if(n.style){var i;o(t.options.cssProps,function(a,r){i=T(n.style,r),e?(t.oldCssProps[i]=n.style[i],n.style[i]=a):n.style[i]=t.oldCssProps[i]||""}),e||(t.oldCssProps={})}}function ut(t,n){var i=e.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=n,n.target.dispatchEvent(i)}var pt,ht=["","webkit","Moz","MS","ms","o"],dt=e.createElement("div"),ft="function",mt=Math.round,vt=Math.abs,gt=Date.now;pt="function"!=typeof Object.assign?function(t){if(t===i||null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),n=1;n<arguments.length;n++){var a=arguments[n];if(a!==i&&null!==a)for(var r in a)a.hasOwnProperty(r)&&(e[r]=a[r])}return e}:Object.assign;var wt=s(function(t,e,n){for(var a=Object.keys(e),r=0;r<a.length;)(!n||n&&t[a[r]]===i)&&(t[a[r]]=e[a[r]]),r++;return t},"extend","Use `assign`."),yt=s(function(t,e){return wt(t,e,!0)},"merge","Use `assign`."),Tt=1,kt=/mobile|tablet|ip(ad|hone|od)|android/i,xt="ontouchstart"in t,Ct=T(t,"PointerEvent")!==i,bt=xt&&kt.test(navigator.userAgent),Mt="touch",_t="pen",Et="mouse",Dt="kinect",Pt=25,Ot=1,At=2,It=4,Ht=8,St=1,Yt=2,Vt=4,Nt=8,Ft=16,Rt=Yt|Vt,qt=Nt|Ft,zt=Rt|qt,Lt=["x","y"],jt=["clientX","clientY"];C.prototype={handler:function(){},init:function(){this.evEl&&h(this.element,this.evEl,this.domHandler),this.evTarget&&h(this.target,this.evTarget,this.domHandler),this.evWin&&h(x(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&d(this.element,this.evEl,this.domHandler),this.evTarget&&d(this.target,this.evTarget,this.domHandler),this.evWin&&d(x(this.element),this.evWin,this.domHandler)}};var Xt={mousedown:Ot,mousemove:At,mouseup:It},$t="mousedown",Wt="mousemove mouseup";c(N,C,{handler:function(t){var e=Xt[t.type];e&Ot&&0===t.button&&(this.pressed=!0),e&At&&1!==t.which&&(e=It),this.pressed&&(e&It&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:Et,srcEvent:t}))}});var Kt={pointerdown:Ot,pointermove:At,pointerup:It,pointercancel:Ht,pointerout:Ht},Ut={2:Mt,3:_t,4:Et,5:Dt},Bt="pointerdown",Gt="pointermove pointerup pointercancel";t.MSPointerEvent&&!t.PointerEvent&&(Bt="MSPointerDown",Gt="MSPointerMove MSPointerUp MSPointerCancel"),c(F,C,{handler:function(t){var e=this.store,n=!1,i=t.type.toLowerCase().replace("ms",""),a=Kt[i],r=Ut[t.pointerType]||t.pointerType,o=r==Mt,s=g(e,t.pointerId,"pointerId");a&Ot&&(0===t.button||o)?s<0&&(e.push(t),s=e.length-1):a&(It|Ht)&&(n=!0),s<0||(e[s]=t,this.callback(this.manager,a,{pointers:e,changedPointers:[t],pointerType:r,srcEvent:t}),n&&e.splice(s,1))}});var Jt={touchstart:Ot,touchmove:At,touchend:It,touchcancel:Ht},Zt="touchstart",Qt="touchstart touchmove touchend touchcancel";c(R,C,{handler:function(t){var e=Jt[t.type];if(e===Ot&&(this.started=!0),this.started){var n=q.call(this,t,e);e&(It|Ht)&&n[0].length-n[1].length===0&&(this.started=!1),this.callback(this.manager,e,{pointers:n[0],changedPointers:n[1],pointerType:Mt,srcEvent:t})}}});var te={touchstart:Ot,touchmove:At,touchend:It,touchcancel:Ht},ee="touchstart touchmove touchend touchcancel";c(z,C,{handler:function(t){var e=te[t.type],n=L.call(this,t,e);n&&this.callback(this.manager,e,{pointers:n[0],changedPointers:n[1],pointerType:Mt,srcEvent:t})}});var ne=2500,ie=25;c(j,C,{handler:function(t,e,n){var i=n.pointerType==Mt,a=n.pointerType==Et;if(!(a&&n.sourceCapabilities&&n.sourceCapabilities.firesTouchEvents)){if(i)X.call(this,e,n);else if(a&&W.call(this,n))return;this.callback(t,e,n)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var ae=T(dt.style,"touchAction"),re=ae!==i,oe="compute",se="auto",ce="manipulation",le="none",ue="pan-x",pe="pan-y",he=B();K.prototype={set:function(t){t==oe&&(t=this.compute()),re&&this.manager.element.style&&he[t]&&(this.manager.element.style[ae]=t),this.actions=t.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var t=[];return o(this.manager.recognizers,function(e){u(e.options.enable,[e])&&(t=t.concat(e.getTouchAction()))}),U(t.join(" "))},preventDefaults:function(t){var e=t.srcEvent,n=t.offsetDirection;if(this.manager.session.prevented)return void e.preventDefault();var i=this.actions,a=m(i,le)&&!he[le],r=m(i,pe)&&!he[pe],o=m(i,ue)&&!he[ue];if(a){var s=1===t.pointers.length,c=t.distance<2,l=t.deltaTime<250;if(s&&c&&l)return}return o&&r?void 0:a||r&&n&Rt||o&&n&qt?this.preventSrc(e):void 0},preventSrc:function(t){this.manager.session.prevented=!0,t.preventDefault()}};var de=1,fe=2,me=4,ve=8,ge=ve,we=16,ye=32;G.prototype={defaults:{},set:function(t){return pt(this.options,t),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(t){if(r(t,"recognizeWith",this))return this;var e=this.simultaneous;return t=Q(t,this),e[t.id]||(e[t.id]=t,t.recognizeWith(this)),this},dropRecognizeWith:function(t){return r(t,"dropRecognizeWith",this)?this:(t=Q(t,this),delete this.simultaneous[t.id],this)},requireFailure:function(t){if(r(t,"requireFailure",this))return this;var e=this.requireFail;return t=Q(t,this),g(e,t)===-1&&(e.push(t),t.requireFailure(this)),this},dropRequireFailure:function(t){if(r(t,"dropRequireFailure",this))return this;t=Q(t,this);var e=g(this.requireFail,t);return e>-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){n.manager.emit(e,t)}var n=this,i=this.state;i<ve&&e(n.options.event+J(i)),e(n.options.event),t.additionalEvent&&e(t.additionalEvent),i>=ve&&e(n.options.event+J(i))},tryEmit:function(t){return this.canEmit()?this.emit(t):void(this.state=ye)},canEmit:function(){for(var t=0;t<this.requireFail.length;){if(!(this.requireFail[t].state&(ye|de)))return!1;t++}return!0},recognize:function(t){var e=pt({},t);return u(this.options.enable,[this,e])?(this.state&(ge|we|ye)&&(this.state=de),this.state=this.process(e),void(this.state&(fe|me|ve|we)&&this.tryEmit(e))):(this.reset(),void(this.state=ye))},process:function(t){},getTouchAction:function(){},reset:function(){}},c(tt,G,{defaults:{pointers:1},attrTest:function(t){var e=this.options.pointers;return 0===e||t.pointers.length===e},process:function(t){var e=this.state,n=t.eventType,i=e&(fe|me),a=this.attrTest(t);return i&&(n&Ht||!a)?e|we:i||a?n&It?e|ve:e&fe?e|me:fe:ye}}),c(et,tt,{defaults:{event:"pan",threshold:10,pointers:1,direction:zt},getTouchAction:function(){var t=this.options.direction,e=[];return t&Rt&&e.push(pe),t&qt&&e.push(ue),e},directionTest:function(t){var e=this.options,n=!0,i=t.distance,a=t.direction,r=t.deltaX,o=t.deltaY;return a&e.direction||(e.direction&Rt?(a=0===r?St:r<0?Yt:Vt,n=r!=this.pX,i=Math.abs(t.deltaX)):(a=0===o?St:o<0?Nt:Ft,n=o!=this.pY,i=Math.abs(t.deltaY))),t.direction=a,n&&i>e.threshold&&a&e.direction},attrTest:function(t){return tt.prototype.attrTest.call(this,t)&&(this.state&fe||!(this.state&fe)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=Z(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),c(nt,tt,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[le]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&fe)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),c(it,G,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[se]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance<e.threshold,r=t.deltaTime>e.time;if(this._input=t,!i||!n||t.eventType&(It|Ht)&&!r)this.reset();else if(t.eventType&Ot)this.reset(),this._timer=a(function(){this.state=ge,this.tryEmit()},e.time,this);else if(t.eventType&It)return ge;return ye},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===ge&&(t&&t.eventType&It?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=gt(),this.manager.emit(this.options.event,this._input)))}}),c(at,tt,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[le]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&fe)}}),c(rt,tt,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Rt|qt,pointers:1},getTouchAction:function(){return et.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(Rt|qt)?e=t.overallVelocity:n&Rt?e=t.overallVelocityX:n&qt&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&vt(e)>this.options.velocity&&t.eventType&It},emit:function(t){var e=Z(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),c(ot,G,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[ce]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,i=t.distance<e.threshold,r=t.deltaTime<e.time;if(this.reset(),t.eventType&Ot&&0===this.count)return this.failTimeout();if(i&&r&&n){if(t.eventType!=It)return this.failTimeout();var o=!this.pTime||t.timeStamp-this.pTime<e.interval,s=!this.pCenter||H(this.pCenter,t.center)<e.posThreshold;this.pTime=t.timeStamp,this.pCenter=t.center,s&&o?this.count+=1:this.count=1,this._input=t;var c=this.count%e.taps;if(0===c)return this.hasRequireFailures()?(this._timer=a(function(){this.state=ge,this.tryEmit()},e.interval,this),fe):ge}return ye},failTimeout:function(){return this._timer=a(function(){this.state=ye},this.options.interval,this),ye},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==ge&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),st.VERSION="2.0.8",st.defaults={domEvents:!1,touchAction:oe,enable:!0,inputTarget:null,inputClass:null,preset:[[at,{enable:!1}],[nt,{enable:!1},["rotate"]],[rt,{direction:Rt}],[et,{direction:Rt},["swipe"]],[ot],[ot,{event:"doubletap",taps:2},["tap"]],[it]],cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}};var Te=1,ke=2;ct.prototype={set:function(t){return pt(this.options,t),t.touchAction&&this.touchAction.update(),t.inputTarget&&(this.input.destroy(),this.input.target=t.inputTarget,this.input.init()),this},stop:function(t){this.session.stopped=t?ke:Te},recognize:function(t){var e=this.session;if(!e.stopped){this.touchAction.preventDefaults(t);var n,i=this.recognizers,a=e.curRecognizer;(!a||a&&a.state&ge)&&(a=e.curRecognizer=null);for(var r=0;r<i.length;)n=i[r],e.stopped===ke||a&&n!=a&&!n.canRecognizeWith(a)?n.reset():n.recognize(t),!a&&n.state&(fe|me|ve)&&(a=e.curRecognizer=n),r++}},get:function(t){if(t instanceof G)return t;for(var e=this.recognizers,n=0;n<e.length;n++)if(e[n].options.event==t)return e[n];return null},add:function(t){if(r(t,"add",this))return this;var e=this.get(t.options.event);return e&&this.remove(e),this.recognizers.push(t),t.manager=this,this.touchAction.update(),t},remove:function(t){if(r(t,"remove",this))return this;if(t=this.get(t)){var e=this.recognizers,n=g(e,t);n!==-1&&(e.splice(n,1),this.touchAction.update())}return this},on:function(t,e){if(t!==i&&e!==i){var n=this.handlers;return o(v(t),function(t){n[t]=n[t]||[],n[t].push(e)}),this}},off:function(t,e){if(t!==i){var n=this.handlers;return o(v(t),function(t){e?n[t]&&n[t].splice(g(n[t],e),1):delete n[t]}),this}},emit:function(t,e){this.options.domEvents&&ut(t,e);var n=this.handlers[t]&&this.handlers[t].slice();if(n&&n.length){e.type=t,e.preventDefault=function(){e.srcEvent.preventDefault()};for(var i=0;i<n.length;)n[i](e),i++}},destroy:function(){this.element&<(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},pt(st,{INPUT_START:Ot,INPUT_MOVE:At,INPUT_END:It,INPUT_CANCEL:Ht,STATE_POSSIBLE:de,STATE_BEGAN:fe,STATE_CHANGED:me,STATE_ENDED:ve,STATE_RECOGNIZED:ge,STATE_CANCELLED:we,STATE_FAILED:ye,DIRECTION_NONE:St,DIRECTION_LEFT:Yt,DIRECTION_RIGHT:Vt,DIRECTION_UP:Nt,DIRECTION_DOWN:Ft,DIRECTION_HORIZONTAL:Rt,DIRECTION_VERTICAL:qt,DIRECTION_ALL:zt,Manager:ct,Input:C,TouchAction:K,TouchInput:z,MouseInput:N,PointerEventInput:F,TouchMouseInput:j,SingleTouchInput:R,Recognizer:G,AttrRecognizer:tt,Tap:ot,Pan:et,Swipe:rt,Pinch:nt,Rotate:at,Press:it,on:h,off:d,each:o,merge:yt,extend:wt,assign:pt,inherit:c,bindFn:l,prefixed:T});var xe="undefined"!=typeof t?t:"undefined"!=typeof self?self:{};xe.Hammer=st,"function"==typeof define&&define.amd?define(function(){return st}):"undefined"!=typeof module&&module.exports?module.exports=st:t[n]=st}(window,document,"Hammer"),+function(t){"use strict";var e;t.modal=function(n,i){n=t.extend({},e,n);var a=n.buttons,r=a.map(function(t,e){return'<a href="javascript:;" class="weui-dialog__btn '+(t.className||"")+'">'+t.text+"</a>"}).join(""),o='<div class="weui-dialog"><div class="weui-dialog__hd"><strong class="weui-dialog__title">'+n.title+"</strong></div>"+(n.text?'<div class="weui-dialog__bd">'+n.text+"</div>":"")+'<div class="weui-dialog__ft">'+r+"</div></div>",s=t.openModal(o,i);return s.find(".weui-dialog__btn").each(function(e,i){var r=t(i);r.click(function(){n.autoClose&&t.closeModal(),a[e].onClick&&a[e].onClick.call(s)})}),s},t.openModal=function(e,n){var i=t("<div class='weui-mask'></div>").appendTo(document.body);i.show();var a=t(e).appendTo(document.body);return n&&a.transitionEnd(function(){n.call(a)}),a.show(),i.addClass("weui-mask--visible"),a.addClass("weui-dialog--visible"),a},t.closeModal=function(){t(".weui-mask--visible").removeClass("weui-mask--visible").transitionEnd(function(){t(this).remove()}),t(".weui-dialog--visible").removeClass("weui-dialog--visible").transitionEnd(function(){t(this).remove()})},t.alert=function(n,i,a){var r;return"object"==typeof n?r=n:("function"==typeof i&&(a=arguments[1],i=void 0),r={text:n,title:i,onOK:a}),t.modal({text:r.text,title:r.title,buttons:[{text:e.buttonOK,className:"primary",onClick:r.onOK}]})},t.confirm=function(n,i,a,r){var o;return"object"==typeof n?o=n:("function"==typeof i&&(r=arguments[2],a=arguments[1],i=void 0),o={text:n,title:i,onOK:a,onCancel:r}),t.modal({text:o.text,title:o.title,buttons:[{text:e.buttonCancel,className:"default",onClick:o.onCancel},{text:e.buttonOK,className:"primary",onClick:o.onOK}]})},t.prompt=function(n,i,a,r,o){var s;"object"==typeof n?s=n:("function"==typeof i&&(o=arguments[3],r=arguments[2],a=arguments[1],i=void 0),s={text:n,title:i,input:o,onOK:a,onCancel:r,empty:!1});var c=t.modal({text:'<p class="weui-prompt-text">'+(s.text||"")+'</p><input type="text" class="weui-input weui-prompt-input" placeholder="请输入内容" id="weui-prompt-input" value="'+(s.input||"")+'" />',title:s.title,autoClose:!1,buttons:[{text:e.buttonCancel,className:"default",onClick:function(){t.closeModal(),s.onCancel&&s.onCancel.call(c)}},{text:e.buttonOK,className:"primary",onClick:function(){var e=t("#weui-prompt-input").val();return s.empty||""!==e&&null!==e?(t.closeModal(),void(s.onOK&&s.onOK.call(c,e))):(c.find(".weui-prompt-input").focus()[0].select(),!1)}}]},function(){this.find(".weui-prompt-input").focus()[0].select()});return c},t.login=function(n,i,a,r,o,s){var c;"object"==typeof n?c=n:("function"==typeof i&&(s=arguments[4],o=arguments[3],r=arguments[2],a=arguments[1],i=void 0),c={text:n,title:i,username:o,password:s,onOK:a,onCancel:r});var l=t.modal({text:'<p class="weui-prompt-text">'+(c.text||"")+'</p><input type="text" class="weui-input weui-prompt-input" id="weui-prompt-username" value="'+(c.username||"")+'" placeholder="输入用户名" /><input type="password" class="weui-input weui-prompt-input" id="weui-prompt-password" value="'+(c.password||"")+'" placeholder="输入密码" />',title:c.title,autoClose:!1,buttons:[{text:e.buttonCancel,className:"default",onClick:function(){t.closeModal(),c.onCancel&&c.onCancel.call(l)}},{text:e.buttonOK,className:"primary",onClick:function(){var e=t("#weui-prompt-username").val(),n=t("#weui-prompt-password").val();return c.empty||""!==e&&null!==e?c.empty||""!==n&&null!==n?(t.closeModal(),void(c.onOK&&c.onOK.call(l,e,n))):(l.find("#weui-prompt-password").focus()[0].select(),!1):(l.find("#weui-prompt-username").focus()[0].select(),!1)}}]},function(){this.find("#weui-prompt-username").focus()[0].select()});return l},e=t.modal.prototype.defaults={title:"提示",text:void 0,buttonOK:"确定",buttonCancel:"取消",buttons:[{text:"确定",className:"primary"}],autoClose:!0}}($),+function(t){"use strict";var e=function(e,n){n=n||"";var i=(t("<div class='weui-mask_transparent'></div>").appendTo(document.body),'<div class="weui-toast '+n+'">'+e+"</div>"),a=t(i).appendTo(document.body);a.addClass("weui-toast--visible"),a.show()},n=function(e){t(".weui-mask_transparent").remove();var n=!1,i=t(".weui-toast--visible").removeClass("weui-toast--visible").transitionEnd(function(){var i=t(this);i.remove(),e&&e(),n=!0});setTimeout(function(){n||(i.remove(),e&&e())},1e3)};t.toast=function(t,a,r){"function"==typeof a&&(r=a);var o,s="weui-icon-success-no-circle",c=i.duration;"cancel"==a?(o="weui-toast_cancel",s="weui-icon-cancel"):"forbidden"==a?(o="weui-toast--forbidden",s="weui-icon-warn"):"text"==a?o="weui-toast--text":"number"==typeof a&&(c=a),e('<i class="'+s+' weui-icon_toast"></i><p class="weui-toast_content">'+(t||"已经完成")+"</p>",o),setTimeout(function(){n(r)},c)},t.showLoading=function(t){var n='<div class="weui_loading">';n+='<i class="weui-loading weui-icon_toast"></i>',n+="</div>",n+='<p class="weui-toast_content">'+(t||"数据加载中")+"</p>",e(n,"weui_loading_toast")},t.hideLoading=function(){n()};var i=t.toast.prototype.defaults={duration:2500}}($),+function(t){"use strict";var e,n=function(e){var n=t("<div class='weui-mask weui-actions_mask'></div>").appendTo(document.body),i=e.actions||[],a=i.map(function(t,e){return'<div class="weui-actionsheet__cell '+(t.className||"")+'">'+t.text+"</div>"}).join(""),r="";e.title&&(r='<div class="weui-actionsheet__title"><p class="weui-actionsheet__title-text">'+e.title+"</p></div>");var o='<div class="weui-actionsheet " id="weui-actionsheet">'+r+'<div class="weui-actionsheet__menu">'+a+'</div><div class="weui-actionsheet__action"><div class="weui-actionsheet__cell weui-actionsheet_cancel">取消</div></div></div>',s=t(o).appendTo(document.body);s.find(".weui-actionsheet__menu .weui-actionsheet__cell, .weui-actionsheet__action .weui-actionsheet__cell").each(function(n,a){t(a).click(function(){t.closeActions(),e.onClose&&e.onClose(),i[n]&&i[n].onClick&&i[n].onClick()})}),n.show(),s.show(),n.addClass("weui-mask--visible"),s.addClass("weui-actionsheet_toggle")},i=function(){t(".weui-mask").removeClass("weui-mask--visible").transitionEnd(function(){t(this).remove()}),t(".weui-actionsheet").removeClass("weui-actionsheet_toggle").transitionEnd(function(){t(this).remove()})};t.actions=function(i){i=t.extend({},e,i),n(i)},t.closeActions=function(){i()},t(document).on("click",".weui-actions_mask",function(){t.closeActions()});var e=t.actions.prototype.defaults={title:void 0,onClose:void 0}}($),+function(t){"use strict";var e=function(n,i){"function"==typeof i&&(i={onRefresh:i}),"string"==typeof i&&(i=void 0),this.opt=t.extend(e.defaults,i||{}),this.container=t(n),this.attachEvents()};e.defaults={distance:50,onRefresh:void 0,onPull:void 0},e.prototype.touchStart=function(e){if(!this.container.hasClass("refreshing")){var n=t.getTouchPosition(e);this.start=n,this.diffX=this.diffY=0}},e.prototype.touchMove=function(e){if(!this.container.hasClass("refreshing")){if(!this.start)return!1;if(!(this.container.scrollTop()>0)){var n=t.getTouchPosition(e);return this.diffX=n.x-this.start.x,this.diffY=n.y-this.start.y,Math.abs(this.diffX)>Math.abs(this.diffY)||void(this.diffY<0||(this.container.addClass("touching"),e.preventDefault(),e.stopPropagation(),this.diffY=Math.pow(this.diffY,.75),this.container.css("transform","translate3d(0, "+this.diffY+"px, 0)"),this.triggerPull(this.diffY)))}}},e.prototype.touchEnd=function(){this.start=!1,this.diffY<=0||this.container.hasClass("refreshing")||(this.container.removeClass("touching"),this.container.removeClass("pull-down pull-up"),this.container.css("transform",""),Math.abs(this.diffY)<=this.opt.distance||this.triggerPullToRefresh())},e.prototype.triggerPullToRefresh=function(){this.triggerPull(this.opt.distance),this.container.removeClass("pull-up").addClass("refreshing"),this.opt.onRefresh&&this.opt.onRefresh.call(this),this.container.trigger("pull-to-refresh")},e.prototype.triggerPull=function(t){t<this.opt.distance?this.container.removeClass("pull-up").addClass("pull-down"):this.container.removeClass("pull-down").addClass("pull-up"),this.opt.onPull&&this.opt.onPull.call(this,Math.floor(t/this.opt.distance*100)),this.container.trigger("pull")},e.prototype.pullToRefreshDone=function(){this.container.removeClass("refreshing")},e.prototype.attachEvents=function(){var e=this.container;e.addClass("weui-pull-to-refresh"),e.on(t.touchEvents.start,t.proxy(this.touchStart,this)),e.on(t.touchEvents.move,t.proxy(this.touchMove,this)),e.on(t.touchEvents.end,t.proxy(this.touchEnd,this))};var n=function(e){t(e).removeClass("refreshing")};t.fn.pullToRefresh=function(n){return this.each(function(){var i=t(this),a=i.data("ptr");a||i.data("ptr",a=new e(this,n)),"string"==typeof n&&a[n].call(a)})},t.fn.pullToRefreshDone=function(){return this.each(function(){n(this)})}}($),+function(t){"use strict";var e=function(e){var n,i=e[0].tagName.toUpperCase();n="BODY"===i||"HTML"===i?e.scrollTop()||t(window).scrollTop():e.scrollTop();var a=e.scrollHeight()-(t(window).height()+n);return console.log(a),a},n=function(e,n){this.container=t(e),this.container.data("infinite",this),this.distance=n||50,this.attachEvents()};n.prototype.scroll=function(){this.container;this._check()},n.prototype.attachEvents=function(e){var n=this.container,i="BODY"===n[0].tagName.toUpperCase()?t(document):n;i[e?"off":"on"]("scroll",t.proxy(this.scroll,this))},n.prototype.detachEvents=function(t){this.attachEvents(!0)},n.prototype._check=function(){var t=e(this.container);Math.abs(t)<=this.distance&&this.container.trigger("infinite")};t.fn.infinite=function(t){return this.each(function(){new n(this,t)})},t.fn.destroyInfinite=function(){return this.each(function(){var e=t(this).data("infinite");e&&e.detachEvents&&e.detachEvents()})}}($),+function(t){"use strict";var e="weui-bar__item--on",n=function(n){var i=t(n);if(!i.hasClass(e)){var a=i.attr("href");if(/^#/.test(a)){i.parent().find("."+e).removeClass(e),i.addClass(e);var r=i.parents(".weui-tab").find(".weui-tab__bd");r.find(".weui-tab__bd-item--active").removeClass("weui-tab__bd-item--active"),t(a).addClass("weui-tab__bd-item--active")}}};t.showTab=n,t(document).on("click",".weui-navbar__item, .weui-tabbar__item",function(i){var a=t(i.currentTarget),r=a.attr("href");a.hasClass(e)||/^#/.test(r)&&(i.preventDefault(),n(a))})}($),+function(t){"use strict";t(document).on("click touchstart",".weui-search-bar__label",function(e){t(e.target).parents(".weui-search-bar").addClass("weui-search-bar_focusing").find("input").focus()}).on("click",".weui-search-bar__cancel-btn",function(e){t(e.target).parents(".weui-search-bar").removeClass("weui-search-bar_focusing").find(".weui-search-bar__input").val("").blur()}).on("click",".weui-icon-clear",function(e){t(e.target).parents(".weui-search-bar").find(".weui-search-bar__input").val("").focus()})}($),function(t){"use strict";var e={},n=navigator.userAgent,i=n.match(/(Android);?[\s\/]+([\d.]+)?/),a=n.match(/(iPad).*OS\s([\d_]+)/),r=n.match(/(iPod)(.*OS\s([\d_]+))?/),o=!a&&n.match(/(iPhone\sOS)\s([\d_]+)/);if(e.ios=e.android=e.iphone=e.ipad=e.androidChrome=!1,i&&(e.os="android",e.osVersion=i[2],e.android=!0,e.androidChrome=n.toLowerCase().indexOf("chrome")>=0),(a||o||r)&&(e.os="ios",e.ios=!0),o&&!r&&(e.osVersion=o[2].replace(/_/g,"."),e.iphone=!0),a&&(e.osVersion=a[2].replace(/_/g,"."),e.ipad=!0),r&&(e.osVersion=r[3]?r[3].replace(/_/g,"."):null,e.iphone=!0),e.ios&&e.osVersion&&n.indexOf("Version/")>=0&&"10"===e.osVersion.split(".")[0]&&(e.osVersion=n.toLowerCase().split("version/")[1].split(" ")[0]),
+e.webView=(o||a||r)&&n.match(/.*AppleWebKit(?!.*Safari)/i),e.os&&"ios"===e.os){var s=e.osVersion.split(".");e.minimalUi=!e.webView&&(r||o)&&(1*s[0]===7?1*s[1]>=1:1*s[0]>7)&&t('meta[name="viewport"]').length>0&&t('meta[name="viewport"]').attr("content").indexOf("minimal-ui")>=0}var c=t(window).width(),l=t(window).height();e.statusBar=!1,e.webView&&c*l===screen.width*screen.height?e.statusBar=!0:e.statusBar=!1;var u=[];if(e.pixelRatio=window.devicePixelRatio||1,u.push("pixel-ratio-"+Math.floor(e.pixelRatio)),e.pixelRatio>=2&&u.push("retina"),e.os&&(u.push(e.os,e.os+"-"+e.osVersion.split(".")[0],e.os+"-"+e.osVersion.replace(/\./g,"-")),"ios"===e.os))for(var p=parseInt(e.osVersion.split(".")[0],10),h=p-1;h>=6;h--)u.push("ios-gt-"+h);e.statusBar?u.push("with-statusbar-overlay"):t("html").removeClass("with-statusbar-overlay"),u.length>0&&t("html").addClass(u.join(" ")),t.device=e}($),+function(t){"use strict";var e=function(e){function n(){var e=!1;return c.params.convertToPopover||c.params.onlyInPopover?(!c.inline&&c.params.input&&(c.params.onlyInPopover?e=!0:t.device.ios?e=!!t.device.ipad:t(window).width()>=768&&(e=!0)),e):e}function i(){return!!(c.opened&&c.container&&c.container.length>0&&c.container.parents(".popover").length>0)}function a(){if(c.opened)for(var t=0;t<c.cols.length;t++)c.cols[t].divider||(c.cols[t].calcSize(),c.cols[t].setValue(c.cols[t].value,0,!1))}function r(t){if(t.preventDefault(),!c.opened&&(c.open(),c.params.scrollToInput&&!n())){var e=c.input.parents(".content");if(0===e.length)return;var i,a=parseInt(e.css("padding-top"),10),r=parseInt(e.css("padding-bottom"),10),o=e[0].offsetHeight-a-c.container.height(),s=e[0].scrollHeight-a-c.container.height(),l=c.input.offset().top-a+c.input[0].offsetHeight;if(l>o){var u=e.scrollTop()+l-o;u+o>s&&(i=u+o-s+r,o===s&&(i=c.container.height()),e.css({"padding-bottom":i+"px"})),e.scrollTop(u,300)}}}function o(e){i()||(c.input&&c.input.length>0?e.target!==c.input[0]&&0===t(e.target).parents(".weui-picker-modal").length&&c.close():0===t(e.target).parents(".weui-picker-modal").length&&c.close())}function s(){c.opened=!1,c.input&&c.input.length>0&&c.input.parents(".page-content").css({"padding-bottom":""}),c.params.onClose&&c.params.onClose(c),c.container.find(".picker-items-col").each(function(){c.destroyPickerCol(this)})}var c=this,l={updateValuesOnMomentum:!1,updateValuesOnTouchmove:!0,rotateEffect:!1,momentumRatio:7,freeMode:!1,scrollToInput:!0,inputReadOnly:!0,toolbar:!0,toolbarCloseText:"完成",title:"请选择",toolbarTemplate:'<div class="toolbar"> <div class="toolbar-inner"> <a href="javascript:;" class="picker-button close-picker">{{closeText}}</a> <h1 class="title">{{title}}</h1> </div> </div>'};e=e||{};for(var u in l)"undefined"==typeof e[u]&&(e[u]=l[u]);c.params=e,c.cols=[],c.initialized=!1,c.inline=!!c.params.container;var p=t.device.ios||navigator.userAgent.toLowerCase().indexOf("safari")>=0&&navigator.userAgent.toLowerCase().indexOf("chrome")<0&&!t.device.android;return c.setValue=function(t,e){for(var n=0,i=0;i<c.cols.length;i++)c.cols[i]&&!c.cols[i].divider&&(c.cols[i].setValue(t[n],e),n++)},c.updateValue=function(){for(var e=[],n=[],i=0;i<c.cols.length;i++)c.cols[i].divider||(e.push(c.cols[i].value),n.push(c.cols[i].displayValue));e.indexOf(void 0)>=0||(c.value=e,c.displayValue=n,c.params.onChange&&c.params.onChange(c,c.value,c.displayValue),c.input&&c.input.length>0&&(t(c.input).val(c.params.formatValue?c.params.formatValue(c,c.value,c.displayValue):c.value.join(" ")),t(c.input).trigger("change")))},c.initPickerCol=function(e,n){function i(){w=t.requestAnimationFrame(function(){h.updateItems(void 0,void 0,0),i()})}function a(e){if(!T&&!y){e.preventDefault(),y=!0;var n=t.getTouchPosition(e);k=x=n.y,C=(new Date).getTime(),A=!0,M=E=t.getTranslate(h.wrapper[0],"y")}}function r(e){if(y){e.preventDefault(),A=!1;var n=t.getTouchPosition(e);x=n.y,T||(t.cancelAnimationFrame(w),T=!0,M=E=t.getTranslate(h.wrapper[0],"y"),h.wrapper.transition(0)),e.preventDefault();var i=x-k;E=M+i,_=void 0,E<v&&(E=v-Math.pow(v-E,.8),_="min"),E>g&&(E=g+Math.pow(E-g,.8),_="max"),h.wrapper.transform("translate3d(0,"+E+"px,0)"),h.updateItems(void 0,E,0,c.params.updateValuesOnTouchmove),P=E-D||E,O=(new Date).getTime(),D=E}}function o(e){if(!y||!T)return void(y=T=!1);y=T=!1,h.wrapper.transition(""),_&&("min"===_?h.wrapper.transform("translate3d(0,"+v+"px,0)"):h.wrapper.transform("translate3d(0,"+g+"px,0)")),b=(new Date).getTime();var n,a;b-C>300?a=E:(n=Math.abs(P/(b-O)),a=E+P*c.params.momentumRatio),a=Math.max(Math.min(a,g),v);var r=-Math.floor((a-g)/f);c.params.freeMode||(a=-r*f+g),h.wrapper.transform("translate3d(0,"+parseInt(a,10)+"px,0)"),h.updateItems(r,a,"",!0),c.params.updateValuesOnMomentum&&(i(),h.wrapper.transitionEnd(function(){t.cancelAnimationFrame(w)})),setTimeout(function(){A=!0},100)}function s(e){if(A){t.cancelAnimationFrame(w);var n=t(this).attr("data-picker-value");h.setValue(n)}}var l=t(e),u=l.index(),h=c.cols[u];if(!h.divider){h.container=l,h.wrapper=h.container.find(".picker-items-col-wrapper"),h.items=h.wrapper.find(".picker-item");var d,f,m,v,g;h.replaceValues=function(t,e){h.destroyEvents(),h.values=t,h.displayValues=e;var n=c.columnHTML(h,!0);h.wrapper.html(n),h.items=h.wrapper.find(".picker-item"),h.calcSize(),h.setValue(h.values[0]||"",0,!0),h.initEvents()},h.calcSize=function(){if(h.values.length){c.params.rotateEffect&&(h.container.removeClass("picker-items-col-absolute"),h.width||h.container.css({width:""}));var e,n;e=0,n=h.container[0].offsetHeight,d=h.wrapper[0].offsetHeight,f=h.items[0].offsetHeight,m=f*h.items.length,v=n/2-m+f/2,g=n/2-f/2,h.width&&(e=h.width,parseInt(e,10)===e&&(e+="px"),h.container.css({width:e})),c.params.rotateEffect&&(h.width||(h.items.each(function(){var n=t(this);n.css({width:"auto"}),e=Math.max(e,n[0].offsetWidth),n.css({width:""})}),h.container.css({width:e+2+"px"})),h.container.addClass("picker-items-col-absolute"))}},h.calcSize(),h.wrapper.transform("translate3d(0,"+g+"px,0)").transition(0);var w;h.setValue=function(e,n,a){"undefined"==typeof n&&(n="");var r=h.wrapper.find('.picker-item[data-picker-value="'+e+'"]').index();if("undefined"==typeof r||r===-1)return void(h.value=h.displayValue=e);var o=-r*f+g;h.wrapper.transition(n),h.wrapper.transform("translate3d(0,"+o+"px,0)"),c.params.updateValuesOnMomentum&&h.activeIndex&&h.activeIndex!==r&&(t.cancelAnimationFrame(w),h.wrapper.transitionEnd(function(){t.cancelAnimationFrame(w)}),i()),h.updateItems(r,o,n,a)},h.updateItems=function(e,n,i,a){"undefined"==typeof n&&(n=t.getTranslate(h.wrapper[0],"y")),"undefined"==typeof e&&(e=-Math.round((n-g)/f)),e<0&&(e=0),e>=h.items.length&&(e=h.items.length-1);var r=h.activeIndex;h.activeIndex=e,h.wrapper.find(".picker-selected").removeClass("picker-selected"),c.params.rotateEffect&&h.items.transition(i);var o=h.items.eq(e).addClass("picker-selected").transform("");if((a||"undefined"==typeof a)&&(h.value=o.attr("data-picker-value"),h.displayValue=h.displayValues?h.displayValues[e]:h.value,r!==e&&(h.onChange&&h.onChange(c,h.value,h.displayValue),c.updateValue())),c.params.rotateEffect){(n-(Math.floor((n-g)/f)*f+g))/f;h.items.each(function(){var e=t(this),i=e.index()*f,a=g-n,r=i-a,o=r/f,s=Math.ceil(h.height/f/2)+1,c=-18*o;c>180&&(c=180),c<-180&&(c=-180),Math.abs(o)>s?e.addClass("picker-item-far"):e.removeClass("picker-item-far"),e.transform("translate3d(0, "+(-n+g)+"px, "+(p?-110:0)+"px) rotateX("+c+"deg)")})}},n&&h.updateItems(0,g,0);var y,T,k,x,C,b,M,_,E,D,P,O,A=!0;h.initEvents=function(e){var n=e?"off":"on";h.container[n](t.touchEvents.start,a),h.container[n](t.touchEvents.move,r),h.container[n](t.touchEvents.end,o),h.items[n]("click",s)},h.destroyEvents=function(){h.initEvents(!0)},h.container[0].f7DestroyPickerCol=function(){h.destroyEvents()},h.initEvents()}},c.destroyPickerCol=function(e){e=t(e),"f7DestroyPickerCol"in e[0]&&e[0].f7DestroyPickerCol()},t(window).on("resize",a),c.columnHTML=function(t,e){var n="",i="";if(t.divider)i+='<div class="picker-items-col picker-items-col-divider '+(t.textAlign?"picker-items-col-"+t.textAlign:"")+" "+(t.cssClass||"")+'">'+t.content+"</div>";else{for(var a=0;a<t.values.length;a++)n+='<div class="picker-item" data-picker-value="'+t.values[a]+'">'+(t.displayValues?t.displayValues[a]:t.values[a])+"</div>";i+='<div class="picker-items-col '+(t.textAlign?"picker-items-col-"+t.textAlign:"")+" "+(t.cssClass||"")+'"><div class="picker-items-col-wrapper">'+n+"</div></div>"}return e?n:i},c.layout=function(){var t,e="",n="";c.cols=[];var i="";for(t=0;t<c.params.cols.length;t++){var a=c.params.cols[t];i+=c.columnHTML(c.params.cols[t]),c.cols.push(a)}n="weui-picker-modal picker-columns "+(c.params.cssClass||"")+(c.params.rotateEffect?" picker-3d":"")+(1===c.params.cols.length?" picker-columns-single":""),e='<div class="'+n+'">'+(c.params.toolbar?c.params.toolbarTemplate.replace(/{{closeText}}/g,c.params.toolbarCloseText).replace(/{{title}}/g,c.params.title):"")+'<div class="picker-modal-inner picker-items">'+i+'<div class="picker-center-highlight"></div></div></div>',c.pickerHTML=e},c.params.input&&(c.input=t(c.params.input),c.input.length>0&&(c.params.inputReadOnly&&c.input.prop("readOnly",!0),c.inline||c.input.on("click",r),c.params.inputReadOnly&&c.input.on("focus mousedown",function(t){t.preventDefault()}))),c.inline||t("html").on("click",o),c.opened=!1,c.open=function(){var e=n();c.opened||(c.layout(),e?(c.pickerHTML='<div class="popover popover-picker-columns"><div class="popover-inner">'+c.pickerHTML+"</div></div>",c.popover=t.popover(c.pickerHTML,c.params.input,!0),c.container=t(c.popover).find(".weui-picker-modal"),t(c.popover).on("close",function(){s()})):c.inline?(c.container=t(c.pickerHTML),c.container.addClass("picker-modal-inline"),t(c.params.container).append(c.container)):(c.container=t(t.openPicker(c.pickerHTML)),t(c.container).on("close",function(){s()})),c.container[0].f7Picker=c,c.container.find(".picker-items-col").each(function(){var t=!0;(!c.initialized&&c.params.value||c.initialized&&c.value)&&(t=!1),c.initPickerCol(this,t)}),c.initialized?c.value&&c.setValue(c.value,0):c.params.value&&c.setValue(c.params.value,0)),c.opened=!0,c.initialized=!0,c.params.onOpen&&c.params.onOpen(c)},c.close=function(e){if(c.opened&&!c.inline)return i()?void t.closePicker(c.popover):void t.closePicker(c.container)},c.destroy=function(){c.close(),c.params.input&&c.input.length>0&&(c.input.off("click focus",r),t(c.input).data("picker",null)),t("html").off("click",o),t(window).off("resize",a)},c.inline&&c.open(),c};t(document).on("click",".close-picker",function(){var e=t(".weui-picker-modal.weui-picker-modal-visible");e.length>0&&t.closePicker(e)}),t(document).on(t.touchEvents.move,".picker-modal-inner",function(t){t.preventDefault()}),t.openPicker=function(e,n,i){"function"==typeof n&&(i=n,n=void 0),t.closePicker();var a=t("<div class='weui-picker-container "+(n||"")+"'></div>").appendTo(document.body);a.show(),a.addClass("weui-picker-container-visible");var r=t(e).appendTo(a);return r.width(),r.addClass("weui-picker-modal-visible"),i&&a.on("close",i),r},t.updatePicker=function(e){var n=t(".weui-picker-container-visible");if(!n[0])return!1;n.html("");var i=t(e).appendTo(n);return i.addClass("weui-picker-modal-visible"),i},t.closePicker=function(e,n){"function"==typeof e&&(n=e),t(".weui-picker-modal-visible").removeClass("weui-picker-modal-visible").transitionEnd(function(){t(this).parent().remove(),n&&n()}).trigger("close")},t.fn.picker=function(n){var i=arguments;return this.each(function(){if(this){var a=t(this),r=a.data("picker");if(!r){n=t.extend({input:this},n||{});var o=a.val();void 0===n.value&&""!==o&&(n.value=n.cols&&n.cols.length>1?o.split(" "):[o]);var s=t.extend({input:this},n);r=new e(s),a.data("picker",r)}"string"==typeof n&&r[n].apply(r,Array.prototype.slice.call(i,1))}})}}($),+function(t){"use strict";var e,n=[],i=function(e,i){this.config=i,this.data={values:"",titles:"",origins:[],length:0},this.$input=t(e),this.$input.prop("readOnly",!0),this.initConfig(),i=this.config,this.$input.click(t.proxy(this.open,this)),n.push(this)};i.prototype.initConfig=function(){this.config=t.extend({},e,this.config);var n=this.config;n.items&&n.items.length&&(n.items=n.items.map(function(t,e){return"string"==typeof t?{title:t,value:t}:t}),this.tpl=t.t7.compile("<div class='weui-picker-modal weui-select-modal'>"+n.toolbarTemplate+(n.multi?n.checkboxTemplate:n.radioTemplate)+"</div>"),void 0!==n.input&&this.$input.val(n.input),this.parseInitValue(),this._init=!0)},i.prototype.updateInputValue=function(t,e){var n,i;this.config.multi?(n=t.join(this.config.split),i=e.join(this.config.split)):(n=t[0],i=e[0]);var a=[];this.config.items.forEach(function(e){t.each(function(t,n){e.value==n&&a.push(e)})}),this.$input.val(i).data("values",n),this.$input.attr("value",i).attr("data-values",n);var r={values:n,titles:i,valuesArray:t,titlesArray:e,origins:a,length:a.length};this.data=r,this.$input.trigger("change",r),this.config.onChange&&this.config.onChange.call(this,r)},i.prototype.parseInitValue=function(){var t=this.$input.val(),e=this.config.items;if(this._init||void 0!==t&&null!=t&&""!==t)for(var n=this.config.multi?t.split(this.config.split):[t],i=0;i<e.length;i++){e[i].checked=!1;for(var a=0;a<n.length;a++)e[i].title===n[a]&&(e[i].checked=!0)}},i.prototype._bind=function(e){var n=this,i=this.config;e.on("change",function(a){var r=e.find("input:checked"),o=r.map(function(){return t(this).val()}),s=r.map(function(){return t(this).data("title")});n.updateInputValue(o,s),i.autoClose&&!i.multi&&n.close()}).trigger("change").on("click",".close-select",function(){n.close()})},i.prototype.update=function(e){this.config=t.extend({},this.config,e),this.initConfig(),this._open&&this._bind(t.updatePicker(this.getHTML()))},i.prototype.open=function(e,i){if(!this._open){for(var a=0;a<n.length;a++){var r=n[a];if(r!==this&&r._open&&!r.close())return!1}this.parseInitValue();var o=this.config,s=this.dialog=t.openPicker(this.getHTML());this._bind(s),this._open=!0,o.onOpen&&o.onOpen(this)}},i.prototype.close=function(e,n){if(!this._open)return!1;var i=this,a=this.config.beforeClose;if(!n){if(a&&"function"==typeof a&&a.call(this,this.data.values,this.data.titles)===!1)return!1;if(this.config.multi){if(void 0!==this.config.min&&this.data.length<this.config.min)return t.toast("请至少选择"+this.config.min+"个","text"),!1;if(void 0!==this.config.max&&this.data.length>this.config.max)return t.toast("最多只能选择"+this.config.max+"个","text"),!1}}return t.closePicker(function(){i.onClose(),e&&e()}),!0},i.prototype.onClose=function(){this._open=!1,this.config.onClose&&this.config.onClose(this)},i.prototype.getHTML=function(t){var e=this.config;return this.tpl({items:e.items,title:e.title,closeText:e.closeText})},t.fn.select=function(e,n){return this.each(function(){var a=t(this);a.data("weui-select")||a.data("weui-select",new i(this,e));var r=a.data("weui-select");return"string"==typeof e&&r[e].call(r,n),r})},e=t.fn.select.prototype.defaults={items:[],input:void 0,title:"请选择",multi:!1,closeText:"确定",autoClose:!0,onChange:void 0,beforeClose:void 0,onClose:void 0,onOpen:void 0,split:",",min:void 0,max:void 0,toolbarTemplate:'<div class="toolbar"> <div class="toolbar-inner"> <a href="javascript:;" class="picker-button close-select">{{closeText}}</a> <h1 class="title">{{title}}</h1> </div> </div>',radioTemplate:'<div class="weui-cells weui-cells_radio"> {{#items}} <label class="weui-cell weui-check_label" for="weui-select-id-{{this.title}}"> <div class="weui-cell__bd weui-cell_primary"> <p>{{this.title}}</p> </div> <div class="weui-cell__ft"> <input type="radio" class="weui-check" name="weui-select" id="weui-select-id-{{this.title}}" value="{{this.value}}" {{#if this.checked}}checked="checked"{{/if}} data-title="{{this.title}}"> <span class="weui-icon-checked"></span> </div> </label> {{/items}} </div>',checkboxTemplate:'<div class="weui-cells weui-cells_checkbox"> {{#items}} <label class="weui-cell weui-check_label" for="weui-select-id-{{this.title}}"> <div class="weui-cell__bd weui-cell_primary"> <p>{{this.title}}</p> </div> <div class="weui-cell__ft"> <input type="checkbox" class="weui-check" name="weui-select" id="weui-select-id-{{this.title}}" value="{{this.value}}" {{#if this.checked}}checked="checked"{{/if}} data-title="{{this.title}}" > <span class="weui-icon-checked"></span> </div> </label> {{/items}} </div>'}}($),+function(t){"use strict";var e,n=!1,i=function(t,e){var t=new Date(t),e=new Date(e);return t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate()},a=function(a){function r(){var e=!1;return p.params.convertToPopover||p.params.onlyInPopover?(!p.inline&&p.params.input&&(p.params.onlyInPopover?e=!0:t.device.ios?e=!!t.device.ipad:t(window).width()>=768&&(e=!0)),e):e}function o(){return!!(p.opened&&p.container&&p.container.length>0&&p.container.parents(".popover").length>0)}function s(t){t=new Date(t);var e=t.getFullYear(),n=t.getMonth(),i=n+1,a=t.getDate(),r=t.getDay();return p.params.dateFormat.replace(/yyyy/g,e).replace(/yy/g,(e+"").substring(2)).replace(/mm/g,i<10?"0"+i:i).replace(/m/g,i).replace(/MM/g,p.params.monthNames[n]).replace(/M/g,p.params.monthNamesShort[n]).replace(/dd/g,a<10?"0"+a:a).replace(/d/g,a).replace(/DD/g,p.params.dayNames[r]).replace(/D/g,p.params.dayNamesShort[r])}function c(t){if(t.preventDefault(),!p.opened&&(p.open(),p.params.scrollToInput&&!r())){var e=p.input.parents(".page-content");if(0===e.length)return;var n,i=parseInt(e.css("padding-top"),10),a=parseInt(e.css("padding-bottom"),10),o=e[0].offsetHeight-i-p.container.height(),s=e[0].scrollHeight-i-p.container.height(),c=p.input.offset().top-i+p.input[0].offsetHeight;if(c>o){var l=e.scrollTop()+c-o;l+o>s&&(n=l+o-s+a,o===s&&(n=p.container.height()),e.css({"padding-bottom":n+"px"})),e.scrollTop(l,300)}}}function l(e){o()||(p.input&&p.input.length>0?e.target!==p.input[0]&&0===t(e.target).parents(".weui-picker-modal").length&&p.close():0===t(e.target).parents(".weui-picker-modal").length&&p.close())}function u(){p.opened=!1,p.input&&p.input.length>0&&p.input.parents(".page-content").css({"padding-bottom":""}),p.params.onClose&&p.params.onClose(p),p.destroyCalendarEvents()}var p=this;a=a||{};for(var h in e)"undefined"==typeof a[h]&&(a[h]=e[h]);p.params=a,p.initialized=!1,p.inline=!!p.params.container,p.isH="horizontal"===p.params.direction;var d=p.isH&&n?-1:1;return p.animating=!1,p.addValue=function(t){if(p.params.multiple){p.value||(p.value=[]);for(var e,n=0;n<p.value.length;n++)i(t,p.value[n])&&(e=n);"undefined"==typeof e?p.value.push(t):p.value.splice(e,1),p.updateValue()}else p.value=[t],p.updateValue()},p.setValue=function(t){var e=new Date(t[0]);p.setYearMonth(e.getFullYear(),e.getMonth()),p.addValue(+e)},p.updateValue=function(){p.wrapper.find(".picker-calendar-day-selected").removeClass("picker-calendar-day-selected");var e,n;for(e=0;e<p.value.length;e++){var i=new Date(p.value[e]);p.wrapper.find('.picker-calendar-day[data-date="'+i.getFullYear()+"-"+i.getMonth()+"-"+i.getDate()+'"]').addClass("picker-calendar-day-selected")}if(p.params.onChange&&p.params.onChange(p,p.value.map(s),p.value.map(function(t){return+new Date("string"==typeof t?t.split(/\D/).filter(function(t){return!!t}).join("-"):t)})),p.input&&p.input.length>0){if(p.params.formatValue)n=p.params.formatValue(p,p.value);else{for(n=[],e=0;e<p.value.length;e++)n.push(s(p.value[e]));n=n.join(", ")}t(p.input).val(n),t(p.input).trigger("change")}},p.initCalendarEvents=function(){function e(e){if(!s&&!o){o=!0;var n=t.getTouchPosition(e);c=h=n.x,l=h=n.y,f=(new Date).getTime(),T=0,C=!0,x=void 0,v=g=p.monthsTranslate}}function i(e){if(o){var n=t.getTouchPosition(e);if(u=n.x,h=n.y,"undefined"==typeof x&&(x=!!(x||Math.abs(h-l)>Math.abs(u-c))),p.isH&&x)return void(o=!1);if(e.preventDefault(),p.animating)return void(o=!1);C=!1,s||(s=!0,w=p.wrapper[0].offsetWidth,y=p.wrapper[0].offsetHeight,p.wrapper.transition(0)),e.preventDefault(),k=p.isH?u-c:h-l,T=k/(p.isH?w:y),g=100*(p.monthsTranslate*d+T),p.wrapper.transform("translate3d("+(p.isH?g:0)+"%, "+(p.isH?0:g)+"%, 0)")}}function a(t){return o&&s?(o=s=!1,m=(new Date).getTime(),m-f<300?Math.abs(k)<10?p.resetMonth():k>=10?n?p.nextMonth():p.prevMonth():n?p.prevMonth():p.nextMonth():T<=-.5?n?p.prevMonth():p.nextMonth():T>=.5?n?p.nextMonth():p.prevMonth():p.resetMonth(),void setTimeout(function(){C=!0},100)):void(o=s=!1)}function r(e){if(C){var n=t(e.target).parents(".picker-calendar-day");if(0===n.length&&t(e.target).hasClass("picker-calendar-day")&&(n=t(e.target)),0!==n.length&&!n.hasClass("picker-calendar-day-disabled")){n.hasClass("picker-calendar-day-next")&&p.nextMonth(),n.hasClass("picker-calendar-day-prev")&&p.prevMonth();var i=n.attr("data-year"),a=n.attr("data-month"),r=n.attr("data-day");p.params.onDayClick&&p.params.onDayClick(p,n[0],i,a,r),p.addValue(new Date(i,a,r).getTime()),p.params.closeOnSelect&&!p.params.multiple&&p.close()}}}var o,s,c,l,u,h,f,m,v,g,w,y,T,k,x,C=!0;p.container.find(".picker-calendar-prev-month").on("click",p.prevMonth),p.container.find(".picker-calendar-next-month").on("click",p.nextMonth),p.container.find(".picker-calendar-prev-year").on("click",p.prevYear),p.container.find(".picker-calendar-next-year").on("click",p.nextYear),p.wrapper.on("click",r),p.params.touchMove&&(p.wrapper.on(t.touchEvents.start,e),p.wrapper.on(t.touchEvents.move,i),p.wrapper.on(t.touchEvents.end,a)),p.container[0].f7DestroyCalendarEvents=function(){p.container.find(".picker-calendar-prev-month").off("click",p.prevMonth),p.container.find(".picker-calendar-next-month").off("click",p.nextMonth),p.container.find(".picker-calendar-prev-year").off("click",p.prevYear),p.container.find(".picker-calendar-next-year").off("click",p.nextYear),p.wrapper.off("click",r),p.params.touchMove&&(p.wrapper.off(t.touchEvents.start,e),p.wrapper.off(t.touchEvents.move,i),p.wrapper.off(t.touchEvents.end,a))}},p.destroyCalendarEvents=function(t){"f7DestroyCalendarEvents"in p.container[0]&&p.container[0].f7DestroyCalendarEvents()},p.daysInMonth=function(t){var e=new Date(t);return new Date(e.getFullYear(),e.getMonth()+1,0).getDate()},p.monthHTML=function(t,e){t=new Date(t);var n=t.getFullYear(),i=t.getMonth();t.getDate();"next"===e&&(t=11===i?new Date(n+1,0):new Date(n,i+1,1)),"prev"===e&&(t=0===i?new Date(n-1,11):new Date(n,i-1,1)),"next"!==e&&"prev"!==e||(i=t.getMonth(),n=t.getFullYear());var a=p.daysInMonth(new Date(t.getFullYear(),t.getMonth()).getTime()-864e6),r=p.daysInMonth(t),o=new Date(t.getFullYear(),t.getMonth()).getDay();0===o&&(o=7);var s,c,l,u=[],h=6,d=7,f="",m=0+(p.params.firstDay-1),v=(new Date).setHours(0,0,0,0),g=p.params.minDate?new Date(p.params.minDate).getTime():null,w=p.params.maxDate?new Date(p.params.maxDate).getTime():null;if(p.value&&p.value.length)for(c=0;c<p.value.length;c++)u.push(new Date(p.value[c]).setHours(0,0,0,0));for(c=1;c<=h;c++){var y="";for(l=1;l<=d;l++){var T=l;m++;var k=m-o,x="";k<0?(k=a+k+1,x+=" picker-calendar-day-prev",s=new Date(i-1<0?n-1:n,i-1<0?11:i-1,k).getTime()):(k+=1,k>r?(k-=r,x+=" picker-calendar-day-next",s=new Date(i+1>11?n+1:n,i+1>11?0:i+1,k).getTime()):s=new Date(n,i,k).getTime()),s===v&&(x+=" picker-calendar-day-today"),u.indexOf(s)>=0&&(x+=" picker-calendar-day-selected"),p.params.weekendDays.indexOf(T-1)>=0&&(x+=" picker-calendar-day-weekend"),(g&&s<g||w&&s>w)&&(x+=" picker-calendar-day-disabled"),s=new Date(s);var C=s.getFullYear(),b=s.getMonth();y+='<div data-year="'+C+'" data-month="'+b+'" data-day="'+k+'" class="picker-calendar-day'+x+'" data-date="'+(C+"-"+b+"-"+k)+'"><span>'+k+"</span></div>"}f+='<div class="picker-calendar-row">'+y+"</div>"}return f='<div class="picker-calendar-month" data-year="'+n+'" data-month="'+i+'">'+f+"</div>"},p.animating=!1,p.updateCurrentMonthYear=function(t){"undefined"==typeof t?(p.currentMonth=parseInt(p.months.eq(1).attr("data-month"),10),p.currentYear=parseInt(p.months.eq(1).attr("data-year"),10)):(p.currentMonth=parseInt(p.months.eq("next"===t?p.months.length-1:0).attr("data-month"),10),p.currentYear=parseInt(p.months.eq("next"===t?p.months.length-1:0).attr("data-year"),10)),p.container.find(".current-month-value").text(p.params.monthNames[p.currentMonth]),p.container.find(".current-year-value").text(p.currentYear)},p.onMonthChangeStart=function(t){p.updateCurrentMonthYear(t),p.months.removeClass("picker-calendar-month-current picker-calendar-month-prev picker-calendar-month-next");var e="next"===t?p.months.length-1:0;p.months.eq(e).addClass("picker-calendar-month-current"),p.months.eq("next"===t?e-1:e+1).addClass("next"===t?"picker-calendar-month-prev":"picker-calendar-month-next"),p.params.onMonthYearChangeStart&&p.params.onMonthYearChangeStart(p,p.currentYear,p.currentMonth)},p.onMonthChangeEnd=function(t,e){p.animating=!1;var n,i,a;p.wrapper.find(".picker-calendar-month:not(.picker-calendar-month-prev):not(.picker-calendar-month-current):not(.picker-calendar-month-next)").remove(),"undefined"==typeof t&&(t="next",e=!0),e?(p.wrapper.find(".picker-calendar-month-next, .picker-calendar-month-prev").remove(),i=p.monthHTML(new Date(p.currentYear,p.currentMonth),"prev"),n=p.monthHTML(new Date(p.currentYear,p.currentMonth),"next")):a=p.monthHTML(new Date(p.currentYear,p.currentMonth),t),("next"===t||e)&&p.wrapper.append(a||n),("prev"===t||e)&&p.wrapper.prepend(a||i),p.months=p.wrapper.find(".picker-calendar-month"),p.setMonthsTranslate(p.monthsTranslate),p.params.onMonthAdd&&p.params.onMonthAdd(p,"next"===t?p.months.eq(p.months.length-1)[0]:p.months.eq(0)[0]),p.params.onMonthYearChangeEnd&&p.params.onMonthYearChangeEnd(p,p.currentYear,p.currentMonth)},p.setMonthsTranslate=function(t){t=t||p.monthsTranslate||0,"undefined"==typeof p.monthsTranslate&&(p.monthsTranslate=t),p.months.removeClass("picker-calendar-month-current picker-calendar-month-prev picker-calendar-month-next");var e=100*-(t+1)*d,n=100*-t*d,i=100*-(t-1)*d;p.months.eq(0).transform("translate3d("+(p.isH?e:0)+"%, "+(p.isH?0:e)+"%, 0)").addClass("picker-calendar-month-prev"),p.months.eq(1).transform("translate3d("+(p.isH?n:0)+"%, "+(p.isH?0:n)+"%, 0)").addClass("picker-calendar-month-current"),p.months.eq(2).transform("translate3d("+(p.isH?i:0)+"%, "+(p.isH?0:i)+"%, 0)").addClass("picker-calendar-month-next")},p.nextMonth=function(e){"undefined"!=typeof e&&"object"!=typeof e||(e="",p.params.animate||(e=0));var n=parseInt(p.months.eq(p.months.length-1).attr("data-month"),10),i=parseInt(p.months.eq(p.months.length-1).attr("data-year"),10),a=new Date(i,n),r=a.getTime(),o=!p.animating;if(p.params.maxDate&&r>new Date(p.params.maxDate).getTime())return p.resetMonth();if(p.monthsTranslate--,n===p.currentMonth){var s=100*-p.monthsTranslate*d,c=t(p.monthHTML(r,"next")).transform("translate3d("+(p.isH?s:0)+"%, "+(p.isH?0:s)+"%, 0)").addClass("picker-calendar-month-next");p.wrapper.append(c[0]),p.months=p.wrapper.find(".picker-calendar-month"),p.params.onMonthAdd&&p.params.onMonthAdd(p,p.months.eq(p.months.length-1)[0])}p.animating=!0,p.onMonthChangeStart("next");var l=100*p.monthsTranslate*d;p.wrapper.transition(e).transform("translate3d("+(p.isH?l:0)+"%, "+(p.isH?0:l)+"%, 0)"),o&&p.wrapper.transitionEnd(function(){p.onMonthChangeEnd("next")}),p.params.animate||p.onMonthChangeEnd("next")},p.prevMonth=function(e){"undefined"!=typeof e&&"object"!=typeof e||(e="",p.params.animate||(e=0));var n=parseInt(p.months.eq(0).attr("data-month"),10),i=parseInt(p.months.eq(0).attr("data-year"),10),a=new Date(i,n+1,(-1)),r=a.getTime(),o=!p.animating;if(p.params.minDate&&r<new Date(p.params.minDate).getTime())return p.resetMonth();if(p.monthsTranslate++,n===p.currentMonth){var s=100*-p.monthsTranslate*d,c=t(p.monthHTML(r,"prev")).transform("translate3d("+(p.isH?s:0)+"%, "+(p.isH?0:s)+"%, 0)").addClass("picker-calendar-month-prev");p.wrapper.prepend(c[0]),p.months=p.wrapper.find(".picker-calendar-month"),p.params.onMonthAdd&&p.params.onMonthAdd(p,p.months.eq(0)[0])}p.animating=!0,p.onMonthChangeStart("prev");var l=100*p.monthsTranslate*d;p.wrapper.transition(e).transform("translate3d("+(p.isH?l:0)+"%, "+(p.isH?0:l)+"%, 0)"),o&&p.wrapper.transitionEnd(function(){p.onMonthChangeEnd("prev")}),p.params.animate||p.onMonthChangeEnd("prev")},p.resetMonth=function(t){"undefined"==typeof t&&(t="");var e=100*p.monthsTranslate*d;p.wrapper.transition(t).transform("translate3d("+(p.isH?e:0)+"%, "+(p.isH?0:e)+"%, 0)")},p.setYearMonth=function(t,e,n){"undefined"==typeof t&&(t=p.currentYear),"undefined"==typeof e&&(e=p.currentMonth),"undefined"!=typeof n&&"object"!=typeof n||(n="",p.params.animate||(n=0));var i;if(i=t<p.currentYear?new Date(t,e+1,(-1)).getTime():new Date(t,e).getTime(),p.params.maxDate&&i>new Date(p.params.maxDate).getTime())return!1;if(p.params.minDate&&i<new Date(p.params.minDate).getTime())return!1;var a=new Date(p.currentYear,p.currentMonth).getTime(),r=i>a?"next":"prev",o=p.monthHTML(new Date(t,e));p.monthsTranslate=p.monthsTranslate||0;var s,c,l=p.monthsTranslate,u=!p.animating;i>a?(p.monthsTranslate--,p.animating||p.months.eq(p.months.length-1).remove(),p.wrapper.append(o),p.months=p.wrapper.find(".picker-calendar-month"),s=100*-(l-1)*d,p.months.eq(p.months.length-1).transform("translate3d("+(p.isH?s:0)+"%, "+(p.isH?0:s)+"%, 0)").addClass("picker-calendar-month-next")):(p.monthsTranslate++,p.animating||p.months.eq(0).remove(),p.wrapper.prepend(o),p.months=p.wrapper.find(".picker-calendar-month"),s=100*-(l+1)*d,p.months.eq(0).transform("translate3d("+(p.isH?s:0)+"%, "+(p.isH?0:s)+"%, 0)").addClass("picker-calendar-month-prev")),p.params.onMonthAdd&&p.params.onMonthAdd(p,"next"===r?p.months.eq(p.months.length-1)[0]:p.months.eq(0)[0]),p.animating=!0,p.onMonthChangeStart(r),c=100*p.monthsTranslate*d,p.wrapper.transition(n).transform("translate3d("+(p.isH?c:0)+"%, "+(p.isH?0:c)+"%, 0)"),u&&p.wrapper.transitionEnd(function(){p.onMonthChangeEnd(r,!0)}),p.params.animate||p.onMonthChangeEnd(r)},p.nextYear=function(){p.setYearMonth(p.currentYear+1)},p.prevYear=function(){p.setYearMonth(p.currentYear-1)},p.layout=function(){var t,e="",n="",i=p.value&&p.value.length?p.value[0]:(new Date).setHours(0,0,0,0),a=p.monthHTML(i,"prev"),r=p.monthHTML(i),o=p.monthHTML(i,"next"),s='<div class="picker-calendar-months"><div class="picker-calendar-months-wrapper">'+(a+r+o)+"</div></div>",c="";if(p.params.weekHeader){for(t=0;t<7;t++){var l=t+p.params.firstDay>6?t-7+p.params.firstDay:t+p.params.firstDay,u=p.params.dayNamesShort[l];c+='<div class="picker-calendar-week-day '+(p.params.weekendDays.indexOf(l)>=0?"picker-calendar-week-day-weekend":"")+'"> '+u+"</div>"}c='<div class="picker-calendar-week-days">'+c+"</div>"}n="weui-picker-calendar "+(p.params.cssClass||""),p.inline||(n="weui-picker-modal "+n);var h=p.params.toolbar?p.params.toolbarTemplate.replace(/{{closeText}}/g,p.params.toolbarCloseText):"";p.params.toolbar&&(h=p.params.toolbarTemplate.replace(/{{closeText}}/g,p.params.toolbarCloseText).replace(/{{monthPicker}}/g,p.params.monthPicker?p.params.monthPickerTemplate:"").replace(/{{yearPicker}}/g,p.params.yearPicker?p.params.yearPickerTemplate:"")),e='<div class="'+n+'">'+h+'<div class="picker-modal-inner">'+c+s+"</div></div>",p.pickerHTML=e},p.params.input&&(p.input=t(p.params.input),p.input.length>0&&(p.params.inputReadOnly&&p.input.prop("readOnly",!0),p.inline||p.input.on("click",c),p.params.inputReadOnly&&p.input.on("focus mousedown",function(t){t.preventDefault()}))),p.inline||t(document).on("click touchend",l),p.opened=!1,p.open=function(){var e=r()&&!1,n=!1;p.opened||(p.value||p.params.value&&(p.value=p.params.value,n=!0),p.layout(),e?(p.pickerHTML='<div class="popover popover-picker-calendar"><div class="popover-inner">'+p.pickerHTML+"</div></div>",p.popover=t.popover(p.pickerHTML,p.params.input,!0),p.container=t(p.popover).find(".weui-picker-modal"),
+t(p.popover).on("close",function(){u()})):p.inline?(p.container=t(p.pickerHTML),p.container.addClass("picker-modal-inline"),t(p.params.container).append(p.container)):(p.container=t(t.openPicker(p.pickerHTML)),t(p.container).on("close",function(){u()})),p.container[0].f7Calendar=p,p.wrapper=p.container.find(".picker-calendar-months-wrapper"),p.months=p.wrapper.find(".picker-calendar-month"),p.updateCurrentMonthYear(),p.monthsTranslate=0,p.setMonthsTranslate(),p.initCalendarEvents(),n&&p.updateValue()),p.opened=!0,p.initialized=!0,p.params.onMonthAdd&&p.months.each(function(){p.params.onMonthAdd(p,this)}),p.params.onOpen&&p.params.onOpen(p)},p.close=function(){if(p.opened&&!p.inline)return p.animating=!1,o()?void t.closePicker(p.popover):void t.closePicker(p.container)},p.destroy=function(){p.close(),p.params.input&&p.input.length>0&&(p.input.off("click focus",c),p.input.data("calendar",null)),t("html").off("click",l)},p.inline&&p.open(),p},r=function(t){return t<10?"0"+t:t};t.fn.calendar=function(e,n){return e=e||{},this.each(function(){var i=t(this);if(i[0]){var o={};"INPUT"===i[0].tagName.toUpperCase()?o.input=i:o.container=i;var s=i.data("calendar");if(!s)if("string"==typeof e);else{if(!e.value&&i.val()&&(e.value=[i.val()]),!e.value){var c=new Date;e.value=[c.getFullYear()+"/"+r(c.getMonth()+1)+"/"+r(c.getDate())]}s=i.data("calendar",new a(t.extend(o,e)))}"string"==typeof e&&s[e].call(s,n)}})},e=t.fn.calendar.prototype.defaults={value:void 0,monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["周日","周一","周二","周三","周四","周五","周六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],firstDay:1,weekendDays:[0,6],multiple:!1,dateFormat:"yyyy/mm/dd",direction:"horizontal",minDate:null,maxDate:null,touchMove:!0,animate:!0,closeOnSelect:!0,monthPicker:!0,monthPickerTemplate:'<div class="picker-calendar-month-picker"><a href="javascript:;" class="link icon-only picker-calendar-prev-month"><i class="icon icon-prev"></i></a><div class="current-month-value"></div><a href="javascript:;" class="link icon-only picker-calendar-next-month"><i class="icon icon-next"></i></a></div>',yearPicker:!0,yearPickerTemplate:'<div class="picker-calendar-year-picker"><a href="javascript:;" class="link icon-only picker-calendar-prev-year"><i class="icon icon-prev"></i></a><span class="current-year-value"></span><a href="javascript:;" class="link icon-only picker-calendar-next-year"><i class="icon icon-next"></i></a></div>',weekHeader:!0,scrollToInput:!0,inputReadOnly:!0,convertToPopover:!0,onlyInPopover:!1,toolbar:!0,toolbarCloseText:"Done",toolbarTemplate:'<div class="toolbar"><div class="toolbar-inner">{{yearPicker}}{{monthPicker}}</div></div>'}}($),+function(t){"use strict";var e,n=function(t){return t<10?"0"+t:t},i=function(e,n){this.input=t(e),this.params=n||{},this.initMonthes=n.monthes,this.initYears=n.years;var i=t.extend({},n,this.getConfig());t(this.input).picker(i)};i.prototype={getDays:function(t){for(var e=[],n=1;n<=(t||31);n++)e.push(n<10?"0"+n:n);return e},getDaysByMonthAndYear:function(t,e){var n=new Date(e,parseInt(t)+1-1,1),i=new Date(n-1);return this.getDays(i.getDate())},getConfig:function(){var t,e=new Date,i=this.params,a=this,r={rotateEffect:!1,cssClass:"datetime-picker",value:[e.getFullYear(),n(e.getMonth()+1),n(e.getDate()),n(e.getHours()),n(e.getMinutes())],onChange:function(e,n,r){var o=(e.cols,a.getDaysByMonthAndYear(n[1],n[0])),s=n[2];s>o.length&&(s=o.length),e.cols[4].setValue(s);var c=new Date(n[0]+"-"+n[1]+"-"+n[2]),l=!0;if(i.min){var u=new Date("function"==typeof i.min?i.min():i.min);c<+u&&(e.setValue(t),l=!1)}if(i.max){var p=new Date("function"==typeof i.max?i.max():i.max);c>+p&&(e.setValue(t),l=!1)}l&&(t=n),a.params.onChange&&a.params.onChange.apply(this,arguments)},formatValue:function(t,e,n){return a.params.format(t,e,n)},cols:[{values:this.initYears},{divider:!0,content:i.yearSplit},{values:this.initMonthes},{divider:!0,content:i.monthSplit},{values:function(){for(var t=[],e=1;e<=31;e++)t.push(n(e));return t}()}]};i.dateSplit&&r.cols.push({divider:!0,content:i.dateSplit}),r.cols.push({divider:!0,content:i.datetimeSplit});var o=a.params.times();o&&o.length&&(r.cols=r.cols.concat(o));var s=this.input.val();return s&&(r.value=i.parse(s)),this.params.value&&(this.input.val(this.params.value),r.value=i.parse(this.params.value)),r}},t.fn.datetimePicker=function(n){return n=t.extend({},e,n),this.each(function(){if(this){var e=t(this),a=e.data("datetime");return a||e.data("datetime",new i(this,n)),a}})},e=t.fn.datetimePicker.prototype.defaults={input:void 0,min:void 0,max:void 0,yearSplit:"-",monthSplit:"-",dateSplit:"",datetimeSplit:" ",monthes:"01 02 03 04 05 06 07 08 09 10 11 12".split(" "),years:function(){for(var t=[],e=1950;e<=2030;e++)t.push(e);return t}(),times:function(){return[{values:function(){for(var t=[],e=0;e<24;e++)t.push(n(e));return t}()},{divider:!0,content:":"},{values:function(){for(var t=[],e=0;e<60;e++)t.push(n(e));return t}()}]},format:function(t,e){return t.cols.map(function(t){return t.value||t.content}).join("")},parse:function(t){var e=t.split(this.datetimeSplit);return e[0].split(/\D/).concat(e[1].split(/:|时|分|秒/)).filter(function(t){return!!t})}}}($),+function(t){"use strict";t.openPopup=function(e,n){t.closePopup(),e=t(e),e.show(),e.width(),e.addClass("weui-popup__container--visible");var i=e.find(".weui-popup__modal");i.width(),i.transitionEnd(function(){i.trigger("open")})},t.closePopup=function(e,n){e=t(e||".weui-popup__container--visible"),e.find(".weui-popup__modal").transitionEnd(function(){var i=t(this);i.trigger("close"),e.hide(),n&&e.remove()}),e.removeClass("weui-popup__container--visible")},t(document).on("click",".close-popup, .weui-popup__overlay",function(){t.closePopup()}).on("click",".open-popup",function(){t(t(this).data("target")).popup()}).on("click",".weui-popup__container",function(e){t(e.target).hasClass("weui-popup__container")&&t.closePopup()}),t.fn.popup=function(){return this.each(function(){t.openPopup(this)})}}($),+function(t){"use strict";var e,n,i,a,r,o,s=function(n){var i=t.getTouchPosition(n);a=i,r=o=0,e.addClass("touching")},c=function(n){if(!a)return!1;n.preventDefault(),n.stopPropagation();var i=t.getTouchPosition(n);r=i.x-a.x,o=i.y-a.y,o>0&&(o=Math.sqrt(o)),e.css("transform","translate3d(0, "+o+"px, 0)")},l=function(){e.removeClass("touching"),e.attr("style",""),o<0&&Math.abs(o)>.38*e.height()&&t.closeNotification(),Math.abs(r)<=1&&Math.abs(o)<=1&&e.trigger("noti-click"),a=!1},u=function(e){e.on(t.touchEvents.start,s),e.on(t.touchEvents.move,c),e.on(t.touchEvents.end,l)};t.notification=t.noti=function(a){a=t.extend({},n,a),e=t(".weui-notification"),e[0]||(e=t('<div class="weui-notification"></div>').appendTo(document.body),u(e)),e.off("noti-click"),a.onClick&&e.on("noti-click",function(){a.onClick(a.data)}),e.html(t.t7.compile(a.tpl)(a)),e.show(),e.addClass("weui-notification--in"),e.data("params",a);var r=function(){i&&(clearTimeout(i),i=null),i=setTimeout(function(){e.hasClass("weui-notification--touching")?r():t.closeNotification()},a.time)};r()},t.closeNotification=function(){i&&clearTimeout(i),i=null;var e=t(".weui-notification").removeClass("weui-notification--in").transitionEnd(function(){t(this).remove()});if(e[0]){var n=t(".weui-notification").data("params");n&&n.onClose&&n.onClose(n.data)}},n=t.noti.prototype.defaults={title:void 0,text:void 0,media:void 0,time:4e3,onClick:void 0,onClose:void 0,data:void 0,tpl:'<div class="weui-notification__inner">{{#if media}}<div class="weui-notification__media">{{media}}</div>{{/if}}<div class="weui-notification__content">{{#if title}}<div class="weui-notification__title">{{title}}</div>{{/if}}{{#if text}}<div class="weui-notification__text">{{text}}</div>{{/if}}</div><div class="weui-notification__handle-bar"></div></div>'}}($),+function(t){"use strict";var e;t.toptip=function(n,i,a){if(n){"string"==typeof i&&(a=i,i=void 0),i=i||3e3;var r=a?"bg-"+a:"bg-danger",o=t(".weui-toptips").remove();o=t('<div class="weui-toptips"></div>').appendTo(document.body),o.html(n),o[0].className="weui-toptips "+r,clearTimeout(e),o.hasClass("weui-toptips_visible")||(o.show().width(),o.addClass("weui-toptips_visible")),e=setTimeout(function(){o.removeClass("weui-toptips_visible").transitionEnd(function(){o.remove()})},i)}}}($),+function(t){"use strict";var e=function(e,n){this.container=t(e),this.handler=this.container.find(".weui-slider__handler"),this.track=this.container.find(".weui-slider__track"),this.value=this.container.find(".weui-slider-box__value"),this.bind(),"function"==typeof n&&(this.callback=n)};e.prototype.bind=function(){this.container.on(t.touchEvents.start,t.proxy(this.touchStart,this)).on(t.touchEvents.end,t.proxy(this.touchEnd,this)),t(document.body).on(t.touchEvents.move,t.proxy(this.touchMove,this))},e.prototype.touchStart=function(e){e.preventDefault(),this.start=t.getTouchPosition(e),this.width=this.container.find(".weui-slider__inner").width(),this.left=parseInt(this.container.find(".weui-slider__handler").css("left")),this.touching=!0},e.prototype.touchMove=function(e){if(!this.touching)return!0;var n=t.getTouchPosition(e),i=n.x-this.start.x,a=i+this.left,r=parseInt(a/this.width*100);r<0&&(r=0),r>100&&(r=100),this.handler.css("left",r+"%"),this.track.css("width",r+"%"),this.value.text(r),this.callback&&this.callback.call(this,r),this.container.trigger("change",r)},e.prototype.touchEnd=function(t){this.touching=!1},t.fn.slider=function(n){this.each(function(){var i=t(this),a=i.data("slider");return a?a:void i.data("slider",new e(this,n))})}}($),+function(t){"use strict";var e=[],n="swipeout-touching",i=function(n){this.container=t(n),this.mover=this.container.find(">.weui-cell__bd"),this.attachEvents(),e.push(this)};i.prototype.touchStart=function(e){var i=t.getTouchPosition(e);this.container.addClass(n),this.start=i,this.startX=0,this.startTime=+new Date;var a=this.mover.css("transform").match(/-?[\d\.]+/g);a&&a.length&&(this.startX=parseInt(a[4])),this.diffX=this.diffY=0,this._closeOthers(),this.limit=this.container.find(">.weui-cell__ft").width()||68},i.prototype.touchMove=function(e){if(!this.start)return!0;var n=t.getTouchPosition(e);if(this.diffX=n.x-this.start.x,this.diffY=n.y-this.start.y,Math.abs(this.diffX)<Math.abs(this.diffY))return this.close(),this.start=!1,!0;e.preventDefault(),e.stopPropagation();var i=this.diffX+this.startX;i>0&&(i=0),Math.abs(i)>this.limit&&(i=-(Math.pow(-(i+this.limit),.7)+this.limit)),this.mover.css("transform","translate3d("+i+"px, 0, 0)")},i.prototype.touchEnd=function(){if(!this.start)return!0;this.start=!1;var t=this.diffX+this.startX,e=new Date-this.startTime;this.diffX<-5&&e<200?this.open():this.diffX>=0&&e<200?this.close():t>0||-t<=this.limit/2?this.close():this.open()},i.prototype.close=function(){this.container.removeClass(n),this.mover.css("transform","translate3d(0, 0, 0)"),this.container.trigger("swipeout-close")},i.prototype.open=function(){this.container.removeClass(n),this._closeOthers(),this.mover.css("transform","translate3d("+-this.limit+"px, 0, 0)"),this.container.trigger("swipeout-open")},i.prototype.attachEvents=function(){var e=this.mover;e.on(t.touchEvents.start,t.proxy(this.touchStart,this)),e.on(t.touchEvents.move,t.proxy(this.touchMove,this)),e.on(t.touchEvents.end,t.proxy(this.touchEnd,this))},i.prototype._closeOthers=function(){var t=this;e.forEach(function(e){e!==t&&e.close()})};var a=function(t){return new i(t)};t.fn.swipeout=function(e){return this.each(function(){var n=t(this),i=n.data("swipeout")||a(this);n.data("swipeout",i),"string"==typeof e&&i[e]()})},t(".weui-cell_swiped").swipeout()}($);
\ No newline at end of file
diff --git a/oauth/src/main/resources/templates/editpaypwd.html b/oauth/src/main/resources/templates/editpaypwd.html
new file mode 100644
index 0000000..b5406e3
--- /dev/null
+++ b/oauth/src/main/resources/templates/editpaypwd.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>修改支付密码</title>
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
+ <link rel="stylesheet" type="text/css" th:href="@{/css/aui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/weui.min.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/jquery-weui.css}"/>
+</head>
+<body>
+<header class="aui-bar aui-bar-nav" >
+ <a class="aui-pull-left" th:href="@{/index}">
+ <span class="aui-iconfont aui-icon-left"></span>
+ </a>
+ <div class="aui-title">修改支付密码</div>
+</header>
+<div>
+ <div class="weui-cells weui-cells_form">
+ <div class="weui-cell">
+ <div class="weui-cell__hd"><label class="weui-label">原支付密码</label></div>
+ <div class="weui-cell__bd">
+ <input class="weui-input" type="password" id="oldpwd" placeholder="6位数字" maxlength="6">
+ </div>
+ </div>
+ </div>
+ <div class="weui-cells weui-cells_form">
+ <div class="weui-cell">
+ <div class="weui-cell__hd"><label class="weui-label">新支付密码</label></div>
+ <div class="weui-cell__bd">
+ <input class="weui-input" type="password" id="pwd" placeholder="6位数字" maxlength="6">
+ </div>
+ </div>
+ <div class="weui-cell">
+ <div class="weui-cell__hd"><label class="weui-label">确认密码</label></div>
+ <div class="weui-cell__bd">
+ <input class="weui-input" type="password" id="repwd" placeholder="请再次确认密码" maxlength="6">
+ </div>
+ </div>
+ </div>
+ <div style="padding: 20px;">
+ <a href="javascript:doSubmit();" class="weui-btn weui-btn_primary">确认修改</a>
+ </div>
+</div>
+</body>
+<script th:src="@{/js/jquery-2.1.4.js}" type="text/javascript"></script>
+<script th:src="@{/js/jquery-weui.min.js}" type="text/javascript"></script>
+<script type="text/javascript">
+ let url = "[[@{/u}]]";
+ function doSubmit() {
+ let oldpwd = $("#oldpwd").val();
+ let pwd = $("#pwd").val();
+ let repwd = $("#repwd").val();
+ if(oldpwd==null||pwd==null||repwd==null||oldpwd==''||pwd==''||repwd==''){
+ return
+ }
+ if(pwd.length!=6){
+ $.alert("密码长度为6位,请确认", "提示");
+ return;
+ }
+ if(pwd!=repwd){
+ $.alert("两次密码不一致,请确认", "提示");
+ return;
+ }
+ let token = $("meta[name='_csrf_token']").attr("value");
+ $.showLoading("正在处理");
+ let param = {
+ "oldpwd": oldpwd,
+ "pwd": pwd,
+ "repwd": repwd,
+ "type":"renew"
+ };
+ $.ajax({
+ url: url+"/dopaypwd",
+ type: "POST",
+ dataType: "json",
+ headers: {
+ 'X-CSRF-TOKEN':token,
+ },
+ data: param,
+ success: function (ret) {
+ $.hideLoading();
+ if(ret.code==200){
+ $.alert("密码修改成功", "提示",function (e) {
+ window.location.href="[[@{/index}]]";
+ });
+ }else if(ret.code==-1){
+ $.alert(ret.msg, "错误",function (e) {
+ window.location.href="[[@{/logout}]]";
+ });
+ }else {
+ $.alert(ret.msg, "错误");
+ }
+ },
+ error: function (status, err) {
+ $.alert("处理失败,请求异常,稍后再试!", "错误");
+ $.hideLoading();
+ }
+ });
+ }
+</script>
+</html>
\ No newline at end of file
diff --git a/oauth/src/main/resources/templates/editpwd.html b/oauth/src/main/resources/templates/editpwd.html
new file mode 100644
index 0000000..72ce886
--- /dev/null
+++ b/oauth/src/main/resources/templates/editpwd.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>修改登录密码</title>
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
+ <link rel="stylesheet" type="text/css" th:href="@{/css/aui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/weui.min.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/jquery-weui.css}"/>
+</head>
+<body>
+<header class="aui-bar aui-bar-nav" >
+ <a class="aui-pull-left" th:href="@{/index}">
+ <span class="aui-iconfont aui-icon-left"></span>
+ </a>
+ <div class="aui-title">修改登录密码</div>
+</header>
+<div>
+ <div class="weui-cells weui-cells_form">
+ <div class="weui-cell">
+ <div class="weui-cell__hd"><label class="weui-label">原登录密码</label></div>
+ <div class="weui-cell__bd">
+ <input class="weui-input" type="password" id="oldpwd" placeholder="6位以上字符">
+ </div>
+ </div>
+ </div>
+ <div class="weui-cells weui-cells_form">
+ <div class="weui-cell">
+ <div class="weui-cell__hd"><label class="weui-label">新登录密码</label></div>
+ <div class="weui-cell__bd">
+ <input class="weui-input" type="password" id="pwd" placeholder="6位以上字符">
+ </div>
+ </div>
+ <div class="weui-cell">
+ <div class="weui-cell__hd"><label class="weui-label">确认密码</label></div>
+ <div class="weui-cell__bd">
+ <input class="weui-input" type="password" id="repwd" placeholder="请再次确认密码">
+ </div>
+ </div>
+ </div>
+ <div style="padding: 20px;">
+ <a href="javascript:doSubmit();" class="weui-btn weui-btn_primary">确认修改</a>
+ </div>
+</div>
+</body>
+<script th:src="@{/js/jquery-2.1.4.js}" type="text/javascript"></script>
+<script th:src="@{/js/jquery-weui.min.js}" type="text/javascript"></script>
+<script type="text/javascript">
+ let url = "[[@{/u}]]";
+ function doSubmit() {
+ let oldpwd = $("#oldpwd").val();
+ let pwd = $("#pwd").val();
+ let repwd = $("#repwd").val();
+ if(oldpwd==null||pwd==null||repwd==null||oldpwd==''||pwd==''||repwd==''){
+ return
+ }
+ if(pwd.length<6){
+ $.alert("密码长度至少6位,请确认", "提示");
+ return;
+ }
+ if(pwd!=repwd){
+ $.alert("两次密码不一致,请确认", "提示");
+ return;
+ }
+ let token = $("meta[name='_csrf_token']").attr("value");
+ $.showLoading("正在处理");
+ let param = {
+ "oldpwd": oldpwd,
+ "newpwd": pwd,
+ "renewpwd": repwd
+ };
+ $.ajax({
+ url: url+"/doeditpwd",
+ type: "POST",
+ dataType: "json",
+ headers: {
+ 'X-CSRF-TOKEN':token,
+ },
+ data: param,
+ success: function (ret) {
+ $.hideLoading();
+ if(ret.code==200){
+ $.alert("密码修改成功", "提示",function (e) {
+ window.location.href="[[@{/index}]]";
+ });
+ }else if(ret.code==-1){
+ $.alert(ret.msg, "错误",function (e) {
+ window.location.href="[[@{/logout}]]";
+ });
+ }else {
+ $.alert(ret.msg, "错误");
+ }
+ },
+ error: function (status, err) {
+ $.alert("处理失败,请求异常,稍后再试!", "错误");
+ $.hideLoading();
+ }
+ });
+ }
+</script>
+</html>
\ No newline at end of file
diff --git a/oauth/src/main/resources/templates/findby.html b/oauth/src/main/resources/templates/findby.html
new file mode 100644
index 0000000..0ea3e38
--- /dev/null
+++ b/oauth/src/main/resources/templates/findby.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>找回密码</title>
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
+ <link rel="stylesheet" type="text/css" th:href="@{/css/aui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/weui.min.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/jquery-weui.css}"/>
+</head>
+<body>
+<header class="aui-bar aui-bar-nav" >
+ <a class="aui-pull-left" th:href="@{/index}">
+ <span class="aui-iconfont aui-icon-left"></span>
+ </a>
+ <div class="aui-title">找回密码</div>
+</header>
+<div>
+ <div class="weui-cells weui-cells_form">
+ <div class="weui-cell" style="padding:0 10px; ">
+ <div class="weui-cell__hd"><label class="weui-label" style="width: 80px;font-size: 14px;" th:text="${type=='email'?'邮箱':'手机号'}"></label></div>
+ <div class="weui-cell__bd">
+ <input class="weui-input" type="tel" id="phone" style="font-size: 14px;" maxlength="11" disabled="disabled" th:value="${type=='email'?email:phone}">
+ </div>
+ </div>
+ <div class="weui-cell weui-cell_vcode" style="padding:0 10px; ">
+ <div class="weui-cell__hd">
+ <label class="weui-label" style="width: 80px;font-size: 14px;">验证码</label>
+ </div>
+ <div class="weui-cell__bd">
+ <input class="weui-input" type="tel" id="code" style="font-size: 14px;" placeholder="请输入验证码" maxlength="6">
+ </div>
+ <div class="weui-cell__ft">
+ <button class="weui-vcode-btn" onclick="getCode()" id="codebtn" style="width: 100px;font-size: 14px;">获取验证码</button>
+ </div>
+ </div>
+ </div>
+ <section class="aui-content-padded" style="margin-top: 30px;">
+ <div class="aui-btn aui-btn-block aui-btn-info" onclick="doSubmit()">下一步</div>
+ </section>
+</div>
+</body>
+<script th:src="@{/js/jquery-2.1.4.js}" type="text/javascript"></script>
+<script th:src="@{/js/jquery-weui.min.js}" type="text/javascript"></script>
+<script type="text/javascript">
+ let url = "[[@{/u}]]";
+ let pwdtype = "[[${pwdtype}]]";
+ let type = "[[${type}]]";
+ let wait=60;
+ function btnTime(id) {
+ if (wait == 0) {
+ $("#"+id).removeAttr("disabled");
+ $("#"+id).removeClass("vcodedisabled")
+ $("#"+id).text("获取验证码");
+ wait = 60;
+ } else {
+ $("#"+id).attr("disabled", "disabled");
+ $("#"+id).text(wait + "s");
+ wait--;
+ setTimeout(function() {
+ btnTime(id)
+ },
+ 1000)
+ }
+ }
+ function getCode(){
+ let token = $("meta[name='_csrf_token']").attr("value");
+ $.showLoading("正在处理");
+ let param = {
+ "pwdtype": pwdtype,
+ "type": type
+ };
+ $.ajax({
+ url: url+"/code",
+ type: "POST",
+ dataType: "json",
+ headers: {
+ 'X-CSRF-TOKEN':token,
+ },
+ data: param,
+ success: function (ret) {
+ $.hideLoading();
+ if(ret.code==200){
+ //TODO call
+ $("#codebtn").attr("disabled","disabled")
+ $("#codebtn").addClass("vcodedisabled")
+ btnTime('codebtn');
+ }else {
+ $.alert(ret.msg, "错误");
+ }
+ },
+ error: function (status, err) {
+ $.alert("处理失败,请求异常,稍后再试!", "错误");
+ $.hideLoading();
+ }
+ });
+ }
+ function doSubmit() {
+ let code = $("#code").val();
+ if(code==null||code==''){
+ return
+ }
+ let token = $("meta[name='_csrf_token']").attr("value");
+ $.showLoading("正在处理");
+ let param = {
+ "code": code,
+ "pwdtype": pwdtype,
+ "type": type
+ };
+ $.ajax({
+ url: url+"/checkcode",
+ type: "POST",
+ dataType: "json",
+ headers: {
+ 'X-CSRF-TOKEN':token,
+ },
+ data: param,
+ success: function (ret) {
+ $.hideLoading();
+ if(ret.code==200){
+ if(pwdtype=='paypwd'){
+ window.location.href=url+"/setpaypwd?randcode="+ret.randcode;
+ }else {
+ window.location.href=url+"/setpwd?randcode="+ret.randcode;
+ }
+ }else {
+ $.alert(ret.msg, "错误");
+ }
+ },
+ error: function (status, err) {
+ $.alert("处理失败,请求异常,稍后再试!", "错误");
+ $.hideLoading();
+ }
+ });
+ }
+</script>
+</html>
\ No newline at end of file
diff --git a/oauth/src/main/resources/templates/index.html b/oauth/src/main/resources/templates/index.html
new file mode 100644
index 0000000..49bdb40
--- /dev/null
+++ b/oauth/src/main/resources/templates/index.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>用户中心</title>
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
+ <link rel="stylesheet" type="text/css" th:href="@{/css/aui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/weui.min.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/jquery-weui.css}"/>
+ <style type="text/css">
+ .text-white {
+ color: #ffffff !important;
+ }
+
+ .aui-grid [class*=aui-col-] {
+ padding: 0.75rem 0;
+ }
+ </style>
+</head>
+<body>
+<!-- 顶部 -->
+<section class="aui-content" id="user-info" >
+ <div class="aui-list aui-media-list aui-list-noborder aui-bg-info" style="padding-top: 20px;" onclick="switchTo(1)">
+ <div class="aui-list-item aui-list-item-middle">
+ <div class="aui-media-list-item-inner ">
+ <div class="aui-list-item-media" style="width:3rem;">
+ <img th:src="@{/img/icon_header.png}" class="aui-img-round">
+ </div>
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-text text-white aui-font-size-18">[[${uinfor.name}]]</div>
+ <div class="aui-list-item-text text-white">
+ <div>[[${loginid}]]</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</section>
+<section class="aui-content aui-grid aui-margin-b-15">
+ <div class="aui-row">
+ <div class="aui-col-xs-4 aui-border-r" onclick="switchTo(2)">
+ <big class="aui-text-warning">[[${uinfor.availbal}]]
+ <small> 元</small>
+ </big>
+ <div class="aui-gird-lable aui-font-size-12">余额</div>
+ </div>
+ <div class="aui-col-xs-4" onclick="switchTo(3)">
+ <big class="aui-text-success" ><span th:text="${uinfor.points!=null?uinfor.points:0 }" ></span>
+ <small> 分</small>
+ </big>
+ <div class="aui-gird-lable aui-font-size-12">积分</div>
+ </div>
+ <div class="aui-col-xs-4 aui-border-r" onclick="switchTo(4)">
+ <big class="aui-text-danger">0
+ <small> 个</small>
+ </big>
+ <div class="aui-gird-lable aui-font-size-12">优惠</div>
+ </div>
+ </div>
+</section>
+<section class="aui-content">
+ <ul class="aui-list aui-list-in aui-margin-b-15">
+ <li class="aui-list-item" onclick="switchTo(5)">
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-title">交易流水</div>
+ </div>
+ </li>
+ </ul>
+ <ul class="aui-list aui-list-in aui-margin-b-15">
+ <li class="aui-list-item" onclick="switchTo(6)">
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-title">消费限额</div>
+ </div>
+ </li>
+ <li class="aui-list-item" onclick="switchTo(8)">
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-title">支付密码</div>
+ </div>
+ </li>
+ <li class="aui-list-item" onclick="switchTo(7)">
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-title">登录密码</div>
+ </div>
+ </li>
+ </ul>
+ <div style="padding: 20px;position: absolute;bottom: 0;left: 0;right: 0;">
+ <a th:href="@{/logout}" class="weui-btn weui-btn_warn">退出登录</a>
+ </div>
+</section>
+</body>
+<script th:src="@{/js/jquery-2.1.4.js}" type="text/javascript"></script>
+<script type="text/javascript">
+ let url = "[[@{/u}]]";
+ function switchTo(index) {
+ console.log(url)
+ if(index==1){
+ window.location.href=url+"/infor";
+ }else if(index==6){
+ window.location.href=url+"/limit";
+ }else if(index==7){
+ window.location.href=url+"/editpwd";
+ }else if(index==8){
+ window.location.href=url+"/paypwd";
+ }
+ }
+</script>
+</html>
\ No newline at end of file
diff --git a/oauth/src/main/resources/templates/infor.html b/oauth/src/main/resources/templates/infor.html
new file mode 100644
index 0000000..5eef441
--- /dev/null
+++ b/oauth/src/main/resources/templates/infor.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>个人信息</title>
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
+ <link rel="stylesheet" type="text/css" th:href="@{/css/aui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/weui.min.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/jquery-weui.css}"/>
+ <style type="text/css">
+ .text-white {
+ color: #ffffff !important;
+ }
+
+ .aui-grid [class*=aui-col-] {
+ padding: 0.75rem 0;
+ }
+ </style>
+</head>
+<body>
+<header class="aui-bar aui-bar-nav">
+ <a class="aui-pull-left" th:href="@{/index}">
+ <span class="aui-iconfont aui-icon-left"></span>
+ </a>
+ <div class="aui-title">个人信息</div>
+</header>
+<section class="aui-content">
+ <ul class="aui-list aui-list-in aui-margin-b-15">
+ <li class="aui-list-item">
+ <div class="aui-list-item-inner ">
+ <div class="aui-list-item-title">账号</div>
+ <div class="aui-list-item-right">[[${loginid}]]</div>
+ </div>
+ </li>
+ <li class="aui-list-item">
+ <div class="aui-list-item-inner ">
+ <div class="aui-list-item-title">姓名</div>
+ <div class="aui-list-item-right">[[${uinfor.name}]]</div>
+ </div>
+ </li>
+ <li class="aui-list-item">
+ <div class="aui-list-item-inner ">
+ <div class="aui-list-item-title">部门</div>
+ <div class="aui-list-item-right">[[${deptname}]]</div>
+ </div>
+ </li>
+ <li class="aui-list-item">
+ <div class="aui-list-item-inner ">
+ <div class="aui-list-item-title">证件号</div>
+ <div class="aui-list-item-right">[[${idno}]]</div>
+ </div>
+ </li>
+ <li class="aui-list-item">
+ <div class="aui-list-item-inner ">
+ <div class="aui-list-item-title">有效期</div>
+ <div class="aui-list-item-right">[[${expiredate}]]</div>
+ </div>
+ </li>
+ </ul>
+ <ul class="aui-list aui-list-in aui-margin-b-15">
+ <li class="aui-list-item" onclick="switchTo(1)">
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-title">邮箱</div>
+ <div class="aui-list-item-right">[[${email}]]</div>
+ </div>
+ </li>
+ <li class="aui-list-item" onclick="switchTo(2)">
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-title">手机</div>
+ <div class="aui-list-item-right">[[${phone}]]</div>
+ </div>
+ </li>
+ </ul>
+</section>
+</body>
+<script th:src="@{/js/jquery-2.1.4.js}" type="text/javascript"></script>
+<script th:src="@{/js/jquery-weui.min.js}" type="text/javascript"></script>
+<script type="text/javascript">
+ let url = "[[@{/u}]]";
+
+ function switchTo(index) {
+ console.log(url)
+ if (index == 1) {
+ $.prompt({
+ title: '邮箱',
+ text: '',
+ input: '',
+ empty: false, // 是否允许为空
+ onOK: function (input) {
+ changeIt("email", input);
+ },
+ onCancel: function () {
+ //点击取消
+ }
+ });
+ } else {
+ $.prompt({
+ title: '手机',
+ text: '',
+ input: '',
+ empty: false, // 是否允许为空
+ onOK: function (input) {
+ changeIt("phone", input);
+ },
+ onCancel: function () {
+ //点击取消
+ }
+ });
+ }
+ }
+
+ function changeIt(type, val) {
+ let token = $("meta[name='_csrf_token']").attr("value");
+ $.showLoading("正在处理");
+ let param = {
+ "type": type,
+ "vale": val
+ };
+ $.ajax({
+ url: url + "/doinfor",
+ type: "POST",
+ dataType: "json",
+ headers: {
+ 'X-CSRF-TOKEN': token,
+ },
+ data: param,
+ success: function (ret) {
+ $.hideLoading();
+ if (ret.code == 200) {
+ window.location.reload();
+ } else {
+ $.alert(ret.msg, "错误");
+ }
+ },
+ error: function (status, err) {
+ $.alert("处理失败,请求异常,稍后再试!", "错误");
+ $.hideLoading();
+ }
+ });
+ }
+</script>
+</html>
\ No newline at end of file
diff --git a/oauth/src/main/resources/templates/limit.html b/oauth/src/main/resources/templates/limit.html
new file mode 100644
index 0000000..7622d58
--- /dev/null
+++ b/oauth/src/main/resources/templates/limit.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>消费限额</title>
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
+ <link rel="stylesheet" type="text/css" th:href="@{/css/aui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/weui.min.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/jquery-weui.css}"/>
+ <style type="text/css">
+ .text-white {
+ color: #ffffff !important;
+ }
+
+ .aui-grid [class*=aui-col-] {
+ padding: 0.75rem 0;
+ }
+ </style>
+</head>
+<body>
+<header class="aui-bar aui-bar-nav">
+ <a class="aui-pull-left" th:href="@{/index}">
+ <span class="aui-iconfont aui-icon-left"></span>
+ </a>
+ <div class="aui-title">消费限额</div>
+</header>
+<section class="aui-content">
+ <ul class="aui-list aui-form-list aui-margin-b-15">
+ <li class="aui-list-header">
+ 单笔消费小于支付限额时不需要支付密码
+ </li>
+ <li class="aui-list-item" >
+ <div class="aui-list-item-inner">
+ <div class="aui-list-item-label">
+ 免密支付
+ </div>
+ <div class="aui-list-item-input" style="width: auto">
+ <input type="checkbox" class="aui-switch" id="flag" value="1" th:checked="${uinfor.lowfreeflag}" >
+ </div>
+ </div>
+ </li>
+ <li class="aui-list-item" >
+ <div class="aui-list-item-inner">
+ <div class="aui-list-item-label">
+ 免密支付限额
+ </div>
+ <div class="aui-list-item-input" style="width: auto">
+ <input type="number" placeholder="请输入金额" id="low" th:value="${uinfor.lowfreelimit}">
+ </div>
+ </div>
+ </li>
+ </ul>
+ <ul class="aui-list aui-form-list aui-margin-b-15">
+ <li class="aui-list-header">
+ 每日累计消费超过该额度需要支付密码
+ </li>
+ <li class="aui-list-item" >
+ <div class="aui-list-item-inner">
+ <div class="aui-list-item-label">
+ 日累计消费限额
+ </div>
+ <div class="aui-list-item-input" style="width: auto">
+ <input type="number" placeholder="请输入金额" id="day" th:value="${uinfor.daylimit}">
+ </div>
+ </div>
+ </li>
+ </ul>
+ <div style="padding: 20px;">
+ <a href="javascript:doSubmit();" class="weui-btn weui-btn_primary">确认修改</a>
+ </div>
+</section>
+</body>
+<script th:src="@{/js/jquery-2.1.4.js}" type="text/javascript"></script>
+<script th:src="@{/js/jquery-weui.min.js}" type="text/javascript"></script>
+<script type="text/javascript">
+ let url = "[[@{/u}]]";
+
+ function doSubmit() {
+ let flag = $("input[type='checkbox']:checked").val();
+ let low = $("#low").val();
+ let day = $("#day").val();
+ if(!flag||flag==undefined||flag==null){
+ flag = 0
+ }
+ if(low==null||day==null){
+ return
+ }
+ let token = $("meta[name='_csrf_token']").attr("value");
+ $.showLoading("正在处理");
+ let param = {
+ "flag": flag,
+ "low": low,
+ "day": day
+ };
+ $.ajax({
+ url: url + "/editlimit",
+ type: "POST",
+ dataType: "json",
+ headers: {
+ 'X-CSRF-TOKEN': token,
+ },
+ data: param,
+ success: function (ret) {
+ $.hideLoading();
+ if (ret.code == 200) {
+ $.alert("修改成功", "提示",function (e) {
+ window.location.href="[[@{/index}]]";
+ });
+ } else {
+ $.alert(ret.msg, "错误");
+ }
+ },
+ error: function (status, err) {
+ $.alert("处理失败,请求异常,稍后再试!", "错误");
+ $.hideLoading();
+ }
+ });
+ }
+</script>
+</html>
\ No newline at end of file
diff --git a/oauth/src/main/resources/templates/login.html b/oauth/src/main/resources/templates/login.html
new file mode 100644
index 0000000..8fc964e
--- /dev/null
+++ b/oauth/src/main/resources/templates/login.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>统一身份认证</title>
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
+ <link rel="stylesheet" type="text/css" th:href="@{/css/weui.min.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/jquery-weui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/aui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/index.css}"/>
+</head>
+<body>
+<form th:action="@{/login/form}" method="post">
+ <div class="login-top">
+ 统一身份认证
+ </div>
+ <section class="aui-content" >
+ <p style="color:red;padding: 10px 0 ;text-align: center"
+ 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>
+ <input type="hidden"
+ th:name="${_csrf.parameterName}"
+ th:value="${_csrf.token}"/>
+ <ul class="aui-list aui-form-list">
+ <li class="aui-list-item" >
+ <div class="aui-list-item-inner" >
+ <div class="aui-list-item-label-icon">
+ <i class="aui-iconfont aui-icon-mobile" ></i>
+ </div>
+ <div class="aui-list-item-input">
+ <input type="text" id="username" name="username" placeholder="学工号/手机号/邮箱">
+ </div>
+ </div>
+ </li>
+ <li class="aui-list-item">
+ <div class="aui-list-item-inner" >
+ <div class="aui-list-item-label-icon">
+ <i class="aui-iconfont aui-icon-lock"></i>
+ </div>
+ <div class="aui-list-item-input">
+ <input type="password" placeholder="请输入登录密码" id="password" name="password" >
+ </div>
+ </div>
+ </li>
+ </ul>
+ </section>
+ <section class="aui-content-padded" style="margin-top: 30px;">
+ <button type="submit" class="aui-btn aui-btn-block aui-btn-info" >登 录</button>
+ </section>
+ <section class="aui-content-padded" style="position: absolute;bottom: 10px;text-align: center;left: 0;right: 0;">
+ <a th:href="@{/findpwd}" style="color: #666;">
+ 忘记密码?
+ </a>
+ </section>
+</form>
+</body>
+</html>
+
diff --git a/oauth/src/main/resources/templates/paypwdmng.html b/oauth/src/main/resources/templates/paypwdmng.html
new file mode 100644
index 0000000..f1df8ca
--- /dev/null
+++ b/oauth/src/main/resources/templates/paypwdmng.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>支付密码管理</title>
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
+ <link rel="stylesheet" type="text/css" th:href="@{/css/aui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/weui.min.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/jquery-weui.css}"/>
+</head>
+<body>
+<header class="aui-bar aui-bar-nav">
+ <a class="aui-pull-left" th:href="@{/index}">
+ <span class="aui-iconfont aui-icon-left"></span>
+ </a>
+ <div class="aui-title">支付密码管理</div>
+</header>
+<section class="aui-content">
+ <ul class="aui-list aui-list-in aui-margin-b-15">
+ <li class="aui-list-item" onclick="switchTo(1)">
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-title">修改支付密码</div>
+ </div>
+ </li>
+ <li class="aui-list-item" onclick="switchTo(2)">
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-title">忘记支付密码?</div>
+ </div>
+ </li>
+ </ul>
+</section>
+</body>
+<script th:src="@{/js/jquery-2.1.4.js}" type="text/javascript"></script>
+<script type="text/javascript">
+ let url = "[[@{/u}]]";
+ function switchTo(index) {
+ if (index == 1) {
+ window.location.href = url + "/editpaypwd";
+ }else if(index==2){
+ window.location.href = url + "/selectfind?pwdtype=paypwd";
+ }
+ }
+</script>
+</html>
\ No newline at end of file
diff --git a/oauth/src/main/resources/templates/selectfind.html b/oauth/src/main/resources/templates/selectfind.html
new file mode 100644
index 0000000..7da5300
--- /dev/null
+++ b/oauth/src/main/resources/templates/selectfind.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>选择密码找回方式</title>
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
+ <link rel="stylesheet" type="text/css" th:href="@{/css/aui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/weui.min.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/jquery-weui.css}"/>
+</head>
+<body>
+<header class="aui-bar aui-bar-nav">
+ <a class="aui-pull-left" th:href="@{/index}">
+ <span class="aui-iconfont aui-icon-left"></span>
+ </a>
+ <div class="aui-title">选择密码找回方式</div>
+</header>
+<section class="aui-content">
+ <p th:if="${email==null&&phone==null}">未配置邮箱或手机号,无法进行密码找回,请在个人信息中设置邮箱或手机号</p>
+ <ul class="aui-list aui-list-in aui-margin-b-15">
+ <li class="aui-list-item" onclick="switchTo('email')" th:if="${email!=null}">
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-title">使用邮箱找回密码</div>
+ </div>
+ </li>
+ <li class="aui-list-item" onclick="switchTo('phone')" th:if="${phone!=null}">
+ <div class="aui-list-item-inner aui-list-item-arrow">
+ <div class="aui-list-item-title">使用手机号找回密码</div>
+ </div>
+ </li>
+ </ul>
+</section>
+</body>
+<script th:src="@{/js/jquery-2.1.4.js}" type="text/javascript"></script>
+<script type="text/javascript">
+ let url = "[[@{/u}]]";
+ let pwdtype = "[[${pwdtype}]]";
+
+ function switchTo(type) {
+ window.location.href = url + "/findby?type=" + type + "&pwdtype=" + pwdtype;
+ }
+</script>
+</html>
\ No newline at end of file
diff --git a/oauth/src/main/resources/templates/setpaypwd.html b/oauth/src/main/resources/templates/setpaypwd.html
new file mode 100644
index 0000000..9549b3f
--- /dev/null
+++ b/oauth/src/main/resources/templates/setpaypwd.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html>
+
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+ <title>设置支付密码</title>
+ <meta name="_csrf_token" th:content="${_csrf.parameterName}" th:value="${_csrf.token}"/>
+ <meta name="_csrf_header" th:content="${_csrf.headerName}"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
+ <link rel="stylesheet" type="text/css" th:href="@{/css/aui.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/weui.min.css}"/>
+ <link rel="stylesheet" type="text/css" th:href="@{/css/jquery-weui.css}"/>
+</head>
+<body>
+<header class="aui-bar aui-bar-nav" >
+ <a class="aui-pull-left" th:href="@{/index}">
+ <span class="aui-iconfont aui-icon-left"></span>
+ </a>
+ <div class="aui-title">设置支付密码</div>
+</header>
+<div>
+ <div class="weui-cells weui-cells_form">
+ <div class="weui-cell">
+ <div class="weui-cell__hd"><label class="weui-label">支付密码</label></div>
+ <div class="weui-cell__bd">
+ <input class="weui-input" type="password" id="pwd" placeholder="6位数字" maxlength="6">
+ </div>
+ </div>
+ <div class="weui-cell">
+ <div class="weui-cell__hd"><label class="weui-label">确认密码</label></div>
+ <div class="weui-cell__bd">
+ <input class="weui-input" type="password" id="repwd" placeholder="请再次确认密码" maxlength="6">
+ </div>
+ </div>
+ </div>
+ <div style="padding: 20px;">
+ <a href="javascript:doSubmit();" class="weui-btn weui-btn_primary">保存</a>
+ </div>
+</div>
+</body>
+<script th:src="@{/js/jquery-2.1.4.js}" type="text/javascript"></script>
+<script th:src="@{/js/jquery-weui.min.js}" type="text/javascript"></script>
+<script type="text/javascript">
+ let url = "[[@{/u}]]";
+ let randcode = "[[${randcode}]]";
+ function doSubmit() {
+ let pwd = $("#pwd").val();
+ let repwd = $("#repwd").val();
+ if(pwd==null||repwd==null||pwd==''||repwd==''){
+ return
+ }
+ if(pwd.length!=6){
+ $.alert("密码长度为6位,请确认", "提示");
+ return;
+ }
+ if(pwd!=repwd){
+ $.alert("两次密码不一致,请确认", "提示");
+ return;
+ }
+
+ let token = $("meta[name='_csrf_token']").attr("value");
+ $.showLoading("正在处理");
+ let type = "new";
+ if(randcode!=null&&randcode!=''&&randcode!=undefined){
+ type="find"
+ }
+ let param = {
+ "pwd": pwd,
+ "repwd": repwd,
+ "type":type,
+ "randcode":randcode
+ };
+ $.ajax({
+ url: url+"/dopaypwd",
+ type: "POST",
+ dataType: "json",
+ headers: {
+ 'X-CSRF-TOKEN':token,
+ },
+ data: param,
+ success: function (ret) {
+ $.hideLoading();
+ if(ret.code==200){
+ $.alert("支付密码设置成功", "提示",function (e) {
+ window.location.href="[[@{/index}]]";
+ });
+ }else {
+ $.alert(ret.msg, "错误");
+ }
+ },
+ error: function (status, err) {
+ $.alert("处理失败,请求异常,稍后再试!", "错误");
+ $.hideLoading();
+ }
+ });
+ }
+</script>
+</html>
\ No newline at end of file
diff --git a/payapi-common/build.gradle b/payapi-common/build.gradle
index d0cdb6d..a1776a5 100644
--- a/payapi-common/build.gradle
+++ b/payapi-common/build.gradle
@@ -36,6 +36,7 @@
implementation 'javax.validation:validation-api:2.0.1.Final'
implementation 'javax.servlet:javax.servlet-api:4.0.1'
implementation 'commons-beanutils:commons-beanutils:1.9.3'
+ implementation 'commons-codec:commons-codec:1.13'
implementation('org.springframework.boot:spring-boot-starter-validation:2.1.6.RELEASE')
implementation 'org.hibernate:hibernate-validator:6.0.2.Final'
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/agent/Constant.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/agent/Constant.java
index c135d58..7f572da 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/agent/Constant.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/agent/Constant.java
@@ -19,4 +19,5 @@
public static final String COL_AGENT_DATE = "agentdate";
public static final String COL_STATUS = "status";
public static final String COL_FLAG = "flag";
+ public static final String COL_RECORDNO = "recordno"; //记录号
}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardsResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardsResponse.java
new file mode 100644
index 0000000..f33e0e8
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardsResponse.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class CardsResponse extends ApiResponse {
+ List<CitizenCardInfo> cards;
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardInfo.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardInfo.java
new file mode 100644
index 0000000..d99daf7
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardInfo.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class CitizenCardInfo {
+ private String cardno;
+ private String cardphyid;
+ private String expiredate;
+ private String cardstatus;
+ private String transstatus;
+
+ private String userid;
+ private String username;
+ private String sex;
+ private String idtype;
+ private String idno;
+ private String phone;
+ private String bankcardno;
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ConsumePayCancelParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ConsumePayCancelParam.java
index 3f1091d..a952da7 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ConsumePayCancelParam.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ConsumePayCancelParam.java
@@ -14,7 +14,6 @@
@Setter
public class ConsumePayCancelParam extends APIRequestParam {
@Sign
- @NotNull
private String refno;
@Sign
private String billno;
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DoorQRCodeParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DoorQRCodeParam.java
new file mode 100644
index 0000000..e047a7a
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DoorQRCodeParam.java
@@ -0,0 +1,23 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.Sign;
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+@Getter
+@Setter
+public class DoorQRCodeParam extends APIRequestParam {
+ @Sign
+ @NotNull(message = "二维码不能为空")
+ private String qrcode;
+
+ @Override
+ public boolean checkParam() throws RequestParamCheckException {
+ return true;
+ }
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DoorQrcodeResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DoorQrcodeResponse.java
new file mode 100644
index 0000000..1e800eb
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DoorQrcodeResponse.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class DoorQrcodeResponse extends ApiResponse {
+ private String userid;
+ private String username;
+ private String sex;
+ private String idtype;
+ private String idno;
+ private String phone;
+
+ private String citycardno;
+ private String cardphyid;
+ private String expiredate;
+ private String bankcardno;
+ private String cardstatus;
+ private String transstatus;
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardsParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardsParam.java
new file mode 100644
index 0000000..9c024e3
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryCardsParam.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.Sign;
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
+import com.supwisdom.dlpay.api.util.DateUtil;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+
+@Getter
+@Setter
+public class QueryCardsParam extends APIRequestParam {
+ @Sign
+ private String starttime;
+ @Sign
+ private String endtime;
+
+ @Override
+ public boolean checkParam() throws RequestParamCheckException {
+ if (!DateUtil.checkDatetimeValid(starttime, DateUtil.DATETIME_FMT))
+ throw new RequestParamCheckException("起始时间为空或格式错误");
+ if (!DateUtil.checkDatetimeValid(endtime, DateUtil.DATETIME_FMT))
+ throw new RequestParamCheckException("结束时间为空或格式错误");
+ if (DateUtil.compareDatetime(endtime, starttime, DateUtil.DATETIME_FMT) < 0)
+ throw new RequestParamCheckException("结束时间不能小于起始时间");
+ return true;
+ }
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryTransDtlResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryTransDtlResponse.java
index 118bd56..16e27d0 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryTransDtlResponse.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryTransDtlResponse.java
@@ -19,4 +19,5 @@
private String payinfo;
private String reverseFlag;
private String transdesc;
+ private String remark;
}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryUserParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryUserParam.java
index 55a5dcf..0a2b994 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryUserParam.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QueryUserParam.java
@@ -15,10 +15,14 @@
private String userid;
@Sign
private String uid;
+ @Sign
+ private String citizencardno;
+ @Sign
+ private String bankcardno;
@Override
public boolean checkParam() throws RequestParamCheckException {
- if (StringUtils.isEmpty(userid) && StringUtils.isEmpty(uid)) {
+ if (StringUtils.isEmpty(userid) && StringUtils.isEmpty(uid)&& StringUtils.isEmpty(citizencardno)&& StringUtils.isEmpty(bankcardno)) {
throw new RequestParamCheckException("用户唯一号不能为空");
}
return true;
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayfinishParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayfinishParam.java
index b7c1928..67622a9 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayfinishParam.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayfinishParam.java
@@ -16,6 +16,7 @@
@NotNull(message = "交易参考号不能为空")
private String refno;
+
@Override
public boolean checkParam() throws RequestParamCheckException {
return true;
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayinitParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayinitParam.java
index fae16dc..fc8ebe9 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayinitParam.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayinitParam.java
@@ -42,6 +42,14 @@
@NotNull(message = "支付方式不能为空")
private String sourceType;
+ @Sign
+ @NotNull(message = "支付类型不能为空,包含:APP,H5,JS,SM")
+ private String subType;
+
+ @Sign
+ private String spip;
+
+
@Override
public boolean checkParam() throws RequestParamCheckException {
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserInforResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserInforResponse.java
new file mode 100644
index 0000000..1271f26
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserInforResponse.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.api.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserInforResponse extends ApiResponse {
+ private String userid;
+ private String username;
+ private String sex;
+ private String idtype;
+ private String idno;
+ private String phone;
+
+ private String cardno;
+ private String cardphyid;
+ private String expiredate;
+ private String bankcardno;
+ private String cardstatus;
+ private String transstatus;
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/HMACUtil.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/HMACUtil.java
index f268646..06d7277 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/HMACUtil.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/HMACUtil.java
@@ -1,29 +1,17 @@
package com.supwisdom.dlpay.api.util;
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.codec.digest.HmacAlgorithms;
+import org.apache.commons.codec.digest.HmacUtils;
public class HMACUtil {
public static String sha256HMAC(String message, String secret) {
- String hash = "";
- try {
- Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
- SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
- sha256_HMAC.init(secret_key);
- byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
- hash = byteArrayToHexString(bytes);
- System.out.println(hash);
- } catch (Exception e) {
- System.out.println("Error HmacSHA256 ===========" + e.getMessage());
- }
- return hash;
+ byte[] bytes = HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_SHA_256, secret.getBytes())
+ .doFinal(message.getBytes());
+ return Hex.encodeHexString(bytes, true);
}
private static String byteArrayToHexString(byte[] bytes) {
- StringBuilder builder = new StringBuilder();
- for (byte b : bytes) {
- builder.append(String.format("%02x", ((int) b) & 0xFF));
- }
- return builder.toString();
+ return Hex.encodeHexString(bytes, true);
}
}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java
index 54975a5..62584f7 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java
@@ -1,7 +1,6 @@
package com.supwisdom.dlpay.paysdk.proxy;
-import com.supwisdom.dlpay.api.bean.QrcodePayParam;
-import com.supwisdom.dlpay.api.bean.QrcodePayResponse;
+import com.supwisdom.dlpay.api.bean.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -17,4 +16,12 @@
@PostMapping("/qrcode/confirm")
QrcodePayResponse qrcodePayConfirm(@RequestBody QrcodePayParam param);
+ @PostMapping("/thirdpay/init")
+ ThirdPayResponse thirdpayInit(@RequestBody ThirdPayinitParam param);
+
+ @PostMapping("/thirdpay/finish")
+ ThirdPayResponse thirdpayFinish(@RequestBody ThirdPayfinishParam param);
+
+ @PostMapping("/qrcodequery")
+ DoorQrcodeResponse qrcodequery(@RequestBody DoorQRCodeParam param);
}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
index ddcf198..a8e7808 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
@@ -1,10 +1,8 @@
package com.supwisdom.dlpay.paysdk.proxy;
-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.bean.UserResponse;
+import com.supwisdom.dlpay.api.bean.*;
import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -18,4 +16,13 @@
@PostMapping("/api/user/modify")
UserResponse modifyAccount(@RequestBody ModifyUserParam param);
+
+ @PostMapping("/api/user/querybycardno")
+ UserInforResponse querybycardno(@RequestBody QueryUserParam param);
+
+ @PostMapping("/api/user/querycards")
+ CardsResponse querycards(@RequestBody QueryCardsParam param);
+
+ @PostMapping("/api/user/testmsg")
+ ApiResponse testmsg();
}
diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
index be86202..32ca0f3 100644
--- a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
+++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
@@ -20,6 +20,9 @@
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
+import java.util.LinkedHashMap;
+import java.util.List;
+
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.notNullValue;
@@ -77,15 +80,16 @@
assertThat("pay initialized " + payInit.getRetmsg() + payInit.getException(),
payInit.getRetcode(), equalTo(0));
}
+
@Test
- public void openShopAccount(){
+ public void openShopAccount() {
ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
helper.login(appid, secret);
ApiVersionResponse version = apiCommonProxy.apiVersion();
assertThat("get version error " + version.getException(),
- version.getVersion(), notNullValue());
+ version.getVersion(), notNullValue());
OpenShopParam param = new OpenShopParam();
param.setShopUniqueId("35315266");
param.setShoptype("normal");
@@ -95,17 +99,18 @@
param.setTenantid("default");
ShopResponse response = shopProxy.openAccount(param);
assertThat("shop open " + response.getRetmsg() + response.getException(),
- response.getRetcode(), equalTo(0));
+ response.getRetcode(), equalTo(0));
}
+
@Test
- public void openUserAccount(){
+ public void openUserAccount() {
ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
helper.login(appid, secret);
ApiVersionResponse version = apiCommonProxy.apiVersion();
assertThat("get version error " + version.getException(),
- version.getVersion(), notNullValue());
+ version.getVersion(), notNullValue());
OpenUserParam param = new OpenUserParam();
param.setUid("testuid1");
param.setIdtype("student_idcard");
@@ -116,17 +121,17 @@
System.out.println(param.getSign());
UserResponse response = userProxy.openAccount(param);
assertThat("user open " + response.getRetmsg() + response.getException(),
- response.getRetcode(), equalTo(0));
+ response.getRetcode(), equalTo(0));
}
@Test
- public void qrcodeInit(){
+ public void qrcodeInit() {
ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
helper.login(appid, secret);
ApiVersionResponse version = apiCommonProxy.apiVersion();
assertThat("get version error " + version.getException(),
- version.getVersion(), notNullValue());
+ version.getVersion(), notNullValue());
QrcodePayParam param = new QrcodePayParam();
param.setAmount(1);
@@ -140,38 +145,94 @@
param.setQrcode("286972142340737770");
QrcodePayResponse response = consumePropxy.qrcodePayInit(param);
assertThat("qrcodeInit " + response.getRetmsg() + response.getException(),
- response.getRetcode(), equalTo(0));
+ response.getRetcode(), equalTo(0));
}
@Test
- public void qrcodePay(){
+ public void qrcodePay() {
ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
helper.login(appid, secret);
ApiVersionResponse version = apiCommonProxy.apiVersion();
assertThat("get version error " + version.getException(),
- version.getVersion(), notNullValue());
+ version.getVersion(), notNullValue());
QrcodePayParam param = new QrcodePayParam();
param.setAmount(1);
- param.setAnonymous(false);
+ param.setAnonymous(true);
param.setBillno(DateUtil.getNow());
param.setQrcodeFormat("origin");
param.setTransdate(DateUtil.getNow("yyyyMMdd"));
param.setTranstime(DateUtil.getNow("HHmmss"));
//param.setTenantid("default");
param.setShopaccno("2000000012");
- param.setQrcode("134985742861278239");
- param.setUserid("402882816be4b6b9016be4b78ab30001");
+ param.setQrcode("280453826821185848");
+ param.setUserid("402882816c2727a2016c2728165f0001");
param.setDtltype("canteen");
param.setSpip("172.28.43.3");
QrcodePayResponse response = consumePropxy.qrcodePayInit(param);
assertThat("qrcodeInit " + response.getRetmsg() + response.getException(),
- response.getRetcode(), equalTo(0));
+ response.getRetcode(), equalTo(0));
response = consumePropxy.qrcodePayConfirm(param);
- assertThat("qrcodeConfirm:" + response.getRetmsg() + response.getException()+",query="+response.isRequireQuery(),
- response.getRetcode(), equalTo(0));
+ assertThat("qrcodeConfirm:" + response.getRetmsg() + response.getException() + ",query=" + response.isRequireQuery(),
+ response.getRetcode(), equalTo(0));
+ }
+
+ @Test
+ public void qrcodeQuery() {
+ ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+ helper.login(appid, secret);
+ DoorQRCodeParam param = new DoorQRCodeParam();
+ param.setQrcode("6M4I1KGUO_UOVJVYCW52FQ");
+
+ DoorQrcodeResponse response = consumePropxy.qrcodequery(param);
+ assertThat("qrcode query " + response.getRetmsg() + response.getException(),
+ response.getRetcode(), equalTo(0));
+ }
+
+ @Test
+ public void queryUser() {
+ ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+ helper.login(appid, secret);
+ QueryUserParam param = new QueryUserParam();
+ param.setCitizencardno("123456");
+
+ UserInforResponse response = userProxy.querybycardno(param);
+ assertThat("user query " + response.getRetmsg() + response.getException(),
+ response.getRetcode(), equalTo(0));
+ }
+
+ @Test
+ public void testmsg() {
+ ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+ helper.login(appid, secret);
+ ApiResponse response = userProxy.testmsg();
+ assertThat("test msg " + response.getRetmsg() + response.getException(),
+ response.getRetcode(), equalTo(0));
+ }
+
+ @Test
+ public void queryCards() {
+ ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+ helper.login(appid, secret);
+ QueryCardsParam param = new QueryCardsParam();
+ param.setStarttime("20190724100001");
+ param.setEndtime("20190826100001");
+
+ CardsResponse response = userProxy.querycards(param);
+ List<CitizenCardInfo> cards = response.getCards();
+ for (CitizenCardInfo card : cards) {
+ assertThat("user card " + card.getCardno() + "," + card.getCardphyid(),
+ response.getRetcode(), equalTo(0));
+ }
+ assertThat("user query " + response.getRetmsg() + response.getException(),
+ response.getRetcode(), equalTo(0));
+ }
+
+ @Test
+ public void thirdpay() {
+
}
public static void main(String[] args) {
diff --git a/payapi/build.gradle b/payapi/build.gradle
index 3e5d865..76f80e3 100644
--- a/payapi/build.gradle
+++ b/payapi/build.gradle
@@ -1,6 +1,9 @@
+import java.text.SimpleDateFormat
+
plugins {
id 'java'
id 'org.springframework.boot'
+ id 'io.spring.dependency-management'
id 'org.jetbrains.kotlin.jvm'
id 'org.jetbrains.kotlin.plugin.jpa' version '1.3.31'
id 'org.jetbrains.kotlin.plugin.spring'
@@ -8,9 +11,6 @@
id 'com.palantir.docker'
}
-apply plugin: 'java'
-apply plugin: 'io.spring.dependency-management'
-
payapiVersion = gitVersion()
def details = versionDetails()
@@ -24,7 +24,8 @@
bootJar {
mainClassName = payapiStartClass
manifest {
- attributes('Payapi-Version': payapiVersion)
+ attributes('Payapi-Version': payapiVersion,
+ 'Payapi-Buildtime': new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").format(new Date()))
}
}
@@ -32,13 +33,18 @@
baseName = 'payapi'
}
+ext {
+ set('springCloudVersion', "Greenwich.SR2")
+}
+
docker {
def imageVersion
- if (details.commitDistance > 0 || !details.isCleanTag) {
+ if (details.gitHashFull.startsWith(details.lastTag) || !details.isCleanTag) {
imageVersion = 'dev'
} else {
imageVersion = details.lastTag
}
+ println("Docker image tag : " + imageVersion)
name 'harbor.supwisdom.com/dali/payapi:' + imageVersion
println(jar.archivePath)
files jar.archivePath
@@ -60,7 +66,9 @@
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.kafka:spring-kafka'
implementation 'org.springframework.social:spring-social-web:1.1.6.RELEASE'
+ implementation 'org.springframework.kafka:spring-kafka:2.2.8.RELEASE'
implementation 'org.jetbrains.kotlin:kotlin-reflect'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
implementation 'commons-codec:commons-codec:1.12'
@@ -68,10 +76,12 @@
implementation 'net.javacrumbs.shedlock:shedlock-spring:2.5.0'
implementation 'net.javacrumbs.shedlock:shedlock-provider-redis-spring:2.5.0'
- implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery:2.1.2.RELEASE'
+ implementation 'org.springframework.cloud:spring-cloud-starter'
+ implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery'
+ implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix'
+ implementation 'org.springframework.cloud:spring-cloud-starter-netflix-hystrix-dashboard'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
-
runtime("org.springframework.boot:spring-boot-devtools")
implementation 'org.postgresql:postgresql:42.2.5'
@@ -85,9 +95,14 @@
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 group: 'commons-codec', name: 'commons-codec', version: '1.13'
+ implementation files('libs/masmgc.sdk.sms-0.0.1-SNAPSHOT.jar')
// implementation files('libs/ojdbc6.jar')
implementation 'commons-dbcp:commons-dbcp:1.4'
+ implementation 'commons-beanutils:commons-beanutils:1.9.3'
+
+ implementation 'log4j:log4j:1.2.17'
+ implementation 'com.alibaba:fastjson:1.2.60'
implementation project(':payapi-common')
/*支付宝SDK*/
@@ -104,6 +119,12 @@
testImplementation 'org.hamcrest:hamcrest:2.1'
}
+dependencyManagement {
+ imports {
+ mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
+ }
+}
+
compileKotlin {
kotlinOptions {
freeCompilerArgs = ['-Xjsr305=strict']
diff --git a/payapi/libs/masmgc.sdk.sms-0.0.1-SNAPSHOT.jar b/payapi/libs/masmgc.sdk.sms-0.0.1-SNAPSHOT.jar
new file mode 100755
index 0000000..a20d702
--- /dev/null
+++ b/payapi/libs/masmgc.sdk.sms-0.0.1-SNAPSHOT.jar
Binary files differ
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentPayService.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentPayService.java
index 9b10dfc..b681a94 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentPayService.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentPayService.java
@@ -2,14 +2,14 @@
import com.supwisdom.dlpay.api.domain.TTransactionMain;
-public interface AgentPayService {
- AgentResponse auth(String agentid, String billno);
+public interface AgentPayService<T> {
+ AgentResponse<T> auth(String agentid, String billno);
- AgentResponse pay(TTransactionMain transaction);
+ AgentResponse<T> pay(TTransactionMain transaction);
- AgentResponse cancel(TTransactionMain transaction);
+ AgentResponse<T> cancel(TTransactionMain transaction);
- AgentResponse refund(TTransactionMain transaction);
+ AgentResponse<T> refund(TTransactionMain transaction);
- AgentResponse query(TTransactionMain transaction);
+ AgentResponse<T> query(TTransactionMain transaction);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
index d07cba5..149c3ae 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
@@ -1,62 +1,75 @@
package com.supwisdom.dlpay.agent;
-public class AgentResponse {
- public static final String AGENTCODE_SUCCESS = "0";
+public class AgentResponse<T> {
+ public static final String AGENTCODE_SUCCESS = "0";
- public static final String AGENTCODE_FAIL = "1";
+ public static final String AGENTCODE_FAIL = "1";
- private AgentCode code;
- private String agentCode;
- private String agentMsg;
- private String agentBody;
- private String agentRefno;
- private DtlStatus dtlStatus;
+ private AgentCode code;
+ private String agentCode;
+ private String agentMsg;
+ private String agentBody;
+ private String agentRefno;
+ private DtlStatus dtlStatus;
- public String getAgentBody() {
- return agentBody;
- }
+ private T payload;
- public void setAgentBody(String agentBody) {
- this.agentBody = agentBody;
- }
+ public String getAgentBody() {
+ return agentBody;
+ }
- public AgentCode getCode() {
- return code;
- }
+ public void setAgentBody(String agentBody) {
+ this.agentBody = agentBody;
+ }
- public void setCode(AgentCode code) {
- this.code = code;
- }
+ public AgentCode getCode() {
+ return code;
+ }
- public String getAgentCode() {
- return agentCode;
- }
+ public void setCode(AgentCode code) {
+ this.code = code;
+ }
- public void setAgentCode(String agentCode) {
- this.agentCode = agentCode;
- }
+ public String getAgentCode() {
+ return agentCode;
+ }
- public String getAgentMsg() {
- return agentMsg;
- }
+ public void setAgentCode(String agentCode) {
+ this.agentCode = agentCode;
+ }
- public void setAgentMsg(String agentMsg) {
- this.agentMsg = agentMsg;
- }
+ public String getAgentMsg() {
+ return agentMsg;
+ }
- public String getAgentRefno() {
- return agentRefno;
- }
+ public void setAgentMsg(String agentMsg) {
+ this.agentMsg = agentMsg;
+ }
- public void setAgentRefno(String agentRefno) {
- this.agentRefno = agentRefno;
- }
+ public String getAgentRefno() {
+ return agentRefno;
+ }
- public DtlStatus getDtlStatus() {
- return dtlStatus;
- }
+ public void setAgentRefno(String agentRefno) {
+ this.agentRefno = agentRefno;
+ }
- public void setDtlStatus(DtlStatus dtlStatus) {
- this.dtlStatus = dtlStatus;
- }
+ public DtlStatus getDtlStatus() {
+ return dtlStatus;
+ }
+
+ public void setDtlStatus(DtlStatus dtlStatus) {
+ this.dtlStatus = dtlStatus;
+ }
+
+ public T getPayload() {
+ return payload;
+ }
+
+ public void setPayload(T payload) {
+ this.payload = payload;
+ }
+
+ public AgentResponse() {
+ }
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProvider.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProvider.java
new file mode 100644
index 0000000..008dcd7
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProvider.java
@@ -0,0 +1,27 @@
+package com.supwisdom.dlpay.agent;
+
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus;
+
+public interface CheckFileProvider {
+ /**
+ * 请求对账文件接口,由对账任务请求第三查询 checkStatus.checkFileDate 的对账文件
+ *
+ * @param checkStatus
+ * @return AgentResponse.code == SUCCESS 时 ,有两种情况: 当 checkStatus.checkFileOk == true 表示对账文件明细已经
+ * 写入数据库中,不需要 downloadCheckFile , 当为 false 时才需要
+ * AgentResponse.code == REQUIRE_QUERY 时, 对账任务会调用 queryCheckFile 方法判断是否可以下载对账文件了
+ * 其它值表示失败
+ */
+ AgentResponse<TSourceTypeCheckStatus> acquireCheckFile(TSourceTypeCheckStatus checkStatus);
+
+ AgentResponse<TSourceTypeCheckStatus> queryCheckFile(TSourceTypeCheckStatus checkStatus);
+
+ /**
+ * 下载checkStatus.checkDate 指定的日期的对账文件,由对账任务调用,
+ * 如果 checkStatus.chkFileUrl == 'none' 表示当日没有对账文件,
+ *
+ * @param checkStatus
+ * @return AgentResponse.code 返回值只有 SUCCESS 和 FAIL
+ */
+ AgentResponse<TSourceTypeCheckStatus> downloadCheckFile(TSourceTypeCheckStatus checkStatus);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/DlpayResp.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/DlpayResp.java
index bc9510a..4e90b51 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/DlpayResp.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/DlpayResp.java
@@ -1,9 +1,5 @@
package com.supwisdom.dlpay.agent.citizencard;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-
-@XmlRootElement(name = "root")
public class DlpayResp {
private String code;
private String message;
@@ -17,7 +13,6 @@
private String trxdate; //银行记账日期
private Integer amount; //查询时返回流水金额
- @XmlElement(name = "CODE")
public String getCode() {
return code;
}
@@ -26,7 +21,6 @@
this.code = code;
}
- @XmlElement(name = "MESSAGE")
public String getMessage() {
return message;
}
@@ -35,7 +29,6 @@
this.message = message;
}
- @XmlElement(name = "TRANSDATE")
public String getTransdate() {
return transdate;
}
@@ -44,7 +37,6 @@
this.transdate = transdate;
}
- @XmlElement(name = "TRANSTIME")
public String getTranstime() {
return transtime;
}
@@ -53,7 +45,6 @@
this.transtime = transtime;
}
- @XmlElement(name = "BANKJOURNO")
public String getBankjourno() {
return bankjourno;
}
@@ -62,7 +53,6 @@
this.bankjourno = bankjourno;
}
- @XmlElement(name = "SINSTATUS")
public String getSinstatus() {
return sinstatus;
}
@@ -71,7 +61,6 @@
this.sinstatus = sinstatus;
}
- @XmlElement(name = "CAPTCHA")
public String getCaptcha() {
return captcha;
}
@@ -80,7 +69,6 @@
this.captcha = captcha;
}
- @XmlElement(name = "STATUS")
public String getStatus() {
return status;
}
@@ -89,7 +77,6 @@
this.status = status;
}
- @XmlElement(name = "FILENAME")
public String getFilename() {
return filename;
}
@@ -98,7 +85,6 @@
this.filename = filename;
}
- @XmlElement(name = "TRXDATE")
public String getTrxdate() {
return trxdate;
}
@@ -107,7 +93,6 @@
this.trxdate = trxdate;
}
- @XmlElement(name = "AMOUNT")
public Integer getAmount() {
return amount;
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccUtil.java
index 4c8a23d..fc0ad15 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccUtil.java
@@ -25,7 +25,8 @@
public static final String PARAM_CONFIG_ERROR = "90000"; // 参数未配置
public static final String PARAM_VALUE_ERROR = "90001"; // 参数值错误
- public static final int AGENT_CONNECT_TIMEOUT = 20;
+ public static final int AGENT_CONNECT_TIMEOUT = 10;
+ public static final int AGENT_READ_TIMEOUT = 10;
public static final String TRANSTYPE_SIGNCARD = "1"; //签约
public static final String TRANSTYPE_UNSIGNCARD = "2"; //解约
@@ -69,6 +70,7 @@
errcode.add(Pair.of(AgentCode.SHORT_OF_BALANCE, new YnrccRespCode("0302", "余额不足")));
errcode.add(Pair.of(AgentCode.SERVER_INTERNAL_ERROR, new YnrccRespCode("0303", "MD5校验失败")));
errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0304", "该卡号已经解约,不允许重复解约")));
+
errcode.add(Pair.of(AgentCode.REFNO_NOT_EXISTS, new YnrccRespCode("0401", "原始流水不存在")));
errcode.add(Pair.of(AgentCode.FAIL, new YnrccRespCode("0402", "原始流水未成功")));
errcode.add(Pair.of(AgentCode.FAIL, new YnrccRespCode("0403", "原始流水已退款")));
@@ -77,6 +79,15 @@
errcode.add(Pair.of(AgentCode.SUCCESS, new YnrccRespCode("0406", "当日无交易明细")));
errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0407", "非大理市民卡,不允许交易")));
errcode.add(Pair.of(AgentCode.FAIL, new YnrccRespCode("0408", "同一请求流水号不允许重复提交")));
+ errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0409", "商户卡号为空")));
+ errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0410", "商户户名错")));
+ errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0411", "退款金额大于原代扣金额")));
+ errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0412", "退款金额大于剩余可退金额")));
+ errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0413", "不允许该类型的商户账户交易")));
+ errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0414", "退款时请输入原应用系统唯一流水号")));
+ errcode.add(Pair.of(AgentCode.ILLEGAL_DATA, new YnrccRespCode("0415", "交易金额大于单笔限额")));
+ errcode.add(Pair.of(AgentCode.SERVER_INTERNAL_ERROR, new YnrccRespCode("0416", "通用限额未配置")));
+
errcode.add(Pair.of(AgentCode.COMMON_ERROR, new YnrccRespCode("4444", "其他错误")));
errcode.add(Pair.of(AgentCode.REQUIRE_QUERY, new YnrccRespCode(CODE_EXCEPTION, "待查询")));
errcode.add(Pair.of(AgentCode.SERVER_INTERNAL_ERROR, new YnrccRespCode(PARAM_CONFIG_ERROR, "{message}")));
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/KafkaXgMessage.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/KafkaXgMessage.java
new file mode 100644
index 0000000..9bc836a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/KafkaXgMessage.java
@@ -0,0 +1,133 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class KafkaXgMessage {
+
+ private String title;//提醒标题
+ private String content;//提醒消息内容
+ private String gids;//gid发送列表,逗号隔开
+ private Boolean alltarget;//是否平台全发送
+ private String platform;//android,ios
+ private int type;//TYPE_NOTIFICATION = 1,TYPE_MESSAGE = 2
+
+ private String url;//跳转url
+ private String expiretime;//过期时间
+ private Boolean callback;//是否回调返回
+ private String msg_type;//提醒类型 字典 epay_pos_scan_code_pay、
+ private String refno;//流水参考号
+ private int retries;//最多重试次数
+ private String amount;//消费金额,元,小数点后两位
+ private String custom; //扩展参数,原样传递
+
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getGids() {
+ return gids;
+ }
+
+ public void setGids(String gids) {
+ this.gids = gids;
+ }
+
+ public Boolean getAlltarget() {
+ return alltarget;
+ }
+
+ public void setAlltarget(Boolean alltarget) {
+ this.alltarget = alltarget;
+ }
+
+ public String getPlatform() {
+ return platform;
+ }
+
+ public void setPlatform(String platform) {
+ this.platform = platform;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getExpiretime() {
+ return expiretime;
+ }
+
+ public void setExpiretime(String expiretime) {
+ this.expiretime = expiretime;
+ }
+
+ public Boolean getCallback() {
+ return callback;
+ }
+
+ public void setCallback(Boolean callback) {
+ this.callback = callback;
+ }
+
+ public String getMsg_type() {
+ return msg_type;
+ }
+
+ public void setMsg_type(String msg_type) {
+ this.msg_type = msg_type;
+ }
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public int getRetries() {
+ return retries;
+ }
+
+ public void setRetries(int retries) {
+ this.retries = retries;
+ }
+
+ public String getAmount() {
+ return amount;
+ }
+
+ public void setAmount(String amount) {
+ this.amount = amount;
+ }
+
+ public String getCustom() {
+ return custom;
+ }
+
+ public void setCustom(String custom) {
+ this.custom = custom;
+ }
+}
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
index 40b62e5..9cc15b9 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/WechatReqResp.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/WechatReqResp.java
@@ -483,6 +483,16 @@
this.sign = MD5.encodeByMD5(signTemp);
return sign;
}
+ public String generaAPPParamters() {
+ String json = "{\"appid\":\"" + this.appid + "\","
+ + "\"nonceStr\":\"" + this.nonce_str + "\","
+ + "\"packages\":\"" + this.wpackage + "\","
+ + "\"nonceStr\":\"" + this.nonce_str + "\","
+ + "\"prepayid\":\"" + this.prepay_id+"\","
+ + "\"timeStamp\":\"" + this.timestamp + "\","
+ + "\"sign\":\"" + this.sign + "\"}";
+ return json;
+ }
public String generaJSAPISign() {
String signTemp = "appId=" + this.appid
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/YnrccChkfileBean.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/YnrccChkfileBean.java
new file mode 100644
index 0000000..125c4bb
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/YnrccChkfileBean.java
@@ -0,0 +1,94 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class YnrccChkfileBean {
+ private String refno; //本地流水号
+ private String agentrefno; //银行流水号
+ private String agentdate; //银行记账日期
+ private Integer amount;
+ private String payerid;
+ private String payeeid;
+ private String summary;
+ private String status;
+ private String flag;
+ private Integer recordno; //记录号
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public String getAgentrefno() {
+ return agentrefno;
+ }
+
+ public void setAgentrefno(String agentrefno) {
+ this.agentrefno = agentrefno;
+ }
+
+ public String getAgentdate() {
+ return agentdate;
+ }
+
+ public void setAgentdate(String agentdate) {
+ this.agentdate = agentdate;
+ }
+
+ public Integer getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Integer amount) {
+ this.amount = amount;
+ }
+
+ public String getPayerid() {
+ return payerid;
+ }
+
+ public void setPayerid(String payerid) {
+ this.payerid = payerid;
+ }
+
+ public String getPayeeid() {
+ return payeeid;
+ }
+
+ public void setPayeeid(String payeeid) {
+ this.payeeid = payeeid;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getFlag() {
+ return flag;
+ }
+
+ public void setFlag(String flag) {
+ this.flag = flag;
+ }
+
+ public Integer getRecordno() {
+ return recordno;
+ }
+
+ public void setRecordno(Integer recordno) {
+ this.recordno = recordno;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java
index 3b7d7f4..7781be6 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CardDao.java
@@ -5,6 +5,8 @@
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
+import java.util.List;
+
public interface CardDao extends JpaRepository<TCard, String> {
@Query("from TCard t where t.cardno=?1 and t.cardtype=?2")
@@ -16,4 +18,10 @@
@Query("from TCard t where t.userid=?1 and t.cardtype=?2 and t.status='normal' ")
TCard findCardByUseridAndCardtype(String userid, String cardtype);
+
+ @Query("from TCard t where t.userid=?1 and t.cardtype=?2 and t.cardphyid=?3 ")
+ TCard findBankcardByCitizencard(String userid, String cardtype, String cardphyid);
+
+ @Query("from TCard t where cardtype='citizencard' and t.lastsaved>?1 and t.lastsaved<=?2 ")
+ List<TCard> findCitizencardByLastsaved(String startdate, String enddate);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CitycardTempDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CitycardTempDao.java
new file mode 100644
index 0000000..fb00e85
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/CitycardTempDao.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TCitycardTemp;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+public interface CitycardTempDao extends JpaRepository<TCitycardTemp, String> {
+ @Query("from TCitycardTemp where id=?1 ")
+ List<TCitycardTemp> findbyTempid(String tempid);
+
+ @Query("from TCitycardTemp where lastsaved>=?1 order by lastsaved ")
+ List<TCitycardTemp> findbyUpdtime(String updtime);
+}
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
index 0b5e733..b55c02c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/DebitCreditDtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/DebitCreditDtlDao.java
@@ -16,9 +16,9 @@
@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 " +
+ "where a.TENANTID=:tenantid and 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<VoucherTemp> getVoucherData(@Param("settledate") String settledate, @Param("tenantid") String tenantid);
List<TDebitCreditDtl> findByRefno(String refno);
}
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
index 6ee3e99..250a2ef 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
@@ -2,9 +2,13 @@
import com.supwisdom.dlpay.api.domain.TPersonIdentity;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface PersonIdentityDao extends JpaRepository<TPersonIdentity, String> {
TPersonIdentity getByThirdUid(String thirdUid);
+
+ @Query("select a from TPersonIdentity a where a.person.userid=?1 and a.sourcetype=?2 ")
+ TPersonIdentity getBySourcetype(String userid,String sourcetype);
}
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
index f516373..18c15d9 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
@@ -1,13 +1,18 @@
package com.supwisdom.dlpay.api.dao;
import com.supwisdom.dlpay.api.domain.TPersondtl;
+import com.supwisdom.dlpay.framework.data.CountAmountBean;
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 PersondtlDao extends JpaRepository<TPersondtl, String>,JpaSpecificationExecutor<TPersondtl> {
Page<TPersondtl> findByUseridAndStatus(String userid,String status, Pageable pageable);
+
+ @Query("select count(t.refno) as totalcnt,sum(t.amount) as totalamt from TPersondtl t where t.status='success' and t.accdate=?1 and t.sourceType=?2 and t.tenantid=?3 ")
+ CountAmountBean getPersondtlSumInfo(String accdate, String sourcetype, String tenantid);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeCheckDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeCheckDao.java
new file mode 100644
index 0000000..13244fe
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeCheckDao.java
@@ -0,0 +1,20 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus;
+import com.supwisdom.dlpay.framework.data.ExistBean;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SourceTypeCheckDao extends CrudRepository<TSourceTypeCheckStatus, Integer> {
+ TSourceTypeCheckStatus getBySourceTypeAndTenantId(String sourceType, String tenantid);
+
+ TSourceTypeCheckStatus getById(int id);
+
+
+ @Query(value = "select count(a.sourcetype_id) as existed from tb_sourcetype a left join tb_sourcetype_check b on a.sourcetype=b.sourcetype and a.tenantid=b.tenantid " +
+ " where a.tenantid=:tenantid and a.enable=true and a.checkable=true and coalesce(b.check_accdate,'00000000')<=:settledate ", nativeQuery = true)
+ ExistBean checkCanSettleCondition(@Param("settledate") String settledate, @Param("tenantid") String tenantid);
+}
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
index b823f3d..718841a 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeDao.java
@@ -20,4 +20,9 @@
@Query("select t from TSourceType t")
List<TSourceType> getConsumeSourceTypes();
+
+ List<TSourceType> findByEnableAndTenantid(Boolean enabled, String tenantid);
+
+ @Query("from TSourceType t where t.enable=true and t.checkable=true and t.tenantid=?1 order by t.sourceType ")
+ List<TSourceType> findNeedChecks(String tenantid);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkdtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkdtlDao.java
index 63058e8..ce066d4 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkdtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkdtlDao.java
@@ -1,10 +1,60 @@
package com.supwisdom.dlpay.api.dao;
import com.supwisdom.dlpay.api.domain.TTransactionChkdtl;
+import com.supwisdom.dlpay.framework.data.CountAmountBean;
+import com.supwisdom.dlpay.framework.data.ExistBean;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+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;
-@Repository
-public interface TransactionChkdtlDao extends JpaRepository<TTransactionChkdtl, String> {
+import java.util.List;
+@Repository
+public interface TransactionChkdtlDao extends JpaRepository<TTransactionChkdtl, String>,JpaSpecificationExecutor<TTransactionChkdtl> {
+
+ @Modifying
+ @Query("delete from TTransactionChkdtl t where t.chkfileId=?1 ")
+ void deleteByChkfileid(String chkfileId);
+
+ @Query("select count(t.id) as totalcnt,sum(t.amount) as totalamt from TTransactionChkdtl t where t.accdate=?1 and t.sourcetype=?2 ")
+ CountAmountBean getTransactionSumInfo(String accdate, String sourcetype);
+
+ @Query("select a from TTransactionChkdtl a,TPersondtl b where a.localRefno=b.refno and a.sourcetype=b.sourceType and a.accdate=b.accdate and a.amount=b.amount " +
+ " and a.otherStatus='success' and b.status='success' and a.chkresult <> 'equal' and a.chkfileId=?1 order by a.recordno ")
+ List<TTransactionChkdtl> getCheckEqualDetails(String chkfileId);
+
+ @Query("select a from TTransactionChkdtl a,TPersondtl b where a.localRefno=b.refno and a.sourcetype=b.sourceType and a.accdate=b.accdate and a.amount=b.amount " +
+ " and a.otherStatus='success' and b.status='success' and a.chkresult <> 'equal' and a.chkfileId=?1 and a.recordno between ?2 and ?3 order by a.recordno ")
+ List<TTransactionChkdtl> findEqualDtlWithLimit(String chkfileId, Integer start, Integer end);
+
+ @Query("select min(a.recordno) from TTransactionChkdtl a where a.chkfileId=?1 and a.chkresult=?2")
+ Integer getMinRecordNoByStatus(String chkFileId, String status);
+
+ @Query("select min(a.recordno) from TTransactionChkdtl a where a.chkfileId=?1 ")
+ Integer getMinRecordNo(String chkFileId);
+
+ @Query("from TTransactionChkdtl t where t.chkfileId=?1 and t.chkresult='uncheck' order by t.recordno ")
+ List<TTransactionChkdtl> getUncheckTransactionChkdtls(String chkfileId);
+
+ @Query("select count(t.id) as existed from TTransactionChkdtl t where t.chkfileId=?1 and t.chkresult=?2 ")
+ ExistBean getCountByChkresult(String chkfileId, String chkresult);
+
+ @Query(value = "select t.refno from TB_PERSONDTL t left join TB_TRANSACTION_CHKDTL a on t.REFNO=a.LOCAL_REFNO and a.CHKFILE_ID=:chkfileId " +
+ " where t.ACCDATE=:accdate and t.SOURCETYPE=:sourcetype and t.status='success' and a.id is null order by t.refno ", nativeQuery = true)
+ List<String> findLocalMoreDtls(@Param("accdate") String accdate, @Param("sourcetype") String sourcetype, @Param("chkfileId") String chkfileId);
+
+ @Query("select count(t.id) as existed from TTransactionChkdtl t where t.chkfileId=?1 and t.chkresult<>'equal' and t.chkresult<>'nocharge' ")
+ ExistBean getErrorCount(String chkfileId);
+
+ @Query("from TTransactionChkdtl t where t.chkresult='nocharge' and t.resolved<>'equal' and t.chkfileId=?1 order by t.recordno ")
+ List<TTransactionChkdtl> getNeedRepairChkdtls(String chkfileId);
+
+ @Query("select count(t.id) as existed from TTransactionChkdtl t where t.chkfileId=?1 and t.resolved<>'equal' ")
+ ExistBean getChkdtlNotEqualCount(String chkfileId);
+
+ @Query("select count(t.id) as existed from TTransactionChkdtl t where t.chkfileId=?1 and t.resolved='equal' ")
+ ExistBean getChkdtlEqualCount(String chkfileId);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkfileDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkfileDao.java
index a42f8ad..88da7c2 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkfileDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkfileDao.java
@@ -2,10 +2,11 @@
import com.supwisdom.dlpay.api.domain.TTransactionChkfile;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Service;
@Service
-public interface TransactionChkfileDao extends JpaRepository<TTransactionChkfile, String> {
+public interface TransactionChkfileDao extends JpaRepository<TTransactionChkfile, String>, JpaSpecificationExecutor<TTransactionChkfile> {
TTransactionChkfile getByAccdateAndSourcetype(String accdate, String sourcetype);
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
index ccbb872..150f0cd 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TAccount.java
@@ -264,6 +264,7 @@
+ MoneyUtil.YuanToFen(this.availbal)
+ MoneyUtil.YuanToFen(this.balance)
+ MoneyUtil.YuanToFen(this.frozebal);
+ System.out.println("accno="+this.accno+",data="+data);
return Signature.generateTac(this.accno, data);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TCard.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TCard.java
index 41dba29..02e6bf9 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TCard.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TCard.java
@@ -28,7 +28,7 @@
private String status; //normal/closed
@Column(name = "TRANS_STATUS", nullable = false, length = 20)
- private String transStatus; //normal/loss/frozen/locked
+ private String transStatus; //normal/loss/frozen/locked/abnormal/unuse
@Column(name = "EXPIREDATE", length = 20)
private String expiredate;
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TCitycardTemp.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TCitycardTemp.java
new file mode 100644
index 0000000..7d7f454
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TCitycardTemp.java
@@ -0,0 +1,188 @@
+package com.supwisdom.dlpay.api.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_CITYCARD_TEMP")
+public class TCitycardTemp {
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "ID", nullable = false, length = 32)
+ private String id;
+
+ @Column(name = "CARDNO", length = 32)
+ private String cardno;
+
+ @Column(name = "CARDPHYID", length = 20)
+ private String cardphyid;
+
+ @Column(name = "EXPIREDATE", length = 8)
+ private String expiredate;
+
+ @Column(name = "CARDSTATUS", length = 10)
+ private String cardstatus;
+
+ @Column(name = "BANKCARDNO", length = 32)
+ private String bankcardno;
+
+ @Column(name = "USERNAME", length = 200)
+ private String username;
+
+ @Column(name = "SEX", length = 10)
+ private String sex;
+
+ @Column(name = "IDTYPE", length = 10)
+ private String idtype;
+
+ @Column(name = "IDNO", length = 60)
+ private String idno;
+
+ @Column(name = "MOBILE", length = 30)
+ private String mobile;
+
+ @Column(name = "EMAIL", length = 60)
+ private String email;
+
+ @Column(name = "STATUS", length = 20)
+ private String status;
+
+ @Column(name = "REMARK", length = 600)
+ private String remark;
+
+ @Column(name = "LASTSAVED", length = 14)
+ private String lastsaved;
+
+ @Column(name = "tenantid", length = 20)
+ private String tenantid = "";
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getCardno() {
+ return cardno;
+ }
+
+ public void setCardno(String cardno) {
+ this.cardno = cardno;
+ }
+
+ public String getCardphyid() {
+ return cardphyid;
+ }
+
+ public void setCardphyid(String cardphyid) {
+ this.cardphyid = cardphyid;
+ }
+
+ public String getExpiredate() {
+ return expiredate;
+ }
+
+ public void setExpiredate(String expiredate) {
+ this.expiredate = expiredate;
+ }
+
+ public String getCardstatus() {
+ return cardstatus;
+ }
+
+ public void setCardstatus(String cardstatus) {
+ this.cardstatus = cardstatus;
+ }
+
+ public String getBankcardno() {
+ return bankcardno;
+ }
+
+ public void setBankcardno(String bankcardno) {
+ this.bankcardno = bankcardno;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getSex() {
+ return sex;
+ }
+
+ public void setSex(String sex) {
+ this.sex = sex;
+ }
+
+ 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 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 getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ 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;
+ }
+}
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
index 805a984..12186c8 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
@@ -1,15 +1,27 @@
package com.supwisdom.dlpay.api.domain;
+import org.hibernate.annotations.GenericGenerator;
+
import javax.persistence.*;
import javax.validation.constraints.NotNull;
@Entity
-@Table(name = "TB_PERSON_IDENTITY")
+@Table(name = "TB_PERSON_IDENTITY",
+ indexes = {@Index(name = "uid_soucetype_idx", columnList = "THIRD_UID,SOURCETYPE")})
public class TPersonIdentity {
+
@Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "PID", length = 32)
+ private String pid;
+
@Column(name = "THIRD_UID", nullable = false, length = 60)
private String thirdUid;
+ @Column(name = "SOURCETYPE", length = 20)
+ private String sourcetype;
+
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USERID")
private TPerson person; //绑定的系统用户
@@ -33,28 +45,24 @@
@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) {
+ public TPersonIdentity(String thirdUid, TPerson person, String status, Integer lossflag, Integer lockflag, String createtime) {
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 String getPid() {
+ return pid;
}
- public void setIssigned(String issigned) {
- this.issigned = issigned;
+ public void setPid(String pid) {
+ this.pid = pid;
}
public String getThirdUid() {
@@ -112,4 +120,12 @@
public void setTenantid(String tenantid) {
this.tenantid = tenantid;
}
+
+ public String getSourcetype() {
+ return sourcetype;
+ }
+
+ public void setSourcetype(String sourcetype) {
+ this.sourcetype = sourcetype;
+ }
}
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
index d20efaf..befec80 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java
@@ -58,6 +58,12 @@
@Column(name = "PAYDESC", length = 200)
private String paydesc;
+ @Column(name = "tplusn", nullable = false, precision = 5)
+ private Integer tplusN; // 系统结算日期, T+0 ~ T+N
+
+ @Column(name = "START_CHKTIME", precision = 5)
+ private String startChktime; //开始能对账的时间。比如微信、支付宝是上午10点生成对账单,一般设为10:30开始对,则填:103000;为空时这说明无限制
+
@Column(name = "tenantid", length = 20)
@NotNull
private String tenantid = "";
@@ -167,4 +173,20 @@
public void setDepositeSubjno(String depositeSubjno) {
this.depositeSubjno = depositeSubjno;
}
+
+ public Integer getTplusN() {
+ return tplusN;
+ }
+
+ public void setTplusN(Integer tplusN) {
+ this.tplusN = tplusN;
+ }
+
+ public String getStartChktime() {
+ return startChktime;
+ }
+
+ public void setStartChktime(String startChktime) {
+ this.startChktime = startChktime;
+ }
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceTypeCheckStatus.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceTypeCheckStatus.java
new file mode 100644
index 0000000..e055f3c
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceTypeCheckStatus.java
@@ -0,0 +1,166 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "tb_sourcetype_check",
+ indexes = {@Index(name = "sourcetype_check_idx", columnList = "sourcetype, tenantid", unique = true)})
+public class TSourceTypeCheckStatus {
+ @Id
+ @SequenceGenerator(name = "st_checker_id", sequenceName = "SEQ_SOURCETYPE_CHECK", allocationSize = 1)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "st_checker_id")
+ @Column(name = "ID", nullable = false, length = 9)
+ private Integer id;
+
+ @Column(name = "sourcetype", length = 30)
+ @NotNull
+ private String sourceType;
+
+ @Column(name = "start_accdate", length = 8)
+ @NotNull
+ private String startAccdate; // 对账起始日期
+
+ @Column(name = "check_accdate", length = 8)
+ @NotNull
+ private String checkAccdate; // 当前对账记账日期
+
+ @Column(name = "check_file_status")
+ private Boolean checkFileOk; // 当前对账文件下载成功标志
+
+ @Column(name = "check_status")
+ @NotNull
+ private Boolean checkStatus; // 当前对账完成状态
+
+ @Column(name = "repair_status")
+ private Boolean repairStatus; // 补帐完成状态
+
+ @Column(name = "settle_status")
+ @NotNull
+ private Boolean settleStatus; // 是否可以结算
+
+ @Column(name = "force_recheck")
+ @NotNull
+ private Boolean forceRecheck; // 是否对当前日期强制对账
+
+ @Column(name = "last_update")
+ @NotNull
+ @Version
+ private Timestamp lastUpdate;
+
+ @Column(name = "tenantid", length = 20)
+ @NotNull
+ private String tenantId;
+
+ @Column(name = "chkfile_url", length = 400)
+ private String chkfileUrl;
+
+ @Column(name = "remark", length = 600)
+ private String remark;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getSourceType() {
+ return sourceType;
+ }
+
+ public void setSourceType(String sourceType) {
+ this.sourceType = sourceType;
+ }
+
+ public String getCheckAccdate() {
+ return checkAccdate;
+ }
+
+ public void setCheckAccdate(String checkAccdate) {
+ this.checkAccdate = checkAccdate;
+ }
+
+ public Boolean getForceRecheck() {
+ return forceRecheck;
+ }
+
+ public void setForceRecheck(Boolean forceRecheck) {
+ this.forceRecheck = forceRecheck;
+ }
+
+ 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;
+ }
+
+ public String getStartAccdate() {
+ return startAccdate;
+ }
+
+ public void setStartAccdate(String startAccdate) {
+ this.startAccdate = startAccdate;
+ }
+
+ public Boolean getCheckFileOk() {
+ return checkFileOk;
+ }
+
+ public void setCheckFileOk(Boolean checkFileOk) {
+ this.checkFileOk = checkFileOk;
+ }
+
+ public Boolean getCheckStatus() {
+ return checkStatus;
+ }
+
+ public void setCheckStatus(Boolean checkStatus) {
+ this.checkStatus = checkStatus;
+ }
+
+ public String getChkfileUrl() {
+ return chkfileUrl;
+ }
+
+ public void setChkfileUrl(String chkfileUrl) {
+ this.chkfileUrl = chkfileUrl;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public Boolean getSettleStatus() {
+ return settleStatus;
+ }
+
+ public void setSettleStatus(Boolean settleStatus) {
+ this.settleStatus = settleStatus;
+ }
+
+ public Boolean getRepairStatus() {
+ return repairStatus;
+ }
+
+ public void setRepairStatus(Boolean repairStatus) {
+ this.repairStatus = repairStatus;
+ }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkdtl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkdtl.java
index d230036..a96eb07 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkdtl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkdtl.java
@@ -3,11 +3,14 @@
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
+import javax.validation.constraints.NotNull;
import java.sql.Timestamp;
@Entity
@Table(name = "TB_TRANSACTION_CHKDTL",
- indexes = {@Index(name = "uk_transaction_chkdtl", unique = true, columnList = "accdate,sourcetype,seqno")})
+ indexes = {@Index(name = "UK_TRANSACTION_CHKDTL", unique = true, columnList = "ACCDATE,SOURCETYPE,OTHER_REFNO,LOCAL_REFNO"),
+ @Index(name = "TRANSACTION_CHKDTL_FILEID", columnList = "CHKFILE_ID"),
+ @Index(name = "TRANSACTION_CHKDTL_RECORDNO", columnList = "CHKFILE_ID, RECORDNO", unique = true)})
public class TTransactionChkdtl {
@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@@ -15,29 +18,37 @@
@Column(name = "ID", nullable = false, length = 32)
private String id;
+ @Column(name = "CHKFILE_ID", nullable = false, length = 32)
+ @NotNull
+ private String chkfileId;
+
@Column(name = "ACCDATE", nullable = false, length = 8)
private String accdate;
@Column(name = "SOURCETYPE", nullable = false, length = 20)
private String sourcetype;
- @Column(name = "SEQNO", nullable = false, precision = 9)
- private Integer seqno;
+ @Column(name = "RECORDNO", precision = 9)
+ @NotNull
+ private Integer recordno;
@Column(name = "AMOUNT", nullable = false, precision = 9, scale = 2)
private Double amount;
- @Column(name = "THIRD_REFNO", nullable = false, length = 32)
- private String thirdRefno; //第三方流水号
+ @Column(name = "OTHER_REFNO", nullable = false, length = 32)
+ private String otherRefno; //第三方流水号
@Column(name = "LOCAL_REFNO", nullable = false, length = 32)
private String localRefno; //本地流水号
- @Column(name = "THIRD_ACCDATE", nullable = false, length = 8)
- private String thirdAccdate; //第三方记账日期
+ @Column(name = "OTHER_ACCDATE", nullable = false, length = 8)
+ private String otherAccdate; //第三方记账日期
- @Column(name = "THIRD_STATUS", length = 20)
- private String thirdStatus; //第三方流水状态
+ @Column(name = "TRANSTYPE", length = 20)
+ private String transtype; // pay-支付|refund-退款|cancel-撤销
+
+ @Column(name = "OTHER_STATUS", length = 20)
+ private String otherStatus; //第三方流水状态
@Column(name = "REMARK", length = 200)
private String remark;
@@ -45,16 +56,17 @@
@Column(name = "EXTDATA", length = 200)
private String extdata;
- @Column(name = "CHKRESULT", nullable = false, length = 20)
+ @Column(name = "CHKRESULT", length = 20)
private String chkresult;
- @Column(name = "RESOLVED", nullable = false, length = 20)
+ @Column(name = "RESOLVED", length = 20)
private String resolved;
+ @Version
@Column(name = "LASTSAVED")
private Timestamp lastsaved;
- @Column(name = "tenantid", length = 20)
+ @Column(name = "tenantid", nullable = false, length = 20)
private String tenantid = "";
public String getId() {
@@ -65,6 +77,14 @@
this.id = id;
}
+ public String getChkfileId() {
+ return chkfileId;
+ }
+
+ public void setChkfileId(String chkfileId) {
+ this.chkfileId = chkfileId;
+ }
+
public String getAccdate() {
return accdate;
}
@@ -81,12 +101,12 @@
this.sourcetype = sourcetype;
}
- public Integer getSeqno() {
- return seqno;
+ public Integer getRecordno() {
+ return recordno;
}
- public void setSeqno(Integer seqno) {
- this.seqno = seqno;
+ public void setRecordno(Integer recordno) {
+ this.recordno = recordno;
}
public Double getAmount() {
@@ -97,12 +117,12 @@
this.amount = amount;
}
- public String getThirdRefno() {
- return thirdRefno;
+ public String getOtherRefno() {
+ return otherRefno;
}
- public void setThirdRefno(String thirdRefno) {
- this.thirdRefno = thirdRefno;
+ public void setOtherRefno(String otherRefno) {
+ this.otherRefno = otherRefno;
}
public String getLocalRefno() {
@@ -113,20 +133,28 @@
this.localRefno = localRefno;
}
- public String getThirdAccdate() {
- return thirdAccdate;
+ public String getOtherAccdate() {
+ return otherAccdate;
}
- public void setThirdAccdate(String thirdAccdate) {
- this.thirdAccdate = thirdAccdate;
+ public void setOtherAccdate(String otherAccdate) {
+ this.otherAccdate = otherAccdate;
}
- public String getThirdStatus() {
- return thirdStatus;
+ public String getTranstype() {
+ return transtype;
}
- public void setThirdStatus(String thirdStatus) {
- this.thirdStatus = thirdStatus;
+ public void setTranstype(String transtype) {
+ this.transtype = transtype;
+ }
+
+ public String getOtherStatus() {
+ return otherStatus;
+ }
+
+ public void setOtherStatus(String otherStatus) {
+ this.otherStatus = otherStatus;
}
public String getRemark() {
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkfile.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkfile.java
index 2cdc0f4..d5499dc 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkfile.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkfile.java
@@ -7,7 +7,7 @@
@Entity
@Table(name = "TB_TRANSACTION_CHKFILE",
- indexes = {@Index(name = "uk_transaction_chkfile", unique = true, columnList = "accdate,sourcetype,")})
+ indexes = {@Index(name = "uk_transaction_chkfile", unique = true, columnList = "accdate,sourcetype,tenantid")})
public class TTransactionChkfile {
@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@@ -24,14 +24,17 @@
@Column(name = "STATUS", nullable = false, length = 20)
private String status;
+ @Column(name = "RESULT", nullable = false, length = 20)
+ private String result;
+
@Column(name = "REMARK", length = 600)
private String remark;
- @Column(name = "THIRDCNT", nullable = false, precision = 9)
- private Integer thirdcnt;
+ @Column(name = "OTHERCNT", nullable = false, precision = 9)
+ private Integer othercnt;
- @Column(name = "THIRDAMT", nullable = false, precision = 15, scale = 2)
- private Double thirdamt;
+ @Column(name = "OTHERAMT", nullable = false, precision = 15, scale = 2)
+ private Double otheramt;
@Column(name = "LOCALCNT", nullable = false, precision = 9)
private Integer localcnt;
@@ -39,10 +42,11 @@
@Column(name = "LOCALAMT", nullable = false, precision = 15, scale = 2)
private Double localamt;
+ @Version
@Column(name = "LASTSAVED")
private Timestamp lastsaved;
- @Column(name = "tenantid", length = 20)
+ @Column(name = "tenantid", nullable = false, length = 20)
private String tenantid = "";
public String getId() {
@@ -77,6 +81,14 @@
this.status = status;
}
+ public String getResult() {
+ return result;
+ }
+
+ public void setResult(String result) {
+ this.result = result;
+ }
+
public String getRemark() {
return remark;
}
@@ -85,20 +97,20 @@
this.remark = remark;
}
- public Integer getThirdcnt() {
- return thirdcnt;
+ public Integer getOthercnt() {
+ return othercnt;
}
- public void setThirdcnt(Integer thirdcnt) {
- this.thirdcnt = thirdcnt;
+ public void setOthercnt(Integer othercnt) {
+ this.othercnt = othercnt;
}
- public Double getThirdamt() {
- return thirdamt;
+ public Double getOtheramt() {
+ return otheramt;
}
- public void setThirdamt(Double thirdamt) {
- this.thirdamt = thirdamt;
+ public void setOtheramt(Double otheramt) {
+ this.otheramt = otheramt;
}
public Integer getLocalcnt() {
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
index 8d34d10..5987d59 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
@@ -363,7 +363,7 @@
} else if ("credit".equals(debitOrCredit)) {
return creditSum;
} else {
- return debitSum - creditSum;
+ return creditSum - debitSum;
}
} else if (subjno.startsWith("1")) {
if ("debit".equals(debitOrCredit)) {
@@ -371,7 +371,7 @@
} else if ("credit".equals(debitOrCredit)) {
return -creditSum;
} else {
- return creditSum - debitSum;
+ return debitSum - creditSum;
}
}
return 0.0;
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
index 833eb0a..8e4048b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/service/SourceTypeService.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/service/SourceTypeService.java
@@ -1,9 +1,11 @@
package com.supwisdom.dlpay.api.service;
import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
import java.util.Map;
/**
@@ -41,4 +43,13 @@
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
boolean checkShopCanReverse(String sourcetype, String shopaccno) throws Exception;
+ @Transactional(rollbackFor = Exception.class, readOnly = true)
+ List<TSourceType> getAllEnabledSourcetype();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ TSourceTypeCheckStatus getSourceTypeCheckStatus(String sourceType);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ TSourceTypeCheckStatus saveOrUpdateSourceTypeCheckStatus(TSourceTypeCheckStatus s);
+
}
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
index 96f3656..14631ee 100644
--- 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
@@ -1,15 +1,10 @@
package com.supwisdom.dlpay.api.service.impl;
-import com.supwisdom.dlpay.api.dao.ShopSourceTypeConfigDao;
-import com.supwisdom.dlpay.api.dao.ShopSourceTypeDao;
-import com.supwisdom.dlpay.api.dao.SourceTypeConfigDao;
-import com.supwisdom.dlpay.api.dao.SourceTypeDao;
-import com.supwisdom.dlpay.api.domain.TShopSourceType;
-import com.supwisdom.dlpay.api.domain.TShopSourceTypeConfig;
-import com.supwisdom.dlpay.api.domain.TSourceType;
-import com.supwisdom.dlpay.api.domain.TSourceTypeConfig;
+import com.supwisdom.dlpay.api.dao.*;
+import com.supwisdom.dlpay.api.domain.*;
import com.supwisdom.dlpay.api.service.SourceTypeService;
import com.supwisdom.dlpay.exception.TransactionProcessException;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
import com.supwisdom.dlpay.framework.util.StringUtil;
import com.supwisdom.dlpay.framework.util.TradeErrorCode;
import org.springframework.beans.factory.annotation.Autowired;
@@ -29,21 +24,23 @@
private final SourceTypeConfigDao sourceTypeConfigDao;
private final ShopSourceTypeDao shopSourceTypeDao;
private final ShopSourceTypeConfigDao shopSourceTypeConfigDao;
+ private final SourceTypeCheckDao sourceTypeCheckDao;
@Autowired
public SourceTypeServiceImpl(SourceTypeDao sourceTypeDao, SourceTypeConfigDao sourceTypeConfigDao,
- ShopSourceTypeDao shopSourceTypeDao, ShopSourceTypeConfigDao shopSourceTypeConfigDao) {
+ ShopSourceTypeDao shopSourceTypeDao, ShopSourceTypeConfigDao shopSourceTypeConfigDao, SourceTypeCheckDao sourceTypeCheckDao) {
this.sourceTypeDao = sourceTypeDao;
this.sourceTypeConfigDao = sourceTypeConfigDao;
this.shopSourceTypeDao = shopSourceTypeDao;
this.shopSourceTypeConfigDao = shopSourceTypeConfigDao;
+ this.sourceTypeCheckDao = sourceTypeCheckDao;
}
@Override
@Cacheable(cacheNames = "dictionary_cache", key = "@tenantHolder.genKey('sourcetype', #sourceType)")
public TSourceType getBySourceType(String sourceType) {
- return sourceTypeDao.getOne(sourceType);
+ return sourceTypeDao.getBySourceType(sourceType);
}
@Override
@@ -196,4 +193,21 @@
return true;
}
+ @Override
+ public List<TSourceType> getAllEnabledSourcetype() {
+ return sourceTypeDao.findByEnableAndTenantid(true, TenantContext.getTenantSchema());
+ }
+
+ @Override
+ public TSourceTypeCheckStatus getSourceTypeCheckStatus(String sourceType) {
+ return sourceTypeCheckDao.getBySourceTypeAndTenantId(sourceType, TenantContext.getTenantSchema());
+ }
+
+ @Override
+ public TSourceTypeCheckStatus saveOrUpdateSourceTypeCheckStatus(TSourceTypeCheckStatus s) {
+ if (s.getTenantId() == null || s.getTenantId().isEmpty()) {
+ s.setTenantId(TenantContext.getTenantSchema());
+ }
+ return sourceTypeCheckDao.save(s);
+ }
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/bean/CitizencardLossResp.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/bean/CitizencardLossResp.java
new file mode 100644
index 0000000..09eda79
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/bean/CitizencardLossResp.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.citizencard.bean;
+
+public class CitizencardLossResp {
+ private String CODE;
+ private String MESSAGE;
+
+ public String getCODE() {
+ return CODE;
+ }
+
+ public void setCODE(String CODE) {
+ this.CODE = CODE;
+ }
+
+ public String getMESSAGE() {
+ return MESSAGE;
+ }
+
+ public void setMESSAGE(String MESSAGE) {
+ this.MESSAGE = MESSAGE;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/dao/CitizencardLossApplyDao.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/dao/CitizencardLossApplyDao.java
new file mode 100644
index 0000000..f054ef1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/dao/CitizencardLossApplyDao.java
@@ -0,0 +1,18 @@
+package com.supwisdom.dlpay.citizencard.dao;
+
+import com.supwisdom.dlpay.citizencard.domain.TCitizencardLossApply;
+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 CitizencardLossApplyDao extends JpaRepository<TCitizencardLossApply, String> {
+
+ @Query("from TCitizencardLossApply where status=:status order by refno asc")
+ List<TCitizencardLossApply> findCardlossApplyRecordsByStatus(@Param("status") String status);
+
+ TCitizencardLossApply getByRefno(String refno);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/domain/TCitizencardLossApply.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/domain/TCitizencardLossApply.java
new file mode 100644
index 0000000..fe1d694
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/domain/TCitizencardLossApply.java
@@ -0,0 +1,142 @@
+package com.supwisdom.dlpay.citizencard.domain;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "TB_CITIZENCARD_LOSSAPPLY")
+public class TCitizencardLossApply {
+ @Id
+ @Column(name = "REFNO", length = 32, nullable = false)
+ private String refno;
+
+ @Column(name = "CARDNO", length = 32, nullable = false)
+ private String cardno;
+
+ @Column(name = "APPLYTIME", length = 14, nullable = false)
+ private String applytime; //申请挂失时间
+
+ @Column(name = "TERMTYPE", length = 20)
+ private String termtype; //申请终端 app-手机/manager-管理端/web-个人网页
+
+ @Column(name = "UID", length = 32)
+ private String uid; //与终端类型对应。手机的uid,操作员的operid,个人的登录id
+
+ @Column(name = "STATUS", length = 20, nullable = false)
+ private String status; //apply,success,fail
+
+ @Column(name = "ERRCODE", length = 20)
+ private String errcode;
+
+ @Column(name = "ERRMSG", length = 600)
+ private String errmsg;
+
+ @Column(name = "SENDTIME", length = 14)
+ private String sendtime; //请求挂失时间
+
+ @Column(name = "SENDCNT", precision = 9)
+ private Integer sendcnt=0;
+
+ @Version
+ @Column(name = "LASTSAVED")
+ private Timestamp lastsaved;
+
+ @Column(name = "tenantid", length = 20, nullable = false)
+ private String tenantId;
+
+ public String getRefno() {
+ return refno;
+ }
+
+ public void setRefno(String refno) {
+ this.refno = refno;
+ }
+
+ public String getCardno() {
+ return cardno;
+ }
+
+ public void setCardno(String cardno) {
+ this.cardno = cardno;
+ }
+
+ public String getApplytime() {
+ return applytime;
+ }
+
+ public void setApplytime(String applytime) {
+ this.applytime = applytime;
+ }
+
+ public String getTermtype() {
+ return termtype;
+ }
+
+ public void setTermtype(String termtype) {
+ this.termtype = termtype;
+ }
+
+ public String getUid() {
+ return uid;
+ }
+
+ public void setUid(String uid) {
+ this.uid = uid;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ 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 String getSendtime() {
+ return sendtime;
+ }
+
+ public void setSendtime(String sendtime) {
+ this.sendtime = sendtime;
+ }
+
+ public Integer getSendcnt() {
+ return sendcnt;
+ }
+
+ public void setSendcnt(Integer sendcnt) {
+ this.sendcnt = sendcnt;
+ }
+
+ public Timestamp getLastsaved() {
+ return lastsaved;
+ }
+
+ public void setLastsaved(Timestamp 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/citizencard/service/CitizencardManagerService.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/CitizencardManagerService.java
new file mode 100644
index 0000000..c799ee2
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/CitizencardManagerService.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.citizencard.service;
+
+import com.supwisdom.dlpay.citizencard.domain.TCitizencardLossApply;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface CitizencardManagerService {
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ List<TCitizencardLossApply> getNewApplyCitizencardLossRecords();
+
+ @Transactional(rollbackFor = Exception.class, readOnly = true)
+ TCitizencardLossApply getCitizencardLossApply(String refno);
+
+ @Transactional(rollbackFor = Exception.class)
+ TCitizencardLossApply saveOrUpdateCitizencardLossApply(TCitizencardLossApply lossApply);
+
+ @Transactional(rollbackFor = Exception.class)
+ TCitizencardLossApply doFinishCitizencardLoss(TCitizencardLossApply lossApply);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/impl/CitizencardManagerServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/impl/CitizencardManagerServiceImpl.java
new file mode 100644
index 0000000..71101d8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/service/impl/CitizencardManagerServiceImpl.java
@@ -0,0 +1,61 @@
+package com.supwisdom.dlpay.citizencard.service.impl;
+
+import com.supwisdom.dlpay.api.dao.CardDao;
+import com.supwisdom.dlpay.api.domain.TCard;
+import com.supwisdom.dlpay.citizencard.dao.CitizencardLossApplyDao;
+import com.supwisdom.dlpay.citizencard.domain.TCitizencardLossApply;
+import com.supwisdom.dlpay.citizencard.service.CitizencardManagerService;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.TradeDict;
+import com.supwisdom.dlpay.util.ConstantUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class CitizencardManagerServiceImpl implements CitizencardManagerService {
+ @Autowired
+ private CitizencardLossApplyDao citizencardLossApplyDao;
+ @Autowired
+ private CardDao cardDao;
+ @Autowired
+ private SystemUtilService systemUtilService;
+
+ @Override
+ public List<TCitizencardLossApply> getNewApplyCitizencardLossRecords() {
+ List<TCitizencardLossApply> list = citizencardLossApplyDao.findCardlossApplyRecordsByStatus(ConstantUtil.CITIZENCARD_LOSSAPPLY_STATUS_APPLY);
+ if (null != list) {
+ return list;
+ }
+ return new ArrayList<>(0);
+ }
+
+ @Override
+ public TCitizencardLossApply getCitizencardLossApply(String refno) {
+ if(!StringUtil.isEmpty(refno)){
+ return citizencardLossApplyDao.getByRefno(refno.trim());
+ }
+ return null;
+ }
+
+ @Override
+ public TCitizencardLossApply saveOrUpdateCitizencardLossApply(TCitizencardLossApply lossApply) {
+ return citizencardLossApplyDao.save(lossApply);
+ }
+
+ @Override
+ public TCitizencardLossApply doFinishCitizencardLoss(TCitizencardLossApply lossApply) {
+ if (ConstantUtil.CITIZENCARD_LOSSAPPLY_STATUS_SUCCESS.equals(lossApply)) {
+ TCard cityCard = cardDao.findCardByCardnoAndCardtype(lossApply.getCardno(), ConstantUtil.CARDTYPE_CITIZENCARD);
+ if (null != cityCard && !TradeDict.STATUS_LOST.equals(cityCard.getTransStatus())) {
+ cityCard.setTransStatus(TradeDict.STATUS_LOST);
+ cityCard.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
+ cardDao.save(cityCard);
+ }
+ }
+ return citizencardLossApplyDao.save(lossApply);
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/CitizencardCardLossTask.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/CitizencardCardLossTask.java
new file mode 100644
index 0000000..e291450
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/task/CitizencardCardLossTask.java
@@ -0,0 +1,118 @@
+package com.supwisdom.dlpay.citizencard.task;
+
+import com.google.gson.Gson;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+import com.supwisdom.dlpay.citizencard.bean.CitizencardLossResp;
+import com.supwisdom.dlpay.citizencard.domain.TCitizencardLossApply;
+import com.supwisdom.dlpay.citizencard.service.CitizencardManagerService;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.util.ConstantUtil;
+import net.javacrumbs.shedlock.core.SchedulerLock;
+import org.apache.http.HttpStatus;
+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;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import java.util.List;
+
+/**
+ * 市民卡挂失申请异步调卡管系统接口挂失任务
+ */
+@Component
+public class CitizencardCardLossTask {
+ @Autowired
+ private CitizencardManagerService citizencardManagerService;
+ @Autowired
+ private SystemUtilService systemUtilService;
+
+ private Gson gson = new Gson();
+ private static final Logger logger = LoggerFactory.getLogger(CitizencardCardLossTask.class);
+
+ @Scheduled(cron = "${citizencard.dolosstask.cron}")
+ @SchedulerLock(name = "CitizencardCardLossTask", lockAtMostForString = "PT10M")
+ public void doCitizencardCardLossTask() {
+ try {
+ long t1 = System.currentTimeMillis();
+ List<TCitizencardLossApply> applyList = citizencardManagerService.getNewApplyCitizencardLossRecords();
+ String cardsysUrl = systemUtilService.getBusinessValue(ConstantUtil.CITIZENCARD_SYSTEM_URL); //卡管挂失接口地址
+ if(!StringUtil.isEmpty(applyList) && StringUtil.isEmpty(cardsysUrl)){
+ logger.error("市民卡管系统地址未配置[BusinessParam=" + ConstantUtil.CITIZENCARD_SYSTEM_URL + "]");
+ return;
+ }
+
+ if (!StringUtil.isEmpty(applyList)) {
+ logger.info("执行市民卡挂失任务<<dlsmk.cardsystem.url=[" + cardsysUrl + "]>>:");
+ }
+ for (TCitizencardLossApply lossApply : applyList) {
+ doLossCard(lossApply, cardsysUrl);
+ }
+
+ if (!StringUtil.isEmpty(applyList)) {
+ long t2 = System.currentTimeMillis();
+ logger.info("执行市民卡挂失结束,处理" + applyList.size() + "条记录,耗时 " + (t2 - t1) + " ms");
+ }
+ } catch (Exception ex) {
+ logger.error("执行市民卡挂失报错!");
+ ex.printStackTrace();
+ }
+ }
+
+ private void doLossCard(TCitizencardLossApply lossApply, String url) {
+ try{
+ lossApply.setSendtime(systemUtilService.getSysdatetime().getHostdatetime());
+ lossApply.setSendcnt(lossApply.getSendcnt()+1);
+
+ Client c = Client.create();
+ c.setConnectTimeout(5*1000);
+ WebResource r = c.resource(url);
+ MultivaluedMap params = new MultivaluedMapImpl();
+ params.add("cardNo", lossApply.getCardno());
+ logger.info("====>> refno=[" + lossApply.getRefno() + "] cardloss send param=" + gson.toJson(params) + " === ");
+ ClientResponse respClient = r.type(MediaType.APPLICATION_JSON_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, params);
+ if (HttpStatus.SC_OK == respClient.getStatus()) {
+ String jsonStr = respClient.getEntity(String.class);
+ logger.info("<<==== refno=[" + lossApply.getRefno() + "] cardloss success return=[" + jsonStr + "]");
+ CitizencardLossResp lossResp = null;
+ try{
+ lossResp = gson.fromJson(jsonStr,CitizencardLossResp.class);
+ }catch (Exception ex){
+ logger.error("挂失接口返回数据解析错误!!!");
+ ex.printStackTrace();
+ }
+
+ if(null!=lossResp){
+ lossApply.setErrcode(lossResp.getCODE());
+ lossApply.setErrmsg(lossResp.getMESSAGE());
+ if("000000".equals(lossResp.getCODE())){
+ lossApply.setStatus(ConstantUtil.CITIZENCARD_LOSSAPPLY_STATUS_SUCCESS);
+ }else{
+ lossApply.setStatus(ConstantUtil.CITIZENCARD_LOSSAPPLY_STATUS_FAIL);
+ }
+ }else{
+ lossApply.setErrcode("-1");
+ lossApply.setErrmsg(jsonStr);
+ lossApply.setStatus(ConstantUtil.CITIZENCARD_LOSSAPPLY_STATUS_FAIL);
+ }
+ }else{
+ logger.error("<<==== refno=[" + lossApply.getRefno() + "] cardloss return status=" + respClient.getStatus() + "*************************");
+ lossApply.setErrcode("-99");
+ lossApply.setErrmsg("httpStatus=" + respClient.getStatus());
+ }
+
+ citizencardManagerService.doFinishCitizencardLoss(lossApply);
+ }catch (Exception e){
+ logger.error("请求卡管系统挂失报错!!!");
+ e.printStackTrace();
+ }
+ }
+
+
+}
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
index 368bf8e..f0cc66c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
@@ -1,7 +1,10 @@
package com.supwisdom.dlpay.framework.core;
+import com.supwisdom.dlpay.exception.TransactionException;
import com.supwisdom.dlpay.framework.domain.TSettleLog;
import com.supwisdom.dlpay.framework.service.DayendSettleService;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.Constants;
import com.supwisdom.dlpay.framework.util.StringUtil;
import net.javacrumbs.shedlock.core.SchedulerLock;
import org.slf4j.Logger;
@@ -23,6 +26,8 @@
@SchedulerLock(name = "DayendSettleTask", lockAtMostForString = "PT30M")
public void doSettleTask() {
if (logger.isDebugEnabled()) logger.debug("进入日结算任务!");
+ if (null == TenantContext.getTenantSchema()) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID);
+
settleLog = dayendSettleService.doCreateSettleLog(); //记录日志
try {
//step1: 账户校验(fixme: 清算任务?)
@@ -76,6 +81,9 @@
dayendSettleService.doUpdateSettleLog(settleLog.update("0", "成功结算"));
}
return ret;
+ } catch (TransactionException ex) {
+ dayendSettleService.doUpdateSettleLog(settleLog.update("" + ex.code(), ex.getMessage()));
+ return false;
} catch (Exception e) {
if (!StringUtil.isEmpty(e.getMessage())) {
dayendSettleService.doUpdateSettleLog(settleLog.update("-9", e.getMessage()));
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
index fbaa21c..85167fd 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtConfig.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/JwtConfig.java
@@ -12,7 +12,10 @@
@Value("${jwt.header:Authorization}")
private String header = "Authorization";
@Value("${jwt.token_header:Bearer }")
- private String tokenHeader = "Bearer";
+ private String tokenHeader = "Bearer ";
+
+ @Value("${jwt.multitenant:false}")
+ private Boolean multiTenant = false;
public String getSecret() {
return secret;
@@ -33,4 +36,12 @@
public void setExpiration(Long expiration) {
this.expiration = expiration;
}
+
+ public Boolean getMultiTenant() {
+ return multiTenant;
+ }
+
+ public void setMultiTenant(Boolean multiTenant) {
+ this.multiTenant = multiTenant;
+ }
}
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
index 8f8be9c..4b8addc 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/BusinessparaDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/BusinessparaDao.java
@@ -3,10 +3,7 @@
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.data.jpa.repository.*;
import org.springframework.stereotype.Repository;
import javax.persistence.LockModeType;
@@ -26,4 +23,8 @@
TBusinesspara findByParakeyForUpdateNowait(String parakey);
Page<TBusinesspara> findAllByParakeyContaining(String parakey, Pageable pageable);
+
+ @Modifying
+ @Query("update TBusinesspara t set t.paraval=?2 where t.parakey=?1 ")
+ void updateBusinessparaValue(String parakey, String paraval);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperChkdtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperChkdtlDao.java
new file mode 100644
index 0000000..4a08c33
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/OperChkdtlDao.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.data.ExistBean;
+import com.supwisdom.dlpay.framework.domain.TOperChkdtl;
+import org.springframework.data.jpa.repository.*;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.LockModeType;
+
+@Repository
+public interface OperChkdtlDao extends JpaRepository<TOperChkdtl, Long>, JpaSpecificationExecutor<TOperChkdtl> {
+
+ @Modifying
+ @Query("update TOperChkdtl set invalidflag=true where chkType=?1 and contentId=?2 and chkResult='uncheck' ")
+ void doClearChkdtl(String chktype, String contentId);
+
+ @Modifying
+ @Query("update TOperChkdtl set invalidflag=true where chkType=?1 and chkMode=?2 and contentId=?3 and chkResult='uncheck' ")
+ void doClearChkdtl(String chktype, String chkmode, String contentId);
+
+ @Query("select count(t.chkNo) as existed from TOperChkdtl t where t.chkType=?1 and t.chkMode=?2 and t.contentId=?3 and t.chkResult=?4 and t.invalidflag=false ")
+ ExistBean getChkdtlCount(String chktype, String chkmode, String contentId, String chkresult);
+
+ @Query("from TOperChkdtl where chkNo=?1 ")
+ TOperChkdtl getByChkno(Long chkNo);
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query("from TOperChkdtl where chkNo=?1 ")
+ TOperChkdtl getByChknoForUpdate(Long chkNo);
+}
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
index aa05bd7..bd32b18 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java
@@ -1,7 +1,6 @@
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;
@@ -11,11 +10,11 @@
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);
+public interface PeriodDao extends JpaRepository<TPeriod, String> {
+ @Query(value = "from TPeriod t where t.periodYear=:periodyear and t.periodMonth=:periodmonth and t.tenantId=:tenantid ")
+ TPeriod getPeriod(@Param("periodyear") Integer periodyear, @Param("periodmonth") Integer periodmonth, @Param("tenantid") String tenantid);
@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);
+ @Query(value = "from TPeriod t where t.periodYear=:periodyear and t.periodMonth=:periodmonth and t.tenantId=:tenantid ")
+ TPeriod getTPeriodWithLock(@Param("periodyear") Integer periodyear, @Param("periodmonth") Integer periodmonth, @Param("tenantid") String tenantid);
}
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
index ec8fadc..5dc15cb 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
@@ -19,8 +19,19 @@
@Query(value = "from TSettlectl where booksetno=:booksetno ")
TSettlectl findByBooksetnoWithLock(@Param("booksetno") Integer booksetno);
+ @Lock(value = LockModeType.PESSIMISTIC_WRITE)
+ @Query(value = "from TSettlectl where tenantId=:tenantid ")
+ TSettlectl findByTenantIdWithLock(@Param("tenantid") String tenantid);
+
+ @Query(value = "from TSettlectl where tenantId=:tenantid ")
+ TSettlectl findByTenantId(@Param("tenantid") String tenantid);
+
@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);
+ @Modifying(clearAutomatically = true)
+ @Query(value = "update TB_SETTLECTL set PERIODYEAR=:peridyear,PERIODMONTH=:peridmonth where TENANTID=:tenantid ", nativeQuery = true)
+ void updateSettlePeriodByTenantid(@Param("peridyear") int peridyear, @Param("peridmonth") int peridmonth, @Param("tenantid") String tenantid);
+
}
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
index 30de1ae..75b907a 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleLogDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleLogDao.java
@@ -2,8 +2,9 @@
import com.supwisdom.dlpay.framework.domain.TSettleLog;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
@Repository
-public interface SettleLogDao extends JpaRepository<TSettleLog, String> {
+public interface SettleLogDao extends JpaRepository<TSettleLog, String>, JpaSpecificationExecutor<TSettleLog> {
}
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
index e7cc15f..e6ea3c1 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopDao.java
@@ -2,6 +2,7 @@
import com.supwisdom.dlpay.framework.domain.TShop;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Query;
@@ -11,7 +12,7 @@
/**
* Created by shuwei on 2019/4/15.
*/
-public interface ShopDao extends JpaRepository<TShop, Integer> {
+public interface ShopDao extends JpaRepository<TShop, Integer>, JpaSpecificationExecutor<TShop> {
TShop getByThirdUniqueIdenty(String thirdUniqueIdenty);
@Lock(LockModeType.PESSIMISTIC_WRITE)
@@ -25,9 +26,18 @@
@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)
+ @Query(value = "select count(t.shopid) from TB_SHOP t where (t.status='normal' or t.status='uncheck') 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();
+
+ @Query("from TShop where shoptype='root' and status='normal' order by shopid asc ")
+ List<TShop> getRootNormalShops();
+
+ @Query("from TShop where shoptype='root' order by shopid asc ")
+ List<TShop> getRootShops();
+
+ @Query("from TShop order by shopid asc ")
+ List<TShop> findAllShops();
}
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
index f76cffa..77b5204 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
@@ -14,8 +14,8 @@
@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 t.SHOPACCNO from TB_SHOPACC t left join TB_SHOPACCDAY a on t.SHOPACCNO=a.SHOPACCNO and a.accdate=:lastsettday where t.TENANTID=:tenantid and a.SHOPACCNO is null ", nativeQuery = true)
+ List<String> getNewShopacc(@Param("lastsettday") String lastsettday, @Param("tenantid") String tenantid);
@Query(value = "select shopname from TShopacc where shopaccno=:shopaccno ")
@@ -39,8 +39,7 @@
TShopacc getByShopaccnoAndTenantId(String shopaccno, String tenantid);
- @Transactional
- @Modifying(clearAutomatically = true)
+ @Modifying
@Query("update TShopacc set shopname=?1 where shopaccno=?2")
void updateShopnameByShopaccno(String shopname, String shopaccno);
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
index ddc0265..bf0d37b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccdayDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccdayDao.java
@@ -13,17 +13,17 @@
@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.tenantId=:tenantid ")
+ List<TShopaccday> getShopaccdayByAccdate(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
@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 = "update TB_SHOPACCDAY set balance=beginbal-dramt+cramt,updtime=:updtime where accdate=:accdate and TENANTID=:tenantid ", nativeQuery = true)
+ void updateShopaccdayBalance(@Param("accdate") String accdate,@Param("updtime")String updtime, @Param("tenantid") String tenantid);
- @Query(value = "select sum(balance) as amount from TShopaccday where accdate=:accdate ")
- Double getSumBalance(@Param("accdate") String accdate);
+ @Query(value = "select sum(balance) as amount from TShopaccday where accdate=:accdate and tenantId=:tenantid ")
+ Double getSumBalance(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
}
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
index 78ecb03..c1fb3e8 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectDao.java
@@ -10,19 +10,19 @@
import java.util.List;
@Repository
-public interface SubjectDao extends JpaRepository<TSubject, String> {
+public interface SubjectDao extends JpaRepository<TSubject, Integer> {
- @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 t.* from TB_SUBJECT t left join TB_SUBJECTBAL a on t.SUBJNO=a.SUBJNO and t.TENANTID=a.TENANTID where t.ENDFLAG=1 and a.SUBJNO is null and t.TENANTID=:tenantid ", nativeQuery = true)
+ List<TSubject> getNewSubjectByTenantid(@Param("tenantid") String tenantid);
- @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 count(t.subjno) as existed from TB_SUBJECT t left join TB_SUBJECTBAL a on t.SUBJNO=a.SUBJNO and t.TENANTID=a.TENANTID where t.ENDFLAG=1 and a.SUBJNO is null and t.TENANTID=:tenantid ", nativeQuery = true)
+ ExistBean checkSettleSubjectByTenantid(@Param("tenantid") String tenantid);
- @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 a.* from TB_SUBJECT a left join (select subjno from TB_SUBJECTDAY where accdate =:accdate and TENANTID=:tenantid ) b on a.subjno=b.subjno where a.subjlevel=1 and a.TENANTID=:tenantid and b.subjno is null ", nativeQuery = true)
+ List<TSubject> getNewSubjnos(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
- @Query(value = "select subjname from TSubject where subjno=:subjno ")
- String getSubjectname(@Param("subjno") String subjno);
+ @Query(value = "select subjname from TSubject where subjno=:subjno and tenantId=:tenantid ")
+ String getSubjectname(@Param("subjno") String subjno, @Param("tenantid") String tenantid);
TSubject findBySubjno(String subjno);
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
index 73b01cf..3f5737e 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
@@ -13,21 +13,24 @@
import java.util.List;
@Repository
-public interface SubjectbalDao extends JpaRepository<TSubjectbal, String> {
+public interface SubjectbalDao extends JpaRepository<TSubjectbal, Integer> {
- @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 t.* from TB_SUBJECTBAL t left join ( select subjno from TB_SUBJECTDAY where accdate =:lastsettday and TENANTID=:tenantid) a on t.subjno=a.subjno where t.TENANTID=:tenantid and a.subjno is null ", nativeQuery = true)
+ List<TSubjectbal> getUnsettleSubjectbal(@Param("lastsettday") String lastsettday, @Param("tenantid") String tenantid);
- @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 sum(BEGINDRBAL) as dramt,sum(BEGINCRBAL) as cramt from TB_SUBJECTBAL where TENANTID=:tenantid and SUBJNO in (select SUBJNO from TB_SUBJECT where fsubjno=:fsubjno and TENANTID=:tenantid) ", nativeQuery = true)
+ MerchBean getSubjectInfo(@Param("fsubjno") String fsubjno, @Param("tenantid") String tenantid);
- @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 sa.subjno,sa.drbal,crbal,sb.subjtype,sb.balflag from TB_SUBJECTBAL sa,TB_SUBJECT sb where sa.tenantid=sb.tenantid and sa.subjno=sb.subjno and sb.endflag=1 and sa.tenantid=:tenantid order by sa.subjno ", nativeQuery = true)
+ List<SubjectInfoBean> getSubjectbalAndFlag(@Param("tenantid") String tenantid);
- @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);
+ @Query(value = "select case when :balflag=1 then sum(drbal) else sum(crbal) end as amount from tb_subjectbal where tenantid=:tenantid and subjno in (select subjno from tb_subject where endflag=1 and balflag=:balflag and tenantid=:tenantid )",nativeQuery = true)
+ Double getSumEndsubjectBalByEndflag(@Param("balflag")Integer balflag, @Param("tenantid") String tenantid);
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("from TSubjectbal where subjno=:subjno ")
TSubjectbal getTSubjectbalBySubjnoWithLock(@Param("subjno")String subjno);
+
+ @Query("from TSubjectbal where subjno=:subjno and tenantId=:tenantid ")
+ TSubjectbal getBySubjnoAndTenantId(@Param("subjno")String subjno, @Param("tenantid") String tenantid);
}
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
index 9a6a92c..34deede 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java
@@ -15,28 +15,28 @@
@Repository
public interface SubjectdayDao extends JpaRepository<TSubjectday, TSubjectdayPK> {
- @Query(value = "from TSubjectday where accdate=:accdate ")
- List<TSubjectday> getAllByAccdate(@Param("accdate") String accdate);
+ @Query(value = "from TSubjectday where accdate=:accdate and tenantId=:tenantid ")
+ List<TSubjectday> getAllByAccdate(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
- @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 = "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 and TENANTID=:tenantid) b on a.subjno=b.subjno where a.TENANTID=:tenantid and a.accdate=:accdate and b.subjno is not null ", nativeQuery = true)
+ List<MerchBean> getEndSubjectbalInfos(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
- @Query(value = "from TSubjectday where accdate=:accdate and subjno=:subjno")
- TSubjectday getSubjectDayById(@Param("accdate") String accdate, @Param("subjno") String subjno);
+ @Query(value = "from TSubjectday where accdate=:accdate and subjno=:subjno and tenantId=:tenantid ")
+ TSubjectday getSubjectDayById(@Param("accdate") String accdate, @Param("subjno") String subjno, @Param("tenantid") String tenantid);
- @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 = "from TSubjectday t where t.tenantId=:tenantid and t.accdate=:accdate and t.subjno in (select subjno from TSubject where subjlevel=1 and endflag=0 and tenantId=:tenantid) ")
+ List<TSubjectday> getParentSubjectday(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
@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);
+ "where sb.tenantid=s.tenantid and sb.tenantid=:tenantid and 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, @Param("tenantid") String tenantid);
@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);
+ "from tb_subjectday where accdate=:accdate and tenantid=:tenantid and subjno in (select subjno from tb_subject where subjlevel=1 and tenantid=:tenantid) ", nativeQuery = true)
+ FSubjectInfoBean getAllParentSubjectSumInfo(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
- @Query(value = "SELECT t.subjno AS subjno, t.subjname AS subjname,t.fsubjno AS fsubjno,t.subjlevel AS subjlevel,t.displayflag, " +
+ @Query(value = "SELECT t.subjno AS subjno, t.subjname AS subjname,t.fsubjno AS fsubjno,t.subjlevel AS subjlevel,t.balflag,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 " +
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
index d40f266..516ff2c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java
@@ -6,4 +6,5 @@
@Repository
public interface TranscodeDao extends JpaRepository<TTranscode, Integer> {
+ TTranscode getByTranscode(Integer transcode);
}
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
index 02f5bad..c6bcf4c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java
@@ -20,25 +20,25 @@
@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();
+ @Query(value = "select count(t.voucherid) as existed from TB_VOUCHER t where t.POSTFLAG=0 and t.TENANTID=:tenantid ", nativeQuery = true)
+ ExistBean checkExistUnpostVouhcer(@Param("tenantid") String tenantid);
@Modifying
- @Query(value="delete from TB_VOUCHER where POSTFLAG=0 ",nativeQuery = true)
- void deleteUnpostVoucher();
+ @Query(value = "delete from TB_VOUCHER where POSTFLAG=0 and TENANTID=:tenantid ", nativeQuery = true)
+ void deleteUnpostVoucher(@Param("tenantid") String tenantid);
@Lock(LockModeType.PESSIMISTIC_WRITE)
- @Query(value = "from TVoucher where postflag=0 order by voucherid ")
- List<TVoucher> getSettleVouchers();
+ @Query(value = "from TVoucher where postflag=0 and tenantId=:tenantid order by voucherid ")
+ List<TVoucher> getSettleVouchers(@Param("tenantid") String tenantid);
@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 " +
+ "where va.voucherid=vb.voucherid and vb.voucherdate=:settledate and va.subjno='2004' and va.accno is not null and va.TENANTID=vb.TENANTID and va.TENANTID=:tenantid " +
"group by va.accno order by va.accno ", nativeQuery = true)
- List<MerchBean> getShopVoucherByAccdate(@Param("settledate")Integer settledate);
+ List<MerchBean> getShopVoucherByAccdate(@Param("settledate")Integer settledate, @Param("tenantid") String tenantid);
- @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);
+ @Query(value = "select sum(va.dramt) as dramt, sum(va.cramt) as cramt from TB_VOUCHERENTRY va,TB_VOUCHER vb where va.tenantid=vb.tenantid and va.voucherid=vb.voucherid and va.tenantid=:tenantid and vb.voucherdate=:voucherdate and va.subjno=:subjno ", nativeQuery = true)
+ MerchBean getSettleSuminfo(@Param("voucherdate") Integer voucherdate, @Param("subjno") String subjno, @Param("tenantid") String tenantid);
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query(value = "from TVoucher where voucherid=:voucherid ")
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
index cfb8cfd..0d3b3cd 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java
@@ -14,11 +14,11 @@
@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 = "delete from TB_VOUCHERENTRY where TENANTID=:tenantid and VOUCHERID in (select VOUCHERID from TB_VOUCHER where POSTFLAG=0 and t.TENANTID=:tenantid)", nativeQuery = true)
+ void deleteUnpostVoucherentry(@Param("tenantid") String tenantid);
- @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);
+ @Query(value = "from TVoucherEntry where tenantId=:tenantid and voucherid in (select voucherid from TVoucher where voucherdate=:voucherdate and tenantId=:tenantid) order by subjno,accno,voucherid ")
+ List<TVoucherEntry> getVoucherEntryByVoucherdate(@Param("voucherdate") Integer voucherdate, @Param("tenantid") String tenantid);
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query(value = "from TVoucherEntry t where t.voucherid=: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
index 7f81bf9..fcf8b7d 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VouchernoCtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VouchernoCtlDao.java
@@ -16,7 +16,15 @@
@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);
+ @Modifying(clearAutomatically = true)
+ @Query(value = "update TB_VOUCHERNOCTL set PERIODMONTH=:peridmonth,VOUCHERNO=:voucherno where TENANTID=:tenantid ", nativeQuery = true)
+ void updateVouchernoByTenantid(@Param("peridmonth") int peridmonth, @Param("voucherno") int voucherno, @Param("tenantid") String tenantid);
+
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query(value = "from TVouchernoCtl where vouchertype=1 ")
TVouchernoCtl getVoucherno();
+
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query(value = "from TVouchernoCtl where tenantId=:tenantid ")
+ TVouchernoCtl getVouchernoByTenantid(@Param("tenantid") String tenantid);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/data/CountAmountBean.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/CountAmountBean.java
new file mode 100644
index 0000000..2fc13b8
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/data/CountAmountBean.java
@@ -0,0 +1,6 @@
+package com.supwisdom.dlpay.framework.data;
+
+public interface CountAmountBean {
+ Integer getTotalcnt();
+ Double getTotalamt();
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperChkdtl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperChkdtl.java
new file mode 100644
index 0000000..ba1afa1
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TOperChkdtl.java
@@ -0,0 +1,179 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+
+/**
+ * 操作员审批表
+ * */
+@Entity
+@Table(name = "TB_OPER_CHKDTL",
+ indexes = {@Index(name = "tb_oper_chkdtl_index", columnList = "CHKTYPE,CHKMODE")})
+public class TOperChkdtl {
+ @Id
+ @SequenceGenerator(name = "operchkno", sequenceName = "SEQ_OPERCHKNO", allocationSize = 1, initialValue = 10000)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "operchkno")
+ @Column(name = "CHKNO", nullable = false, precision = 10)
+ private Long chkNo; //审批编号
+
+ @Column(name = "CHKTYPE", nullable = false, length = 32)
+ private String chkType; //审批类型
+
+ @Column(name = "CHKMODE", nullable = false, length = 32)
+ private String chkMode; //新增/修改/删除
+
+ @Column(name = "CONTENT_ID", length = 32)
+ private String contentId; //对应Id
+
+ @Column(name = "CONTENT", length = 4000)
+ private String content; //内容
+
+ @Column(name = "CHKRESULT", nullable = false, length = 600)
+ private String chkResult; //审核结果
+
+ @Column(name = "CHKMSG", length = 600)
+ private String chkMsg; //审核意见
+
+ @Column(name = "CREATE_OPERID", length = 32)
+ private String createOperid; //创建者
+
+ @Column(name = "CREATE_OPERNAME", length = 100)
+ private String createOpername; //创建者名称
+
+ @Column(name = "CREATETIME", length = 14)
+ private String createtime; //创建时间
+
+ @Column(name = "CHECK_OPERID", length = 32)
+ private String checkOperid; //审核者
+
+ @Column(name = "CHECK_OPERNAME", length = 100)
+ private String checkOpername; //审核者名称
+
+ @Column(name = "CHECKTIME", length = 14)
+ private String checktime; //审核时间
+
+ @Column(name = "INVALIDFLAG", length = 10)
+ private Boolean invalidflag=false; //无效标志: true-无效;false-有效
+
+ @Column(name = "tenantid", nullable = false, length = 20)
+ private String tenantId;
+
+ public Long getChkNo() {
+ return chkNo;
+ }
+
+ public void setChkNo(Long chkNo) {
+ this.chkNo = chkNo;
+ }
+
+ public String getChkType() {
+ return chkType;
+ }
+
+ public void setChkType(String chkType) {
+ this.chkType = chkType;
+ }
+
+ public String getChkMode() {
+ return chkMode;
+ }
+
+ public void setChkMode(String chkMode) {
+ this.chkMode = chkMode;
+ }
+
+ public String getContentId() {
+ return contentId;
+ }
+
+ public void setContentId(String contentId) {
+ this.contentId = contentId;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getChkResult() {
+ return chkResult;
+ }
+
+ public void setChkResult(String chkResult) {
+ this.chkResult = chkResult;
+ }
+
+ public String getChkMsg() {
+ return chkMsg;
+ }
+
+ public void setChkMsg(String chkMsg) {
+ this.chkMsg = chkMsg;
+ }
+
+ public String getCreateOperid() {
+ return createOperid;
+ }
+
+ public void setCreateOperid(String createOperid) {
+ this.createOperid = createOperid;
+ }
+
+ public String getCreateOpername() {
+ return createOpername;
+ }
+
+ public void setCreateOpername(String createOpername) {
+ this.createOpername = createOpername;
+ }
+
+ public String getCreatetime() {
+ return createtime;
+ }
+
+ public void setCreatetime(String createtime) {
+ this.createtime = createtime;
+ }
+
+ public String getCheckOperid() {
+ return checkOperid;
+ }
+
+ public void setCheckOperid(String checkOperid) {
+ this.checkOperid = checkOperid;
+ }
+
+ public String getCheckOpername() {
+ return checkOpername;
+ }
+
+ public void setCheckOpername(String checkOpername) {
+ this.checkOpername = checkOpername;
+ }
+
+ public String getChecktime() {
+ return checktime;
+ }
+
+ public void setChecktime(String checktime) {
+ this.checktime = checktime;
+ }
+
+ public Boolean getInvalidflag() {
+ return invalidflag;
+ }
+
+ public void setInvalidflag(Boolean invalidflag) {
+ this.invalidflag = invalidflag;
+ }
+
+ 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/TPeriod.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java
index 5d54268..6df7005 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java
@@ -1,17 +1,23 @@
package com.supwisdom.dlpay.framework.domain;
+import org.hibernate.annotations.GenericGenerator;
+
import javax.persistence.*;
import javax.validation.constraints.NotNull;
@Entity
-@Table(name = "TB_PERIOD")
-@IdClass(TPeriodPK.class)
+@Table(name = "TB_PERIOD",
+ indexes = {@Index(name = "TB_PERIOD_UK", columnList = "PERIOD_YEAR, PERIOD_MONTH, TENANTID", unique = true)})
public class TPeriod {
@Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "ID", nullable = false, length = 32)
+ private String id;
+
@Column(name = "PERIOD_YEAR", nullable = false, precision = 4)
private Integer periodYear;
- @Id
@Column(name = "PERIOD_MONTH", nullable = false, precision = 2)
private Integer periodMonth;
@@ -27,10 +33,18 @@
@NotNull
private Integer settleflag = 0;
- @Column(name = "tenantid", length = 20)
+ @Column(name = "TENANTID", length = 20)
@NotNull
private String tenantId;
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
public Integer getPeriodYear() {
return periodYear;
}
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
deleted file mode 100644
index e307db3..0000000
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriodPK.java
+++ /dev/null
@@ -1,52 +0,0 @@
-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/TResource.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
index 13be663..fe2ce3f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
@@ -5,7 +5,7 @@
@Entity
@Table(name = "TB_RESOURCE")
-@SequenceGenerator(name = "SEQ_RES", sequenceName = "SEQ_RES", allocationSize = 1000)
+@SequenceGenerator(name = "SEQ_RES", sequenceName = "SEQ_RES", allocationSize = 1, initialValue = 1000)
public class TResource {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_RES")
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
index aa0a515..5f6f214 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
@@ -31,7 +31,7 @@
@Column(name="UPDTIME", length = 14)
private String updtime;
- @Column(name = "tenantid", length = 20)
+ @Column(name = "TENANTID", length = 20)
@NotNull
private String 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
index 5c81f45..76ee122 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShop.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TShop.java
@@ -3,6 +3,7 @@
import javax.persistence.*;
import javax.validation.constraints.NotNull;
+import java.sql.Timestamp;
@Entity
@Table(name = "TB_SHOP",
@@ -73,6 +74,28 @@
@Column(name = "THIRD_UNIQUE_IDENTY", length = 200)
private String thirdUniqueIdenty;
+ //扩展信息
+ @Column(name = "BUSINESS_LICENSE_NO", length = 60)
+ private String businessLicenseNo; //营业执照编号
+
+ @Column(name = "TAX_REGISTRATION_NO", length = 60)
+ private String taxRegistrationNo; //税务登记号
+
+ @Column(name = "LEGAL_PERSON_NAME", length = 60)
+ private String legalPersonName; //法人姓名
+
+ @Column(name = "LEGAL_PERSON_IDTYPE", length = 32)
+ private String legalPersonIdtype; //法人证件类型
+
+ @Column(name = "LEGAL_PERSON_IDNO", length = 32)
+ private String legalPersonIdno; //法人证件号码
+
+ @Column(name = "ADD_OPERID", length = 32)
+ private String addOperid; //新增操作员
+
+ @Column(name = "DEL_OPERID", length = 32)
+ private String delOperid; //删除操作员
+
public TShop() {
}
@@ -95,6 +118,33 @@
this.thirdUniqueIdenty = thirdUniqueIdenty;
}
+ public TShop(@NotNull Integer fshopid, @NotNull String shopname, @NotNull String shoptype, @NotNull String status, String shopaccno, String contactman, String idtype, String idno, String tel, String mobile, String email, String addr, String zipcode, String opendate, String closedate, @NotNull String tenantId, String thirdUniqueIdenty, String businessLicenseNo, String taxRegistrationNo, String legalPersonName, String legalPersonIdtype, String legalPersonIdno, String addOperid, String delOperid) {
+ 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.tenantId = tenantId;
+ this.thirdUniqueIdenty = thirdUniqueIdenty;
+ this.businessLicenseNo = businessLicenseNo;
+ this.taxRegistrationNo = taxRegistrationNo;
+ this.legalPersonName = legalPersonName;
+ this.legalPersonIdtype = legalPersonIdtype;
+ this.legalPersonIdno = legalPersonIdno;
+ this.addOperid = addOperid;
+ this.delOperid = delOperid;
+ }
+
public String getThirdUniqueIdenty() {
return thirdUniqueIdenty;
}
@@ -238,4 +288,60 @@
public void setTenantId(String tenantId) {
this.tenantId = tenantId;
}
+
+ public String getBusinessLicenseNo() {
+ return businessLicenseNo;
+ }
+
+ public void setBusinessLicenseNo(String businessLicenseNo) {
+ this.businessLicenseNo = businessLicenseNo;
+ }
+
+ public String getTaxRegistrationNo() {
+ return taxRegistrationNo;
+ }
+
+ public void setTaxRegistrationNo(String taxRegistrationNo) {
+ this.taxRegistrationNo = taxRegistrationNo;
+ }
+
+ public String getLegalPersonName() {
+ return legalPersonName;
+ }
+
+ public void setLegalPersonName(String legalPersonName) {
+ this.legalPersonName = legalPersonName;
+ }
+
+ public String getLegalPersonIdtype() {
+ return legalPersonIdtype;
+ }
+
+ public void setLegalPersonIdtype(String legalPersonIdtype) {
+ this.legalPersonIdtype = legalPersonIdtype;
+ }
+
+ public String getLegalPersonIdno() {
+ return legalPersonIdno;
+ }
+
+ public void setLegalPersonIdno(String legalPersonIdno) {
+ this.legalPersonIdno = legalPersonIdno;
+ }
+
+ public String getAddOperid() {
+ return addOperid;
+ }
+
+ public void setAddOperid(String addOperid) {
+ this.addOperid = addOperid;
+ }
+
+ public String getDelOperid() {
+ return delOperid;
+ }
+
+ public void setDelOperid(String delOperid) {
+ this.delOperid = delOperid;
+ }
}
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
index 93a64e1..47b7ddd 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectbal.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectbal.java
@@ -9,7 +9,7 @@
public class TSubjectbal {
@Id
@Column(name = "subjid", nullable = false, length = 32)
- private String subjid;
+ private Integer subjid;
@Column(name = "SUBJNO", length = 10)
@NotNull
@@ -55,7 +55,8 @@
public TSubjectbal() {
}
- public TSubjectbal(String subjno) {
+ public TSubjectbal(Integer subjid, String subjno, String tenantId) {
+ this.subjid = subjid;
this.subjno = subjno;
this.accumdramt = 0D;
this.accumcramt = 0D;
@@ -65,9 +66,11 @@
this.cramt = 0D;
this.drbal = 0D;
this.crbal = 0D;
+ this.tenantId = tenantId;
}
- 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) {
+ public TSubjectbal(Integer subjid, @NotNull String subjno, Double accumdramt, Double accumcramt, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String updtime, Integer lastsettleday, Double accumsettleamt, @NotNull String tenantId) {
+ this.subjid = subjid;
this.subjno = subjno;
this.accumdramt = accumdramt;
this.accumcramt = accumcramt;
@@ -80,6 +83,7 @@
this.updtime = updtime;
this.lastsettleday = lastsettleday;
this.accumsettleamt = accumsettleamt;
+ this.tenantId = tenantId;
}
public String getSubjno() {
@@ -186,11 +190,11 @@
this.tenantId = tenantId;
}
- public String getSubjid() {
+ public Integer getSubjid() {
return subjid;
}
- public void setSubjid(String subjid) {
+ public void setSubjid(Integer subjid) {
this.subjid = subjid;
}
}
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
index d200c62..db73aeb 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectday.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectday.java
@@ -10,7 +10,7 @@
public class TSubjectday {
@Id
@Column(name = "subjid", nullable = false, length = 32)
- private String subjid;
+ private Integer subjid;
@Id
@Column(name = "ACCDATE", nullable = false, length = 8)
@@ -54,7 +54,8 @@
public TSubjectday() {
}
- public TSubjectday(String accdate, String subjno, Integer periodYear, Integer periodMonth, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal) {
+ public TSubjectday(Integer subjid, String accdate, String subjno, Integer periodYear, Integer periodMonth, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String tenantId) {
+ this.subjid = subjid;
this.accdate = accdate;
this.subjno = subjno;
this.periodYear = periodYear;
@@ -65,9 +66,11 @@
this.cramt = cramt;
this.drbal = drbal;
this.crbal = crbal;
+ this.tenantId = tenantId;
}
- public TSubjectday(String accdate, String subjno, Integer periodYear, Integer periodMonth, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String updtime) {
+ public TSubjectday(Integer subjid, String accdate, String subjno, Integer periodYear, Integer periodMonth, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String updtime, String tenantId) {
+ this.subjid = subjid;
this.accdate = accdate;
this.subjno = subjno;
this.periodYear = periodYear;
@@ -79,6 +82,7 @@
this.drbal = drbal;
this.crbal = crbal;
this.updtime = updtime;
+ this.tenantId = tenantId;
}
public String getAccdate() {
@@ -177,11 +181,11 @@
this.tenantId = tenantId;
}
- public String getSubjid() {
+ public Integer getSubjid() {
return subjid;
}
- public void setSubjid(String subjid) {
+ public void setSubjid(Integer subjid) {
this.subjid = subjid;
}
}
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
index ac70e2f..e887b0c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectdayPK.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectdayPK.java
@@ -11,7 +11,7 @@
@Id
@Column(name = "SUBJID", nullable = false, length = 32)
- private String subjid;
+ private Integer subjid;
public String getAccdate() {
return accdate;
@@ -21,11 +21,11 @@
this.accdate = accdate;
}
- public String getSubjid() {
+ public Integer getSubjid() {
return subjid;
}
- public void setSubjid(String subjid) {
+ public void setSubjid(Integer subjid) {
this.subjid = subjid;
}
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
index b3006d8..d241958 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntry.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntry.java
@@ -52,7 +52,7 @@
public TVoucherEntry() {
}
- public TVoucherEntry(Integer voucherid, Integer entryid, String subjno, String accno, Double dramt, Double cramt, String summary, String oppsubjno, String oppaccno) {
+ public TVoucherEntry(Integer voucherid, Integer entryid, String subjno, String accno, Double dramt, Double cramt, String summary, String oppsubjno, String oppaccno, String tenantId) {
this.voucherid = voucherid;
this.entryid = entryid;
this.subjno = subjno;
@@ -62,9 +62,10 @@
this.summary = summary;
this.oppsubjno = oppsubjno;
this.oppaccno = oppaccno;
+ this.tenantId = tenantId;
}
- 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) {
+ 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, String tenantId) {
this.voucherid = voucherid;
this.entryid = entryid;
this.subjno = subjno;
@@ -77,6 +78,7 @@
this.oppsubjno = oppsubjno;
this.oppaccno = oppaccno;
this.oppname = oppname;
+ this.tenantId = tenantId;
}
public Integer getVoucherid() {
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
index f7ff649..e2b9e3d 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java
@@ -1,15 +1,14 @@
package com.supwisdom.dlpay.framework.domain;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
import javax.validation.constraints.NotNull;
@Entity
@Table(name = "TB_VOUCHERNOCTL")
public class TVouchernoCtl {
@Id
+ @SequenceGenerator(name = "vouchertype", sequenceName = "SEQ_vouchertype", allocationSize = 1, initialValue = 100)
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "vouchertype")
@Column(name = "VOUCHERTYPE", nullable = false, precision = 2)
private Integer vouchertype;
@@ -28,10 +27,10 @@
public TVouchernoCtl() {
}
- public TVouchernoCtl(Integer vouchertype, Integer periodMonth, Integer voucherno) {
- this.vouchertype = vouchertype;
+ public TVouchernoCtl(Integer periodMonth, Integer voucherno, String tenantId) {
this.periodMonth = periodMonth;
this.voucherno = voucherno;
+ this.tenantId = tenantId;
}
public Integer getVouchertype() {
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
index c9bf7e0..632ffde 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
@@ -41,15 +41,11 @@
//sql,xss过滤
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
- logger.info("CrosXssFilter.......orignal url:{},ParameterMap:{}",
- httpServletRequest.getRequestURI(),
- new Gson().toJson(httpServletRequest.getParameterMap()));
+// logger.info("CrosXssFilter.......orignal url:{},ParameterMap:{}", httpServletRequest.getRequestURI(), new Gson().toJson(httpServletRequest.getParameterMap()));
XssHttpServletRequestWrapper xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper(
httpServletRequest);
chain.doFilter(xssHttpServletRequestWrapper, response);
- logger.info("CrosXssFilter..........doFilter url:{},ParameterMap:{}",
- xssHttpServletRequestWrapper.getRequestURI(),
- new Gson().toJson(xssHttpServletRequestWrapper.getParameterMap()));
+// logger.info("CrosXssFilter..........doFilter url:{},ParameterMap:{}", xssHttpServletRequestWrapper.getRequestURI(), new Gson().toJson(xssHttpServletRequestWrapper.getParameterMap()));
}
@Override
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
index 7eda63d..1c8123b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
@@ -71,4 +71,7 @@
String getSubsystemSignKey(String syscode);
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ String getSettleDateBytenantId(String tenantId) throws Exception;
+
}
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
index 8310435..94566fa 100644
--- 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
@@ -1,6 +1,8 @@
package com.supwisdom.dlpay.framework.service.impl;
import com.supwisdom.dlpay.api.dao.DebitCreditDtlDao;
+import com.supwisdom.dlpay.api.dao.SourceTypeCheckDao;
+import com.supwisdom.dlpay.exception.TransactionException;
import com.supwisdom.dlpay.framework.dao.*;
import com.supwisdom.dlpay.framework.data.FSubjectInfoBean;
import com.supwisdom.dlpay.framework.data.MerchBean;
@@ -9,6 +11,7 @@
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.tenant.TenantContext;
import com.supwisdom.dlpay.framework.util.DateUtil;
import com.supwisdom.dlpay.framework.util.MoneyUtil;
import com.supwisdom.dlpay.framework.util.StringUtil;
@@ -51,6 +54,8 @@
private SubjectdayDao subjectdayDao;
@Autowired
private DebitCreditDtlDao debitCreditDtlDao;
+ @Autowired
+ private SourceTypeCheckDao sourceTypeCheckDao;
private static final Logger logger = LoggerFactory.getLogger(DayendSettleServiceImpl.class);
@@ -65,6 +70,7 @@
public TSettleLog doCreateSettleLog() {
TSettleLog log = new TSettleLog();
log.setStarttime(systemUtilService.getSysdatetime().getHostdatetime());
+ log.setTenantId(TenantContext.getTenantSchema());
return settleLogDao.save(log);
}
@@ -76,7 +82,7 @@
}
private boolean doSwitchPeriod() throws Exception {
- TPeriod period = periodDao.getTPeriodWithLock(periodYear, periodMonth);
+ TPeriod period = periodDao.getTPeriodWithLock(periodYear, periodMonth, TenantContext.getTenantSchema());
if (period.getSettleflag() == 1) {
throw new Exception("月末结转已完成");
}
@@ -90,7 +96,7 @@
periodMonth = periodMonth + 1; //year不变
}
- TPeriod nextPerid = periodDao.getPeriod(periodYear, periodMonth);
+ TPeriod nextPerid = periodDao.getPeriod(periodYear, periodMonth, TenantContext.getTenantSchema());
if (null != nextPerid) {
if (settledate != Integer.valueOf(nextPerid.getStartdate())) {
throw new Exception("下一个会计期间的开始日期不正确");
@@ -109,25 +115,27 @@
nextPerid.setStartdate(startdate.toString());
nextPerid.setEnddate(enddate.toString());
nextPerid.setSettleflag(0);
+ nextPerid.setTenantId(TenantContext.getTenantSchema());
periodDao.save(nextPerid); //保存下个会计期间
}
- settleCtlDao.updateSettlePeriod(periodYear, periodMonth);
- vouchernoCtlDao.updateVoucherno(periodMonth, 0);
+ settleCtlDao.updateSettlePeriodByTenantid(periodYear, periodMonth, TenantContext.getTenantSchema());
+ vouchernoCtlDao.updateVouchernoByTenantid(periodMonth, 0, TenantContext.getTenantSchema());
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.setTenantId(TenantContext.getTenantSchema());
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());
+ entry1 = new TVoucherEntry(voucher.getVoucherid(), 1, voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), Math.abs(voucherTemp.getTransamt()), 0D, voucherTemp.getSummary(), voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), TenantContext.getTenantSchema());
+ entry2 = new TVoucherEntry(voucher.getVoucherid(), 2, voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), 0D, Math.abs(voucherTemp.getTransamt()), voucherTemp.getSummary(), voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), TenantContext.getTenantSchema());
} 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());
+ entry1 = new TVoucherEntry(voucher.getVoucherid(), 1, voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), 0D, Math.abs(voucherTemp.getTransamt()), voucherTemp.getSummary(), voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), TenantContext.getTenantSchema());
+ entry2 = new TVoucherEntry(voucher.getVoucherid(), 2, voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), Math.abs(voucherTemp.getTransamt()), 0D, voucherTemp.getSummary(), voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), TenantContext.getTenantSchema());
}
voucherEntryDao.save(entry1);
voucherEntryDao.save(entry2);
@@ -135,7 +143,7 @@
@Override
public boolean doDayendSettle() throws Exception {
- TSettlectl tSettlectl = settleCtlDao.findByBooksetnoWithLock(1);
+ TSettlectl tSettlectl = settleCtlDao.findByTenantIdWithLock(TenantContext.getTenantSchema());
if (null == tSettlectl || null == tSettlectl.getBooksetno()) {
throw new Exception("初始化错误,T_SETTLECTL 无初始化数据");
}
@@ -149,38 +157,42 @@
lastsettday = Integer.valueOf(DateUtil.getNewDay(tSettlectl.getSettledate().toString(), -1));
if (settledate >= hostdate) {
- throw new Exception("日终结算已完成");
+ throw new TransactionException(-99, "日终结算已完成");
}
- TPeriod period = periodDao.getPeriod(periodYear, periodMonth);
+ if (sourceTypeCheckDao.checkCanSettleCondition(String.valueOf(settledate), tSettlectl.getTenantId()).getExisted() > 0) {
+ throw new TransactionException(-90, "有对账未完成");
+ }
+
+ TPeriod period = periodDao.getPeriod(periodYear, periodMonth, TenantContext.getTenantSchema());
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("月切失败");
+ throw new TransactionException(-3, "月切失败");
}
}
//新增科目插入科目余额表(末级科目)
- List<String> newEndsubjectList = subjectDao.getNewSubject();
+ List<TSubject> newEndsubjectList = subjectDao.getNewSubjectByTenantid(TenantContext.getTenantSchema());
if (!StringUtil.isEmpty(newEndsubjectList)) {
- for (String subjno : newEndsubjectList) {
- TSubjectbal subjectbal = new TSubjectbal(subjno);
+ for (TSubject subject : newEndsubjectList) {
+ TSubjectbal subjectbal = new TSubjectbal(subject.getId(),subject.getSubjno(), subject.getTenantId());
subjectbalDao.save(subjectbal);
}
}
- if (subjectDao.checkSettleSubject().getExisted() > 0) {
+ if (subjectDao.checkSettleSubjectByTenantid(TenantContext.getTenantSchema()).getExisted() > 0) {
throw new Exception("初始化数据错误:科目余额表数据没有包含所有的科目余额");
}
//删除未入账凭证
- if (voucherDao.checkExistUnpostVouhcer().getExisted() > 0) {
- voucherEntryDao.deleteUnpostVoucherentry();
- voucherDao.deleteUnpostVoucher();
+ if (voucherDao.checkExistUnpostVouhcer(TenantContext.getTenantSchema()).getExisted() > 0) {
+ voucherEntryDao.deleteUnpostVoucherentry(TenantContext.getTenantSchema());
+ voucherDao.deleteUnpostVoucher(TenantContext.getTenantSchema());
}
//用户交易凭证
- List<VoucherTemp> userList = debitCreditDtlDao.getVoucherData(String.valueOf(settledate));
+ List<VoucherTemp> userList = debitCreditDtlDao.getVoucherData(String.valueOf(settledate), TenantContext.getTenantSchema());
if (!StringUtil.isEmpty(userList)) {
for (VoucherTemp temp : userList) {
saveVoucher(temp);
@@ -188,16 +200,16 @@
}
//凭证号
- TVouchernoCtl vouchernoCtl = vouchernoCtlDao.getVoucherno();
+ TVouchernoCtl vouchernoCtl = vouchernoCtlDao.getVouchernoByTenantid(TenantContext.getTenantSchema());
if (null == vouchernoCtl) {
vouchernoCtl = new TVouchernoCtl();
- vouchernoCtl.setVouchertype(1);
vouchernoCtl.setPeriodMonth(periodMonth);
vouchernoCtl.setVoucherno(0);
+ vouchernoCtl.setTenantId(TenantContext.getTenantSchema());
vouchernoCtlDao.save(vouchernoCtl);
}
int voucherno = vouchernoCtl.getVoucherno();
- List<TVoucher> voucherList = voucherDao.getSettleVouchers();
+ List<TVoucher> voucherList = voucherDao.getSettleVouchers(TenantContext.getTenantSchema());
if (!StringUtil.isEmpty(voucherList)) {
for (TVoucher voucher : voucherList) {
voucherno++;
@@ -211,24 +223,26 @@
Map<String, Double> v_merchbaldict = new HashMap<String, Double>(0);
//根据商户昨天日结表生成当天日结表(交易前余额), 新增商户添加记录
- List<TShopaccday> lastShopaccdays = shopaccdayDao.getShopaccdayByAccdate(String.valueOf(lastsettday));
+ List<TShopaccday> lastShopaccdays = shopaccdayDao.getShopaccdayByAccdate(String.valueOf(lastsettday), TenantContext.getTenantSchema());
if (!StringUtil.isEmpty(lastShopaccdays)) {
for (TShopaccday lastday : lastShopaccdays) {
TShopaccday today = new TShopaccday(String.valueOf(settledate), lastday.getShopaccno(), periodYear, periodMonth, lastday.getBalance(), 0D, 0D, 0D);
+ today.setTenantId(lastday.getTenantId());
shopaccdayDao.save(today);
v_merchbaldict.put(lastday.getShopaccno(), lastday.getBalance());
}
}
- List<String> newShopaccs = shopaccDao.getNewShopacc(String.valueOf(lastsettday)); //新增商户
+ List<String> newShopaccs = shopaccDao.getNewShopacc(String.valueOf(lastsettday), TenantContext.getTenantSchema()); //新增商户
if(!StringUtil.isEmpty(newShopaccs)){
for(String accno:newShopaccs){
TShopaccday today = new TShopaccday(String.valueOf(settledate), accno, periodYear, periodMonth, 0D, 0D, 0D, 0D);
+ today.setTenantId(TenantContext.getTenantSchema());
shopaccdayDao.save(today);
v_merchbaldict.put(accno, 0D);
}
}
- List<MerchBean> merchBeanList = voucherDao.getShopVoucherByAccdate(settledate);
+ List<MerchBean> merchBeanList = voucherDao.getShopVoucherByAccdate(settledate, TenantContext.getTenantSchema());
if (!StringUtil.isEmpty(merchBeanList)) {
for (MerchBean merch : merchBeanList) {
TShopaccday merchday = shopaccdayDao.getTShopaccdayById(String.valueOf(settledate), merch.getShopaccno());
@@ -240,34 +254,34 @@
shopaccdayDao.save(merchday);
}
}
- shopaccdayDao.updateShopaccdayBalance(String.valueOf(settledate), systemUtilService.getSysdatetime().getHostdatetime()); //批量更新余额,商户日结表生成
+ shopaccdayDao.updateShopaccdayBalance(String.valueOf(settledate), systemUtilService.getSysdatetime().getHostdatetime(), TenantContext.getTenantSchema()); //批量更新余额,商户日结表生成
//根据科目昨天日结表生成当天日结表(交易前借贷方余额),新增末级科目插入记录(交易前余额为科目贷方余额)
- List<TSubjectday> lastSubjectDays = subjectdayDao.getAllByAccdate(String.valueOf(lastsettday));
+ List<TSubjectday> lastSubjectDays = subjectdayDao.getAllByAccdate(String.valueOf(lastsettday), TenantContext.getTenantSchema());
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);
+ TSubjectday today = new TSubjectday(lastday.getSubjid(),String.valueOf(settledate), lastday.getSubjno(), periodYear, periodMonth, lastday.getDrbal(), lastday.getCrbal(), 0D, 0D, 0D, 0D, lastday.getTenantId());
subjectdayDao.save(today);
}
}
- List<TSubjectbal> newSubjectBals = subjectbalDao.getUnsettleSubjectbal(String.valueOf(lastsettday));
+ List<TSubjectbal> newSubjectBals = subjectbalDao.getUnsettleSubjectbal(String.valueOf(lastsettday), TenantContext.getTenantSchema());
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);
+ TSubjectday today = new TSubjectday(newSubject.getSubjid(),String.valueOf(settledate), newSubject.getSubjno(), periodYear, periodMonth, newSubject.getBegindrbal(), newSubject.getBegincrbal(), 0D, 0D, 0D, 0D, newSubject.getTenantId());
subjectdayDao.save(today);
}
}
- List<String> newFSubjnos = subjectDao.getNewSubjnos(String.valueOf(settledate)); //新增非末级科目
+ List<TSubject> newFSubjnos = subjectDao.getNewSubjnos(String.valueOf(settledate), TenantContext.getTenantSchema()); //新增非末级科目
if (!StringUtil.isEmpty(newFSubjnos)) {
- for (String subjno : newFSubjnos) {
+ for (TSubject subj : newFSubjnos) {
double beginDrbal = 0;
double beginCrbal = 0;
- MerchBean balInfo = subjectbalDao.getSubjectInfo(subjno); //统计下级所有科目的交易前余额
+ MerchBean balInfo = subjectbalDao.getSubjectInfo(subj.getSubjno(), subj.getTenantId()); //统计下级所有科目的交易前余额
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);
+ TSubjectday today = new TSubjectday(subj.getId(),String.valueOf(settledate), subj.getSubjno(), periodYear, periodMonth, beginDrbal, beginCrbal, 0D, 0D, 0D, 0D, subj.getTenantId());
subjectdayDao.save(today);
}
}
@@ -275,22 +289,22 @@
//初始化末级科目期初余额(包含商户科目)
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));
+ List<MerchBean> subjectList = subjectdayDao.getEndSubjectbalInfos(String.valueOf(settledate), TenantContext.getTenantSchema());
if (!StringUtil.isEmpty(subjectList)) {
for (MerchBean bean : subjectList) {
v_subjbaldict.put(bean.getShopaccno(), MoneyUtil.formatYuan(bean.getDramt() + bean.getCramt()));
}
}
- List<SubjectInfoBean> subjInfoList = subjectbalDao.getSubjectbalAndFlag();
+ List<SubjectInfoBean> subjInfoList = subjectbalDao.getSubjectbalAndFlag(TenantContext.getTenantSchema());
for (SubjectInfoBean subj : subjInfoList) {
- TSubjectday tSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), subj.getSubjno());
+ TSubjectday tSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), subj.getSubjno(), TenantContext.getTenantSchema());
if (null == tSubjectday) {
throw new Exception("科目日结表无此科目记录[" + subj.getSubjno() + "]");
}
v_subjbalflagdict.put(subj.getSubjno(), subj.getBalflag());
- MerchBean suminfo = voucherDao.getSettleSuminfo(settledate, subj.getSubjno());
+ MerchBean suminfo = voucherDao.getSettleSuminfo(settledate, subj.getSubjno(), TenantContext.getTenantSchema());
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);
@@ -304,9 +318,9 @@
subjectdayDao.save(tSubjectday);
}
//根据二级更新一级科目日结
- List<TSubjectday> parentSubject = subjectdayDao.getParentSubjectday(String.valueOf(settledate));
+ List<TSubjectday> parentSubject = subjectdayDao.getParentSubjectday(String.valueOf(settledate), TenantContext.getTenantSchema());
for (TSubjectday fsub : parentSubject) {
- FSubjectInfoBean sumInfo = subjectdayDao.getParentSumInfo(String.valueOf(settledate), fsub.getSubjno());
+ FSubjectInfoBean sumInfo = subjectdayDao.getParentSumInfo(String.valueOf(settledate), fsub.getSubjno(), fsub.getTenantId());
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());
@@ -318,7 +332,7 @@
}
//批量更新凭证明细中商户或科目账户的余额
- List<TVoucherEntry> entryList = voucherEntryDao.getVoucherEntryByVoucherdate(settledate);
+ List<TVoucherEntry> entryList = voucherEntryDao.getVoucherEntryByVoucherdate(settledate, TenantContext.getTenantSchema());
if (!StringUtil.isEmpty(entryList)) {
for (TVoucherEntry vce : entryList) {
if (Subject.SUBJNO_MACHANT_INCOME.equals(vce.getSubjno())) {
@@ -331,7 +345,7 @@
if (Subject.SUBJNO_MACHANT_INCOME.equals(vce.getOppsubjno())) {
vce.setOppname(shopaccDao.getShopname(vce.getOppaccno()));
} else {
- vce.setOppname(subjectDao.getSubjectname(vce.getOppsubjno()));
+ vce.setOppname(subjectDao.getSubjectname(vce.getOppsubjno(), vce.getTenantId()));
}
voucherEntryDao.save(vce);
Double befMerchbal = v_subjbaldict.get(vce.getSubjno());
@@ -352,7 +366,7 @@
if (Subject.SUBJNO_MACHANT_INCOME.equals(vce.getOppsubjno())) {
vce.setOppname(shopaccDao.getShopname(vce.getOppaccno()));
} else {
- vce.setOppname(subjectDao.getSubjectname(vce.getOppsubjno()));
+ vce.setOppname(subjectDao.getSubjectname(vce.getOppsubjno(), vce.getTenantId()));
}
voucherEntryDao.save(vce);
}
@@ -374,11 +388,11 @@
//核算科目日结表科目余额和凭证明细余额是否一致
for (String subjno : v_subjbaldict.keySet()) {
- TSubjectday tSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), subjno);
+ TSubjectday tSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), subjno, TenantContext.getTenantSchema());
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 tSubjectbal = subjectbalDao.getBySubjnoAndTenantId(subjno, tSubjectday.getTenantId());
tSubjectbal.setBegindrbal(tSubjectday.getBegindrbal());
tSubjectbal.setBegincrbal(tSubjectday.getBegincrbal());
tSubjectbal.setDramt(tSubjectday.getDramt());
@@ -390,8 +404,8 @@
}
//核对商户日结表余额表和科目日结表商户余额是否一致
- TSubjectday shopSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), Subject.SUBJNO_MACHANT_INCOME);
- Double merchbal = shopaccdayDao.getSumBalance(String.valueOf(settledate));
+ TSubjectday shopSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), Subject.SUBJNO_MACHANT_INCOME, TenantContext.getTenantSchema());
+ Double merchbal = shopaccdayDao.getSumBalance(String.valueOf(settledate), TenantContext.getTenantSchema()); //
double shopSubbal = (shopSubjectday == null ? 0 : shopSubjectday.getCrbal());
double shopMerchbal = (merchbal == null ? 0 : merchbal);
if (!MoneyUtil.moneyEqual(shopSubbal, shopMerchbal)) {
@@ -399,7 +413,7 @@
}
//核算一级科目余额是否平衡
- FSubjectInfoBean allParentSubjbal = subjectdayDao.getAllParentSubjectSumInfo(String.valueOf(settledate));
+ FSubjectInfoBean allParentSubjbal = subjectdayDao.getAllParentSubjectSumInfo(String.valueOf(settledate), TenantContext.getTenantSchema());
if (!MoneyUtil.moneyEqual(allParentSubjbal.getBegindrbal(), allParentSubjbal.getBegincrbal())) {
throw new Exception("结算后检查失败:一级科目余额表期初余额不平衡,借方[" + allParentSubjbal.getBegindrbal() + "],贷方[" + allParentSubjbal.getBegincrbal() + "]");
}
@@ -410,8 +424,8 @@
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);
+ Double balflag_1_sumbal = subjectbalDao.getSumEndsubjectBalByEndflag(1, TenantContext.getTenantSchema());
+ Double balflag_2_sumbal = subjectbalDao.getSumEndsubjectBalByEndflag(2, TenantContext.getTenantSchema());
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 + "]");
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
index baf8449..a15f4de 100644
--- 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
@@ -1,5 +1,7 @@
package com.supwisdom.dlpay.framework.service.impl;
+import com.supwisdom.dlpay.exception.TransactionCheckException;
+import com.supwisdom.dlpay.exception.TransactionProcessException;
import com.supwisdom.dlpay.framework.core.DatabaseConfig;
import com.supwisdom.dlpay.framework.dao.*;
import com.supwisdom.dlpay.framework.data.SystemDateTime;
@@ -8,6 +10,7 @@
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.TradeErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -84,7 +87,7 @@
@Override
public String getTranscodeName(int transocde, String defaultValue) {
- TTranscode tTranscode = transcodeDao.getOne(transocde);
+ TTranscode tTranscode = transcodeDao.getByTranscode(transocde);
if (null != tTranscode && !StringUtil.isEmpty(tTranscode.getTransname())) {
return tTranscode.getTransname();
}
@@ -183,4 +186,11 @@
return "";
}
+ @Override
+ public String getSettleDateBytenantId(String tenantId) throws Exception{
+ TSettlectl ctl = settleCtlDao.findByTenantId(tenantId);
+ if(null==ctl) throw new TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,"获取当前结算日期失败!");
+ return ctl.getSettledate().toString();
+ }
+
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/ApplicationUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/ApplicationUtil.java
index 3523689..7e51071 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/ApplicationUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/ApplicationUtil.java
@@ -10,11 +10,11 @@
public class ApplicationUtil {
private static final Logger logger = LoggerFactory.getLogger(ApplicationUtil.class);
- public static AgentPayService findAgentPayService(ApplicationContext context, String service) {
+ public static <T> AgentPayService<T> findAgentPayService(ApplicationContext context, String service) {
try {
Object bean = context.getBean(service);
if (bean instanceof AgentPayService) {
- return (AgentPayService) bean;
+ return (AgentPayService<T>) bean;
} else {
return null;
}
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
index 46af8bb..a58a7f5 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java
@@ -3,6 +3,7 @@
public class Constants {
// HTTP HEADER define
public static final String HEADER_TETANTID = "X-TENANT-ID";
+ public static final String DEFAULT_TENANTID = "{tenantid}";
// define
public static final String JWT_CLAIM_TENANTID = "tenantId";
@@ -10,4 +11,6 @@
public static final String JWT_CLAIM_AUTHORITIES = "authorities";
// 根商户ID
public static final Integer ROOT_SHOP_FID = 1;
+
+ public static final String HEADER_AUTHORIZATION = "Authorization";
}
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
index 91abab4..bcf4445 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java
@@ -1,5 +1,7 @@
package com.supwisdom.dlpay.framework.util;
+import org.apache.commons.codec.binary.Base64;
+
import java.security.MessageDigest;
public class MD5 {
@@ -83,5 +85,21 @@
}
return null;
}
-
+ /** 对字符串进行MD5加密 */
+ public static String encodeByMD5ToURLSafeBase64(String originString) {
+ if (originString != null) {
+ try {
+ // 创建具有指定算法名称的信息摘要
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ // 使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
+ byte[] results = md.digest(originString.getBytes("utf-8"));
+ // 将得到的字节数组变成字符串返回
+ String resultString = Base64.encodeBase64URLSafeString(results);
+ return resultString.toUpperCase();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ return null;
+ }
}
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
index 0afac38..74a0534 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/RandomUtils.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/RandomUtils.java
@@ -64,8 +64,15 @@
String result = s + "_"+savesecret;
return result;
}
-
-
+
+ public static String getSecureRandomHex() {
+ SecureRandom a = new SecureRandom();
+ byte[] phonesecret = new byte[10];
+ a.nextBytes(phonesecret);
+
+ String savesecret = Hex.encodeHexString(phonesecret);
+ return savesecret;
+ }
/**
*
* @param length
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java
index 849d275..184130f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Signature.java
@@ -16,6 +16,7 @@
if (tenant == null) {
throw new IllegalArgumentException("TenantID 未定义");
}
+ System.out.println("factor="+factor+",data="+data+",tenant="+tenant);
return HMACUtil.sha256HMAC(deliveryKey(tenant, factor), data).substring(0, 24);
}
}
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
index d5bebe9..628137b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
@@ -1,5 +1,6 @@
package com.supwisdom.dlpay.framework.util;
+
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -131,26 +132,93 @@
}*/
return true;
}
+
/**
* 手机号遮掩中间4位
- * */
- public static String phoneReplace(String phone){
+ */
+ public static String phoneReplace(String phone) {
+ if(phone==null){
+ return 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 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**");
+ */
+ public static String nameReplace(String s) {
+ return s.replaceAll("([\\d\\D]{1})(.*)", "$1**");
}
+ public static String urlAppend(String url, String path) {
+ if (url.endsWith("/")) {
+ if (path.startsWith("/")) {
+ return url + path.substring(1);
+ }
+ return url + path;
+ } else {
+ if (path.startsWith("/")) {
+ return url + path;
+ }
+ return url + "/" + path;
+ }
+ }
+
+ public static void transforToBean(List<String> fields, List<String> columns, Object bean) throws Exception {
+ if (null == fields) throw new Exception("fields is null");
+ if (null == columns) throw new Exception("columns is null");
+ if (fields.size() < columns.size()) throw new Exception("错误的列定义");
+ Map<String, String> data = new HashMap<>(0);
+ for (int i = 0; i < fields.size(); i++) {
+ data.put(fields.get(i), columns.get(i));
+ }
+ org.apache.commons.beanutils.BeanUtils.populate(bean, data);
+ }
+
+ /**
+ * 企业营业执照编号有15位和18位,自2016年7月1日后,“三证合一、一照一码”后统一为18位社会信用代码
+ * */
+ public static boolean checkBusinessLicenseNo(String blno) {
+ if (isEmpty(blno)) return false;
+ String businessLicenseNo = blno.trim();
+ if (businessLicenseNo.length() != 15 && businessLicenseNo.length() != 18) return false; //历史企业注册码15位,社会信用代码长度为18位
+
+ if (businessLicenseNo.length() == 15) {
+ java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("^[0-9A-Za-z]\\w{14}$");
+ java.util.regex.Matcher match = pattern.matcher(businessLicenseNo);
+ return match.matches(); //15位注册码为历史问题,只校验格式
+ }
+
+ //18位社会信用代码判断
+ java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("^([0-9ABCDEFGHJKLMNPQRTUWXY]{2})([0-9]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-9Y])$");
+ java.util.regex.Matcher match = pattern.matcher(businessLicenseNo);
+ if (!match.matches()) return false; //社会信用代码校验错误!
+
+ //验证最后一位
+ String codeStr = "0123456789ABCDEFGHJKLMNPQRTUWXY"; //字符字典(字符下标为代码字符数值)
+ int[] ws = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28}; //权值
+ String lastChar = businessLicenseNo.substring(businessLicenseNo.length() - 1);
+// String prefixStr = businessLicenseNo.substring(0, businessLicenseNo.length() - 1);
+ int sum = 0;
+ for (int i = 0; i < 17; i++) {
+ sum += (codeStr.indexOf(businessLicenseNo.charAt(i)) * ws[i]);
+ }
+ int c18 = 31 - (sum % 31);
+ if (c18 == 31) {
+ if ("0".equals(lastChar)) return true; //第18位为0
+ } else {
+ //0~30 查字典
+ String cs18=String.valueOf(codeStr.charAt(c18)); //c18代表的字符
+ if(cs18.equals(lastChar)) return true;
+ }
+ return false;
+ }
}
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
index a67d6ff..f87b96b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
@@ -11,9 +11,10 @@
public static final int BALANCE_LIMIT = 1; //系统默认最大余额限制的ID
- public static final int MOBILE_LOGIN_EXPIRE_IN_SECONDS = 4; //手机端用户过期时间(秒)
public static final int NOPASS_LIMIT = 2; //默认免密额度
public static final int DAY_PAY_LIMIT = 3; //默认日累计额度
+ public static final int MOBILE_LOGIN_EXPIRE_IN_SECONDS = 4; //手机端用户过期时间(秒)
+ public static final int SHOP_NEEDCHECK_SWITCH = 5; //商户是否需要审核:1-需要;0-不需要
public static final int DLCARDMANAGER_APPID = 2019; //与卡管系统对接的应用ID
public static final int DLCARDMANAGER_SECRET = 2020; //与卡管系统对接的应用appkey
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
index d55d345..b78049f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
@@ -16,6 +16,18 @@
// QRcode 聚合支付
public static final int TRANSCODE_QRCODE = 1002;
+ //APP 内支付
+ public static final int TRANSCODE_APPPAY = 1003;
+
+ //H5 支付
+ public static final int TRANSCODE_H5PAY = 1004;
+
+ //JS 支付
+ public static final int TRANSCODE_JSPAY = 1005;
+
+ //小程序 支付
+ public static final int TRANSCODE_SMPAY = 1006;
+
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
index 85c2578..9c2162f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
@@ -8,12 +8,18 @@
* locked -- 锁定、冻结
* frozen -- 冻结
* lost -- 挂失
+ * unuse -- 未使用,未启用
+ * abnormal -- 异常
*/
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_LOST = "lost";
public static final String STATUS_FROZEN = "frozen";
+ public static final String STATUS_UNUSE = "unuse";
+ public static final String STATUS_ABNORMAL = "abnormal";
+ public static final String STATUS_UNCHECK = "uncheck";
+ public static final String STATUS_REJECT = "reject";
public static final String STATUS_YES = "yes";
public static final String STATUS_NO = "no";
@@ -76,7 +82,12 @@
public static final String PAYTYPE_YKT_CARD = "yktpay"; //一卡通
public static final String PAYTYPE_OTHER_THIRDPART = "thirdpart"; //其他第三方
+ public static final String PAYTYPE_APP = "APP"; //app内支付
+ public static final String PAYTYPE_H5 = "H5"; //H5内支付
+ public static final String PAYTYPE_JS = "JS"; //JS内支付
+ public static final String PAYTYPE_SM = "SM"; //SM内支付
+ public static final String SOURCETYPE_DEFAULT = "thirduid"; //第三方id默认
/**
* feetype
* - 消费:折扣、搭伙费(管理费)
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LayerTreeNode.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LayerTreeNode.java
new file mode 100644
index 0000000..159f496
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/LayerTreeNode.java
@@ -0,0 +1,79 @@
+package com.supwisdom.dlpay.system.bean;
+
+import java.util.List;
+
+public class LayerTreeNode {
+ private String title; //节点标题
+ private String id; //节点唯一索引值
+ private String field; //节点字段名
+ private String href;
+ private Boolean spread = false; //节点初始是否展开
+ private Boolean checked = false; //节点初始是否展开
+ private Boolean disabled = false; //节点是否为禁用状态
+
+ private List<LayerTreeNode> children; //子节点
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getField() {
+ return field;
+ }
+
+ public void setField(String field) {
+ this.field = field;
+ }
+
+ public String getHref() {
+ return href;
+ }
+
+ public void setHref(String href) {
+ this.href = href;
+ }
+
+ public Boolean getSpread() {
+ return spread;
+ }
+
+ public void setSpread(Boolean spread) {
+ this.spread = spread;
+ }
+
+ public Boolean getChecked() {
+ return checked;
+ }
+
+ public void setChecked(Boolean checked) {
+ this.checked = checked;
+ }
+
+ public Boolean getDisabled() {
+ return disabled;
+ }
+
+ public void setDisabled(Boolean disabled) {
+ this.disabled = disabled;
+ }
+
+ public List<LayerTreeNode> getChildren() {
+ return children;
+ }
+
+ public void setChildren(List<LayerTreeNode> children) {
+ this.children = children;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SettleLogSearchBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SettleLogSearchBean.java
new file mode 100644
index 0000000..082c2ea
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SettleLogSearchBean.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class SettleLogSearchBean {
+ private Integer page;
+ private Integer limit;
+ private String accdate;
+ 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 getAccdate() {
+ return accdate;
+ }
+
+ public void setAccdate(String accdate) {
+ this.accdate = accdate;
+ }
+
+ 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/ShopCheckBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopCheckBean.java
new file mode 100644
index 0000000..9ed4304
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/ShopCheckBean.java
@@ -0,0 +1,125 @@
+package com.supwisdom.dlpay.system.bean;
+
+import com.supwisdom.dlpay.framework.domain.TShop;
+
+public class ShopCheckBean extends TShop {
+ private String fshopname;
+ private Integer oldFshopid;
+ private String oldFshopname;
+ private String oldShopname;
+
+ private String oldBusinessLicenseNo; //营业执照编号
+ private String oldTaxRegistrationNo; //税务登记号
+ private String oldLegalPersonName; //法人姓名
+ private String oldLegalPersonIdtype; //法人证件类型
+ private String oldLegalPersonIdno; //法人证件号码
+
+ private String oldContactman;
+ private String oldMobile;
+ private String oldEmail;
+ private String oldTel;
+
+ public String getFshopname() {
+ return fshopname;
+ }
+
+ public void setFshopname(String fshopname) {
+ this.fshopname = fshopname;
+ }
+
+ public String getOldFshopname() {
+ return oldFshopname;
+ }
+
+ public void setOldFshopname(String oldFshopname) {
+ this.oldFshopname = oldFshopname;
+ }
+
+ public String getOldShopname() {
+ return oldShopname;
+ }
+
+ public void setOldShopname(String oldShopname) {
+ this.oldShopname = oldShopname;
+ }
+
+ public String getOldBusinessLicenseNo() {
+ return oldBusinessLicenseNo;
+ }
+
+ public void setOldBusinessLicenseNo(String oldBusinessLicenseNo) {
+ this.oldBusinessLicenseNo = oldBusinessLicenseNo;
+ }
+
+ public String getOldTaxRegistrationNo() {
+ return oldTaxRegistrationNo;
+ }
+
+ public void setOldTaxRegistrationNo(String oldTaxRegistrationNo) {
+ this.oldTaxRegistrationNo = oldTaxRegistrationNo;
+ }
+
+ public String getOldLegalPersonName() {
+ return oldLegalPersonName;
+ }
+
+ public void setOldLegalPersonName(String oldLegalPersonName) {
+ this.oldLegalPersonName = oldLegalPersonName;
+ }
+
+ public String getOldLegalPersonIdtype() {
+ return oldLegalPersonIdtype;
+ }
+
+ public void setOldLegalPersonIdtype(String oldLegalPersonIdtype) {
+ this.oldLegalPersonIdtype = oldLegalPersonIdtype;
+ }
+
+ public String getOldLegalPersonIdno() {
+ return oldLegalPersonIdno;
+ }
+
+ public void setOldLegalPersonIdno(String oldLegalPersonIdno) {
+ this.oldLegalPersonIdno = oldLegalPersonIdno;
+ }
+
+ public String getOldContactman() {
+ return oldContactman;
+ }
+
+ public void setOldContactman(String oldContactman) {
+ this.oldContactman = oldContactman;
+ }
+
+ public String getOldMobile() {
+ return oldMobile;
+ }
+
+ public void setOldMobile(String oldMobile) {
+ this.oldMobile = oldMobile;
+ }
+
+ public String getOldEmail() {
+ return oldEmail;
+ }
+
+ public void setOldEmail(String oldEmail) {
+ this.oldEmail = oldEmail;
+ }
+
+ public String getOldTel() {
+ return oldTel;
+ }
+
+ public void setOldTel(String oldTel) {
+ this.oldTel = oldTel;
+ }
+
+ public Integer getOldFshopid() {
+ return oldFshopid;
+ }
+
+ public void setOldFshopid(Integer oldFshopid) {
+ this.oldFshopid = oldFshopid;
+ }
+}
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
index f31d5b5..34aa0af 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java
@@ -9,6 +9,8 @@
Integer getSubjlevel();
+ Integer getBalflag();
+
String getDisplayflag();
Double getLastdaydrbal();
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
index c36c212..94ec1f1 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java
@@ -5,6 +5,7 @@
private String subjname;
private String fsubjno;
private Integer subjlevel;
+ private Integer balflag;
private String displayflag;
private Double lastdaydrbal;
private Double lastdaycrbal;
@@ -45,6 +46,14 @@
this.subjlevel = subjlevel;
}
+ public Integer getBalflag() {
+ return balflag;
+ }
+
+ public void setBalflag(Integer balflag) {
+ this.balflag = balflag;
+ }
+
public String getDisplayflag() {
return displayflag;
}
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
index 4ef27de..a587685 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
@@ -14,12 +14,19 @@
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.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.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.util.List;
@@ -196,7 +203,9 @@
@PostMapping("/dosetpwd")
@ResponseBody
public JsonResult dosetpwd(@RequestParam String curpwd,
- @RequestParam String newpwd, @RequestParam String renewpwd) {
+ @RequestParam String newpwd,
+ @RequestParam String renewpwd,
+ HttpServletRequest request, HttpServletResponse response) {
if (StringUtil.isEmpty(curpwd)
|| StringUtil.isEmpty(newpwd)
|| StringUtil.isEmpty(renewpwd)) {
@@ -219,6 +228,9 @@
}
operator.setOperpwd(encoder.encode(newpwd));
operatorService.saveOperator(operator);
+
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ new SecurityContextLogoutHandler().logout(request, response, auth);
return JsonResult.ok("密码修改成功,请重新登录");
}
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SettlementLogController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SettlementLogController.java
new file mode 100644
index 0000000..e94a27f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SettlementLogController.java
@@ -0,0 +1,59 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.SettlementAsyncTask;
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TSettleLog;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.SettleLogSearchBean;
+import com.supwisdom.dlpay.system.service.SettlementLogService;
+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.*;
+
+/**
+ * 结算日志
+ * */
+@Controller
+public class SettlementLogController {
+ @Autowired
+ private SettlementLogService settlementLogService;
+ @Autowired
+ private SettlementAsyncTask settlementAsyncTask;
+
+ @GetMapping("/settlelog/index")
+ public String userdtlView() {
+ return "system/settlelog/index";
+ }
+
+ @GetMapping("/settlelog/datalist")
+ @PreAuthorize("hasPermission('/settlelog/index','')")
+ @ResponseBody
+ public PageResult<TSettleLog> searchUserdtlPage(@ModelAttribute SettleLogSearchBean 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 settlementLogService.getSettleLogPage(searchBean,pageNo,pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @PostMapping("/settlelog/dosettle")
+ @PreAuthorize("hasPermission('/settlelog/dosettle','')")
+ @ResponseBody
+ public JsonResult doSettlement() {
+ try {
+ settlementAsyncTask.doHandSettleTask();
+ return JsonResult.ok("异步结算中,请查询日志查看结算结果");
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+}
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
index 7afabc4..399d728 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
@@ -1,25 +1,30 @@
package com.supwisdom.dlpay.system.controller;
+import com.supwisdom.dlpay.api.annotation.ShopType;
import com.supwisdom.dlpay.api.bean.JsonResult;
import com.supwisdom.dlpay.api.domain.TSourceType;
import com.supwisdom.dlpay.api.domain.TShopSourceType;
import com.supwisdom.dlpay.api.domain.TShopSourceTypeConfig;
import com.supwisdom.dlpay.api.types.IDTypes;
import com.supwisdom.dlpay.api.types.ShopTypes;
-import com.supwisdom.dlpay.framework.domain.TDictionary;
-import com.supwisdom.dlpay.framework.domain.TShop;
-import com.supwisdom.dlpay.framework.domain.TShopacc;
+import com.supwisdom.dlpay.framework.domain.*;
import com.supwisdom.dlpay.framework.service.SystemUtilService;
import com.supwisdom.dlpay.framework.util.*;
+import com.supwisdom.dlpay.system.bean.ShopCheckBean;
import com.supwisdom.dlpay.system.bean.ShopConfigBean;
+import com.supwisdom.dlpay.system.bean.TreeSelectNode;
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.EnumCheck;
import com.supwisdom.dlpay.util.WebCheckException;
+import org.apache.commons.lang.math.NumberUtils;
+import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@@ -43,33 +48,60 @@
@GetMapping("/shop/index")
public String shopView(Model model) {
- model.addAttribute(Dictionary.IDTYPE,
- dictionaryProxy.<TDictionary>getDictionaryAsList(Dictionary.IDTYPE));
+ model.addAttribute("shopNeedCheck", systemUtilService.getSysparaValueAsBoolean(SysparaUtil.SHOP_NEEDCHECK_SWITCH));
return "system/shop/index";
}
@GetMapping("/shop/shoptree")
@PreAuthorize("hasPermission('/shop/index','')")
@ResponseBody
- public JsonResult shopTreeData() {
- return JsonResult.ok("OK").put("data", shopDataService.getAllShopNodes());
+ public JsonResult shopTreeData(@AuthenticationPrincipal UserDetails operUser) {
+ try {
+ TOperator oper = (TOperator) operUser;
+ return JsonResult.ok("OK").put("data", shopDataService.getShopManageLayerShopTree(oper.getOperid()));
+ } catch (Exception e) {
+ return JsonResult.error("查询商户树失败!").put("exception", e);
+ }
+ }
+
+ @GetMapping("/shop/shoplist")
+ @PreAuthorize("hasPermission('/shop/index','')")
+ @ResponseBody
+ public PageResult<TShop> getShopBySearch(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "status", required = false) String status,
+ @RequestParam(value = "shopname", required = false) String shopname,
+ @RequestParam(value = "shopid", required = false) Integer shopid) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return shopDataService.getShopListBySearch(status, shopname, shopid, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
}
@PostMapping("/shop/deleteshop")
@PreAuthorize("hasPermission('/shop/deleteshop','')")
@ResponseBody
- public JsonResult deleteShop(@RequestParam("shopid") Integer shopid) {
+ public JsonResult deleteShop(@RequestParam("shopid") Integer shopid,
+ @AuthenticationPrincipal UserDetails operUser) {
TShop shop = shopDataService.getShopByShopid(shopid);
if (null == shop) {
return JsonResult.error("商户不存在,请重新查询"); //商户不存在,请重新查询
}
try {
- if (shopDataService.deleteShop(shop)) {
+ TOperator oper = (TOperator) operUser;
+ boolean needCheck = systemUtilService.getSysparaValueAsBoolean(SysparaUtil.SHOP_NEEDCHECK_SWITCH);
+ int ret = shopDataService.deleteShop(shop, needCheck, oper);
+ if (0 == ret) {
return JsonResult.ok("删除成功");
- } else {
- return JsonResult.error("删除失败");
+ } else if (ret > 0) {
+ return JsonResult.ok("删除申请成功");
}
+ return JsonResult.error(needCheck ? "删除申请失败" : "删除失败");
} catch (WebCheckException ex) {
return JsonResult.error(ex.getMessage());
} catch (Exception e) {
@@ -77,79 +109,269 @@
}
}
- @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);
+ @GetMapping("/shop/load4addshop")
+ @PreAuthorize("hasPermission('/shop/load4addshop','')")
+ public String load4AddShop(Model model) {
+ model.addAttribute(Dictionary.IDTYPE, dictionaryProxy.<TDictionary>getDictionaryAsList(Dictionary.IDTYPE));
+ return "system/shop/addshop";
}
- @PostMapping("/shop/saveorupdate")
- @PreAuthorize("hasPermission('/shop/saveorupdate','')")
+ @GetMapping("/shop/selectshopgroup")
+ @PreAuthorize("hasPermission('/shop/index','')")
@ResponseBody
- public JsonResult saveOrUpdateShop(@RequestParam("shopid") Integer shopid, @RequestParam("shopname") String shopname,
- @RequestParam("fshopid") Integer fshopid, @RequestParam("shoptype") String 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
- || !shopTypeCheck.isInEnums(shoptype, ShopTypes.NORMAL, ShopTypes.GROUP, ShopTypes.ROOT)) {
+ public List<TreeSelectNode> searchShopTree() {
+ return shopDataService.getChooseShopGroup();
+ }
+
+
+ @PostMapping("/shop/addshop")
+ @PreAuthorize("hasPermission('/shop/addshop','')")
+ @ResponseBody
+ public JsonResult addShop(@RequestParam("shoptype") String shoptype,
+ @RequestParam("fshopid") Integer fshopid,
+ @RequestParam("shopname") String shopname,
+ @RequestParam("businessLicenseNo") String businessLicenseNo,
+ @RequestParam("taxRegistrationNo") String taxRegistrationNo,
+ @RequestParam("addr") String addr,
+ @RequestParam("legalPersonName") String legalPersonName,
+ @RequestParam("legalPersonIdtype") String legalPersonIdtype,
+ @RequestParam("legalPersonIdno") String legalPersonIdno,
+ @RequestParam("contactman") String contactman,
+ @RequestParam("mobile") String mobile,
+ @RequestParam("email") String email,
+ @RequestParam("tel") String tel,
+ @AuthenticationPrincipal UserDetails operUser) {
+ if (StringUtil.isEmpty(shopname) || null == fshopid || !shopTypeCheck.isInEnums(shoptype, ShopTypes.NORMAL, ShopTypes.GROUP, ShopTypes.ROOT)) {
return JsonResult.error("参数传递错误");
+ } else if (ShopTypes.NORMAL.toString().equals(shoptype) && (StringUtil.isEmpty(businessLicenseNo) || StringUtil.isEmpty(taxRegistrationNo)
+ || StringUtil.isEmpty(addr) || StringUtil.isEmpty(legalPersonName) || StringUtil.isEmpty(legalPersonIdtype) || StringUtil.isEmpty(legalPersonIdno))) {
+ return JsonResult.error("参数传递错误,结算商户必须填写商户营业信息!");
+ }else if(!StringUtil.isEmpty(businessLicenseNo) && !StringUtil.checkBusinessLicenseNo(businessLicenseNo.trim())){
+ 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.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()) && IDTypes.IDCARD.value().equals(shop.getIdtype()) && !StringUtil.isIdentity(shop.getIdno())) {
+ TShop shop = new TShop();
+ shop.setFshopid(fshopid);
+ shop.setShopname(shopname);
+ shop.setShoptype(shoptype);
+ shop.setBusinessLicenseNo(null == businessLicenseNo ? null : businessLicenseNo.trim());
+ shop.setTaxRegistrationNo(null == taxRegistrationNo ? null : taxRegistrationNo.trim());
+ shop.setAddr(null == addr ? null : addr.trim());
+ shop.setLegalPersonName(null == legalPersonName ? null : legalPersonName.trim());
+ shop.setLegalPersonIdtype(null == legalPersonIdtype ? null : legalPersonIdtype.trim());
+ shop.setLegalPersonIdno(null == legalPersonIdno ? null : legalPersonIdno);
+ if (!StringUtil.isEmpty(shop.getLegalPersonIdno()) && StringUtil.isEmpty(shop.getLegalPersonIdtype())) {
+ return JsonResult.error("填写法人证件号时必须指定证件类型!");
+ } else if (!StringUtil.isEmpty(shop.getLegalPersonIdno()) && IDTypes.IDCARD.value().equals(shop.getLegalPersonIdtype()) && !StringUtil.isIdentity(shop.getLegalPersonIdno())) {
return JsonResult.error("身份证格式错误!");
}
+ shop.setContactman(contactman == null ? null : contactman.trim());
shop.setMobile(mobile);
if (!StringUtil.isEmpty(shop.getMobile()) && !StringUtil.isMobile(shop.getMobile())) {
- return JsonResult.error("请正确填写手机号!");
+ 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("请正确填写邮箱地址!");
+ 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);
+ TOperator oper = (TOperator) operUser;
+ boolean needCheck = systemUtilService.getSysparaValueAsBoolean(SysparaUtil.SHOP_NEEDCHECK_SWITCH);
+ int ret = shopDataService.saveNewShop(shop, needCheck, oper);
+ if (ret == 0) {
+ return JsonResult.ok("新增成功!");
+ } else if (ret > 0) {
+ return JsonResult.ok("新增申请成功!");
+ }
+ return JsonResult.error(needCheck ? "新增申请失败" : "新增失败");
+ } catch (WebCheckException ex) {
+ return JsonResult.error(ex.getMessage());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @GetMapping("/shop/load4updateshop")
+ @PreAuthorize("hasPermission('/shop/load4updateshop','')")
+ public String load4UpdateShop(@RequestParam("shopid") Integer shopid, Model model) {
+ TShop shop = shopDataService.getShopByShopid(shopid);
+ model.addAttribute("shop", shop != null ? shop : new TShop());
+ model.addAttribute(Dictionary.IDTYPE, dictionaryProxy.<TDictionary>getDictionaryAsList(Dictionary.IDTYPE));
+ return "system/shop/updateshop";
+ }
+
+ @PostMapping("/shop/updateshop")
+ @PreAuthorize("hasPermission('/shop/updateshop','')")
+ @ResponseBody
+ public JsonResult updateShop(@RequestParam("shopid") Integer shopid,
+ @RequestParam("fshopid") Integer fshopid,
+ @RequestParam("shopname") String shopname,
+ @RequestParam("businessLicenseNo") String businessLicenseNo,
+ @RequestParam("taxRegistrationNo") String taxRegistrationNo,
+ @RequestParam("addr") String addr,
+ @RequestParam("legalPersonName") String legalPersonName,
+ @RequestParam("legalPersonIdtype") String legalPersonIdtype,
+ @RequestParam("legalPersonIdno") String legalPersonIdno,
+ @RequestParam("contactman") String contactman,
+ @RequestParam("mobile") String mobile,
+ @RequestParam("email") String email,
+ @RequestParam("tel") String tel,
+ @AuthenticationPrincipal UserDetails operUser) {
+ if (null == shopid || StringUtil.isEmpty(shopname) || null == fshopid) {
+ return JsonResult.error("参数传递错误");
+ }
+ TShop oldShop = shopDataService.getShopByShopid(shopid);
+ if (null == oldShop) {
+ return JsonResult.error("商户不存在,修改失败!请重新查询");
+ }
+ if (ShopTypes.NORMAL.toString().equals(oldShop.getShoptype()) && (StringUtil.isEmpty(businessLicenseNo) || StringUtil.isEmpty(taxRegistrationNo)
+ || StringUtil.isEmpty(addr) || StringUtil.isEmpty(legalPersonName) || StringUtil.isEmpty(legalPersonIdtype) || StringUtil.isEmpty(legalPersonIdno))) {
+ return JsonResult.error("参数传递错误,结算商户必须填写商户营业信息!");
+ }else if(!StringUtil.isEmpty(businessLicenseNo) && !StringUtil.checkBusinessLicenseNo(businessLicenseNo.trim())){
+ return JsonResult.error("参数错误,请正确填写营业执照编号!");
+ }
+
+ TShop shop=new TShop();
+ BeanUtils.copyProperties(oldShop, shop); //TODO:避免JPA的set方法会提交数据库
+ shop.setFshopid(fshopid);
+ shop.setShopname(shopname);
+ shop.setBusinessLicenseNo(null == businessLicenseNo ? null : businessLicenseNo.trim());
+ shop.setTaxRegistrationNo(null == taxRegistrationNo ? null : taxRegistrationNo.trim());
+ shop.setAddr(null == addr ? null : addr.trim());
+ shop.setLegalPersonName(null == legalPersonName ? null : legalPersonName.trim());
+ shop.setLegalPersonIdtype(null == legalPersonIdtype ? null : legalPersonIdtype.trim());
+ shop.setLegalPersonIdno(null == legalPersonIdno ? null : legalPersonIdno);
+ if (!StringUtil.isEmpty(shop.getLegalPersonIdno()) && StringUtil.isEmpty(shop.getLegalPersonIdtype())) {
+ return JsonResult.error("填写法人证件号时必须指定证件类型!");
+ } else if (!StringUtil.isEmpty(shop.getLegalPersonIdno()) && IDTypes.IDCARD.value().equals(shop.getLegalPersonIdtype()) && !StringUtil.isIdentity(shop.getLegalPersonIdno())) {
+ return JsonResult.error("身份证格式错误!");
+ }
+ shop.setContactman(contactman == null ? null : contactman.trim());
+ shop.setMobile(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("请正确填写联系人邮箱!");
+ }
+
+ try {
+ TOperator oper = (TOperator) operUser;
+ boolean needCheck = systemUtilService.getSysparaValueAsBoolean(SysparaUtil.SHOP_NEEDCHECK_SWITCH);
+ int ret = shopDataService.updateShop(shop, needCheck, oper);
+ if (ret == 0) {
+ return JsonResult.ok("修改成功!");
+ } else if (ret > 0) {
+ return JsonResult.ok("修改申请成功!");
+ }
+ return JsonResult.error(needCheck ? "修改申请失败" : "修改失败");
+ } catch (WebCheckException ex) {
+ return JsonResult.error(ex.getMessage());
+ } catch (Exception e) {
+ e.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", e);
+ }
+ }
+
+ @GetMapping("/shop/getshopinfo")
+ @PreAuthorize("hasPermission('/shop/getshopinfo','')")
+ public String getShopInfo(@RequestParam("shopid") Integer shopid,Model model) {
+ TShop shop = shopDataService.getShopByShopid(shopid);
+ model.addAttribute("shop", shop != null ? shop : new TShop());
+ model.addAttribute(Dictionary.IDTYPE, dictionaryProxy.<TDictionary>getDictionaryAsList(Dictionary.IDTYPE));
+ return "system/shop/shopdetail";
+ }
+
+ @GetMapping("/shop/getshopchk")
+ @PreAuthorize("hasPermission('/shop/getshopchk','')")
+ public String getShopChkdtl(@RequestParam("shopid") Integer shopid,Model model) {
+ model.addAttribute("selectShopid", shopid);
+ return "system/shop/shopchk";
+ }
+
+ @GetMapping("/shop/getshopchklist")
+ @PreAuthorize("hasPermission('/shop/getshopchk','')")
+ @ResponseBody
+ public PageResult<TOperChkdtl> getShopBySearch(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "shopid", required = false) String shopid,
+ @RequestParam(value = "status", required = false) String status,
+ @RequestParam(value = "searchkey", required = false) String searchkey) {
+ try {
+ if (StringUtil.isEmpty(shopid)) return new PageResult<>(99, "无数据");
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return shopDataService.getShopChkdtlDetails(shopid, status, searchkey, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ /**
+ * ====================================================
+ * 商户审批
+ * ====================================================
+ */
+ @GetMapping("/shop/shopcheck")
+ @PreAuthorize("hasPermission('/shop/shopcheck','')")
+ public String shopCheckIndex(){
+ return "system/shop/shopcheck";
+ }
+
+ @GetMapping("/shop/shopchecklist")
+ @PreAuthorize("hasPermission('/shop/shopcheck','')")
+ @ResponseBody
+ public PageResult<TOperChkdtl> shopCheckIndex(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "shopid", required = false) String shopid,
+ @RequestParam(value = "status", required = false) String status,
+ @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;
+ return shopDataService.getShopChkdtlDetails(shopid, status, searchkey, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/shop/opercheck")
+ @PreAuthorize("hasPermission('/shop/opercheck','')")
+ public String shopOperCheck(@RequestParam("chkno") Long chkno, Model map) {
+ TOperChkdtl chkdtl = shopDataService.getOperChkdtlByChkno(chkno);
+ ShopCheckBean shop = shopDataService.getOperChkShopInfo(chkdtl);
+ map.addAttribute("operChkdtl", chkdtl);
+ map.addAttribute("shop", shop);
+ return "system/shop/opercheck";
+ }
+
+ @PostMapping("/shop/docheckshop")
+ @PreAuthorize("hasPermission('/shop/docheckshop','')")
+ @ResponseBody
+ public JsonResult doCheckShop(@RequestParam("chkno") String chkno,
+ @RequestParam("chkresult") String chkresult,
+ @RequestParam("chkmsg") String chkmsg,
+ @AuthenticationPrincipal UserDetails operUser) {
+ if(!NumberUtils.isDigits(chkno) || (!TradeDict.STATUS_NORMAL.equals(chkresult) && !TradeDict.STATUS_REJECT.equals(chkresult))){
+ return JsonResult.error("参数传递错误");
+ }else if(!TradeDict.STATUS_NORMAL.equals(chkresult) && StringUtil.isEmpty(chkmsg)){
+ return JsonResult.error("驳回必须填写审核意见!");
+ }
+
+ try {
+ TOperator oper = (TOperator) operUser;
+ TOperChkdtl chkdtl = shopDataService.doCheckShopChkdtl(Long.valueOf(chkno), TradeDict.STATUS_NORMAL.equals(chkresult), chkmsg, oper);
+ if (chkresult.equals(chkdtl.getChkResult())) {
+ return JsonResult.ok(TradeDict.STATUS_NORMAL.equals(chkresult) ? "审核成功!" : "驳回成功!");
} else {
- return JsonResult.error(addflag ? "新增失败" : "修改失败");
+ return JsonResult.ok(299, chkdtl.getChkMsg());
}
} catch (WebCheckException ex) {
return JsonResult.error(ex.getMessage());
@@ -159,6 +381,77 @@
}
}
+// @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") String 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
+// || !shopTypeCheck.isInEnums(shoptype, ShopTypes.NORMAL, ShopTypes.GROUP, ShopTypes.ROOT)) {
+// 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.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()) && IDTypes.IDCARD.value().equals(shop.getIdtype()) && !StringUtil.isIdentity(shop.getIdno())) {
+// return JsonResult.error("身份证格式错误!");
+// }
+// shop.setMobile(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);
+// }
+// }
+
/**
* ====================================================
* 商户支付能力配置
@@ -166,7 +459,6 @@
*/
@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";
@@ -176,7 +468,7 @@
@PreAuthorize("hasPermission('/shop/config','')")
@ResponseBody
public JsonResult shopaccTreeData() {
- return JsonResult.ok("OK").put("data", shopDataService.getAllShopNodes());
+ return JsonResult.ok("OK").put("data", shopDataService.getLayerShopTree());
}
@GetMapping("/shop/shopsourcetypelist")
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SourcetypeCheckController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SourcetypeCheckController.java
new file mode 100644
index 0000000..f5025bf
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SourcetypeCheckController.java
@@ -0,0 +1,137 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus;
+import com.supwisdom.dlpay.api.domain.TTransactionChkdtl;
+import com.supwisdom.dlpay.api.domain.TTransactionChkfile;
+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.service.SourcetypeCheckManagerService;
+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.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * 对账管理
+ */
+@Controller
+public class SourcetypeCheckController {
+ @Autowired
+ private SourcetypeCheckManagerService sourcetypeCheckManagerService;
+
+ /**
+ * ====================================================
+ * 对帐状态总表 checkStatus
+ * ====================================================
+ */
+ @GetMapping("/thirdchk/chkstatus")
+ public String chkStatusIndex() {
+ return "system/thirdchk/chkstatus";
+ }
+
+ @GetMapping("/thirdchk/chkstatuslist")
+ @PreAuthorize("hasPermission('/thirdchk/chkstatus','')")
+ @ResponseBody
+ public PageResult<TSourceTypeCheckStatus> 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;
+ return sourcetypeCheckManagerService.getSourceTypeCheckStatusPage(searchKey, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @PostMapping("/thirdchk/forcerecheck")
+ @PreAuthorize("hasPermission('/thirdchk/forcerecheck','')")
+ @ResponseBody
+ public JsonResult forceRecheck(@RequestParam("chkid") Integer chkid, @RequestParam("enable") Boolean enable) {
+ try {
+ TSourceTypeCheckStatus checkStatus = sourcetypeCheckManagerService.getSourceTypeCheckStatusById(chkid);
+ if (null == checkStatus) {
+ return JsonResult.error("对账状态记录不存在");
+ } else if (checkStatus.getSettleStatus()) {
+ return JsonResult.error("该对账状态记录已清算完成,不能修改此状态");
+ }
+
+ if (enable.equals(checkStatus.getForceRecheck())) {
+ return JsonResult.error(checkStatus.getForceRecheck() ? "该对账状态记录目前已启用强制重对" : "该对账状态记录目前已关闭强制重对");
+ }
+ checkStatus.setForceRecheck(enable);
+
+ if (sourcetypeCheckManagerService.saveOrUpdateSourceTypeCheckStatus(checkStatus)) {
+ return JsonResult.ok("修改成功!");
+ } else {
+ return JsonResult.error("修改失败");
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return JsonResult.error("系统处理异常").put("exception", ex);
+ }
+ }
+
+ /**
+ * ====================================================
+ * 对帐明细表 chkfile chkdtl
+ * ====================================================
+ */
+ @GetMapping("/thirdchk/chkfile")
+ public String checkFileIndex(Model map) {
+ map.addAttribute("checkSourcetypeList", sourcetypeCheckManagerService.getNeedCheckSourcetype());
+ return "system/thirdchk/chkfile";
+ }
+
+ @GetMapping("/thirdchk/chkfilelist")
+ @PreAuthorize("hasPermission('/thirdchk/chkfile','')")
+ @ResponseBody
+ public PageResult<TTransactionChkfile> getChkfileDataList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam(value = "startdate", required = false) String startdate,
+ @RequestParam(value = "enddate", required = false) String enddate,
+ @RequestParam(value = "sourcetype", required = false) String sourcetype) {
+ try {
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return sourcetypeCheckManagerService.getTransactionChkfilePage(startdate, enddate, sourcetype, pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+
+ @GetMapping("/thirdchk/chkdtl")
+ @PreAuthorize("hasPermission('/thirdchk/chkdtl','')")
+ public String load4CheckDtl(@RequestParam("chkfileid") String chkfileid, Model map) {
+ map.addAttribute("chkfileid", chkfileid);
+ return "system/thirdchk/chkdtl";
+ }
+
+ @GetMapping("/thirdchk/chkdtllist")
+ @PreAuthorize("hasPermission('/thirdchk/chkdtl','')")
+ @ResponseBody
+ public PageResult<TTransactionChkdtl> getChkdtlList(@RequestParam("page") Integer pageNo,
+ @RequestParam("limit") Integer pageSize,
+ @RequestParam("chkfileid") String chkfileid,
+ @RequestParam(value = "searchkey", required = false) String searchKey,
+ @RequestParam(value = "chkresult", required = false) String chkresult,
+ @RequestParam(value = "errorshow", required = false) Boolean errorshow) {
+ try {
+ if (StringUtil.isEmpty(chkfileid)) return new PageResult<>(99, "请选择对账明细文件");
+ if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+ if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+ return sourcetypeCheckManagerService.getTransactionChkdtlPage(chkfileid, searchKey, chkresult, (errorshow != null ? errorshow : false), pageNo, pageSize);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return new PageResult<>(99, "系统查询错误");
+ }
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/SettlementLogService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/SettlementLogService.java
new file mode 100644
index 0000000..0dfb031
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/SettlementLogService.java
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.framework.domain.TSettleLog;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.SettleLogSearchBean;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface SettlementLogService {
+ @Transactional(rollbackFor = Exception.class, readOnly = true)
+ PageResult<TSettleLog> getSettleLogPage(SettleLogSearchBean searchBean, int pageNo, int pageSize);
+}
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
index 606cb7c..31531d1 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
@@ -2,11 +2,12 @@
import com.supwisdom.dlpay.api.domain.TShopSourceType;
import com.supwisdom.dlpay.api.domain.TShopSourceTypeConfig;
+import com.supwisdom.dlpay.framework.domain.TOperChkdtl;
+import com.supwisdom.dlpay.framework.domain.TOperator;
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.system.bean.*;
import com.supwisdom.dlpay.util.WebCheckException;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@@ -22,7 +23,13 @@
TShop getShopByShopid(Integer shopid);
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
- boolean deleteShop(TShop shop) throws WebCheckException;
+ int deleteShop(TShop shop, boolean needCheck, TOperator oper) throws WebCheckException;
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ int saveNewShop(TShop shop, boolean needCheck, TOperator oper) throws WebCheckException;
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ int updateShop(TShop shop, boolean needCheck, TOperator oper) throws WebCheckException;
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
boolean saveOrUpdateShop(TShop shop) throws WebCheckException;
@@ -45,5 +52,28 @@
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
boolean saveOrUpdateShopPaytypeConfig(String shopaccno, String paytype, Map<String, String> param) throws WebCheckException;
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<LayerTreeNode> getLayerShopTree();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ List<LayerTreeNode> getShopManageLayerShopTree(String operid);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+ PageResult<TShop> getShopListBySearch(String status, String shopname, Integer shopid, int pageNo, int pageSize);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ List<TreeSelectNode> getChooseShopGroup();
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ PageResult<TOperChkdtl> getShopChkdtlDetails(String shopid, String status, String searchkey, int pageNo, int pageSize);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ TOperChkdtl getOperChkdtlByChkno(Long chkno);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+ ShopCheckBean getOperChkShopInfo(TOperChkdtl chkdtl);
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+ TOperChkdtl doCheckShopChkdtl(Long chkno,boolean passflag, String chkmsg, TOperator oper) throws Exception;
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/SourcetypeCheckManagerService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/SourcetypeCheckManagerService.java
new file mode 100644
index 0000000..dcd9bb5
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/SourcetypeCheckManagerService.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus;
+import com.supwisdom.dlpay.api.domain.TTransactionChkdtl;
+import com.supwisdom.dlpay.api.domain.TTransactionChkfile;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface SourcetypeCheckManagerService {
+ @Transactional(rollbackFor = Exception.class, readOnly = true)
+ PageResult<TSourceTypeCheckStatus> getSourceTypeCheckStatusPage(String searchkey, int pageNo, int pageSize);
+
+ @Transactional(rollbackFor = Exception.class, readOnly = true)
+ TSourceTypeCheckStatus getSourceTypeCheckStatusById(Integer chkid);
+
+ @Transactional(rollbackFor = Exception.class)
+ boolean saveOrUpdateSourceTypeCheckStatus(TSourceTypeCheckStatus checkStatus);
+
+
+ @Transactional(rollbackFor = Exception.class, readOnly = true)
+ List<TSourceType> getNeedCheckSourcetype();
+
+ @Transactional(rollbackFor = Exception.class, readOnly = true)
+ PageResult<TTransactionChkfile> getTransactionChkfilePage(String startdate, String enddate, String sourcetype, int pageNo, int pageSize);
+
+ @Transactional(rollbackFor = Exception.class, readOnly = true)
+ PageResult<TTransactionChkdtl> getTransactionChkdtlPage(String chkfileId, String searchKey, String chkresult, boolean errorshow, int pageNo, int pageSize);
+}
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
index e85609c..7aaac69 100644
--- 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
@@ -59,6 +59,7 @@
bean.setSubjname(info.getSubjname());
bean.setFsubjno(info.getFsubjno() == null ? "-1" : info.getFsubjno());
bean.setSubjlevel(info.getSubjlevel());
+ bean.setBalflag(info.getBalflag());
bean.setDisplayflag(info.getDisplayflag());
bean.setLastdaydrbal(info.getLastdaydrbal() == null ? 0.00 : info.getLastdaydrbal());
bean.setLastdaycrbal(info.getLastdaycrbal() == null ? 0.00 : info.getLastdaycrbal());
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SettlementLogServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SettlementLogServiceImpl.java
new file mode 100644
index 0000000..f5cd51f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SettlementLogServiceImpl.java
@@ -0,0 +1,56 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.framework.dao.SettleLogDao;
+import com.supwisdom.dlpay.framework.domain.TSettleLog;
+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.SettleLogSearchBean;
+import com.supwisdom.dlpay.system.service.SettlementLogService;
+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;
+
+@Service
+public class SettlementLogServiceImpl implements SettlementLogService {
+ @Autowired
+ private SettleLogDao settleLogDao;
+
+
+ @Override
+ public PageResult<TSettleLog> getSettleLogPage(SettleLogSearchBean searchBean, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "starttime"));
+ Page<TSettleLog> page = settleLogDao.findAll(new Specification<TSettleLog>() {
+ @Override
+ public Predicate toPredicate(Root<TSettleLog> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+ List<Predicate> predicates = new ArrayList<>();
+ if (!StringUtil.isEmpty(searchBean.getAccdate())) {
+ predicates.add(criteriaBuilder.ge(root.get("starttime").as(Long.class), Long.valueOf(DateUtil.unParseToDateFormat(searchBean.getAccdate()) + "000000")));
+ predicates.add(criteriaBuilder.le(root.get("endtime").as(Long.class), Long.valueOf(DateUtil.unParseToDateFormat(searchBean.getAccdate()) + "235959")));
+ }
+
+ if (!StringUtil.isEmpty(searchBean.getStatus())) {
+ if ("success".equalsIgnoreCase(searchBean.getStatus())) {
+ predicates.add(criteriaBuilder.equal(root.get("errcode").as(String.class), "0"));
+ } else {
+ predicates.add(criteriaBuilder.notEqual(root.get("errcode").as(String.class), "0"));
+ predicates.add(criteriaBuilder.notEqual(root.get("errcode").as(String.class), "-99"));
+ }
+ }
+ return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+ }
+ }, pageable);
+ return new PageResult<>(page);
+ }
+}
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
index a7cf9a7..1cccf99 100644
--- 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
@@ -1,5 +1,6 @@
package com.supwisdom.dlpay.system.service.impl;
+import com.google.gson.Gson;
import com.supwisdom.dlpay.api.dao.SourceTypeConfigDao;
import com.supwisdom.dlpay.api.dao.SourceTypeDao;
import com.supwisdom.dlpay.api.dao.ShopSourceTypeConfigDao;
@@ -9,19 +10,21 @@
import com.supwisdom.dlpay.api.domain.TShopSourceType;
import com.supwisdom.dlpay.api.domain.TShopSourceTypeConfig;
import com.supwisdom.dlpay.api.types.ShopTypes;
+import com.supwisdom.dlpay.framework.dao.DictionaryDao;
+import com.supwisdom.dlpay.framework.dao.OperChkdtlDao;
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.domain.*;
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.ShopConfigBean;
-import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import com.supwisdom.dlpay.system.bean.*;
import com.supwisdom.dlpay.system.service.ShopDataService;
+import com.supwisdom.dlpay.util.ConstantUtil;
import com.supwisdom.dlpay.util.EnumCheck;
import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
@@ -30,6 +33,8 @@
import org.springframework.stereotype.Service;
import org.springframework.data.jpa.domain.Specification;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.List;
@@ -51,6 +56,12 @@
private SourceTypeConfigDao sourceTypeConfigDao;
@Autowired
private ShopSourceTypeConfigDao shopPaytypeConfigDao;
+ @Autowired
+ private OperChkdtlDao operChkdtlDao;
+ @Autowired
+ private DictionaryDao dictionaryDao;
+ @PersistenceContext
+ private EntityManager entityManager;
private EnumCheck<ShopTypes, String> enumUtil = new EnumCheck<>();
@@ -86,27 +97,210 @@
}
@Override
- public boolean deleteShop(TShop shop) throws WebCheckException {
+ public int deleteShop(TShop shop, boolean needCheck, TOperator oper) throws WebCheckException {
if (null != shop) {
if (ShopTypes.ROOT.value().equals(shop.getShoptype())) {
throw new WebCheckException("不能删除根商户节点");
}
+ if (TradeDict.STATUS_CLOSED.equals(shop.getStatus())) {
+ throw new WebCheckException("商户已经被删除,请重新查询再操作");
+ }
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);
+ TShopacc shopacc = null;
if (!StringUtil.isEmpty(shop.getShopaccno())) {
- TShopacc shopacc = shopaccDao.getByShopaccno(shop.getShopaccno());
+ 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;
+
+ if (!needCheck) {
+ //无需审批,直接注销
+ shop.setStatus(TradeDict.STATUS_CLOSED);
+ shop.setClosedate(systemUtilService.getSysdatetime().getHostdate());
+ shopDao.save(shop);
+ if (null != shopacc) {
+ shopacc.setStatus(TradeDict.STATUS_CLOSED);
+ shopacc.setClosedate(shop.getClosedate());
+ shopaccDao.save(shopacc);
+ }
+ return 0;
+ } else {
+ //创建审批记录
+ if (TradeDict.STATUS_NORMAL.equals(shop.getStatus())) {
+ if (operChkdtlDao.getChkdtlCount(ConstantUtil.OPERCHK_CHKTYPE_SHOP, ConstantUtil.OPERCHK_CHKMODE_DELETE, shop.getShopid().toString(), TradeDict.STATUS_UNCHECK).getExisted() > 0) {
+ throw new WebCheckException("该商户已经提交了删除申请,无需再次提交!");
+ }
+ TOperChkdtl chkdtl = new TOperChkdtl();
+ chkdtl.setChkType(ConstantUtil.OPERCHK_CHKTYPE_SHOP);
+ chkdtl.setChkMode(ConstantUtil.OPERCHK_CHKMODE_DELETE);
+ chkdtl.setContentId(shop.getShopid().toString());
+ chkdtl.setChkResult(TradeDict.STATUS_UNCHECK);
+ chkdtl.setCreateOperid(oper.getOperid());
+ chkdtl.setCreateOpername(oper.getOpername());
+ chkdtl.setCreatetime(systemUtilService.getSysdatetime().getHostdatetime());
+ chkdtl.setTenantId(shop.getTenantId());
+ operChkdtlDao.save(chkdtl);
+ return 1;
+ } else {
+ //未审批或被驳回的商户直接删除,未审核的审批直接作废
+ operChkdtlDao.doClearChkdtl(ConstantUtil.OPERCHK_CHKTYPE_SHOP, shop.getShopid().toString());
+ shopDao.delete(shop);
+ if (null != shopacc) {
+ shopaccDao.delete(shopacc);
+ }
+ return 0;
+ }
+ }
}
- return false;
+ return -1;
+ }
+
+ @Override
+ public int saveNewShop(TShop shop, boolean needCheck, TOperator oper) throws WebCheckException {
+ if (null == shop) return -1;
+ if (shop.getFshopid() != 0) {
+ TShop fshop = shopDao.getTShopByShopid(shop.getFshopid());
+ if (null == fshop) {
+ throw new WebCheckException("上级商户不存在!");
+ } else if (!enumUtil.isInEnums(fshop.getShoptype(),
+ ShopTypes.ROOT, ShopTypes.GROUP)) {
+ throw new WebCheckException("上级商户不是商户组!");
+ }
+ }
+ if (shopDao.checkShopnameExist(shop.getShopname(), shop.getFshopid(), shop.getShopid() == null ? 0 : shop.getShopid()) > 0) {
+ throw new WebCheckException("商户名称在同级下已经存在!");
+ }
+
+ SystemDateTime dt = systemUtilService.getSysdatetime();
+ shop.setOpendate(dt.getHostdate());
+ shop.setTenantId(TenantContext.getTenantSchema());
+ shop.setAddOperid(oper == null ? null : oper.getOperid());
+ if (!needCheck) {
+ //不需要审核
+ shop.setStatus(TradeDict.STATUS_NORMAL);
+ shopDao.save(shop);
+ if (enumUtil.isInEnums(shop.getShoptype(), ShopTypes.NORMAL)) {
+ 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());
+ shopacc = shopaccDao.save(shopacc);
+ shopacc.setMac(shopacc.genMAC());
+ shopaccDao.save(shopacc);
+ shop.setShopaccno(shopacc.getShopaccno());
+ shopDao.save(shop);
+
+// TShopPaytype shopPaytype = new TShopPaytype();
+// shopPaytype.setShopaccno(shopacc.getShopaccno());
+// shopPaytype.setSourceType(TradeDict.PAYTYPE_BALANCE);
+// shopPaytype.setConsumeEnable(true);
+// shopPaytype.setAnonymousEnable(false);
+// shopPaytype.setReverseEnable(false);
+// shopPaytype.setCreatetime(dt.getHostdatetime());
+// shopSourceTypeDao.save(shopPaytype); //默认增加余额支付方式
+ }
+ return 0;
+
+ } else {
+ //需要审核
+ shop.setStatus(TradeDict.STATUS_UNCHECK);
+ shop = shopDao.save(shop);
+
+ TOperChkdtl chkdtl = new TOperChkdtl();
+ chkdtl.setChkType(ConstantUtil.OPERCHK_CHKTYPE_SHOP);
+ chkdtl.setChkMode(ConstantUtil.OPERCHK_CHKMODE_ADD);
+ chkdtl.setContentId(shop.getShopid().toString());
+ chkdtl.setChkResult(TradeDict.STATUS_UNCHECK);
+ chkdtl.setCreateOperid(oper.getOperid());
+ chkdtl.setCreateOpername(oper.getOpername());
+ chkdtl.setCreatetime(systemUtilService.getSysdatetime().getHostdatetime());
+ chkdtl.setTenantId(shop.getTenantId());
+ operChkdtlDao.save(chkdtl); //审批记录
+ return 1;
+ }
+ }
+
+ @Override
+ public int updateShop(TShop shop, boolean needCheck, TOperator oper) throws WebCheckException {
+ if (null != shop) {
+ if (TradeDict.STATUS_CLOSED.equals(shop.getStatus())) {
+ throw new WebCheckException("商户已经被删除,请重新查询再操作");
+ }
+ if (shop.getFshopid() != 0) {
+ TShop fshop = shopDao.getTShopByShopid(shop.getFshopid());
+ if (null == fshop) {
+ throw new WebCheckException("上级商户不存在!");
+ } else if (!enumUtil.isInEnums(fshop.getShoptype(),
+ ShopTypes.ROOT, ShopTypes.GROUP)) {
+ throw new WebCheckException("上级商户不是商户组!");
+ }
+ }
+ if (shopDao.checkShopnameExist(shop.getShopname(), shop.getFshopid(), shop.getShopid() == null ? 0 : shop.getShopid()) > 0) {
+ throw new WebCheckException("商户名称在同级下已经存在!");
+ }
+
+ if (!needCheck) {
+ //无需审核
+ shopDao.save(shop);
+ if (!StringUtil.isEmpty(shop.getShopaccno())) {
+ shopaccDao.updateShopnameByShopaccno(shop.getShopname(), shop.getShopaccno()); //更新商户名
+ }
+ return 0;
+ } else {
+ //需要审核
+ if (TradeDict.STATUS_UNCHECK.equals(shop.getStatus())) {
+ //待审核的商户直接更新原记录
+ shopDao.save(shop);
+ if (!StringUtil.isEmpty(shop.getShopaccno())) {
+ shopaccDao.updateShopnameByShopaccno(shop.getShopname(), shop.getShopaccno()); //更新商户名
+ }
+ return 0;
+ } else if (TradeDict.STATUS_REJECT.equals(shop.getStatus())) {
+ //被驳回的商户
+ shop.setStatus(TradeDict.STATUS_UNCHECK); //重新变为待审核
+ shopDao.save(shop);
+ if (!StringUtil.isEmpty(shop.getShopaccno())) {
+ shopaccDao.updateShopnameByShopaccno(shop.getShopname(), shop.getShopaccno()); //更新商户名
+ }
+
+ TOperChkdtl chkdtl = new TOperChkdtl();
+ chkdtl.setChkType(ConstantUtil.OPERCHK_CHKTYPE_SHOP);
+ chkdtl.setChkMode(ConstantUtil.OPERCHK_CHKMODE_ADD);
+ chkdtl.setContentId(shop.getShopid().toString());
+ chkdtl.setChkResult(TradeDict.STATUS_UNCHECK);
+ chkdtl.setCreateOperid(oper.getOperid());
+ chkdtl.setCreateOpername(oper.getOpername());
+ chkdtl.setCreatetime(systemUtilService.getSysdatetime().getHostdatetime());
+ chkdtl.setTenantId(shop.getTenantId());
+ operChkdtlDao.save(chkdtl); //审批记录
+ return 1;
+ } else {
+ //正常的商户,新增审核记录
+ operChkdtlDao.doClearChkdtl(ConstantUtil.OPERCHK_CHKTYPE_SHOP, ConstantUtil.OPERCHK_CHKMODE_MODIFY, shop.getShopid().toString()); //未审核的修改记录作废
+ TOperChkdtl chkdtl = new TOperChkdtl();
+ chkdtl.setChkType(ConstantUtil.OPERCHK_CHKTYPE_SHOP);
+ chkdtl.setChkMode(ConstantUtil.OPERCHK_CHKMODE_MODIFY);
+ chkdtl.setContentId(shop.getShopid().toString());
+ chkdtl.setContent(new Gson().toJson(shop)); //修改后的商户信息json暂存
+ chkdtl.setChkResult(TradeDict.STATUS_UNCHECK);
+ chkdtl.setCreateOperid(oper.getOperid());
+ chkdtl.setCreateOpername(oper.getOpername());
+ chkdtl.setCreatetime(systemUtilService.getSysdatetime().getHostdatetime());
+ chkdtl.setTenantId(shop.getTenantId());
+ operChkdtlDao.save(chkdtl); //审批记录
+ return 1;
+ }
+ }
+ }
+ return -1;
+
+
}
@Override
@@ -146,8 +340,9 @@
shopacc.setOpendate(dt.getHostdate());
shopacc.setBalance(0D);
shopacc.setTenantId(shop.getTenantId());
+ shopacc = shopaccDao.save(shopacc);
+ shopacc.setMac(shopacc.genMAC());
shopaccDao.save(shopacc);
-
shop.setShopaccno(shopacc.getShopaccno());
shopDao.save(shop);
@@ -232,7 +427,7 @@
List<TSourceTypeConfig> list = sourceTypeConfigDao.getBySourceTypeOrderByConfigid(paytype.trim());
if (!StringUtil.isEmpty(list)) {
for (TSourceTypeConfig pt : list) {
- if(pt.getGlobalflag()){
+ if (pt.getGlobalflag()) {
continue; //通用参数跳过
}
TShopSourceTypeConfig spc = shopPaytypeConfigDao.getShopSourceTypeConfigById(shopaccno, pt.getSourceType(), pt.getConfigid());
@@ -279,4 +474,385 @@
return true;
}
+ @Override
+ public List<LayerTreeNode> getLayerShopTree() {
+ List<TShop> shoplist = shopDao.getNormalShops();
+ List<TShop> rootlist = shopDao.getRootNormalShops();
+ List<LayerTreeNode> result = new ArrayList<>(0);
+ if (StringUtil.isEmpty(rootlist)) {
+ return result;
+ }
+ for (TShop shop : rootlist) {
+ LayerTreeNode node = new LayerTreeNode();
+ node.setTitle(shop.getShopname());
+ node.setId(shop.getShopid().toString());
+ node.setField(StringUtil.isEmpty(shop.getShopaccno()) ? "" : shop.getShopaccno().trim());
+ node.setSpread(true);
+ List<LayerTreeNode> children = getShopLayerChildres(shoplist, shop.getShopid());
+ node.setChildren(StringUtil.isEmpty(children) ? null : children);
+ result.add(node); //跟节点
+ }
+ return result;
+ }
+
+ private List<LayerTreeNode> getShopLayerChildres(List<TShop> shoplist, Integer fshopid) {
+ List<LayerTreeNode> result = new ArrayList<>(0);
+ for (TShop shop : shoplist) {
+ if (fshopid.equals(shop.getFshopid())) {
+ LayerTreeNode node = new LayerTreeNode();
+ node.setTitle(shop.getShopname());
+ node.setId(shop.getShopid().toString());
+ node.setField(StringUtil.isEmpty(shop.getShopaccno()) ? "" : shop.getShopaccno().trim());
+ node.setSpread(StringUtil.isEmpty(shop.getShopaccno()));
+ List<LayerTreeNode> children = getShopLayerChildres(shoplist, shop.getShopid());
+ node.setChildren(StringUtil.isEmpty(children) ? null : children);
+ result.add(node);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public List<LayerTreeNode> getShopManageLayerShopTree(String operid) {
+ if (StringUtil.isEmpty(operid)) return getLayerShopTree();
+
+ List<TShop> shoplist = shopDao.findAllShops();
+ List<TShop> rootlist = shopDao.getRootShops();
+ List<LayerTreeNode> result = new ArrayList<>(0);
+ if (StringUtil.isEmpty(rootlist)) {
+ return result;
+ }
+ for (TShop shop : rootlist) {
+ if (TradeDict.STATUS_CLOSED.equals(shop.getStatus())) continue; //注销商户跳过
+ if (!TradeDict.STATUS_NORMAL.equals(shop.getStatus()) && !operid.equals(shop.getAddOperid()))
+ continue; //非正常商户,非用户权限跳过
+ LayerTreeNode node = new LayerTreeNode();
+ node.setTitle(shop.getShopname());
+ if (TradeDict.STATUS_UNCHECK.equals(shop.getStatus())) {
+ node.setTitle(shop.getShopname() + " (待审核)");
+ } else if (TradeDict.STATUS_REJECT.equals(shop.getStatus())) {
+ node.setTitle(shop.getShopname() + " (被驳回)");
+ }
+ node.setId(shop.getShopid().toString());
+ node.setField(StringUtil.isEmpty(shop.getShopaccno()) ? "" : shop.getShopaccno().trim());
+ node.setSpread(true);
+ List<LayerTreeNode> children = getShopManageLayerChildres(shoplist, shop.getShopid(), operid);
+ node.setChildren(StringUtil.isEmpty(children) ? null : children);
+ result.add(node); //跟节点
+ }
+ return result;
+ }
+
+ private List<LayerTreeNode> getShopManageLayerChildres(List<TShop> shoplist, Integer fshopid, String operid) {
+ List<LayerTreeNode> result = new ArrayList<>(0);
+ for (TShop shop : shoplist) {
+ if (TradeDict.STATUS_CLOSED.equals(shop.getStatus())) continue; //注销商户跳过
+ if (!TradeDict.STATUS_NORMAL.equals(shop.getStatus()) && !operid.equals(shop.getAddOperid()))
+ continue; //非正常商户,非用户权限跳过
+ if (fshopid.equals(shop.getFshopid())) {
+ LayerTreeNode node = new LayerTreeNode();
+ node.setTitle(shop.getShopname());
+ if (TradeDict.STATUS_UNCHECK.equals(shop.getStatus())) {
+ node.setTitle(shop.getShopname() + " (待审核)");
+ } else if (TradeDict.STATUS_REJECT.equals(shop.getStatus())) {
+ node.setTitle(shop.getShopname() + " (被驳回)");
+ }
+ node.setId(shop.getShopid().toString());
+ node.setField(StringUtil.isEmpty(shop.getShopaccno()) ? "" : shop.getShopaccno().trim());
+ node.setSpread(!ShopTypes.NORMAL.toString().equals(shop.getShoptype()));
+ List<LayerTreeNode> children = getShopManageLayerChildres(shoplist, shop.getShopid(), operid);
+ node.setChildren(StringUtil.isEmpty(children) ? null : children);
+ result.add(node);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public PageResult<TShop> getShopListBySearch(String status, String shopname, Integer shopid, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("shopid"));
+ Page<TShop> page = shopDao.findAll(new Specification<TShop>() {
+ @Override
+ public Predicate toPredicate(Root<TShop> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+ List<Predicate> predicates = new ArrayList<>();
+ if (!StringUtil.isEmpty(status)) {
+ predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), status.trim()));
+ }
+ if (!StringUtil.isEmpty(shopname)) {
+ predicates.add(criteriaBuilder.like(root.get("shopname").as(String.class), "%" + shopname.trim() + "%"));
+ }
+ if (null != shopid) {
+ predicates.add(criteriaBuilder.equal(root.get("shopid").as(Integer.class), shopid));
+ }
+ predicates.add(criteriaBuilder.notEqual(root.get("status").as(String.class), TradeDict.STATUS_CLOSED)); //排除注销商户
+ return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+ }
+ }, pageable);
+
+ return new PageResult<>(page);
+ }
+
+ @Override
+ public List<TreeSelectNode> getChooseShopGroup() {
+ List<TShop> rootList = shopDao.getRootNormalShops();
+ List<TShop> shoplist = shopDao.findAllShops();
+ List<TreeSelectNode> result = new ArrayList<>(0);
+ if (StringUtil.isEmpty(rootList)) {
+ return result;
+ }
+ for (TShop rt : rootList) {
+ TreeSelectNode node = new TreeSelectNode();
+ node.setId(rt.getShopid().toString());
+ node.setName(rt.getShopname());
+ node.setOpen(true);
+ node.setChecked(false);
+ node.setAccno(rt.getShopaccno() == null ? "" : rt.getShopaccno());
+ node.setpId(String.valueOf(rt.getFshopid()));
+ List<TreeSelectNode> children = getChooseShopGroupTree(shoplist, rt.getShopid());
+ node.setChildren(StringUtil.isEmpty(children) ? null : children);
+ result.add(node);
+ }
+ return result;
+ }
+
+ private List<TreeSelectNode> getChooseShopGroupTree(List<TShop> shopList, int fshopid) {
+ List<TreeSelectNode> result = new ArrayList<>(0);
+ if (!StringUtil.isEmpty(shopList)) {
+ for (TShop shop : shopList) {
+ if (fshopid == shop.getFshopid() && !ShopTypes.NORMAL.toString().equals(shop.getShoptype()) && TradeDict.STATUS_NORMAL.equals(shop.getStatus())) {
+ //状态正常的商户组
+ TreeSelectNode node = new TreeSelectNode();
+ node.setId(shop.getShopid().toString());
+ node.setName(shop.getShopname());
+ node.setOpen(true);
+ node.setChecked(false);
+ node.setAccno(shop.getShopaccno() == null ? "" : shop.getShopaccno());
+ node.setpId(String.valueOf(fshopid));
+ List<TreeSelectNode> children = getChooseShopGroupTree(shopList, shop.getShopid());
+ node.setChildren(StringUtil.isEmpty(children) ? null : children);
+ result.add(node);
+ }
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public PageResult<TOperChkdtl> getShopChkdtlDetails(String shopid, String status, String searchkey, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC,"chkNo"));
+
+ Page<TOperChkdtl> page = operChkdtlDao.findAll(new Specification<TOperChkdtl>() {
+ @Override
+ public Predicate toPredicate(Root<TOperChkdtl> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+ List<Predicate> predicates = new ArrayList<>();
+ if (!StringUtil.isEmpty(shopid)) {
+ predicates.add(criteriaBuilder.equal(root.get("contentId").as(String.class), shopid.trim()));
+ }
+ if (!StringUtil.isEmpty(status)) {
+ predicates.add(criteriaBuilder.equal(root.get("chkResult").as(String.class), status.trim()));
+ }
+ if (!StringUtil.isEmpty(searchkey)) {
+ predicates.add(criteriaBuilder.or(criteriaBuilder.like(root.get("chkNo").as(String.class), "%" + searchkey.trim() + "%"),
+ criteriaBuilder.like(root.get("createOpername").as(String.class), "%" + searchkey.trim() + "%"),
+ criteriaBuilder.like(root.get("checkOpername").as(String.class), "%" + searchkey.trim() + "%")));
+ }
+ predicates.add(criteriaBuilder.equal(root.get("chkType").as(String.class), ConstantUtil.OPERCHK_CHKTYPE_SHOP));
+ predicates.add(criteriaBuilder.equal(root.get("invalidflag").as(Boolean.class), false));
+ return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+ }
+ }, pageable);
+ return new PageResult<>(page);
+ }
+
+ @Override
+ public TOperChkdtl getOperChkdtlByChkno(Long chkno) {
+ TOperChkdtl chkdtl = operChkdtlDao.getByChkno(chkno != null ? chkno : -99L);
+ if (null != chkdtl) {
+ return chkdtl;
+ }
+ return new TOperChkdtl();
+ }
+
+ private boolean checkSameString(String str1, String str2) {
+ if (StringUtil.isEmpty(str1) && StringUtil.isEmpty(str2)) return true;
+ if (null != str1 && str1.equals(str2)) return true;
+ return false;
+ }
+
+ @Override
+ public ShopCheckBean getOperChkShopInfo(TOperChkdtl chkdtl) {
+ if (null == chkdtl || null == chkdtl.getChkNo() || !ConstantUtil.OPERCHK_CHKTYPE_SHOP.equals(chkdtl.getChkType()))
+ return new ShopCheckBean();
+ TShop tShop = shopDao.getTShopByShopid(Integer.valueOf(chkdtl.getContentId()));
+ if (null == tShop) return new ShopCheckBean(); //未找到商户
+ ShopCheckBean result = new ShopCheckBean();
+ if (ConstantUtil.OPERCHK_CHKMODE_MODIFY.equals(chkdtl.getChkMode())) {
+ TShop shop = new Gson().fromJson(chkdtl.getContent(), TShop.class); //修改后的商户记录
+ BeanUtils.copyProperties(shop, result);
+ //判断哪些字段有修改
+ if (result.getFshopid() != tShop.getFshopid().intValue()) result.setOldFshopid(tShop.getFshopid());
+ if (!result.getShopname().equals(tShop.getShopname())) result.setOldShopname(tShop.getShopname());
+ if (!checkSameString(result.getBusinessLicenseNo(), tShop.getBusinessLicenseNo()))
+ result.setOldBusinessLicenseNo(tShop.getBusinessLicenseNo());
+ if (!checkSameString(result.getTaxRegistrationNo(), tShop.getTaxRegistrationNo()))
+ result.setOldTaxRegistrationNo(tShop.getTaxRegistrationNo());
+ if (!checkSameString(result.getLegalPersonName(), tShop.getLegalPersonName()))
+ result.setOldLegalPersonName(tShop.getLegalPersonName());
+ if (!checkSameString(result.getLegalPersonIdtype(), tShop.getLegalPersonIdtype()))
+ result.setOldLegalPersonIdtype(tShop.getLegalPersonIdtype());
+ if (!checkSameString(result.getLegalPersonIdno(), tShop.getLegalPersonIdno()))
+ result.setOldLegalPersonIdno(tShop.getLegalPersonIdno());
+ if (!checkSameString(result.getContactman(), tShop.getContactman()))
+ result.setOldContactman(tShop.getContactman());
+ if (!checkSameString(result.getMobile(), tShop.getMobile())) result.setOldMobile(tShop.getMobile());
+ if (!checkSameString(result.getEmail(), tShop.getEmail())) result.setOldEmail(tShop.getEmail());
+ if (!checkSameString(result.getTel(), tShop.getTel())) result.setOldTel(tShop.getTel());
+ } else {
+ BeanUtils.copyProperties(tShop, result);
+ }
+
+ if (null != result.getFshopid() && result.getFshopid() > 0) {
+ TShop fshop = shopDao.getTShopByShopid(result.getFshopid());
+ result.setFshopname(fshop == null ? "" : fshop.getShopname());
+ }
+ if (null != result.getOldFshopid() && result.getOldFshopid() > 0) {
+ TShop fshop = shopDao.getTShopByShopid(result.getOldFshopid());
+ result.setFshopname(fshop == null ? "" : fshop.getShopname());
+ }
+ if (null != result.getLegalPersonIdtype()) {
+ TDictionary dict = dictionaryDao.getByDicttypeAndDictval(Dictionary.IDTYPE, result.getLegalPersonIdtype());
+ result.setLegalPersonIdtype(dict == null ? "其他" : dict.getDictcaption());
+ }
+ if (null != result.getOldLegalPersonIdtype()) {
+ TDictionary dict = dictionaryDao.getByDicttypeAndDictval(Dictionary.IDTYPE, result.getOldLegalPersonIdtype());
+ result.setOldLegalPersonIdtype(dict == null ? "其他" : dict.getDictcaption());
+ }
+ return result;
+ }
+
+ @Override
+ public TOperChkdtl doCheckShopChkdtl(Long chkno, boolean passflag, String chkmsg, TOperator oper) throws Exception {
+ TOperChkdtl chkdtl = operChkdtlDao.getByChknoForUpdate(chkno);
+ if (null == chkdtl) {
+ throw new WebCheckException("审批记录不存在!");
+ } else if (!TradeDict.STATUS_UNCHECK.equals(chkdtl.getChkResult())) {
+ throw new WebCheckException("审批记录已被审核,请重新查询再操作!");
+ } else if (!ConstantUtil.OPERCHK_CHKTYPE_SHOP.equals(chkdtl.getChkType())) {
+ throw new WebCheckException("该记录非商户审批记录,请重新查询再操作!");
+ } else if (chkdtl.getInvalidflag()) {
+ throw new WebCheckException("该审批记录已作废,请重新查询再操作!");
+ }
+
+ TShop shop = shopDao.getTShopByShopid(Integer.valueOf(chkdtl.getContentId()));
+ if (null == shop) {
+ throw new WebCheckException("业务异常!审批记录指定的商户已被删除!");
+ }
+ if (null != oper) {
+ chkdtl.setCheckOperid(oper.getOperid());
+ chkdtl.setCheckOpername(oper.getOpername());
+ }
+ chkdtl.setChkMsg(StringUtil.isEmpty(chkmsg) ? null : chkmsg.trim());
+ chkdtl.setChecktime(systemUtilService.getSysdatetime().getHostdatetime());
+
+ if (passflag) {
+ //审核通过
+ if (ConstantUtil.OPERCHK_CHKMODE_DELETE.equals(chkdtl.getChkMode())) {
+ //同意删除申请
+ if (ShopTypes.ROOT.value().equals(shop.getShoptype())) {
+ chkdtl.setChkResult(TradeDict.STATUS_REJECT); //拒绝
+ chkdtl.setChkMsg("不能删除根商户节点");
+ } else {
+ if (!TradeDict.STATUS_CLOSED.equals(shop.getStatus())) {
+ List<TShop> childShops = shopDao.getChildShopsByShopid(shop.getShopid());
+ if (!StringUtil.isEmpty(childShops)) {
+ chkdtl.setChkResult(TradeDict.STATUS_REJECT); //拒绝
+ chkdtl.setChkMsg("该商户下存在正常的下级商户,不满足删除条件!");
+ } else {
+ //可以删除
+ chkdtl.setChkResult(TradeDict.STATUS_NORMAL); //通过
+
+ shop.setStatus(TradeDict.STATUS_CLOSED);
+ shop.setClosedate(systemUtilService.getSysdatetime().getHostdate());
+ shop.setDelOperid(chkdtl.getCreateOperid());
+ 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);
+ }
+ }
+ }
+ }
+
+ } else if (ConstantUtil.OPERCHK_CHKMODE_ADD.equals(chkdtl.getChkMode())) {
+ //同意新增
+ chkdtl.setChkResult(TradeDict.STATUS_NORMAL); //通过
+
+ shop.setStatus(TradeDict.STATUS_NORMAL); //状态置为正常
+ shop.setAddOperid(chkdtl.getCreateOperid());
+ shop.setShopaccno(null);
+ if (ShopTypes.NORMAL.toString().equals(shop.getShoptype())) {
+ String shopaccno = String.format("2%09d", shop.getShopid());
+ TShopacc shopacc = shopaccDao.getByShopaccno(shopaccno);
+ if (null != shopacc) {
+ shopacc.setStatus(shop.getStatus());
+ shopacc.setShopname(shop.getShopname());
+ shopaccDao.save(shopacc);
+ } else {
+ shopacc = new TShopacc();
+ shopacc.setShopaccno(shopaccno);
+ shopacc.setShopid(shop.getShopid());
+ shopacc.setShopname(shop.getShopname());
+ shopacc.setSubjno(Subject.SUBJNO_MACHANT_INCOME);
+ shopacc.setStatus(shop.getStatus());
+ shopacc.setOpendate(systemUtilService.getSysdatetime().getHostdate());
+ shopacc.setBalance(0D);
+ shopacc.setTenantId(shop.getTenantId());
+ shopacc = shopaccDao.save(shopacc);
+ shopacc.setMac(shopacc.genMAC());
+ shopaccDao.save(shopacc);
+ }
+ shop.setShopaccno(shopacc.getShopaccno());
+ }
+ shopDao.save(shop);
+
+ } else if (ConstantUtil.OPERCHK_CHKMODE_MODIFY.equals(chkdtl.getChkMode())) {
+ //同意修改
+ chkdtl.setChkResult(TradeDict.STATUS_NORMAL); //通过
+
+ TShop newShop = new Gson().fromJson(chkdtl.getContent(), TShop.class);
+ shop.setFshopid(newShop.getFshopid());
+ shop.setShopname(newShop.getShopname());
+ shop.setBusinessLicenseNo(newShop.getBusinessLicenseNo());
+ shop.setTaxRegistrationNo(newShop.getTaxRegistrationNo());
+ shop.setAddr(newShop.getAddr());
+ shop.setLegalPersonName(newShop.getLegalPersonName());
+ shop.setLegalPersonIdtype(newShop.getLegalPersonIdtype());
+ shop.setLegalPersonIdno(newShop.getLegalPersonIdno());
+ shop.setContactman(newShop.getContactman());
+ shop.setMobile(newShop.getMobile());
+ shop.setEmail(newShop.getEmail());
+ shop.setTel(newShop.getTel());
+ shopDao.save(shop);
+ if (!StringUtil.isEmpty(shop.getShopaccno())) {
+ shopaccDao.updateShopnameByShopaccno(shop.getShopname(), shop.getShopaccno()); //更新商户名
+ }
+ } else {
+ //非增删改
+ throw new WebCheckException("该审批记录数据错误,非新增、修改、删除操作!");
+ }
+ } else {
+ //审核驳回
+ chkdtl.setChkResult(TradeDict.STATUS_REJECT);
+ if (TradeDict.STATUS_UNCHECK.equals(shop.getStatus())) {
+ //新增时改变状态,其他的不变
+ shop.setStatus(TradeDict.STATUS_REJECT);
+ shopDao.save(shop);
+ }
+ }
+ return operChkdtlDao.save(chkdtl);
+ }
+
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SourcetypeCheckManagerServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SourcetypeCheckManagerServiceImpl.java
new file mode 100644
index 0000000..b8790ae
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SourcetypeCheckManagerServiceImpl.java
@@ -0,0 +1,155 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.dao.SourceTypeCheckDao;
+import com.supwisdom.dlpay.api.dao.SourceTypeDao;
+import com.supwisdom.dlpay.api.dao.TransactionChkdtlDao;
+import com.supwisdom.dlpay.api.dao.TransactionChkfileDao;
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus;
+import com.supwisdom.dlpay.api.domain.TTransactionChkdtl;
+import com.supwisdom.dlpay.api.domain.TTransactionChkfile;
+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.service.SourcetypeCheckManagerService;
+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.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+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;
+
+@Service
+public class SourcetypeCheckManagerServiceImpl implements SourcetypeCheckManagerService {
+ @Autowired
+ private TransactionChkfileDao transactionChkfileDao;
+ @Autowired
+ private TransactionChkdtlDao transactionChkdtlDao;
+ @Autowired
+ private SourceTypeCheckDao sourceTypeCheckDao;
+ @Autowired
+ private SourceTypeDao sourceTypeDao;
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+
+ @Override
+ public PageResult<TSourceTypeCheckStatus> getSourceTypeCheckStatusPage(String searchkey, int pageNo, int pageSize) {
+ StringBuffer querySql = new StringBuffer("select a from TSourceTypeCheckStatus a,TSourceType b where a.sourceType=b.sourceType and a.tenantId=b.tenantid ");
+
+ StringBuffer countSql = new StringBuffer("select count(a.id) as cnt from TSourceTypeCheckStatus a,TSourceType b where a.sourceType=b.sourceType and a.tenantId=b.tenantid ");
+ if (!StringUtil.isEmpty(searchkey)) {
+ querySql.append(" and (b.sourceType like :str or b.paydesc like :str) ");
+ countSql.append(" and (b.sourceType like :str or b.paydesc like :str) ");
+ }
+ querySql.append(" order by a.sourceType ");
+ Query query = entityManager.createQuery(querySql.toString());
+ Query countQuery = entityManager.createQuery(countSql.toString());
+ if (!StringUtil.isEmpty(searchkey)) {
+ query.setParameter("str", "%" + searchkey.trim() + "%");
+ countQuery.setParameter("str", "%" + searchkey.trim() + "%");
+ }
+ query.setFirstResult((pageNo - 1) * pageSize);
+ query.setMaxResults(pageSize); //分页显示
+ List<TSourceTypeCheckStatus> list = query.getResultList();
+ Long count = (Long) countQuery.getSingleResult();
+ return new PageResult<>(count.longValue(), list);
+ }
+
+ @Override
+ public TSourceTypeCheckStatus getSourceTypeCheckStatusById(Integer chkid) {
+ if (null != chkid) {
+ return sourceTypeCheckDao.getById(chkid);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean saveOrUpdateSourceTypeCheckStatus(TSourceTypeCheckStatus checkStatus) {
+ if (null != checkStatus) {
+ sourceTypeCheckDao.save(checkStatus);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public List<TSourceType> getNeedCheckSourcetype() {
+ List<TSourceType> list = sourceTypeDao.findNeedChecks(TenantContext.getTenantSchema());
+ if (!StringUtil.isEmpty(list)) {
+ return list;
+ }
+ return new ArrayList<>(0);
+ }
+
+ @Override
+ public PageResult<TTransactionChkfile> getTransactionChkfilePage(String startdate, String enddate, String sourcetype, int pageNo, int pageSize) {
+ Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "accdate"));
+ Page<TTransactionChkfile> page = transactionChkfileDao.findAll(new Specification<TTransactionChkfile>() {
+ @Override
+ public Predicate toPredicate(Root<TTransactionChkfile> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+ List<Predicate> predicates = new ArrayList<>();
+ if (!StringUtil.isEmpty(startdate)) {
+ predicates.add(criteriaBuilder.ge(root.get("accdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(startdate))));
+ }
+ if (!StringUtil.isEmpty(enddate)) {
+ predicates.add(criteriaBuilder.le(root.get("accdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(enddate))));
+ }
+ if (!StringUtil.isEmpty(sourcetype)) {
+ predicates.add(criteriaBuilder.equal(root.get("sourcetype").as(String.class), sourcetype.trim()));
+ }
+ return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+ }
+ }, pageable);
+ return new PageResult<>(page);
+ }
+
+ @Override
+ public PageResult<TTransactionChkdtl> getTransactionChkdtlPage(String chkfileId, String searchKey, String chkresult, boolean errorshow, int pageNo, int pageSize) {
+ StringBuffer querySql = new StringBuffer("select a from TTransactionChkdtl a where a.chkfileId=:chkfileid ");
+ StringBuffer countSql = new StringBuffer("select count(a.id) as cnt from TTransactionChkdtl a where a.chkfileId=:chkfileid ");
+ if (!StringUtil.isEmpty(searchKey)) {
+ querySql.append(" and (a.otherRefno like :str or a.localRefno like :str) ");
+ countSql.append(" and (a.otherRefno like :str or a.localRefno like :str) ");
+ }
+ if (!errorshow && !StringUtil.isEmpty(chkresult)) {
+ querySql.append(" and a.chkresult=:chkresult ");
+ countSql.append(" and a.chkresult=:chkresult ");
+ }
+ if (errorshow) {
+ querySql.append(" and a.chkresult<>'equal' ");
+ countSql.append(" and a.chkresult<>'equal' ");
+ }
+ querySql.append(" order by a.recordno ");
+ Query query = entityManager.createQuery(querySql.toString());
+ Query countQuery = entityManager.createQuery(countSql.toString());
+ query.setParameter("chkfileid", chkfileId.trim());
+ countQuery.setParameter("chkfileid", chkfileId.trim());
+ if (!StringUtil.isEmpty(searchKey)) {
+ query.setParameter("str", "%" + searchKey.trim() + "%");
+ countQuery.setParameter("str", "%" + searchKey.trim() + "%");
+ }
+ if (!errorshow && !StringUtil.isEmpty(chkresult)) {
+ query.setParameter("chkresult", chkresult.trim());
+ countQuery.setParameter("chkresult", chkresult.trim());
+ }
+ query.setFirstResult((pageNo - 1) * pageSize);
+ query.setMaxResults(pageSize); //分页显示
+ List<TTransactionChkdtl> list = query.getResultList();
+ Long count = (Long) countQuery.getSingleResult();
+ return new PageResult<>(count.longValue(), list);
+ }
+}
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
index 0cc0b4d..8b04848 100644
--- 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
@@ -118,8 +118,9 @@
account.setLastdayDpsamt(0.0);
account.setLastdayTransamt(0.0);
account.setOpendate(systemDateTime.getHostdate());
- account.setTac(account.generateTac());
account.setTenantid(person.getTenantid());
+ account = accountDao.save(account);
+ account.setTac(account.generateTac());
accountDao.save(account);
}
return JsonResult.ok("添加成功");
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/AesUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/AesUtil.java
new file mode 100644
index 0000000..ddd8f91
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/AesUtil.java
@@ -0,0 +1,162 @@
+package com.supwisdom.dlpay.util;
+
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.lang.StringUtils;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+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 AesUtil {
+
+ public static String encrypt(String rawdata, String secret) {
+ Cipher cipher;
+ try {
+ cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+ SecretKeySpec key = new SecretKeySpec(secret.getBytes("UTF-8"), "AES");
+ cipher.init(Cipher.ENCRYPT_MODE, key);
+ byte[] encdata = cipher.doFinal(rawdata.getBytes("UTF-8"));
+ String hexdata = Base64.encodeBase64String(encdata);
+
+ return hexdata;
+ } catch (NoSuchAlgorithmException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NoSuchPaddingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvalidKeyException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalBlockSizeException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (BadPaddingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+
+ }
+ public static String encryptCFB(String rawdata, String secret ,String ivstr,String KEY_ALG_MODE) {
+ Cipher cipher;
+ try {
+ //byte[] iv = new byte[] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
+ byte[] iv = Hex.decodeHex(ivstr.toCharArray());
+ IvParameterSpec ivSpec = new IvParameterSpec(iv);
+ cipher = Cipher.getInstance(KEY_ALG_MODE);
+ SecretKeySpec key = new SecretKeySpec(Base64.decodeBase64(secret), "AES");
+ cipher.init(Cipher.ENCRYPT_MODE, key,ivSpec);
+ byte[] encdata = cipher.doFinal(rawdata.getBytes("UTF-8"));
+ String hexdata = Base64.encodeBase64String(encdata);
+
+ return hexdata;
+ } catch (NoSuchAlgorithmException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NoSuchPaddingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvalidKeyException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalBlockSizeException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (BadPaddingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvalidAlgorithmParameterException e) {
+ e.printStackTrace();
+ } catch (DecoderException e) {
+ e.printStackTrace();
+ }
+ return null;
+
+ }
+
+ public static String decrypt(String encdata, String secret){
+ Cipher cipher;
+ try {
+ cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+ SecretKeySpec key = new SecretKeySpec(secret.getBytes("UTF-8"), "AES");
+ cipher.init(Cipher.DECRYPT_MODE, key);
+ byte[] decordedValue = Base64.decodeBase64(encdata);
+ byte[] decdata = cipher.doFinal(decordedValue);
+ String rawdata = new String(decdata);
+
+ return rawdata;
+ } catch (NoSuchAlgorithmException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NoSuchPaddingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvalidKeyException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalBlockSizeException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (BadPaddingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static String decryptCFB(String encdata, String secret,String ivstr,String KEY_ALG_MODE){
+ Cipher cipher;
+ try {
+// byte[] iv = new byte[] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
+ byte[] iv = Hex.decodeHex(ivstr.toCharArray());
+ IvParameterSpec ivSpec = new IvParameterSpec(iv);
+ cipher = Cipher.getInstance(KEY_ALG_MODE);
+ SecretKeySpec key = new SecretKeySpec(Base64.decodeBase64(secret), "AES");
+ cipher.init(Cipher.DECRYPT_MODE, key,ivSpec);
+ byte[] decordedValue = Base64.decodeBase64(encdata);
+ byte[] decdata = cipher.doFinal(decordedValue);
+ String rawdata = new String(decdata);
+
+ return rawdata;
+ } catch (NoSuchAlgorithmException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NoSuchPaddingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvalidKeyException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalBlockSizeException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (BadPaddingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvalidAlgorithmParameterException e) {
+ e.printStackTrace();
+ } catch (DecoderException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
index 3c7b5de..873e619 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
@@ -33,4 +33,60 @@
public static final String QUERYTYPE_NEED_QUERY = "query";
public static final String QUERYTYPE_QUERY_FINISH = "finish";
public static final int QUERY_MAX_COUNT = 10;
+
+ /**
+ * 对账文件状态
+ * */
+ public static final String CHKFILE_STATUS_INIT = "init"; //初始化
+ public static final String CHKFILE_STATUS_UNCHECK = "uncheck"; //待对账
+ public static final String CHKFILE_STATUS_CHECKOUT = "checkout"; //校对完成
+ public static final String CHKFILE_STATUS_FINISH = "finish"; //对账完成
+ public static final String CHKFILE_STATUS_ERROR = "error"; //保存数据异常
+
+ /**
+ * 对账文件结果状态
+ * */
+ public static final String CHKFILE_RESULT_NONE = "none"; //未对账 -
+ public static final String CHKFILE_RESULT_EQUAL = "equal"; //对账一致,平
+ public static final String CHKFILE_RESULT_UNEQUAL = "unequal"; //对账不一致,不平
+ public static final String CHKFILE_RESULT_ERROR = "error"; //对账明细有异常
+
+ /**
+ * 对账明细状态
+ * */
+ public static final String CHKDTL_CHKRESULT_UNCHECK= "uncheck"; //未检查
+ public static final String CHKDTL_CHKRESULT_EQUAL= "equal"; //一致
+ public static final String CHKDTL_CHKRESULT_NOTEXIST= "notexist"; //交易流水不存在
+ public static final String CHKDTL_CHKRESULT_NOCHARGE = "nocharge"; //支付未记账
+ public static final String CHKDTL_CHKRESULT_DIFF = "diff"; //金额不相等
+ public static final String CHKDTL_CHKRESULT_ERROR = "error"; //记账日期或支付方式错误
+ public static final String CHKDTL_CHKRESULT_SURPLUS = "surplus"; //本地多余成功流水
+
+ /**
+ * 对账明细解决状态
+ * */
+ public static final String CHKDTL_RESOLVED_NONE = "none"; //已处理
+ public static final String CHKDTL_RESOLVED_ADD ="add"; //补账
+ public static final String CHKDTL_RESOLVED_FAIL = "fail"; //补账失败
+ public static final String CHKDTL_RESOLVED_EQUAL = "equal"; //一致,相等
+ public static final String CHKDTL_RESOLVED_HANGUP="hangup"; //挂起
+
+
+ /**
+ * 市民卡挂失申请表状态
+ * */
+ public static final String CITIZENCARD_LOSSAPPLY_STATUS_APPLY = "apply"; //申请挂失
+ public static final String CITIZENCARD_LOSSAPPLY_STATUS_SUCCESS = "success"; //调用挂失接口成功
+ public static final String CITIZENCARD_LOSSAPPLY_STATUS_FAIL = "fail"; //调用挂失接口失败
+
+ public static final String CITIZENCARD_SYSTEM_URL = "dlsmk.cardsystem.url"; //大理市民卡管系统url
+
+ /**
+ * 商户审批
+ * */
+ public static final String OPERCHK_CHKTYPE_SHOP = "SHOP";
+
+ public static final String OPERCHK_CHKMODE_ADD = "新增";
+ public static final String OPERCHK_CHKMODE_MODIFY = "修改";
+ public static final String OPERCHK_CHKMODE_DELETE = "删除";
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/DesUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/DesUtil.java
new file mode 100644
index 0000000..912006f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/DesUtil.java
@@ -0,0 +1,51 @@
+package com.supwisdom.dlpay.util;
+
+import javax.crypto.*;
+import javax.crypto.spec.DESKeySpec;
+import javax.crypto.spec.IvParameterSpec;
+
+public class DesUtil {
+
+ public static String decode(String message, String key) throws Exception {
+ DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
+ SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
+ SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
+
+ Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
+ cipher.init(Cipher.DECRYPT_MODE, secretKey);
+ byte[] retByte = cipher.doFinal(convertHexString(message));
+ return new String(retByte, "UTF-8");
+ }
+
+ public static String encode(String message, String key) throws Exception {
+ DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
+ SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
+ SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
+
+ Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
+ cipher.init(Cipher.ENCRYPT_MODE, secretKey);
+ byte[] retByte = cipher.doFinal(message.getBytes("UTF-8"));
+ return toHexString(retByte);
+ }
+
+ public static byte[] convertHexString(String ss) {
+ byte digest[] = new byte[ss.length() / 2];
+ for (int i = 0; i < digest.length; i++) {
+ String byteString = ss.substring(2 * i, 2 * i + 2);
+ int byteValue = Integer.parseInt(byteString, 16);
+ digest[i] = (byte) byteValue;
+ }
+ return digest;
+ }
+
+ public static String toHexString(byte b[]) {
+ StringBuffer hexString = new StringBuffer();
+ for (int i = 0; i < b.length; i++) {
+ String plainText = Integer.toHexString(0xff & b[i]);
+ if (plainText.length() < 2)
+ plainText = "0" + plainText;
+ hexString.append(plainText);
+ }
+ return hexString.toString();
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/QrCodeTotpUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/QrCodeTotpUtil.java
new file mode 100644
index 0000000..fa51bb3
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/QrCodeTotpUtil.java
@@ -0,0 +1,59 @@
+package com.supwisdom.dlpay.util;
+
+public class QrCodeTotpUtil {
+ public static String generateTOTP(String seed){
+ long X = 30;
+ long T0 = 0;
+ String steps = "0";
+ long time = System.currentTimeMillis() / 1000;
+ long T = (time - T0) / X;
+ steps = Long.toHexString(T).toUpperCase();
+ while (steps.length() < 16) {
+ steps = "0" + steps;
+ }
+ String totp = TOTP.generateTOTP(seed, steps, "8", "HmacSHA256");
+ return totp;
+ }
+
+ public static String generateTOTP(String seed,String returnDigits){
+ long X = 30;
+ long T0 = 0;
+ String steps = "0";
+ long time = System.currentTimeMillis() / 1000;
+ long T = (time - T0) / X;
+ steps = Long.toHexString(T).toUpperCase();
+ while (steps.length() < 16) {
+ steps = "0" + steps;
+ }
+ String totp = TOTP.generateTOTP(seed, steps, returnDigits, "HmacSHA256");
+ return totp;
+ }
+
+ public static boolean verifyCode(String totp, String secret, int offset) {
+
+ String second = "30";
+ long T0 = 0;
+ String[] keys = new String[offset * 2 + 1];
+ long time = System.currentTimeMillis() / 1000;
+ for (int i = 0; i < keys.length; i++) {
+ String steps = "0";
+ try {
+ long T = (time - T0) / Long.parseLong(second);
+ steps = Long.toHexString(T + (i - offset)).toUpperCase();
+ while (steps.length() < 16) {
+ steps = "0" + steps;
+ }
+ String key = TOTP.generateTOTP(secret, steps, "8", "HmacSHA256");
+ keys[i] = key;
+ } catch (final Exception e) {
+ System.out.println("Error : " + e);
+ }
+ }
+ for (String key : keys) {
+ if (key.equals(totp)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/QrcodeRawData.java b/payapi/src/main/java/com/supwisdom/dlpay/util/QrcodeRawData.java
new file mode 100644
index 0000000..44ac288
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/QrcodeRawData.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.util;
+
+public class QrcodeRawData {
+ private String totp;
+ private String userid;
+
+ public String getTotp() {
+ return totp;
+ }
+
+ public void setTotp(String totp) {
+ this.totp = totp;
+ }
+
+ public String getUserid() {
+ return userid;
+ }
+
+ public void setUserid(String userid) {
+ this.userid = userid;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/RSAKeysGenerate.java b/payapi/src/main/java/com/supwisdom/dlpay/util/RSAKeysGenerate.java
new file mode 100644
index 0000000..4af2148
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/RSAKeysGenerate.java
@@ -0,0 +1,179 @@
+package com.supwisdom.dlpay.util;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang.StringUtils;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.crypto.Cipher;
+import java.io.ByteArrayOutputStream;
+import java.security.*;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+
+public class RSAKeysGenerate {
+
+ public static final String KEY_ALGORITHM = "RSA";
+ private static final String PUBLIC_KEY = "RSAPublicKey";
+ private static final String PRIVATE_KEY = "RSAPrivateKey";
+ private static final String KEY_ALG_MODE = "RSA/ECB/PKCS1Padding";
+ /** 密钥大小 */
+ private static final int KEY_SIZE = 1024;
+ /** *//**
+ * RSA最大加密明文大小
+ */
+ private static final int MAX_ENCRYPT_BLOCK = 117;
+
+ /** *//**
+ * RSA最大解密密文大小
+ */
+ private static final int MAX_DECRYPT_BLOCK = 128;
+ /** 默认的安全服务提供者 */
+ private static final Provider DEFAULT_PROVIDER = new BouncyCastleProvider();
+ public static void main(String[] args) {
+ Map<String, Object> keyMap;
+ try {
+ keyMap = initKey();
+ String publicKey = getPublicKey(keyMap);
+ System.out.println(publicKey);
+ String privateKey = getPrivateKey(keyMap);
+ System.out.println(privateKey);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
+ Key key = (Key) keyMap.get(PUBLIC_KEY);
+ byte[] publicKey = key.getEncoded();
+ return encryptBASE64(key.getEncoded());
+ }
+
+ public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
+ Key key = (Key) keyMap.get(PRIVATE_KEY);
+ byte[] privateKey = key.getEncoded();
+ return encryptBASE64(key.getEncoded());
+ }
+
+
+ public static String encryptBASE64(byte[] key) throws Exception {
+ return Base64.encodeBase64String(key);
+ }
+
+ public static Map<String, Object> initKey() throws Exception {
+ KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
+ keyPairGen.initialize(1024);
+ KeyPair keyPair = keyPairGen.generateKeyPair();
+ RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
+ RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
+ Map<String, Object> keyMap = new HashMap<String, Object>(2);
+ keyMap.put(PUBLIC_KEY, publicKey);
+ keyMap.put(PRIVATE_KEY, privateKey);
+ return keyMap;
+ }
+
+ public static PrivateKey getPrivateKey(final String key) throws Exception {
+ byte[] keyBytes = null;
+ keyBytes = com.sun.jersey.core.util.Base64.decode(key);
+ PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+ PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
+ return privateKey;
+ }
+ public static PublicKey getPublicKey(final String key) throws Exception {
+ byte[] keyBytes;
+ keyBytes = com.sun.jersey.core.util.Base64.decode(key);
+ X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
+ KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+ PublicKey publicKey = keyFactory.generatePublic(keySpec);
+ return publicKey;
+ }
+
+ public static byte[] decrypt(PrivateKey privateKey, byte[] data) throws Exception {
+ Cipher cipher = Cipher.getInstance(KEY_ALG_MODE, DEFAULT_PROVIDER);
+ cipher.init(Cipher.DECRYPT_MODE, privateKey);
+
+ int inputLen = data.length;
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int offSet = 0;
+ byte[] cache;
+ int i = 0;
+ // 对数据分段解密
+ while (inputLen - offSet > 0) {
+ if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
+ cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);
+ } else {
+ cache = cipher.doFinal(data, offSet, inputLen - offSet);
+ }
+ out.write(cache, 0, cache.length);
+ i++;
+ offSet = i * MAX_DECRYPT_BLOCK;
+ }
+ byte[] decryptedData = out.toByteArray();
+ out.close();
+ return decryptedData;
+
+ }
+ public static String decryptbyte(PrivateKey privateKey, String encrypttext) {
+ if (privateKey == null || StringUtils.isBlank(encrypttext)) {
+ return null;
+ }
+ try {
+ byte[] en_data = org.apache.commons.codec.binary.Base64.decodeBase64(encrypttext);
+
+
+ byte[] data = decrypt(privateKey, en_data);
+ return new String(data);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+ /**
+ * 使用指定的公钥加密数据。
+ *
+ * @param publicKey 给定的公钥。
+ * @param data 要加密的数据。
+ * @return 加密后的数据。
+ */
+ public static byte[] encrypt(PublicKey publicKey, byte[] data) throws Exception {
+ Cipher cipher = Cipher.getInstance(KEY_ALG_MODE, DEFAULT_PROVIDER);
+ cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+
+ int inputLen = data.length;
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int offSet = 0;
+ byte[] cache;
+ int i = 0;
+ // 对数据分段加密
+ while (inputLen - offSet > 0) {
+ if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
+ cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
+ } else {
+ cache = cipher.doFinal(data, offSet, inputLen - offSet);
+ }
+ out.write(cache, 0, cache.length);
+ i++;
+ offSet = i * MAX_ENCRYPT_BLOCK;
+ }
+ byte[] encryptedData = out.toByteArray();
+ out.close();
+ return encryptedData;
+ }
+ public static byte[] encryptbyte(PublicKey publicKey, String plaintext) {
+ if (publicKey == null || plaintext == null) {
+ return null;
+ }
+ byte[] data = plaintext.getBytes();
+ try {
+ byte[] en_data = encrypt(publicKey, data);
+ return en_data;
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/TOTP.java b/payapi/src/main/java/com/supwisdom/dlpay/util/TOTP.java
new file mode 100644
index 0000000..bcab4d3
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/TOTP.java
@@ -0,0 +1,264 @@
+package com.supwisdom.dlpay.util;
+
+/**
+ Copyright (c) 2011 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, is permitted pursuant to, and subject to the license
+ terms contained in, the Simplified BSD License set forth in Section
+ 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+ */
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.lang.reflect.UndeclaredThrowableException;
+import java.math.BigInteger;
+import java.security.GeneralSecurityException;
+
+/**
+ * This is an example implementation of the OATH TOTP algorithm. Visit
+ * www.openauthentication.org for more information.
+ *
+ * @author Johan Rydell, PortWise, Inc.
+ */
+public class TOTP {
+ private static final int[] DIGITS_POWER
+ // 0 1 2 3 4 5 6 7 8
+ = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000 };
+
+ private TOTP() {
+ }
+
+ /**
+ * This method uses the JCE to provide the crypto algorithm. HMAC computes a
+ * Hashed Message Authentication Code with the crypto hash algorithm as a
+ * parameter.
+ *
+ * @param crypto
+ * : the crypto algorithm (HmacSHA1, HmacSHA256, HmacSHA512)
+ * @param keyBytes
+ * : the bytes to use for the HMAC key
+ * @param text
+ * : the message or text to be authenticated
+ */
+ private static byte[] hmac_sha(String crypto, byte[] keyBytes, byte[] text) {
+ try {
+ Mac hmac;
+ hmac = Mac.getInstance(crypto);
+
+ SecretKeySpec macKey = new SecretKeySpec(keyBytes, "RAW");
+ hmac.init(macKey);
+
+ return hmac.doFinal(text);
+ } catch (GeneralSecurityException gse) {
+ throw new UndeclaredThrowableException(gse);
+ }
+ }
+
+ /**
+ * This method converts a HEX string to Byte[]
+ *
+ * @param hex
+ * : the HEX string
+ *
+ * @return: a byte array
+ */
+ private static byte[] hexStr2Bytes(String hex) {
+ // Adding one byte to get the right conversion
+ // Values starting with "0" can be converted
+ byte[] bArray = new BigInteger("10" + hex, 16).toByteArray();
+
+ // Copy all the REAL bytes, not the "first"
+ byte[] ret = new byte[bArray.length - 1];
+
+ for (int i = 0; i < ret.length; i++)
+ ret[i] = bArray[i + 1];
+
+ return ret;
+ }
+
+ /**
+ * This method generates a TOTP value for the given set of parameters.
+ *
+ * @param key
+ * : the shared secret, HEX encoded
+ * @param time
+ * : a value that reflects a time
+ * @param returnDigits
+ * : number of digits to return
+ *
+ * @return: a numeric String in base 10 that includes
+ * {@link truncationDigits} digits
+ */
+ public static String generateTOTP(String key, String time,
+ String returnDigits) {
+ return generateTOTP(key, time, returnDigits, "HmacSHA1");
+ }
+
+ /**
+ * This method generates a TOTP value for the given set of parameters.
+ *
+ * @param key
+ * : the shared secret, HEX encoded
+ * @param time
+ * : a value that reflects a time
+ * @param returnDigits
+ * : number of digits to return
+ *
+ * @return: a numeric String in base 10 that includes
+ * {@link truncationDigits} digits
+ */
+ public static String generateTOTP256(String key, String time,
+ String returnDigits) {
+ return generateTOTP(key, time, returnDigits, "HmacSHA256");
+ }
+
+ /**
+ * This method generates a TOTP value for the given set of parameters.
+ *
+ * @param key
+ * : the shared secret, HEX encoded
+ * @param time
+ * : a value that reflects a time
+ * @param returnDigits
+ * : number of digits to return
+ *
+ * @return: a numeric String in base 10 that includes
+ * {@link truncationDigits} digits
+ */
+ public static String generateTOTP512(String key, String time,
+ String returnDigits) {
+ return generateTOTP(key, time, returnDigits, "HmacSHA512");
+ }
+
+ /**
+ * This method generates a TOTP value for the given set of parameters.
+ *
+ * @param key
+ * : the shared secret, HEX encoded
+ * @param time
+ * : a value that reflects a time
+ * @param returnDigits
+ * : number of digits to return
+ * @param crypto
+ * : the crypto function to use
+ *
+ * @return: a numeric String in base 10 that includes
+ * {@link truncationDigits} digits
+ */
+ public static String generateTOTP(String key, String time,
+ String returnDigits, String crypto) {
+ int codeDigits = Integer.decode(returnDigits).intValue();
+ String result = null;
+
+ // Using the counter
+ // First 8 bytes are for the movingFactor
+ // Compliant with base RFC 4226 (HOTP)
+ while (time.length() < 16)
+ time = "0" + time;
+
+ // Get the HEX in a Byte[]
+ byte[] msg = hexStr2Bytes(time);
+ byte[] k = hexStr2Bytes(key);
+ byte[] hash = hmac_sha(crypto, k, msg);
+
+ // put selected bytes into result int
+ int offset = hash[hash.length - 1] & 0xf;
+
+ int binary = ((hash[offset] & 0x7f) << 24)
+ | ((hash[offset + 1] & 0xff) << 16)
+ | ((hash[offset + 2] & 0xff) << 8) | (hash[offset + 3] & 0xff);
+
+ int otp = binary % DIGITS_POWER[codeDigits];
+
+ result = Integer.toString(otp);
+
+ while (result.length() < codeDigits) {
+ result = "0" + result;
+ }
+
+ return result;
+ }
+
+ public static void main(String[] args) {
+ long X = 30;
+ long T0 = 0;
+ String steps = "0";
+ long time = System.currentTimeMillis() / 1000;
+ System.out.println(time);
+ long T = (time - T0) / X;
+ steps = Long.toHexString(T).toUpperCase();
+ while (steps.length() < 16) {
+ steps = "0" + steps;
+ }
+ String seed = "9e8bb3d2df73741c041aef39e37ee015fc98233720a1350fcd67d5c3027896ac";
+ String totp = TOTP.generateTOTP(seed, steps, "8", "HmacSHA256");
+ System.out.println(totp);
+
+ /*
+
+
+ SecureRandom a = new SecureRandom();
+ byte[] b = a.generateSeed(8);
+ // Seed for HMAC-SHA1 - 20 bytes
+ String seed = "3132333435363738393031323334353637383930";
+
+ // Seed for HMAC-SHA256 - 32 bytes
+ //String seed32 = "3132333435363738393031323334353637383930313233343536373839303132";
+ String seed32 = "e5b72370f61687c8075b8383266f4fbcbb3b55da178eed76329666600c134093";
+
+ // Seed for HMAC-SHA512 - 64 bytes
+ String seed64 = "3132333435363738393031323334353637383930"
+ + "3132333435363738393031323334353637383930"
+ + "3132333435363738393031323334353637383930" + "31323334";
+ long T0 = 0;
+ long X = 30;
+ long[] testTime = { 59L, 1111111109L, 1111111111L, 1234567890L,
+ 2000000000L, 20000000000L };
+
+ String steps = "0";
+ DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ df.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+ try {
+ System.out.println("+---------------+-----------------------+"
+ + "------------------+--------+--------+");
+ System.out.println("| Time(sec) | Time (UTC format) "
+ + "| Value of T(Hex) | TOTP | Mode |");
+ System.out.println("+---------------+-----------------------+"
+ + "------------------+--------+--------+");
+
+ for (int i = 0; i < testTime.length; i++) {
+ long T = (testTime[i] - T0) / X;
+ steps = Long.toHexString(T).toUpperCase();
+
+ while (steps.length() < 16)
+ steps = "0" + steps;
+
+ String fmtTime = String.format("%1$-11s", testTime[i]);
+ String utcTime = df.format(new Date(testTime[i] * 1000));
+ System.out.print("| " + fmtTime + " | " + utcTime + " | "
+ + steps + " |");
+ System.out.println(generateTOTP(seed, steps, "8", "HmacSHA1")
+ + "| SHA1 |");
+ System.out.print("| " + fmtTime + " | " + utcTime + " | "
+ + steps + " |");
+ System.out.println(generateTOTP(seed32, steps, "8",
+ "HmacSHA256") + "| SHA256 |");
+ System.out.print("| " + fmtTime + " | " + utcTime + " | "
+ + steps + " |");
+ System.out.println(generateTOTP(seed64, steps, "8",
+ "HmacSHA512") + "| SHA512 |");
+
+ System.out.println("+---------------+-----------------------+"
+ + "------------------+--------+--------+");
+ }
+ } catch (final Exception e) {
+ System.out.println("Error : " + e);
+ }
+
+ */
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
index e256b06..d993aea 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
@@ -11,6 +11,7 @@
import org.springframework.boot.autoconfigure.data.redis.RedisProperties
import org.springframework.boot.builder.SpringApplicationBuilder
import org.springframework.boot.context.properties.ConfigurationProperties
+import org.springframework.boot.web.servlet.FilterRegistrationBean
import org.springframework.boot.web.servlet.ServletComponentScan
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer
import org.springframework.cache.annotation.EnableCaching
@@ -27,7 +28,6 @@
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.http.client.ClientHttpRequestFactory
import org.springframework.http.client.SimpleClientHttpRequestFactory
import org.springframework.scheduling.annotation.EnableScheduling
import org.springframework.stereotype.Component
@@ -68,6 +68,33 @@
}
@Configuration
+class JwtAuthFilterRegistration {
+ @Autowired
+ private lateinit var apiJwtAuthenticationFilter: ApiJwtAuthenticationFilter
+
+ @Autowired
+ private lateinit var mobileSecurityFilter: MobileSecurityFilter
+
+ @Bean
+ fun registerJwtFilter(): FilterRegistrationBean<ApiJwtAuthenticationFilter> {
+ val registration = FilterRegistrationBean<ApiJwtAuthenticationFilter>()
+ registration.filter = apiJwtAuthenticationFilter
+ registration.addUrlPatterns("/api/*")
+ registration.order = 1
+ return registration
+ }
+
+ @Bean
+ fun registerMobileFilter(): FilterRegistrationBean<MobileSecurityFilter> {
+ val registrationBean = FilterRegistrationBean<MobileSecurityFilter>()
+ registrationBean.filter = mobileSecurityFilter
+ registrationBean.addUrlPatterns("/mobile/*")
+ registrationBean.order = 2
+ return registrationBean
+ }
+}
+
+@Configuration
class HttpSessionConfig {
@Bean
fun sessionRedisTemplate(
@@ -86,7 +113,7 @@
class RestTemplateConfig {
@Component
@ConfigurationProperties("resttemplate.proxy")
- class RestTemplateProxyConfig {
+ class RestTemplateProxyProperties {
@Value("\${type:}")
lateinit var type: String
@Value("\${host:}")
@@ -96,17 +123,21 @@
}
@Bean
- fun simpleClientHttpRequestFactory(proxyConfig: RestTemplateProxyConfig): SimpleClientHttpRequestFactory {
+ fun simpleClientHttpRequestFactory(proxyProperties: RestTemplateProxyProperties):
+ SimpleClientHttpRequestFactory {
val factory = SimpleClientHttpRequestFactory()
factory.setConnectTimeout(15000)
factory.setReadTimeout(5000)
- if (proxyConfig.type.isNotEmpty()) {
- val proxyType = when (proxyConfig.type) {
+ if (proxyProperties.type.isNotEmpty()) {
+ val proxyType = when (proxyProperties.type) {
"http" -> Proxy.Type.HTTP
"socks5" -> Proxy.Type.SOCKS
else -> Proxy.Type.DIRECT
}
- factory.setProxy(Proxy(proxyType, InetSocketAddress(proxyConfig.host, proxyConfig.port)))
+ if (proxyType != Proxy.Type.DIRECT) {
+ factory.setProxy(Proxy(proxyType,
+ InetSocketAddress(proxyProperties.host, proxyProperties.port)))
+ }
}
return factory
}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt
index 0174c65..553f157 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt
@@ -3,6 +3,7 @@
import com.supwisdom.dlpay.agent.AgentCode
import com.supwisdom.dlpay.agent.AgentPayService
import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
import com.supwisdom.dlpay.api.bean.BaseResp
import com.supwisdom.dlpay.api.domain.TTransactionMain
import com.supwisdom.dlpay.api.service.ConsumePayService
@@ -11,51 +12,47 @@
import org.springframework.stereotype.Component
interface AlipayService {
- fun doQrcodepay(transaction: TTransactionMain): AgentResponse
+ fun doQrcodepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
- fun doPrepay(transaction: TTransactionMain): AgentResponse
+ fun doPrepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
- fun doRefund(transaction: TTransactionMain): AgentResponse
+ fun doRefund(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
- fun doQuery(transaction: TTransactionMain): AgentResponse
+ fun doQuery(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
- fun doNotify(param: Map<String, String>): AgentResponse
+ fun doNotify(param: Map<String, String>): AgentResponse<QrcodePayTrans>
- /**
- * 下载对账单
- * */
- fun downloadBill(shopacc:String,accdate:String): BaseResp
}
@Component("alipayAgent")
class AlipayAgentService(val consumePayService: ConsumePayService,
- val aipayService: AlipayService) : AgentPayService {
+ val aipayService: AlipayService) : AgentPayService<QrcodePayTrans> {
- override fun auth(shopaccno: String?, billno: String?): AgentResponse {
+ override fun auth(shopaccno: String?, billno: String?): AgentResponse<QrcodePayTrans> {
if (consumePayService.checkShopPaytype(shopaccno!!, TradeDict.PAYTYPE_ALIPAY, true)) {
//TODO 支付宝实名认证逻辑
}
- return AgentResponse().apply {
+ return AgentResponse<QrcodePayTrans>().apply {
this.code = AgentCode.NOT_SUPPORT
}
}
- override fun pay(transaction: TTransactionMain): AgentResponse {
+ override fun pay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
return when (transaction.transCode) {
TradeCode.TRANSCODE_QRCODE -> aipayService.doQrcodepay(transaction)
else -> aipayService.doPrepay(transaction)
}
}
- override fun cancel(transaction: TTransactionMain): AgentResponse {
+ override fun cancel(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
return refund(transaction)
}
- override fun refund(transaction: TTransactionMain): AgentResponse {
+ override fun refund(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
return aipayService.doRefund(transaction)
}
- override fun query(transaction: TTransactionMain): AgentResponse {
+ override fun query(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
return aipayService.doQuery(transaction)
}
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/balance_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/balance_service.kt
index 6852f9b..3966cff 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/balance_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/balance_service.kt
@@ -3,37 +3,38 @@
import com.supwisdom.dlpay.agent.AgentCode
import com.supwisdom.dlpay.agent.AgentPayService
import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
import com.supwisdom.dlpay.api.domain.TTransactionMain
import org.springframework.stereotype.Component
@Component("balanceAgent")
-class BalanceAgentService : AgentPayService {
- private val responseCode = AgentResponse().apply {
+class BalanceAgentService : AgentPayService<String> {
+ private val responseCode = AgentResponse<String>().apply {
code = AgentCode.SUCCESS
agentCode = "0"
agentMsg = "成功"
agentRefno = ""
}
- override fun auth(shopaccno: String?, billno: String?): AgentResponse {
- return AgentResponse().apply {
+ override fun auth(shopaccno: String?, billno: String?): AgentResponse<String> {
+ return AgentResponse<String>().apply {
this.code = AgentCode.NOT_SUPPORT
}
}
- override fun pay(transaction: TTransactionMain): AgentResponse {
+ override fun pay(transaction: TTransactionMain): AgentResponse<String> {
return responseCode
}
- override fun cancel(transaction: TTransactionMain): AgentResponse {
+ override fun cancel(transaction: TTransactionMain): AgentResponse<String> {
return responseCode
}
- override fun refund(transaction: TTransactionMain): AgentResponse {
+ override fun refund(transaction: TTransactionMain): AgentResponse<String> {
return responseCode
}
- override fun query(transaction: TTransactionMain): AgentResponse {
+ override fun query(transaction: TTransactionMain): AgentResponse<String> {
return responseCode
}
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_checkfile_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_checkfile_service.kt
new file mode 100644
index 0000000..6f0ac9b
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_checkfile_service.kt
@@ -0,0 +1,264 @@
+package com.supwisdom.dlpay.agent.service
+
+import com.sun.jersey.api.client.Client
+import com.sun.jersey.api.client.ClientResponse
+import com.supwisdom.dlpay.agent.AgentCode
+import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.CheckFileProvider
+import com.supwisdom.dlpay.agent.citizencard.YnrccUtil
+import com.supwisdom.dlpay.api.bean.YnrccChkfileBean
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus
+import com.supwisdom.dlpay.api.domain.TTransactionChkfile
+import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.service.TransactionReconciliationService
+import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.util.ConstantUtil
+import mu.KotlinLogging
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Component
+import java.io.BufferedReader
+import java.io.InputStream
+import java.io.InputStreamReader
+import javax.ws.rs.core.MediaType
+
+@Component("citizenCardCheckFileProvider")
+class CitizenCardCheckFileProvider : CheckFileProvider {
+ @Autowired
+ private lateinit var systemUtilService: SystemUtilService
+ @Autowired
+ private lateinit var transactionReconciliationService: TransactionReconciliationService
+ @Autowired
+ private lateinit var citizencardPayService: CitizencardPayService
+ @Autowired
+ private lateinit var sourceTypeService: SourceTypeService
+
+ private val logger = KotlinLogging.logger { }
+
+
+ override fun acquireCheckFile(checkStatus: TSourceTypeCheckStatus): AgentResponse<TSourceTypeCheckStatus> {
+ try {
+ val billDate = checkStatus.checkAccdate
+ logger.info("大理农商行对账单下载:download checkdate=【$billDate】")
+
+ val chkfile: TTransactionChkfile = transactionReconciliationService
+ .getTransactionChkfile(billDate, checkStatus.sourceType)?.let { file ->
+ when (file.status) {
+ ConstantUtil.CHKFILE_STATUS_INIT -> file //初始化直接返回
+ ConstantUtil.CHKFILE_STATUS_ERROR -> reinitCheckFile(file) //错误或未对账的直接重新拉取
+ else -> {
+ when (checkStatus.forceRecheck) {
+ true -> reinitCheckFile(file) //对账已完成但强制重新对账
+ false -> {
+ if (file.status == ConstantUtil.CHKFILE_STATUS_UNCHECK) {
+ file
+ } else {
+ throw TransactionException(-1, "大理农商行该天[$billDate]已对账完成")
+ }
+ } //对账已完成报错
+ }
+ }
+ }
+ }
+ ?: transactionReconciliationService.saveInitTransactionChkfile(billDate, checkStatus.sourceType)
+
+ if (chkfile.status == ConstantUtil.CHKFILE_STATUS_UNCHECK) {
+ return successDownload("[$billDate]日对账数据已入库成功", checkStatus)
+ }
+ val resp = citizencardPayService.getChkfilename(billDate, null)
+ when (resp.code) {
+ YnrccUtil.CODE_SUCCESS -> {
+ val agentConfig = sourceTypeService.getChargePaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, true)
+ val agentUrl = agentConfig[YnrccUtil.YNRCC_ANGENT_URL] + "/download?filename=" + resp.filename
+
+ //成功
+ return AgentResponse<TSourceTypeCheckStatus>().also {
+ it.code = AgentCode.SUCCESS
+ it.agentMsg = "获取对账文件路径成功"
+ it.payload = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus.apply {
+ this.checkFileOk = false
+ this.chkfileUrl = agentUrl
+ })
+ }
+
+ }
+ YnrccUtil.NO_RECORDS_TODAY -> {
+ //当日无交易明细,也创建空记录
+ transactionReconciliationService.doSuccessTransactionChkfile(chkfile, "请求银行返回:当日无交易明细")
+ //成功
+ return successDownload("当日无交易明细", checkStatus.apply {
+ this.chkfileUrl = "none"
+ })
+ }
+ else -> {
+ //报错,退出对账单拉取
+ logger.error("大理农商行对账单下载[$billDate]报错:${resp.message}")
+ chkfile.status = ConstantUtil.CHKFILE_STATUS_ERROR
+ chkfile.remark = "请求前置获取对账文件报错:${resp.message}"
+ transactionReconciliationService.saveOrUpdateTransactionChkfile(chkfile)
+
+ //失败
+ return AgentResponse<TSourceTypeCheckStatus>().also {
+ it.code = AgentCode.FAIL
+ it.agentMsg = chkfile.remark
+ it.payload = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus.apply {
+ this.remark = chkfile.remark
+ })
+ }
+ }
+ }
+ } catch (et: TransactionException) {
+ return AgentResponse<TSourceTypeCheckStatus>().also {
+ it.code = AgentCode.FAIL
+ it.agentMsg = et.message
+ it.agentCode = "${et.code()}"
+ it.payload = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus.apply {
+ this.remark = et.message
+ })
+ }
+ }
+ }
+
+ override fun queryCheckFile(checkStatus: TSourceTypeCheckStatus): AgentResponse<TSourceTypeCheckStatus> {
+ return AgentResponse<TSourceTypeCheckStatus>().also {
+ it.code = AgentCode.SUCCESS
+ it.agentMsg = "OK"
+ it.payload = checkStatus
+ }
+ }
+
+ override fun downloadCheckFile(checkStatus: TSourceTypeCheckStatus): AgentResponse<TSourceTypeCheckStatus> {
+ try {
+ val billDate = checkStatus.checkAccdate
+ val agentUrl = checkStatus.chkfileUrl
+ if ("none" == agentUrl) {
+ return successDownload("当日无交易明细", checkStatus)
+ }
+
+ val chkfile = transactionReconciliationService.doInitTransactionChkfile(billDate, checkStatus.sourceType)
+
+ //下载对账单数据
+ val client = Client.create()
+ client.setConnectTimeout(10000)
+ client.setReadTimeout(30000)
+ val respClient = client.resource(agentUrl).type(MediaType.APPLICATION_OCTET_STREAM_TYPE).get(ClientResponse::class.java)
+ if (200 == respClient.status) {
+ val stream = respClient.getEntity(InputStream::class.java)
+ BufferedReader(InputStreamReader(stream)).use { reader ->
+ val header = reader.readLine()
+ val fields = header.split(",").mapNotNull { if (it.isNotEmpty()) it else null }
+ val batchSize = 5000 //每次保存的数目
+ var failcnt = 0
+
+ val datalist = ArrayList<YnrccChkfileBean>()
+ while (true) {
+ val line = reader.readLine() ?: break
+ if (line.isEmpty()) continue
+ val columns = line.split(",").mapNotNull { if (it.isNotEmpty()) it else null }
+ val bean = YnrccChkfileBean()
+ StringUtil.transforToBean(fields, columns, bean)
+ datalist.add(bean)
+ if (datalist.size >= batchSize) {
+ val fcnt = doBatchSaveYnrccCheckDetails(chkfile, datalist) //保存
+ failcnt += fcnt
+ datalist.clear()
+ }
+ }
+ //保存最后的不足batchSize的记录
+ if (datalist.size > 0) {
+ val fcnt = doBatchSaveYnrccCheckDetails(chkfile, datalist) //保存
+ failcnt += fcnt
+ }
+
+ if (failcnt > 0) {
+ //该天对账单保存错误
+ chkfile.status = ConstantUtil.CHKFILE_STATUS_ERROR
+ chkfile.remark = "对账单数据存在保存失败记录,请手动核对对账单数据"
+ transactionReconciliationService.saveOrUpdateTransactionChkfile(chkfile)
+
+ return AgentResponse<TSourceTypeCheckStatus>().also {
+ it.code = AgentCode.FAIL
+ it.agentMsg = chkfile.remark
+ it.payload = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus.apply {
+ this.remark = chkfile.remark
+ })
+ }
+ }
+
+ //成功
+ transactionReconciliationService.doSuccessTransactionChkfile(chkfile, "对账单数据下载成功")
+ return successDownload("[$billDate]日对账数据入库成功", checkStatus)
+ }
+ } else {
+ logger.error("请求前置download[${chkfile.accdate}]对账单返回失败:httpStatus=[${respClient.status}]。获取对账文件数据失败")
+ chkfile.status = ConstantUtil.CHKFILE_STATUS_ERROR
+ chkfile.remark = "请求前置获取对账单数据失败,download返回:httpStatus=${respClient.status}"
+ transactionReconciliationService.saveOrUpdateTransactionChkfile(chkfile)
+
+ return AgentResponse<TSourceTypeCheckStatus>().also {
+ it.code = AgentCode.FAIL
+ it.agentMsg = chkfile.remark
+ it.payload = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus.apply {
+ this.remark = chkfile.remark
+ })
+ }
+ }
+
+ } catch (ex: Exception) {
+ return AgentResponse<TSourceTypeCheckStatus>().also {
+ it.code = AgentCode.FAIL
+ it.agentMsg = ex.message ?: "按对账单路径获取对账数据入库异常"
+ it.payload = checkStatus
+ }
+ }
+ }
+
+ private fun successDownload(message: String, checkStatus: TSourceTypeCheckStatus): AgentResponse<TSourceTypeCheckStatus> {
+ return AgentResponse<TSourceTypeCheckStatus>().also {
+ it.code = AgentCode.SUCCESS
+ it.agentMsg = message
+ it.payload = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus.apply {
+ this.checkFileOk = true
+ this.remark = message
+ })
+ }
+ }
+
+ private fun reinitCheckFile(chkfile: TTransactionChkfile): TTransactionChkfile {
+ transactionReconciliationService.deleteTransactionChkdtls(chkfile.id) //删除明细
+ return transactionReconciliationService.saveOrUpdateTransactionChkfile(chkfile.apply {
+ this.status = ConstantUtil.CHKFILE_STATUS_INIT
+ this.result = ConstantUtil.CHKFILE_RESULT_NONE
+ this.remark = null
+ this.othercnt = 0
+ this.otheramt = 0.00
+ this.localcnt = 0
+ this.localamt = 0.00
+ }) //初始化chkfile
+ }
+
+ private fun doBatchSaveYnrccCheckDetails(chkfile: TTransactionChkfile, list: ArrayList<YnrccChkfileBean>): Int {
+ try {
+ transactionReconciliationService.doBatchSaveYnrccTransactionChkDtl(chkfile, list)
+ return 0 //批量保存成功,无失败
+ } catch (e1: Exception) {
+ }
+
+ //批量保存有异常,逐笔保存
+ var failcnt = 0
+ for (bean in list) {
+ try {
+ transactionReconciliationService.saveYnrccTransactionChkDtl(chkfile, bean)
+ } catch (e2: Exception) {
+ failcnt++
+ e2.printStackTrace()
+ continue
+ }
+ }
+ return failcnt
+ }
+
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt
index 5136d37..4278bf0 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt
@@ -7,6 +7,7 @@
import com.supwisdom.dlpay.agent.citizencard.DlpayResp
import com.supwisdom.dlpay.agent.citizencard.YnrccRespCode
import com.supwisdom.dlpay.agent.citizencard.YnrccUtil
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
import com.supwisdom.dlpay.api.domain.TTransactionMain
import com.supwisdom.dlpay.framework.util.MoneyUtil
import org.springframework.beans.factory.annotation.Autowired
@@ -28,7 +29,7 @@
}
@Component("citizenCardAgent")
-class CitizenCardPayAgent : AgentPayService {
+class CitizenCardPayAgent : AgentPayService<DtlStatus> {
@Autowired
private lateinit var citizencardPayService: CitizencardPayService
@@ -43,17 +44,17 @@
YnrccRespCode(code, msg ?: "未知"))
}
- override fun auth(shopaccno: String?, billno: String?): AgentResponse {
- return AgentResponse().apply {
+ override fun auth(shopaccno: String?, billno: String?): AgentResponse<DtlStatus> {
+ return AgentResponse<DtlStatus>().apply {
this.code = AgentCode.NOT_SUPPORT
}
}
- override fun pay(transaction: TTransactionMain): AgentResponse {
+ override fun pay(transaction: TTransactionMain): AgentResponse<DtlStatus> {
val resp = citizencardPayService.cardPay(transaction.shopDtl.shopaccno, transaction.personDtl.userid, transaction.accdate,
- MoneyUtil.YuanToFen(transaction.personDtl.amount), transaction.refno)
+ Math.abs(MoneyUtil.YuanToFen(transaction.personDtl.amount)), transaction.refno)
- return AgentResponse().also {
+ return AgentResponse<DtlStatus>().also {
val code = agentCode(resp.code, resp.message)
it.code = code.first
it.agentCode = code.second.code
@@ -62,15 +63,15 @@
}
}
- override fun cancel(transaction: TTransactionMain): AgentResponse {
+ override fun cancel(transaction: TTransactionMain): AgentResponse<DtlStatus> {
return refund(transaction)
}
- override fun refund(transaction: TTransactionMain): AgentResponse {
+ override fun refund(transaction: TTransactionMain): AgentResponse<DtlStatus> {
val resp = citizencardPayService.cardPayRefund(transaction.refno, transaction.accdate,
transaction.reverseRefno, MoneyUtil.YuanToFen(transaction.personDtl.amount))
- return AgentResponse().also {
+ return AgentResponse<DtlStatus>().also {
val code = agentCode(resp.code, resp.message)
it.code = code.first
it.agentCode = code.second.code
@@ -79,10 +80,10 @@
}
}
- override fun query(transaction: TTransactionMain): AgentResponse {
+ override fun query(transaction: TTransactionMain): AgentResponse<DtlStatus> {
val resp = citizencardPayService.queryResult(transaction.refno)
- return AgentResponse().also {
+ return AgentResponse<DtlStatus>().also {
val code = agentCode(resp.code, resp.message)
it.code = code.first
it.agentCode = code.second.code
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
index ccae15f..9dadacd 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
@@ -1,38 +1,43 @@
package com.supwisdom.dlpay.agent.service.impl
+import com.alipay.api.AlipayApiException
+import com.alipay.api.DefaultAlipayClient
+import com.alipay.api.domain.AlipayTradePayModel
+import com.alipay.api.domain.AlipayTradeQueryModel
+import com.alipay.api.domain.AlipayTradeRefundModel
+import com.alipay.api.internal.util.AlipaySignature
+import com.alipay.api.request.AlipayTradeAppPayRequest
+import com.alipay.api.request.AlipayTradePayRequest
+import com.alipay.api.request.AlipayTradeQueryRequest
+import com.supwisdom.dlpay.RestTemplateConfig
import com.supwisdom.dlpay.agent.AgentCode
import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.DtlStatus
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
+import com.supwisdom.dlpay.agent.service.AgentServiceProxy
import com.supwisdom.dlpay.agent.service.AlipayService
+import com.supwisdom.dlpay.api.domain.TTransactionMain
+import com.supwisdom.dlpay.api.service.ConsumePayService
import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.service.TransactionServiceProxy
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeCode
import com.supwisdom.dlpay.framework.util.TradeDict
import com.supwisdom.dlpay.util.PaytypeUtil
import mu.KotlinLogging
import org.springframework.stereotype.Service
-import com.alipay.api.request.AlipayTradePayRequest
-import com.alipay.api.DefaultAlipayClient
-import com.alipay.api.domain.AlipayTradePayModel
-import com.supwisdom.dlpay.agent.service.AgentServiceProxy
-import com.supwisdom.dlpay.api.domain.TTransactionMain
-import com.alipay.api.AlipayApiException
-import com.alipay.api.internal.util.AlipaySignature
-import com.alipay.api.request.AlipayTradeAppPayRequest
-import com.supwisdom.dlpay.api.service.ConsumePayService
-import com.supwisdom.dlpay.api.service.TransactionServiceProxy
-import com.alipay.api.request.AlipayTradeQueryRequest
-import com.supwisdom.dlpay.agent.DtlStatus
-import com.alipay.api.domain.AlipayTradeQueryModel
-import com.alipay.api.domain.AlipayTradeRefundModel
-import com.supwisdom.dlpay.api.bean.BaseResp
@Service
class AlipayServiceImpl(val sourceTypeService: SourceTypeService,
val agentServiceProxy: AgentServiceProxy,
val consumePayService: ConsumePayService,
- val transactionService: TransactionServiceProxy) : AlipayService {
+ val transactionService: TransactionServiceProxy,
+ val restTemplateProxyProperties: RestTemplateConfig.RestTemplateProxyProperties)
+ : AlipayService {
val logger = KotlinLogging.logger { }
- fun checkCfg(config: Map<String, String?>, resp: AgentResponse): Boolean {
+ fun checkCfg(config: Map<String, String?>, resp: AgentResponse<QrcodePayTrans>): Boolean {
if (config[PaytypeUtil.CFG_ALIPAY_APPID].isNullOrEmpty()
|| config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY].isNullOrEmpty()
|| config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY].isNullOrEmpty()) {
@@ -45,24 +50,46 @@
return true
}
- override fun doQrcodepay(transaction: TTransactionMain): AgentResponse {
- var qrcodePayTrans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
- val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, qrcodePayTrans.isAnonymous, false)
- var agentResponse = AgentResponse()
- if (checkCfg(config, agentResponse)) {
- var payurl = config[PaytypeUtil.CFG_ALIPAY_PAYURL]
- if (payurl.isNullOrEmpty()) {
- payurl = "https://openapi.alipay.com/gateway.do"
+ private fun createAlipayClient(config: Map<String, String?>): DefaultAlipayClient {
+ val payurl = config[PaytypeUtil.CFG_ALIPAY_PAYURL].let {
+ if (it.isNullOrEmpty()) {
+ "https://openapi.alipay.com/gateway.do"
+ } else {
+ it
}
- val alipayClient = DefaultAlipayClient(payurl, config[PaytypeUtil.CFG_ALIPAY_APPID], config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY], "json", "UTF-8", config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "RSA2")
+ }
+ return DefaultAlipayClient.builder(payurl, config[PaytypeUtil.CFG_ALIPAY_APPID],
+ config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY])
+ .charset("UTF-8")
+ .format("json")
+ .alipayPublicKey(config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY])
+ .signType("RSA2")
+ .also {
+ if (restTemplateProxyProperties.type == "http") {
+ it.proxyHost(restTemplateProxyProperties.host)
+ .proxyPort(restTemplateProxyProperties.port)
+ }
+ }.build()
+ }
+
+ override fun doQrcodepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+ val qrcodePayTrans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
+ val config = sourceTypeService.getConsumePaytypeConfig(
+ TradeDict.PAYTYPE_ALIPAY,
+ transaction.shopDtl.shopaccno,
+ qrcodePayTrans.isAnonymous, false)
+ val agentResponse = AgentResponse<QrcodePayTrans>()
+ agentResponse.payload = qrcodePayTrans
+ if (checkCfg(config, agentResponse)) {
val request = AlipayTradePayRequest()
request.bizModel = AlipayTradePayModel().apply {
this.authCode = qrcodePayTrans.qrcode
this.outTradeNo = transaction.refno
- this.subject = "POS扫支付宝二维码消费"
+ this.subject = transaction.shopDtl.payInfo
this.totalAmount = transaction.shopDtl.amount.toString()
}
try {
+ val alipayClient = createAlipayClient(config)
val response = alipayClient.execute(request)
if ("10000" == response.code) {
if (response.isSuccess) {
@@ -71,7 +98,7 @@
agentResponse.agentMsg = response.msg
agentResponse.agentCode = response.code
qrcodePayTrans.agentRefno = response.tradeNo
- agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodePayTrans)
+ agentResponse.payload = agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodePayTrans)
} else {
agentResponse.code = AgentCode.FAIL
agentResponse.agentMsg = response.msg
@@ -99,9 +126,11 @@
return agentResponse
}
- override fun doPrepay(transaction: TTransactionMain): AgentResponse {
- val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
- var agentResponse = AgentResponse()
+ override fun doPrepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+ val config = sourceTypeService.getConsumePaytypeConfig(
+ TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno,
+ false, false)
+ val agentResponse = AgentResponse<QrcodePayTrans>()
if (checkCfg(config, agentResponse)) {
if (config[PaytypeUtil.CFG_ALIPAY_NOTIFY].isNullOrEmpty()) {
agentResponse.code = AgentCode.CONFIG_ERROR
@@ -109,41 +138,42 @@
agentResponse.agentMsg = "支付宝相关配置为空"
logger.error { "支付宝异步通知地址未配置:${PaytypeUtil.CFG_ALIPAY_NOTIFY}" }
}
- var payurl = config[PaytypeUtil.CFG_ALIPAY_PAYURL]
- if (payurl.isNullOrEmpty()) {
- payurl = "https://openapi.alipay.com/gateway.do"
- }
- val alipayClient = DefaultAlipayClient(payurl, config[PaytypeUtil.CFG_ALIPAY_APPID], config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY], "json", "UTF-8", config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "RSA2")
+ val alipayClient = createAlipayClient(config)
val request = AlipayTradeAppPayRequest()
var productCode = ""
//判断是否为H5
- //productCode = "QUICK_WAP_WAY"
+ if (transaction.transCode == TradeCode.TRANSCODE_H5PAY) productCode = "QUICK_WAP_WAY"
request.bizModel = AlipayTradePayModel().apply {
this.outTradeNo = transaction.refno
- this.subject = "支付宝支付"
+ this.subject = transaction.shopDtl.payInfo
this.totalAmount = transaction.shopDtl.amount.toString()
this.productCode = productCode
}
- request.notifyUrl = config[PaytypeUtil.CFG_ALIPAY_NOTIFY]
- request.returnUrl = config[PaytypeUtil.CFG_ALIPAY_RETURNURL]
+ request.notifyUrl = StringUtil.urlAppend(config[PaytypeUtil.CFG_ALIPAY_NOTIFY], transaction.tenantid)
+ request.returnUrl = StringUtil.urlAppend(config[PaytypeUtil.CFG_ALIPAY_RETURNURL], transaction.tenantid)
try {
/**
* h5 支付方式
- * String form = alipayClient.pageExecute(request).getBody();
- *
* */
- val response = alipayClient.sdkExecute(request)
- if (response.isSuccess) {
- agentResponse.agentRefno = response.tradeNo
- agentResponse.agentMsg = response.msg
- agentResponse.agentCode = response.code
- //body 为APP
- agentResponse.agentBody = response.body
+ if (transaction.transCode == TradeCode.TRANSCODE_H5PAY) {
+ val form = alipayClient.pageExecute(request).body
+ //body 为Html
+ agentResponse.agentBody = form
+ agentResponse.code = AgentCode.REQUIRE_QUERY
} else {
- agentResponse.code = AgentCode.FAIL
- agentResponse.agentMsg = response.msg
- agentResponse.agentCode = response.code
- logger.error { "支付宝:${response.code},${response.msg},${response.subCode},${response.subMsg}" }
+ val response = alipayClient.sdkExecute(request)
+ if (response.isSuccess) {
+ agentResponse.agentRefno = response.tradeNo
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
+ //body 为APP
+ agentResponse.agentBody = response.body
+ } else {
+ agentResponse.code = AgentCode.FAIL
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
+ logger.error { "支付宝:${response.code},${response.msg},${response.subCode},${response.subMsg}" }
+ }
}
} catch (e: AlipayApiException) {
logger.error { "支付宝:${e.message}" }
@@ -153,15 +183,13 @@
return agentResponse
}
- override fun doRefund(transaction: TTransactionMain): AgentResponse {
- var agentResponse = AgentResponse()
- val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
+ override fun doRefund(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+ val agentResponse = AgentResponse<QrcodePayTrans>()
+ val config = sourceTypeService.getConsumePaytypeConfig(
+ TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno,
+ false, false)
if (checkCfg(config, agentResponse)) {
- var payurl = config[PaytypeUtil.CFG_ALIPAY_PAYURL]
- if (payurl.isNullOrEmpty()) {
- payurl = "https://openapi.alipay.com/gateway.do"
- }
- val alipayClient = DefaultAlipayClient(payurl, config[PaytypeUtil.CFG_ALIPAY_APPID], config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY], "json", "UTF-8", config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "RSA2")
+ val alipayClient = createAlipayClient(config)
val request = AlipayTradeQueryRequest()
request.bizModel = AlipayTradeRefundModel().apply {
this.outTradeNo = transaction.refno
@@ -182,15 +210,12 @@
return agentResponse
}
- override fun doQuery(transaction: TTransactionMain): AgentResponse {
- var agentResponse = AgentResponse()
- val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
+ override fun doQuery(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+ val agentResponse = AgentResponse<QrcodePayTrans>()
+ val config = sourceTypeService.getConsumePaytypeConfig(
+ TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
if (checkCfg(config, agentResponse)) {
- var payurl = config[PaytypeUtil.CFG_ALIPAY_PAYURL]
- if (payurl.isNullOrEmpty()) {
- payurl = "https://openapi.alipay.com/gateway.do"
- }
- val alipayClient = DefaultAlipayClient(payurl, config[PaytypeUtil.CFG_ALIPAY_APPID], config[PaytypeUtil.CFG_ALIPAY_PRIVATEKEY], "json", "UTF-8", config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "RSA2")
+ val alipayClient = createAlipayClient(config)
val request = AlipayTradeQueryRequest()
request.bizModel = AlipayTradeQueryModel().apply {
this.outTradeNo = transaction.refno
@@ -215,14 +240,14 @@
return agentResponse
}
- override fun doNotify(param: Map<String, String>): AgentResponse {
- var refno = param["out_trade_no"]
- var agentResponse = AgentResponse()
+ override fun doNotify(param: Map<String, String>): AgentResponse<QrcodePayTrans> {
+ val refno = param["out_trade_no"]
+ val agentResponse = AgentResponse<QrcodePayTrans>()
if (refno.isNullOrEmpty()) {
agentResponse.code = AgentCode.FAIL
return agentResponse
}
- var transaction = consumePayService.getTransactionMainDtl(refno, null, null)
+ val transaction = consumePayService.getTransactionMainDtl(refno, null, null)
if (transaction == null) {
agentResponse.code = AgentCode.REFNO_NOT_EXISTS
return agentResponse
@@ -231,16 +256,17 @@
agentResponse.code = AgentCode.SUCCESS
return agentResponse
}
- val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
+ val config = sourceTypeService.getConsumePaytypeConfig(
+ TradeDict.PAYTYPE_ALIPAY, transaction.shopDtl.shopaccno, false, false)
if (config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY].isNullOrEmpty()) {
agentResponse.code = AgentCode.CONFIG_ERROR
return agentResponse
}
- var flag = AlipaySignature.rsaCheckV1(param, config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "UTF-8", "RSA2")
- return when (flag) {
+ return when (AlipaySignature.rsaCheckV1(param,
+ config[PaytypeUtil.CFG_ALIPAY_PUBLICKEY], "UTF-8", "RSA2")) {
true -> {
//total amt 校验 map["total_amount"]
- var tradeno = param["trade_no"]
+ val tradeno = param["trade_no"]
if (tradeno.isNullOrEmpty()) {
transactionService.success(transaction.refno)
} else {
@@ -256,8 +282,4 @@
}
}
}
-
- override fun downloadBill(shopacc: String, accdate: String): BaseResp {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
index 2eddc6b..0601599 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/citizencard_service_impl.kt
@@ -3,6 +3,7 @@
import com.google.gson.Gson
import com.sun.jersey.api.client.Client
import com.sun.jersey.api.client.ClientResponse
+import com.sun.jersey.core.util.MultivaluedMapImpl
import com.supwisdom.dlpay.agent.citizencard.DlpayResp
import com.supwisdom.dlpay.api.service.CardService
import com.supwisdom.dlpay.api.service.SourceTypeService
@@ -64,29 +65,33 @@
val systime = systemUtilService.sysdatetime
val refno = systemUtilService.refno
val params = hashMapOf<String, String>()
- params.plus(mapOf(
- "transcode" to YnrccUtil.BANKCARD_BIND_TRANSCODE,
- "transdate" to systime.hostdate,
- "transtime" to systime.hosttime,
- "categorie" to YnrccUtil.DLPAY_CATEGORIE,
- "refno" to refno,
- "bankcardno" to bankcardno,
- "username" to username,
- "idtype" to idType,
- "idno" to idno,
- "phone" to phone,
- "sign_type" to "MD5"
- ))
+ params["transcode"] = YnrccUtil.BANKCARD_BIND_TRANSCODE
+ params["transdate"] = systime.hostdate
+ params["transtime"] = systime.hosttime
+ params["categorie"] = YnrccUtil.DLPAY_CATEGORIE
+ params["refno"] = refno
+ params["bankcardno"] = bankcardno
+ params["username"] = username
+ params["idtype"] = idType.toString()
+ params["idno"] = idno
+ params["phone"] = phone
+ params["sign_type"] = "MD5"
val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
params["sign"] = sign
+
+ val postData = MultivaluedMapImpl()
+ params.forEach { (t, u) -> postData.add(t, u) }
+
val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/bindcard"
logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
val client = Client.create()
client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
- val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+ client.setReadTimeout(YnrccUtil.AGENT_READ_TIMEOUT * 1000)
+ val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
return if (200 == respClient.status) {
- resp = respClient.getEntity(DlpayResp::class.java)
- logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+ val jsonStr = respClient.getEntity(String::class.java)
+ logger.error("refno=[$refno], url=[$url], return=[$jsonStr]")
+ resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
resp
} else {
resp.code = "99"
@@ -119,30 +124,34 @@
val systime = systemUtilService.sysdatetime
val refno = systemUtilService.refno
val params = hashMapOf<String, String>()
- params.plus(mapOf(
- "transcode" to YnrccUtil.BANKCARD_SIGN_TRANSCODE,
- "transdate" to systime.hostdate,
- "transtime" to systime.hosttime,
- "refno" to refno,
- "categorie" to YnrccUtil.DLPAY_CATEGORIE,
- "transtype" to transtype,
- "bankcardno" to bankcardno,
- "username" to username,
- "idtype" to idType,
- "idno" to idno,
- "phone" to phone,
- "sign_type" to "MD5"
- ))
+ params["transcode"] = YnrccUtil.BANKCARD_SIGN_TRANSCODE
+ params["transdate"] = systime.hostdate
+ params["transtime"] = systime.hosttime
+ params["refno"] = refno
+ params["categorie"] = YnrccUtil.DLPAY_CATEGORIE
+ params["transtype"] = transtype
+ params["bankcardno"] = bankcardno
+ params["username"] = username
+ params["idtype"] = idType.toString()
+ params["idno"] = idno
+ params["phone"] = phone
+ params["sign_type"] = "MD5"
val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
params["sign"] = sign
+
+ val postData = MultivaluedMapImpl()
+ params.forEach { (t, u) -> postData.add(t, u) }
+
val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/signcard"
logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
val client = Client.create()
client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
- val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+ client.setReadTimeout(YnrccUtil.AGENT_READ_TIMEOUT * 1000)
+ val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
return if (200 == respClient.status) {
- resp = respClient.getEntity(DlpayResp::class.java)
- logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+ val jsonStr = respClient.getEntity(String::class.java)
+ logger.error("refno=[$refno], url=[$url], return=[$jsonStr]")
+ resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
resp
} else {
resp.code = "99"
@@ -195,33 +204,37 @@
val systime = systemUtilService.sysdatetime
val params = hashMapOf<String, String>()
- params.plus(mapOf(
- "transcode" to YnrccUtil.BANKCARD_PAY_TRANSCODE,
- "transdate" to accdate, //我们的记账日期
- "transtime" to systime.hosttime,
- "refno" to refno,
- "categorie" to YnrccUtil.DLPAY_CATEGORIE,
- "bankcardno" to bankcardno,
- "username" to person.name,
- "idtype" to idType,
- "idno" to person.idno,
- "merchant_bankcardno" to merchantBankcardno,
- "merchant_bankaccname" to merchantBankaccname,
- "amount" to amount,
- "description" to "市民卡代扣消费",
- "sign_type" to "MD5"
- ))
+ params["transcode"] = YnrccUtil.BANKCARD_PAY_TRANSCODE
+ params["transdate"] = accdate
+ params["transtime"] = systime.hosttime
+ params["refno"] = refno
+ params["categorie"] = YnrccUtil.DLPAY_CATEGORIE
+ params["bankcardno"] = bankcardno
+ params["username"] = person.name
+ params["idtype"] = idType.toString()
+ params["idno"] = person.idno
+ params["merchant_bankcardno"] = merchantBankcardno!!
+ params["merchant_bankaccname"] = merchantBankaccname!!
+ params["amount"] = amount.toString()
+ params["description"] = "市民卡代扣消费"
+ params["sign_type"] = "MD5"
val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
params["sign"] = sign
+
+ val postData = MultivaluedMapImpl()
+ params.forEach { (t, u) -> postData.add(t, u) }
+
val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/cardpay"
logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
try {
val client = Client.create()
client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
- val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+ client.setReadTimeout(YnrccUtil.AGENT_READ_TIMEOUT * 1000)
+ val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
return if (200 == respClient.status) {
- resp = respClient.getEntity(DlpayResp::class.java)
- logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+ val jsonStr = respClient.getEntity(String::class.java)
+ logger.error("refno=[$refno], url=[$url], return=[$jsonStr]")
+ resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
resp
} else {
resp.code = "99"
@@ -247,27 +260,31 @@
val systime = systemUtilService.sysdatetime
val params = hashMapOf<String, String>()
- params.plus(mapOf(
- "transcode" to YnrccUtil.BANKCARD_PAYREFUND_TRANSCODE,
- "transdate" to accdate, //我们的记账日期
- "transtime" to systime.hosttime,
- "refno" to refno,
- "refundRefno" to orignRefno,
- "amount" to amount,
- "description" to "市民卡代扣消费退款",
- "sign_type" to "MD5"
- ))
+ params["transcode"] = YnrccUtil.BANKCARD_PAYREFUND_TRANSCODE
+ params["transdate"] = accdate //我们的记账日期
+ params["transtime"] = systime.hosttime
+ params["refno"] = refno
+ params["refundRefno"] = orignRefno
+ params["amount"] = amount.toString()
+ params["description"] = "市民卡代扣消费退款"
+ params["sign_type"] = "MD5"
val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
params["sign"] = sign
+
+ val postData = MultivaluedMapImpl()
+ params.forEach { (t, u) -> postData.add(t, u) }
+
val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/cardpayrefund"
logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
try {
val client = Client.create()
client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
- val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+ client.setReadTimeout(YnrccUtil.AGENT_READ_TIMEOUT * 1000)
+ val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
return if (200 == respClient.status) {
- resp = respClient.getEntity(DlpayResp::class.java)
- logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+ val jsonStr = respClient.getEntity(String::class.java)
+ logger.error("refno=[$refno],refundRefno=[$orignRefno], url=[$url], return=[$jsonStr]")
+ resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
resp
} else {
resp.code = "99"
@@ -294,25 +311,29 @@
val systime = systemUtilService.sysdatetime
val refno = systemUtilService.refno
val params = hashMapOf<String, String>()
- params.plus(mapOf(
- "transcode" to YnrccUtil.BANKCARD_QUERYRESULT_TRANSCODE,
- "transdate" to systime.hostdate,
- "transtime" to systime.hosttime,
- "refno" to refno,
- "orignRefno" to orignRefno,
- "sign_type" to "MD5"
- ))
+ params["transcode"] = YnrccUtil.BANKCARD_QUERYRESULT_TRANSCODE
+ params["transdate"] = systime.hostdate
+ params["transtime"] = systime.hosttime
+ params["refno"] = refno
+ params["orignRefno"] = orignRefno
+ params["sign_type"] = "MD5"
val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
params["sign"] = sign
+
+ val postData = MultivaluedMapImpl()
+ params.forEach { (t, u) -> postData.add(t, u) }
+
val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/queryresult"
logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
try {
val client = Client.create()
client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
- val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+ client.setReadTimeout(YnrccUtil.AGENT_READ_TIMEOUT * 1000)
+ val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
return if (200 == respClient.status) {
- resp = respClient.getEntity(DlpayResp::class.java)
- logger.error("refno=[$orignRefno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+ val jsonStr = respClient.getEntity(String::class.java)
+ logger.error("refno=[$orignRefno], url=[$url], return=[$jsonStr]")
+ resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
resp
} else {
resp.code = "99"
@@ -338,25 +359,29 @@
val systime = systemUtilService.sysdatetime
val refno = systemUtilService.refno
val params = hashMapOf<String, String>()
- params.plus(mapOf(
- "transcode" to YnrccUtil.BANKCARD_CHKFILE_TRANSCODE,
- "transdate" to systime.hostdate,
- "transtime" to systime.hosttime,
- "refno" to refno,
- "checkdate" to checkdate,
- "merchant_bankcardno" to merchantBankcardno,
- "sign_type" to "MD5"
- ))
+ params["transcode"] = YnrccUtil.BANKCARD_CHKFILE_TRANSCODE
+ params["transdate"] = systime.hostdate
+ params["transtime"] = systime.hosttime
+ params["refno"] = refno
+ params["checkdate"] = checkdate
+ params["merchant_bankcardno"] = merchantBankcardno ?: ""
+ params["sign_type"] = "MD5"
val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim())
params["sign"] = sign
- val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/bindcard"
+
+ val postData = MultivaluedMapImpl()
+ params.forEach { (t, u) -> postData.add(t, u) }
+
+ val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/checkdtl"
logger.error("url=[$url], params=[" + Gson().toJson(params) + "]")
val client = Client.create()
client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000)
- val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java)
+ client.setReadTimeout(YnrccUtil.AGENT_READ_TIMEOUT * 1000)
+ val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse::class.java, postData)
return if (200 == respClient.status) {
- resp = respClient.getEntity(DlpayResp::class.java)
- logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]")
+ val jsonStr = respClient.getEntity(String::class.java)
+ logger.error("refno=[$refno],chkdate=[$checkdate], url=[$url], return=[$jsonStr]")
+ resp = Gson().fromJson(jsonStr, DlpayResp::class.java)
resp
} else {
resp.code = "99"
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt
index 1f3b6d1..61fa734 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt
@@ -3,6 +3,7 @@
import com.supwisdom.dlpay.agent.AgentCode
import com.supwisdom.dlpay.agent.AgentResponse
import com.supwisdom.dlpay.agent.DtlStatus
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
import com.supwisdom.dlpay.agent.service.AgentServiceProxy
import com.supwisdom.dlpay.agent.service.WechatService
import com.supwisdom.dlpay.api.bean.BaseResp
@@ -13,6 +14,7 @@
import com.supwisdom.dlpay.api.service.SourceTypeService
import com.supwisdom.dlpay.api.service.TransactionServiceProxy
import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.framework.util.RandomUtils.getRandomString
import com.supwisdom.dlpay.util.PaytypeUtil
import mu.KotlinLogging
import org.apache.commons.lang.StringUtils
@@ -32,7 +34,7 @@
val logger = KotlinLogging.logger { }
- fun checkCfg(config: Map<String, String?>, resp: AgentResponse): Boolean {
+ fun checkCfg(config: Map<String, String?>, resp: AgentResponse<QrcodePayTrans>): Boolean {
if (config[PaytypeUtil.CFG_WECHAT_APPID].isNullOrEmpty()
|| config[PaytypeUtil.CFG_WECHAT_MECHKEY].isNullOrEmpty()
|| config[PaytypeUtil.CFG_WECHAT_MECHID].isNullOrEmpty()) {
@@ -45,14 +47,15 @@
return true
}
- override fun doAuth(shopaccno: String?, billno: String?): AgentResponse {
- var qrcodeTrans = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(shopaccno, billno)
- var agentResponse = AgentResponse()
+ override fun doAuth(shopaccno: String?, billno: String?): AgentResponse<QrcodePayTrans> {
+ val qrcodeTrans = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(shopaccno, billno)
+ val agentResponse = AgentResponse<QrcodePayTrans>()
if (qrcodeTrans == null) {
agentResponse.code = AgentCode.REFNO_NOT_EXISTS
agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
return agentResponse
}
+ agentResponse.payload = qrcodeTrans
val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, shopaccno, qrcodeTrans.isAnonymous, false)
if (checkCfg(config, agentResponse)) {
val bean = WechatReqResp().apply {
@@ -62,21 +65,21 @@
this.key = config[PaytypeUtil.CFG_WECHAT_MECHKEY]
}
bean.generalCheckSign()
- var xml = bean.generalCheckXML()
+ val xml = bean.generalCheckXML()
restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
- var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_OAUTHCODE, xml, String::class.java)
- var eleMap = XmlUtils.parseXml(res.body)
- var retcode = eleMap["return_code"]
- var resultCode = eleMap["result_code"]
- var openid = eleMap["openid"]
+ val res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_OAUTHCODE, xml, String::class.java)
+ val eleMap = XmlUtils.parseXml(res.body)
+ val retcode = eleMap["return_code"]
+ val resultCode = eleMap["result_code"]
+ val openid = eleMap["openid"]
if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
&& !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode && !openid.isNullOrEmpty()) {
qrcodeTrans.agentUserId = openid
- var ip = personIdentityDao.getByThirdUid(openid)
+ val ip = personIdentityDao.getByThirdUid(openid)
if (ip != null) {
qrcodeTrans.userid = ip.person.userid
}
- agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
+ agentResponse.payload = agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
agentResponse.code = AgentCode.SUCCESS
agentResponse.agentCode = retcode
agentResponse.agentMsg = eleMap["return_msg"]
@@ -90,14 +93,15 @@
return agentResponse
}
- override fun doQrcodepay(transaction: TTransactionMain): AgentResponse {
- var qrcodeTrans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
- var agentResponse = AgentResponse()
+ override fun doQrcodepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+ val qrcodeTrans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
+ val agentResponse = AgentResponse<QrcodePayTrans>()
if (qrcodeTrans == null) {
agentResponse.code = AgentCode.REFNO_NOT_EXISTS
agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
return agentResponse
}
+ agentResponse.payload = qrcodeTrans
val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, qrcodeTrans.isAnonymous, false)
if (checkCfg(config, agentResponse)) {
val bean = WechatReqResp().apply {
@@ -108,18 +112,18 @@
this.out_trade_no = transaction.refno
this.total_fee = MoneyUtil.YuanToFen(transaction.shopDtl.amount)
this.spbill_create_ip = qrcodeTrans.spip
- this.body = "POS扫微信二维码支付"
+ this.body = transaction.shopDtl.payInfo
}
bean.generalPaySign()
- var xml = bean.generaPayXML()
+ val xml = bean.generaPayXML()
restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
- var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_QRCODEPAY, xml, String::class.java)
- var eleMap = XmlUtils.parseXml(res.body)
- var retcode = eleMap["return_code"]
- var resultCode = eleMap["result_code"]
- var openid = eleMap["openid"]
- var errorCode = eleMap["err_code"]
+ val res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_QRCODEPAY, xml, String::class.java)
+ val eleMap = XmlUtils.parseXml(res.body)
+ val retcode = eleMap["return_code"]
+ val resultCode = eleMap["result_code"]
+ val openid = eleMap["openid"]
+ val errorCode = eleMap["err_code"]
if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
&& !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode && !openid.isNullOrEmpty()) {
agentResponse.code = AgentCode.SUCCESS
@@ -127,58 +131,87 @@
agentResponse.dtlStatus = DtlStatus.SUCCESS
agentResponse.agentMsg = eleMap["return_msg"]
agentResponse.agentRefno = eleMap["transaction_id"]
- qrcodeTrans.agentRefno = eleMap["transaction_id"]
- agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
- } else if("SYSTEMERROR"==errorCode||"BANKERROR"==errorCode||"USERPAYING"==errorCode){
- logger.error { "code=${errorCode},des=${eleMap["err_code_des"]}" }
+ qrcodeTrans.agentRefno = eleMap["transaction_id"]
+ agentResponse.payload = agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
+ } else if ("SYSTEMERROR" == errorCode || "BANKERROR" == errorCode || "USERPAYING" == errorCode) {
+ logger.error { "code=$errorCode,des=${eleMap["err_code_des"]}" }
agentResponse.code = AgentCode.REQUIRE_QUERY
agentResponse.agentCode = eleMap["err_code"]
agentResponse.agentMsg = eleMap["err_code_des"]
agentResponse.agentRefno = eleMap["transaction_id"]
- qrcodeTrans.agentRefno = eleMap["transaction_id"]
- agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
- }else{
+ qrcodeTrans.agentRefno = eleMap["transaction_id"]
+ agentResponse.payload = agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
+ } else {
agentResponse.code = AgentCode.FAIL
agentResponse.agentCode = eleMap["err_code"]
agentResponse.agentMsg = eleMap["err_code_des"]
- logger.error { "code=${errorCode},des=${eleMap["err_code_des"]}" }
+ logger.error { "code=$errorCode,des=${eleMap["err_code_des"]}" }
}
}
return agentResponse
}
- override fun doPrepay(transaction: TTransactionMain): AgentResponse {
- var agentResponse = AgentResponse()
+ override fun doPrepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+ val agentResponse = AgentResponse<QrcodePayTrans>()
val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, false, false)
if (checkCfg(config, agentResponse)) {
//H5 支付
+ val trans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
+ agentResponse.payload = trans
val bean = WechatReqResp().apply {
this.appid = config[PaytypeUtil.CFG_WECHAT_APPID]
this.mch_id = config[PaytypeUtil.CFG_WECHAT_MECHID]
this.key = config[PaytypeUtil.CFG_WECHAT_MECHKEY]
this.out_trade_no = transaction.refno
this.total_fee = MoneyUtil.YuanToFen(transaction.shopDtl.amount)
- this.spbill_create_ip = ""
- this.body = "微信支付"
- this.trade_type = "MWEB"
- this.notify_url = config[PaytypeUtil.CFG_WECHAT_NOTIFY]
+ this.spbill_create_ip = trans.spip
+ this.body = transaction.shopDtl.payInfo
+ this.notify_url = StringUtil.urlAppend(config[PaytypeUtil.CFG_WECHAT_NOTIFY], transaction.tenantid)
+ this.trade_type = when (transaction.transCode) {
+ TradeCode.TRANSCODE_H5PAY -> "MWEB"
+ TradeCode.TRANSCODE_JSPAY -> "JSAPI"
+ TradeCode.TRANSCODE_APPPAY -> "APP"
+ else -> "JSAPI"
+ }
this.scene_info = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"" + config[PaytypeUtil.CFG_WECHAT_NOTIFY] + "\",\"wap_name\": \"微信支付\"}}"
}
- //TODO IP 问题
+ if (transaction.transCode == TradeCode.TRANSCODE_JSPAY || transaction.transCode == TradeCode.TRANSCODE_SMPAY) {
+ val p = personIdentityDao.getBySourcetype(transaction.personDtl.userid, transaction.sourceType)
+ if (p != null) {
+ bean.openid = p.thirdUid
+ }
+ }
bean.generaSign()
val xml = bean.generaXML()
restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
- var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_UNIONPAY, xml, String::class.java)
- var eleMap = XmlUtils.parseXml(res.body)
- var retcode = eleMap["return_code"]
- var resultCode = eleMap["result_code"]
- val mwebUrl = eleMap["mweb_url"]
+ val res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_UNIONPAY, xml, String::class.java)
+ val eleMap = XmlUtils.parseXml(res.body)
+ val retcode = eleMap["return_code"]
+ val resultCode = eleMap["result_code"]
+
if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
- && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode && !mwebUrl.isNullOrEmpty()) {
+ && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode) {
agentResponse.code = AgentCode.REQUIRE_QUERY
- agentResponse.agentCode =resultCode
+ agentResponse.agentCode = resultCode
agentResponse.agentMsg = eleMap["return_msg"]
- agentResponse.agentBody = mwebUrl
+ when {
+ transaction.transCode == TradeCode.TRANSCODE_H5PAY -> agentResponse.agentBody = eleMap["mweb_url"]
+ transaction.transCode == TradeCode.TRANSCODE_APPPAY -> {
+ bean.prepay_id = eleMap["prepay_id"]
+ bean.timestamp = DateUtil.getNowSecond().toString()
+ bean.nonce_str = getRandomString(30)
+ bean.wpackage = "Sign=WXPay"
+ bean.generaAPPSign()
+ agentResponse.agentBody = bean.generaAPPParamters()
+ }
+ transaction.transCode == TradeCode.TRANSCODE_JSPAY || transaction.transCode == TradeCode.TRANSCODE_SMPAY -> {
+ bean.prepay_id = eleMap["prepay_id"]
+ bean.timestamp = DateUtil.getNowSecond().toString()
+ bean.nonce_str = getRandomString(30)
+ bean.generaJSAPISign()
+ agentResponse.agentBody = bean.generaJSAPIParamters()
+ }
+ }
agentResponse.agentRefno = eleMap["prepay_id"]
} else {
logger.error { "code=${eleMap["err_code"]},des=${eleMap["err_code_des"]}" }
@@ -190,8 +223,8 @@
return agentResponse
}
- override fun doQuery(transaction: TTransactionMain): AgentResponse {
- var agentResponse = AgentResponse()
+ override fun doQuery(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+ val agentResponse = AgentResponse<QrcodePayTrans>()
val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, false, false)
if (checkCfg(config, agentResponse)) {
//H5 支付
@@ -204,10 +237,10 @@
bean.generalQuerySign()
val xml = bean.generalQueryXML()
restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
- var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_QUERY, xml, String::class.java)
- var eleMap = XmlUtils.parseXml(res.body)
- var retcode = eleMap["return_code"]
- var resultCode = eleMap["result_code"]
+ val res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_QUERY, xml, String::class.java)
+ val eleMap = XmlUtils.parseXml(res.body)
+ val retcode = eleMap["return_code"]
+ val resultCode = eleMap["result_code"]
val tradeState = eleMap["trade_state"]
if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
&& !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode) {
@@ -230,8 +263,8 @@
return agentResponse
}
- override fun doRefund(transaction: TTransactionMain): AgentResponse {
- var agentResponse = AgentResponse()
+ override fun doRefund(transaction: TTransactionMain): AgentResponse<QrcodePayTrans> {
+ val agentResponse = AgentResponse<QrcodePayTrans>()
val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, false, false)
if (checkCfg(config, agentResponse)) {
val bean = WechatReqResp().apply {
@@ -242,18 +275,18 @@
this.total_fee = MoneyUtil.YuanToFen(transaction.shopDtl.amount)
this.refund_fee = MoneyUtil.YuanToFen(transaction.refundAmount)
this.out_refund_no = transaction.reverseRefno
- this.notify_url = config[PaytypeUtil.CFG_WECHAT_NOTIFY]
+ this.notify_url = StringUtil.urlAppend(config[PaytypeUtil.CFG_WECHAT_NOTIFY], transaction.tenantid)
}
bean.generaReverseSign()
val xml = bean.generaReverseXML()
- var res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_REFUND, xml, String::class.java)
- var eleMap = XmlUtils.parseXml(res.body)
- var retcode = eleMap["return_code"]
- var resultCode = eleMap["result_code"]
+ val res = restTemplate.postForEntity(PaytypeUtil.CFG_WECHAT_REFUND, xml, String::class.java)
+ val eleMap = XmlUtils.parseXml(res.body)
+ val retcode = eleMap["return_code"]
+ val resultCode = eleMap["result_code"]
if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
- && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode ) {
+ && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode) {
agentResponse.code = AgentCode.REQUIRE_QUERY
- agentResponse.agentCode =resultCode
+ agentResponse.agentCode = resultCode
agentResponse.agentRefno = eleMap["refund_id"]
agentResponse.agentMsg = eleMap["return_msg"]
} else {
@@ -266,9 +299,9 @@
return agentResponse
}
- override fun doNotify(param: Map<String, String>): AgentResponse {
- var agentResponse = AgentResponse()
- var transaction = consumePayService.getTransactionMainDtl(param["out_trade_no"], null, null)
+ override fun doNotify(param: Map<String, String>): AgentResponse<QrcodePayTrans> {
+ val agentResponse = AgentResponse<QrcodePayTrans>()
+ val transaction = consumePayService.getTransactionMainDtl(param["out_trade_no"], null, null)
if (transaction == null) {
agentResponse.code = AgentCode.REFNO_NOT_EXISTS
agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
@@ -287,10 +320,10 @@
agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
agentResponse.agentMsg = "签名错误"
}
- var temp = StringUtil.paraFilter(param)
+ val temp = StringUtil.paraFilter(param)
var signStr = StringUtil.createLinkString(temp)
val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, false, false)
- var key = config[PaytypeUtil.CFG_WECHAT_MECHKEY]
+ val key = config[PaytypeUtil.CFG_WECHAT_MECHKEY]
signStr += "&key=$key"
val signRet = MD5.encodeByMD5(signStr)
logger.error("*******signStr=$signStr")
@@ -305,10 +338,10 @@
if (!returnCode.isNullOrEmpty() && "SUCCESS" == returnCode
&& !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode) {
val transid = param["transaction_id"]
- if(transid.isNullOrEmpty()){
+ if (transid.isNullOrEmpty()) {
transactionService.success(transaction.refno)
- }else{
- transactionService.success(transaction.refno,transid, true)
+ } else {
+ transactionService.success(transaction.refno, transid, true)
}
agentResponse.code = AgentCode.SUCCESS
agentResponse.agentCode = resultCode
@@ -321,7 +354,4 @@
return agentResponse
}
- override fun downloadBill(shopacc:String,accdate:String): BaseResp {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt
index 165c4c7..efd0c29 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt
@@ -3,6 +3,7 @@
import com.supwisdom.dlpay.agent.AgentCode
import com.supwisdom.dlpay.agent.AgentPayService
import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
import com.supwisdom.dlpay.api.bean.BaseResp
import com.supwisdom.dlpay.api.domain.TPersondtl
import com.supwisdom.dlpay.api.domain.TTransactionMain
@@ -33,26 +34,26 @@
}
@Component("swyktv5Agent")
-class SWYktV5AgentService : AgentPayService {
- override fun auth(shopaccno: String?, billno: String?): AgentResponse {
- return AgentResponse().apply {
+class SWYktV5AgentService : AgentPayService<String> {
+ override fun auth(shopaccno: String?, billno: String?): AgentResponse<String> {
+ return AgentResponse<String>().apply {
this.code = AgentCode.NOT_SUPPORT
}
}
- override fun pay(transaction: TTransactionMain?): AgentResponse {
+ override fun pay(transaction: TTransactionMain?): AgentResponse<String> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
- override fun cancel(transaction: TTransactionMain?): AgentResponse {
+ override fun cancel(transaction: TTransactionMain?): AgentResponse<String> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
- override fun refund(transaction: TTransactionMain?): AgentResponse {
+ override fun refund(transaction: TTransactionMain?): AgentResponse<String> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
- override fun query(transaction: TTransactionMain?): AgentResponse {
+ override fun query(transaction: TTransactionMain?): AgentResponse<String> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wanxiao_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wanxiao_service.kt
index eb77875..1fd1eb7 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wanxiao_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wanxiao_service.kt
@@ -3,30 +3,31 @@
import com.supwisdom.dlpay.agent.AgentCode
import com.supwisdom.dlpay.agent.AgentPayService
import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
import com.supwisdom.dlpay.api.domain.TTransactionMain
import org.springframework.stereotype.Component
@Component("wanxiaoAgent")
-class WanxiaoAgentService : AgentPayService {
- override fun auth(shopaccno: String?, billno: String?): AgentResponse {
- return AgentResponse().apply {
+class WanxiaoAgentService : AgentPayService<QrcodePayTrans> {
+ override fun auth(shopaccno: String?, billno: String?): AgentResponse<QrcodePayTrans> {
+ return AgentResponse<QrcodePayTrans>().apply {
this.code = AgentCode.NOT_SUPPORT
}
}
- override fun pay(transaction: TTransactionMain?): AgentResponse {
+ override fun pay(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
- override fun cancel(transaction: TTransactionMain?): AgentResponse {
+ override fun cancel(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
- override fun refund(transaction: TTransactionMain?): AgentResponse {
+ override fun refund(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
- override fun query(transaction: TTransactionMain?): AgentResponse {
+ override fun query(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt
index 7fe78de..8f08241 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt
@@ -3,6 +3,7 @@
import com.supwisdom.dlpay.agent.AgentCode
import com.supwisdom.dlpay.agent.AgentPayService
import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
import com.supwisdom.dlpay.api.bean.BaseResp
import com.supwisdom.dlpay.api.domain.TTransactionMain
import com.supwisdom.dlpay.api.service.ConsumePayService
@@ -11,52 +12,48 @@
import org.springframework.stereotype.Component
interface WechatService {
- fun doAuth(shopaccno: String?, billno: String?): AgentResponse
+ fun doAuth(shopaccno: String?, billno: String?): AgentResponse<QrcodePayTrans>
- fun doQrcodepay(transaction: TTransactionMain): AgentResponse
+ fun doQrcodepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
- fun doPrepay(transaction: TTransactionMain): AgentResponse
+ fun doPrepay(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
- fun doQuery(transaction: TTransactionMain): AgentResponse
+ fun doQuery(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
- fun doRefund(transaction: TTransactionMain): AgentResponse
+ fun doRefund(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
- fun doNotify(param: Map<String, String>): AgentResponse
+ fun doNotify(param: Map<String, String>): AgentResponse<QrcodePayTrans>
- /**
- * 下载对账单
- * */
- fun downloadBill(shopacc:String,accdate:String):BaseResp
}
@Component("wechatAgent")
class WeChatPayAgentService(val consumePayService: ConsumePayService,
- val wechatService: WechatService) : AgentPayService {
- override fun auth(shopaccno: String?, billno: String?): AgentResponse {
+ val wechatService: WechatService) : AgentPayService<QrcodePayTrans> {
+ override fun auth(shopaccno: String?, billno: String?): AgentResponse<QrcodePayTrans> {
if (consumePayService.checkShopPaytype(shopaccno!!, TradeDict.PAYTYPE_WECHAT, true)) {
return wechatService.doAuth(shopaccno, billno)
}
- return AgentResponse().apply {
+ return AgentResponse<QrcodePayTrans>().apply {
this.code = AgentCode.NOT_SUPPORT
}
}
- override fun pay(transaction: TTransactionMain?): AgentResponse {
+ override fun pay(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
return when (transaction!!.transCode) {
TradeCode.TRANSCODE_QRCODE -> wechatService.doQrcodepay(transaction)
else -> wechatService.doPrepay(transaction)
}
}
- override fun cancel(transaction: TTransactionMain?): AgentResponse {
+ override fun cancel(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
return refund(transaction)
}
- override fun refund(transaction: TTransactionMain?): AgentResponse {
+ override fun refund(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
return wechatService.doRefund(transaction!!)
}
- override fun query(transaction: TTransactionMain?): AgentResponse {
+ override fun query(transaction: TTransactionMain?): AgentResponse<QrcodePayTrans> {
return wechatService.doQuery(transaction!!)
}
}
\ 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
index ecc5f3b..1fda9f0 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt
@@ -126,9 +126,10 @@
SecurityContextHolder.getContext().authentication.name))) {
throw RequestParamCheckException("参数签名错误")
}
- } else {
- throw TransactionCheckException(TradeErrorCode.REQUEST_PARAM_EEROR, "请求参数实体位置错误")
}
+// else {
+// throw TransactionCheckException(TradeErrorCode.REQUEST_PARAM_EEROR, "请求参数实体位置错误")
+// }
val result = joinPoint.proceed()
logger.debug(result.toString())
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
index 5b9745a..e771add 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt
@@ -4,12 +4,18 @@
import com.supwisdom.dlpay.agent.DtlStatus
import com.supwisdom.dlpay.agent.citizencard.YnrccUtil
import com.supwisdom.dlpay.api.domain.TDtlQuery
+import com.supwisdom.dlpay.api.domain.TShopdtl
import com.supwisdom.dlpay.api.domain.TTransactionMain
import com.supwisdom.dlpay.api.repositories.ShopaccService
import com.supwisdom.dlpay.api.service.DtlQueryResultService
import com.supwisdom.dlpay.api.service.TransactionServiceProxy
+import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.framework.service.DayendSettleService
import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.tenant.TenantContext
import com.supwisdom.dlpay.framework.util.ApplicationUtil
+import com.supwisdom.dlpay.framework.util.Constants
+import com.supwisdom.dlpay.framework.util.StringUtil
import com.supwisdom.dlpay.framework.util.TradeDict
import com.supwisdom.dlpay.util.ConstantUtil
import mu.KotlinLogging
@@ -29,7 +35,7 @@
@Configuration
@EnableAsync
class SpringAsyncConfig : AsyncConfigurer {
- @Bean(value = ["shopAccBalanceUpdater", "queryAgentPayResult"])
+ @Bean(value = ["shopAccBalanceUpdater"])
fun threadPoolExecutor(): Executor {
return ThreadPoolTaskExecutor().apply {
corePoolSize = 5
@@ -38,6 +44,33 @@
}
}
+ @Bean(value = ["queryAgentPayResult"])
+ fun queryAgentPayResultExecutor(): Executor {
+ return ThreadPoolTaskExecutor().apply {
+ corePoolSize = 5
+ maxPoolSize = 10
+ setWaitForTasksToCompleteOnShutdown(true)
+ }
+ }
+
+ @Bean(name = ["sourcetypeCheckTaskExecutor"])
+ fun threadPoolTaskExecutor(): Executor {
+ return ThreadPoolTaskExecutor().apply {
+ corePoolSize = 5
+ maxPoolSize = 10
+ setWaitForTasksToCompleteOnShutdown(true)
+ }
+ }
+
+ @Bean(name = ["handSettlementAsyncTask"])
+ fun handSettlementAsyncTaskExecutor(): Executor {
+ return ThreadPoolTaskExecutor().apply {
+ corePoolSize = 5
+ maxPoolSize = 10
+ setWaitForTasksToCompleteOnShutdown(true)
+ }
+ }
+
override fun getAsyncUncaughtExceptionHandler(): AsyncUncaughtExceptionHandler? {
return MyAsyncUncaughtExceptionHandler()
}
@@ -59,8 +92,9 @@
private lateinit var shopaccService: ShopaccService
@Async("shopAccBalanceUpdater")
- fun updateShopBalance(shopdtlRefno: String) {
- shopaccService.recalcShopBalance(shopdtlRefno, true)
+ fun updateShopBalance(shopdtl: TShopdtl) {
+ TenantContext.setTenantSchema(shopdtl.tenantid)
+ shopaccService.recalcShopBalance(shopdtl.refno, true)
}
}
@@ -83,6 +117,8 @@
@Async("queryAgentPayResult")
fun queryResult(transaction: TTransactionMain, qcnt: Int) {
try {
+ if (null == TenantContext.getTenantSchema()) TenantContext.setTenantSchema(transaction.tenantid)
+
if (qcnt >= YnrccUtil.QUERY_MAX_COUNT) {
//查询超最大次数
logger.error("查询refno=[${transaction.refno}]流水结果超最大查询次数[${YnrccUtil.QUERY_MAX_COUNT}]")
@@ -99,8 +135,8 @@
return
}
- val service = ApplicationUtil.findAgentPayService(applicationContext,
- transaction.sourceType+ "Agent")
+ val service = ApplicationUtil.findAgentPayService<Any>(applicationContext,
+ transaction.sourceType + "Agent")
logger.info("refno=[${transaction.refno}]开始第" + (qcnt + 1) + "次查询支付结果:")
val resp = service.query(transaction)
@@ -140,5 +176,42 @@
ex.printStackTrace()
}
}
+}
+
+/**
+ * 异步调用结算任务
+ * */
+@Component
+class SettlementAsyncTask {
+ @Autowired
+ private lateinit var dayendSettleService: DayendSettleService
+
+ private val logger = KotlinLogging.logger { }
+
+ @Async("handSettlementAsyncTask")
+ fun doHandSettleTask() {
+ logger.info("进入手动发起的异步结算:")
+ if (null == TenantContext.getTenantSchema()) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID)
+ val settleLog = dayendSettleService.doCreateSettleLog() //记录日志
+ try {
+ val ret = dayendSettleService.doDayendSettle()
+ if (ret) {
+ logger.info("异步结算完成,结算成功")
+ dayendSettleService.doUpdateSettleLog(settleLog.update("0", "成功结算"))
+ }
+ } catch (ex: TransactionException) {
+ logger.error("异步结算报错!${ex.message}")
+ dayendSettleService.doUpdateSettleLog(settleLog.update("" + ex.code(), ex.message))
+ } catch (e: Exception) {
+ if (!StringUtil.isEmpty(e.message)) {
+ logger.error("异步结算报错!${e.message}")
+ dayendSettleService.doUpdateSettleLog(settleLog.update("-9", e.message))
+ } else {
+ logger.error("异步结算报错!${e.javaClass.name}")
+ e.printStackTrace()
+ dayendSettleService.doUpdateSettleLog(settleLog.update("-8", e.javaClass.name))
+ }
+ }
+ }
}
\ 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
index 739b2c3..5eef7e5 100644
--- 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
@@ -4,10 +4,11 @@
import com.google.gson.reflect.TypeToken
import com.supwisdom.dlpay.api.exception.RequestParamCheckException
import com.supwisdom.dlpay.framework.util.*
-import com.supwisdom.dlpay.util.DESedeUtil
+import com.supwisdom.dlpay.util.DesUtil
class DaliDatasyncParam {
var app_id: String = ""
+ val trans_code: String = ""
var data: String = ""
var count: Int = 0
var timestamp: String = ""
@@ -18,6 +19,9 @@
if (StringUtil.isEmpty(app_id)) {
throw RequestParamCheckException("请求参数错误[应用ID为空]")
}
+ if(StringUtil.isEmpty(trans_code)){
+ throw RequestParamCheckException("请求参数错误[交易类型为空]")
+ }
if (StringUtil.isEmpty(data)) {
throw RequestParamCheckException("请求参数错误[业务参数报文为空]")
}
@@ -37,14 +41,14 @@
}
fun checkSign(key: String): Boolean {
- val signData = "app_id=$app_id&count=$count&data=$data×tamp=$timestamp"
+ val signData = "app_id=$app_id&count=$count&data=$data×tamp=$timestamp&trans_code=$trans_code"
return sign.equals(HmacUtil.HMACSHA256(signData, key), true)
}
fun decData(deskey: String): ArrayList<DaliDatasyncDetail> {
try {
val listType = object : TypeToken<ArrayList<DaliDatasyncDetail>>() {}.type
- val decstr = DESedeUtil.getInstance(deskey).decode(data)
+ val decstr = DesUtil.decode(data, deskey)
return Gson().fromJson(decstr, listType)
} catch (e: Exception) {
throw RequestParamCheckException("数据解密失败!")
@@ -60,6 +64,7 @@
var cardstatus: String = ""
var bankcardno: String? = null
var username: String = ""
+ var sex: String? = null
var idtype: String = ""
var idno: String = ""
var mobile: String? = null
@@ -72,10 +77,10 @@
}
}
-class DaliDatasyncErrorDetail{
- var cardno:String=""
- var errcode:String=""
- var errmsg:String=""
+class DaliDatasyncErrorDetail {
+ var cardno: String = ""
+ var errcode: String = ""
+ var errmsg: String = ""
}
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
index 673b575..f10bf3b 100644
--- 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
@@ -2,6 +2,7 @@
import com.supwisdom.dlpay.agent.AgentCode
import com.supwisdom.dlpay.agent.AgentPayService
+import com.supwisdom.dlpay.agent.DtlStatus
import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
import com.supwisdom.dlpay.agent.service.AgentServiceProxy
import com.supwisdom.dlpay.api.*
@@ -18,6 +19,7 @@
import org.apache.commons.lang3.StringUtils
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.ApplicationContext
+import org.springframework.data.redis.core.RedisTemplate
import org.springframework.http.ResponseEntity
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.*
@@ -50,6 +52,12 @@
@Autowired
private lateinit var agentServiceProxy: AgentServiceProxy
+ @Autowired
+ lateinit var redisTemplate: RedisTemplate<String, String>
+
+ @Autowired
+ private lateinit var qrCodeService: QRCodeService
+
/**
* ============================================================================
* 消费流水结果查询统一接口
@@ -62,7 +70,7 @@
return ResponseEntity.ok(ResponseBodyBuilder.create()
.success(QueryTransDtlResponse(it.refno, it.outTradeNo, it.shopDtl.amount,
it.status, it.sourceType, it.personDtl.payinfo, it.reverseFlag,
- it.shopDtl.transdesc), "查询成功"))
+ it.shopDtl.transdesc,it.personDtl.remark), "查询成功"))
} ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
}
@@ -210,8 +218,8 @@
.fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>"))
}
- fun createAgentService(sourceType: String): AgentPayService {
- return ApplicationUtil.findAgentPayService(applicationContext, sourceType + "Agent")
+ fun <T> createAgentService(sourceType: String): AgentPayService<T> {
+ return ApplicationUtil.findAgentPayService<T>(applicationContext, sourceType + "Agent")
?: throw TransactionCheckException(TradeErrorCode.BUSINESS_DEAL_ERROR,
"支付类型<$sourceType>未定义")
}
@@ -224,7 +232,7 @@
@PostMapping("/citizencard/payfinish")
fun citizencardPayinit(@Valid @RequestBody param: CitizenCardPayfinishParam): ResponseEntity<Any> {
val dtl = transactionService.wip(param.refno)
- val service = createAgentService(TradeDict.PAYTYPE_CITIZEN_CARD)
+ val service = createAgentService<DtlStatus>(TradeDict.PAYTYPE_CITIZEN_CARD)
val resp = service.pay(dtl)
when (resp.code) {
AgentCode.SUCCESS ->
@@ -280,7 +288,7 @@
val cancelTrans = builder.cancelInit(mainDtl.refno, transactionService)
transactionService.wip(cancelTrans.refno)
- val service = createAgentService(mainDtl.sourceType)
+ val service = createAgentService<DtlStatus>(mainDtl.sourceType)
val resp = service.cancel(cancelTrans)
when (resp.code) {
AgentCode.SUCCESS -> {
@@ -334,7 +342,7 @@
}
val refundTrans = builder.refundInit(mainDtl.refno, param.refundAmount / 100.0, transactionService)
transactionService.wip(refundTrans.refno)
- val service = createAgentService(mainDtl.sourceType)
+ val service = createAgentService<Any>(mainDtl.sourceType)
val resp = service.refund(refundTrans)
when (resp.code) {
@@ -465,7 +473,7 @@
.fail(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR,
"支付方式<${qrcode.sourceType}>未配置科目号"))
}
- var systime = systemUtilService.sysdatetime
+ val systime = systemUtilService.sysdatetime
// 2. 记录 qrcode 交易明细表
val qrcodeTrans = agentServiceProxy.qrcodePayTransSaveOrUpdate(
QrcodePayTrans().apply {
@@ -480,17 +488,19 @@
})
// 3. 查询用户身份
- val service = createAgentService(qrcode.sourceType)
+ val service = createAgentService<QrcodePayTrans>(qrcode.sourceType)
val agentResp = service.auth(qrcodeTrans.agentMerchId, qrcodeTrans.billno)
// 4. 重新读取 qrcode 交易明细表,以获取 service.auth 查询后的结果数据
- val qrcodeTransResp = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(qrcodeTrans.agentMerchId,
- qrcodeTrans.billno)
+ // 修改, 通过返回值来判断
+// val qrcodeTransResp = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(qrcodeTrans.agentMerchId,
+// qrcodeTrans.billno)
apiResp.also {
it.sourceType = sourceType.sourceType
it.paydesc = qrcodeSummary(sourceType)
}
return when (agentResp.code) {
AgentCode.SUCCESS -> {
+ val qrcodeTransResp = agentResp.payload
if (!sourceType.anonymousEnable && qrcodeTransResp.isAnonymous) {
ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR,
@@ -504,6 +514,7 @@
}
}
AgentCode.NOT_SUPPORT -> {
+ val qrcodeTransResp = agentResp.payload
if (!sourceType.anonymousEnable) {
ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR,
@@ -607,7 +618,7 @@
//3. 调用第三方支付
transactionService.wip(transaction.refno)
- val service = createAgentService(qrcodeTrans.sourceType)
+ val service = createAgentService<QrcodePayTrans>(qrcodeTrans.sourceType)
apiResponse.apply {
refno = transaction.refno
accdate = transaction.accdate
@@ -618,7 +629,7 @@
val response = service.pay(transaction)
return when (response.code) {
AgentCode.SUCCESS -> {
- transactionService.success(transaction.refno)
+ transactionService.success(transaction.refno, response.agentRefno)
ResponseEntity.ok(ResponseBodyBuilder.create()
.success(apiResponse))
}
@@ -642,8 +653,8 @@
* 第三方(支付宝、微信)支付【交易初始化】
* ============================================================================
* */
- @PostMapping("/thirdpay/payinit")
- fun thirdpayInit(@RequestBody param: ThirdPayinitParam): ResponseEntity<Any> {
+ @PostMapping("/thirdpay/init")
+ fun thirdpayInit(@RequestBody param: ThirdPayinitParam, request: HttpServletRequest): ResponseEntity<Any> {
val dtlType = consumePayService.getDtltypeDictionary(param.dtltype, Dictionary.DTLTYPES)
val sourceType = sourceTypeService.getBySourceType(param.sourceType)
?: return ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -654,16 +665,28 @@
val account = accountUtilServcie.readAccount(param.uid)
val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
val subject = accountUtilServcie.readSubject(sourceType.paySubjno)
- var transcode=0
- when(sourceType.sourceType){
- TradeDict.PAYTYPE_ALIPAY ->transcode = TradeCode.TRANSCODE_ALIPAY
- TradeDict.PAYTYPE_WECHAT ->transcode = TradeCode.TRANSCODE_WECHAT
+ var transcode = 0
+ var des = ""
+ when (param.subType) {
+ TradeDict.PAYTYPE_APP -> {
+ transcode = TradeCode.TRANSCODE_APPPAY;des = "APP内支付"
+ }
+ TradeDict.PAYTYPE_JS -> {
+ transcode = TradeCode.TRANSCODE_JSPAY;des = "JS支付"
+ }
+ TradeDict.PAYTYPE_H5 -> {
+ transcode = TradeCode.TRANSCODE_H5PAY;des = "H5支付"
+ }
+ TradeDict.PAYTYPE_SM -> {
+ transcode = TradeCode.TRANSCODE_SMPAY;des = "小程序支付"
+ }
}
val transaction = TransactionBuilder().apply {
- setTransInfo(param.transdate, param.transtime,transcode,
+ setTransInfo(param.transdate, param.transtime, transcode,
sourceType.sourceType)
setOutTransInfo(shopacc.shopaccno, param.billno)
operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
+ payinfo = sourceType.paydesc + des
}.person(account).apply {
setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
@@ -681,10 +704,28 @@
}
}.init(transactionService)
+ val systime = systemUtilService.sysdatetime
+ if (param.spip.isNullOrEmpty()) {
+ param.spip = request.remoteAddr
+ }
+ // 2. 记录 qrcode 交易明细表
+ agentServiceProxy.qrcodePayTransSaveOrUpdate(
+ QrcodePayTrans().apply {
+ this.agentMerchId = param.shopaccno
+ this.billno = param.billno
+ this.qrcode = "none"
+ this.createTime = systime.sysdate
+ this.hostdate = systime.hostdate
+ this.sourceType = sourceType.sourceType
+ this.isAnonymous = false
+ this.updateTime = systime.sysdate
+ this.refno = transaction.refno
+ this.spip = param.spip
+ })
return ResponseEntity.ok(ResponseBodyBuilder.create()
.success(ThirdPayResponse(transaction.refno,
transaction.outTradeNo,
- transaction.shopDtl.amount,null), "交易初始化成功"))
+ transaction.shopDtl.amount, null), "交易初始化成功"))
}
return ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -697,16 +738,16 @@
* 第三方(支付宝、微信)支付【交易确认】
* ============================================================================
* */
- @PostMapping("/thirdpay/payfinish")
+ @PostMapping("/thirdpay/finish")
fun thirdpayFinish(@RequestBody param: ThirdPayfinishParam): ResponseEntity<Any> {
val dtl = transactionService.wip(param.refno)
- var type=""
- if(dtl.transCode== TradeCode.TRANSCODE_ALIPAY){
+ var type = ""
+ if (dtl.transCode == TradeCode.TRANSCODE_ALIPAY) {
type = TradeDict.PAYTYPE_ALIPAY
- }else if(dtl.transCode== TradeCode.TRANSCODE_WECHAT){
+ } else if (dtl.transCode == TradeCode.TRANSCODE_WECHAT) {
type = TradeDict.PAYTYPE_WECHAT
}
- val service = createAgentService(type)
+ val service = createAgentService<QrcodePayTrans>(type)
val resp = service.pay(dtl)
when (resp.code) {
AgentCode.SUCCESS ->
@@ -714,7 +755,7 @@
return ResponseEntity.ok(ResponseBodyBuilder.create()
.success(ThirdPayResponse(it.refno,
it.outTradeNo,
- it.shopDtl.amount,resp.agentBody), "交易确认成功"))
+ it.shopDtl.amount, resp.agentBody), "交易确认成功"))
}
AgentCode.REQUIRE_QUERY -> {
@@ -722,14 +763,36 @@
return ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(ThirdPayResponse(dtl.refno,
dtl.outTradeNo,
- dtl.shopDtl.amount,resp.agentBody), TradeErrorCode.WAIT_QUERY_RESULT, "请查询支付结果"))
+ dtl.shopDtl.amount, resp.agentBody), TradeErrorCode.WAIT_QUERY_RESULT, "请查询支付结果"))
}
else -> //失败
transactionService.fail(param.refno, resp.agentMsg).let {
return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(ThirdPayResponse(dtl.refno, dtl.outTradeNo, dtl.shopDtl.amount,resp.agentBody),
+ .fail(ThirdPayResponse(dtl.refno, dtl.outTradeNo, dtl.shopDtl.amount, resp.agentBody),
TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${resp.agentMsg}"))
}
}
}
+
+ /**
+ * ============================================================================
+ * 门禁码查询接口
+ * ============================================================================
+ * */
+ @PostMapping("/qrcodequery")
+ fun qrcodeQuery(@RequestBody param: DoorQRCodeParam): ResponseEntity<Any> {
+ val token = redisTemplate.opsForValue().get(param.qrcode)
+ if (token.isNullOrEmpty()) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(1, "二维码不存在或已失效"))
+ }
+ val ret = qrCodeService.decodeCode(token)
+ return if (ret.retcode == 0) {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .success(ret, "成功"))
+ } else {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(ret.retcode, ret.retmsg))
+ }
+ }
}
\ 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
index 5f08635..32c43b6 100644
--- 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
@@ -1,58 +1,71 @@
package com.supwisdom.dlpay.api.controller
import com.google.gson.Gson
+import com.supwisdom.dlpay.api.bean.DaliDatasyncDetail
import com.supwisdom.dlpay.api.bean.DaliDatasyncErrorDetail
import com.supwisdom.dlpay.api.bean.DaliDatasyncParam
import com.supwisdom.dlpay.api.exception.RequestParamCheckException
import com.supwisdom.dlpay.api.service.DaliDatasyncService
import com.supwisdom.dlpay.framework.ResponseBodyBuilder
import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.tenant.TenantContext
+import com.supwisdom.dlpay.framework.util.Constants
+import com.supwisdom.dlpay.framework.util.DateUtil
import com.supwisdom.dlpay.framework.util.StringUtil
import com.supwisdom.dlpay.framework.util.SysparaUtil
+import mu.KotlinLogging
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
+import java.io.*
+import java.nio.charset.Charset
-@RequestMapping("/api/common")
+@RequestMapping("/api/common/dlcard")
+@RestController
class DaliDatasyncApiController {
@Autowired
lateinit var systemUtilService: SystemUtilService
@Autowired
lateinit var daliDatasyncService: DaliDatasyncService
+ private val logger = KotlinLogging.logger { }
+
/**
* ============================================================================
* 大理卡管系统推送市民卡信息同步接口
* ============================================================================
* */
@PostMapping("/datasync")
- @ResponseBody
fun daliDatasync(@RequestBody param: DaliDatasyncParam): ResponseEntity<Any> {
try {
+ if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID) //fixme: tenantid设置
param.checkParam()
val appid = systemUtilService.getSysparaValue(SysparaUtil.DLCARDMANAGER_APPID)
val appkey = systemUtilService.getSysparaValue(SysparaUtil.DLCARDMANAGER_SECRET)
val deskey = systemUtilService.getSysparaValue(SysparaUtil.DLCARDMANAGER_DESKEY)
if (StringUtil.isEmpty(appid) || StringUtil.isEmpty(appkey) || StringUtil.isEmpty(deskey)) {
return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("trans_code", param.trans_code)
.fail(1000, "系统参数未配置"))
} else if (appid != param.app_id) {
throw RequestParamCheckException("请求参数错误[应用ID错误]")
}
if (!param.checkSign(appkey)) {
return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("trans_code", param.trans_code)
.fail(2001, "签名错误"))
}
val datalist = param.decData(deskey)
if (param.count != datalist.size) {
return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("trans_code", param.trans_code)
.fail(2002, "请求参数错误[数据条数不匹配]"))
}
var errlist = ArrayList<DaliDatasyncErrorDetail>(0)
- datalist.forEach {detail->
+ datalist.forEach { detail ->
try {
detail.checkParam()
daliDatasyncService.doUpdateUserInfos(detail)
@@ -60,29 +73,178 @@
errlist.add(DaliDatasyncErrorDetail().apply {
cardno = detail.cardno
errcode = "2001"
- errmsg = e1.message?:"明细数据关键字段为空"
+ errmsg = e1.message ?: "明细数据关键字段为空"
})
- }catch (e2: Exception){
+
+ try {
+ daliDatasyncService.saveUpdateUserinfoErrors(detail, e1.message ?: "明细数据关键字段为空") //记录失败数据
+ } catch (e3: Exception) {
+ logger.error("保存错误同步数据失败" + Gson().toJson(detail))
+ e3.printStackTrace()
+ }
+
+ } catch (e2: Exception) {
errlist.add(DaliDatasyncErrorDetail().apply {
cardno = detail.cardno
errcode = "3000"
- errmsg = e2.message?:"明细处理错误"
+ errmsg = e2.message ?: "明细处理错误"
})
+
+ try {
+ daliDatasyncService.saveUpdateUserinfoErrors(detail, e2.message ?: e2.javaClass.name) //记录失败数据
+ } catch (e4: Exception) {
+ logger.error("保存错误同步数据失败" + Gson().toJson(detail))
+ e4.printStackTrace()
+ }
}
}
- return when(StringUtil.isEmpty(errlist)){
+ return when (StringUtil.isEmpty(errlist)) {
true -> ResponseEntity.ok(mapOf("retcode" to "0000", "retmsg" to "SUCCESS", "resultcode" to "0000", "resultmsg" to ""))
- false -> ResponseEntity.ok(mapOf("retcode" to "0000", "retmsg" to "请求成功接收", "resultcode" to "4000", "resultmsg" to "明细数据处理有错", "data" to Gson().toJson(errlist)))
+ false -> ResponseEntity.ok(mapOf("retcode" to "0000", "retmsg" to "请求成功接收", "resultcode" to "4000", "trans_code" to param.trans_code, "resultmsg" to "明细数据处理有错", "data" to Gson().toJson(errlist)))
}
} catch (ex: RequestParamCheckException) {
return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("trans_code", param.trans_code)
.fail(2001, ex.message ?: "请求参数错误"))
} catch (e: Exception) {
e.printStackTrace()
return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("trans_code", param.trans_code)
.fail(4000, "系统处理错误"))
}
}
+ /**
+ * ============================================================================
+ * 大理卡管系统第一次初始化数据txt导入接口
+ * ============================================================================
+ * */
+ @GetMapping("/import")
+ fun importDaliInitData(@RequestParam("filename") filename: String): ResponseEntity<Any> {
+ if (StringUtil.isEmpty(filename)) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(30001, "请输入初始化数据txt文件全路径名"))
+ } else if (!filename.endsWith(".txt")) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(30001, "请输入初始化数据txt文件"))
+ }
+
+ try {
+ if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID) //fixme: tenantid设置
+ val txtFile = File(filename)
+ val batchSize = 1000
+ var sumCount = 0
+ var failCount = 0
+
+ txtFile.bufferedReader(Charset.forName("GBK")).use { reader ->
+ val header = reader.readLine()
+ val fields = header.split("|")
+
+ var datalist = ArrayList<DaliDatasyncDetail>()
+ while (true) {
+ val line = reader.readLine() ?: break
+ if (StringUtil.isEmpty(line)) continue
+ val column = line.split("|")
+ val bean = DaliDatasyncDetail()
+ StringUtil.transforToBean(fields, column, bean)
+ datalist.add(bean)
+ sumCount++
+ if (datalist.size >= batchSize) {
+ val fcnt = doBatchSaveData(datalist) //保存
+ failCount += fcnt
+ datalist.clear()
+ }
+ }
+
+ //保存最后的不足batchSize的记录
+ if (datalist.size > 0) {
+ val fcnt = doBatchSaveData(datalist) //保存
+ failCount += fcnt
+ }
+ }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("totalcnt", sumCount)
+ .data("failcnt", failCount)
+ .data("successcnt", sumCount - failCount)
+ .success("导入请求成功"))
+
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .exception(4000, ex, "处理异常!" + (ex.message ?: ex.javaClass.name)))
+ }
+
+ }
+
+ private fun doBatchSaveData(list: ArrayList<DaliDatasyncDetail>): Int {
+ try {
+ daliDatasyncService.doBatchSaveOrUpdateUserInfos(list)
+ return 0 //批量保存成功,无失败
+ } catch (e1: Exception) {
+ }
+
+ //批量保存有异常,逐笔保存
+ var failcnt = 0
+ for (bean in list) {
+ try {
+ bean.checkParam()
+ daliDatasyncService.doUpdateUserInfos(bean)
+ } catch (e2: Exception) {
+ failcnt++
+ try {
+ daliDatasyncService.saveUpdateUserinfoErrors(bean, e2.message ?: e2.javaClass.name)
+ } catch (e3: Exception) {
+ logger.error("初始化txt文件保存错误同步数据失败" + Gson().toJson(bean))
+ e3.printStackTrace()
+ }
+ continue
+ }
+ }
+ return failcnt
+ }
+
+ /**
+ * ============================================================================
+ * 大理卡管系统错误同步信息补处理
+ * ============================================================================
+ * */
+ @GetMapping("/dealerror")
+ fun doDealErrorRecord(@RequestParam(name = "tempid", required = false, defaultValue = "") tempid: String,
+ @RequestParam(name = "updtime", required = false, defaultValue = "") updtime: String): ResponseEntity<Any> {
+ if (StringUtil.isEmpty(tempid) && !DateUtil.checkDatetimeValid(updtime, DateUtil.DATETIME_FMT)) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(99, "请求参数错误[tempid和updtime不能同时为空]"))
+ }
+
+ try {
+ if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID) //fixme: tenantid设置
+ var totalcnt = 0
+ var failcnt = 0
+ var detailMsg = ""
+ daliDatasyncService.getErrorUpdateUserinfos(tempid, updtime).forEach {
+ totalcnt++
+ try {
+ daliDatasyncService.dealErrorRecord(it)
+ } catch (e1: Exception) {
+ failcnt++
+ detailMsg += ("${it.cardno}同步出错:" + (e1.message ?: e1.javaClass.name) + "\n")
+ }
+ }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("totalcnt", totalcnt)
+ .data("failcnt", failcnt)
+ .data("successcnt", totalcnt - failcnt)
+ .data("detailmsg", detailMsg)
+ .success("导入成功"))
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .exception(99, ex, "处理异常!" + (ex.message ?: ex.javaClass.name)))
+ }
+ }
+
+
}
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
index 51ed2ef..3a133e2 100644
--- 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
@@ -1,15 +1,13 @@
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 com.supwisdom.dlpay.agent.AgentCode
+import com.supwisdom.dlpay.agent.service.AlipayService
+import com.supwisdom.dlpay.agent.service.WechatService
+import com.supwisdom.dlpay.framework.tenant.TenantContext
+import org.dom4j.Element
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
@@ -26,17 +24,16 @@
class NotifyController {
private val logger = LoggerFactory.getLogger(NotifyController::class.java)
@Autowired
- lateinit var paytypeService: SourceTypeService
+ lateinit var alipayService: AlipayService
@Autowired
- lateinit var accountUtilServcie: AccountUtilServcie
+ lateinit var wechatService: WechatService
- @Autowired
- lateinit var transactionService: TransactionService
-
- @RequestMapping(value = ["/wechat"])
+ @RequestMapping(value = ["/wechat/{schema}"])
@ResponseBody
fun index(@PathVariable schema: String, request: HttpServletRequest,
response: HttpServletResponse): String {
+ logger.error("====================== 收到微信回调通知 wechat notify: ========================")
+ TenantContext.setTenantSchema(schema)
try {
// 解析结果存储在HashMap
var map: MutableMap<String, String> = HashMap()
@@ -47,7 +44,7 @@
// 得到xml根元素
val root = document.rootElement
// 得到根元素的所有子节点
- val elementList = root.elements()
+ val elementList = root.elements() as MutableList<Element>
// 遍历所有子节点
for (e in elementList) {
map[e.name] = e.text
@@ -55,44 +52,49 @@
}
// 释放资源
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>"
+ val resp = wechatService.doNotify(map)
+ return if (resp.code == AgentCode.SUCCESS) {
+ "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"
+ } else {
+ "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[" + resp.agentMsg + "]]></return_msg></xml>"
}
- map = StringUtil.paraFilter(map)
- //TODO 校验签名
- var signStr = StringUtil.createLinkString(map)
- val config = paytypeService.getSourceTypeConfigBySourceType(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>"
}
}
+
+ private fun makeMapFromParam(request: HttpServletRequest): Map<String, String> {
+ val map = mutableMapOf<String, String>()
+ val paramNames = request.parameterNames
+ while (paramNames.hasMoreElements()) {
+ val paramName = paramNames.nextElement() as String
+ val paramValues = request.getParameterValues(paramName)
+ if (paramValues.size == 1) {
+ val paramValue = paramValues[0]
+ if (paramValue.isNotEmpty()) {
+ map[paramName] = paramValue
+ logger.error("$paramName=$paramValue")
+ }
+ }
+ }
+ return map
+ }
+
+ @RequestMapping(value = ["/alipay/{schema}"])
+ @ResponseBody
+ fun alipay(@PathVariable schema: String, request: HttpServletRequest,
+ response: HttpServletResponse): String {
+ logger.error("====================== 收到支付宝回调通知 alipay notify: ========================")
+ TenantContext.setTenantSchema(schema)
+ // 解析结果存储在HashMap
+ val map = makeMapFromParam(request)
+ val resp = alipayService.doNotify(map)
+ return if (resp.code == AgentCode.SUCCESS) {
+ "success"
+ } else {
+ "failure"
+ }
+ }
}
\ 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
index 551b7c6..3688191 100644
--- 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
@@ -2,19 +2,20 @@
import com.supwisdom.dlpay.api.bean.ModifyUserParam
import com.supwisdom.dlpay.api.bean.OpenUserParam
+import com.supwisdom.dlpay.api.bean.QueryCardsParam
import com.supwisdom.dlpay.api.bean.QueryUserParam
import com.supwisdom.dlpay.api.exception.RequestParamCheckException
+import com.supwisdom.dlpay.api.service.CardService
+import com.supwisdom.dlpay.api.service.KafkaSendMsgService
import com.supwisdom.dlpay.api.service.UserService
import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.exception.TransactionProcessException
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 org.springframework.web.bind.annotation.*
import java.net.URLDecoder
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
@@ -24,6 +25,11 @@
class UserAPIController {
@Autowired
private lateinit var useService: UserService
+ @Autowired
+ private lateinit var cardService: CardService
+ @Autowired
+ private lateinit var kafkaSendMsgService: KafkaSendMsgService
+
@PostMapping("/open")
fun openAccount(@RequestBody param: OpenUserParam): ResponseEntity<Any> {
@@ -102,11 +108,11 @@
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()
+ return if (useService.modifyUserInfo(it, param)) {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
.success("修改成功"))
} else {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
+ ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "账户信息修改失败"))
}
}
@@ -121,6 +127,37 @@
.transException(et, "业务处理错误"))
}
}
+ @PostMapping("/querybycardno")
+ fun querybycardno(@RequestBody param: QueryUserParam): ResponseEntity<Any> {
+ val ret = when (!param.userid.isNullOrEmpty()) {
+ true -> cardService.getPersonByUserid(param.userid)
+ false -> cardService.getPersonByCardno(param.citizencardno, param.bankcardno)
+ }
+ return if(ret.retcode==0){
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .success(ret,"ok"))
+ }else{
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(ret.retcode, ret.retmsg))
+ }
+ }
+ @PostMapping("/querycards")
+ fun querycards(@RequestBody param: QueryCardsParam): ResponseEntity<Any> {
+ val ret = cardService.getCardsByLastsaveDate(param.starttime, param.endtime)
+ return if(ret.retcode==0){
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .success(ret,"ok"))
+ }else{
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(ret.retcode, ret.retmsg))
+ }
+ }
+ @PostMapping("/testmsg")
+ fun testmsg(): ResponseEntity<Any> {
+ kafkaSendMsgService.sendJpushMessage("402882816c2727a2016c2728165f0001","交易提醒","你有一笔0.01元的支出,点击查看详情","20190725133506000018", mutableMapOf(),"")
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .success("ok"))
+ }
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt
new file mode 100644
index 0000000..7da32f1
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt
@@ -0,0 +1,421 @@
+package com.supwisdom.dlpay.api
+
+import com.supwisdom.dlpay.agent.AgentCode
+import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.CheckFileProvider
+import com.supwisdom.dlpay.api.domain.TSourceType
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus
+import com.supwisdom.dlpay.api.domain.TTransactionChkfile
+import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.service.TransactionReconciliationService
+import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.tenant.TenantContext
+import com.supwisdom.dlpay.framework.util.Constants
+import com.supwisdom.dlpay.framework.util.DateUtil
+import com.supwisdom.dlpay.util.ConstantUtil
+import mu.KotlinLogging
+import net.javacrumbs.shedlock.core.SchedulerLock
+import org.springframework.beans.BeansException
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.ApplicationContext
+import org.springframework.scheduling.annotation.Async
+import org.springframework.scheduling.annotation.AsyncResult
+import org.springframework.scheduling.annotation.Scheduled
+import org.springframework.stereotype.Component
+import java.util.concurrent.Future
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.TimeoutException
+
+/**
+ * 对账业务主要由三张表组成 TSourceTypeCheckStatus(对账状态表), TTransactionChkfile(对账文件表), TTransactionChkDtl(对账明细表)
+ * 对账状态表有五个状态:
+ * 1. checkFileOk: 表示对账文件是否成功导入对账文件表和对账明细表中。对应的"对账文件表"的 status 应该是 unchecked。
+ * 2. checkStatus: 表示核对流水任务是否完成,当核对完成后根据对账文件表的 status 字段来判断,只有当 status 是 finish
+ * 时 checkStatus 才是 true。
+ * 3. repairStatus: 表示核对完成,并且可以进行补帐交易。同时根据对"对账文件表"的对账结果(result)来判断是否完成核对,只有当 result
+ * 是 "一致" 或 "不平" 时 repairStatus 才为 true。对账任务判断 repairStatus == true 之后将会对所有不一致的交易进行补帐。
+ * 4. settleStatus: 表示本次对账完成(核对与补帐都完成),对账任务会在补帐完成后将 settleStatus 置为 true。
+ * 同时 TTransactionChkDtl 的 resovled 状态全部为 'equal'。系统结算任务只有当 settleStatus == true 的时候才会进行
+ * 5. forceRecheck : 表示对当前的 checkDate 的对账文件重新下载并对账
+ *
+ *
+ * 对账文件表的 status 表示本次核对的结果。对账文件表 status 有几种情况:
+ * 1. 初始状态(init),表示对账任务已经触发;
+ * 2. 待核对状态(unchecked), 表示对账文件已存入数据库中;
+ * 3. 错误状态(error), 保存数据有错误
+ * 4. 完成状态(finish) , 表示核对完成状态;
+ *
+ * 对账文件表的对账结果字段(result) 表示本次对账处理结果:
+ * 1. 未核对(none), 表示还未与流水进行比对
+ * 2. 一致( equal), 表示对账完全一致
+ * 3. 不平( notequal), 表示对账不一致,但可以通过补帐交易完成结算
+ * 4. 错误( error ) , 表示核对时数据校验不正确,系统不能通过补帐交易完成结算。需人工审核对账文件后,重新下载对账单并核对。
+ *
+ *
+ * 对账明细表(TTransactionChkDtl) 的 chkstatus 表示核对结果:
+ * 1. 未检查(uncheck), 表示记录还未核对
+ * 2. 一致( equal) ,表示记录核对与流水一致
+ * 3. 交易流水不存在(notexist), 表示本地交易流水不存在,影响对账文件表的 result 状态,为error。
+ * 4. 支付未记账 ( nocharge) ,表示本地流水未成功,需要补帐
+ * 5. 金额不相等(diff), 表示对账明细金额与本地流水不一致, 影响对账文件表的 result 状态,为error。
+ * 6. 本地多流水 (surplus), 表示本地的成功流水在对账单中不存在, 影响对账文件表的 result 状态,为error。
+ * 6. 记账日期或支付方式错误 (error) , 其它类型错误,影响对账文件表的 result 状态,为error。
+ *
+ * 对账明细表(TTransactionChkDtl) 的 result 表示处理结果
+ * 1. 需要补帐("add")
+ * 2. 一致("equal") , 表示一致
+ * 3. 挂起("hangup"), 表示补帐出现异常
+ */
+@Component
+class SourceTypeCheck {
+ private val logger = KotlinLogging.logger { }
+
+ @Autowired
+ private lateinit var sourceTypeService: SourceTypeService
+
+ @Autowired
+ private lateinit var systemUtilService: SystemUtilService
+
+ @Autowired
+ private lateinit var sourceTypeCheckExecutor: SourceTypeCheckExecutor
+
+ private fun newSourceTypeStatus(sourceType: TSourceType, accdate: String): TSourceTypeCheckStatus {
+ return sourceTypeService.saveOrUpdateSourceTypeCheckStatus(TSourceTypeCheckStatus().apply {
+ this.sourceType = sourceType.sourceType
+ this.startAccdate = accdate
+ this.checkAccdate = accdate
+ this.checkFileOk = false
+ this.checkStatus = false
+ this.repairStatus = false
+ this.settleStatus = false
+ this.forceRecheck = false
+ this.lastUpdate = systemUtilService.sysdatetime.sysdate
+ this.tenantId = sourceType.tenantid
+ this.chkfileUrl = null
+ this.remark = null
+ })
+ }
+
+ private fun canStartCheck(sourcetype: TSourceType): Boolean {
+ val hosttime = systemUtilService.sysdatetime.hosttime
+ if (DateUtil.checkDatetimeValid(sourcetype.startChktime, DateUtil.TIME_FMT) && DateUtil.compareDatetime(hosttime, sourcetype.startChktime, DateUtil.TIME_FMT) <= 0) {
+ return false //sourcetype 设定了每天开始对账时间,小于这个对账时间不能对账
+ }
+ return true
+ }
+
+ private fun determineSourceTypeCheck(sourcetype: TSourceType): TSourceTypeCheckStatus? {
+ try {
+ if (!sourcetype.checkable || !sourcetype.enable) {
+ return null
+ }
+
+ val accdate = systemUtilService.accdate
+ var status = sourceTypeService.getSourceTypeCheckStatus(sourcetype.sourceType)
+ ?: newSourceTypeStatus(sourcetype, accdate)
+
+ if (status.settleStatus) {
+ //已完成清算可以结算了,直接切换到下一天
+ val nextday = DateUtil.getNewDay(status.checkAccdate, 1)
+ status = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(status.apply {
+ this.checkAccdate = nextday
+ this.checkFileOk = false
+ this.checkStatus = false
+ this.repairStatus = false
+ this.settleStatus = false
+ this.forceRecheck = false
+ this.chkfileUrl = null
+ this.remark = null
+ }) //更新
+ }
+
+ val interval = DateUtil.getIntervalDay(status.checkAccdate, accdate).toInt()
+ when {
+ interval > sourcetype.tplusN -> {
+ if (!status.settleStatus) {
+ //未结算过,继续
+ return status
+ }
+ return null
+ }
+ interval == sourcetype.tplusN -> {
+ //对最后一天的账(比如:T+1对昨天的帐,需判断可以对账的起始时间)
+ if (!status.settleStatus && canStartCheck(sourcetype)) {
+ return status
+ }
+ return null
+ }
+ else -> // 其它条件不对账
+ return null
+ }
+
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ return null
+ }
+ }
+
+ @Scheduled(cron = "\${payapi.sourcetype.checker.scheduler:-}")
+ @SchedulerLock(name = "payapiSourceTypeCheckLock", lockAtMostForString = "PT30M")
+ fun runCheck() {
+ if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID)
+
+ val allSourcetype = sourceTypeService.allEnabledSourcetype
+ ?: return
+
+ val checkFileStatus = allSourcetype.mapNotNull {
+ determineSourceTypeCheck(it)
+ }
+
+ val checkProcessResult = checkFileStatus.map {
+ // 对账文件是否下载完成
+ if (it.checkFileOk && !it.forceRecheck) {
+ // 开始对账
+ sourceTypeCheckExecutor.reconciliation(it)
+ } else {
+ // 开始下载对账文件
+ sourceTypeCheckExecutor.checkAndDownloadChkfile(it)
+ }
+ }.toMutableList()
+
+ val finishResult: MutableList<Future<SourceTypeCheckExecutor.ExecutorResult>> = mutableListOf()
+ val newPrcResult: MutableList<Future<SourceTypeCheckExecutor.ExecutorResult>> = mutableListOf()
+ while (checkProcessResult.isNotEmpty()) {
+ checkProcessResult.forEach {
+ try {
+ val result = it.get(10, TimeUnit.SECONDS)
+ if (result.code == SourceTypeCheckExecutor.SUCCESS) {
+ // 完成对账文件下载 但 还未对账
+ if (result.status.checkFileOk && !result.status.settleStatus) {
+ newPrcResult.add(sourceTypeCheckExecutor.reconciliation(result.status))
+ } else if (!result.status.checkFileOk) {
+ logger.error {
+ "sourcetype <${result.status.sourceType}> get checkfile error," +
+ "<${result.message}>"
+ }
+ } else if (result.status.checkFileOk && result.status.settleStatus) {
+ logger.info {
+ "sourcetype <${result.status.sourceType}> " +
+ "date <${result.status.checkAccdate}> 对账成功"
+ }
+ }
+ } else if (result.code == SourceTypeCheckExecutor.WAIT) {
+ newPrcResult.add(sourceTypeCheckExecutor.checkAndDownloadChkfile(result.status))
+ } else {
+ logger.error {
+ "sourcetype <${result.status.sourceType}> 对账状任务错误, error=" +
+ "<${result.message}>"
+ }
+ }
+ finishResult.add(it)
+ } catch (ex: TimeoutException) {
+ // async task not finished
+ }
+ }
+ finishResult.takeIf { it.isNotEmpty() }?.also { list ->
+ checkProcessResult.removeIf { list.contains(it) }
+ list.clear()
+ }
+ newPrcResult.takeIf { it.isNotEmpty() }?.also {
+ checkProcessResult.addAll(it)
+ it.clear()
+ }
+ }
+ }
+}
+
+@Component
+class SourceTypeCheckExecutor {
+ companion object {
+ const val SUCCESS = "success"
+ const val FAIL = "fail"
+ const val WAIT = "wait"
+ }
+
+ class ExecutorResult(val status: TSourceTypeCheckStatus,
+ val code: String, val message: String);
+
+ @Autowired
+ private lateinit var applicationContext: ApplicationContext
+
+ @Autowired
+ private lateinit var transactionReconciliationService: TransactionReconciliationService
+
+ @Autowired
+ private lateinit var sourceTypeService: SourceTypeService
+
+ private val logger = KotlinLogging.logger { }
+
+ private fun getProvider(sourcetype: String): CheckFileProvider? {
+ return try {
+ applicationContext.getBean("${sourcetype}CheckFileProvider") as CheckFileProvider
+ } catch (ex: BeansException) {
+ logger.error { "未定义 sourcetype <$sourcetype> 对账处理 Provider" }
+ null
+ }
+ }
+
+ private fun downloadFile(provider: CheckFileProvider, checkStatus: TSourceTypeCheckStatus): ExecutorResult {
+ return provider.downloadCheckFile(checkStatus).let { resp ->
+ when {
+ resp.code == AgentCode.SUCCESS -> ExecutorResult(resp.payload, SUCCESS, "成功")
+ resp.code == AgentCode.REQUIRE_QUERY -> ExecutorResult(resp.payload, WAIT, "等待查询对账文件")
+ else -> ExecutorResult(checkStatus, FAIL, resp.agentMsg)
+ }
+ }
+ }
+
+ @Async("sourcetypeCheckTaskExecutor")
+ fun checkAndDownloadChkfile(checkStatus: TSourceTypeCheckStatus): Future<ExecutorResult> {
+ // 2. 根据对账日期下载对账文件
+ try {
+ if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(checkStatus.tenantId)
+ if (checkStatus.settleStatus) {
+ return AsyncResult(ExecutorResult(checkStatus, FAIL, "[${checkStatus.checkAccdate}]日对账已完成"))
+ }
+
+ val result = getProvider(checkStatus.sourceType)?.let { provider ->
+ val acResp = provider.acquireCheckFile(checkStatus)
+ if (acResp.code == AgentCode.REQUIRE_QUERY) {
+ var success: AgentResponse<TSourceTypeCheckStatus> =
+ AgentResponse<TSourceTypeCheckStatus>().apply {
+ code = AgentCode.FAIL
+ }
+ repeat(10) {
+ if (success.code != AgentCode.SUCCESS) {
+ Thread.sleep(3000)
+ success = provider.queryCheckFile(acResp.payload)
+ }
+ }
+ if (success.code == AgentCode.SUCCESS) {
+ downloadFile(provider, success.payload)
+ } else {
+ ExecutorResult(success.payload, FAIL, "下载失败,未能查到对账文件")
+ }
+ } else if (acResp.code == AgentCode.SUCCESS) {
+ if (!acResp.payload.checkFileOk) {
+ downloadFile(provider, acResp.payload)
+ } else {
+ ExecutorResult(acResp.payload, SUCCESS, acResp.agentMsg)
+ }
+ } else {
+ ExecutorResult(acResp.payload, FAIL, acResp.agentMsg)
+ }
+ } ?: ExecutorResult(checkStatus, FAIL, "未定义 CheckFileProvider")
+ return AsyncResult(result)
+ } catch (ex: Exception) {
+ return AsyncResult(ExecutorResult(checkStatus, FAIL, ex.message ?: "下载对账单异常"))
+ }
+
+ }
+
+ @Async("sourcetypeCheckTaskExecutor")
+ fun reconciliation(checkStatus: TSourceTypeCheckStatus): Future<ExecutorResult> {
+ // 3. 完成对账
+ if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(checkStatus.tenantId)
+ if (!checkStatus.checkFileOk) {
+ return AsyncResult(ExecutorResult(checkStatus, FAIL, "checkAccdate=[${checkStatus.checkAccdate}]对账单未完成下载,不能对账"))
+ } else if (checkStatus.settleStatus) {
+ //当天已完成对账
+ return AsyncResult(ExecutorResult(checkStatus, SUCCESS, "checkAccdate=[${checkStatus.checkAccdate}]对账已成功"))
+ }
+
+ val result = transactionReconciliationService.getTransactionChkfile(checkStatus.checkAccdate, checkStatus.sourceType)?.let { chkfile ->
+ try {
+ val chkStatus = doCheckProcess(chkfile, checkStatus) //执行对账过程
+ when (chkStatus.settleStatus) {
+ true -> ExecutorResult(chkStatus, SUCCESS, "对账成功,双方一致")
+ false -> ExecutorResult(chkStatus, FAIL, chkfile.remark)
+ }
+ } catch (ex: Exception) {
+ ex.printStackTrace()
+ ExecutorResult(checkStatus, FAIL, "对账异常")
+ }
+ } ?: ExecutorResult(checkStatus, FAIL, "未找到[${checkStatus.checkAccdate}]日入库的对账数据")
+
+// val result = if (!checkStatus.checkStatus) {
+// transactionReconciliationService
+// .getTransactionChkfile(checkStatus.checkAccdate, checkStatus.sourceType)?.let { chkfile ->
+// try {
+// when (doCheckProcess(chkfile, checkStatus).result) {
+// ConstantUtil.CHKFILE_RESULT_EQUAL -> {
+// ExecutorResult(checkStatus, SUCCESS, "对账成功,双方一致")
+// }
+// else -> ExecutorResult(checkStatus, FAIL, "对账不平")
+// }
+// } catch (ex: Exception) {
+// ex.printStackTrace()
+// ExecutorResult(checkStatus, FAIL, "对账异常")
+// }
+// } ?: ExecutorResult(checkStatus, FAIL, "未找到[${checkStatus.checkAccdate}]日入库的对账数据")
+// } else if (checkStatus.repairStatus) {
+// // 补帐逻辑
+// ExecutorResult(checkStatus, SUCCESS, "对账成功,双方一致")
+// } else if (checkStatus.settleStatus) {
+// ExecutorResult(checkStatus, SUCCESS, "对账完成,可以结算")
+// } else {
+// ExecutorResult(checkStatus, FAIL, "未找到[${checkStatus.checkAccdate}]日入库的对账数据")
+// }
+ return AsyncResult(result)
+ }
+
+ fun doCheckProcess(chkfile: TTransactionChkfile, checkStatus: TSourceTypeCheckStatus): TSourceTypeCheckStatus {
+ //step1: 假设绝大多数记录都是一致的情况下,下面的逻辑采用每1000条批量处理提高性能,统一处理交易一致的记录
+ (0..chkfile.othercnt step 1000).forEach {
+ try {
+ transactionReconciliationService.doCheckEqualTransdtls(chkfile, it)
+ } catch (e1: Exception) {
+ }
+ }
+
+ //step2: 剩余的未对账记录逐一对比, 这个规则业务可以处理 "对账1" 中可能漏掉的记录
+ transactionReconciliationService.getUncheckTransactionChkdtls(chkfile.id).forEach {
+ transactionReconciliationService.doCheckTransactionChkdtl(it)
+ }
+
+ //step3: 判断chkdtl是否全部对账完成
+ if (transactionReconciliationService.checkUncheckExists(chkfile.id)) {
+ throw TransactionException(-2, "存在未对账的明细记录")
+ }
+
+ //step4: 判断本地是否有多余成功流水,并保存recordno为负值
+ try {
+ transactionReconciliationService.doCheckLocalMoreDtls(chkfile)
+ } catch (e1: TransactionException) {
+ //本地数据存在异常
+ checkStatus.checkStatus = false
+ checkStatus.repairStatus = false
+ checkStatus.settleStatus = false
+ checkStatus.remark = e1.message
+ return sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus)
+ }
+
+ /**
+ * 当我们将每条明细进行核对后,需要明确是否对账完成、是否可以补帐和是否可以结算
+ * 1. 对账完成是指每条对账明细只存在两种状态 CHKDTL_CHKRESULT_EQUAL , CHKDTL_CHKRESULT_NOCHARGE。其它状态都是异常状态
+ * 2. 对"是否可以补帐"的定义是必须"对账完成"
+ * 3. 当所有明细完成对账或补帐才能结算
+ */
+ transactionReconciliationService.doFinishChkfileStatus(chkfile, checkStatus) //乐观锁,此事务不更新数据库。否则会影响两表的version
+
+ //补账, result为equal或unequal时补帐,error跳过
+ if (checkStatus.checkStatus && checkStatus.repairStatus) {
+ transactionReconciliationService.getNeedRepairChkdtls(chkfile).forEach { chkdtl ->
+ try {
+ transactionReconciliationService.doRepairTransactionChkdtl(chkdtl) //补账
+ } catch (e2: Exception) {
+ try {
+ transactionReconciliationService.saveOrUpdateTransctionChkdtl(chkdtl.apply {
+ this.resolved = ConstantUtil.CHKDTL_RESOLVED_FAIL
+ this.remark = e2.message ?: e2.javaClass.name
+ }) //补账失败,记录错误
+ } catch (e3: Exception) {
+ }
+ }
+ }
+ }
+
+ return transactionReconciliationService.doConfirmChkfileStatus(chkfile, checkStatus)
+ }
+}
\ 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
index 35136c5..1d8e2fc 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
@@ -101,7 +101,7 @@
return
}
- val service = ApplicationUtil.findAgentPayService(applicationContext, dtl.sourceType + "Agent")
+ val service = ApplicationUtil.findAgentPayService<Any>(applicationContext, dtl.sourceType + "Agent")
val resp = service.query(dtl)
when (resp.code) {
AgentCode.SUCCESS -> {
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_ynrccchk_task.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_ynrccchk_task.kt
index e721a02..b1bc339 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_ynrccchk_task.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_ynrccchk_task.kt
@@ -15,6 +15,19 @@
import org.springframework.stereotype.Component
import org.springframework.web.client.RestTemplate
+import com.sun.jersey.api.client.Client
+import com.sun.jersey.api.client.ClientResponse
+import com.supwisdom.dlpay.api.bean.YnrccChkfileBean
+import com.supwisdom.dlpay.api.domain.TTransactionChkfile
+import com.supwisdom.dlpay.framework.tenant.TenantContext
+import com.supwisdom.dlpay.framework.util.Constants
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.util.ConstantUtil
+import java.io.BufferedReader
+import java.io.InputStream
+import java.io.InputStreamReader
+import javax.ws.rs.core.MediaType
+
/**
* 第三方对账任务
@@ -31,16 +44,15 @@
private lateinit var transactionReconciliationService: TransactionReconciliationService
@Autowired
private lateinit var sourceTypeService: SourceTypeService
- @Autowired
- private lateinit var restTemplate: RestTemplate
private val logger = KotlinLogging.logger { }
- @Scheduled(cron = "\${download.ynrcc.chkfile.cron:-}")
- @SchedulerLock(name = "DownloadYnrccChkfileSchedulerTask", lockAtMostForString = "PT10M")
+// @Scheduled(cron = "\${download.ynrcc.chkfile.cron:-}")
+// @SchedulerLock(name = "DownloadYnrccChkfileSchedulerTask", lockAtMostForString = "PT10M")
fun doDownloadYnrccChkfile() {
try {
+ if (null == TenantContext.getTenantSchema()) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID)
//下载对账单逻辑
val hostdate = systemUtilService.sysdatetime.hostdate
val downloadLastdate = ynrccBusinessService.getLastDownloadBillDate()
@@ -50,24 +62,25 @@
for (i in 1 until diffDays) {
val billDate = DateUtil.getNewDay(downloadLastdate, i) //要取对账单的日期
- var chkfile = transactionReconciliationService.getTransactionChkfile(billDate, TradeDict.PAYTYPE_CITIZEN_CARD)
- if (null != chkfile) {
- continue // 已经存在对账单
- }
+ val chkfile = transactionReconciliationService.doInitTransactionChkfile(billDate, TradeDict.PAYTYPE_CITIZEN_CARD)
val resp = citizencardPayService.getChkfilename(billDate, null)
if (YnrccUtil.CODE_SUCCESS == resp.code) {
val agentConfig = sourceTypeService.getChargePaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, true)
- val agentUrl = agentConfig[YnrccUtil.YNRCC_ANGENT_URL] + "/download"
+ val agentUrl = agentConfig[YnrccUtil.YNRCC_ANGENT_URL] + "/download?filename=" + resp.filename
//根据filename 取文件数据
-
+ downloadYnrccBills(chkfile, agentUrl)
} else if (YnrccUtil.NO_RECORDS_TODAY == resp.code) {
//当日无交易明细,也创建空记录
+ transactionReconciliationService.doSuccessTransactionChkfile(chkfile, "请求银行返回:当日无交易明细")
} else {
//报错,退出对账单拉取
logger.error("大理农商行对账单下载[$billDate]报错:${resp.message}")
+ chkfile.status = ConstantUtil.CHKFILE_STATUS_ERROR
+ chkfile.remark = "请求前置获取对账文件报错:${resp.message}"
+ transactionReconciliationService.saveOrUpdateTransactionChkfile(chkfile)
break
}
}
@@ -77,4 +90,77 @@
}
}
+ private fun downloadYnrccBills(chkfile: TTransactionChkfile, agentUrl: String) {
+ val client = Client.create()
+ client.setConnectTimeout(30000)
+ val respClient = client.resource(agentUrl).type(MediaType.APPLICATION_OCTET_STREAM_TYPE).get(ClientResponse::class.java)
+ if (200 == respClient.status) {
+ val stream = respClient.getEntity(InputStream::class.java)
+ BufferedReader(InputStreamReader(stream)).use { reader ->
+ val header = reader.readLine()
+ val fields = header.split(",").mapNotNull { if (it.isNotEmpty()) it else null }
+ val batchSize = 10000 //每次保存的数目
+ var failcnt = 0
+
+ val datalist = ArrayList<YnrccChkfileBean>()
+ while (true) {
+ val line = reader.readLine() ?: break
+ if (line.isEmpty()) continue
+ val columns = line.split(",").mapNotNull { if (it.isNotEmpty()) it else null }
+ val bean = YnrccChkfileBean()
+ StringUtil.transforToBean(fields, columns, bean)
+ datalist.add(bean)
+ if (datalist.size >= batchSize) {
+ val fcnt = doBatchSaveYnrccCheckDetails(chkfile, datalist) //保存
+ failcnt += fcnt
+ datalist.clear()
+ }
+ }
+ //保存最后的不足batchSize的记录
+ if (datalist.size > 0) {
+ val fcnt = doBatchSaveYnrccCheckDetails(chkfile, datalist) //保存
+ failcnt += fcnt
+ }
+
+ if (failcnt > 0) {
+ //该天对账单保存错误
+ chkfile.status = ConstantUtil.CHKFILE_STATUS_ERROR
+ chkfile.remark = "对账单数据存在保存失败记录,请手动核对对账单数据"
+ transactionReconciliationService.saveOrUpdateTransactionChkfile(chkfile)
+ return
+ }
+
+ //成功
+ transactionReconciliationService.doSuccessTransactionChkfile(chkfile, "对账单数据下载成功")
+
+ }
+ } else {
+ logger.error("请求前置download[${chkfile.accdate}]对账单返回失败:httpStatus=[${respClient.status}]。获取对账文件数据失败")
+ chkfile.status = ConstantUtil.CHKFILE_STATUS_ERROR
+ chkfile.remark = "请求前置获取对账单数据失败,download返回:httpStatus=${respClient.status}"
+ transactionReconciliationService.saveOrUpdateTransactionChkfile(chkfile)
+ }
+ }
+
+ private fun doBatchSaveYnrccCheckDetails(chkfile: TTransactionChkfile, list: ArrayList<YnrccChkfileBean>): Int {
+ try {
+ transactionReconciliationService.doBatchSaveYnrccTransactionChkDtl(chkfile, list)
+ return 0 //批量保存成功,无失败
+ } catch (e1: Exception) {
+ }
+
+ //批量保存有异常,逐笔保存
+ var failcnt = 0
+ for (bean in list) {
+ try {
+ transactionReconciliationService.saveYnrccTransactionChkDtl(chkfile, bean)
+ } catch (e2: Exception) {
+ failcnt++
+ e2.printStackTrace()
+ continue
+ }
+ }
+ return failcnt
+ }
+
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt
index 4b09146..b262bbb 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt
@@ -1,7 +1,10 @@
package com.supwisdom.dlpay.api.service
+import com.supwisdom.dlpay.api.bean.CardsResponse
+import com.supwisdom.dlpay.api.bean.UserInforResponse
import com.supwisdom.dlpay.api.domain.TCard
import com.supwisdom.dlpay.api.domain.TPerson
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
import org.springframework.transaction.annotation.Transactional
interface CardService {
@@ -11,5 +14,12 @@
@Transactional(rollbackFor = arrayOf(Exception::class), readOnly = true)
fun getPersonByCitizencard(cardno: String, ignoreStatus: Boolean? = false): TPerson
+ @Transactional(rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun getPersonByCardno(citizencardno: String?, bankcardno:String?): UserInforResponse
+ @Transactional(rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun getCardsByLastsaveDate(startdate: String, enddate:String): CardsResponse
+
+ @Transactional(rollbackFor = arrayOf(Exception::class), readOnly = true)
+ fun getPersonByUserid(userid: String): UserInforResponse
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt
index d5a960f..1356d46 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt
@@ -2,12 +2,25 @@
import com.supwisdom.dlpay.api.bean.DaliDatasyncDetail
import com.supwisdom.dlpay.api.domain.TCard
+import com.supwisdom.dlpay.api.domain.TCitycardTemp
import org.springframework.transaction.annotation.Propagation
import org.springframework.transaction.annotation.Transactional
-interface DaliDatasyncService{
+interface DaliDatasyncService {
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
fun doUpdateUserInfos(bean: DaliDatasyncDetail): Boolean
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+ fun doBatchSaveOrUpdateUserInfos(userlist: ArrayList<DaliDatasyncDetail>): Boolean
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+ fun saveUpdateUserinfoErrors(bean: DaliDatasyncDetail, errmsg: String)
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
+ fun getErrorUpdateUserinfos(tmpid: String, updtime: String): List<TCitycardTemp>
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+ fun dealErrorRecord(temp: TCitycardTemp)
+
}
\ 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
index 6e6ade4..5bc63a9 100644
--- 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
@@ -1,6 +1,5 @@
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
@@ -10,11 +9,9 @@
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
@@ -68,8 +65,8 @@
}
dtl.befbal = account.availbal
doRecalcAccountBalance(dtl, amount, account)
- account.availbal += dtl.amount
- account.balance += dtl.amount
+ account.availbal += amount
+ account.balance += amount
val sameDay = DateUtil.sameDay(account.lasttranstime,
systemUtilServcie.sysdatetime.sysdate) ?: false
@@ -125,6 +122,9 @@
if (shopdtl.updateBala) {
return
}
+ if (shopdtl.status != DTL_STATUS_SUCCESS) {
+ return
+ }
val amount = transactionMainDao.findByRefno(refno)?.sumAmountByAccno(shopdtl.shopaccno,
Subject.SUBJNO_MACHANT_INCOME, "both")
?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt
index 4610ef7..4981023 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt
@@ -1,5 +1,8 @@
package com.supwisdom.dlpay.api.service.impl
+import com.supwisdom.dlpay.api.bean.CardsResponse
+import com.supwisdom.dlpay.api.bean.CitizenCardInfo
+import com.supwisdom.dlpay.api.bean.UserInforResponse
import com.supwisdom.dlpay.api.dao.CardDao
import com.supwisdom.dlpay.api.dao.PersonDao
import com.supwisdom.dlpay.api.domain.TCard
@@ -9,8 +12,12 @@
import com.supwisdom.dlpay.framework.util.TradeDict
import com.supwisdom.dlpay.framework.util.TradeErrorCode
import com.supwisdom.dlpay.util.ConstantUtil
+import org.hibernate.query.internal.NativeQueryImpl
+import org.hibernate.transform.Transformers
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
+import javax.persistence.EntityManager
+import javax.persistence.PersistenceContext
@Service
class CardServiceImpl : CardService {
@@ -19,6 +26,9 @@
@Autowired
lateinit var personDao: PersonDao
+ @PersistenceContext
+ private lateinit var entityManager: EntityManager
+
override fun getBankcardByUserid(userid: String): TCard? {
return cardDao.findCardByUseridAndCardtype(userid, ConstantUtil.CARDTYPE_BANKCARD)
}
@@ -32,10 +42,107 @@
TradeDict.STATUS_LOST == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOSS, "市民卡[$cardno]已经挂失!")
TradeDict.STATUS_FROZEN == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_FROZEN, "市民卡[$cardno]已经冻结!")
TradeDict.STATUS_LOCKED == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "市民卡[$cardno]已被锁定!")
+ TradeDict.STATUS_UNUSE == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "市民卡[$cardno]未启用!")
+ TradeDict.STATUS_ABNORMAL == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "市民卡[$cardno]状态异常!")
}
}
return personDao.findByUserid(cityCard.userid)
?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "市民卡[$cardno]用户信息不存在!")
}
+
+ override fun getPersonByCardno(citizencardno: String?, bankcardno: String?): UserInforResponse {
+ var resp = UserInforResponse()
+ var cityCard: TCard?
+ if (!citizencardno.isNullOrEmpty()) {
+ cityCard = cardDao.findCardByCardnoAndCardtype(citizencardno, ConstantUtil.CARDTYPE_CITIZENCARD)
+ if (cityCard == null) {
+ resp.retcode = 1
+ resp.retmsg = "市民卡不存在"
+ return resp
+ }
+ val bankcard = cardDao.findBankcardByCitizencard(cityCard.userid, ConstantUtil.CARDTYPE_BANKCARD, cityCard.cardphyid)
+ if (bankcard != null) {
+ resp.bankcardno = bankcard.cardno
+ }
+ } else {
+ resp.retcode = 1
+ resp.retmsg = "参数错误"
+ return resp
+ }
+ resp.cardno = cityCard.cardno
+ resp.cardphyid = cityCard.cardphyid
+ resp.expiredate = cityCard.expiredate
+ resp.cardstatus = cityCard.status
+ resp.transstatus = cityCard.transStatus
+ val person = personDao.findByUserid(cityCard.userid)
+ if (person != null) {
+ resp.retcode = 0
+ resp.username = person.name
+ resp.userid = person.userid
+ resp.sex = person.sex
+ resp.idtype = person.idtype
+ resp.idno = person.idno
+ resp.phone = person.mobile
+ return resp
+ }
+ resp.retcode = 1
+ resp.retmsg = "用户不存在"
+ return resp
+ }
+
+ override fun getCardsByLastsaveDate(startdate: String, enddate: String): CardsResponse {
+ var resp = CardsResponse()
+// var ret = cardDao.findCitizencardByLastsaved(startdate,enddate)
+ val query = entityManager.createNativeQuery("select a.cardno,a.cardphyid,a.expiredate,a.status as cardstatus,a.trans_status as transstatus,a.userid,b.name as username,b.sex,b.idtype,b.idno,b.mobile as phone,c.cardno as bankcardno \n" +
+ "from tb_card a left join tb_person b on a.userid=b.userid left join tb_card c on a.userid=c.userid and a.cardphyid=c.cardphyid and c.cardtype='bankcard' \n" +
+ "where a.cardtype='citizencard' and a.lastsaved>:starttime and a.lastsaved<=:endtime order by a.lastsaved ")
+ query.setParameter("starttime", startdate)
+ query.setParameter("endtime", enddate)
+ query.unwrap(NativeQueryImpl::class.java).setResultTransformer(Transformers.aliasToBean(CitizenCardInfo::class.java))
+ val list = query.resultList as List<CitizenCardInfo>
+ resp.retcode=0
+ resp.retmsg="OK"
+ resp.cards = list
+ return resp
+ }
+
+ override fun getPersonByUserid(userid: String): UserInforResponse {
+ var resp = UserInforResponse()
+ val person = personDao.findByUserid(userid.trim())
+ if (null == person) {
+ resp.retcode = 1
+ resp.retmsg = "用户不存在"
+ return resp
+ }
+ val bankcard = cardDao.findCardByUseridAndCardtype(person.userid, ConstantUtil.CARDTYPE_BANKCARD)
+ if (null == bankcard) {
+ resp.retcode = 1
+ resp.retmsg = "用户绑定的银行卡状态异常"
+ return resp
+ }
+ val cityCard = cardDao.findBankcardByCitizencard(person.userid, ConstantUtil.CARDTYPE_CITIZENCARD, bankcard.cardphyid)
+ if (null == cityCard) {
+ resp.retcode = 1
+ resp.retmsg = "市民卡不存在"
+ return resp
+ }
+ resp.cardno = cityCard.cardno
+ resp.cardphyid = cityCard.cardphyid
+ resp.expiredate = cityCard.expiredate
+ resp.cardstatus = cityCard.status
+ resp.transstatus = cityCard.transStatus
+ resp.bankcardno = bankcard.cardno
+
+ resp.username = person.name
+ resp.userid = person.userid
+ resp.sex = person.sex
+ resp.idtype = person.idtype
+ resp.idno = person.idno
+ resp.phone = person.mobile
+
+ resp.retcode = 0
+ resp.retmsg = "查询成功"
+ return resp
+ }
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt
index df5ed08..47e16a5 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt
@@ -3,11 +3,14 @@
import com.supwisdom.dlpay.api.bean.DaliDatasyncDetail
import com.supwisdom.dlpay.api.dao.AccountDao
import com.supwisdom.dlpay.api.dao.CardDao
+import com.supwisdom.dlpay.api.dao.CitycardTempDao
import com.supwisdom.dlpay.api.dao.PersonDao
import com.supwisdom.dlpay.api.domain.TAccount
import com.supwisdom.dlpay.api.domain.TCard
+import com.supwisdom.dlpay.api.domain.TCitycardTemp
import com.supwisdom.dlpay.api.domain.TPerson
import com.supwisdom.dlpay.api.service.DaliDatasyncService
+import com.supwisdom.dlpay.api.types.IDTypes
import com.supwisdom.dlpay.exception.TransactionProcessException
import com.supwisdom.dlpay.framework.service.SystemUtilService
import com.supwisdom.dlpay.framework.tenant.TenantContext
@@ -25,6 +28,8 @@
@Autowired
lateinit var cardDao: CardDao
@Autowired
+ lateinit var citycardTempDao: CitycardTempDao
+ @Autowired
lateinit var systemUtilService: SystemUtilService
override fun doUpdateUserInfos(bean: DaliDatasyncDetail): Boolean {
@@ -32,20 +37,58 @@
val lowfreeLimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.NOPASS_LIMIT, SysparaUtil.DEFAULT_NOPASS_LIMIT)
val daylimit = systemUtilService.getSysparaValueAsDouble(SysparaUtil.DAY_PAY_LIMIT, SysparaUtil.DEFAULT_DAY_PAY_LIMIT)
+ //字典转换
+ val idType = when (bean.idtype.trim()) {
+ "0" -> IDTypes.IDCARD.data //身份证
+ "1" -> IDTypes.RESIDENCE_BOOKLET.data //户口簿
+ "2" -> IDTypes.PASSPORT.data //护照
+ "3" -> IDTypes.HK_MACAU_PASS.data //港澳居民来往内地通行证
+ "4" -> IDTypes.TAIWAN_PASS.data //台湾同胞来往内地通行证
+ "5" -> IDTypes.FOREIGNER_RESIDENCE_PERMIT.data //外国人居留证
+ "6" -> IDTypes.MILITARY_IDCARD.data //军官证
+ "7" -> IDTypes.SOLDIER_IDCARD.data //士兵证
+ else -> IDTypes.OTHERS.data //其他
+ }
+ val sex = bean.sex?.let {
+ when (it) {
+ "1" -> "male"
+ "2" -> "female"
+ else -> "unknown"
+ }
+ } ?: "unknown"
+ val cardStatus = when (bean.cardstatus) {
+ "0" -> TradeDict.STATUS_UNUSE //未启用
+ "1" -> TradeDict.STATUS_NORMAL //正常
+ "9" -> TradeDict.STATUS_CLOSED //注销
+ "2" -> TradeDict.STATUS_ABNORMAL //异常
+ else -> TradeDict.STATUS_ABNORMAL //异常
+ }
+
val systime = systemUtilService.sysdatetime
- var person = personDao.findByIdentity(bean.idtype.trim(), bean.idno.trim())
+ var person = personDao.findByIdentity(idType.toString(), bean.idno.trim())
if (null != person) {
+ //更新
+ var updateFlag = false
+ if (person.sex != sex) {
+ updateFlag = true
+ person.sex = sex
+ }
if (person.name != bean.username) {
+ updateFlag = true
person.name = bean.username
- person.lastsaved = systime.hostdatetime
- person = personDao.save(person)
accountDao.updateAccnameByUserid(person.name, person.userid)
}
+ if (updateFlag) {
+ person.lastsaved = systime.hostdatetime
+ person = personDao.save(person)
+ }
} else {
+ //新增
person = TPerson().apply {
name = bean.username
+ this.sex = sex
status = TradeDict.STATUS_NORMAL
- idtype = bean.idtype.trim()
+ idtype = idType.toString()
idno = bean.idno.trim()
email = bean.email
mobile = bean.mobile
@@ -70,28 +113,59 @@
lastdayTransamt = 0.00
lastdayDpsamt = 0.00
opendate = systime.hostdate
+ tac = Signature.SPY_TAC
}
- account.generateTac()
account.tenantid = TenantContext.getTenantSchema()
+ account = accountDao.save(account)
+ account.tac = account.generateTac()
accountDao.save(account)
}
var cityCard = cardDao.findCardByCardnoAndCardtype(bean.cardno.trim(), ConstantUtil.CARDTYPE_CITIZENCARD)
if (null != cityCard) {
//仅修改有效期和状态
+ var cardUpdateFlag = false
if (cityCard.expiredate != bean.expiredate.trim()) {
+ cardUpdateFlag = true
cityCard.expiredate = bean.expiredate.trim()
}
- //fixme: bean.cardstatus 判断修改状态
- cardDao.save(cityCard)
+ //fixme: bean.cardstatus 判断修改状态
+ if (TradeDict.STATUS_CLOSED == cardStatus) {
+ //注销卡片
+ if (cityCard.status != TradeDict.STATUS_CLOSED) {
+ cardUpdateFlag = true
+ cityCard.status = TradeDict.STATUS_CLOSED
+ }
+ } else {
+ //卡片的其他状态,代表交易状态
+ if (TradeDict.STATUS_NORMAL != cityCard.transStatus) {
+ cardUpdateFlag = true
+ cityCard.status = TradeDict.STATUS_NORMAL
+ }
+ if (cardStatus != cityCard.transStatus) {
+ cardUpdateFlag = true
+ cityCard.transStatus = cardStatus
+ }
+ }
+
+ if (cardUpdateFlag) {
+ cityCard.lastsaved = systime.hostdatetime
+ cardDao.save(cityCard) //更新
+ }
} else {
cityCard = TCard().apply {
cardno = bean.cardno.trim()
cardtype = ConstantUtil.CARDTYPE_CITIZENCARD
cardphyid = bean.cardphyid.trim()
- status = TradeDict.STATUS_NORMAL // fixme: bean.cardstatus 判断
- transStatus = TradeDict.STATUS_NORMAL
+ status = when (TradeDict.STATUS_CLOSED == cardStatus) {
+ true -> TradeDict.STATUS_CLOSED
+ false -> TradeDict.STATUS_NORMAL
+ }
+ transStatus = when (TradeDict.STATUS_CLOSED == cardStatus) {
+ true -> TradeDict.STATUS_ABNORMAL
+ false -> cardStatus
+ }
expiredate = bean.expiredate.trim()
signed = false
userid = person.userid
@@ -107,18 +181,22 @@
bankCard = TCard().apply {
cardno = bean.bankcardno!!.trim()
cardtype = ConstantUtil.CARDTYPE_BANKCARD
- cardphyid = ""
- status = TradeDict.STATUS_NORMAL // fixme: bean.cardstatus 判断
+ cardphyid = bean.cardphyid.trim()
+ status = when (TradeDict.STATUS_CLOSED == cardStatus) {
+ true -> TradeDict.STATUS_CLOSED
+ false -> TradeDict.STATUS_NORMAL
+ }
transStatus = TradeDict.STATUS_NORMAL
expiredate = "21991231"
signed = false
userid = person.userid
lastsaved = systime.hostdatetime
}
- cardDao.closedBankcardStatusByUserid(bankCard.userid) //注销其他银行卡
+ if (TradeDict.STATUS_NORMAL == bankCard.status) {
+ cardDao.closedBankcardStatusByUserid(bankCard.userid) //注销其他银行卡
+ }
bankCard.tenantid = TenantContext.getTenantSchema()
cardDao.save(bankCard) //绑定新的银行卡
-
} else {
if (bankCard.userid != person.userid) {
throw TransactionProcessException(3000, "银行卡已被人绑定")
@@ -129,4 +207,60 @@
return true
}
+ override fun doBatchSaveOrUpdateUserInfos(userlist: ArrayList<DaliDatasyncDetail>): Boolean {
+ for (bean in userlist) {
+ bean.checkParam()
+ doUpdateUserInfos(bean)
+ }
+ return true
+ }
+
+ override fun saveUpdateUserinfoErrors(bean: DaliDatasyncDetail, errmsg: String) {
+ citycardTempDao.save(TCitycardTemp().apply {
+ this.cardno = bean.cardno
+ this.cardphyid = bean.cardphyid
+ this.expiredate = bean.expiredate
+ this.cardstatus = bean.cardstatus
+ this.bankcardno = bean.bankcardno
+ this.username = bean.username
+ this.sex = bean.sex
+ this.idtype = bean.idtype
+ this.idno = bean.idno
+ this.mobile = bean.mobile
+ this.email = bean.email
+ this.status = TradeDict.DTL_STATUS_FAIL
+ this.remark = errmsg
+ this.lastsaved = systemUtilService.sysdatetime.hostdatetime
+ this.tenantid = TenantContext.getTenantSchema()
+ })
+ }
+
+ override fun getErrorUpdateUserinfos(tmpid: String, updtime: String): List<TCitycardTemp> {
+ if (!StringUtil.isEmpty(tmpid)) {
+ return citycardTempDao.findbyTempid(tmpid.trim()) ?: ArrayList<TCitycardTemp>()
+ } else {
+ return citycardTempDao.findbyUpdtime(updtime) ?: ArrayList<TCitycardTemp>()
+ }
+ }
+
+ override fun dealErrorRecord(temp: TCitycardTemp) {
+ val bean = DaliDatasyncDetail().apply {
+ this.cardno = temp.cardno
+ this.cardphyid = temp.cardphyid
+ this.expiredate = temp.expiredate
+ this.cardstatus = temp.cardstatus
+ this.bankcardno = temp.bankcardno
+ this.username = temp.username
+ this.sex = temp.sex
+ this.idtype = temp.idtype
+ this.idno = temp.idno
+ this.mobile = temp.mobile
+ this.email = temp.email
+ }
+ bean.checkParam()
+ if (doUpdateUserInfos(bean)) {
+ citycardTempDao.delete(temp) //删除
+ }
+ }
+
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/kafka_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/kafka_service_impl.kt
new file mode 100644
index 0000000..290bfaa
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/kafka_service_impl.kt
@@ -0,0 +1,78 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.google.gson.Gson
+import com.supwisdom.dlpay.api.bean.KafkaXgMessage
+import com.supwisdom.dlpay.api.service.KafkaSendMsgService
+import com.supwisdom.dlpay.framework.util.DateUtil
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.mobile.dao.MsgDao
+import com.supwisdom.dlpay.mobile.domain.TBMsg
+import com.supwisdom.dlpay.mobile.service.MobileApiService
+import mu.KotlinLogging
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.kafka.core.KafkaTemplate
+import org.springframework.scheduling.annotation.Async
+import org.springframework.stereotype.Service
+
+@Service
+class KafkaSendMsgServiceImpl:KafkaSendMsgService{
+ val logger = KotlinLogging.logger { }
+ @Autowired
+ private lateinit var kafkaTemplate: KafkaTemplate<String, String>
+ @Autowired
+ private lateinit var msgDao: MsgDao
+ @Autowired
+ private lateinit var mobileApiService: MobileApiService
+ val gson = Gson()
+
+ val topic = "jpush-messages"
+
+ @Async
+ override fun sendJpushMessage(userid: String, title: String, content: String, refno: String, extras: MutableMap<String, String>, tenantId: String?) {
+ val musers = mobileApiService.findByUseridAndStatus(userid, TradeDict.STATUS_NORMAL)
+ var msg = TBMsg().apply {
+ this.content = content
+ this.title = title
+ this.refno = refno
+ this.userid = userid
+ this.lastupdate = DateUtil.getNow()
+ this.refno = refno
+ this.extras = gson.toJson(extras)
+ }
+ if (musers == null || musers.isEmpty()) {
+ msg.pushresult = "没有手机用户,消息未推送"
+ msgDao.save(msg)
+ return
+ }
+ msg = msgDao.save(msg)
+ var uids = ""
+ musers.forEach {
+ uids += "${it.uid},"
+ var platform = "android"
+ if ("ios".equals(it.lastloginplatform, true)) {
+ platform = "ios"
+ }
+ val message = KafkaXgMessage()
+ message.alltarget = false
+ message.callback = true
+ message.content = msg.content
+ message.title = msg.title
+ message.platform = platform
+ message.retries = 3
+ extras["refno"] = refno
+ message.custom = gson.toJson(extras)
+ message.expiretime = DateUtil.getNewTime(DateUtil.getNow(), 300)
+ message.gids = it.uid
+ if(it.lastloginplatform.isNullOrEmpty()){
+ message.platform="ios"
+ kafkaTemplate.send(topic, msg.msgid, gson.toJson(message))
+ message.platform="android"
+ kafkaTemplate.send(topic, msg.msgid, gson.toJson(message))
+ }else{
+ kafkaTemplate.send(topic, msg.msgid, gson.toJson(message))
+ }
+ }
+ msg.pusheduids = uids
+ msgDao.save(msg)
+ }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt
new file mode 100644
index 0000000..9cc9393
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt
@@ -0,0 +1,164 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.google.gson.Gson
+import com.supwisdom.dlpay.api.bean.ApiResponse
+import com.supwisdom.dlpay.api.bean.DoorQrcodeResponse
+import com.supwisdom.dlpay.api.service.QRCodeService
+import com.supwisdom.dlpay.api.service.UserService
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.MD5
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.mobile.service.MobileApiService
+import com.supwisdom.dlpay.util.*
+import mu.KotlinLogging
+import org.apache.commons.lang.math.NumberUtils
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.data.redis.core.RedisTemplate
+import org.springframework.stereotype.Service
+import java.time.Duration
+
+@Service
+class QRCodeServiceImpl:QRCodeService{
+ @Autowired
+ private lateinit var systemUtilService: SystemUtilService
+ @Autowired
+ private lateinit var mobileApiService: MobileApiService
+ @Autowired
+ lateinit var userService: UserService
+ @Autowired
+ lateinit var redisTemplate: RedisTemplate<String, String>
+
+ val logger = KotlinLogging.logger { }
+
+ override fun encodeCode(uid:String): ApiResponse {
+ var resp = ApiResponse()
+ val rootkey = systemUtilService.getBusinessValue("aes.cfb.rootkey")
+ val iv = systemUtilService.getBusinessValue("aes.cfb.iv")
+ if (rootkey.isNullOrEmpty()||iv.isNullOrEmpty()) {
+ resp.retcode = 1
+ resp.retmsg = "秘钥未配置"
+ return resp
+ }
+ val muser = mobileApiService.findUserById(uid)
+ if(muser==null||TradeDict.STATUS_NORMAL!=muser.status){
+ resp.retcode = 1
+ resp.retmsg = "用户不存在或状态异常"
+ return resp
+ }
+ if(muser.userid.isNullOrEmpty()){
+ resp.retcode = 1
+ resp.retmsg = "用户未绑定身份"
+ return resp
+ }
+ val totp = QrCodeTotpUtil.generateTOTP(muser.secertkey)
+ val rowdata = QrcodeRawData()
+ rowdata.userid = muser.userid
+ rowdata.setTotp(totp)
+ val orgData = Gson().toJson(rowdata)
+ val publicKey = RSAKeysGenerate.getPublicKey(muser.rsapublic)
+ val encdata = org.apache.commons.codec.binary.Base64.encodeBase64String(RSAKeysGenerate.encryptbyte(publicKey, orgData))
+ val qrcode = AesUtil.encryptCFB("$uid:$encdata", rootkey, iv, "AES/CFB/NoPadding")
+
+ val key = MD5.encodeByMD5ToURLSafeBase64(qrcode)
+ redisTemplate.opsForValue().set(key,qrcode, Duration.ofMinutes(3))
+ resp.retcode = 0
+ resp.retmsg = key
+ return resp
+ }
+
+ override fun decodeCode(qrcode :String): DoorQrcodeResponse {
+
+ //解密
+ var resp = DoorQrcodeResponse()
+ try {
+ val rootkey = systemUtilService.getBusinessValue("aes.cfb.rootkey")
+ val iv = systemUtilService.getBusinessValue("aes.cfb.iv")
+ val totpoffset = systemUtilService.getBusinessValue("aes.cfb.totp.offset")
+ var offset = 20
+ if (NumberUtils.isDigits(totpoffset)) {
+ offset = Integer.valueOf(totpoffset).toInt()
+ }
+ if (rootkey.isNullOrEmpty()||iv.isNullOrEmpty()) {
+ resp.retcode = 1
+ resp.retmsg = "秘钥未配置"
+ return resp
+ }
+
+ println("vtoken=[" + qrcode + "],length=[" + qrcode.length + "]")
+ val encdataBack = AesUtil.decryptCFB(qrcode, rootkey, iv, "AES/CFB/NoPadding")
+ if (encdataBack == null) {
+ resp.retcode = 1
+ resp.retmsg = "二维码解析失败"
+ return resp
+ }
+ val uid = encdataBack.substring(0, encdataBack.indexOf(":"))
+ val muser = mobileApiService.findUserById(uid)
+ if(muser==null||TradeDict.STATUS_NORMAL!=muser.status){
+ resp.retcode = 1
+ resp.retmsg = "用户不存在或状态异常"
+ return resp
+ }
+ val seed32 = muser.secertkey
+ val rawEncdata = encdataBack.substring(encdataBack.indexOf(":") + 1)
+
+ val privateKey = RSAKeysGenerate.getPrivateKey(muser.rsaprivate)
+ val rawdataBack = RSAKeysGenerate.decryptbyte(privateKey, rawEncdata)
+ logger.info("rawdata_back=$rawdataBack")
+
+ val rawData = Gson().fromJson(rawdataBack, QrcodeRawData::class.java)
+ logger.info("userid=" + rawData.userid)
+ if (null == rawData || rawData.userid.isNullOrEmpty()) {
+ resp.retcode = 1
+ resp.retmsg = "用户不存在"
+ return resp
+ }
+ val person = userService.findOnePersonByUserid(rawData.userid)
+
+ val bankcard = mobileApiService.findCardByUserid(person.userid)
+ if (null == bankcard) {
+ resp.retcode = 9
+ resp.retmsg = "二维码识别错误,手机绑定的银行卡已注销"
+ return resp
+ }
+ //银行卡必定存在对应的市民卡
+ val citycard = mobileApiService.findCardByUseridAndCardphyid(person.userid, ConstantUtil.CARDTYPE_CITIZENCARD, bankcard.cardphyid)
+ if (null == citycard) {
+ resp.retcode = 8
+ resp.retmsg = "二维码识别异常"
+ return resp
+ }
+
+ val verifyBarcode = QrCodeTotpUtil.verifyCode(rawData.totp, seed32, offset)
+ return if (verifyBarcode) {
+ resp.retcode = 0
+ resp.retmsg = "OK"
+ resp.userid = person.userid
+ resp.username = person.name
+ resp.sex = person.sex
+ resp.idtype = person.idtype
+ resp.idno = person.idno
+ resp.phone = person.mobile
+
+ resp.citycardno = citycard.cardno
+ resp.cardphyid = citycard.cardphyid
+ resp.expiredate = citycard.expiredate
+ resp.cardstatus = citycard.status
+ resp.transstatus = citycard.transStatus
+ resp.bankcardno = bankcard.cardno
+ resp
+ } else {
+ resp.retcode = 1
+ resp.retmsg = "二维码校验失败"
+ resp
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ resp.retcode = 1
+ resp.retmsg = "二维码识别异常"
+ return resp
+ }
+
+ }
+
+}
+
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
index 50a80d1..ff890fb 100644
--- 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
@@ -67,7 +67,7 @@
if (shoptypeCheck.isInEnums(shop.shoptype, ShopTypes.NORMAL)) {
//非商户组要创建账号
val shopaccno = String.format("2%09d", shop.shopid)
- shopaccDao.save(TShopacc().apply {
+ var acc = shopaccDao.save(TShopacc().apply {
this.shopaccno = shopaccno
this.shopid = shop.shopid
this.shopname = shop.shopname
@@ -76,6 +76,8 @@
this.opendate = shop.opendate
this.tenantId = param.tenantid
})
+ acc.mac = acc.genMAC()
+ shopaccDao.save(acc)
shop.shopaccno = shopaccno
shopDao.save(shop) //更新账号
}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt
index f334403..b368d5a 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt
@@ -1,9 +1,26 @@
package com.supwisdom.dlpay.api.service.impl
+import com.supwisdom.dlpay.agent.citizencard.YnrccUtil
+import com.supwisdom.dlpay.api.bean.YnrccChkfileBean
+import com.supwisdom.dlpay.api.dao.PersondtlDao
import com.supwisdom.dlpay.api.dao.TransactionChkdtlDao
import com.supwisdom.dlpay.api.dao.TransactionChkfileDao
+import com.supwisdom.dlpay.api.dao.TransactionMainDao
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus
+import com.supwisdom.dlpay.api.domain.TTransactionChkdtl
import com.supwisdom.dlpay.api.domain.TTransactionChkfile
+import com.supwisdom.dlpay.api.service.SourceTypeService
import com.supwisdom.dlpay.api.service.TransactionReconciliationService
+import com.supwisdom.dlpay.api.service.TransactionServiceProxy
+import com.supwisdom.dlpay.exception.TransactionCheckException
+import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.framework.dao.BusinessparaDao
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.tenant.TenantContext
+import com.supwisdom.dlpay.framework.util.MoneyUtil
+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
@@ -13,10 +30,279 @@
private lateinit var transactionChkfileDao: TransactionChkfileDao
@Autowired
private lateinit var transactionChkdtlDao: TransactionChkdtlDao
+ @Autowired
+ private lateinit var systemUtilService: SystemUtilService
+ @Autowired
+ private lateinit var businessparaDao: BusinessparaDao
+ @Autowired
+ private lateinit var transactionMainDao: TransactionMainDao
+ @Autowired
+ private lateinit var persondtlDao: PersondtlDao
+ @Autowired
+ private lateinit var transactionService: TransactionServiceProxy
+
+ @Autowired
+ private lateinit var sourceTypeService: SourceTypeService
override fun getTransactionChkfile(accdate: String, sourcetype: String): TTransactionChkfile? {
return transactionChkfileDao.getByAccdateAndSourcetype(accdate, sourcetype)
}
+ override fun doInitTransactionChkfile(accdate: String, sourcetype: String): TTransactionChkfile {
+ return transactionChkfileDao.getByAccdateAndSourcetype(accdate, sourcetype).let {
+ if (it != null) {
+ if (ConstantUtil.CHKFILE_STATUS_INIT != it.status)
+ throw TransactionCheckException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+ "accdate=$accdate,sourcetype=$sourcetype 的chkfile已经存在")
+ it
+ } else {
+ saveInitTransactionChkfile(accdate, sourcetype) //保存init对账文件
+ }
+ }
+ }
+ override fun saveOrUpdateTransactionChkfile(chkfile: TTransactionChkfile): TTransactionChkfile {
+ return transactionChkfileDao.save(chkfile)
+ }
+
+ override fun saveYnrccTransactionChkDtl(chkfile: TTransactionChkfile, bean: YnrccChkfileBean): TTransactionChkdtl {
+ return transactionChkdtlDao.save(TTransactionChkdtl().apply {
+ this.chkfileId = chkfile.id
+ this.accdate = chkfile.accdate
+ this.sourcetype = chkfile.sourcetype
+ this.recordno = bean.recordno
+ this.amount = bean.amount / 100.0
+ this.otherRefno = bean.agentrefno
+ this.localRefno = bean.refno
+ this.otherAccdate = bean.agentdate
+ this.transtype = bean.flag
+ this.otherStatus = bean.status
+ this.remark = null
+ this.extdata = bean.summary
+ this.chkresult = ConstantUtil.CHKDTL_CHKRESULT_UNCHECK
+ this.resolved = ConstantUtil.CHKDTL_RESOLVED_NONE
+ this.lastsaved = systemUtilService.sysdatetime.sysdate
+ this.tenantid = TenantContext.getTenantSchema()
+ })
+ }
+
+ override fun doBatchSaveYnrccTransactionChkDtl(chkfile: TTransactionChkfile, list: ArrayList<YnrccChkfileBean>): Boolean {
+ for (bean in list) {
+ saveYnrccTransactionChkDtl(chkfile, bean)
+ }
+ return true
+ }
+
+ override fun doSuccessTransactionChkfile(chkfile: TTransactionChkfile, remark: String) {
+ val suminfo = transactionChkdtlDao.getTransactionSumInfo(chkfile.accdate, chkfile.sourcetype)
+ chkfile.status = ConstantUtil.CHKFILE_STATUS_UNCHECK
+ chkfile.remark = remark
+ chkfile.othercnt = suminfo.totalcnt ?: 0
+ chkfile.otheramt = suminfo.totalamt ?: 0.0
+ transactionChkfileDao.save(chkfile)
+ businessparaDao.updateBusinessparaValue(YnrccUtil.YNRCC_BILLS_DOWNLOAD_LASTDATE, chkfile.accdate) //更新下载对账单日期
+ }
+
+ override fun deleteTransactionChkdtls(chkfileId: String) {
+ transactionChkdtlDao.deleteByChkfileid(chkfileId)
+ }
+
+ override fun saveInitTransactionChkfile(accdate: String, sourcetype: String): TTransactionChkfile {
+ return transactionChkfileDao.save(TTransactionChkfile().apply {
+ this.accdate = accdate
+ this.sourcetype = sourcetype
+ this.status = ConstantUtil.CHKFILE_STATUS_INIT
+ this.result = ConstantUtil.CHKFILE_RESULT_NONE
+ this.remark = null
+ this.othercnt = 0
+ this.otheramt = 0.00
+ this.localcnt = 0
+ this.localamt = 0.00
+ this.lastsaved = systemUtilService.sysdatetime.sysdate
+ this.tenantid = TenantContext.getTenantSchema()
+ })
+ }
+
+ override fun doCheckEqualTransdtls(chkfile: TTransactionChkfile, start: Int): Int {
+ //所有一致的记录,一次任务处理
+ return transactionChkdtlDao.findEqualDtlWithLimit(chkfile.id, start, start + 1000)?.also {
+ it.forEach { chkdtl ->
+ chkdtl.chkresult = ConstantUtil.CHKDTL_CHKRESULT_EQUAL
+ chkdtl.resolved = ConstantUtil.CHKDTL_RESOLVED_EQUAL
+ chkdtl.remark = "双方交易一致"
+ transactionChkdtlDao.save(chkdtl) //对账明细表更新
+
+ transactionService.checkSuccessConfirm(chkdtl.localRefno, chkdtl.otherAccdate)
+ }
+ }?.size ?: 0
+ }
+
+ override fun getMinChkDtlRecordNo(chkfile: TTransactionChkfile, status: String): Int {
+ return if (status.isEmpty()) {
+ transactionChkdtlDao.getMinRecordNo(chkfile.id)
+ } else {
+ transactionChkdtlDao.getMinRecordNoByStatus(chkfile.id, status)
+ }
+ }
+
+ override fun getUncheckTransactionChkdtls(chkfileId: String): List<TTransactionChkdtl> {
+ return transactionChkdtlDao.getUncheckTransactionChkdtls(chkfileId)
+ ?: ArrayList<TTransactionChkdtl>(0)
+ }
+
+ override fun doCheckTransactionChkdtl(chkdtl: TTransactionChkdtl): TTransactionChkdtl {
+ val transMain = transactionMainDao.findByRefno(chkdtl.localRefno)
+
+ if (null == transMain || !transMain.person) {
+ chkdtl.chkresult = ConstantUtil.CHKDTL_CHKRESULT_NOTEXIST
+ chkdtl.resolved = ConstantUtil.CHKDTL_RESOLVED_HANGUP
+ chkdtl.remark = "本地流水不存在"
+ return transactionChkdtlDao.save(chkdtl) //对账明细表更新
+ }
+
+ if (!MoneyUtil.moneyEqual(chkdtl.amount, transMain.personDtl.amount)) {
+ chkdtl.chkresult = ConstantUtil.CHKDTL_CHKRESULT_DIFF
+ chkdtl.resolved = ConstantUtil.CHKDTL_RESOLVED_HANGUP
+ chkdtl.remark = "交易金额不相等"
+ return transactionChkdtlDao.save(chkdtl) //对账明细表更新
+ }
+
+ if (transMain.accdate != chkdtl.accdate || transMain.sourceType != chkdtl.sourcetype) {
+ // 数据异常, 对账不能完成
+ chkdtl.chkresult = ConstantUtil.CHKDTL_CHKRESULT_ERROR
+ chkdtl.resolved = ConstantUtil.CHKDTL_RESOLVED_HANGUP
+ chkdtl.remark = "记账日期或支付方式错误"
+ return transactionChkdtlDao.save(chkdtl) //对账明细表更新
+ }
+
+ return if (transMain.status == TradeDict.DTL_STATUS_SUCCESS) {
+ chkdtl.chkresult = ConstantUtil.CHKDTL_CHKRESULT_EQUAL
+ chkdtl.resolved = ConstantUtil.CHKDTL_RESOLVED_EQUAL
+ chkdtl.remark = "双方交易一致"
+ transactionService.checkSuccessConfirm(chkdtl.localRefno, chkdtl.otherAccdate)
+ transactionChkdtlDao.save(chkdtl) //对账明细表更新
+ } else {
+ //需要补账
+ chkdtl.chkresult = ConstantUtil.CHKDTL_CHKRESULT_NOCHARGE
+ chkdtl.resolved = ConstantUtil.CHKDTL_RESOLVED_ADD
+ chkdtl.remark = "本地未入账,需要补助"
+ transactionChkdtlDao.save(chkdtl) //对账明细表更新
+ }
+ }
+
+ override fun checkUncheckExists(chkfileId: String): Boolean {
+ return transactionChkdtlDao.getCountByChkresult(chkfileId, ConstantUtil.CHKDTL_CHKRESULT_UNCHECK).existed > 0
+ }
+
+ override fun doCheckLocalMoreDtls(chkfile: TTransactionChkfile): Int {
+ return transactionChkdtlDao.findLocalMoreDtls(chkfile.accdate, chkfile.sourcetype, chkfile.id)?.also {
+ it.forEachIndexed { index, refno ->
+ //保存多余的记录
+ transactionMainDao.findByRefno(refno)?.also { transMain ->
+ transactionChkdtlDao.save(TTransactionChkdtl().apply {
+ this.chkfileId = chkfile.id
+ this.accdate = chkfile.accdate
+ this.sourcetype = chkfile.sourcetype
+ this.recordno = -1 * (index + 1)
+ this.amount = transMain.personDtl.amount
+ this.otherRefno = transMain.sourceTypeRefno ?: "$index"
+ this.localRefno = transMain.refno
+ this.otherAccdate = transMain.accdate
+ this.transtype = when (transMain.reverseType) {
+ "none" -> "pay"
+ else -> transMain.reverseType
+ }
+ this.otherStatus = "unknown"
+ this.remark = "本地有成功流水,第三方流水不存在"
+ this.extdata = transMain.personDtl.transdesc
+ this.chkresult = ConstantUtil.CHKDTL_CHKRESULT_SURPLUS
+ this.resolved = ConstantUtil.CHKDTL_RESOLVED_HANGUP
+ this.lastsaved = systemUtilService.sysdatetime.sysdate
+ this.tenantid = chkfile.tenantid
+ })//保存本地多出的记录
+ }.also { transMain ->
+ if (transMain == null) {
+ throw TransactionException(-3, "本地存在多余成功流水记录,且交易参考号<$refno>异常,未找到transactionMain记录")
+ }
+ }
+ }
+ }?.size ?: 0
+ }
+
+ override fun doFinishChkfileStatus(chkfile: TTransactionChkfile, checkStatus: TSourceTypeCheckStatus) {
+ if (transactionChkdtlDao.getCountByChkresult(chkfile.id, ConstantUtil.CHKDTL_CHKRESULT_UNCHECK).existed > 0) {
+ throw TransactionException(-2, "存在未对账的明细记录")
+ }
+ //明细已全部校对完
+ chkfile.status = ConstantUtil.CHKFILE_STATUS_FINISH
+ checkStatus.checkStatus = true
+ checkStatus.repairStatus = false
+ checkStatus.settleStatus = false
+ if (transactionChkdtlDao.getErrorCount(chkfile.id).existed > 0) {
+ //除了需要补账的错误外有其他异常
+ chkfile.result = ConstantUtil.CHKFILE_RESULT_ERROR
+ chkfile.remark = "校对完成,明细存在对比异常"
+ transactionChkdtlDao.getCountByChkresult(chkfile.id, ConstantUtil.CHKDTL_CHKRESULT_SURPLUS).existed.also {
+ if (null != it && it > 0) chkfile.remark = "本地有<$it>条流水不在对账文件中,请联系管理员检查"
+ }
+ } else {
+ //仅存在一致或需补账的记录
+ if (transactionChkdtlDao.getCountByChkresult(chkfile.id, ConstantUtil.CHKDTL_CHKRESULT_NOCHARGE).existed > 0) {
+ //存在需补账记录
+ chkfile.result = ConstantUtil.CHKFILE_RESULT_UNEQUAL //不平
+ chkfile.remark = "校对完成,存在需补账的交易记录"
+ } else {
+ chkfile.result = ConstantUtil.CHKFILE_RESULT_EQUAL //一致
+ chkfile.remark = "校对完成,双方交易一致"
+ }
+ checkStatus.repairStatus = true
+ }
+ checkStatus.remark = chkfile.remark
+
+// transactionChkfileDao.save(chkfile)
+// sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus)
+ }
+
+ override fun getNeedRepairChkdtls(chkfile: TTransactionChkfile): List<TTransactionChkdtl> {
+ return transactionChkdtlDao.getNeedRepairChkdtls(chkfile.id) ?: ArrayList<TTransactionChkdtl>(0)
+ }
+
+ override fun doRepairTransactionChkdtl(chkdtl: TTransactionChkdtl): TTransactionChkdtl {
+ transactionService.repair(chkdtl.localRefno, chkdtl.otherAccdate, chkdtl.otherRefno, "补账成功")
+ chkdtl.resolved = ConstantUtil.CHKDTL_RESOLVED_EQUAL
+ chkdtl.remark = "本地未入账,补账成功"
+ return transactionChkdtlDao.save(chkdtl)
+ }
+
+ override fun saveOrUpdateTransctionChkdtl(chkdtl: TTransactionChkdtl){
+ transactionChkdtlDao.save(chkdtl)
+ }
+
+ override fun doConfirmChkfileStatus(chkfile: TTransactionChkfile, checkStatus: TSourceTypeCheckStatus): TSourceTypeCheckStatus {
+ val personSumInfo = persondtlDao.getPersondtlSumInfo(chkfile.accdate, chkfile.sourcetype, chkfile.tenantid)
+ chkfile.localcnt = personSumInfo.totalcnt ?: 0
+ chkfile.localamt = personSumInfo.totalamt ?: 0.00
+
+ checkStatus.settleStatus = false
+ checkStatus.remark = chkfile.remark
+ if (chkfile.result in setOf(ConstantUtil.CHKFILE_RESULT_EQUAL, ConstantUtil.CHKFILE_RESULT_UNEQUAL)) {
+ val notEqualCount = transactionChkdtlDao.getChkdtlNotEqualCount(chkfile.id).existed
+ val equalCount = transactionChkdtlDao.getChkdtlEqualCount(chkfile.id).existed
+ if (notEqualCount == 0 && equalCount==chkfile.othercnt && chkfile.othercnt == chkfile.localcnt && MoneyUtil.moneyEqual(chkfile.otheramt, chkfile.localamt)) {
+ //对平
+ chkfile.remark = when (chkfile.result == ConstantUtil.CHKFILE_RESULT_EQUAL) {
+ true -> "对账完成,双方交易一致"
+ else -> "对账完成,补账后双方交易一致"
+ }
+ checkStatus.settleStatus = true
+ checkStatus.forceRecheck = false //清掉
+ checkStatus.remark = chkfile.remark
+ }else{
+ checkStatus.remark = "对账完成,补账有失败"
+ }
+ }
+
+ transactionChkfileDao.save(chkfile)
+ return sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus)
+ }
}
\ 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
index 2a8c984..5e431b7 100644
--- 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
@@ -11,9 +11,7 @@
import com.supwisdom.dlpay.exception.TransactionProcessException
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 com.supwisdom.dlpay.framework.util.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import java.sql.SQLException
@@ -37,6 +35,7 @@
@Autowired
private lateinit var sourceTypeService: SourceTypeService
+
/// 公共函数部分
private fun preCheck(builder: TransactionBuilder) {
builder.preCheck()
@@ -373,6 +372,13 @@
?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,
"系统异常,无法处理退款流水")
originTrans.reverseFlag = transaction.reverseType
+ if (originTrans.person) {
+ originTrans.personDtl.reverseFlag = originTrans.reverseFlag
+ originTrans.personDtl.reverseAmount = originTrans.refundAmount
+ }
+ if (originTrans.shop) {
+ originTrans.shopDtl.reverseFlag = originTrans.reverseFlag
+ }
transactionMainDao.save(originTrans)
}
@@ -391,6 +397,11 @@
val originTrans = transactionMainDao.findByRefnoForUpdate(originRefno)
?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS
, "被退款流水不存在")
+ if (TradeDict.REVERSE_FLAG_NONE != originTrans.reverseType) {
+ throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+ "原始流水为撤销或退款流水,不能再被退款")
+ }
+
if (originTrans.status != TradeDict.DTL_STATUS_SUCCESS) {
throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
"原流水不是成功状态")
@@ -401,8 +412,13 @@
}
doReversePrepareAndCheck(originTrans, builder, refundAmount)
- // 判断退款金额
- builder.preCheck()
+ //fixme: 判断退款金额 check 不支持部分退款
+ if (originTrans.person) {
+ if (!MoneyUtil.moneyEqual(Math.abs(originTrans.personDtl.amount), refundAmount)) {
+ throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR
+ , "暂不支持部分退款")
+ }
+ }
val transaction = doReverseProcess(originTrans, builder)
originTrans.reverseFlag = TradeDict.REVERSE_FLAG_WIP
@@ -415,6 +431,11 @@
val originTrans = transactionMainDao.findByRefnoForUpdate(originRefno)
?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS
, "被冲正流水不存在")
+ if (TradeDict.REVERSE_FLAG_NONE != originTrans.reverseType) {
+ throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+ "原始流水为撤销或退款流水,不能再被撤销")
+ }
+
if (originTrans.status != TradeDict.DTL_STATUS_SUCCESS) {
throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
"原流水不是成功状态")
@@ -450,24 +471,32 @@
}
private fun doReverseProcess(originTrans: TTransactionMain, builder: TransactionBuilder): TTransactionMain {
-
+ val summarySuffix = getReverseSuffix(builder.reverseType)
if (originTrans.person) {
builder.person().apply {
setAmount(-originTrans.personDtl.amount, getOppositeTradeFlag(originTrans.personDtl.tradeflag))
setOpposite(originTrans.personDtl.oppositeAccNo, originTrans.personDtl.oppositeAccName)
}
+ builder.description = "${originTrans.personDtl.transdesc}$summarySuffix"
+ builder.payinfo = originTrans.personDtl.payinfo
}
if (originTrans.shop) {
builder.shop().apply {
setAmount(-originTrans.shopDtl.amount, getOppositeTradeFlag(originTrans.shopDtl.tradeflag))
setOpposite(originTrans.shopDtl.oppositeAccNo, originTrans.shopDtl.oppositeAccName)
}
+ builder.description = "${originTrans.shopDtl.transdesc}$summarySuffix"
+ builder.payinfo = originTrans.shopDtl.payInfo
}
- val summarySuffix = getReverseSuffix(builder.reverseType)
+
originTrans.details.forEach {
builder.addDebitCreditRecord(it.draccno, it.drsubjno, it.craccno, it.crsubjno,
-it.amount, "${it.summary}$summarySuffix")
}
+ builder.dtltype = originTrans.dtltype
+ if (builder.operId.isNullOrEmpty()) {
+ builder.operator(originTrans.operid, originTrans.opertype)
+ }
return builderRecords(builder, TradeDict.DTL_STATUS_INIT)
}
@@ -494,7 +523,19 @@
}
}
- override fun repair(refno: String, remark: String): TTransactionMain {
+ override fun checkSuccessConfirm(refno: String, agentAccdate: String): TTransactionMain {
+ val transMain = transactionMainDao.findByRefnoForUpdate(refno)
+ ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
+ "本地流水<$refno>不存在")
+ transMain.settleDate = agentAccdate
+ transMain.details?.forEach {
+ it.settleDate = agentAccdate
+ }
+ transactionMainDao.save(transMain)
+ return transMain
+ }
+
+ override fun repair(refno: String, agentAccdate: String, sourcetypeRefno: String, remark: String): TTransactionMain {
val transaction = transactionMainDao.findByRefnoForUpdate(refno)
?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS,
"补帐交易流水<$refno>不存在")
@@ -506,8 +547,29 @@
"补帐交易<$refno>状态错误,status<${transaction.status}>")
}
- transactionOnSuccess(transaction, remark, true)
- transaction.checkDate = systemUtilService.accdate
+ val currentSettledate = systemUtilService.getSettleDateBytenantId(transaction.tenantid)
+ if (DateUtil.compareDatetime(transaction.accdate, currentSettledate, DateUtil.DATE_FMT) < 0) {
+ //流水记账日期小于结算日期 ( transaction.accdate这天已结算,不能补账!)
+ throw TransactionCheckException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+ "流水<$refno>记账日期<${transaction.accdate}>小于系统的结算日期<$currentSettledate>,不能补账")
+ }
+
+ transaction.status = TradeDict.DTL_STATUS_SUCCESS //置为成功
+ transactionOnSuccess(transaction, sourcetypeRefno, true)
+// transaction.checkDate = systemUtilService.accdate
+ transaction.settleDate = agentAccdate
+ transaction.details?.forEach {
+ it.settleDate = agentAccdate
+ }
+ if(transaction.person){
+ transaction.personDtl.remark = remark
+ }
+ if(transaction.shop){
+ transaction.shopDtl.remark = remark
+ }
+ if(transaction.subject){
+ //
+ }
transaction.endTime = systemUtilService.sysdatetime.sysdate
transactionMainDao.save(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
index 80ad233..3256e61 100644
--- 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
@@ -56,7 +56,7 @@
if (accountDao.findByUseridAndSubjno(person.userid, Subject.SUBJNO_PERSONAL_DEPOSIT) == null) {
//开户
- TAccount().apply {
+ var a = TAccount().apply {
accname = person.name
subjno = Subject.SUBJNO_PERSONAL_DEPOSIT
userid = person.userid
@@ -72,9 +72,11 @@
lastdayTransamt = 0.0
lastdayDpsamt = 0.0
opendate = systemdatetime.hostdate
- tac = this.generateTac()
+ tac = Signature.SPY_TAC
accountDao.save(this)
}
+ a.tac = a.generateTac()
+ accountDao.save(a)
}
personIdentityDao.save(TPersonIdentity().apply {
thirdUid = param.uid
@@ -83,6 +85,7 @@
lossflag = 0
lockflag = 0
createtime = systemdatetime.hostdatetime
+ this.sourcetype = TradeDict.SOURCETYPE_DEFAULT
}) //保存绑定关系
return person
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt
new file mode 100644
index 0000000..a5cc0e8
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.mobile.dao.MsgDao
+import mu.KotlinLogging
+import org.apache.kafka.clients.consumer.ConsumerRecord
+import org.springframework.stereotype.Component
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.kafka.annotation.KafkaListener
+
+interface KafkaSendMsgService {
+ fun sendJpushMessage(userid: String, title: String, content: String, refno: String, extras: MutableMap<String, String>, tenantId: String?)
+}
+@Component
+class KafkaMsgListener{
+ val logger = KotlinLogging.logger { }
+ @Autowired
+ private lateinit var msgDao: MsgDao
+
+ @KafkaListener(topics = ["jpush-messages-result"],autoStartup = "\${spring.kafka.listen.auto.start:true}")
+ fun listen(record :ConsumerRecord<String, String>) {
+ logger.debug { "${record.key()},${record.value()}" }
+ if(!record.key().isNullOrEmpty()){
+ val opt = msgDao.findById(record.key())
+ if(opt.isPresent){
+ var msg = opt.get()
+ msg.pushresult = record.value()
+ msgDao.save(msg)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt
new file mode 100644
index 0000000..029f6a8
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.api.bean.ApiResponse
+import com.supwisdom.dlpay.api.bean.DoorQrcodeResponse
+
+interface QRCodeService {
+ fun encodeCode(uid: String): ApiResponse
+ fun decodeCode(qrcode: String): DoorQrcodeResponse
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_reconciliation_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_reconciliation_service.kt
index 2171dee..d7ce27d 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_reconciliation_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_reconciliation_service.kt
@@ -1,5 +1,8 @@
package com.supwisdom.dlpay.api.service
+import com.supwisdom.dlpay.api.bean.YnrccChkfileBean
+import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus
+import com.supwisdom.dlpay.api.domain.TTransactionChkdtl
import com.supwisdom.dlpay.api.domain.TTransactionChkfile
import org.springframework.transaction.annotation.Transactional
@@ -7,4 +10,61 @@
@Transactional(rollbackFor = [Exception::class], readOnly = true)
fun getTransactionChkfile(accdate: String, sourcetype: String): TTransactionChkfile?
+ @Transactional(rollbackFor = [Exception::class])
+ fun doInitTransactionChkfile(accdate: String, sourcetype: String): TTransactionChkfile
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun saveOrUpdateTransactionChkfile(chkfile: TTransactionChkfile): TTransactionChkfile
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun saveYnrccTransactionChkDtl(chkfile: TTransactionChkfile, bean: YnrccChkfileBean): TTransactionChkdtl
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun doBatchSaveYnrccTransactionChkDtl(chkfile: TTransactionChkfile, list: ArrayList<YnrccChkfileBean>): Boolean
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun doSuccessTransactionChkfile(chkfile: TTransactionChkfile, remark: String)
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun deleteTransactionChkdtls(chkfileId: String)
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun saveInitTransactionChkfile(accdate: String, sourcetype: String): TTransactionChkfile
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun getMinChkDtlRecordNo(chkfile: TTransactionChkfile, status: String): Int
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun doCheckEqualTransdtls(chkfile: TTransactionChkfile, start: Int): Int
+
+ @Transactional(rollbackFor = [Exception::class], readOnly = true)
+ fun getUncheckTransactionChkdtls(chkfileId: String): List<TTransactionChkdtl>
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun doCheckTransactionChkdtl(chkdtl: TTransactionChkdtl): TTransactionChkdtl
+
+ @Transactional(rollbackFor = [Exception::class], readOnly = true)
+ fun checkUncheckExists(chkfileId: String): Boolean
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun doCheckLocalMoreDtls(chkfile: TTransactionChkfile): Int
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun doFinishChkfileStatus(chkfile: TTransactionChkfile, checkStatus: TSourceTypeCheckStatus)
+
+ @Transactional(rollbackFor = [Exception::class], readOnly = true)
+ fun getNeedRepairChkdtls(chkfile: TTransactionChkfile): List<TTransactionChkdtl>
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun doRepairTransactionChkdtl(chkdtl: TTransactionChkdtl): TTransactionChkdtl
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun saveOrUpdateTransctionChkdtl(chkdtl: TTransactionChkdtl)
+
+
+ @Transactional(rollbackFor = [Exception::class])
+ fun doConfirmChkfileStatus(chkfile: TTransactionChkfile, checkStatus: TSourceTypeCheckStatus): TSourceTypeCheckStatus
+
+
+
}
\ 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
index 76abfd8..861212a 100644
--- 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
@@ -44,9 +44,15 @@
@Transactional
fun cancelInit(originRefno: String, builder: TransactionBuilder): TTransactionMain
+ /**
+ * 对账一致处理接口
+ * */
+ @Transactional(rollbackFor = [Exception::class])
+ fun checkSuccessConfirm(refno: String, agentAccdate: String): TTransactionMain
+
// 补帐接口
- @Transactional
- fun repair(refno: String, remark: String): TTransactionMain
+ @Transactional(rollbackFor = [Exception::class])
+ fun repair(refno: String, agentAccdate: String, sourcetypeRefno: String, remark:String): TTransactionMain
}
@Service
@@ -57,6 +63,9 @@
@Autowired
private lateinit var shopAccBalanceAsyncTask: ShopAccBalanceAsyncTask
+ @Autowired
+ private lateinit var kafkaSendMsgService: KafkaSendMsgService
+
fun init(builder: TransactionBuilder): TTransactionMain {
try {
@@ -87,7 +96,11 @@
fun success(refno: String, sourcetypeRefno: String, accdateUpdate: Boolean? = true): TTransactionMain {
return transactionService.success(refno, sourcetypeRefno, accdateUpdate).also {
if (it.shop) {
- shopAccBalanceAsyncTask.updateShopBalance(it.refno)
+ shopAccBalanceAsyncTask.updateShopBalance(it.shopDtl)
+ }
+
+ if (it.person && !it.personDtl.userid.isNullOrEmpty()) {
+ kafkaSendMsgService.sendJpushMessage(it.personDtl.userid, "交易提醒", "你有一笔${it.personDtl.amount}元的支出,点击查看详情", it.refno, mutableMapOf(), it.tenantid)
}
}
}
@@ -111,4 +124,17 @@
}
return trans
}
+
+ fun checkSuccessConfirm(refno: String, agentAccdate: String): TTransactionMain {
+ return transactionService.checkSuccessConfirm(refno, agentAccdate)
+ }
+
+ fun repair(refno: String, agentAccdate: String, sourcetypeRefno: String, remark: String): TTransactionMain {
+ return transactionService.repair(refno, agentAccdate, sourcetypeRefno, remark).also {
+ if (it.shop) {
+ shopAccBalanceAsyncTask.updateShopBalance(it.shopDtl)
+ }
+ }
+ }
+
}
\ No newline at end of file
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
deleted file mode 100644
index d857281..0000000
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/app/bean/app_request_param.kt
+++ /dev/null
@@ -1,2 +0,0 @@
-package com.supwisdom.dlpay.app.bean
-
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
index 8ca8d92..db0f82d 100644
--- 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
@@ -21,12 +21,18 @@
import com.supwisdom.dlpay.framework.util.*
import com.supwisdom.dlpay.system.service.FunctionService
import mu.KotlinLogging
+import org.jose4j.jwt.ReservedClaimNames
import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.data.redis.connection.RedisConnectionFactory
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.core.userdetails.UserDetailsByNameServiceWrapper
+import org.springframework.security.oauth2.provider.OAuth2Authentication
+import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler
import org.springframework.social.connect.web.HttpSessionSessionStrategy
import org.springframework.stereotype.Controller
@@ -204,11 +210,29 @@
@RestController
class UserInforController {
+ @Autowired
+ lateinit var jwtConfig: JwtConfig
+ @Autowired
+ private lateinit var redisConnectionFactory: RedisConnectionFactory
- @RequestMapping("/api/userinfor")
- fun user(user: Principal): Principal {
- System.out.println(user)
- return user
+ @RequestMapping("/userinfor")
+ fun user(@RequestParam("access_token") access_token: String?,
+ @RequestHeader(Constants.HEADER_AUTHORIZATION) auth: String?): ResponseEntity<Any> {
+ if (access_token.isNullOrEmpty() && auth.isNullOrEmpty()) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ }
+ var jwt: String
+ if(!auth.isNullOrEmpty()){
+ jwt = auth.substring(jwtConfig.tokenHeader.length)
+ }else{
+ jwt = access_token!!
+ }
+ val obj: OAuth2Authentication? = RedisTokenStore(redisConnectionFactory).readAuthentication(jwt) ?: return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ val user = obj!!.userAuthentication.principal as UserDetails
+ if(user.username.isNullOrEmpty()){
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ }
+ return ResponseEntity.status(HttpStatus.OK).body("""{"name":"${user.username}"}""")
}
}
@@ -220,6 +244,7 @@
@Autowired
lateinit var commonService: CommonService
+
private val logger = KotlinLogging.logger {}
@GetMapping("/login")
@@ -260,6 +285,7 @@
return "index"
}
+
}
@Controller
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
index d5a13dd..38f1499 100644
--- 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
@@ -30,9 +30,11 @@
override fun getSystemVersion(): String {
return try {
- Manifests.read("Payapi-Version") ?: "version 1.0"
+ var ver = Manifests.read("Payapi-Version") ?: "version 1.0"
+ ver += Manifests.read("Payapi-Buildtime") ?: "no"
+ ver
} catch (ex: Exception) {
-// ex.printStackTrace()
+ ex.printStackTrace()
"unknown"
}
}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
index 0f66df7..c795cbd 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
@@ -42,23 +42,23 @@
@Autowired
lateinit var userService: UserService
-
override fun onAuthenticationSuccess(request: HttpServletRequest, response: HttpServletResponse, authentication: Authentication) {
- logger.error(request.getParameter("platform"))
+ val platform = request.getParameter("platform")
+ logger.error(platform)
val temp = authentication.principal as TBMobileUser
- val user = mobileApiService.findUserByPhone(temp.phone)
+ val user = mobileApiService.findUserById(temp.uid)
val exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.MOBILE_LOGIN_EXPIRE_IN_SECONDS,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,
+ "audience" to user.loginid,
Constants.JWT_CLAIM_TENANTID to "mobile",
Constants.JWT_CLAIM_AUTHORITIES to temp.authorities))
val jwt = JwtRedis().apply {
jti = token.jti
- uid = temp.phone
+ uid = user.loginid
status = TradeDict.JWT_STATUS_NORMAL
expiration = token.expiration.valueInMillis
}.apply {
@@ -73,6 +73,7 @@
user.loginpwderrortime = null
}
user.lastlogin = DateUtil.getNow()
+ user.lastloginplatform = platform
user.jti = jwt.jti
mobileApiService.saveUser(user)
var payseted = false
@@ -97,6 +98,7 @@
?.put("now",System.currentTimeMillis())
?.put("tenantid", "mobile")
?.put("name", name)
+ ?.put("uid", user.uid)
?.put("phone", StringUtil.phoneReplace(user.phone))
?.put("paypwdset",payseted)
?.put("signed", signed)
@@ -127,7 +129,7 @@
}
val temp = request.getParameter("username")
if(!temp.isNullOrEmpty()) {
- mobileUserDao.findByPhone(temp)?.let {
+ mobileUserDao.findByLoginid(temp)?.let {
if (it.loginpwderror == 0) {
it.loginpwderror = 0
it.loginpwderrortime = System.currentTimeMillis()
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
index 09af455..6e2de3c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -3,6 +3,7 @@
import com.supwisdom.dlpay.agent.citizencard.YnrccUtil
import com.supwisdom.dlpay.agent.service.CitizencardPayService
import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.service.QRCodeService
import com.supwisdom.dlpay.api.service.UserService
import com.supwisdom.dlpay.api.util.MobileNumberCheck
import com.supwisdom.dlpay.framework.core.JwtConfig
@@ -11,22 +12,29 @@
import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
import com.supwisdom.dlpay.framework.service.SystemUtilService
import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.framework.util.Dictionary
import com.supwisdom.dlpay.mobile.domain.TBMobileUser
import com.supwisdom.dlpay.mobile.service.MobileApiService
import com.supwisdom.dlpay.system.service.DictionaryProxy
import com.supwisdom.dlpay.util.ConstantUtil
+import com.supwisdom.dlpay.util.RSAKeysGenerate
+import mu.KotlinLogging
import org.apache.commons.lang.StringUtils
+import org.jose4j.jwt.ReservedClaimNames
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.data.redis.core.RedisTemplate
+import org.springframework.http.HttpStatus
+import org.springframework.http.ResponseEntity
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.RequestHeader
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
+import java.util.*
@RestController
@@ -42,6 +50,7 @@
lateinit var apiJwtRepository: ApiJwtRepository
@Autowired
lateinit var systemUtilService: SystemUtilService
+ val logger = KotlinLogging.logger { }
@RequestMapping("/time")
fun time(): JsonResult {
@@ -88,10 +97,15 @@
val temp = redisTemplate.opsForValue().get(phone)
if (temp.isNullOrEmpty()) {
val code = RandomUtils.randomNumber(6)
- System.out.println(code)
+ logger.error { code }
+ //TODO 先发送成功,再放入redis
+ redisTemplate.opsForValue().set(phone, code, Duration.ofMinutes(5))
+ val rs = mobileApiService.sendSms(phone, code)
+ if ("0" != rs.retcode) {
+ return JsonResult.error(rs.retmsg)
+ }
redisTemplate.opsForValue().set(phone, code, Duration.ofMinutes(5))
}
- //TODO call send code sdk
return JsonResult.ok("验证码已发送")
}
@@ -111,6 +125,8 @@
var user = mobileApiService.findUserByPhone(phone)
if (user == null) {
user = TBMobileUser()
+ //登录ID和phone一致
+ user.loginid = phone
user.phone = phone
user.registerplatform = platform
user.registerdate = DateUtil.getNow()
@@ -122,6 +138,9 @@
}
user.status = TradeDict.STATUS_NORMAL
user.registerplatform = platform
+ if(!user.registerplatform.isNullOrEmpty()){
+ user.lastloginplatform = user.registerplatform!!.split(",")[1]
+ }
user.devuid = uuid
user = mobileApiService.saveUser(user)
val newCode = RandomUtils.getRandomString(30)
@@ -166,12 +185,12 @@
user.auths = authorities
val token = JwtTokenUtil(jwtConfig).generateToken(
mapOf("uid" to user.uid, "issuer" to "payapi",
- "audience" to user.phone,
+ "audience" to user.loginid,
Constants.JWT_CLAIM_TENANTID to "mobile",
Constants.JWT_CLAIM_AUTHORITIES to user.authorities))
val jwt = JwtRedis().apply {
jti = token.jti
- uid = user.phone
+ uid = user.loginid
status = TradeDict.JWT_STATUS_NORMAL
expiration = token.expiration.valueInMillis
}.apply {
@@ -187,6 +206,12 @@
}
user.lastlogin = DateUtil.getNow()
user.jti = jwt.jti
+ val keyMap = RSAKeysGenerate.initKey()
+ val publicKey = RSAKeysGenerate.getPublicKey(keyMap)
+ val privateKey = RSAKeysGenerate.getPrivateKey(keyMap)
+ user.rsaprivate = privateKey
+ user.rsapublic = publicKey
+ user.secertkey = RandomUtils.getSecureRandomHex()
mobileApiService.saveUser(user)
redisTemplate.delete(user.uid)
var payseted = false
@@ -225,6 +250,13 @@
lateinit var dictionaryProxy: DictionaryProxy
@Autowired
lateinit var citizencardPayService: CitizencardPayService
+ @Autowired
+ lateinit var apiJwtRepository: ApiJwtRepository
+ @Autowired
+ lateinit var jwtConfig: JwtConfig
+ @Autowired
+ lateinit var qrcodeService:QRCodeService
+ val logger = KotlinLogging.logger { }
@RequestMapping("/idtypes")
fun idtypes(): JsonResult {
@@ -232,17 +264,60 @@
return JsonResult.ok("OK").put("idtypes", dict)!!
}
+ @RequestMapping("/logout")
+ fun logout(@RequestHeader("Authorization") auth: String?): ResponseEntity<Any> {
+ if (auth == null) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ }
+ val jwt = auth.substring(jwtConfig.tokenHeader.length)
+ val claims = JwtTokenUtil(jwtConfig).verifyToken(jwt)
+ SecurityContextHolder.clearContext()
+ apiJwtRepository.deleteById(claims[ReservedClaimNames.JWT_ID].toString())
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
+ }
+
/**
* 用户信息
* */
@RequestMapping("/infor")
fun getUserInfor(): JsonResult {
val p = SecurityContextHolder.getContext().authentication
- mobileApiService.findUserById(p.name)
+ var user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
- return JsonResult.ok("OK").put("now", System.currentTimeMillis())!!
+ var tk= ""
+ if (!user.jti.isNullOrEmpty()) {
+ var opt = apiJwtRepository.findById(user.jti!!)
+ if(opt.isPresent){
+ var jwt = opt.get()
+ val cur = System.currentTimeMillis()
+ //token 小于12个小时,则更新它
+ if(jwt.expiration-cur<1000*60*60*12){
+ val token = JwtTokenUtil(jwtConfig).generateToken(
+ mapOf("uid" to user.uid, "issuer" to "payapi",
+ "audience" to user.loginid,
+ Constants.JWT_CLAIM_TENANTID to "mobile",
+ Constants.JWT_CLAIM_AUTHORITIES to p.authorities))
+ jwt = JwtRedis().apply {
+ jti = token.jti
+ uid = user.loginid
+ status = TradeDict.JWT_STATUS_NORMAL
+ expiration = token.expiration.valueInMillis
+ }.apply {
+ //删除之前的token
+ if (!user.jti.isNullOrEmpty()) {
+ apiJwtRepository.deleteById(user.jti!!)
+ }
+ apiJwtRepository.save(this)
+ }
+ user.jti = jwt.jti
+ mobileApiService.saveUser(user)
+ tk = token.jwtToken
+ }
+ }
+ }
+ return JsonResult.ok("OK").put("now", System.currentTimeMillis())
+ ?.put("token", tk)!!
}
-
/**
* 验证码生成,内部校验
* */
@@ -250,16 +325,21 @@
fun code(): JsonResult {
val p = SecurityContextHolder.getContext().authentication
val user = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在,请注册")
- if (user.phone.isEmpty()) {
+ if (user.phone.isNullOrEmpty()) {
return JsonResult.error("用户不存在,请注册")
}
- val temp = redisTemplate.opsForValue().get(user.phone)
+ val temp = redisTemplate.opsForValue().get(user.phone!!)
if (temp.isNullOrEmpty()) {
val code = RandomUtils.randomNumber(6)
- System.out.println(code)
- redisTemplate.opsForValue().set(user.phone, code, Duration.ofMinutes(5))
+ logger.error { code }
+ //TODO delete it in product
+ redisTemplate.opsForValue().set(user.loginid, code, Duration.ofMinutes(5))
+ val rs = mobileApiService.sendSms(user.phone!!, code)
+ if ("0" != rs.retcode) {
+ return JsonResult.error(rs.retmsg)
+ }
+ redisTemplate.opsForValue().set(user.loginid, code, Duration.ofMinutes(5))
}
- //TODO call send code sdk
return JsonResult.ok("验证码已发送")
}
@@ -269,14 +349,17 @@
val p = SecurityContextHolder.getContext().authentication
val user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
- val temp = redisTemplate.opsForValue().get(user.phone)
+ if (user.phone.isNullOrEmpty()) {
+ return JsonResult.error("手机号不存在,请注册")
+ }
+ val temp = redisTemplate.opsForValue().get(user.phone!!)
if (!temp.isNullOrEmpty()) {
if (temp != code) {
return JsonResult.error("验证码错误")
}
val newCode = RandomUtils.getRandomString(30)
redisTemplate.opsForValue().set(user.uid, newCode, Duration.ofHours(1))
- redisTemplate.delete(user.phone)
+ redisTemplate.delete(user.phone!!)
if (!personid.isNullOrEmpty()) {
//绑定用户
val person = userService.findOnePersonByUserid(personid)
@@ -298,7 +381,10 @@
val p = SecurityContextHolder.getContext().authentication
val user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
- val phone = user.phone
+ if (user.phone.isNullOrEmpty()) {
+ return JsonResult.error("手机号不存在,请注册")
+ }
+ val phone = user.phone!!
val card = mobileApiService.findCardByNo(cardno)
?: return JsonResult.error("银行卡号有误")
if (card.userid.isNullOrEmpty() || card.status != TradeDict.STATUS_NORMAL) {
@@ -316,7 +402,7 @@
return JsonResult.error("该银行卡号已被绑定,如有疑问,请联系客服")
}
//call api
- var resp = citizencardPayService.bindCard(cardno, name, idtype, idno, phone);
+ var resp = citizencardPayService.bindCard(cardno, name, idtype, idno, phone)
if (resp.code != "0000") {
return JsonResult.error(resp.message)
}
@@ -328,14 +414,14 @@
mobileApiService.saveCard(card)
mobileApiService.saveUser(user)
}
- System.out.println(resp.captcha)
+ logger.error { resp.captcha }
var code = if (resp.captcha.isNullOrEmpty()) {
RandomUtils.randomNumber(6)
} else {
resp.captcha
}
- System.out.println(code)
- redisTemplate.opsForValue().set(user.phone, code, Duration.ofMinutes(10))
+ logger.error { code }
+ redisTemplate.opsForValue().set(phone, code, Duration.ofMinutes(10))
var payseted = false
if (!user.paypwd.isNullOrEmpty()) {
payseted = true
@@ -452,25 +538,25 @@
fun signbxy(agree: String): JsonResult {
val p = SecurityContextHolder.getContext().authentication
val user = mobileApiService.findUserById(p.name)
- ?: return JsonResult.error("用户不存在,请注册")
+ ?: return JsonResult.error("手机号不存在,请注册")
+ if (user.phone.isNullOrEmpty()) {
+ return JsonResult.error("用户不存在,请注册")
+ }
var signed: String
if (!user.userid.isNullOrEmpty()) {
- var card = mobileApiService.findCardByUserid(user.userid!!) ?: return JsonResult.error("卡片不存在,请重新绑定")
- if (card.signed) {
- signed = TradeDict.STATUS_YES
- } else {
- //call sign api
- val person = userService.findOnePersonByUserid(card.userid)
- var resp = citizencardPayService.signCard(card.cardno, person.name, person.idtype, person.idno, user.phone, YnrccUtil.TRANSTYPE_SIGNCARD)
- if (resp.code != "0000") {
- return JsonResult.error(resp.message)
- }
- card.signed = true
- user.signedtime = DateUtil.getNow();
- mobileApiService.saveCard(card)
- mobileApiService.saveUser(user)
- signed = TradeDict.STATUS_YES
+ var card = mobileApiService.findCardByUserid(user.userid!!)
+ ?: return JsonResult.error("卡片不存在,请重新绑定")
+ //call sign api
+ val person = userService.findOnePersonByUserid(card.userid)
+ var resp = citizencardPayService.signCard(card.cardno, person.name, person.idtype, person.idno, user.phone!!, YnrccUtil.TRANSTYPE_SIGNCARD)
+ if (resp.code != "0000") {
+ return JsonResult.error(resp.message)
}
+ card.signed = true
+ user.signedtime = DateUtil.getNow()
+ mobileApiService.saveCard(card)
+ mobileApiService.saveUser(user)
+ signed = TradeDict.STATUS_YES
} else {
return JsonResult.error("请先绑定银行卡")
}
@@ -538,6 +624,9 @@
?.put("name", name)
?.put("needrebind", needrebind)
?.put("signed", signed)
+ ?.put("version","1")
+ ?.put("minversion","1")
+ ?.put("versionmsg","1")
?.put("userid", if (user.userid.isNullOrEmpty()) "" else user.userid)!!.put("t", t)!!
}
@@ -575,6 +664,9 @@
}
val pwdtimes = user.checkLoginpwdtime()
if (pwdtimes == -1) {
+ if (!user.jti.isNullOrEmpty()) {
+ apiJwtRepository.deleteById(user.jti!!)
+ }
return JsonResult.error(-1, "原密码错误次数过多,将退出系统,请重新登录系统或点击忘记密码功能找回密码")
} else if (pwdtimes == 1) {
mobileApiService.saveUser(user)
@@ -606,7 +698,8 @@
return JsonResult.error(-1, "银行卡未绑定,请先绑定")
}
val person = userService.findOnePersonByUserid(user.userid!!)
- val card = mobileApiService.findCardByUserid(user.userid!!) ?: return JsonResult.error(-1, "银行卡未绑定,请先绑定")
+ val card = mobileApiService.findCardByUserid(user.userid!!)
+ ?: return JsonResult.error(-1, "银行卡未绑定,请先绑定")
var status = ""
//normal/loss/frozen/locked
when (card.transStatus) {
@@ -646,7 +739,8 @@
if (it) mobileApiService.saveUser(user)
}
}
- var card = mobileApiService.findCardByUserid(user.userid!!) ?: return JsonResult.error(-1, "银行卡未绑定,请先绑定")
+ var card = mobileApiService.findCardByUserid(user.userid!!)
+ ?: return JsonResult.error(-1, "银行卡未绑定,请先绑定")
if (card.transStatus != TradeDict.STATUS_NORMAL) {
return JsonResult.error("卡状态非正常,不能挂失")
}
@@ -662,11 +756,13 @@
@RequestMapping("/qrcode")
fun qrcode(): JsonResult {
val p = SecurityContextHolder.getContext().authentication
- mobileApiService.findUserById(p.name)
+ val user = mobileApiService.findUserById(p.name)
?: return JsonResult.error("用户不存在,请注册")
- //TODO cardlost
- return JsonResult.ok("ok").put("qrcode",p.name)!!
+ val resp = qrcodeService.encodeCode(user.uid)
+ return if(resp.retcode==0){
+ JsonResult.ok("ok").put("qrcode", resp.retmsg)!!
+ }else{
+ JsonResult.error(resp.retmsg)
+ }
}
-
-
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt
index 8146652..27f63ad 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt
@@ -1,8 +1,12 @@
package com.supwisdom.dlpay.mobile.dao
+import com.supwisdom.dlpay.mobile.domain.TBMsg
import com.supwisdom.dlpay.mobile.domain.TBPages
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
-interface PagesDao : JpaRepository<TBPages,String>
\ No newline at end of file
+interface PagesDao : JpaRepository<TBPages, String>
+
+@Repository
+interface MsgDao : JpaRepository<TBMsg, String>
\ 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
index 76ad4c6..c7d8a0e 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/MobileUserDao.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/MobileUserDao.kt
@@ -6,7 +6,11 @@
@Repository
interface MobileUserDao : JpaRepository<TBMobileUser, String> {
+ fun findByLoginid(loginid: String): TBMobileUser?
+
fun findByPhone(phone: String): TBMobileUser?
+
+ fun findByUseridAndStatus(userid:String,status:String):List<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
index 68b9155..339e607 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
@@ -1,14 +1,15 @@
package com.supwisdom.dlpay.mobile.domain
-import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.util.DateUtil
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
@Entity
-@Table(name = "TB_MOBILE_USER")
+@Table(name = "TB_MOBILE_USER",indexes = [Index(name = "mobile_user_loginid_idx", columnList = "loginid", unique = true)])
class TBMobileUser : UserDetails {
override fun getAuthorities(): Collection<GrantedAuthority>? {
return this.auths
@@ -19,7 +20,7 @@
}
override fun getUsername(): String {
- return this.phone
+ return this.loginid
}
override fun isCredentialsNonExpired(): Boolean {
@@ -31,7 +32,10 @@
}
override fun isAccountNonExpired(): Boolean {
- return true
+ if(expiredate.isNullOrEmpty()){
+ return true
+ }
+ return this.expiredate!! >= DateUtil.getNow("yyyyMMdd")
}
override fun isAccountNonLocked(): Boolean {
@@ -41,17 +45,24 @@
@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 = ""
/**
- * 手机号
+ * 登录id
* */
- @Column(name = "phone", length = 15)
- var phone: String = ""
+
+ @Column(name = "loginid", length = 64)
+ @NotNull
+ var loginid: String = ""
+
+ /**
+ * 登录密码
+ * */
+ @Column(name = "loginpwd", length = 64)
+ var loginpwd: String = ""
/**
* 设备uuid
@@ -102,12 +113,6 @@
var status: String? = null
/**
- * 登录密码
- * */
- @Column(name = "loginpwd", length = 64)
- var loginpwd: String = ""
-
- /**
* 支付密码
* */
@Column(name = "paypwd", length = 64)
@@ -137,7 +142,6 @@
@Column(name = "paypwderrortime", length = 16)
var paypwderrortime: Long? = 0
-
/**
* jti
* */
@@ -145,11 +149,6 @@
var jti: String? = null
/**
- * 签约
- * */
- @Column(name = "issigned", length = 20)
- var issigned: String? = null
- /**
* 签约时间
* */
@Column(name = "signedtime", length = 20)
@@ -160,7 +159,24 @@
* */
@Column(name = "ulogo", length = 100)
var ulogo: String? = null
+ @Column(name = "rsaprivate", length = 1000)
+ var rsaprivate: String? = null
+ @Column(name = "rsapublic", length = 1000)
+ var rsapublic: String? = null
+ @Column(name = "secertkey", length = 64)
+ var secertkey: String? = null
+ @Column(name = "tenantid", length = 32)
+ var tenantid:String? = null
+
+ @Column(name = "expiredate", length = 8)
+ var expiredate: String? = null
+
+ @Column(name = "email", length = 100)
+ var email: String? = null
+
+ @Column(name = "phone", length = 15)
+ var phone: String? = null
fun checkLoginpwdtime():Int{
if (this.loginpwderror >= 5 && (System.currentTimeMillis() - this.loginpwderrortime!!) < 1000 * 60 * 30) {
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMsg.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMsg.kt
new file mode 100644
index 0000000..53ec2f0
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMsg.kt
@@ -0,0 +1,41 @@
+package com.supwisdom.dlpay.mobile.domain
+
+import org.hibernate.annotations.GenericGenerator
+import javax.persistence.*
+
+@Entity
+@Table(name = "TB_MSG")
+class TBMsg{
+ @Id
+ @GenericGenerator(name = "idGenerator", strategy = "uuid")
+ @GeneratedValue(generator = "idGenerator")
+ @Column(name = "msgid", nullable = false, length = 32)
+ var msgid: String = ""
+
+ @Column(name = "userid", length = 32)
+ var userid:String = ""
+
+ @Column(name = "title", length = 100)
+ var title: String? = null
+
+ @Column(name = "refno", length = 32)
+ var refno: String? = null
+
+ @Column(name = "content", length = 400)
+ var content: String? = null
+
+ @Column(name = "lastupdate", length = 14)
+ var lastupdate: String? = null
+
+ @Column(name = "extras", length = 1000)
+ var extras: String? = null
+
+ @Column(name = "pushresult", length = 500)
+ var pushresult: String? = null
+
+ @Column(name = "pusheduids", length = 400)
+ var pusheduids:String? = ""
+
+ @Column(name = "tenantid", length = 32)
+ var tenantid:String? = null
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBPages.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBPages.kt
index cbe892b..6c9b74a 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBPages.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBPages.kt
@@ -20,4 +20,7 @@
@Column(name = "lastupdate", length = 14)
var lastupdate: String? = null
+
+ @Column(name = "tenantid", length = 32)
+ var tenantid:String? = null
}
\ 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
index 6b28b01..55d717c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt
@@ -1,5 +1,6 @@
package com.supwisdom.dlpay.mobile.service
+import com.supwisdom.dlpay.api.bean.BaseResp
import com.supwisdom.dlpay.api.domain.TCard
import com.supwisdom.dlpay.mobile.domain.TBMobileUser
import com.supwisdom.dlpay.mobile.domain.TBPages
@@ -17,5 +18,13 @@
fun findCardByUserid(userid :String) :TCard?
+ fun findCityCardByUserid(userid :String) :TCard?
+
fun saveCard(card:TCard):TCard
+
+ fun sendSms(phone:String,code:String):BaseResp
+
+ fun findByUseridAndStatus(userid:String,status:String):List<TBMobileUser>?
+
+ fun findCardByUseridAndCardphyid(userid: String, cardtype: String, cardphyid: String?): TCard?
}
\ 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
index e7dee86..292b73c 100644
--- 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
@@ -1,15 +1,21 @@
package com.supwisdom.dlpay.mobile.service.impl
+import com.mascloud.sdkclient.Client
+import com.supwisdom.dlpay.api.bean.BaseResp
import com.supwisdom.dlpay.api.dao.CardDao
import com.supwisdom.dlpay.api.domain.TCard
+import com.supwisdom.dlpay.framework.service.SystemUtilService
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 com.supwisdom.dlpay.util.ConstantUtil
+import mu.KotlinLogging
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
+import org.springframework.util.Base64Utils
+import java.util.*
@Service
class MobileApiServiceImpl : MobileApiService {
@@ -22,6 +28,11 @@
@Autowired
lateinit var pagesDao: PagesDao
+ @Autowired
+ lateinit var systemUtilService: SystemUtilService
+
+ val logger = KotlinLogging.logger { }
+
override fun saveUser(user: TBMobileUser): TBMobileUser {
return mobileUserDao.save(user)
}
@@ -43,14 +54,109 @@
}
override fun findCardByNo(cardno: String): TCard? {
- return cardDao.findCardByCardnoAndCardtype(cardno,ConstantUtil.CARDTYPE_BANKCARD)
+ return cardDao.findCardByCardnoAndCardtype(cardno, ConstantUtil.CARDTYPE_BANKCARD)
}
override fun findCardByUserid(userid: String): TCard? {
- return cardDao.findCardByUseridAndCardtype(userid,ConstantUtil.CARDTYPE_BANKCARD)
+ return cardDao.findCardByUseridAndCardtype(userid, ConstantUtil.CARDTYPE_BANKCARD)
+ }
+
+ override fun findCityCardByUserid(userid: String): TCard? {
+ return cardDao.findCardByUseridAndCardtype(userid, ConstantUtil.CARDTYPE_CITIZENCARD)
}
override fun saveCard(card: TCard): TCard {
return cardDao.save(card)
}
+
+ override fun sendSms(phone: String, code: String): BaseResp {
+ var resp = BaseResp()
+ var url = systemUtilService.getBusinessValue("sms.url")
+ if (url.isNullOrEmpty()) {
+ resp.retcode = "1"
+ resp.retmsg = "短信业务参数未配置"
+ logger.error { "短信参数:sms.url 未在业务表中配置" }
+ return resp
+ }
+ var account = systemUtilService.getBusinessValue("sms.account")
+ if (account.isNullOrEmpty()) {
+ resp.retcode = "1"
+ resp.retmsg = "短信业务参数未配置"
+ logger.error { "短信参数:sms.account 未在业务表中配置" }
+ return resp
+ }
+ var pwd = systemUtilService.getBusinessValue("sms.pwd")
+ if (pwd.isNullOrEmpty()) {
+ resp.retcode = "1"
+ resp.retmsg = "短信业务参数未配置"
+ logger.error { "短信参数:sms.pwd 未在业务表中配置" }
+ return resp
+ }
+ var ecname = systemUtilService.getBusinessValue("sms.ecname")
+ if (ecname.isNullOrEmpty()) {
+ resp.retcode = "1"
+ resp.retmsg = "短信业务参数未配置"
+ logger.error { "短信参数:sms.ecname 未在业务表中配置" }
+ return resp
+ }
+ var addserial = systemUtilService.getBusinessValue("sms.addserial")
+ if (addserial.isNullOrEmpty()) {
+ addserial=""
+ }
+ var sign = systemUtilService.getBusinessValue("sms.sign")
+ if (sign.isNullOrEmpty()) {
+ resp.retcode = "1"
+ resp.retmsg = "短信业务参数未配置"
+ logger.error { "短信参数:sms.sign 未在业务表中配置" }
+ return resp
+ }
+ var tempid = systemUtilService.getBusinessValue("sms.tempid")
+ if (tempid.isNullOrEmpty()) {
+ resp.retcode = "1"
+ resp.retmsg = "短信业务参数未配置"
+ logger.error { "短信参数:sms.tempid 未在业务表中配置" }
+ return resp
+ }
+ var priority = systemUtilService.getBusinessValue("sms.priority")
+ if (priority.isNullOrEmpty()) {
+ priority = "1"
+ }
+ var client = Client.getInstance()
+ // 正式环境IP,登录验证URL,用户名,密码,集团客户名称
+ var ret = client.login(url, account, pwd, ecname)
+ if (!ret) {
+ logger.error { "无法登陆短信平台,身份验证失" }
+ resp.retcode = "1"
+ resp.retmsg = "无法登陆短信平台"
+ return resp
+ }
+ var sendResult = client.sendTSMS(arrayOf(phone),
+ tempid, arrayOf(code), addserial, priority.toInt(), sign, UUID.randomUUID().toString())
+ println("推送结果: $sendResult")
+ return if (sendResult == 1 || sendResult == 110) {
+ resp.retcode = "0"
+ resp.retmsg = "成功"
+ resp
+ } else if (sendResult == 104) {
+ resp.retcode = "1"
+ resp.retmsg = "手机号错误"
+ resp
+ } else {
+ resp.retcode = "1"
+ resp.retmsg = "短信发送失败,请稍后再试"
+ resp
+ }
+ }
+
+ override fun findByUseridAndStatus(userid: String, status: String): List<TBMobileUser>? {
+ return mobileUserDao.findByUseridAndStatus(userid, status)
+ }
+
+ override fun findCardByUseridAndCardphyid(userid: String, cardtype: String, cardphyid: String?): TCard? {
+ return if (cardphyid.isNullOrEmpty()) {
+ cardDao.findCardByUseridAndCardtype(userid, cardtype)
+ } else {
+ cardDao.findBankcardByCitizencard(userid, cardtype, cardphyid)
+ }
+ }
}
\ 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
index 2878eb3..90dfd62 100644
--- 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
@@ -15,11 +15,9 @@
@Service
class MobileUserServiceImpl : MobileUserService {
companion object {
- const val TIME_INTERVAL = 1000 * 6 * 30
+ const val TIME_INTERVAL = 1000 * 60 * 30
}
-
val logger = KotlinLogging.logger { }
-
@Autowired
lateinit var mobileUserDao: MobileUserDao
@@ -28,7 +26,7 @@
if (username.isNullOrEmpty()) {
throw UsernameNotFoundException("用户不存在")
}
- val temp = mobileUserDao.findByPhone(username)
+ val temp = mobileUserDao.findByLoginid(username)
if (temp != null) {
if (temp.loginpwd.isEmpty()) {
throw UserLoginFailException("用户注册后未设置登录密码,请找回密码或重新注册")
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/oauth.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/oauth.kt
index a249193..d007c7e 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/oauth.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/oauth.kt
@@ -1,13 +1,16 @@
package com.supwisdom.dlpay
+import com.supwisdom.dlpay.framework.core.PasswordBCryptConfig
import com.supwisdom.dlpay.system.service.ParamService
import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.annotation.Bean
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.crypto.bcrypt.BCryptPasswordEncoder
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
@@ -23,8 +26,7 @@
import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore
import java.util.*
import org.springframework.security.oauth2.provider.token.TokenStore
-
-
+import java.security.SecureRandom
class OAuthDetailService : ClientDetailsService {
@@ -47,9 +49,16 @@
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
+ if(!it.thirdurl.isNullOrEmpty()){
+ val redir = HashSet<String>()
+ when {
+ it.thirdurl.contains(",") -> redir.addAll(it.thirdurl.split(","))
+ it.thirdurl.contains(";") -> redir.addAll(it.thirdurl.split(";"))
+ else -> redir.add(it.thirdurl)
+ }
+ details.registeredRedirectUri = redir
+ }
+
}
return details
}
@@ -70,9 +79,21 @@
@Autowired
private lateinit var authenticationManager: AuthenticationManager
+ @Autowired
+ lateinit var passwordBCryptConfig: PasswordBCryptConfig
override fun configure(security: AuthorizationServerSecurityConfigurer?) {
security?.allowFormAuthenticationForClients()
+ security?.passwordEncoder(pwdEncoder())
+ }
+ @Bean
+ fun pwdEncoder(): BCryptPasswordEncoder {
+ return if (passwordBCryptConfig.seed.isBlank()) {
+ BCryptPasswordEncoder()
+ } else {
+ BCryptPasswordEncoder(passwordBCryptConfig.length,
+ SecureRandom(passwordBCryptConfig.seed.toByteArray()))
+ }
}
override fun configure(clients: ClientDetailsServiceConfigurer?) {
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt
index 2e747ae..b3e1fac 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -7,6 +7,7 @@
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.tenant.TenantContext
import com.supwisdom.dlpay.framework.util.Constants
import com.supwisdom.dlpay.framework.util.TradeDict
import com.supwisdom.dlpay.mobile.AuthLoginFailHandler
@@ -19,7 +20,6 @@
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
@@ -33,7 +33,6 @@
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
@@ -42,9 +41,11 @@
import org.springframework.web.cors.CorsConfigurationSource
import org.springframework.web.cors.UrlBasedCorsConfigurationSource
import org.springframework.web.filter.OncePerRequestFilter
+import org.springframework.web.servlet.config.annotation.CorsRegistry
import java.security.SecureRandom
import java.util.*
import javax.servlet.FilterChain
+import javax.servlet.http.HttpFilter
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import javax.sql.DataSource
@@ -60,9 +61,85 @@
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) {
+ if (!jwtConfig.multiTenant) {
+ TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID)
+ }
+ 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")
+ }
+ val claims = getUtil().verifyToken(jwt)
+ 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}")
+ }
+ }
+ if (jwtConfig.multiTenant) {
+ 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
+ }
+ TenantContext.setTenantSchema(tenantId)
+ }
+ 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)
+ }
+}
+
+@Component
+class MobileSecurityFilter : OncePerRequestFilter() {
+ @Autowired
+ lateinit var jwtConfig: JwtConfig
+
+ @Autowired
+ lateinit var apiJwtRepository: ApiJwtRepository
+
+ private var jwtUtil: JwtTokenUtil? = null
private fun getUtil(): JwtTokenUtil {
if (jwtUtil == null) {
@@ -85,7 +162,7 @@
url = url.replace(context, "")
}
logger.info(url)
- if (!url.startsWith("/api/") && !url.startsWith("/mobileapi/v1/")) {
+ if (!url.startsWith("/mobileapi/v1/")) {
filterChain.doFilter(request, response)
return
}
@@ -96,18 +173,7 @@
} 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")
@@ -117,14 +183,17 @@
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
+ if (jwtConfig.multiTenant) {
+ 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
+ }
+ TenantContext.setTenantSchema(tenantId)
}
val auth = UsernamePasswordAuthenticationToken(claims[Constants.JWT_CLAIM_UID], null,
(claims[Constants.JWT_CLAIM_AUTHORITIES] as ArrayList<*>)
@@ -144,14 +213,18 @@
response.status = HttpStatus.UNAUTHORIZED.value()
response.contentType = "application/json;charset=UTF-8"
return
- } catch (e:Exception){
+ } catch (e: Exception) {
SecurityContextHolder.clearContext()
// jwt 失效后返回 401
- response.status=HttpStatus.UNAUTHORIZED.value()
+ response.status = HttpStatus.UNAUTHORIZED.value()
response.contentType = "application/json;charset=UTF-8"
return
}
}
+ response.setHeader("Access-Control-Allow-Origin", "*");
+ response.setHeader("Access-Control-Allow-Methods", "GET,POST,DELETE,PUT,OPTIONS");
+ response.setHeader("Access-Control-Allow-Headers", "*");
+ response.setHeader("Access-Control-Allow-Credentials", "true")
filterChain.doFilter(request, response)
}
}
@@ -164,23 +237,19 @@
@Configuration
@Order(1)
class ApiWebSecurityConfigurationAdapter : WebSecurityConfigurerAdapter() {
-
@Autowired
- lateinit var apiFilter: ApiJwtAuthenticationFilter
-
+ lateinit var apiJwtAuthenticationFilter: ApiJwtAuthenticationFilter
override fun configure(http: HttpSecurity) {
// 设置 API 访问权限管理
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.antMatcher("/api/**")
- .addFilterAfter(apiFilter,
+ .addFilterAfter(apiJwtAuthenticationFilter,
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")
@@ -208,9 +277,9 @@
@Autowired
lateinit var userDetailsService: MobileUserService
-
@Autowired
- lateinit var apiFilter: ApiJwtAuthenticationFilter
+ lateinit var mobileSecurityFilter: MobileSecurityFilter
+
override fun configure(auth: AuthenticationManagerBuilder) {
auth.authenticationProvider(userProvider())
@@ -240,9 +309,9 @@
.cors()
.and()
.antMatcher("/mobileapi/**")
- .addFilterAfter(apiFilter,
+ .addFilterAfter(mobileSecurityFilter,
UsernamePasswordAuthenticationFilter::class.java)
- .authorizeRequests().antMatchers("/mobileapi/i/**","/mobileapi/login")
+ .authorizeRequests().antMatchers("/mobileapi/i/**", "/mobileapi/login")
.permitAll().anyRequest().authenticated()
.and()
.formLogin()
@@ -250,18 +319,17 @@
.failureHandler(failureHandler)
.successHandler(successHandler)
.and().csrf().disable()
- .sessionManagement().maximumSessions(1)
- .expiredUrl("/mobileapi/sessionexpired")
}
+
@Bean
- fun corsConfigurationSource(): CorsConfigurationSource {
+ 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);
+ configuration.allowedOrigins = listOf("*")
+ configuration.allowedMethods = listOf("GET", "POST")
+ configuration.allowedHeaders = listOf("*")
+ val source = UrlBasedCorsConfigurationSource()
+ source.registerCorsConfiguration("/mobileapi/**", configuration)
return source
}
}
@@ -314,7 +382,7 @@
http.apply(validateCodeSecurityConfig)
.and()
.authorizeRequests()
- .antMatchers("/login", "/login/form", "/mobileapi/**").permitAll()
+ .antMatchers("/login", "/login/form", "/mobileapi/**","/userinfor").permitAll()
.antMatchers("/static/**").permitAll()
.antMatchers("/code/image").permitAll()
.antMatchers("/**").hasAnyRole("USER", "ADMIN")
diff --git a/payapi/src/main/resources/application.properties b/payapi/src/main/resources/application.properties
index 9f662ab..0a2b535 100644
--- a/payapi/src/main/resources/application.properties
+++ b/payapi/src/main/resources/application.properties
@@ -30,11 +30,11 @@
server.tomcat.uri-encoding=UTF-8
##################################################
## quartz task scheduler
-shopbalance.updater.cron=10/* * * * * ?
+shopbalance.updater.cron=*/10 * * * * ?
dayend.settletask.cron=0 3/30 2-3 * * ?
-query.third.transdtl.result.cron=7 0/3 * * * ?
-download.ynrcc.chkfile.cron =3 0/10 1 * * ?
-#dayend.settletask.cron = 0 0/2 * * * ?
+query.third.transdtl.result.cron=7 0/1 * * * ?
+payapi.sourcetype.checker.scheduler=7 3/10 * * * ?
+citizencard.dolosstask.cron=-
################################################
# user password
auth.password.bcrypt.length=10
diff --git a/payapi/src/main/resources/data-postgresql.sql b/payapi/src/main/resources/data-postgresql.sql
index 89ba0ee..4298c90 100644
--- a/payapi/src/main/resources/data-postgresql.sql
+++ b/payapi/src/main/resources/data-postgresql.sql
@@ -1,6 +1,6 @@
--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_period" ("id", "period_year", "period_month", "startdate", "enddate", "settleflag" , "tenantid")
+VALUES ('8a53b7826c65b925016c65bfa7c3001c',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}');
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
index 2bca5e2..32cfd2f 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -40,7 +40,7 @@
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}');
+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)
@@ -50,7 +50,7 @@
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}');
+VALUES (25, NULL, 1, NULL, '', '/shop/config', '商户支付能力配置', 3, 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)
@@ -63,7 +63,16 @@
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_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (32, NULL, 1, NULL, '', '/settlelog/index', '结算日志', 5, 3, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (33, NULL, 0, NULL, 'layui-icon-component', '#', '对账中心', 8, -1, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (34, NULL, 1, NULL, '', '/thirdchk/chkstatus', '对账状态查询', 331, 33, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (35, NULL, 1, NULL, '', '/thirdchk/chkfile', '对账明细查询', 332, 33, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (36, NULL, 1, NULL, '', '/shop/shopcheck', '商户审批', 2, 7, '{tenantid}');
INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid)
VALUES ('ff8080816b7947ed016b7955772c0032', 1, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
@@ -117,6 +126,17 @@
VALUES ('ff8080816b7947ed016b79557736007b', 12, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid)
VALUES ('ff8080816b7947ed016b795577370081', 18, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid)
+VALUES ('ff8080816c8468e8016c846d7a570017', 32, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid)
+VALUES ('ff8081816c8468e8016c846d7a570017', 33, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid)
+VALUES ('ff8082816c8468e8016c846d7a570017', 34, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid)
+VALUES ('ff8083816c8468e8016c846d7a570017', 35, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid)
+VALUES ('ff8080816db87e27016db88be41a0014', 36, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+
INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
VALUES (4, '1', 4, '添加功能', '/function/add', '{tenantid}');
@@ -207,11 +227,11 @@
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}');
+VALUES (56, '', 23, '商户详情', '/shop/getshopinfo', '{tenantid}');
INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
-VALUES (57, '', 23, '商户树', '/shop/index', '{tenantid}');
+VALUES (57, '', 23, '查询', '/shop/index', '{tenantid}');
INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
-VALUES (58, '', 23, '新增修改', '/shop/saveorupdate', '{tenantid}');
+VALUES (58, '', 23, '新增跳转', '/shop/load4addshop', '{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)
@@ -244,6 +264,33 @@
VALUES (74, '', 31, '查询', '/report/shopbusiness', '{tenantid}');
INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
VALUES (76, '', 18, '新增', '/param/addsourcetype', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (77, '', 32, '查询', '/settlelog/index', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (78, '', 32, '查询', '/settlelog/dosettle', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (79, '', 34, '查询', '/thirdchk/chkstatus', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (80, '', 34, '强制重对切换', '/thirdchk/forcerecheck', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (81, '', 35, '查询', '/thirdchk/chkfile', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (82, '', 35, '查看详情', '/thirdchk/chkdtl', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (83, '', 23, '新增商户', '/shop/addshop', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (84, '', 23, '修改跳转', '/shop/load4updateshop', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (85, '', 23, '修改', '/shop/updateshop', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (86, '', 23, '审批意见', '/shop/getshopchk', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (87, '', 36, '查询', '/shop/shopcheck', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (88, '', 36, '审核跳转', '/shop/opercheck', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (89, '', 36, '审核', '/shop/docheckshop', '{tenantid}');
+
INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid)
VALUES ('ff8080816b7947ed016b795577300036', 16, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
@@ -371,6 +418,32 @@
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_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816c8468e8016c846d7a5d0018', 77, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816c85279d016c852aa829000d', 78, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816c985e76016c98659ad00015', 79, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816c985e76016c98659ad10016', 80, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816c985e76016c98659ad10017', 81, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816c99abee016c99b1cb1c0004', 82, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('402868516daf75de016dafb36670002a', 83, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816db54261016db543aad40009', 84, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('402868516daf15d2016daf1fcb290017', 85, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816db36bbd016db36ff8580010', 86, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816db36bbd016db36ff8580011', 87, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816db87e27016db94468da0089', 88, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816db87e27016db94468da008a', 89, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
INSERT INTO "tb_subject" ("subjid","subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
@@ -438,24 +511,18 @@
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tenantid")
-VALUES ('D3820D49DACA49199E36537F6719665F', 'citizenCard', 't', '大理市民卡', 't', 'f', 't', 'f', 't', '112234', '-', '{tenantid}');
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno","deposite_subjno","tenantid")
-VALUES ('0997477F40904AD1A2E37FD15345CE00', 'balance', 'f', '账户余额', 't', 'f', 't', 'f', 't', '-', '-', '{tenantid}');
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno","deposite_subjno", "tenantid")
-VALUES ('F0CA47ADC0F24DFCA0D95DF4136CC2D0', 'thirdpart', 'f', '其他第三方支付', 't', 't', 'f', 'f', 'f','-','-', '{tenantid}');
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno","deposite_subjno","tenantid")
-VALUES ('F5B344726FA24BD896E70DEE3D3F46CA', 'swyktv5', 't', '一卡通支付', 't', 't', 't', 't', 't','-','-', '{tenantid}');
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno","deposite_subjno","tenantid")
-VALUES ('28EE54CD3B044CC197D6C5B0E309F8B8', 'alipay', 't', '支付宝', 't', 't', 't', 't', 'f', '112230','112210', '{tenantid}');
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno","deposite_subjno","tenantid")
-VALUES ('DAEF88B54B684347B2B83940C38C7671', 'wechat', 't', '微信支付', 't', 't', 't', 't', 'f', '112231','112211', '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('D3820D49DACA49199E36537F6719665F', 'citizenCard', 't', '大理市民卡', 't', 'f', 't', 'f', 't', '112234', '-', 1, null, '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('0997477F40904AD1A2E37FD15345CE00', 'balance', 'f', '账户余额', 't', 'f', 't', 'f', 't', '-', '-', 0, null, '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('F0CA47ADC0F24DFCA0D95DF4136CC2D0', 'thirdpart', 'f', '其他第三方支付', 't', 't', 'f', 'f', 'f','-','-', 0, null, '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('F5B344726FA24BD896E70DEE3D3F46CA', 'swyktv5', 't', '一卡通支付', 't', 't', 't', 't', 't','-','-', 1, null, '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('28EE54CD3B044CC197D6C5B0E309F8B8', 'alipay', 't', '支付宝', 't', 't', 't', 't', 'f', '112230','112210', 1, '103000', '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('DAEF88B54B684347B2B83940C38C7671', 'wechat', 't', '微信支付', 't', 't', 't', 't', 'f', '112231','112211', 1, '103000', '{tenantid}');
-- 支付方式
INSERT INTO TB_SOURCETYPE_CONFIG (ID, SOURCETYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
@@ -504,25 +571,41 @@
VALUES ('23', 'wechat', 'wechat.refund.certpwd', '微信退款证书密码', NULL, 'f', '{tenantid}');
INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
-VALUES (1, 'yes', 1, '20190514165658', '账户最大余额默认值', '元', '10001', '账户开户时的默认账户最大余额', 'amount', '{tenantid}');
+VALUES (1, 'yes', 1, '20190514165658', '账户最大余额默认值', '元', '10000.0', '账户开户时的默认账户最大余额', 'amount', '{tenantid}');
+INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
+VALUES (2, 'yes', 1, '20190514165658', '默认免密额度', '元', '100.0', '账户开户时的默认免密额度', 'amount', '{tenantid}');
+INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
+VALUES (3, 'yes', 1, '20190514165658', '默认日累计额度', '元', '200.0', '账户余额支付时默认的日累计额度', 'amount', '{tenantid}');
+INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
+VALUES (4, 'yes', 1, '20190514165658', '手机端用户过期时间', '秒', null, '手机端用户过期时间(秒)', 'decimal', '{tenantid}');
+INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
+VALUES (5, 'yes', 1, '20190514165658', '商户信息维护是否需要审核', '', '0', '商户的新增、修改、删除是否需要审核:1-需要;0-不需要', 'switch', '{tenantid}');
+
+INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
+VALUES (2019, 'yes', 1, '20190514165658', '与卡管系统对接的应用ID', null, null, '与卡管系统对接的app_id', 'string', '{tenantid}');
+INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
+VALUES (2020, 'yes', 1, '20190514165658', '与卡管系统对接的签名秘钥', null, null, '与卡管系统对接的appkey', 'string', '{tenantid}');
+INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
+VALUES (2021, 'yes', 1, '20190514165658', '与卡管系统对接的业务参数加密秘钥', null, null, '与卡管系统对接中业务参数加密的deskey', 'string', '{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_shop" ("shopid", "shopname", "shoptype", "fshopid", "status", "check_status", "opendate", "tenantid")
+VALUES (1, '支付中心', 'root', 0, 'normal', 'normal', '20190517', '{tenantid}');
-INSERT INTO "tb_transcode" ("transcode", "transname", "tenantid")
-VALUES (3010, '市民卡代扣', '{tenantid}');
-INSERT INTO "tb_transcode" ("transcode", "transname", "tenantid")
-VALUES (1002, '支付码聚合付', '{tenantid}');
-INSERT INTO "tb_transcode" ("transcode", "transname", "tenantid")
-VALUES (3500, '账户充值', '{tenantid}');
+INSERT INTO "tb_transcode" ("transcode_id", "transcode", "transname", "tenantid")
+VALUES (1, 3010, '市民卡代扣', '{tenantid}');
+INSERT INTO "tb_transcode" ("transcode_id", "transcode", "transname", "tenantid")
+VALUES (2, 1002, '支付码聚合付', '{tenantid}');
+INSERT INTO "tb_transcode" ("transcode_id", "transcode", "transname", "tenantid")
+VALUES (3, 3500, '账户充值', '{tenantid}');
INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES (1, 'cancel', 'reverseFlagList', '冲正', '冲正状态', '{tenantid}');
+VALUES (1, 'cancel', 'reverseFlagList', '被撤销', '冲正状态', '{tenantid}');
INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES (2, 'reverse', 'reverseFlagList', '手工撤销', '冲正状态', '{tenantid}');
+VALUES (2, 'refund', 'reverseFlagList', '被退款', '冲正状态', '{tenantid}');
INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
VALUES (3, 'none', 'reverseFlagList', '-', '冲正状态', '{tenantid}');
INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
@@ -585,6 +668,8 @@
INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
VALUES (30, 'shopmarket', 'dtltypeList', '商超消费', '流水类型', '{tenantid}');
+
+
INSERT INTO TB_QRCODE_PATTERN(ID, PATTERN, SOURCETYPE, TENANTID)
VALUES(1, '28\d{16}', 'alipay', '{tenantid}');
INSERT INTO TB_QRCODE_PATTERN(ID, PATTERN, SOURCETYPE, TENANTID)
diff --git a/payapi/src/main/resources/static/custom/module/admin.js b/payapi/src/main/resources/static/custom/module/admin.js
index 1694286..e557e6c 100755
--- a/payapi/src/main/resources/static/custom/module/admin.js
+++ b/payapi/src/main/resources/static/custom/module/admin.js
@@ -224,7 +224,7 @@
},
formatDate:function (str) {
if (str == null || str == "") {
- return;
+ return '';
}
switch (str.length) {
case 8:
diff --git a/payapi/src/main/resources/static/custom/module/dtree/dtree.css b/payapi/src/main/resources/static/custom/module/dtree/dtree.css
new file mode 100755
index 0000000..1c5869a
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/dtree/dtree.css
@@ -0,0 +1,107 @@
+
+/**************** 主题换肤 ****************/
+/* 默认风格*/
+.dtree-theme-item-this{background-color: #d2d2d2!important;}
+.dtree-theme-item:hover{background-color: #eaeceb!important;}
+.dtree-theme-item cite{font-size:12px!important;}
+.dtree-theme-item:hover cite{color:#fe7786!important;}
+
+.dtree-theme-dtreefont{font-size: 16px!important;}
+.dtree-theme-ficon{color:#000!important;}
+.dtree-theme-icon{color:orange!important;}
+.dtree-theme-checkbox:hover{color:#fe7786!important;}
+.dtree-theme-choose{color:#fe7786!important;}
+
+/* layui主题风格*/
+.dtree-layui-item-this{background: none!important;}
+.dtree-layui-item:hover{background: none!important;}
+.dtree-layui-item cite{font-size:14px!important;}
+.dtree-layui-item:hover cite{opacity:0.5;filter:Alpha(opacity=50);text-decoration: underline;}
+
+.dtree-layui-dtreefont{font-size: 18px!important;}
+.dtree-layui-ficon{font-size: 18px!important;color:#393D49!important;}
+.dtree-layui-icon{color:#666!important;}
+.dtree-layui-checkbox:hover{color:#5FB878!important;}
+.dtree-layui-choose{color:#5FB878!important;}
+
+/* laySimple主题风格*/
+.dtree-laySimple-item-this{background-color: #d2d2d2!important;}
+.dtree-laySimple-item:hover{background-color: #eaeceb!important;}
+.dtree-laySimple-item cite{font-size:12px!important;}
+.dtree-laySimple-item:hover cite{color:#01AAED!important;}
+
+.dtree-laySimple-dtreefont{font-size: 16px!important;}
+.dtree-laySimple-ficon{font-size: 14px!important;color:#393D49!important;}
+.dtree-laySimple-icon{color:#393D49!important;}
+.dtree-laySimple-checkbox:hover{color:#01AAED!important;}
+.dtree-laySimple-choose{color:#01AAED!important;}
+/**************** 树基础 ****************/
+/* 菜单栏*/
+.dtree-menubar {padding-left: 10px;}
+.dtree-menubar .layui-btn-group .layui-btn-sm{height: 20px;line-height: 20px;padding: 0 5px;font-size: 12px;}
+.dtree-menubar .layui-btn-group .layui-btn-sm i{font-size: 12px!important;}
+
+/* 工具栏*/
+.dtree-toolbar{position: absolute;z-index: 940520;padding: 0;background-color: #eceaeb;}
+.dtree-toolbar .layui-nav-child{position: static;}
+.dtree-toolbar .layui-nav-child dd{cursor: pointer;}
+.dtree-toolbar .layui-nav-child dd a i{font-size:16px;display: inline-block;margin: 0px 1px;color:#fe7786;}
+.dtree-toolbar .layui-nav-child dd a i:hover{font-weight: bold;}
+.dtree-toolbar .layui-nav-bar{display: none!important;}
+.dtree-toolbar-tool{padding: 30px;}
+
+.dtree-toolbar-fixed{position: absolute;right: 5px;top: 2px;font-style: normal;transition: all .3s;-webkit-transition: all .3s;}
+/*.dtree-toolbar-fixed a{border:1px solid #fe7786;}*/
+.dtree-toolbar-fixed a i{font-size:14px;display: inline-block;margin: 0px 1px;color:#fe7786;}
+.dtree-toolbar-fixed a i:hover{opacity:0.8;filter:Alpha(opacity=80);}
+
+/* 树基本*/
+.dtree{width:260px;}
+.dtree-nav-item{line-height:33px;padding-left:16px;}
+.dtree-nav-ul-sid{display: none;}
+.dtree-none-text{font-size: 12px;text-align: center;color: gray;}
+
+/* 树线*/
+.dtree-nav-first-line,.dtree-nav-line,.dtree-nav-last-line{width: 100%;position: relative;}
+.dtree-nav-first-line:before{content:"";position: absolute;height: 0;border-left: 1px dotted #c0c4cc;}
+.dtree-nav-first-line:after{content:"";position: absolute;height: 0;border-top: 1px dotted #c0c4cc;}
+
+.dtree-nav-line:before{content:"";position: absolute;top: 0;left: 7px;width: 0;height: 100%;border-left: 1px dotted #c0c4cc;}
+.dtree-nav-line:after{content:"";position: absolute;top: 16px;left: 8px;width: 9px;height: 0;border-top: 1px dotted #c0c4cc;}
+
+.dtree-nav-last-line:before{content:"";position: absolute;top: 0;left: 7px;width: 0;height: 17px;border-left: 1px dotted #c0c4cc;}
+.dtree-nav-last-line:after{content:"";position: absolute;top: 16px;left: 8px;width: 9px;height: 0;border-top: 1px dotted #c0c4cc;}
+
+
+/* 图标及复选框*/
+.dtreefont{cursor: pointer;}
+.dtreefont-special{margin: 0 4px;}
+.dtree-nav-checkbox-div{display: inline-block;}
+.dtree-nav-checkbox-div>i{display: inline-block;margin: 0px 1px;}
+.dtree-nav-checkbox-div>i:last-child{margin-right: 4px;}
+.dtree-nav-checkbox-div>i:hover{opacity:0.8;filter:Alpha(opacity=80);}
+
+/* 行 文字*/
+.dtree-nav-div{display:block;vertical-align:top;position:relative;}
+.dtree-nav-div cite{font-style: normal;cursor: pointer;}
+.dtree-nav-div:hover cite{opacity:0.7;filter:Alpha(opacity=70);transition: all .3s;-webkit-transition: all .3s;}
+
+/* 规则属性*/
+.dtree-nav-show {display: block!important;}
+.dtree-nav-hide {display: none!important;}
+.dtree-nav-this {}
+.dtree-icon-hide {opacity:0;filter:Alpha(opacity=0);}
+.dtree-icon-null-open,.dtree-icon-null-close,.dtree-icon-null{margin: 0 2px;}
+.dtree-disabled{cursor: not-allowed; color:#c2c2c2!important;}
+.dtree-disabled:hover{color:#c2c2c2!important;}
+.dtree-nav-div cite.dtree-disabled{font-style: normal; cursor: not-allowed; color:#c2c2c2!important;}
+.dtree-nav-div>cite.dtree-disabled:hover{color:#c2c2c2!important;}
+
+/* 简单适配*/
+@media screen and (max-width:1700px) and (min-width:1300px){
+ .dtree-nav-item {padding-left: 15px;}
+}
+
+
+
+
diff --git a/payapi/src/main/resources/static/custom/module/dtree/dtree.js b/payapi/src/main/resources/static/custom/module/dtree/dtree.js
new file mode 100755
index 0000000..9a3dd72
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/dtree/dtree.js
@@ -0,0 +1,4533 @@
+/**
+ *@Name dtree 树形组件
+ *@Author 智慧的小西瓜
+ *@DOCS http://www.wisdomelon.com/DTreeHelper/
+ *@License https://www.layui.com/
+ *@LASTTIME 2019/06/14
+ *@VERSION v2.5.4
+ */
+layui.define(['jquery','layer','form'], function(exports) {
+ var $ = layui.$,
+ layer = layui.layer,
+ form = layui.form;
+
+ // 树的公共定义样式汇总
+ var LI_NAV_CHILD = "dtree-nav-ul-sid", LI_NAV_ITEM = "dtree-nav-item",
+ LI_DIV_ITEM = "dtree-nav-div", DTREEFONTSPECIAL="dtreefont-special", NONETITLE="dtree-none-text",
+ LI_DIV_MENUBAR = "dtree-menubar",
+ LI_DIV_TOOLBAR = "dtree-toolbar", TOOLBAR_TOOL = "dtree-toolbar-tool", TOOLBAR_TOOL_EM = "dtree-toolbar-fixed",
+ LI_DIV_CHECKBAR = "dtree-nav-checkbox-div",
+ LI_CLICK_CHECKBAR = "d-click-checkbar", //绑定点击复选框时需要用到
+ LI_DIV_TEXT_CLASS = "t-click", UL_ROOT="dtree",
+ LI_NAV_FIRST_LINE = "dtree-nav-first-line", LI_NAV_LINE = "dtree-nav-line", LI_NAV_LAST_LINE = "dtree-nav-last-line";
+
+
+ // 树的公共指定
+ var NAV_THIS = "dtree-nav-this", //当前节点
+ NAV_SHOW = "dtree-nav-show", //显示子节点
+ NAV_HIDE = "dtree-nav-hide", //隐藏节点
+ NAV_DIS = "dtree-disabled", //禁用节点
+ ICON_HIDE = "dtree-icon-hide", //隐藏图标
+ $BODY = $("body"), //body选择器
+ $WIN = $(window), //window窗口
+ $DOC = $(document), //当前文档
+ MOD_NAME = "dtree", //模块名称
+ VERSION = "v2.5.0", //版本
+ DTrees = {}; //当前被实例化的树的集合
+
+ // 树的自定义图标
+ var DTREEFONT = "dtreefont", //默认使用图标字体
+ LI_DIV_CHECKBAR_ON = "dtree-icon-fuxuankuangxuanzhong", //复选框选中图标
+ LI_DIV_CHECKBAR_OUT = "dtree-icon-fuxuankuang", //复选框未选中图标
+ LI_DIV_CHECKBAR_NOALL = "dtree-icon-fuxuankuang-banxuan", //复选框半选图标
+ LI_DIV_MENUBAR_DOWN = "dtree-icon-move-down", //menubar的展开全部的图标
+ LI_DIV_MENUBAR_UP = "dtree-icon-move-up", //menubar的收缩全部的图标
+ LI_DIV_MENUBAR_REFRESH = "dtree-icon-refresh", //menubar的刷新图标
+ LI_DIV_MENUBAR_CHECKALL = "dtree-icon-roundcheckfill", //menubar的全选图标
+ LI_DIV_MENUBAR_UNCHECKALL = "dtree-icon-roundclosefill", //menubar的全不选图标
+ LI_DIV_MENUBAR_INVERTALL = "dtree-icon-roundcheck", //menubar的反选图标
+ LI_DIV_MENUBAR_DELETE = "dtree-icon-delete1", //menubar的删除图标
+ LI_DIV_MENUBAR_SEARCH = "dtree-icon-search_list_light", //menubar的搜索图标
+ LI_DIV_TOOLBAR_PULLDOWN = "dtree-icon-pulldown", //toolbar的展开图标
+ LI_DIV_TOOLBAR_PULLUP = "dtree-icon-pullup", //toolbar的收缩图标
+ LI_DIV_TOOLBAR_ADD = "dtree-icon-roundadd", //toolbar的新增图标
+ LI_DIV_TOOLBAR_EDIT = "dtree-icon-bianji", //toolbar的编辑图标
+ LI_DIV_TOOLBAR_DEL = "dtree-icon-roundclose"; //toolbar的删除图标
+
+ // 树的非叶子节点图标集合
+ var nodeIconArray = {
+ "-1": {"open": "dtree-icon-null-open", "close": "dtree-icon-null-close"}, //未指定
+ "0" : {"open": "dtree-icon-wenjianjiazhankai", "close": "dtree-icon-weibiaoti5"}, //文件夹(二级图标默认样式)
+ "1" : {"open": "dtree-icon-jian", "close": "dtree-icon-jia"}, //+-图标(一级图标默认样式)
+ "2" : {"open": "dtree-icon-xiangxia1", "close": "dtree-icon-xiangyou"} //箭头图标
+ };
+
+ // 树的叶子节点图标集合
+ var leafIconArray = {
+ "-1": "dtree-icon-null", //未指定
+ "0" : "dtree-icon-weibiaoti5", //文件夹
+ "1" : "dtree-icon-yonghu", //人员
+ "2" : "dtree-icon-fenzhijigou", //机构
+ "3" : "dtree-icon-fenguangbaobiao", //报表
+ "4" : "dtree-icon-xinxipilu", //信息
+ "5" : "dtree-icon-shuye1", //叶子(二级图标默认样式)
+ "6" : "dtree-icon-caidan_xunzhang", //勋章
+ "7" : "dtree-icon-normal-file", //文件
+ "8" : "dtree-icon-dian", //小圆点(一级图标默认样式)
+ "9" : "dtree-icon-set-sm", //齿轮
+ "10" : "dtree-icon-rate" //星星
+ };
+
+ // 树的自定义样式
+ var DTREE = "dtree-", //自定义样式前缀
+ ITEMTHIS = "-item-this", //自定义样式当前行选中后缀
+ ITEM = "-item", //自定义样式当前行后缀
+ DFONT = "-dtreefont", //自定义样式图标样式后缀
+ FICON = "-ficon", //自定义样式一级图标样式后缀
+ ICON = "-icon", //自定义样式二级图标样式后缀
+ CBOX = "-checkbox", //自定义样式复选框样式后缀
+ CHS = "-choose"; //自定义样式复选框选中样式后缀
+
+ // 树自定义操作事件名称集合 绑定dtree-click的事件
+ var eventName = {
+ checkNodeClick: "checkNodeClick", //点击复选框
+ itemNodeClick: "itemNodeClick" //点击子节点div
+ };
+
+ // 树默认toolbar提供的功能集合 绑定dtree-tool的事件
+ var defaultTool = {
+ pulldown: "pulldown", //点击展开当前节点下的全部节点
+ pullup: "pullup", //点击收缩当前节点下的全部节点
+ addTool: "addToolbar", //点击toolbar新增
+ editTool: "editToolbar", //点击toolbar编辑
+ delTool: "delToolbar" //点击toolbar删除
+ };
+
+ // 树默认menubar提供的功能集合 绑定dtree-menu的事件
+ var defaultMenu = {
+ moveDown: "moveDown", //menubar展开全部节点
+ moveUp: "moveUp", //menubar收缩全部节点
+ refresh: "refresh", //menubar刷新树
+ checkAll: "checkAll", //menubar全选
+ unCheckAll: "unCheckAll", //menubar全不选
+ invertAll: "invertAll", //menubar反选
+ remove: "remove", //menubar删除选中节点
+ searchNode: "searchNode" //menubar查询节点
+ };
+
+ // 树的公共事件
+ var event = {
+ getElemId: function(options){ // 根据传入的参数获取ID
+ var elem = options.elem || "";
+ var obj = options.obj || $(elem);
+
+ if (obj.length == 0) { //页面中未找到绑定id
+ return "";
+ } else {
+ return $(obj)[0].id;
+ }
+ },
+ escape: function(html){
+ if(typeof html !== 'string') return '';
+ return html.replace(entityReg.escape, function(match){return entityMap.escape[match];});
+ },
+ unescape: function(str){
+ if(typeof str !== 'string') return '';
+ return str.replace(entityReg.unescape, function(match){return entityMap.unescape[match];});
+ },
+ cloneObj: function (obj, filter) { //深复制对象方法
+ var newObj = {};
+ if (obj instanceof Array) {
+ newObj = [];
+ }
+ var str = "";
+ if(typeof filter !== 'undefined') {str = filter.join(",");}
+ for (var key in obj) {
+ if(str.indexOf(key) == -1){
+ var val = obj[key];
+ newObj[key] = typeof val === 'object' ? event.cloneObj(val, typeof filter !== undefined ? filter : []): val;
+ }
+
+ }
+ return newObj;
+ },
+ trimToDot: function(str){
+ return str.replace(/ /g, ".");
+ }
+ };
+
+ // 特殊符号转义
+ var keys = Object.keys || function(obj) {
+ obj = Object(obj);
+ var arr = [];
+ for(var a in obj) arr.push(a);
+ return arr;
+ };
+ var invert = function(obj){
+ obj = Object(obj);
+ var result = {};
+ for(var a in obj) result[obj[a]] = a;
+ return result;
+ };
+ var entityMap = {
+ escape: {
+ "&" : "&",
+ "<" : "<",
+ ">" : ">",
+ "'" : "&quo;"
+ }
+ };
+ entityMap.unescape = invert(entityMap.escape);
+ var entityReg = {
+ escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'),
+ unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g')
+ };
+
+ //异步加载接口
+ var AjaxHelper = {
+ request : function(config) {
+ var data = config.data ? config.data : {};
+ var async = (typeof (config.async) === "boolean") ? config.async : true;
+ $.ajax({
+ type : config.type ? config.type : "POST",
+ headers : config.headers,
+ url : config.url,
+ dataType : config.dataType ? config.dataType : "json",
+ data : data,
+ async : async,
+ contentType : config.contentType ? config.contentType : "application/x-www-form-urlencoded",
+ success : config.success,
+ error : function(XMLHttpRequest, textStatus, errorThrown) {
+ if (typeof (config.error) === "function") {
+ config.error(XMLHttpRequest, textStatus, errorThrown);
+ } else {
+ layer.msg("异步加载失败: " + textStatus,{icon:5, shift:6});
+ }
+ },
+ statusCode : {
+ 404 : function() {
+ layer.msg('未找到指定请求,请检查访问路径!',{icon:5, shift:6});
+ },
+ 500 : function() {
+ layer.msg('系统错误!',{icon:5, shift:6});
+ }
+ },
+ complete : function(XMLHttpRequest, textStatus) {
+ if (typeof (config.complete) === "function") {
+ config.complete(XMLHttpRequest, textStatus);
+ }
+ }
+ });
+ },
+ serialize: function(param){ //json序列化 key=value&key1=value1
+ var p = "?";
+ for (var key in param) {
+ p += key + "=" + param[key] + "&";
+ }
+ p = p.substring(0, p.length-1);
+ return p;
+ }
+ };
+
+ // 树类
+ var DTree = function(options){
+ var _this = this;
+ /** 默认赋值**/
+ this.formatter = { // 数据过滤
+ title: false // 文字,默认不开启
+ };
+ this.response = { // 树返回的json格式
+ statusName: "code", //返回标识
+ statusCode: 200, //返回码
+ message: "message", //返回信息
+ rootName: "data", //根节点名称
+ treeId: "id", //节点ID
+ parentId: "parentId", //父节点ID
+ title: "title", //节点名称
+ ficonClass: "ficonClass", //自定义一级图标
+ iconClass: "iconClass", //自定义二级图标
+ childName: "children", //子节点名称
+ last: "last", //是否最后一级节点
+// level: "level", //层级
+ spread: "spread", //展开
+ disabled: "disabled", //禁用
+ hide: "hide", //隐藏
+ checkArr: "checkArr", //复选框列表
+ checked: "checked", //是否选中
+ type: "type", //复选框标记
+ basicData: "basicData" //表示用户自定义需要存储在树节点中的数据
+ };
+ this.defaultRequest = { // 树的默认发起请求参数格式,最后会将value作为参数名称传递
+ nodeId: "nodeId", //节点ID
+ parentId: "parentId", //父节点ID
+ context: "context", //节点内容
+ leaf: "leaf", //是否叶子节点
+ level: "level", //层级
+ spread: "spread", //节点展开状态
+ dataType: "dataType", //节点标记
+ checked: "checked", //节点复选框选中状态
+ initchecked: "initchecked", //节点复选框初始状态
+ basicData: "basicData", //用户自定义的记录节点数据
+ recordData: "recordData", //当前data数据(排除basicData和children字段)
+ };
+ this.toolbarFun = {
+ addTreeNode: function(param, $div) { //添加树节点后调用的函数,用于用户自定义,如未指定则树不会发生变化
+ return ;
+ },
+ editTreeNode: function(param, $div) { //编辑树节点后调用的函数,用于用户自定义,如未指定则树不会发生变化
+ return ;
+ },
+ editTreeLoad: function(param){ // 编辑树的数据回显,用于打开编辑时,回填数据
+ return ;
+ },
+ delTreeNode: function(param, $div){ //删除树后调用的函数,用于用户自定义,如未指定则树不会发生变化
+ return ;
+ },
+ loadToolbarBefore: function(buttons, param, $div){ // 右键菜单加载前的函数
+ return buttons;
+ }
+ };
+ this.toolbarStyle = {
+ title: "节点",
+ area: ["60%","80%"]
+ };
+ this.menubarFun = {
+ remove: function(checkbarNodes){ //删除复选框选中节点,需要用户自定义,如未指定则树只是页面上做了修改
+ return true;
+ }
+ };
+ this.menubarTips = {
+ toolbar: [],
+ group: [defaultMenu.moveDown, defaultMenu.moveUp, defaultMenu.refresh, defaultMenu.checkAll, defaultMenu.unCheckAll, defaultMenu.invertAll, defaultMenu.remove, defaultMenu.searchNode],
+ freedom: []
+ };
+ this.checkbarFun = {
+ chooseBefore: function($i, node){ // 复选框点击前回调
+ return true;
+ },
+ chooseDone: function(checkbarNodesParam) { //复选框点击事件完毕后,返回该树关于复选框操作的全部信息,用于用户自定义,如未指定则树只是页面上做了修改
+ return ;
+ }
+ };
+ this.iframe = { // 树点击节点时,打开iframe页面参数配置
+ iframeElem: "", //iframe的ID
+ iframeUrl: "", //树关联的frame地址
+ iframeLoad: "leaf", //点击哪一层加载frame: node:所有节点, leaf:默认,最后一级
+ iframeDefaultRequest: { //iframe的默认参数,目的是与加载树的参数不一样
+ nodeId: "nodeId", //节点ID
+ parentId: "parentId", //父节点ID
+ context: "context", //节点内容
+ leaf: "leaf", //是否叶子节点
+ level: "level", //层级
+ spread: "spread", //节点展开状态
+ dataType: "dataType", //节点标记
+ checked: "checked", //节点复选框选中状态
+ initchecked: "initchecked", //节点复选框初始状态
+ basicData: "basicData", //用户自定义的记录节点数据
+ recordData: "recordData", //当前data数据(排除basicData和children字段)
+ },
+ iframeRequest: {} //iframe的自定义参数
+ };
+ this.iframeFun = {
+ iframeDone: function(iframeParam){ //iframe加载完毕后,用于用户自定义事件
+ return ;
+ }
+ };
+ this.style = { //树最终使用的样式集合
+ item: "", //每一项div的样式
+ itemThis: "", //选中div的样式
+ dfont: "", //一级图标的样式
+ icon: "", //二级图标的样式
+ cbox: "", //复选框的样式
+ chs: "" //复选框选中的样式
+ };
+ this.usefontStyle = { //树最终使用的图标集合
+ fnode:{ //一级节点
+ node:{ //非叶子节点
+ open:"", //节点展开
+ close:"" //节点关闭
+ },
+ leaf:"" //叶子节点
+ },
+ snode:{ //二级节点
+ node:{ //非叶子节点
+ open:"", //节点展开
+ close:"" //节点关闭
+ },
+ leaf:"" //叶子节点
+ },
+ checkbox:{ //复选框
+ on:"", //复选框选中
+ out:"", //未选中
+ noall:"" //半选
+ },
+ menubar:{ //菜单栏
+ movedown:"", //全部展开
+ moveup:"", //全部收缩
+ refresh:"", //刷新
+ checkAll:"", //全选
+ unCheckAll:"", //全不选
+ invertAll:"", //反选
+ remove:"", //删除
+ search:"" //搜索
+ },
+ menubarExt:"", //扩展菜单栏
+ toolbar:{ //工具栏
+ menubar:{ //依附在菜单栏的工具栏
+ movedown:"", //全部展开
+ moveup:"", //全部收缩
+ refresh:"", //刷新
+ checkAll:"", //全选
+ unCheckAll:"", //全不选
+ invertAll:"", //反选
+ remove:"", //删除
+ search:"" //搜索
+ },
+ menubarExt:"", //依附在菜单栏的扩展菜单栏
+ pulldown:"", //展开
+ pullup:"", //收缩
+ add:"", //添加
+ edit:"", //编辑
+ del:"" //删除
+ },
+ toolbarExt:"" //扩展工具栏
+ }
+
+ /** 数据绑定**/
+ this.node = { // 树节点选中时,包含当前节点的全部信息
+ nodeId: "", //节点ID
+ parentId: "", //父节点ID
+ context: "", //节点内容
+ leaf: "", //是否叶子节点
+ level: "", //层级
+ spread: "", //节点展开状态
+ dataType: "", //节点标记
+ checked: "", //节点复选框选中状态
+ initchecked: "", //节点复选框初始状态
+ basicData: "", //用户自定义的记录节点数据
+ recordData: "", //当前data数据(排除basicData和children字段)
+ };
+ this.toolbarMenu = {}; // 工具栏右键菜单绑定的所有元素
+ this.checkbarNode = []; // 复选框标记的全部节点数据
+ this.errData = []; // 记录在渲染节点时有问题的数据
+ this.checkArrLen = 0; //添加节点的时判断复选框个数
+ this.temp = []; // 临时变量
+
+ this.setting(options);
+ };
+
+ /******************** 初始参数加载 ********************/
+ // 设置值
+ DTree.prototype.setting = function(options) {
+ this.options = options || {};
+
+ /** 绑定元素参数(必填,2个参数项必填一个)**/
+ this.elem = this.options.elem || ""; //树绑定的元素ID:#elem
+ this.obj = this.options.obj || $(this.elem); //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到
+
+ /** 基本参数**/
+ this.accordion = (typeof (this.options.accordion) === "boolean") ? this.options.accordion : false; //开启手风琴加载
+ if(this.accordion) {
+ this.initLevel = 1; //默认展开节点 1节
+ } else {
+ this.initLevel = this.options.initLevel || 2; //默认展开节点 2节
+ }
+ this.type = this.options.type || "load"; // 树的加载方式 all,全量树, load,增量树,默认load
+ this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : true; //开启数据缓存
+ this.record = (typeof (this.options.record) === "boolean") ? this.options.record : false; //开启数据记录模式
+ this.load = (typeof (this.options.load) === "boolean") ? this.options.load : true; //开启加载动画
+ this.none = this.options.none || "无数据"; // 初始加载无记录时显示文字
+ if(this.options.height) { // 设置高度
+ if(/^full-\d+$/.test(this.options.height)) {
+ this.fullHeightGap = options.height.split('-')[1];
+ this.height = $WIN.height() - this.fullHeightGap;
+ console.log("$WIN.height(): " + $WIN.height());
+ } else {
+ this.fullHeightGap = this.options.height;
+ this.height = this.options.height;
+ }
+ } else {
+ this.fullHeightGap = "";
+ this.height = "";
+ }
+
+ /** 样式相关参数**/
+ this.iconfont = this.options.iconfont || DTREEFONT; // 默认图标字体 dtreefont
+ this.iconfontStyle = this.options.iconfontStyle || {}; // 用于自定义树的每个关键部位使用的图标
+ this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray) || nodeIconArray; //用户自定义非叶子节点图标集合,node
+ this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray) || leafIconArray; //用户自定义叶子节点图标集合,leaf
+ this.skin = this.options.skin || "theme"; // 自定义样式
+ if(this.skin == "layui"){ // layui主题
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : true; // 开启树线,默认开启
+ this.ficon = this.options.ficon || "7"; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'7'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; // 一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'1'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标
+ this.icon = this.options.icon || "-1"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; // 二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; // 二级图标中的leaf节点图标
+ } else if(this.skin == "laySimple"){ // laySimple主题
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : false; // 开启树线,默认不开启
+ this.ficon = this.options.ficon || ["2","-1"]; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'-1'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "2") : this.ficon[0]; // 一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'2'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标
+ this.icon = this.options.icon || "-1"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; // 二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; // 二级图标中的leaf节点图标
+ } else { // 默认主题 或者自定义主题
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : false; // 开启树线,默认不开启
+ this.ficon = this.options.ficon || "8"; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'8'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; // 一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'1'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标
+ this.icon = this.options.icon || "5"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'5'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; // 二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'0'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; // 二级图标中的leaf节点图标
+ }
+
+ /** 数据加载参数**/
+ this.url = this.options.url || ""; //请求地址
+ this.async = (typeof (this.options.async) === "boolean") ? this.options.async : true; //异步同步加载,默认异步加载
+ this.headers = this.options.headers || {}; // ajax header属性
+ this.method = this.options.method || "post"; //请求类型
+ this.dataType = this.options.dataType || "json"; //参数类型
+ this.contentType = this.options.contentType || "application/x-www-form-urlencoded"; //发送信息至服务器时内容编码类型
+ this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest) || this.defaultRequest; //默认请求参数
+ this.filterRequest = this.options.filterRequest || []; //过滤请求参数
+ this.request = this.options.request || {}; //用户自定义请求参数
+ this.response = $.extend(this.response, this.options.response) || this.response; //返回json格式
+ this.data = this.options.data || null; //初始化指定该参数,则不会访问异步接口
+ this.dataFormat = this.options.dataFormat || "levelRelationship"; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认
+ this.dataStyle = this.options.dataStyle || "defaultStyle"; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格
+ this.errDataShow = (typeof (this.options.errDataShow) === "boolean") ? this.options.errDataShow : false; //是否在递归数据出现错误后,显示错误信息
+ this.success = this.options.success || function(data, obj){}; //树加载完毕后执行解析树之前的回调(仅限异步加载)
+ this.done = this.options.done || function(data, obj){}; //树加载完毕后的回调(仅限异步加载)
+ this.formatter = $.extend(this.formatter, this.options.formatter)|| this.formatter ; // 数据过滤
+ this.error = this.options.error || function(XMLHttpRequest, textStatus, errorThrown){layer.msg(textStatus, {icon:2});}; // 异步加载异常回调
+ this.complete = this.options.complete || function(XMLHttpRequest, textStatus){}; // 异步加载完成回调
+
+ /** 复选框参数**/
+ this.checkbar = this.options.checkbar || false; //是否开启复选框模式
+ this.checkbarLoad = this.options.checkbarLoad || "node"; // 复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点
+ this.checkbarType = this.options.checkbarType || "all" ; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all
+ this.checkbarData = this.options.checkbarData || "choose" ; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all记录全部数据,halfChoose记录选中和半选中的数据,默认choose
+ this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun) || this.checkbarFun; // checkbar事件加载
+
+ /** 菜单栏参数**/
+ this.menubar = this.options.menubar || false; //是否打开菜单栏
+ this.menubarTips = $.extend(this.menubarTips, this.options.menubarTips) || this.menubarTips; // 菜单栏吸附, toolbar:依附在工具栏,group:依附在按钮组,freedom,自由
+ this.menubarFun = $.extend(this.menubarFun, this.options.menubarFun) || this.menubarFun; //menubar事件加载
+
+ /** 工具栏参数**/
+ this.toolbar = this.options.toolbar || false; //是否开启可编辑模式
+ this.toolbarWay = this.options.toolbarWay || "contextmenu"; //工具栏显示方式,contextmenu:右键,follow:跟随节点,fixed:固定在节点右侧
+ this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小
+ this.toolbarScroll = this.options.toolbarScroll || this.elem; //树的上级div容器,让树可以显示滚动条的div容器的ID
+ this.toolbarLoad = this.options.toolbarLoad || "node"; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级
+ this.toolbarShow = this.options.toolbarShow || ["add","edit","delete"]; // toolbar三个按钮自定义加载
+ this.toolbarBtn = this.options.toolbarBtn || null; // toolbar增删改中内容的自定义加载
+ this.toolbarExt = this.options.toolbarExt || []; // toolbar按钮扩展
+ this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun) || this.toolbarFun; // toolbar事件加载
+
+ /** iframe模式参数**/
+ this.useIframe = this.options.useIframe || false; // 是否加载iframe 默认false,
+ if(this.options.iframe) {
+ this.iframe.iframeElem = this.options.iframe.iframeElem || this.iframe.iframeElem; //iframe配置
+ this.iframe.iframeUrl = this.options.iframe.iframeUrl || this.iframe.iframeUrl; //iframe配置
+ this.iframe.iframeLoad = this.options.iframe.iframeLoad || this.iframe.iframeLoad; //iframe配置
+ this.iframe.iframeDefaultRequest = $.extend(this.iframe.iframeDefaultRequest, this.options.iframe.iframeDefaultRequest) || this.iframe.iframeDefaultRequest; //iframe配置
+ this.iframe.iframeRequest = $.extend(this.iframe.iframeRequest, this.options.iframe.iframeRequest) || this.iframe.iframeRequest; //iframe配置
+ }
+ this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || this.iframeFun; //iframe事件加载
+
+ /** 拖拽模式参数*/
+ this.drawable = (typeof (this.options.drawable) === "boolean") ? this.options.drawable : false; // 是否开启拖拽模式,默认false
+
+ /** 调用确认最终主题方法*/
+ this.ensureTheme();
+ };
+
+ // 设置值
+ DTree.prototype.reloadSetting = function(options) {
+ this.options = $.extend(this.options, options) || this.options;
+
+ /** 绑定元素参数**/
+ this.elem = this.options.elem || this.elem; //树绑定的元素ID:#elem
+ if(typeof this.options.obj === 'undefined'){
+ if(this.elem) {
+ if($(this.elem).length > 0) {
+ this.obj = $(this.elem);
+ }
+ }
+ } else {
+ this.obj = this.options.obj || this.obj; //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到
+ }
+
+ /** 基本参数**/
+ this.accordion = (typeof (this.options.accordion) === "boolean") ? this.options.accordion : this.accordion; //开启手风琴加载
+ if(this.accordion) {
+ this.initLevel = 1; //默认展开节点 1节
+ } else {
+ this.initLevel = this.options.initLevel || this.initLevel; //默认展开节点 2节
+ }
+ this.type = this.options.type || this.type; // 树的加载方式 all,全量树, load,增量树,默认load
+ this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : this.cache; //开启数据缓存
+ this.record = (typeof (this.options.record) === "boolean") ? this.options.record : this.record; //开启数据记录模式
+ this.load = (typeof (this.options.load) === "boolean") ? this.options.load : this.load; //开启加载动画
+ this.none = this.options.none || this.none; // 初始节点加载无数据时显示文字
+ if(this.options.height) { // 设置高度
+ if(/^full-\d+$/.test(this.options.height)) {
+ this.fullHeightGap = options.height.split('-')[1];
+ this.height = $WIN.height() - this.fullHeightGap;
+ } else {
+ this.fullHeightGap = this.options.height;
+ this.height = this.options.height;
+ }
+ }
+
+ /** 样式相关参数**/
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : this.line; // 开启树线,默认不开启
+ this.iconfont = this.options.iconfont || this.iconfont; // 默认图标字体 dtreefont
+ this.iconfontStyle = this.options.iconfontStyle || this.iconfontStyle; // 用于自定义树的每个关键部位使用的图标
+ this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray) || this.nodeIconArray; //用户自定义非叶子节点图标集合,node
+ this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray) || this.leafIconArray; //用户自定义叶子节点图标集合,leaf
+ this.skin = this.options.skin || this.skin; // 自定义样式
+ if(this.skin == "layui"){ // layui主题
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : true; // 开启树线,默认开启
+ this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'7'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; // 一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'1'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标
+ this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; // 二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; // 二级图标中的leaf节点图标
+ } else if(this.skin == "laySimple"){ // laySimple主题
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : false; // 开启树线,默认不开启
+ this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'-1'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "2") : this.ficon[0]; // 一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'2'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标
+ this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; // 二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; // 二级图标中的leaf节点图标
+ } else { // 默认主题 或者自定义主题
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : false; // 开启树线,默认不开启
+ this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'8'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; // 一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'1'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标
+ this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'5'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; // 二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'0'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; // 二级图标中的leaf节点图标
+ }
+
+ /** 数据加载参数**/
+ this.url = this.options.url || this.url; //请求地址
+ this.async = (typeof (this.options.async) === "boolean") ? this.options.async : this.async; //异步同步加载,默认异步加载
+ this.headers = this.options.headers || this.headers; // ajax header属性
+ this.method = this.options.method || this.method; //请求类型
+ this.dataType = this.options.dataType || this.dataType; //参数类型
+ this.contentType = this.options.contentType || this.contentType; //发送信息至服务器时内容编码类型
+ this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest) || this.defaultRequest; //默认请求参数
+ this.filterRequest = this.options.filterRequest || this.filterRequest; //过滤请求参数
+ this.request = this.options.request || this.request; //用户自定义请求参数
+ this.response = $.extend(this.response, this.options.response) || this.response; //返回json格式
+ this.data = this.options.data || this.data; //初始化指定该参数,则不会访问异步接口
+ this.dataFormat = this.options.dataFormat || this.dataFormat; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认
+ this.dataStyle = this.options.dataStyle || this.dataStyle; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格
+ this.errDataShow = (typeof (this.options.errDataShow) === "boolean") ? this.options.errDataShow : this.errDataShow; //是否在使用list模式递归数据出现错误时,显示错误信息
+ this.success = this.options.success || this.success; //树加载完毕后执行解析树之前的回调(仅限异步加载)
+ this.done = this.options.done || this.done; //树加载完毕后的回调(仅限异步加载)
+ this.formatter = $.extend(this.formatter, this.options.formatter)|| this.formatter ; // 数据过滤
+ this.error = this.options.error || this.error; // 异步加载异常回调
+ this.complete = this.options.complete || this.complete; // 异步加载完成回调
+
+ /** 复选框参数**/
+ this.checkbar = this.options.checkbar || this.checkbar; //是否开启复选框模式
+ this.checkbarLoad = this.options.checkbarLoad || this.checkbarLoad; // 复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点
+ this.checkbarType = this.options.checkbarType || this.checkbarType ; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all
+ this.checkbarData = this.options.checkbarData || this.checkbarData ; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all记录全部数据,halfChoose记录选中和半选中的数据,默认choose
+ this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun)|| this.checkbarFun ; // checkbar事件加载
+
+ /** 菜单栏参数**/
+ this.menubar = this.options.menubar || this.menubar; //是否打开菜单栏
+ this.menubarTips = $.extend(this.menubarTips, this.options.menubarTips) || this.menubarTips; // 菜单栏吸附, toolbar:依附在工具栏,group:依附在按钮组,freedom,自由
+ this.menubarFun = $.extend(this.menubarFun, this.options.menubarFun) || this.menubarFun; //menubar事件加载
+
+ /** 工具栏参数**/
+ this.toolbar = this.options.toolbar || this.toolbar; //是否开启工具栏
+ this.toolbarWay = this.options.toolbarWay || this.toolbarWay; //工具栏显示方式,contextmenu:右键,follow:跟随节点,fixed:固定在节点右侧
+ this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小
+ this.toolbarScroll = this.options.toolbarScroll || this.toolbarScroll; //树的上级div容器,让树可以显示滚动条的div容器
+ this.toolbarLoad = this.options.toolbarLoad || this.toolbarLoad; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级
+ this.toolbarShow = this.options.toolbarShow || this.toolbarShow; // toolbar三个按钮
+ this.toolbarBtn = this.options.toolbarBtn || this.toolbarBtn; // toolbar增删改中内容的自定义加载
+ this.toolbarExt = this.options.toolbarExt || this.toolbarExt; // toolbar按钮扩展
+ this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun) || this.toolbarFun; // toolbar事件加载
+
+ /** iframe模式参数**/
+ this.useIframe = this.options.useIframe || this.useIframe; // 是否加载iframe 默认false,
+ if(this.options.iframe) {
+ this.iframe.iframeElem = this.options.iframe.iframeElem || this.iframe.iframeElem; //iframe配置
+ this.iframe.iframeUrl = this.options.iframe.iframeUrl || this.iframe.iframeUrl; //iframe配置
+ this.iframe.iframeLoad = this.options.iframe.iframeLoad || this.iframe.iframeLoad; //iframe配置
+ this.iframe.iframeDefaultRequest = $.extend(this.iframe.iframeDefaultRequest, this.options.iframe.iframeDefaultRequest) || this.iframe.iframeDefaultRequest; //iframe配置
+ this.iframe.iframeRequest = $.extend(this.iframe.iframeRequest, this.options.iframe.iframeRequest) || this.iframe.iframeRequest; //iframe配置
+ }
+ this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || this.iframeFun; //iframe事件加载
+
+ /** 拖拽模式参数*/
+ this.drawable = (typeof (this.options.drawable) === "boolean") ? this.options.drawable : this.drawable; // 是否开启拖拽模式,默认false
+
+ /** 调用确认最终主题方法*/
+ this.ensureTheme();
+ };
+
+ /******************** 字体及图标区域 ********************/
+ // 确认最终主题
+ DTree.prototype.ensureTheme = function(){
+ var _this = this;
+
+ // 确认style
+ this.style.item = DTREE + this.skin + ITEM;
+ this.style.itemThis = DTREE + this.skin + ITEMTHIS;
+ this.style.dfont = DTREE + this.skin + DFONT;
+ this.style.ficon = DTREE + this.skin + FICON;
+ this.style.icon = DTREE + this.skin + ICON;
+ this.style.cbox = DTREE + this.skin + CBOX;
+ this.style.chs = DTREE + this.skin + CHS;
+
+ // 确认usefontStyle
+ var iconfont = this.iconfont;
+ var iconfonts = [];
+ if(typeof iconfont === 'string') {
+ iconfonts.push(iconfont);
+ } else {
+ iconfonts = iconfont;
+ }
+
+ var iconfontStyle = this.iconfontStyle;
+ var iconfontStyles = [];
+ if(iconfontStyle.length == undefined) {
+ iconfontStyles.push(iconfontStyle);
+ } else {
+ iconfontStyles = iconfontStyle;
+ }
+
+ for(var i=0; i<iconfonts.length; i++){
+ var ifont = iconfonts[i];
+ var ifontStyle = iconfontStyles[i];
+ if(typeof ifontStyle !== 'undefined') {
+ // 判断,赋值
+ this.useDefaultOrUserDefineFnodeStyle(ifont, ifontStyle.fnode);
+ this.useDefaultOrUserDefineSnodeStyle(ifont, ifontStyle.snode);
+ this.useDefaultOrUserDefineCheckboxStyle(ifont, ifontStyle.checkbox);
+ this.useDefaultOrUserDefineMenubarStyle(ifont, ifontStyle.menubar);
+ this.useDefaultOrUserDefineMenubarExtStyle(ifont, ifontStyle.menubarExt);
+ this.useDefaultOrUserDefineToolbarStyle(ifont, ifontStyle.toolbar);
+ this.useDefaultOrUserDefineToolbarExtStyle(ifont, ifontStyle.toolbarExt);
+ }
+ }
+ };
+
+ // 赋值一级图标
+ DTree.prototype.useDefaultOrUserDefineFnodeStyle = function(ifont, fnode){
+ var _this = this;
+ var tempOpen = this.usefontStyle.fnode.node.open;
+ var tempClose = this.usefontStyle.fnode.node.close;
+ var tempLeaf = this.usefontStyle.fnode.leaf;
+
+ if(typeof fnode === 'undefined'){
+ this.usefontStyle.fnode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["open"]) : tempOpen; // 一级图标中的node节点open图标
+ this.usefontStyle.fnode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["close"]) : tempClose; // 一级图标中的node节点close图标
+ this.usefontStyle.fnode.leaf = (tempLeaf == "") ? (ifont + " " + this.leafIconArray[this.fleafIcon]) : tempLeaf; // 一级图标中的node节点的leaf图标
+ } else {
+ var node = fnode.node;
+ var leaf = fnode.leaf;
+ if(typeof node === 'undefined'){
+ this.usefontStyle.fnode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["open"]) : tempOpen; // 一级图标中的node节点open图标
+ this.usefontStyle.fnode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["close"]) : tempClose; // 一级图标中的node节点close图标
+ } else {
+ var open = node.open;
+ var close = node.close;
+ if(typeof open === 'undefined'){
+ this.usefontStyle.fnode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["open"]) : tempOpen; // 一级图标中的node节点open图标
+ } else {
+ this.usefontStyle.fnode.node.open = ifont + " " + open;
+ }
+ if(typeof close === 'undefined') {
+ this.usefontStyle.fnode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["close"]) : tempClose; // 一级图标中的node节点close图标
+ } else {
+ this.usefontStyle.fnode.node.close = ifont + " " + close;
+ }
+ }
+ if(typeof leaf === 'undefined'){
+ this.usefontStyle.fnode.leaf = (tempLeaf == "") ? (ifont + " " + this.leafIconArray[this.fleafIcon]) : tempLeaf; // 一级图标中的node节点的leaf图标
+ } else {
+ this.usefontStyle.fnode.leaf = ifont + " " + leaf;
+ }
+ }
+ };
+
+ // 赋值二级图标
+ DTree.prototype.useDefaultOrUserDefineSnodeStyle = function(ifont, snode){
+ var _this = this;
+ var tempOpen = this.usefontStyle.snode.node.open;
+ var tempClose = this.usefontStyle.snode.node.close;
+ var tempLeaf = this.usefontStyle.snode.leaf;
+
+ if(typeof snode === 'undefined'){
+ this.usefontStyle.snode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["open"]) : tempOpen; // 二级图标中的node节点open图标
+ this.usefontStyle.snode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["close"]) : tempClose; // 二级图标中的node节点close图标
+ this.usefontStyle.snode.leaf = (tempLeaf == "") ? (ifont + " " + this.leafIconArray[this.leafIcon]) : tempLeaf; // 二级图标中的leaf节点图标
+ } else {
+ var node = snode.node;
+ var leaf = snode.leaf;
+ if(typeof node === 'undefined') {
+ this.usefontStyle.snode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["open"]) : tempOpen; // 二级图标中的node节点open图标
+ this.usefontStyle.snode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["close"]) : tempClose; // 二级图标中的node节点close图标
+ } else {
+ var open = node.open;
+ var close = node.close;
+ if(typeof open === 'undefined'){
+ this.usefontStyle.snode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["open"]) : tempOpen; // 二级图标中的node节点open图标
+ } else {
+ this.usefontStyle.snode.node.open = ifont + " " + open;
+ }
+ if(typeof close === 'undefined') {
+ this.usefontStyle.snode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["close"]) : tempClose; // 二级图标中的node节点close图标
+ } else {
+ this.usefontStyle.snode.node.close = ifont + " " + close;
+ }
+ }
+ if(typeof leaf === 'undefined') {
+ this.usefontStyle.snode.leaf = (tempLeaf == "") ? (ifont + " " + this.leafIconArray[this.leafIcon]) : tempLeaf; // 二级图标中的leaf节点图标
+ } else {
+ this.usefontStyle.snode.leaf = ifont + " " + leaf;
+ }
+ }
+ };
+
+ // 赋值复选框图标
+ DTree.prototype.useDefaultOrUserDefineCheckboxStyle = function(ifont, checkbox){
+ var _this = this;
+ var tempOn = this.usefontStyle.checkbox.on;
+ var tempOut = this.usefontStyle.checkbox.out;
+ var tempNoall = this.usefontStyle.checkbox.noall;
+
+ if(typeof checkbox === 'undefined'){
+ this.usefontStyle.checkbox.on = (tempOn == "") ? (ifont + " " + LI_DIV_CHECKBAR_ON) : tempOn;
+ this.usefontStyle.checkbox.out = (tempOut == "") ? (ifont + " " + LI_DIV_CHECKBAR_OUT) : tempOut;
+ this.usefontStyle.checkbox.noall = (tempNoall == "") ? (ifont + " " + LI_DIV_CHECKBAR_NOALL) : tempNoall;
+ } else {
+ var on = checkbox.on;
+ var out = checkbox.out;
+ var noall = checkbox.noall;
+ if(typeof on === 'undefined') {
+ this.usefontStyle.checkbox.on = (tempOn == "") ? (ifont + " " + LI_DIV_CHECKBAR_ON) : tempOn;
+ } else {
+ this.usefontStyle.checkbox.on = ifont + " " + on;
+ }
+ if(typeof out === 'undefined') {
+ this.usefontStyle.checkbox.out = (tempOut == "") ? (ifont + " " + LI_DIV_CHECKBAR_OUT) : tempOut;
+ } else {
+ this.usefontStyle.checkbox.out = ifont + " " + out;
+ }
+ if(typeof noall === 'undefined') {
+ this.usefontStyle.checkbox.noall = (tempNoall == "") ? (ifont + " " + LI_DIV_CHECKBAR_NOALL) : tempNoall;
+ } else {
+ this.usefontStyle.checkbox.noall = ifont + " " + noall;
+ }
+ }
+ };
+
+ // 赋值菜单栏图标
+ DTree.prototype.useDefaultOrUserDefineMenubarStyle = function(ifont, menubar){
+ var _this = this;
+ var tempMovedown = this.usefontStyle.menubar.movedown;
+ var tempMoveup = this.usefontStyle.menubar.moveup;
+ var tempRefresh = this.usefontStyle.menubar.refresh;
+ var tempCheckAll = this.usefontStyle.menubar.checkAll;
+ var tempUncheckAll = this.usefontStyle.menubar.unCheckAll;
+ var tempInvertAll = this.usefontStyle.menubar.invertAll;
+ var tempRemove = this.usefontStyle.menubar.remove;
+ var tempSearch = this.usefontStyle.menubar.search;
+
+ if(typeof menubar === 'undefined'){
+ this.usefontStyle.menubar.movedown = (tempMovedown == "") ? (ifont + " " + LI_DIV_MENUBAR_DOWN) : tempMovedown;
+ this.usefontStyle.menubar.moveup = (tempMoveup == "") ? (ifont + " " + LI_DIV_MENUBAR_UP) : tempMoveup;
+ this.usefontStyle.menubar.refresh = (tempRefresh == "") ? (ifont + " " + LI_DIV_MENUBAR_REFRESH) : tempRefresh;
+ this.usefontStyle.menubar.checkAll = (tempCheckAll == "") ? (ifont + " " + LI_DIV_MENUBAR_CHECKALL) : tempCheckAll;
+ this.usefontStyle.menubar.unCheckAll = (tempUncheckAll == "") ? (ifont + " " + LI_DIV_MENUBAR_UNCHECKALL) : tempUncheckAll;
+ this.usefontStyle.menubar.invertAll = (tempInvertAll == "") ? (ifont + " " + LI_DIV_MENUBAR_INVERTALL) : tempInvertAll;
+ this.usefontStyle.menubar.remove = (tempRemove == "") ? (ifont + " " + LI_DIV_MENUBAR_DELETE) : tempRemove;
+ this.usefontStyle.menubar.search = (tempSearch == "") ? (ifont + " " + LI_DIV_MENUBAR_SEARCH) : tempSearch;
+ } else {
+ var movedown = menubar.movedown;
+ var moveup = menubar.moveup;
+ var refresh = menubar.refresh;
+ var checkAll = menubar.checkAll;
+ var unCheckAll = menubar.unCheckAll;
+ var invertAll = menubar.invertAll;
+ var remove = menubar.remove;
+ var search = menubar.search;
+ if(typeof movedown === 'undefined') {
+ this.usefontStyle.menubar.movedown = (tempMovedown == "") ? (ifont + " " + LI_DIV_MENUBAR_DOWN) : tempMovedown;
+ } else {
+ this.usefontStyle.menubar.movedown = ifont + " " + movedown;
+ }
+ if(typeof moveup === 'undefined') {
+ this.usefontStyle.menubar.moveup = (tempMoveup == "") ? (ifont + " " + LI_DIV_MENUBAR_UP) : tempMoveup;
+ } else {
+ this.usefontStyle.menubar.moveup = ifont + " " + moveup;
+ }
+ if(typeof refresh === 'undefined') {
+ this.usefontStyle.menubar.refresh = (tempRefresh == "") ? (ifont + " " + LI_DIV_MENUBAR_REFRESH) : tempRefresh;
+ } else {
+ this.usefontStyle.menubar.refresh = ifont + " " + refresh;
+ }
+ if(typeof checkAll === 'undefined') {
+ this.usefontStyle.menubar.checkAll = (tempCheckAll == "") ? (ifont + " " + LI_DIV_MENUBAR_CHECKALL) : tempCheckAll;
+ } else {
+ this.usefontStyle.menubar.checkAll = ifont + " " + checkAll;
+ }
+ if(typeof unCheckAll === 'undefined') {
+ this.usefontStyle.menubar.unCheckAll = (tempUncheckAll == "") ? (ifont + " " + LI_DIV_MENUBAR_UNCHECKALL) : tempUncheckAll;
+ } else {
+ this.usefontStyle.menubar.unCheckAll = ifont + " " + unCheckAll;
+ }
+ if(typeof invertAll === 'undefined') {
+ this.usefontStyle.menubar.invertAll = (tempInvertAll == "") ? (ifont + " " + LI_DIV_MENUBAR_INVERTALL) : tempInvertAll;
+ } else {
+ this.usefontStyle.menubar.invertAll = ifont + " " + invertAll;
+ }
+ if(typeof remove === 'undefined') {
+ this.usefontStyle.menubar.remove = (tempRemove == "") ? (ifont + " " + LI_DIV_MENUBAR_DELETE) : tempRemove;
+ } else {
+ this.usefontStyle.menubar.remove = ifont + " " + remove;
+ }
+ if(typeof search === 'undefined') {
+ this.usefontStyle.menubar.search = (tempSearch == "") ? (ifont + " " + LI_DIV_MENUBAR_SEARCH) : tempSearch;
+ } else {
+ this.usefontStyle.menubar.search = ifont + " " + search;
+ }
+ }
+ };
+
+ // 赋值扩展菜单栏图标
+ DTree.prototype.useDefaultOrUserDefineMenubarExtStyle = function(ifont, menubarExt){
+ var _this = this;
+ var tempExt = this.usefontStyle.menubarExt;
+
+ if(typeof menubarExt === 'undefined'){
+ this.usefontStyle.menubarExt = (tempExt == "") ? ifont : tempExt;
+ } else {
+ this.usefontStyle.menubarExt = menubarExt;
+ }
+ };
+
+ // 赋值工具栏图标
+ DTree.prototype.useDefaultOrUserDefineToolbarStyle = function(ifont, toolbar){
+ var _this = this;
+ var tempMovedown = this.usefontStyle.toolbar.menubar.movedown;
+ var tempMoveup = this.usefontStyle.toolbar.menubar.moveup;
+ var tempRefresh = this.usefontStyle.toolbar.menubar.refresh;
+ var tempCheckAll = this.usefontStyle.toolbar.menubar.checkAll;
+ var tempUnCheckAll = this.usefontStyle.toolbar.menubar.unCheckAll;
+ var tempInvertAll = this.usefontStyle.toolbar.menubar.invertAll;
+ var tempRemove = this.usefontStyle.toolbar.menubar.remove;
+ var tempSearch = this.usefontStyle.toolbar.menubar.search;
+ var tempExt = this.usefontStyle.toolbar.menubarExt;
+ var tempPulldown = this.usefontStyle.toolbar.pulldown;
+ var tempPullup = this.usefontStyle.toolbar.pullup;
+ var tempAdd = this.usefontStyle.toolbar.add;
+ var tempEdit = this.usefontStyle.toolbar.edit;
+ var tempDel = this.usefontStyle.toolbar.del;
+
+
+ if(typeof toolbar === 'undefined'){
+ this.usefontStyle.toolbar.menubar.movedown = (tempMovedown == "") ? (ifont + " " + this.usefontStyle.menubar.movedown) : tempMovedown;
+ this.usefontStyle.toolbar.menubar.moveup = (tempMoveup == "") ? (ifont + " " + this.usefontStyle.menubar.moveup) : tempMoveup;
+ this.usefontStyle.toolbar.menubar.refresh = (tempRefresh == "") ? (ifont + " " + this.usefontStyle.menubar.refresh) : tempRefresh;
+ this.usefontStyle.toolbar.menubar.checkAll = (tempCheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.checkAll) : tempCheckAll;
+ this.usefontStyle.toolbar.menubar.unCheckAll = (tempUnCheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.unCheckAll) : tempUnCheckAll;
+ this.usefontStyle.toolbar.menubar.invertAll = (tempInvertAll == "") ? (ifont + " " + this.usefontStyle.menubar.invertAll) : tempInvertAll;
+ this.usefontStyle.toolbar.menubar.remove = (tempRemove == "") ? (ifont + " " + this.usefontStyle.menubar.remove) : tempRemove;
+ this.usefontStyle.toolbar.menubar.search = (tempSearch == "") ? (ifont + " " + this.usefontStyle.menubar.search) : tempSearch;
+ this.usefontStyle.toolbar.menubarExt = (tempExt == "") ? this.usefontStyle.menubarExt : tempExt;
+ this.usefontStyle.toolbar.pulldown = (tempPulldown == "") ? (ifont + " " + LI_DIV_TOOLBAR_PULLDOWN) : tempPulldown;
+ this.usefontStyle.toolbar.pullup = (tempPullup == "") ? (ifont + " " + LI_DIV_TOOLBAR_PULLUP) : tempPullup;
+ this.usefontStyle.toolbar.add = (tempAdd == "") ? (ifont + " " + LI_DIV_TOOLBAR_ADD) : tempAdd;
+ this.usefontStyle.toolbar.edit = (tempEdit == "") ? (ifont + " " + LI_DIV_TOOLBAR_EDIT) : tempEdit;
+ this.usefontStyle.toolbar.del = (tempDel == "") ? (ifont + " " + LI_DIV_TOOLBAR_DEL) : tempDel;
+ } else {
+ var menubar = toolbar.menubar;
+ var menubarExt = toolbar.menubarExt;
+ var pulldown = toolbar.pulldown;
+ var pullup = toolbar.pullup;
+ var add = toolbar.add;
+ var edit = toolbar.edit;
+ var del = toolbar.del;
+
+ if(typeof menubar === 'undefined'){
+ this.usefontStyle.toolbar.menubar.movedown = (tempMovedown == "") ? (ifont + " " + this.usefontStyle.menubar.movedown) : tempMovedown;
+ this.usefontStyle.toolbar.menubar.moveup = (tempMoveup == "") ? (ifont + " " + this.usefontStyle.menubar.moveup) : tempMoveup;
+ this.usefontStyle.toolbar.menubar.refresh = (tempRefresh == "") ? (ifont + " " + this.usefontStyle.menubar.refresh) : tempRefresh;
+ this.usefontStyle.toolbar.menubar.checkAll = (tempCheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.checkAll) : tempCheckAll;
+ this.usefontStyle.toolbar.menubar.unCheckAll = (tempUncheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.unCheckAll) : tempUncheckAll;
+ this.usefontStyle.toolbar.menubar.invertAll = (tempInvertAll == "") ? (ifont + " " + this.usefontStyle.menubar.invertAll) : tempInvertAll;
+ this.usefontStyle.toolbar.menubar.remove = (tempRemove == "") ? (ifont + " " + this.usefontStyle.menubar.remove) : tempRemove;
+ this.usefontStyle.toolbar.menubar.search = (tempSearch == "") ? (ifont + " " + this.usefontStyle.menubar.search) : tempSearch;
+ } else {
+ var movedown = menubar.movedown;
+ var moveup = menubar.moveup;
+ var refresh = menubar.refresh;
+ var checkAll = menubar.checkAll;
+ var unCheckAll = menubar.unCheckAll;
+ var invertAll = menubar.invertAll;
+ var remove = menubar.remove;
+ var search = menubar.search;
+ if(typeof movedown === 'undefined') {
+ this.usefontStyle.toolbar.menubar.movedown = (tempMovedown == "") ? (ifont + " " + this.usefontStyle.menubar.movedown) : tempMovedown;
+ } else {
+ this.usefontStyle.toolbar.menubar.movedown = ifont + " " + movedown;
+ }
+ if(typeof moveup === 'undefined') {
+ this.usefontStyle.toolbar.menubar.moveup = (tempMoveup == "") ? (ifont + " " + this.usefontStyle.menubar.moveup) : tempMoveup;
+ } else {
+ this.usefontStyle.toolbar.menubar.moveup = ifont + " " + moveup;
+ }
+ if(typeof refresh === 'undefined') {
+ this.usefontStyle.toolbar.menubar.refresh = (tempRefresh == "") ? (ifont + " " + this.usefontStyle.menubar.refresh) : tempRefresh;
+ } else {
+ this.usefontStyle.toolbar.menubar.refresh = ifont + " " + refresh;
+ }
+ if(typeof checkAll === 'undefined') {
+ this.usefontStyle.toolbar.menubar.checkAll = (tempCheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.checkAll) : tempCheckAll;
+ } else {
+ this.usefontStyle.toolbar.menubar.checkAll = ifont + " " + checkAll;
+ }
+ if(typeof unCheckAll === 'undefined') {
+ this.usefontStyle.toolbar.menubar.unCheckAll = (tempUncheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.unCheckAll) : tempUncheckAll;
+ } else {
+ this.usefontStyle.toolbar.menubar.unCheckAll = ifont + " " + unCheckAll;
+ }
+ if(typeof invertAll === 'undefined') {
+ this.usefontStyle.toolbar.menubar.invertAll = (tempInvertAll == "") ? (ifont + " " + this.usefontStyle.menubar.invertAll) : tempInvertAll;
+ } else {
+ this.usefontStyle.toolbar.menubar.invertAll = ifont + " " + invertAll;
+ }
+ if(typeof remove === 'undefined') {
+ this.usefontStyle.toolbar.menubar.remove = (tempRemove == "") ? (ifont + " " + this.usefontStyle.menubar.remove) : tempRemove;
+ } else {
+ this.usefontStyle.toolbar.menubar.remove = ifont + " " + remove;
+ }
+ if(typeof search === 'undefined') {
+ this.usefontStyle.toolbar.menubar.search = (tempSearch == "") ? (ifont + " " + this.usefontStyle.menubar.search) : tempSearch;
+ } else {
+ this.usefontStyle.toolbar.menubar.search = ifont + " " + search;
+ }
+ }
+
+ if(typeof menubarExt === 'undefined'){
+ this.usefontStyle.toolbar.menubarExt = (tempExt == "") ? this.usefontStyle.menubarExt : tempExt;
+ } else {
+ this.usefontStyle.toolbar.menubarExt = menubarExt;
+ }
+
+ if(typeof pulldown === 'undefined'){
+ this.usefontStyle.toolbar.pulldown = (tempPulldown == "") ? (ifont + " " + LI_DIV_TOOLBAR_PULLDOWN) : tempPulldown;
+ } else {
+ this.usefontStyle.toolbar.pulldown = ifont + " " + pulldown;
+ }
+ if(typeof pullup === 'undefined'){
+ this.usefontStyle.toolbar.pullup = (tempPullup == "") ? (ifont + " " + LI_DIV_TOOLBAR_PULLUP) : tempPullup;
+ } else {
+ this.usefontStyle.toolbar.pullup = ifont + " " + pullup;
+ }
+ if(typeof add === 'undefined'){
+ this.usefontStyle.toolbar.add = (tempAdd == "") ? (ifont + " " + LI_DIV_TOOLBAR_ADD) : tempAdd;
+ } else {
+ this.usefontStyle.toolbar.add = ifont + " " + add;
+ }
+ if(typeof edit === 'undefined'){
+ this.usefontStyle.toolbar.edit = (tempEdit == "") ? (ifont + " " + LI_DIV_TOOLBAR_EDIT) : tempEdit;
+ } else {
+ this.usefontStyle.toolbar.edit = ifont + " " + edit;
+ }
+ if(typeof del === 'undefined'){
+ this.usefontStyle.toolbar.del = (tempDel == "") ? (ifont + " " + LI_DIV_TOOLBAR_DEL) : tempDel;
+ } else {
+ this.usefontStyle.toolbar.del = ifont + " " + del;
+ }
+ }
+ };
+
+ // 赋值扩展工具栏图标
+ DTree.prototype.useDefaultOrUserDefineToolbarExtStyle = function(ifont, toolbarExt){
+ var _this = this;
+ var tempExt = this.usefontStyle.toolbarExt;
+
+ if(typeof toolbarExt === 'undefined'){
+ this.usefontStyle.toolbarExt = (tempExt == "") ? ifont : tempExt;
+ } else {
+ this.usefontStyle.toolbarExt = toolbarExt;
+ }
+ };
+
+ // 设置图标的展开关闭,以及展开时/关闭时是最后一级图标的处理
+ DTree.prototype.operateIcon = function($i_spread, $i_node){
+ var _this = this;
+ var ficonClass = $i_spread.attr("data-iconClass");
+ var iconClass = $i_node.attr("data-iconClass");
+ return{
+ open: function(){
+ $i_spread.attr("data-spread","open");
+ $i_node.attr("data-spread","open");
+ if(!ficonClass) {
+ $i_spread.removeClass(_this.usefontStyle.fnode.node.close);
+ $i_spread.addClass(_this.usefontStyle.fnode.node.open);
+ }
+ if(!iconClass) {
+ $i_node.removeClass(_this.usefontStyle.snode.node.close);
+ $i_node.addClass(_this.usefontStyle.snode.node.open);
+ }
+ },
+ close: function(){
+ $i_spread.attr("data-spread","close");
+ $i_node.attr("data-spread","close");
+ if(!ficonClass) {
+ $i_spread.removeClass(_this.usefontStyle.fnode.node.open);
+ $i_spread.addClass(_this.usefontStyle.fnode.node.close);
+ }
+ if(!iconClass) {
+ $i_node.removeClass(_this.usefontStyle.snode.node.open);
+ $i_node.addClass(_this.usefontStyle.snode.node.close);
+ }
+ },
+ openWithLeaf: function(){
+ $i_spread.attr("data-spread","open");
+ $i_node.attr("data-spread","open");
+ if(!ficonClass) {
+ $i_spread.removeClass(_this.usefontStyle.fnode.leaf);
+ $i_spread.addClass(_this.usefontStyle.fnode.node.open);
+ }
+ if(!iconClass) {
+ $i_node.removeClass(_this.usefontStyle.snode.leaf);
+ $i_node.addClass(_this.usefontStyle.snode.node.open);
+ }
+ },
+ closeWithLeaf: function(){
+ $i_spread.attr("data-spread","last");
+ $i_node.attr("data-spread","last");
+
+ if(!ficonClass) {
+ $i_spread.removeClass(_this.usefontStyle.fnode.node.open);
+ $i_spread.removeClass(_this.usefontStyle.fnode.node.close);
+ $i_spread.addClass(_this.usefontStyle.fnode.leaf);
+ }
+
+ if(!iconClass) {
+ $i_node.removeClass(_this.usefontStyle.snode.node.open);
+ $i_node.removeClass(_this.usefontStyle.snode.node.close);
+ $i_node.addClass(_this.usefontStyle.snode.leaf);
+ }
+ }
+ }
+ };
+
+ // 显示树线
+ DTree.prototype.showLine = function($lis){
+ var _this = this;
+ if(_this.line){
+ if($lis && $lis.length > 0) {
+ $lis.each(function(){
+ _this.showLineLi($(this));
+ });
+ } else {
+ _this.obj.find("li[data-id]").each(function(){
+ _this.showLineLi($(this));
+ });
+ }
+ }
+ }
+
+ // 真正显示树线的方法
+ DTree.prototype.showLineLi = function($li){
+ var _this = this;
+ var $div = $li.children("div"),
+ $nextLi = $li.next("li"),
+ $ul = $li.parent("ul");
+ if($ul[0].id == _this.obj[0].id) {
+ // 根节点下的节点
+ $li.removeClass(LI_NAV_LINE);
+ $li.removeClass(LI_NAV_LAST_LINE);
+ $li.addClass(LI_NAV_FIRST_LINE);
+ } else {
+ // 非根节点下的节点
+ var $pnextLi = $ul.parent("li").next("li");
+ if($pnextLi.length == 0) {
+ if($nextLi.length == 0){
+ $li.removeClass(LI_NAV_LINE);
+ $li.removeClass(LI_NAV_FIRST_LINE);
+ $li.addClass(LI_NAV_LAST_LINE);
+ } else {
+ $li.removeClass(LI_NAV_FIRST_LINE);
+ $li.removeClass(LI_NAV_LAST_LINE);
+ $li.addClass(LI_NAV_LINE);
+ }
+ }else {
+ var $pnextdiv = $pnextLi.children("div");
+ if($nextLi.length == 0 && $div.children("cite").attr("data-leaf") == "leaf" && $pnextdiv.children("cite").attr("data-leaf") == "leaf") {
+ $li.removeClass(LI_NAV_FIRST_LINE);
+ $li.removeClass(LI_NAV_LINE);
+ $li.addClass(LI_NAV_LAST_LINE);
+ } else {
+ $li.removeClass(LI_NAV_FIRST_LINE);
+ $li.removeClass(LI_NAV_LAST_LINE);
+ $li.addClass(LI_NAV_LINE);
+ }
+ }
+ }
+ }
+
+ /******************** 初始化数据区域 ********************/
+ // 设置高度
+ DTree.prototype.autoHeight = function(){
+ var _this = this;
+ var height = _this.height;
+ console.log(height);
+ if(height != "") {
+ if(_this.elem == _this.toolbarScroll){
+ _this.obj.parent().css("height", height + "px");
+ } else {
+ var $toolbarDiv = _this.obj.closest(_this.toolbarScroll);
+ $toolbarDiv.css("height", height + "px");
+ }
+ }
+ };
+
+ // 重载树
+ DTree.prototype.reload = function(options){
+ var _this = this;
+ _this.reloadSetting(options);
+ _this.init();
+ };
+
+ // 初始化树
+ DTree.prototype.init = function(){
+ var _this = this;
+ if (typeof _this !== "object") {
+ layer.msg("树组件未成功加载,请检查配置", {icon:5});
+ return ;
+ }
+
+ // 设置组件高度
+ _this.autoHeight();
+
+ if(_this.data) {
+ if(typeof _this.data.length === 'undefined'){
+ layer.msg("数据解析异常,data数据格式不正确", {icon:5});
+ return ;
+ }
+
+ if(_this.data.length == 0) {
+ _this.obj.html(_this.getNoneDom().text());
+ return ;
+ }
+
+ //先将ul中的元素清空
+ _this.obj.html("");
+
+ setTimeout(function () {
+ // 加载完毕后执行树解析前的回调
+ _this.success(_this.data, _this.obj);
+
+ // 第一次解析树
+ if (_this.dataFormat == 'list'){
+ //1.识别根节点ul中的data-id标签,判断顶级父节点
+ var pid = _this.obj.attr("data-id");
+ //2.构建一个存放节点的树组
+ var rootListData = _this.queryListTreeByPid(pid, _this.data);
+ _this.loadListTree(rootListData, _this.data, 1);
+ } else {
+ _this.loadTree(_this.data, 1);
+ }
+
+ // 显示树线
+ _this.showLine();
+
+ // 这种情况下需要一开始就将toolbar显示在页面上
+ if(_this.toolbar && _this.toolbarWay != 'contextmenu') {
+ _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu);
+ }
+
+ // 判断是否存在错误数据,并是否打印错误数据
+ _this.msgErrData();
+
+ // 加载完毕后的回调
+ _this.done(_this.data, _this.obj);
+ }, 100);
+ } else {
+ if (!_this.url) {
+ layer.msg("数据请求异常,url参数未指定", {icon:5});
+ return ;
+ }
+
+ //先将ul中的元素清空
+ _this.obj.html("");
+
+ var index = _this.load ? layer.load(1) : "";
+
+ AjaxHelper.request({
+ async: _this.async,
+ headers: _this.headers,
+ type: _this.method,
+ url: _this.url,
+ dataType: _this.dataType,
+ contentType: _this.contentType,
+ data: _this.getFilterRequestParam(_this.getRequestParam()),
+ success: function(result) {
+ if (typeof result === 'string') {
+ result = $.parseJSON(result);
+ }
+ var code = "";
+ if (_this.dataStyle == 'layuiStyle'){
+ code = result[_this.response.statusName];
+ } else {
+ code = result.status[_this.response.statusName];
+ }
+
+ if (code == _this.response.statusCode) {
+ var d = result[_this.response.rootName];
+
+ if(typeof d.length === 'undefined'){
+ layer.msg("数据解析异常,url回调后的数据格式不正确", {icon:5});
+ return ;
+ }
+
+ if(d.length == 0) {
+ _this.obj.html(_this.getNoneDom().text());
+ return ;
+ }
+
+
+ // 加载完毕后执行树解析前的回调
+ _this.success(result, _this.obj);
+
+ // 第一次解析树
+ if (_this.dataFormat == 'list'){
+ //1.识别根节点ul中的data-id标签,判断顶级父节点
+ var pid = _this.obj.attr("data-id");
+ //2.构建一个存放节点的树组
+ var rootListData = _this.queryListTreeByPid(pid, d);
+ _this.loadListTree(rootListData, d, 1);
+ } else {
+ _this.loadTree(d, 1);
+ }
+
+ // 显示树线
+ _this.showLine();
+
+ // 这种情况下需要一开始就将toolbar显示在页面上
+ if(_this.toolbar && _this.toolbarWay != 'contextmenu') {
+ _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu);
+ }
+
+ // 判断是否存在错误数据,并是否打印错误数据
+ _this.msgErrData();
+
+ // 加载完毕后的回调
+ _this.done(result, _this.obj);
+ } else {
+ // 如果打印不出任何信息说明是在这里,用了错误的数据格式
+ if (_this.dataStyle == 'layuiStyle'){
+ layer.msg(result[_this.response.message], {icon:2});
+ } else {
+ layer.msg(result.status[_this.response.message], {icon:2});
+ }
+ }
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown){// 异步加载异常回调
+ _this.error(XMLHttpRequest, textStatus, errorThrown);
+ },
+ complete: function(XMLHttpRequest, textStatus){// 异步加载完成回调
+ if(_this.load){layer.close(index);}
+ _this.complete(XMLHttpRequest, textStatus);
+ }
+ });
+ }
+ };
+
+ // 加载子节点
+ DTree.prototype.getChild = function($div, data) {
+ var _this = this, $ul = $div.next("ul");
+
+ _this.setNodeParam($div);
+
+ if(typeof data !== 'undefined') {
+ if(typeof data.length === 'undefined'){
+ layer.msg("数据解析异常,data数据格式不正确", {icon:5});
+ return ;
+ }
+
+ //先将ul中的元素清空
+ $ul.html("");
+
+ // 解析树
+ if (_this.dataFormat == 'list'){
+ var pid = _this.node.nodeId;
+ var level = parseInt(_this.node.level)+1;
+
+ var listData = _this.queryListTreeByPid(pid, data);
+ _this.loadListTree(listData, _this.data, level);
+ } else {
+ _this.loadTree(data, level);
+ }
+
+ // 显示树线
+ _this.showLine();
+
+ // 这种情况下需要一开始就将toolbar显示在页面上
+ if(_this.toolbar && _this.toolbarWay != 'contextmenu') {
+ _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu);
+ }
+
+ // 判断是否存在错误数据,并是否打印错误数据
+ _this.msgErrData();
+
+ } else {
+ if (!_this.url) {
+ layer.msg("数据请求异常,url参数未指定", {icon:5});
+ return ;
+ }
+
+ $ul.html("");
+ var index = _this.load ? layer.load(1) : "";
+ AjaxHelper.request({
+ async: _this.async,
+ headers: _this.headers,
+ type: _this.method,
+ url: _this.url,
+ dataType: _this.dataType,
+ data: _this.getFilterRequestParam(_this.getRequestParam()),
+ success: function(result) {
+ if (typeof result === 'string') {
+ result = $.parseJSON(result);
+ }
+ var code = "";
+ if (_this.dataStyle == 'layuiStyle'){
+ code = result[_this.response.statusName];
+ } else {
+ code = result.status[_this.response.statusName];
+ }
+
+ if (code == _this.response.statusCode) {
+ // 解析树
+ var pid = _this.node.nodeId;
+ var level = parseInt(_this.node.level)+1;
+ if (_this.dataFormat == 'list'){
+ var pListData = _this.queryListTreeByPid(pid, result[_this.response.rootName]);
+ _this.loadListTree(pListData, result[_this.response.rootName], level, $ul);
+ } else {
+ _this.loadTree(result[_this.response.rootName], level, $ul);
+ }
+
+ // 显示树线
+ _this.showLine();
+
+ // 这种情况下需要一开始就将toolbar显示在页面上
+ if(_this.toolbar && _this.toolbarWay != 'contextmenu') {
+ _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu);
+ }
+
+ // 判断是否存在错误数据,并是否打印错误数据
+ _this.msgErrData();
+
+ $ul.addClass(NAV_SHOW);
+ } else {
+ if (_this.dataStyle == 'layuiStyle'){
+ layer.msg(result[_this.response.message], {icon:2});
+ } else {
+ layer.msg(result.status[_this.response.message], {icon:2});
+ }
+ }
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown){// 异步加载异常回调
+ _this.error();
+ },
+ complete: function(XMLHttpRequest, textStatus){// 异步加载完成回调
+ if(_this.load){layer.close(index);}
+ _this.complete();
+ }
+ });
+ }
+ };
+
+ // 初始化树或者拼接树
+ DTree.prototype.loadListTree = function(pListData, listData, level, $ul){
+ var _this = this;
+ $ul = $ul || _this.getNodeDom().nowOrRootUl(); //当前选中的节点或根节点
+ if (pListData.length > 0){
+ for (var i = 0; i < pListData.length; i++) {
+ // 1.获取已知节点的全部数据
+ var data = pListData[i];
+ if(typeof data !== "object") continue;
+ var parseData = _this.parseData(data);
+ var childListData = _this.queryListTreeByPid(parseData.treeId(), listData); // 根据已知数据的id判断该条数据是否还有子数据
+
+ // 3. 页面元素加载数据
+ $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(childListData.length), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(level), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), ($ul.hasClass(UL_ROOT) ? "root" : "item")));
+ // 4.有子数据的元素加载子节点
+ if(childListData.length > 0){
+ var cLevel = parseInt(level)+1;
+ _this.loadListTree(childListData, listData, cLevel, _this.obj.find("ul[data-id='"+parseData.treeId()+"']"));
+ }
+ }
+ }
+ };
+
+ // 根据父ID查找list数据中匹配的元素
+ DTree.prototype.queryListTreeByPid = function(pid, listData){
+ var _this = this;
+ var rootListData = [];
+ if (listData) {
+ for (var i = 0; i < listData.length; i++) {
+ var data = listData[i];
+ if(typeof data !== "object") continue;
+ if(pid == "null" || pid == null){
+ if(data[_this.response.parentId] == null) { rootListData.push(data); }
+ } else {
+ if (data[_this.response.parentId] == pid){
+ if (data[_this.response.treeId] == pid){
+ _this.errData.push(data);
+ } else {
+ rootListData.push(data);
+ }
+ }
+ }
+ }
+ }
+ return rootListData;
+ };
+
+ // 初始化树或者拼接树
+ DTree.prototype.loadTree = function(root, level, $ul){
+ var _this = this;
+ if (root) {
+ $ul = $ul || _this.getNodeDom().nowOrRootUl(); //当前选中的节点或根节点
+ for (var i = 0; i < root.length; i++) { // 遍历跟节点或追加的跟节点
+ var data = root[i];
+ if(typeof data !== "object") continue;
+ if(data[_this.response.treeId] == data[_this.response.parentId]) { _this.errData.push(data); }
+ var parseData = _this.parseData(data);
+ var children = parseData.children();
+ $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(children.length), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(level), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), ($ul.hasClass(UL_ROOT) ? "root" : "item")));
+ if (children.length != 0) {
+ var cLevel = parseInt(level)+1;
+ _this.loadTree(children, cLevel, _this.obj.find("ul[data-id='"+parseData.treeId()+"']"));
+ }
+ }
+ }
+ };
+
+ // 判断在数据加载时是否存在错误数据,并是否打印错误数据
+ DTree.prototype.msgErrData = function() {
+ var _this = this;
+ if(_this.errData.length > 0 && _this.errDataShow) {
+ var title = "";
+ for(var i=0; i<_this.errData.length; i++) {
+ var edata = _this.errData[i];
+ title += "数据:【"+edata[_this.response.title]+"】中节点id和上级id值一致! \n";
+ }
+ layer.msg(title, {icon:2,time:5000});
+ }
+ // 显示之后,将错误数据制空
+ _this.errData = [];
+ };
+
+ // 解析data数据
+ DTree.prototype.parseData = function(data) {
+ var _this = this;
+
+ return {
+ treeId: function(){
+ return data[_this.response.treeId];
+ },
+ parentId: function(){
+ return data[_this.response.parentId];
+ },
+ fmtTitle: function(){
+ if(typeof _this.formatter.title === 'function'){
+ var ftitle = _this.formatter.title(data);
+ var tt = data[_this.response.title];
+ tt = (ftitle == "" || ftitle == undefined || ftitle == null) ? tt : ftitle;
+ return tt || "";
+ }
+ return data[_this.response.title];
+ },
+ title: function(){
+ return data[_this.response.title];
+ },
+ level: function(){
+ return data[_this.response.level] || "";
+ },
+ ficonClass: function(){
+ return data[_this.response.ficonClass] || "";
+ },
+ iconClass: function(){
+ return data[_this.response.iconClass] || "";
+ },
+ last: function(len){
+ return ((len == 0) ?
+ ((typeof (data[_this.response.last]) === "boolean") ? data[_this.response.last] : true) :
+ ((typeof (data[_this.response.last]) === "boolean") ? data[_this.response.last] : false));
+ },
+ spread: function(level){
+ return ((level < _this.initLevel) ?
+ ((typeof (data[_this.response.spread]) === "boolean") ? data[_this.response.spread] : true) :
+ ((typeof (data[_this.response.spread]) === "boolean") ? data[_this.response.spread] : false));
+ },
+ disabled: function(){
+ return (typeof (data[_this.response.disabled]) === "boolean") ? data[_this.response.disabled] : false;
+ },
+ hide: function(){
+ return (typeof (data[_this.response.hide]) === "boolean") ? data[_this.response.hide] : false;
+ },
+ checkArr: function(){
+ var checkArr = [];
+ var checkArrData = data[_this.response.checkArr];
+ if(typeof checkArrData === 'string'){
+ if(checkArrData.indexOf("{") > -1 && checkArrData.indexOf("}") > -1){
+ checkArrData = JSON.parse(checkArrData);
+ } else {
+ checkArrData = {"type":"0","checked":checkArrData};
+ }
+ }
+ if(typeof checkArrData === 'object'){
+ if(typeof checkArrData.length === 'undefined'){
+ checkArr.push(checkArrData);
+ } else {
+ checkArr = checkArrData;
+ }
+ }
+
+ if(checkArr.length > 0 && checkArr.length > _this.checkArrLen){
+ _this.checkArrLen = checkArr.length; // 获取复选框个数
+ }
+ return checkArr;
+
+ },
+ children: function(){
+ return data[_this.response.childName] || [];
+ },
+ basicData: function(){
+ return event.escape(JSON.stringify(data[_this.response.basicData])) || JSON.stringify({});
+ },
+ recordData: function(){
+ //var recordData = _this.record ? event.cloneObj(data, [_this.response.basicData, _this.response.childName]) : {};
+ var recordData = _this.record ? event.cloneObj(data, [_this.response.treeId,
+ _this.response.parentId,
+ _this.response.title,
+ _this.response.iconClass,
+ _this.response.childName,
+ _this.response.last,
+ _this.response.spread,
+ _this.response.disabled,
+ _this.response.hide,
+ _this.response.checkArr,
+ _this.response.checked,
+ _this.response.type,
+ _this.response.basicData]) : {};
+
+ return event.escape(JSON.stringify(recordData));
+ },
+ data: function(){
+ return data;
+ }
+ }
+
+ };
+
+ //当无节点数据时显示dom
+ DTree.prototype.getNoneDom = function(){
+ var _this = this,
+ rootId = _this.obj[0].id,
+ noneTitle = _this.none;
+
+ return {
+ text: function(){
+ return "<div class='"+NONETITLE+"' dtree-id='"+rootId+"'>"+noneTitle+"</div>";
+ }
+ }
+ };
+
+ //新增节点的dom值
+ DTree.prototype.getDom = function(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide) {
+ var _this = this,
+ rootId = _this.obj[0].id,
+ toolbar = _this.toolbar,
+ checkbar = _this.checkbar;
+
+ return {
+ fnode: function() { // + - 图标
+ // 获取图标的变量
+ var fnodeIcon = _this.fnodeIcon,
+ fleafIcon = _this.fleafIcon;
+
+ var fleafIconLeaf = _this.usefontStyle.fnode.leaf,
+ fnodeIconOpen = _this.usefontStyle.fnode.node.open,
+ fnodeIconClose = _this.usefontStyle.fnode.node.close;
+
+ if(ficonClass){
+ var iconfont = _this.iconfont;
+ if(typeof iconfont === 'string') {
+ fleafIconLeaf = iconfont + " " + ficonClass;
+ fnodeIconOpen = iconfont + " " + ficonClass;
+ fnodeIconClose = iconfont + " " + ficonClass;
+ } else {
+ fleafIconLeaf = iconfont[0] + " " + ficonClass;
+ fnodeIconOpen = iconfont[0] + " " + ficonClass;
+ fnodeIconClose = iconfont[0] + " " + ficonClass;
+ }
+ }
+
+ if(fnodeIcon != "-1" && fleafIcon != "-1"){ // 都加载
+ return last ? "<i class='"+fleafIconLeaf+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" :
+ (spread ? "<i class='"+fnodeIconOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+fnodeIconClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>");
+ }
+
+ if(fnodeIcon != "-1" && fleafIcon == "-1"){ // 加载node 隐藏leaf
+ return last ? "<i class='"+fleafIconLeaf+" "+ICON_HIDE+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" :
+ (spread ? "<i class='"+fnodeIconOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+fnodeIconClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>");
+ }
+
+ if(fnodeIcon == "-1" && fleafIcon != "-1"){ // 隐藏node 加载leaf
+ return last ? "<i class='"+fleafIconLeaf+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" :
+ (spread ? "<i class='"+fnodeIconOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+fnodeIconClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>");
+ }
+
+ if(fnodeIcon == "-1" && fleafIcon == "-1"){ // 都隐藏
+ return last ? "<i class='"+fleafIconLeaf+" "+ICON_HIDE+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' style='display:none;'></i>" :
+ (spread ? "<i class='"+fnodeIconOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+fnodeIconClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>");
+ }
+ },
+ node: function() { // 二级图标样式
+ // 获取图标的变量
+ var nodeIcon = _this.nodeIcon,
+ leafIcon = _this.leafIcon;
+
+ var sleafIconLeaf = _this.usefontStyle.snode.leaf,
+ snodeIconOpen = _this.usefontStyle.snode.node.open,
+ snodeIconClose = _this.usefontStyle.snode.node.close;
+ if(iconClass){
+ var iconfont = _this.iconfont;
+ if(typeof iconfont === 'string') {
+ sleafIconLeaf = iconfont + " " + iconClass;
+ snodeIconOpen = iconfont + " " + iconClass;
+ snodeIconClose = iconfont + " " + iconClass;
+ } else {
+ sleafIconLeaf = iconfont[0] + " " + iconClass;
+ snodeIconOpen = iconfont[0] + " " + iconClass;
+ snodeIconClose = iconfont[0] + " " + iconClass;
+ }
+ }
+
+ if(nodeIcon != "-1" && leafIcon != "-1"){ // 都加载
+ return last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>");
+ }
+
+ if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf
+ return last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>");
+ }
+
+ if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf
+ return last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>");
+ }
+
+ if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏
+ return last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>");
+ }
+ },
+ checkbox: function() { // 复选框
+ var flag = false;
+ if(_this.checkbarLoad == "node"){if (checkbar) {flag = true;}} else {if (last) {if (checkbar) {flag = true;}}}
+
+ if(flag){
+ var result = "<div class='"+LI_DIV_CHECKBAR+"' data-id='"+treeId+"' dtree-id='"+rootId+"'>";
+ if(checkArr && checkArr.length > 0){
+
+ for (var i = 0; i < checkArr.length; i++) {
+ var checkData = checkArr[i];
+ var checked = checkData.checked;
+ var CHOOSE_CLASS = _this.usefontStyle.checkbox.out;
+ if (checked == "2") { //半选择
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.noall + " " + _this.style.chs;
+ } else if (checked == "1") { //选择
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.on + " " + _this.style.chs;
+ } else { //未选择或者无值
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.out;
+ }
+ var disClass = "";
+ if(disabled){disClass = NAV_DIS;}
+ result += "<i class='"+CHOOSE_CLASS+" "+_this.style.dfont+" "+_this.style.cbox+" "+disClass+"' data-id='"+treeId+"' dtree-id='"+rootId+"' data-checked='"+checkData.checked+"' data-initchecked='"+checkData.checked+"' data-type='"+checkData.type+"' dtree-click='"+eventName.checkNodeClick+"' data-par='."+LI_CLICK_CHECKBAR+"' dtree-disabled='"+disabled+"'></i>";
+ }
+ }
+ result += "</div>";
+ return result;
+ }
+
+ return "";
+ },
+ text: function() { // 文字显示
+ var disClass = "";
+ if(disabled){disClass = NAV_DIS;}
+ return "<cite class='"+LI_DIV_TEXT_CLASS+" "+disClass+"' data-id='"+treeId+"' data-leaf='"+(last ? "leaf" : "node")+"' dtree-disabled='"+disabled+"' data-title='"+title+"' >"+fmtTitle+"</cite>";
+ },
+ ul: function() { //子节点ul
+ return last ? "<ul class='"+LI_NAV_CHILD+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>" :
+ (spread ? "<ul class='"+LI_NAV_CHILD+" "+NAV_SHOW+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>" : "<ul class='"+LI_NAV_CHILD+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>");
+ }
+ };
+ };
+
+ //替换节点的dom值,或指定值
+ DTree.prototype.replaceDom = function($div, treeId, last, spread, disabled, hide) {
+ var _this = this,
+ rootId = _this.obj[0].id,
+ toolbar = _this.toolbar,
+ checkbar = _this.checkbar;
+
+ return {
+ fnode: function(ficonClass) { // + - 图标
+ var fnode = "";
+
+ // 获取图标的变量
+ var fnodeIcon = _this.fnodeIcon,
+ fleafIcon = _this.fleafIcon;
+
+ var fleafIconLeaf = _this.usefontStyle.fnode.leaf,
+ fnodeIconOpen = _this.usefontStyle.fnode.node.open,
+ fnodeIconClose = _this.usefontStyle.fnode.node.close;
+
+ if(ficonClass){
+ var iconfont = _this.iconfont;
+ if(typeof iconfont === 'string') {
+ fleafIconLeaf = iconfont + " " + ficonClass;
+ fnodeIconOpen = iconfont + " " + ficonClass;
+ fnodeIconClose = iconfont + " " + ficonClass;
+ } else {
+ fleafIconLeaf = iconfont[0] + " " + ficonClass;
+ fnodeIconOpen = iconfont[0] + " " + ficonClass;
+ fnodeIconClose = iconfont[0] + " " + ficonClass;
+ }
+ }
+
+ if(fnodeIcon != "-1" && leafIcon != "-1"){ // 都加载
+ fnode = last ? "<i class='"+fleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+fnodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+fnodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>");
+ }else if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf
+ fnode = last ? "<i class='"+fleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+fnodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+fnodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>");
+ }else if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf
+ fnode = last ? "<i class='"+fleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+fnodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+fnodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>");
+ }else if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏
+ fnode = last ? "<i class='"+fleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+fnodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+fnodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>");
+ }
+ if(fnode != ""){_this.getNodeDom($div).fnode().replaceWith($(fnode));}
+ },
+ node: function(iconClass) { // 二级图标样式
+ var snode = "";
+
+ // 获取图标的变量
+ var nodeIcon = _this.nodeIcon,
+ leafIcon = _this.leafIcon;
+
+ var sleafIconLeaf = _this.usefontStyle.snode.leaf,
+ snodeIconOpen = _this.usefontStyle.snode.node.open,
+ snodeIconClose = _this.usefontStyle.snode.node.close;
+ if(iconClass){
+ var iconfont = _this.iconfont;
+ if(typeof iconfont === 'string') {
+ sleafIconLeaf = iconfont + " " + iconClass;
+ snodeIconOpen = iconfont + " " + iconClass;
+ snodeIconClose = iconfont + " " + iconClass;
+ } else {
+ sleafIconLeaf = iconfont[0] + " " + iconClass;
+ snodeIconOpen = iconfont[0] + " " + iconClass;
+ snodeIconClose = iconfont[0] + " " + iconClass;
+ }
+ }
+
+ if(nodeIcon != "-1" && leafIcon != "-1"){ // 都加载
+ snode = last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>");
+ }else if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf
+ snode = last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>");
+ }else if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf
+ snode = last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>");
+ }else if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏
+ snode = last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" :
+ (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>");
+ }
+ if(snode != ""){_this.getNodeDom($div).snode().replaceWith($(snode));}
+ },
+ checkbox: function(checkArr) { // 复选框
+ var flag = false;
+ if(_this.checkbarLoad == "node"){if (checkbar) {flag = true;}} else {if (last) {if (checkbar) {flag = true;}}}
+
+ if(flag){
+ var result = "<div class='"+LI_DIV_CHECKBAR+"' data-id='"+treeId+"' dtree-id='"+rootId+"'>";
+ if(checkArr && checkArr.length > 0){
+
+ for (var i = 0; i < checkArr.length; i++) {
+ var checkData = checkArr[i];
+ var checked = checkData.checked;
+ var CHOOSE_CLASS = _this.usefontStyle.checkbox.out;
+ if (checked == "2") { //半选择
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.noall + " " + _this.style.chs;
+ } else if (checked == "1") { //选择
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.on + " " + _this.style.chs;
+ } else { //未选择或者无值
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.out;
+ }
+ var disClass = "";
+ if(disabled){disClass = NAV_DIS;}
+ result += "<i class='"+CHOOSE_CLASS+" "+_this.style.dfont+" "+_this.style.cbox+" "+disClass+"' data-id='"+treeId+"' dtree-id='"+rootId+"' data-checked='"+checkData.checked+"' data-initchecked='"+checkData.checked+"' data-type='"+checkData.type+"' dtree-click='"+eventName.checkNodeClick+"' data-par='."+LI_CLICK_CHECKBAR+"' dtree-disabled='"+disabled+"'></i>";
+ }
+ }
+ result += "</div>";
+ _this.getNodeDom($div).snode().next("div").replaceWith($(result));
+ }
+ },
+ text: function(title) { // 文字显示
+ var disClass = "";
+ if(disabled){disClass = NAV_DIS;}
+ var cite = "<cite class='"+LI_DIV_TEXT_CLASS+" "+disClass+"' data-id='"+treeId+"' data-leaf='"+(last ? "leaf" : "node")+"' dtree-disabled='"+disabled+"' >"+title+"</cite>"
+ _this.getNodeDom($div).cite().replaceWith($(cite));
+ },
+ ul: function() { //子节点ul
+ var ul = last ? "<ul class='"+LI_NAV_CHILD+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>" :
+ (spread ? "<ul class='"+LI_NAV_CHILD+" "+NAV_SHOW+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>" : "<ul class='"+LI_NAV_CHILD+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>");
+ _this.getNodeDom($div).nextUl().replaceWith($(ul));
+ },
+ basicData: function(basicData){
+ basicData = (basicData == "{}") ? "" : basicData;
+ $div.attr("data-basic", basicData);
+ },
+ recordData: function(recordData){
+ recordData = (recordData == "{}") ? "" : recordData;
+ $div.attr("data-record", recordData);
+ },
+ p_li: function(){
+ $div.parent("li").attr("data-id", treeId);
+ }
+ };
+
+ };
+
+ // 获取拼接好的li
+ DTree.prototype.getLiItemDom = function(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide, basicData, recordData, flag) {
+ var _this = this,
+ rootId = _this.obj[0].id;
+
+ var dom = _this.getDom(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide);
+ basicData = (basicData == "{}") ? "" : basicData;
+ recordData = (recordData == "{}") ? "" : recordData;
+ var div = "<div class='"+LI_DIV_ITEM+" "+_this.style.item+"' data-id='"+treeId+"' dtree-id='"+rootId+"' dtree-click='"+eventName.itemNodeClick+"' data-basic='"+basicData+"' data-record='"+recordData+"' dtree-disabled='"+disabled+"' dtree-hide='"+hide+"' ";
+ if(_this.toolbar){
+ if(_this.toolbarWay == "contextmenu") {
+ if(_this.toolbarLoad == "node") { div += " d-contextmenu='true'>"; }
+ if(_this.toolbarLoad == "noleaf") { if(!last){ div += " d-contextmenu='true'>"; } else { div += " d-contextmenu='false'>";} }
+ if(_this.toolbarLoad == "leaf") { if(last){ div += " d-contextmenu='true'>"; } else { div += " d-contextmenu='false'>";} }
+ } else { div += " d-contextmenu='false'>"; }
+ } else { div += " d-contextmenu='false'>"; }
+
+ var hideClass = "";
+ var lineClass = "";
+ if(hide){hideClass = NAV_HIDE;}
+ /*if(_this.line){
+ if(flag == "root") {
+ lineClass = LI_NAV_FIRST_LINE;
+ } else if(last == true){
+ lineClass = LI_NAV_LAST_LINE;
+ } else {
+ lineClass = LI_NAV_LINE;
+ }
+ }*/
+ /*if(_this.line){
+ if(flag == "root") {
+ lineClass = LI_NAV_FIRST_LINE;
+ } else {
+ lineClass = LI_NAV_LINE;
+ }
+ }*/
+ var li = ["<li " + "class='"+LI_CLICK_CHECKBAR+" "+LI_NAV_ITEM+" "+hideClass+" "+lineClass+"'" + "data-id='"+treeId+"'" + "data-pid='"+(flag == "root" ? ((typeof parentId !== undefined && parentId != "") ? parentId : "-1") : parentId)+"'" + "dtree-id='"+rootId+"'" + "data-index='"+level+"'" + "dtree-hide='"+hide+"'" +">" +
+ div ,
+ dom.fnode(),
+ dom.node(),
+ dom.checkbox(),
+ dom.text(),
+ "</div>", dom.ul(), "</li>"].join("");
+
+ return li;
+ };
+
+ // 初始化节点,用于数据回显
+ DTree.prototype.dataInit = function(chooseId){
+ var _this = this;
+ var $div = _this.obj.find("div[data-id='"+chooseId+"']");
+ _this.getNodeDom($div).parentLi().find("."+NAV_THIS).removeClass(NAV_THIS);
+ _this.getNodeDom($div).parentLi().find("."+_this.style.itemThis).removeClass(_this.style.itemThis);
+ $div.addClass(NAV_THIS);
+ $div.addClass(_this.style.itemThis);
+ _this.setNodeParam($div);
+ // 将该节点的父节点全部展开
+ var $li_parents = $div.parents("."+LI_NAV_ITEM);
+ $li_parents.children("ul").addClass(NAV_SHOW);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.fnode.node.close)).addClass(_this.usefontStyle.fnode.node.open);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.fnode.node.close)).removeClass(_this.usefontStyle.fnode.node.close);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.snode.node.close)).addClass(_this.usefontStyle.snode.node.open);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.snode.node.close)).removeClass(_this.usefontStyle.snode.node.close);
+ return _this.getNowParam();
+ };
+
+ /******************** 基础事件区域 ********************/
+ // 数据格式化
+ DTree.prototype.escape = function(html){
+ return event.escape(html);
+ };
+
+ // 格式化数据转回正常数据
+ DTree.prototype.unescape = function(str){
+ return event.unescape(str);
+ };
+
+ // 取消选中div
+ DTree.prototype.cancelNavThis = function(){
+ var _this = this;
+ _this.obj.find("div[data-id]").parent().find("."+NAV_THIS).removeClass(NAV_THIS);
+ _this.obj.find("div[data-id]").parent().find("."+_this.style.itemThis).removeClass(_this.style.itemThis);
+ }
+
+ // 选中div
+ DTree.prototype.navThis = function(id){
+ var _this = this;
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ if($div != null) {
+ _this.cancelNavThis();
+ $div.addClass(NAV_THIS);
+ $div.addClass(_this.style.itemThis);
+ }
+ }
+
+ // 手风琴模式操作其他节点
+ DTree.prototype.accordionUL = function($ul) {
+ var _this = this;
+ if(_this.accordion) {
+ $ul.closest("li[data-index]").siblings("li[data-index]").children("ul[data-id]").removeClass(NAV_SHOW);
+ var $divs = $ul.closest("li[data-index]").siblings("li[data-index]").children("ul[data-id]").prev("div");
+ if($divs.length && $divs.length > 0) {
+ for (var i=0; i<$divs.length; i++) {
+ var $div = $($divs[i]);
+ var $i_spread = _this.getNodeDom($div).fnode(),
+ $i_node = _this.getNodeDom($div).snode();
+ if($i_spread.attr("data-spread") != 'last'){
+ _this.operateIcon($i_spread, $i_node).close();
+ }
+ }
+ }
+
+ }
+ };
+
+ // 展开或隐藏节点 作用点: div
+ DTree.prototype.clickSpread = function($div) {
+ var _this = this;
+ var $i_spread = _this.getNodeDom($div).fnode(),
+ $i_node = _this.getNodeDom($div).snode(),
+ $cite = _this.getNodeDom($div).cite(),
+ spread = $i_spread.attr("data-spread"),
+ $ul = $div.next("ul");
+
+ if ($ul.length > 0) {
+ if (spread == "close") {
+ if (_this.type=="load") { //增加加载
+ if (_this.cache) { //开启缓存
+ if ($ul.html()) {
+ $ul.addClass(NAV_SHOW);
+ _this.accordionUL($ul);
+ } else { //加载节点
+ _this.getChild($div);
+ _this.accordionUL($ul);
+ }
+ }else { //每次取新的数据
+ $ul.html("");
+ _this.getChild($div);
+ _this.accordionUL($ul);
+ }
+ } else { // 全量加载
+ $ul.addClass(NAV_SHOW);
+ _this.accordionUL($ul);
+ }
+ _this.operateIcon($i_spread, $i_node).open();
+ } else if (spread == "open") {
+ $ul.removeClass(NAV_SHOW);
+ _this.operateIcon($i_spread, $i_node).close();
+ }
+ }
+ };
+
+ // 设置节点为disabled
+ DTree.prototype.setDisabledNodes = function(disabledIds){
+ var _this = this;
+ var disabledId = disabledIds.split(",");
+ for (var i=0; i<disabledId.length; i++) {
+ var $div = _this.getNodeDom(disabledId[i]).div();
+ var $i = $div.children("div."+LI_DIV_CHECKBAR).children("i[data-par]");
+ var $cite = $div.children("cite[data-leaf]");
+ if($div != null && $div.attr("dtree-disabled") != "true") {
+ $div.attr("dtree-disabled", "true");
+ $i.attr("dtree-disabled", "true");
+ $i.addClass(NAV_DIS);
+ $cite.attr("dtree-disabled", "true");
+ $cite.addClass(NAV_DIS);
+ }
+ }
+ };
+
+ // 将节点的disabled取消
+ DTree.prototype.cancelDisabledNodes = function(disabledIds){
+ var _this = this;
+ var disabledId = disabledIds.split(",");
+ for (var i=0; i<disabledId.length; i++) {
+ var $div = _this.getNodeDom(disabledId[i]).div();
+ var $i = $div.children("div."+LI_DIV_CHECKBAR).children("i[data-par]");
+ var $cite = $div.children("cite[data-leaf]");
+ if($div != null && $div.attr("dtree-disabled") == "true") {
+ $div.attr("dtree-disabled", "false");
+ $i.attr("dtree-disabled", "false");
+ $i.removeClass(NAV_DIS);
+ $cite.attr("dtree-disabled", "false");
+ $cite.removeClass(NAV_DIS);
+ }
+ }
+ };
+
+ // 获取指定disabled节点的值
+ DTree.prototype.getDisabledNodesParam = function(disabledIds){
+ var _this = this;
+ var disabledId = disabledIds.split(",");
+ var disabledNodes = [];
+ for (var i=0; i<disabledId.length; i++) {
+ var $div = _this.getNodeDom(disabledId[i]).div();
+ if($div != null && $div.attr("dtree-disabled") == "true") {
+ disabledNodes.push(_this.getRequestParam(_this.getTempNodeParam($div)));
+ }
+ }
+ return disabledNodes;
+ };
+
+ // 获取全部disabled节点的值
+ DTree.prototype.getAllDisabledNodesParam = function(){
+ var _this = this;
+ var disabledNodes = [];
+ _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='true']").each(function(){
+ var $div = $(this);
+ disabledNodes.push(_this.getRequestParam(_this.getTempNodeParam($div)));
+ });
+ return disabledNodes;
+ };
+
+ // 设置节点为hide
+ DTree.prototype.setHideNodes = function(hideIds){
+ var _this = this;
+ var hideId = hideIds.split(",");
+ for (var i=0; i<hideId.length; i++) {
+ var $div = _this.getNodeDom(hideId[i]).div();
+ var $li = $div.parent("li[dtree-hide]");
+ if($div != null && $div.attr("dtree-hide") != "true") {
+ $div.attr("dtree-hide", "true");
+ $li.attr("dtree-hide", "true");
+ $li.addClass(NAV_HIDE);
+ }
+ }
+ };
+ // 将节点的hide取消
+ DTree.prototype.cancelHideNodes = function(hideIds){
+ var _this = this;
+ var hideId = hideIds.split(",");
+ for (var i=0; i<hideId.length; i++) {
+ var $div = _this.getNodeDom(hideId[i]).div();
+ var $li = $div.parent("li[dtree-hide]");
+ if($div != null && $div.attr("dtree-hide") == "true") {
+ $div.attr("dtree-hide", "false");
+ $li.attr("dtree-hide", "false");
+ $li.removeClass(NAV_HIDE);
+ }
+ }
+ };
+
+ // 获取指定hide节点的值
+ DTree.prototype.getHideNodesParam = function(hideIds){
+ var _this = this;
+ var hideId = hideIds.split(",");
+ var hideNodes = [];
+ for (var i=0; i<hideId.length; i++) {
+ var $div = _this.getNodeDom(hideId[i]).div();
+ if($div != null && $div.attr("dtree-hide") == "true") {
+ hideNodes.push(_this.getRequestParam(_this.getTempNodeParam($div)));
+ }
+ }
+ return hideNodes;
+ };
+
+ // 获取全部hide节点的值
+ DTree.prototype.getAllHideNodesParam = function(){
+ var _this = this;
+ var hideNodes = [];
+ _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][dtree-hide='true']").each(function(){
+ var $div = $(this);
+ hideNodes.push(_this.getRequestParam(_this.getTempNodeParam($div)));
+ });
+ return hideNodes;
+ };
+
+ // 刷新树
+ DTree.prototype.refreshTree = function(){
+ var _this = this;
+ _this.obj.html(""); // 清空树结构
+ _this.initNodeParam(); // 清空参数
+ _this.init(); //执行初始化方法
+ }
+
+ // 局部刷新树--新增子节点时
+ DTree.prototype.partialRefreshAdd = function($div, data){
+ var _this = this;
+ $ul = $div.next("ul");
+
+ // 判断当前点击的节点是否是最后一级节点,如果是,则需要修改节点的样式
+ var $icon_i = $div.find("i[data-spread]");
+ if ($icon_i.eq(0).attr("data-spread") == "last") {
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).openWithLeaf();
+ } else { //如果不是,也要修改节点样式
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).open();
+ }
+ $ul.addClass(NAV_SHOW); //展开UL
+ _this.accordionUL($ul);
+
+ if(data) {
+ if(data.length && data.length > 0) {
+ _this.getChild($div, data);
+ } else {
+ var parseData = _this.parseData(data);
+
+ if(parseData.treeId()){
+ var level = parseInt($div.parent("li").attr("data-index"))+1;
+ $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(0), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), "item"));
+
+ // 建造完毕后,选中该DIV
+ $thisDiv = $ul.find("div[data-id='"+parseData.treeId()+"']");
+ _this.setNodeParam($thisDiv);
+
+ _this.showLine($ul.find("li"));
+ } else {
+ layer.msg("添加失败,节点ID为undefined!",{icon:5});
+ // 重新赋值
+ _this.setNodeParam($div);
+ }
+ }
+ } else {
+ _this.getChild($div);
+ }
+ }
+
+ // 局部刷新树--编辑当前节点选中节点时
+ DTree.prototype.partialRefreshEdit = function($div, data){
+ var _this = this;
+ $ul = $div.next("ul");
+
+ if(data) {
+ if(typeof data === 'object') {
+ var parseData = _this.parseData(data);
+
+ if(parseData.treeId()){
+ var replaceDom = _this.replaceDom($div, parseData.treeId(), parseData.last(0), parseData.spread(), parseData.disabled(), parseData.hide());
+ replaceDom.node(parseData.iconClass());
+ replaceDom.checkbox(parseData.checkArr());
+ replaceDom.text(parseData.title());
+ replaceDom.ul();
+ replaceDom.basicData(parseData.basicData());
+ replaceDom.recordData(parseData.recordData());
+ _this.setNodeParam($div);
+ } else {
+ layer.msg("编辑失败,节点ID为undefined!",{icon:5});
+ // 重新赋值
+ _this.setNodeParam($div);
+ }
+ } else {
+ _this.getNodeDom($div).cite().html(data);
+ }
+ }
+ }
+
+ // 局部刷新树--当前节点选中被删除时
+ DTree.prototype.partialRefreshDel = function($div){
+ var _this = this;
+ $p_li = $div.parent("li");
+ $p_ul = _this.getNodeDom($div).parentUl();
+ $p_div = _this.getNodeDom($div).parentDiv();
+
+ $p_li.remove();
+ _this.showLine($p_ul.find("li"));
+ // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式
+ if($p_ul.children("li").length == 0){
+ var $icon_i = $p_div.find("i[data-spread]");
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).closeWithLeaf();
+ }
+ _this.initNodeParam();
+ }
+
+ /******************** 复选框区域 ********************/
+ // 初始化复选框的值
+ DTree.prototype.chooseDataInit = function(chooseIds){
+ var _this = this;
+ var chooseId = chooseIds.split(",");
+ for (var i=0; i<chooseId.length; i++) {
+ _this.obj.find("i[dtree-click='"+eventName.checkNodeClick+"']").each(function(){
+ if ($(this).attr("data-id") == chooseId[i]) {
+ _this.checkStatus($(this)).check();
+ }
+ });
+ }
+ // 展开选中节点的父节点
+ var $li_parents = _this.obj.find("i[dtree-click='"+eventName.checkNodeClick+"'][data-checked='1']").parents("."+LI_NAV_ITEM);
+ $li_parents.children("ul").addClass(NAV_SHOW);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.fnode.node.close)).addClass(_this.usefontStyle.fnode.node.open);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.fnode.node.close)).removeClass(_this.usefontStyle.fnode.node.close);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.snode.node.close)).addClass(_this.usefontStyle.snode.node.open);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.snode.node.close)).removeClass(_this.usefontStyle.snode.node.close);
+ return _this.getCheckbarNodesParam();
+ };
+
+ //实现复选框点击,子集选中父级也选中
+ DTree.prototype.checkAllOrNot = function($i) {
+ var _this = this;
+ //$i 当前点击的checkbox
+ var dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ if ($i.attr("data-checked") == "1") {
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).noCheck();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).noCheck();
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var flag = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
+ if (flag == 0) {
+ //把父级去掉选中
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($item_i).noCheck();
+ }
+ }
+ } else {
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).check();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).check();
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ //把父级选中
+ _this.checkStatus($item_i).check();
+ }
+ }
+ };
+
+ //实现复选框点击, no-all 子集选中父级半选中,子集全选父级选中
+ DTree.prototype.checkAllOrNoallOrNot = function($i) {
+ var _this = this;
+ //$i 当前点击的checkbox
+ var $div = $i.closest("."+LI_DIV_ITEM),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).noCheck();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).noCheck();
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var flag = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ if (flag == 0) {
+ //把父级去掉选中
+ _this.checkStatus($item_i).noCheck();
+ } else {
+ //把父级半选
+ _this.checkStatus($item_i).noallCheck();
+ }
+ }
+ } else { //当前复选框为未选中状态,点击后变为选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).check();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).check();
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var flag1 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
+ var flag2 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']").length;
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ if (flag1 != flag2) {
+ // 父级复选框半选
+ _this.checkStatus($item_i).noallCheck();
+ } else {
+ // 父级复选框全选
+ _this.checkStatus($item_i).check();
+ }
+ }
+ }
+ };
+
+ //实现复选框点击,p-casc:父级选中子集全选,子集无法改变父级选中状态
+ DTree.prototype.checkAllOrPcascOrNot = function($i) {
+ var _this = this;
+ //$i 当前点击的checkbox
+ var $div = $i.closest("."+LI_DIV_ITEM),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).noCheck();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).noCheck();
+
+ } else { //当前复选框为未选中状态,点击后变为选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).check();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).check();
+ }
+ };
+
+ //实现复选框点击,self:各自选中互不影响
+ DTree.prototype.checkOrNot = function($i) {
+ var _this = this;
+ //$i 当前点击的checkbox
+ var $div = $i.closest("."+LI_DIV_ITEM),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).noCheck();
+ } else { //当前复选框为未选中状态,点击后变为选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).check();
+ }
+ };
+
+ //实现复选框点击,only:只能选中1个复选框
+ DTree.prototype.checkOnly = function($i) {
+ var _this = this;
+ //$i 当前点击的checkbox
+ var $div = $i.closest("."+LI_DIV_ITEM),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ var checked = $i.attr("data-checked");
+ // 将全部节点全部设为未选中状态
+ var $all_i = _this.obj.find("i[data-checked]");
+ _this.checkStatus($all_i).noCheck();
+
+ if (checked != "1") { //当前复选框为未选中状态,点击后变为选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).check();
+ }
+ };
+
+ //实现复选框点击
+ DTree.prototype.changeCheck = function($i) {
+ var _this = this;
+ var temp = _this.temp;
+ if(typeof $i === 'undefined') {
+ $i = temp[0];
+ }
+ // 复选框选中事件
+ if (_this.checkbarType == "all") {
+ _this.checkAllOrNot($i);
+ } else if(_this.checkbarType == "no-all") {
+ _this.checkAllOrNoallOrNot($i);
+ } else if(_this.checkbarType == "p-casc") {
+ _this.checkAllOrPcascOrNot($i);
+ } else if(_this.checkbarType == "self") {
+ _this.checkOrNot($i);
+ } else if(_this.checkbarType == "only") {
+ _this.checkOnly($i);
+ } else {
+ _this.checkAllOrNot($i);
+ }
+
+ // 获取复选框选中节点的内容
+ var checkbarNodes = _this.setAndGetCheckbarNodesParam();
+
+ // 用户自定义想做的事情
+ _this.checkbarFun.chooseDone(checkbarNodes);
+ layui.event.call(this, MOD_NAME, "chooseDone("+$(_this.obj)[0].id+")", {"checkbarParams": checkbarNodes});
+ _this.temp = [];
+ };
+
+ //复选框半选状态初始化设置
+ DTree.prototype.initNoAllCheck = function(){
+ var _this = this;
+ //1.获取所有选中节点
+ var $is = _this.obj.find("i[data-checked='1']");
+ if($is.length > 0){
+ for ( var key = 0; key < $is.length; key++) {
+ var $i = $($is[key]),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var flag1 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
+ var flag2 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']").length;
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ if (flag1 != flag2) {
+ // 父级复选框半选
+ _this.checkStatus($item_i).noallCheck();
+ } else {
+ // 父级复选框全选
+ _this.checkStatus($item_i).check();
+ }
+ }
+ }
+ }
+ };
+
+ //复选框选中状态初始化设置
+ DTree.prototype.initAllCheck = function(){
+ var _this = this;
+ //1.获取所有选中节点
+ var $is = _this.obj.find("i[data-checked='1']");
+ if($is.length > 0){
+ for ( var key = 0; key < $is.length; key++) {
+ var $i = $($is[key]),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ // 父级复选框全选
+ _this.checkStatus($item_i).check();
+ }
+ }
+ }
+ };
+
+ // 设置复选框选中/未选中/半选 _this.checkStatus($i).check(); _this.checkStatus($i).noCheck(); _this.checkStatus($i).noallCheck();
+ DTree.prototype.checkStatus = function($i) {
+ var _this = this;
+ return {
+ check: function(){
+ $i.removeClass(_this.usefontStyle.checkbox.out);
+ $i.removeClass(_this.usefontStyle.checkbox.noall);
+ $i.addClass(_this.usefontStyle.checkbox.on);
+ $i.addClass(_this.style.chs);
+ $i.attr("data-checked","1");
+ },
+ noCheck: function(){
+ $i.removeClass(_this.usefontStyle.checkbox.noall);
+ $i.removeClass(_this.usefontStyle.checkbox.on);
+ $i.removeClass(_this.style.chs);
+ $i.addClass(_this.usefontStyle.checkbox.out);
+ $i.attr("data-checked","0");
+ },
+ noallCheck: function(){
+ $i.removeClass(_this.usefontStyle.checkbox.out);
+ $i.removeClass(_this.usefontStyle.checkbox.on);
+ $i.addClass(_this.usefontStyle.checkbox.noall);
+ $i.addClass(_this.style.chs);
+ $i.attr("data-checked","2");
+ }
+ }
+ };
+
+ // 设置树的复选框操作值的全部参数,并获取
+ DTree.prototype.setAndGetCheckbarNodesParam = function() {
+ var _this = this;
+ //操作前先清空
+ _this.checkbarNode = [];
+ // 选择所有复选框节点
+ if (_this.checkbarData == "change"){ //记录变更数据
+ _this.obj.find("i[data-par][dtree-disabled='false']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+ if ($i.attr("data-checked") != $i.attr("data-initchecked")) {
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ }
+ });
+ } else if (_this.checkbarData == "all"){ //记录全部数据
+ _this.obj.find("i[data-par][data-checked][dtree-disabled='false']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ });
+ } else if (_this.checkbarData == "choose"){ //记录选中数据
+ _this.obj.find("i[data-par][data-checked='1'][dtree-disabled='false']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ });
+ } else if (_this.checkbarData == "halfChoose"){ //记录选中和半选数据
+ _this.obj.find("i[data-par][data-checked='1'][dtree-disabled='false']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ });
+ _this.obj.find("i[data-par][data-checked='2'][dtree-disabled='false']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ });
+ }
+ return _this.checkbarNode;
+ };
+
+ // 获取树的复选框操作值的全部参数
+ DTree.prototype.getCheckbarNodesParam = function() {
+ var _this = this;
+ return _this.setAndGetCheckbarNodesParam();
+ };
+
+ // 获取树的一个复选框的参数
+ DTree.prototype.getCheckbarNodeParam = function($div, $i){
+ var _this = this;
+ var temp_node = {};
+ temp_node.nodeId = $div.attr("data-id");
+ temp_node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid");
+ temp_node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text();
+ temp_node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false;
+ temp_node.level = _this.getNodeDom($div).parentLi().attr("data-index");
+ temp_node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false;
+ temp_node.basicData = $div.attr("data-basic")
+ temp_node.recordData = $div.attr("data-record");
+ temp_node.dataType = $i.attr("data-type");
+ temp_node.checked = $i.attr("data-checked");
+ temp_node.initchecked = $i.attr("data-initchecked");
+ return temp_node;
+ };
+
+ //判断复选框是否发生变更
+ DTree.prototype.changeCheckbarNodes = function(){
+ var flag = false;
+ var _this = this;
+ _this.obj.find("i[data-par]").each(function(){
+ var $i = $(this);
+ $div = $i.closest("."+LI_DIV_ITEM);
+
+ if ($i.attr("data-checked") != $i.attr("data-initchecked")) {
+ flag = true;
+ return true;
+ }
+ });
+ return flag;
+ };
+
+ /******************** 工具栏及菜单栏区域 ********************/
+ // 初始化菜单栏和工具栏的div
+ DTree.prototype.initTreePlus = function(){
+ var _this = this;
+ // 初始化菜单栏和工具栏的div
+ _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).remove();
+ _this.toolbarMenu = {};
+ if(_this.menubar && _this.menubarTips.group && _this.menubarTips.group.length > 0) _this.obj.before("<div class='"+LI_DIV_MENUBAR+"' id='dtree_menubar_"+_this.obj[0].id+"'><div class='layui-btn-group'></div></div>");
+ if(_this.toolbar){
+ if(_this.toolbarWay == "contextmenu") {
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).remove();
+ _this.obj.before("<div class='"+LI_DIV_TOOLBAR+" layui-nav' id='dtree_toolbar_"+_this.obj[0].id+"'><div class='layui-nav-item'><dl class='layui-nav-child layui-anim'></dl></div></div>");
+ }
+ }
+
+ };
+
+ // 开启工具栏和菜单栏
+ DTree.prototype.openTreePlus = function(){
+ var _this = this;
+ // 先对工具栏做处理,因为菜单栏可能会与工具栏产生关联。
+ var ggMenu = [];
+ if(_this.toolbar) _this.getToolbarDom();
+
+ if(_this.menubar) {
+ var menubarTips = _this.menubarTips,
+ mtbar = menubarTips.toolbar,
+ group = menubarTips.group,
+ freedom = menubarTips.freedom;
+ if(mtbar && mtbar.length > 0){
+ // 菜单栏吸附工具栏上
+ for(var i=0; i<mtbar.length; i++){
+ var mt = mtbar[i];
+ if(typeof mt === 'string'){
+ _this.getMenubarToolDom(mt);
+ }
+ if(typeof mt === 'object'){
+ _this.getExtMenubarToolDom(mt);
+ }
+ }
+ }
+ if(group && group.length > 0){
+ // 菜单栏吸附在上方的按钮组div中
+ for(var i=0; i<group.length; i++){
+ var gg = group[i];
+ if(typeof gg === 'string'){
+ ggMenu.push(_this.getMenubarDom(gg));
+ }
+ if(typeof gg === 'object'){
+ ggMenu.push(_this.getExtMenubarDom(gg));
+ }
+ }
+ _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).children('div.layui-btn-group').append(ggMenu.join(""));
+
+ }
+ }
+ };
+
+
+ /******************** 菜单栏区域 ********************/
+ // 获取菜单栏
+ DTree.prototype.getMenubarDom = function(menu){
+ var _this = this;
+ var rootId = _this.obj[0].id;
+ var gg = "";
+ switch (menu) {
+ case defaultMenu.moveDown:
+ gg = "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.moveDown+"' title='展开全部节点'><i class='"+_this.usefontStyle.menubar.movedown+"'></i></button>";
+ break;
+ case defaultMenu.moveUp:
+ gg = "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.moveUp+"' title='收缩全部节点'><i class='"+_this.usefontStyle.menubar.moveup+"'></i></button>";
+ break;
+ case defaultMenu.refresh:
+ gg = "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.refresh+"' title='刷新'><i class='"+_this.usefontStyle.menubar.refresh+"'></i></button>";
+ break;
+ case defaultMenu.checkAll:
+ gg = (_this.checkbar && _this.checkbarType != 'only') ? "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.checkAll+"' title='全选节点'><i class='"+_this.usefontStyle.menubar.checkAll+"'></i></button>" : "";
+ break;
+ case defaultMenu.unCheckAll:
+ gg = (_this.checkbar && _this.checkbarType != 'only') ? "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.unCheckAll+"' title='全不选节点'><i class='"+_this.usefontStyle.menubar.unCheckAll+"'></i></button>" : "";
+ break;
+ case defaultMenu.invertAll:
+ gg = (_this.checkbar && _this.checkbarType != 'only') ? "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.invertAll+"' title='反选节点'><i class='"+_this.usefontStyle.menubar.invertAll+"'></i></button>" : "";
+ break;
+ case defaultMenu.remove:
+ gg = (_this.checkbar) ? "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.remove+"' title='删除选中节点'><i class='"+_this.usefontStyle.menubar.remove+"'></i></button>" : "";
+ break;
+ case defaultMenu.searchNode:
+ gg = "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.searchNode+"' title='查询节点'><i class='"+_this.usefontStyle.menubar.search+"'></i></button>";
+ break;
+ }
+ return gg;
+ };
+
+ // 获取扩展菜单栏
+ DTree.prototype.getExtMenubarDom = function(menu){
+ var _this = this;
+ return "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+_this.obj[0].id+"' d-menu='"+menu.menubarId+"' title='"+menu.title+"'><i class='"+_this.usefontStyle.menubarExt+" "+menu.icon+"'></i></button>";
+ };
+
+ // 获取依附在工具栏的菜单栏
+ DTree.prototype.getMenubarToolDom = function(menu){
+ var _this = this;
+ var rootId = _this.obj[0].id;
+ switch (menu) {
+ case defaultMenu.moveDown:
+ _this.toolbarMenu[defaultMenu.moveDown] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.moveDown, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.movedown, "展开全部");
+ break;
+ case defaultMenu.moveUp:
+ _this.toolbarMenu[defaultMenu.moveUp] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.moveUp, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.moveup, "收缩全部");
+ break;
+ case defaultMenu.refresh:
+ _this.toolbarMenu[defaultMenu.refresh] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.refresh, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.refresh, "刷新");
+ break;
+ case defaultMenu.checkAll:
+ if(_this.checkbar && _this.checkbarType != 'only')
+ _this.toolbarMenu[defaultMenu.checkAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.checkAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.checkAll, "全选节点");
+ break;
+ case defaultMenu.unCheckAll:
+ if(_this.checkbar && _this.checkbarType != 'only')
+ _this.toolbarMenu[defaultMenu.unCheckAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.unCheckAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.unCheckAll, "全不选节点");
+ break;
+ case defaultMenu.invertAll:
+ if(_this.checkbar && _this.checkbarType != 'only')
+ _this.toolbarMenu[defaultMenu.invertAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.invertAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.invertAll, "反选节点");
+ break;
+ case defaultMenu.remove:
+ if(_this.checkbar)
+ _this.toolbarMenu[defaultMenu.remove] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.remove, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.remove, "删除选中");
+ break;
+ case defaultMenu.searchNode:
+ _this.toolbarMenu[defaultMenu.searchNode] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.searchNode, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.searchNode, "查询");
+ break;
+ }
+ };
+
+ // 获取依附在工具栏的扩展菜单栏
+ DTree.prototype.getExtMenubarToolDom = function(menu){
+ var _this = this;
+ _this.toolbarMenu[menu.menubarId] = _this.setToolbarDom().setMenuToolbarOption(menu.menubarId, menu.title, _this.usefontStyle.toolbar.menubarExt+" "+menu.icon, "");
+ };
+
+ // menubar内置方法
+ DTree.prototype.menubarMethod = function(){
+ var _this = this;
+ return {
+ openAllNode: function(obj){ // 展开所有节点
+ var $ulNode = obj || _this.obj.children("li").children("ul");
+ // 遍历所有ul子节点
+ for (var i = 0; i < $ulNode.length; i++) {
+ // 获取当前节点的信息
+ var $ul = $($ulNode[i]),
+ $div = $ul.prev("div"),
+ $i_spread = _this.getNodeDom($div).fnode(),
+ $i_node = _this.getNodeDom($div).snode(),
+ $cite = _this.getNodeDom($div).cite(),
+ spread = $i_spread.attr("data-spread"),
+ leaf = $cite.attr("data-leaf");
+
+ if (leaf == "leaf") { continue; } // 说明是叶子了,则继续循环下一个
+
+ if (spread == "open") {
+ // 说明该节点已经展开了,则进行子节点循环
+ } else {
+ if (_this.type=="load") { //是否全量加载
+ if (_this.cache) { //是否开启缓存
+ if ($ul.html()) {
+ $ul.addClass(NAV_SHOW);
+ } else { //加载节点
+ _this.getChild($div);
+ }
+ }else { //每次取新的数据
+ $ul.html("");
+ _this.getChild($div);
+ }
+ } else { // 全量加载
+ $ul.addClass(NAV_SHOW);
+ }
+ _this.operateIcon($i_spread, $i_node).open();
+
+ }
+ var $childUl = $ul.children("li").children("ul");
+ _this.menubarMethod().openAllNode($childUl);
+ }
+ },
+ closeAllNode: function(){ //收缩所有节点
+ _this.obj.find("."+LI_NAV_CHILD).each(function(){
+ // 获取当前节点的信息
+ var $ul = $(this),
+ $div = $ul.prev("div"),
+ $i_spread = _this.getNodeDom($div).fnode(),
+ $i_node = _this.getNodeDom($div).snode(),
+ $cite = _this.getNodeDom($div).cite(),
+ spread = $i_spread.attr("data-spread"),
+ leaf = $cite.attr("data-leaf");
+
+ $ul.removeClass(NAV_SHOW);
+ _this.operateIcon($i_spread, $i_node).close();
+ });
+ },
+ refreshTree: function(){// 刷新树
+ _this.refreshTree();
+ },
+ checkAll: function(){ // 全选节点
+ var $i = _this.obj.find("i[data-par][data-checked!='1']");
+ if($i.length > 0) { _this.checkStatus($i).check(); }
+ },
+ unCheckAll: function(){ // 全不选节点
+ var $i = _this.obj.find("i[data-par][data-checked!='0']");
+ if($i.length > 0) { _this.checkStatus($i).noCheck(); }
+ },
+ invertAll: function(){ // 反选节点
+ if(_this.obj.find("i[data-par]").length > 0) {
+ var b = false;
+ _this.obj.find("i[data-par]").each(function(){
+ var $i = $(this);
+ if($i.attr("data-checked") == '2'){
+ b = true;
+ }else if($i.attr("data-checked") == '0') {
+ _this.checkStatus($i).check();
+ }else if($i.attr("data-checked") == '1') {
+ _this.checkStatus($i).noCheck();
+ }
+ });
+
+ if(b) {
+ _this.initNoAllCheck();
+ } else {
+ _this.initAllCheck();
+ }
+ }
+ },
+ remove: function(){// 删除选中节点
+ var len = _this.obj.find("i[data-par][data-checked='1']").length;
+ if(len == 0){
+ layer.msg("请至少选中一个节点",{icon:2});
+ }else{
+ //操作前先清空
+ _this.checkbarNode = [];
+ // 选择所有复选框节点
+ var i_node = {};
+ _this.obj.find("i[data-par][data-checked='1']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ });
+
+ layer.confirm('确定要删除选中节点?', {icon: 3, title:'删除选中节点'}, function(index1){
+ var flag = _this.menubarFun.remove(_this.checkbarNode);
+ if(flag){
+ _this.obj.find("i[data-par][data-checked='1']").closest("."+LI_DIV_ITEM).next("ul").remove();
+ _this.obj.find("i[data-par][data-checked='1']").closest("."+LI_DIV_ITEM).remove();
+ _this.checkbarNode=[];
+ }
+
+ layer.close(index1);
+ });
+ }
+ },
+ searchNode: function(){//模糊查询该值,展开该值节点
+ layer.prompt({
+ formType: 0,
+ value: "",
+ title: '查询节点'
+ }, function(value, index1, elem){
+ if (value) {
+ var flag = _this.searchNode(value);
+ if (!flag) {
+ layer.msg("该名称节点不存在!", {icon:5});
+ }
+ } else {
+ layer.msg("未指定查询节点名称", {icon:5});
+ }
+ layer.close(index1);
+ });
+ },
+ extMethod: function(menuId, $div, flag){
+ if(_this.menubar && _this.menubarTips.group && _this.menubarTips.group.length > 0 && flag == "group"){
+ for(var i=0; i<_this.menubarTips.group.length; i++){
+ var ext = _this.menubarTips.group[i];
+ if (menuId == ext.menubarId){
+ ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div));
+ break;
+ }
+ }
+ }
+ if(_this.menubar && _this.menubarTips.toolbar && _this.menubarTips.toolbar.length > 0 && flag == "toolbar"){
+ for(var i=0; i<_this.menubarTips.toolbar.length; i++){
+ var ext = _this.menubarTips.toolbar[i];
+ if (menuId == ext.menubarId){
+ ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div));
+ break;
+ }
+ }
+ }
+ if(_this.menubar && _this.menubarTips.freedom && _this.menubarTips.freedom.length > 0 && flag == "freedom"){
+ for(var i=0; i<_this.menubarTips.freedom.length; i++){
+ var ext = _this.menubarTips.freedom[i];
+ if (menuId == ext.menubarId){
+ ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div));
+ break;
+ }
+ }
+ }
+ }
+ };
+ };
+
+ // menubar监听方法
+ DTree.prototype.menubarListener = function(menuId, flag){
+ var _this = this;
+ var $div = _this.getNodeDom().nowDiv();
+ switch (menuId) {
+ case defaultMenu.moveDown: // 展开全部节点
+ _this.menubarMethod().openAllNode();
+ break;
+ case defaultMenu.moveUp: // 收缩全部节点
+ _this.menubarMethod().closeAllNode();
+ break;
+ case defaultMenu.refresh:
+ _this.menubarMethod().refreshTree(); // 刷新树
+ break;
+ case defaultMenu.checkAll:
+ _this.menubarMethod().checkAll();
+ break;
+ case defaultMenu.unCheckAll:
+ _this.menubarMethod().unCheckAll();
+ break;
+ case defaultMenu.invertAll:
+ _this.menubarMethod().invertAll();
+ break;
+ case defaultMenu.remove:
+ _this.menubarMethod().remove();
+ break;
+ case defaultMenu.searchNode:
+ _this.menubarMethod().searchNode();
+ break;
+ default:
+ _this.menubarMethod().extMethod(menuId, $div, flag);
+ break;
+ }
+ };
+
+ //模糊查询该值,展开该值节点
+ DTree.prototype.searchNode = function(value){
+ var _this = this;
+ var b = false;
+ var $lis = [];
+ _this.obj.find("cite[data-leaf]").each(function(){
+ var $nthis = $(this);
+ var html = $nthis.html();
+ if(html.indexOf(value) > -1){
+ if($nthis.attr("data-leaf") == "leaf") {
+ // 叶子节点提供包含父节点的所有信息
+ var title = "";
+ $nthis.parents("li").each(function(){
+ title = "-" + $(this).find("cite[data-leaf]").html() + title;
+ });
+ title = title.substring(1, title.length);
+ $nthis.attr("title", title);
+ }
+ // 保存当前cite所在的li及父li中包含该值,则只保留父的
+ var i = 0;
+ $nthis.parents("li").each(function(){
+ var html2 = $(this).find("cite[data-leaf]").html();
+ if(html2.indexOf(value) > -1){
+ i++;
+ }
+ if(i >= 2){
+ return true;
+ }
+ });
+ if (i < 2){
+ $lis.push($nthis.closest("li").prop("outerHTML"));
+ }
+ }
+ });
+ if($lis.length > 0) {
+ b = true;
+ // 1.将树节点清空
+ _this.obj.html("");
+ // 2.遍历所有cite节点,展开当前cite节点
+ for(var i=0; i<$lis.length; i++){
+ _this.obj.append($lis[i]);
+ }
+ }
+ return b;
+ };
+
+
+ /******************** 工具栏区域 ********************/
+ // 获取工具栏
+ DTree.prototype.getToolbarDom = function(){
+ var _this = this;
+ var toolbarShow = _this.toolbarShow,
+ toolbarExt = _this.toolbarExt,
+ toolbarWay = _this.toolbarWay;
+
+ if(toolbarShow.length > 0){
+ for(var i=0; i<toolbarShow.length; i++){
+ var show = toolbarShow[i];
+ if(show == "pulldown"){
+ _this.toolbarMenu[defaultTool.pulldown] = _this.setToolbarDom().setToolbarOption(defaultTool.pulldown, _this.toolbarStyle.title, _this.usefontStyle.toolbar.pulldown, "展开");
+ }
+ if(show == "pullup"){
+ _this.toolbarMenu[defaultTool.pullup] = _this.setToolbarDom().setToolbarOption(defaultTool.pullup, _this.toolbarStyle.title, _this.usefontStyle.toolbar.pullup, "收缩");
+ }
+ if(show == "add"){
+ _this.toolbarMenu[defaultTool.addTool] = _this.setToolbarDom().setToolbarOption(defaultTool.addTool, _this.toolbarStyle.title, _this.usefontStyle.toolbar.add, "新增");
+ }
+ if(show == "edit"){
+ _this.toolbarMenu[defaultTool.editTool] = _this.setToolbarDom().setToolbarOption(defaultTool.editTool, _this.toolbarStyle.title, _this.usefontStyle.toolbar.edit, "编辑");
+ }
+ if(show == "delete"){
+ _this.toolbarMenu[defaultTool.delTool] = _this.setToolbarDom().setToolbarOption(defaultTool.delTool, _this.toolbarStyle.title, _this.usefontStyle.toolbar.del, "删除");
+ }
+ }
+ }
+ if(toolbarExt.length > 0){
+ for(var i=0; i<toolbarExt.length; i++){
+ var ext = toolbarExt[i];
+ _this.toolbarMenu[ext.toolbarId] = _this.setToolbarDom().setToolbarOption(ext.toolbarId, ext.title, _this.usefontStyle.toolbarExt+" "+ext.icon, "");
+ }
+ }
+ };
+
+ // 设置工具栏按钮
+ DTree.prototype.setToolbarDom = function(){
+ var _this = this;
+ var toolbarWay = _this.toolbarWay;
+
+ return {
+ setToolbarOption: function(toolbarId, title, classId, other){
+ if(toolbarWay == "contextmenu") {
+ return "<dd><a dtree-tool='"+toolbarId+"'><i class='"+classId+"'></i> "+other +title+"</a></dd>";
+ } else if(toolbarWay == "fixed" || toolbarWay == "follow") {
+ return "<a dtree-tool='"+toolbarId+"' title='"+other + title+"'><i class='"+classId+"'></i></a>";
+ }
+ },
+ setMenuToolbarOption: function(menubarId, title, classId, other){
+ var rootId = _this.obj[0].id;
+ if(toolbarWay == "contextmenu") {
+ return "<dd><a dtree-id='"+rootId+"' d-menu='"+menubarId+"'><i class='"+classId+"'></i> "+other +title+"</a></dd>";
+ } else if(toolbarWay == "fixed" || toolbarWay == "follow") {
+ return "<a dtree-id='"+rootId+"' d-menu='"+menubarId+"' title='"+other + title+"'><i class='"+classId+"'></i></a>";
+ }
+ },
+ setToolbarPlace: function(toolbarMenu){
+ if(toolbarWay == "contextmenu") {
+ if(toolbarMenu){
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).find('div.layui-nav-item>dl.layui-nav-child').html("");
+ for(var key in toolbarMenu){
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).find('div.layui-nav-item>dl.layui-nav-child').append(toolbarMenu[key]);
+ }
+ }
+ } else if(toolbarWay == "fixed" || toolbarWay == "follow") {
+ _this.obj.find("cite[data-leaf][dtree-disabled='false']").each(function(){
+ var $cite = $(this);
+ _this.dynamicToolbarDom($cite);
+ });
+ }
+ }
+ }
+ };
+
+ // 在节点后动态绑定fixed和follow条件的工具栏
+ DTree.prototype.dynamicToolbarDom = function($cite){
+ var _this = this;
+ var toolbarWay = _this.toolbarWay;
+ if($cite.next("em."+TOOLBAR_TOOL_EM).length == 0) {
+ var $div = $cite.parent("div");
+ var param = _this.getRequestParam(_this.getTempNodeParam($div));
+ var toolbarMenus = _this.toolbarFun.loadToolbarBefore(event.cloneObj(_this.toolbarMenu), param, $div);
+ var hideCls = (toolbarWay == "follow") ? NAV_HIDE : "";
+ var em = ["<em class='"+TOOLBAR_TOOL_EM+" "+hideCls+"'>"];
+ if(toolbarMenus){
+ for(var key in toolbarMenus){
+ em.push(toolbarMenus[key]);
+ }
+ }
+ em.push("</em>");
+ $cite.after(em.join(''));
+ }
+ }
+
+ // 隐藏toolbar
+ DTree.prototype.toolbarHide = function() {
+ var _this = this;
+ if(_this.toolbar && _this.toolbarWay == "contextmenu") {
+ var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
+ $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
+ }
+ }
+
+ // toolbar内置方法
+ DTree.prototype.toolbarMethod = function(){
+ var _this = this;
+ return {
+ pulldown: function(obj){ // 展开当前点击节点的下面全部节点
+ if(!obj) return;
+ var $ulNode = obj;
+ // 遍历所有ul子节点
+ for (var i = 0; i < $ulNode.length; i++) {
+ // 获取当前节点的信息
+ var $ul = $($ulNode[i]),
+ $div = $ul.prev("div"),
+ $i_spread = _this.getNodeDom($div).fnode(),
+ $i_node = _this.getNodeDom($div).snode(),
+ $cite = _this.getNodeDom($div).cite(),
+ spread = $i_spread.attr("data-spread"),
+ leaf = $cite.attr("data-leaf");
+
+ if (leaf == "leaf") { continue; } // 说明是叶子了,则继续循环下一个
+
+ if (spread == "open") {
+ // 说明该节点已经展开了,则进行子节点循环
+ } else {
+ if (_this.type=="load") { //是否全量加载
+ if (_this.cache) { //是否开启缓存
+ if ($ul.html()) {
+ $ul.addClass(NAV_SHOW);
+ } else { //加载节点
+ _this.getChild($div);
+ }
+ }else { //每次取新的数据
+ $ul.html("");
+ _this.getChild($div);
+ }
+ } else { // 全量加载
+ $ul.addClass(NAV_SHOW);
+ }
+ _this.operateIcon($i_spread, $i_node).open();
+
+ }
+ var $childUl = $ul.children("li").children("ul");
+ _this.toolbarMethod().pulldown($childUl);
+ }
+ },
+ pullup: function($li){ // 收缩当前点击节点的下面全部节点
+ $li.find("."+LI_NAV_CHILD).each(function(){
+ // 获取当前节点的信息
+ var $ul = $(this),
+ $div = $ul.prev("div"),
+ $i_spread = _this.getNodeDom($div).fnode(),
+ $i_node = _this.getNodeDom($div).snode(),
+ $cite = _this.getNodeDom($div).cite(),
+ spread = $i_spread.attr("data-spread"),
+ leaf = $cite.attr("data-leaf");
+
+ $ul.removeClass(NAV_SHOW);
+ _this.operateIcon($i_spread, $i_node).close();
+ });
+ }
+ }
+ };
+
+ // toolbar监听方法
+ DTree.prototype.toolbarListener = function(tool, $div) {
+ var _this = this;
+ var $cite = $div.children("cite[data-leaf]"),
+ $ul = $div.next("ul"),
+ $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点
+ $p_ul = $p_li.parent("ul"), //当前选中节点的顶级li节点的父级ul
+ $p_div = $p_ul.prev("div"), //当前选中节点的顶级li节点的父级ul的前一个div
+ title = $cite.html();
+ switch (tool) {
+ case defaultTool.pulldown:
+ _this.toolbarMethod().pulldown($ul);
+ break;
+ case defaultTool.pullup:
+ _this.toolbarMethod().pullup($p_li);
+ break;
+ case defaultTool.addTool:
+ var content = _this.loadToolBar(title, defaultTool.addTool);
+
+ layer.open({
+ title: "新增"+_this.toolbarStyle.title,
+ type: 1,
+ area: _this.toolbarStyle.area,
+ content: content,
+ success: function(layero, index){
+ form.render();
+ form.on("submit(dtree_addNode_form)",function(data){
+ var data = data.field;
+ var parentId = $div.attr("data-id"),
+ id = $div.attr("data-id")+"_node_"+$ul[0].childNodes.length,
+ leaf = true,
+ checked = "0",
+ level = parseInt($p_li.attr("data-index"))+1;
+
+ // 创建子节点的DOM,添加子节点
+ var checkArr = [];
+ if (_this.checkArrLen > 0) {
+ for (var i = 0; i < _this.checkArrLen; i++) {
+ checkArr.push({"type":i,"checked":"0"});
+ }
+ }
+
+ $ul.append(_this.getLiItemDom(id, parentId, data.addNodeName, data.addNodeName, true, "", "", checkArr, level, false, false, false, "", "", "item"));
+ // 先将li节点隐藏
+ $ul.find("li[data-id='"+id+"']").hide();
+ // 重新赋值
+ var $addDiv = $ul.find("div[data-id='"+id+"']");
+ node = _this.getNodeParam($addDiv);
+
+ //获取组装后的requestNode,组合参数
+ var requestNode = _this.getRequestParam(node);
+ requestNode = $.extend(requestNode, data);
+
+ _this.temp = [id, $ul, $div, level];
+ // 用户自定义想做的事情
+ _this.toolbarFun.addTreeNode(requestNode, $div);
+
+ layer.close(index);
+ return false;
+ });
+ }
+ });
+ break;
+ case defaultTool.editTool:
+ var content = _this.loadToolBar(title, defaultTool.editTool);
+
+ layer.open({
+ title: "编辑"+_this.toolbarStyle.title,
+ type: 1,
+ area: _this.toolbarStyle.area,
+ content: content,
+ success: function(layero, index){
+ _this.toolbarFun.editTreeLoad(_this.getRequestParam(_this.getNodeParam($div)));
+ form.render();
+ form.on("submit(dtree_editNode_form)",function(data){
+ var data = data.field;
+ $cite.html(data.editNodeName);
+ node = _this.getNodeParam($div);
+ var requestNode = _this.getRequestParam(node);
+ requestNode = $.extend(requestNode, data);
+ _this.temp = [$cite, $div, title, $p_div];
+ _this.toolbarFun.editTreeNode(requestNode, $div);
+
+ layer.close(index);
+ });
+ }
+ });
+ break;
+ case defaultTool.delTool:
+ layer.confirm('确定要删除该'+_this.toolbarStyle.title+'?', {icon: 3, title:'删除'+_this.toolbarStyle.title}, function(index){
+ var node = _this.getNodeParam($div);
+ _this.temp = [$p_li, $p_div];
+ _this.toolbarFun.delTreeNode(_this.getRequestParam(_this.getNodeParam($div)), $div);
+
+ layer.close(index);
+ });
+ break;
+ default:
+ if(_this.toolbarExt.length > 0){
+ for(var i=0; i<_this.toolbarExt.length; i++){
+ var ext = _this.toolbarExt[i];
+ if (tool == ext.toolbarId){
+ ext.handler(_this.getRequestParam(_this.getNodeParam($div)), $div);
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+
+
+ // 加载toolBar中的内容
+ DTree.prototype.loadToolBar = function(title, name){
+ var _this = this;
+ var toolbarShow = _this.toolbarShow;
+ var nodeBarContents = _this.toolbarBtn;
+
+ var html = "";
+ switch (name) {
+ case defaultTool.addTool:
+ var addNodeBarDef = [{"label": "当前选中", "name": "nodeTitle", "type": "text", "value": title, "defElem": "nowChoose", "readonly": true},
+ {"label": "新增"+_this.toolbarStyle.title, "name": "addNodeName", "type": "text", "value": "", "defElem": "nowChange", "verify": "required"},
+ {"type": "submit", "value": "确认添加", "defElem": "btn", "filter": "dtree_addNode_form"}];
+
+ //2. 用户自定义的节点内容
+ var addNodeBar = ['<div class="'+TOOLBAR_TOOL+'"><form class="layui-form layui-form-pane" lay-filter="dtree_addNode_form">'];
+
+ if(nodeBarContents != null && nodeBarContents.length > 0){
+ if(nodeBarContents[0] != null && nodeBarContents[0] != undefined && nodeBarContents[0].length > 0){
+ var addNodeBarContents = nodeBarContents[0];
+ // 1. 检查是否包含了now、newly、btn这三个默认项,将其他元素依次排列,将特殊元素至于栈顶
+ for(var i=0; i<addNodeBarContents.length; i++){
+ var defElem = addNodeBarContents[i].defElem;
+ if(defElem == "nowChoose") {
+ $.extend(addNodeBarDef[0], addNodeBarContents[i]);
+ } else if(defElem == "nowChange") {
+ $.extend(addNodeBarDef[1], addNodeBarContents[i]);
+ } else if(defElem == "btn") {
+ $.extend(addNodeBarDef[2], addNodeBarContents[i]);
+ } else {
+ addNodeBarDef.push(addNodeBarContents[i]);
+ }
+ }
+ }
+ }
+
+ // 2. 遍历生成全部表单标签
+ for(var j=0; j<addNodeBarDef.length; j++){
+ var type = addNodeBarDef[j].type;
+ if(!type){type = "text";}
+ switch (type) {
+ case "text":
+ addNodeBar.push(_this.loadToolBarDetail(addNodeBarDef[j]).text());
+ break;
+ case "textarea":
+ addNodeBar.push(_this.loadToolBarDetail(addNodeBarDef[j]).textarea());
+ break;
+ case "select":
+ addNodeBar.push(_this.loadToolBarDetail(addNodeBarDef[j]).select());
+ break;
+ case "hidden":
+ addNodeBar.push(_this.loadToolBarDetail(addNodeBarDef[j]).hidden());
+ break;
+
+ }
+ }
+
+ var addBtn = ['<div class="layui-form-item">', '<div class="layui-input-block" style="margin-left:0px;text-align:center;">'];
+ // 3.遍历生成按钮
+ for(var j=0; j<addNodeBarDef.length; j++){
+ var type = addNodeBarDef[j].type;
+ if(!type){type = "text";}
+ switch (type) {
+ case "submit":
+ addBtn.push(_this.loadToolBarDetail(addNodeBarDef[j]).submit());
+ break;
+ case "button":
+ addBtn.push(_this.loadToolBarDetail(addNodeBarDef[j]).button());
+ break;
+ case "reset":
+ addBtn.push(_this.loadToolBarDetail(addNodeBarDef[j]).reset());
+ break;
+
+ }
+ }
+ addBtn.push('</div></div>');
+ addNodeBar.push(addBtn.join(''));
+ addNodeBar.push('</form></div>');
+ html = addNodeBar.join('');
+ break;
+
+ case defaultTool.editTool:
+ var editNodeBarDef = [{"label": "当前选中", "name": "nodeTitle", "type": "text", "value": title, "defElem": "nowChoose", "readonly": true},
+ {"label": "编辑"+_this.toolbarStyle.title, "name": "editNodeName", "type": "text", "value": "", "defElem": "nowChange", "verify": "required"},
+ {"type": "submit", "value": "确认编辑", "defElem": "btn", "filter": "dtree_editNode_form"}];
+
+ var editNodeBar = ['<div class="'+TOOLBAR_TOOL+'"><form class="layui-form layui-form-pane" lay-filter="dtree_editNode_form">'];
+ //2. 用户自定义的节点内容
+ if(nodeBarContents != null && nodeBarContents.length > 0){
+
+ if(nodeBarContents[1] != null && nodeBarContents[1] != undefined && nodeBarContents[1].length > 0){
+ var editNodeBarContents = nodeBarContents[1];
+ // 1. 检查是否包含了now、newly、btn这三个默认项,将其他元素依次排列,将特殊元素至于栈顶
+ for(var i=0; i<editNodeBarContents.length; i++){
+ var defElem = editNodeBarContents[i].defElem;
+ if(defElem == "nowChoose") {
+ $.extend(editNodeBarDef[0], editNodeBarContents[i]);
+ } else if(defElem == "nowChange") {
+ $.extend(editNodeBarDef[1], editNodeBarContents[i]);
+ } else if(defElem == "btn") {
+ $.extend(editNodeBarDef[2], editNodeBarContents[i]);
+ } else {
+ editNodeBarDef.push(editNodeBarContents[i]);
+ }
+ }
+
+ }
+ }
+ // 2. 遍历生成全部表单标签
+ for(var j=0; j<editNodeBarDef.length; j++){
+ var type = editNodeBarDef[j].type;
+ if(!type){type = "text";}
+ switch (type) {
+ case "text":
+ editNodeBar.push(_this.loadToolBarDetail(editNodeBarDef[j]).text());
+ break;
+ case "textarea":
+ editNodeBar.push(_this.loadToolBarDetail(editNodeBarDef[j]).textarea());
+ break;
+ case "select":
+ editNodeBar.push(_this.loadToolBarDetail(editNodeBarDef[j]).select());
+ break;
+ case "hidden":
+ editNodeBar.push(_this.loadToolBarDetail(editNodeBarDef[j]).hidden());
+ break;
+ }
+ }
+
+ var editBtn = ['<div class="layui-form-item">', '<div class="layui-input-block" style="margin-left:0px;text-align:center;">'];
+ // 3.遍历生成按钮
+ for(var j=0; j<editNodeBarDef.length; j++){
+ var type = editNodeBarDef[j].type;
+ if(!type){type = "text";}
+ switch (type) {
+ case "submit":
+ editBtn.push(_this.loadToolBarDetail(editNodeBarDef[j]).submit());
+ break;
+ case "button":
+ editBtn.push(_this.loadToolBarDetail(editNodeBarDef[j]).button());
+ break;
+ case "reset":
+ editBtn.push(_this.loadToolBarDetail(editNodeBarDef[j]).reset());
+ break;
+
+ }
+ }
+ editBtn.push('</div></div>');
+ editNodeBar.push(editBtn.join(''));
+ editNodeBar.push('</form></div>');
+ html = editNodeBar.join('');
+ break;
+ }
+ return html;
+ };
+
+ // 获取toolbar详细的标签信息
+ DTree.prototype.loadToolBarDetail = function(nodeBarContents){
+ var _this = this;
+ var readonly = (typeof (nodeBarContents.readonly) === "boolean") ? nodeBarContents.readonly : false;
+ var disabled = (typeof (nodeBarContents.disabled) === "boolean") ? nodeBarContents.disabled : false;
+ var id = nodeBarContents.id ? nodeBarContents.id : "";
+ var name = nodeBarContents.name ? nodeBarContents.name : "";
+ var val = nodeBarContents.value ? nodeBarContents.value : "";
+ var verify = nodeBarContents.verify ? nodeBarContents.verify : "";
+ var placeholder = nodeBarContents.placeholder ? nodeBarContents.placeholder : val;
+ return{
+ text: function(){
+ return ['<div class="layui-form-item">',
+ '<label class="layui-form-label" title="'+nodeBarContents.label+'">'+nodeBarContents.label+':</label>',
+ '<div class="layui-input-block f-input-par">',
+ '<input type="text" class="layui-input f-input" value="'+val+'" placeholder="'+placeholder+'" lay-verify="'+verify+'" ',
+ (id != "" ? 'id="'+id+'" ' : ''),
+ (name != "" ? 'name="'+name+'" ' : ''),
+ (readonly ? 'readonly ' : ''),
+ (disabled ? 'disabled ' : ''),
+ '/>',
+ '</div>',
+ '</div>'].join('');
+ },
+ textarea: function(){
+ return ['<div class="layui-form-item layui-form-text">',
+ '<label class="layui-form-label" title="'+nodeBarContents.label+'">'+nodeBarContents.label+':</label>',
+ '<div class="layui-input-block f-input-par">',
+ '<textarea class="layui-textarea f-input" value="'+val+'" placeholder="'+placeholder+'" lay-verify="'+verify+'" ',
+ (id != "" ? 'id="'+id+'" ' : ''),
+ (name != "" ? 'name="'+name+'" ' : ''),
+ (readonly ? 'readonly ' : ''),
+ (disabled ? 'disabled ' : ''),
+ '>'+val+'</textarea>',
+ '</div>',
+ '</div>'].join('');
+ },
+ hidden: function(){
+ return ['<input type="hidden" class="layui-input f-input" value="'+val+'" lay-verify="'+verify+'" ',
+ (id != "" ? 'id="'+id+'" ' : ''),
+ (name != "" ? 'name="'+name+'" ' : ''),
+ (readonly ? 'readonly ' : ''),
+ (disabled ? 'disabled ' : ''),
+ '/>'].join('');
+ },
+ select: function(){
+ var optionsData = (typeof nodeBarContents.optionsData === 'object') ? nodeBarContents.optionsData : nodeBarContents.optionsData();
+ var options = "";
+ for(var key in optionsData){
+ if(val == optionsData[key]){
+ options += "<option value='"+key+"' selected>"+optionsData[key]+"</option>";
+ } else {
+ options += "<option value='"+key+"'>"+optionsData[key]+"</option>";
+ }
+ }
+ return ['<div class="layui-form-item">',
+ '<label class="layui-form-label" title="'+nodeBarContents.label+'">'+nodeBarContents.label+':</label>',
+ '<div class="layui-input-block f-input-par">',
+ '<select lay-verify="'+verify+'" ',
+ (id != "" ? 'id="'+id+'" ' : ''),
+ (name != "" ? 'name="'+name+'" ' : ''),
+ (readonly ? 'readonly ' : ''),
+ (disabled ? 'disabled ' : ''),
+ '>',
+ options,
+ '</select>', '</div>', '</div>'].join('');
+ },
+ submit: function(){
+ var filter = nodeBarContents.filter;
+ return ['<button type="button" class="layui-btn layui-btn-normal btn-w100" lay-submit lay-filter="'+filter+'" ',
+ (id != "" ? 'id="'+id+'" ' : ''),
+ (name != "" ? 'name="'+name+'" ' : ''),
+ '>'+val+'</button>'].join('');
+ },
+ button: function(){
+ return ['<button type="button" class="layui-btn layui-btn-normal btn-w100" ',
+ (id != "" ? 'id="'+id+'" ' : ''),
+ (name != "" ? 'name="'+name+'" ' : ''),
+ ' >'+val+'</button>'].join('');
+ },
+ reset: function(){
+ return ['<button type="reset" class="layui-btn layui-btn-primary btn-w100" ',
+ (id != "" ? 'id="'+id+'" ' : ''),
+ (name != "" ? 'name="'+name+'" ' : ''),
+ '>'+val+'</button>'].join('');
+ }
+ }
+ };
+
+ // 新增节点后改变节点内容
+ DTree.prototype.changeTreeNodeAdd = function(returnID){
+ var _this = this;
+ var temp = _this.temp;
+ var id = temp[0], $ul = temp[1], $div = temp[2], level = temp[3];
+ var flag = false;
+ console.log(returnID);
+ if(returnID){
+ var $thisDiv = _this.obj.find("[data-id='"+id+"']");
+ if(typeof returnID === "object"){
+ // 如果是JSON格式数据,则将当前DIV删除,重新建造DIV
+ $thisDiv.remove();
+ var parseData = _this.parseData(returnID);
+
+ if(parseData.treeId()){
+ $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(0), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), "item"));
+
+ // 建造完毕后,选中该DIV
+ $thisDiv = $ul.find("div[data-id='"+parseData.treeId()+"']");
+ _this.setNodeParam($thisDiv)
+ } else {
+ layer.msg("添加失败,节点ID为undefined!",{icon:5});
+ // 将li节点删除
+ $ul.find("li[data-id='"+id+"']").remove();
+ // 重新赋值
+ _this.setNodeParam($div);
+ // 临时变量制空
+ _this.temp = [];
+ return ;
+ }
+ }else if(returnID == 'refresh'){
+ // 如果是设置为refresh参数,则向后台发送请求,获取新增节点下的真实参数,局部刷新树。
+ flag = true;
+ } else if(typeof returnID === "string" || typeof returnID === 'number' || returnID == true){
+ $thisDiv.attr("data-id", returnID);
+ // 将li节点展示
+ $ul.find("li[data-id='"+returnID+"']").show();
+ _this.setNodeParam($thisDiv)
+ }
+
+ // 判断当前点击的节点是否是最后一级节点,如果是,则需要修改节点的样式
+ var $icon_i = $div.find("i[data-spread]");
+ if ($icon_i.eq(0).attr("data-spread") == "last") {
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).openWithLeaf();
+ } else { //如果不是,也要修改节点样式
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).open();
+ }
+ $ul.addClass(NAV_SHOW); //展开UL
+ _this.accordionUL($ul);
+ if(flag) {
+ _this.getChild($div);
+ } else {
+ // _this.showLine();
+ _this.showLine($ul.find("li"));
+ // 这种情况下需要在新增节点后对节点新增工具栏
+ if(_this.toolbar && _this.toolbarWay != 'contextmenu') {
+ _this.dynamicToolbarDom($thisDiv.find("cite[data-leaf]"));
+ }
+ }
+
+ } else {
+ // 将li节点删除
+ $ul.find("li[data-id='"+id+"']").remove();
+ // 重新赋值
+ _this.setNodeParam($div);
+ }
+
+ _this.temp = []; // 临时变量制空
+
+ };
+
+ // 编辑页打开后显示编辑页内容
+ DTree.prototype.changeTreeNodeDone = function(param){
+ var _this = this;
+ form.val('dtree_editNode_form', param);
+ form.render();
+ };
+
+ // 修改节点后改变节点内容
+ DTree.prototype.changeTreeNodeEdit = function(returnID){
+ var _this = this;
+ var temp = _this.temp;
+ var $cite = temp[0], $div = temp[1], title = temp[2], $p_div = temp[3];
+ var flag = false;
+ if(returnID){
+ if(typeof returnID === "object"){
+ var parseData = _this.parseData(data);
+
+ if(parseData.treeId()){
+ var replaceDom = _this.replaceDom($div, parseData.treeId(), parseData.last(0), parseData.spread(), parseData.disabled(), parseData.hide());
+ replaceDom.node(parseData.iconClass());
+ replaceDom.checkbox(parseData.checkArr());
+ replaceDom.text(parseData.title());
+ replaceDom.ul();
+ replaceDom.basicData(parseData.basicData());
+ replaceDom.recordData(parseData.recordData());
+ _this.setNodeParam($div);
+ } else {
+ layer.msg("编辑失败,节点ID为undefined!",{icon:5});
+ // 重新赋值
+ _this.setNodeParam($div);
+ }
+ }
+ } else {
+ $cite.html(title);
+ _this.getNodeParam($div);
+ }
+
+ _this.temp = []; // 临时变量制空
+ };
+
+ // 删除节点后改变节点内容
+ DTree.prototype.changeTreeNodeDel = function(flag){
+ var _this = this;
+ var temp = _this.temp;
+ var $p_li = temp[0],
+ $p_ul = $p_li.parent("ul"),
+ $p_div = temp[1];
+
+ if(flag){
+ $p_li.remove();
+ _this.showLine($p_ul.find("li"));
+ // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式
+ if($p_ul.children("li").length == 0){
+ var $icon_i = $p_div.find("i[data-spread]");
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).closeWithLeaf();
+ }
+ _this.initNodeParam();
+ }
+
+ _this.temp = []; // 临时变量制空
+ };
+
+ /******************** iframe区域 ********************/
+ // 加载iframe
+ DTree.prototype.loadIframe = function($div, iframeParam) {
+ var _this = this;
+ var $cite = _this.getNodeDom($div).cite();
+ if (!_this.useIframe) { // 启用iframe
+ return false;
+ }
+ var iframeElem = _this.iframe.iframeElem,
+ iframeUrl = _this.iframe.iframeUrl,
+ iframeLoad = _this.iframe.iframeLoad;
+
+ var flag = iframeLoad == "leaf" ? (($cite.attr("data-leaf") == "leaf") ? true : false) : true;
+
+ if (flag) {
+ if ($(iframeElem).length > 0) { //iframe存在
+ if (!iframeUrl) {
+ layer.msg("数据请求异常,iframeUrl参数未指定", {icon:5});
+ return false;
+ }
+ var param = AjaxHelper.serialize(iframeParam);
+ if(iframeUrl.indexOf("?")> -1){
+ param = "&"+param.substring(1, param.length);
+ }
+ var url = iframeUrl + param;
+ $(iframeElem).attr("src", url);
+ } else {
+ layer.msg("iframe绑定异常,请确认页面中是否有iframe页对应的容器", {icon:5});
+ return false;
+ }
+ }
+ return flag;
+ };
+
+ // 获取传递出去的参数,根据iframe.iframeDefaultRequest、iframe.iframeRequest和node拼出发出请求的参数
+ DTree.prototype.getIframeRequestParam = function(nodes){
+ var _this = this;
+ var request = _this.iframe.iframeRequest,
+ defaultRequestNames = _this.iframe.iframeDefaultRequest,
+ node = nodes || _this.node,
+ requestParam = {};
+
+ // 先拼用户自定义的,在拼树生成的,这样的话用户可以自定义当树未生成时的节点的初始值
+ for ( var key in request) {
+ requestParam[key] = request[key];
+ }
+ for ( var key in defaultRequestNames) {
+ var paramName = defaultRequestNames[key];
+ var paramValue = node[key];
+ if(typeof paramValue === "boolean"){
+ requestParam[paramName] = paramValue;
+ }else {
+ if(paramValue){
+ requestParam[paramName] = paramValue;
+ }
+ }
+ }
+
+ // 解决传递中文的乱码问题
+ var reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/; //正则匹配中文
+ for(var key in requestParam){
+ if(reg.test(requestParam[key])) {
+ var str = requestParam[key];
+ requestParam[key] = encodeURI(encodeURI(str));
+ }
+ }
+
+ return requestParam;
+ };
+
+ /******************** 数据回调区域 ********************/
+ // 根据具体的id获取基于当前id的div以及对应的其他dom元素
+ DTree.prototype.getNodeDom = function(id){
+ var _this = this;
+ // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ return {
+ div: function(){ // 获取当前div
+ return $div;
+ },
+ fnode: function(){ // 获取一级图标元素
+ return ($div == null) ? null : $div.find("i[data-spread]").eq(0);
+ },
+ snode: function(){ // 获取二级图标元素
+ return ($div == null) ? null : $div.find("i[data-spread]").eq(1);
+ },
+ checkbox: function(){ // 获取复选框元素
+ return ($div == null) ? null : $div.find("i[data-par]");
+ },
+ cite: function(){ // 获取cite元素
+ return ($div == null) ? null : $div.find("cite[data-leaf]");
+ },
+ nextUl: function(){ // 获取相邻的ul元素
+ return ($div == null) ? null : $div.next("ul");
+ },
+ parentLi: function(){ // 获取父级li元素
+ return ($div == null) ? null : $div.parent("li");
+ },
+ parentUl: function(){ // 获取基于当前$div的上级$ul
+ return ($div == null) ? null : $div.parent("li").parent("ul");
+ },
+ parentDiv: function(){ // 获取基于当前$div的上级$div
+ return ($div == null) ? null : $div.parent("li").parent("ul").prev("div");
+ },
+ nowDiv: function(){ // 获取当前选中节点,没有则返回null
+ return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS);
+ },
+ nowOrRootDiv: function(){ // 获取当前选中节点,没有则返回根节点下的第一个div
+ return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? _this.obj.children("li").eq(0).children("div").eq(0) : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS);
+ },
+ nowOrRootUl: function(){ // 获取当前选中节点下一个UL 或根节点。为了将新节点放入ul下
+ return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? _this.obj : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).next("ul");
+ }
+ }
+ };
+
+ // 获取当前选中节点下一个UL 或根节点。为了将新节点放入ul下
+ DTree.prototype.getNowNodeUl = function() {
+ var _this = this;
+ return _this.getNodeDom().nowOrRootUl();
+ };
+
+ // 获取当前选中节点 或第一个根节点。
+ DTree.prototype.getNowNode = function() {
+ var _this = this;
+ return _this.getNodeDom().nowOrRootDiv();
+ };
+
+ // 获取当前选中节点 无则返回null。
+ DTree.prototype.getNowNodeOrNull = function() {
+ var _this = this;
+ return _this.getNodeDom().nowDiv();
+ };
+
+ // 获取指定节点。
+ DTree.prototype.getNode = function(id) {
+ var _this = this;
+ return _this.getNodeDom(id).div();
+ };
+
+ // 设置当前选中节点的全部参数
+ DTree.prototype.setNodeParam = function($div) {
+ var _this = this;
+ _this.node.nodeId = $div.attr("data-id");
+ _this.node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid");
+ _this.node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text();
+ _this.node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false;
+ _this.node.level = _this.getNodeDom($div).parentLi().attr("data-index");
+ _this.node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false;
+ _this.node.basicData = $div.attr("data-basic")
+ _this.node.recordData = $div.attr("data-record");
+ if (_this.getNodeDom($div).checkbox()) {
+ var dataTypes = "", checkeds = "", initcheckeds = "";
+ _this.getNodeDom($div).checkbox().each(function(){
+ dataTypes += $(this).attr("data-type") + ",";
+ checkeds += $(this).attr("data-checked") + ",";
+ initcheckeds += $(this).attr("data-initchecked") + ",";
+ });
+ dataTypes = dataTypes.substring(0, dataTypes.length-1);
+ checkeds = checkeds.substring(0, checkeds.length-1);
+ initcheckeds = initcheckeds.substring(0, initcheckeds.length-1);
+
+ _this.node.dataType = dataTypes;
+ _this.node.checked = checkeds;
+ _this.node.initchecked = initcheckeds;
+ }
+ };
+
+ // 获取当前选中节点的全部参数
+ DTree.prototype.getNodeParam = function($div) {
+ var _this = this;
+ if ($div) {
+ _this.setNodeParam($div);
+ } else {
+ if(_this.obj.find("div[data-id]").parent().find("."+NAV_THIS).length == 0){
+ _this.initNodeParam();
+ }
+ }
+ return this.node;
+ };
+
+ // 获取一个临时的node参数
+ DTree.prototype.getTempNodeParam = function($div) {
+ var _this = this;
+ var temp_node = {};
+ temp_node.nodeId = $div.attr("data-id");
+ temp_node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid");
+ temp_node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text();
+ temp_node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false;
+ temp_node.level = _this.getNodeDom($div).parentLi().attr("data-index");
+ temp_node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false;
+ temp_node.basicData = $div.attr("data-basic")
+ temp_node.recordData = $div.attr("data-record");
+ if (_this.getNodeDom($div).checkbox()) {
+ var dataTypes = "", checkeds = "", initcheckeds = "";
+ _this.getNodeDom($div).checkbox().each(function(){
+ dataTypes += $(this).attr("data-type") + ",";
+ checkeds += $(this).attr("data-checked") + ",";
+ initcheckeds += $(this).attr("data-initchecked") + ",";
+ });
+ dataTypes = dataTypes.substring(0, dataTypes.length-1);
+ checkeds = checkeds.substring(0, checkeds.length-1);
+ initcheckeds = initcheckeds.substring(0, initcheckeds.length-1);
+
+ temp_node.dataType = dataTypes;
+ temp_node.checked = checkeds;
+ temp_node.initchecked = initcheckeds;
+ }
+ return temp_node;
+ };
+
+ // 重置参数
+ DTree.prototype.initNodeParam = function(){
+ var _this = this;
+ _this.node.nodeId = "";
+ _this.node.parentId = "";
+ _this.node.context = "";
+ _this.node.leaf = "";
+ _this.node.level = "";
+ _this.node.spread = "";
+ _this.node.dataType = "";
+ _this.node.checked = "";
+ _this.node.initchecked = "";
+ _this.node.basicData = "";
+ _this.node.recordData = "";
+ };
+
+ // 获取传递出去的参数,根据defaultRequest、request和node拼出发出请求的参数
+ DTree.prototype.getRequestParam = function(nodes){
+ var _this = this;
+ var request = _this.request,
+ defaultRequestNames = _this.defaultRequest,
+ node = nodes || _this.node,
+ requestParam = {};
+
+ // 先拼用户自定义的,在拼树生成的,这样的话用户可以自定义当树未生成时的节点的初始值
+ for ( var key in request) {
+ requestParam[key] = request[key];
+ }
+ for ( var key in defaultRequestNames) {
+ var paramName = defaultRequestNames[key];
+ var paramValue = node[key];
+ if(typeof paramValue === "boolean"){
+ requestParam[paramName] = paramValue;
+ }else {
+ if(paramValue){
+ requestParam[paramName] = paramValue;
+ }
+ }
+
+ }
+ return requestParam;
+ };
+
+ // 获取filterParam过滤后的requestParam
+ DTree.prototype.getFilterRequestParam = function(requestParam){
+ var _this = this;
+ var filterRequest = _this.filterRequest;
+ return event.cloneObj(requestParam, filterRequest);
+ };
+
+ // 获取当前选中值
+ DTree.prototype.getNowParam = function(){
+ var _this = this;
+
+ return _this.getRequestParam(_this.getNodeParam());
+ };
+
+ // 获取指定节点选中值
+ DTree.prototype.getParam = function(id){
+ var _this = this;
+
+ // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ if($div != null){ return _this.callbackData().node(_this.getTempNodeParam($div)); } else { return {}; }
+ };
+
+ // 获取参数的上级节点
+ DTree.prototype.getParentParam = function(id){
+ var _this = this;
+ // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ if($div != null){ return _this.callbackData().parentNode($div); } else { return {}; }
+ };
+
+ // 获取参数的全部上级节点
+ DTree.prototype.getAllParentParam = function(id){
+ var _this = this;
+ // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ var arr = [];
+ if($div != null){
+ var level = _this.getTempNodeParam($div).level;
+ for(var i=1; i<level; i++){ // 从1开始遍历,如果level等于1说明是根节点
+ arr.unshift(_this.callbackData().parentNode($div));
+ $div = _this.getNodeDom($div).parentDiv();
+ }
+ }
+ return arr;
+ };
+
+ // 获取参数的下级节点
+ DTree.prototype.getChildParam = function(id){
+ var _this = this;
+ // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ if($div != null){ return _this.callbackData().childNode($div); } else { return []; }
+ };
+
+ // 获取回调数据
+ DTree.prototype.callbackData = function(){
+ var _this = this;
+ return {
+ dom: function($dom){ // 获取dom
+ return $dom;
+ },
+ node: function(node){ // 获取当前节点值
+ return _this.getRequestParam(node);
+ },
+ childNode: function($div){ // 获取下级节点值
+ var $childDivs = $div.next("ul").find("li."+LI_NAV_ITEM+" div."+LI_DIV_ITEM);
+ var childNode = [];
+ if($childDivs && $childDivs.length > 0){
+ $childDivs.each(function(){
+ var $cDiv = $(this);
+ childNode.push(_this.getRequestParam(_this.getTempNodeParam($cDiv)));
+ });
+ }
+ return childNode;
+ },
+ parentNode: function($div){ // 获取上级节点值
+ var pId = _this.getNodeDom($div).parentLi().attr("data-pid");
+ var $pdiv = _this.obj.find("div[data-id='"+pId+"']");
+ if($pdiv.length > 0) {return _this.getRequestParam(_this.getTempNodeParam($pdiv));} else {return {};}
+
+ }
+ }
+ };
+
+ /******************** 事件回调区域 ********************/
+ // 绑定浏览器事件
+ DTree.prototype.bindBrowserEvent = function(){
+ var _this = this;
+
+ // 绑定文件夹展开/收缩的图标的点击事件,点击时给当前节点的div添加选中class
+ _this.obj.on("click", "i[data-spread]", function(event) {
+ event.stopPropagation();
+ var $i = $(this),
+ $div = $i.parent("div"),
+ node = _this.getNodeParam($div);
+
+ _this.toolbarHide();
+ _this.navThis($div);
+ _this.clickSpread($div); // 展开或隐藏节点
+
+ // 树状态改变后,用户自定义想做的事情
+ layui.event.call(this, MOD_NAME, "changeTree("+$(_this.obj)[0].id+")", {
+ dom: _this.callbackData().dom($i),
+ param: _this.callbackData().node(node),
+ show: _this.callbackData().dom($i).attr("data-spread") == "open" ? true : false
+ });
+ });
+
+ // 绑定所有子节点div的单击事件,点击时触发加载iframe或用户自定义想做的事情
+ _this.obj.on("click", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event) {
+ event.stopPropagation();
+ var $div = $(this),
+ $cite = $div.find("cite"),
+ node = _this.getNodeParam($div);
+ _this.toolbarHide();
+ _this.navThis($div);
+
+ if (_this.useIframe) {
+ var iframeParam = _this.getFilterRequestParam(_this.getIframeRequestParam(node));
+ var flag = _this.loadIframe($div, iframeParam); // 加载iframe
+ if (flag) {
+ // iframe加载完毕后,用户自定义想做的事情
+ _this.iframeFun.iframeDone(iframeParam);
+
+ layui.event.call(this, MOD_NAME, "iframeDone("+$(_this.obj)[0].id+")", {
+ "iframeParam": iframeParam,
+ dom: _this.callbackData().dom($div)
+ });
+ }
+ } else {
+ // 单击事件执行完毕后,用户自定义想做的事情
+ layui.event.call(this, MOD_NAME, "node("+$(_this.obj)[0].id+")", {
+ param: _this.callbackData().node(node),
+ childParams: _this.callbackData().childNode($div),
+ parentParam: _this.callbackData().parentNode($div),
+ dom: _this.callbackData().dom($div)
+ });
+ }
+ });
+
+ // 绑定所有子节点div的双击事件,暴露on给用户自定义
+ _this.obj.on("dblclick", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event) {
+ event.stopPropagation();
+ var $div = $(this),
+ $cite = $div.find("cite"),
+ node = _this.getNodeParam($div);
+
+ _this.toolbarHide();
+ _this.navThis($div);
+ // 双击事件执行完毕后,用户自定义想做的事情
+ layui.event.call(this, MOD_NAME, "nodedblclick("+$(_this.obj)[0].id+")", {
+ param: _this.callbackData().node(node),
+ childParams: _this.callbackData().childNode($div),
+ parentParam: _this.callbackData().parentNode($div),
+ dom: _this.callbackData().dom($div)
+ });
+ });
+
+ if(_this.checkbar) {
+ // 绑定cheboxbar的节点复选框
+ _this.obj.on("click", "i[dtree-click='"+eventName.checkNodeClick+"'][dtree-disabled='false']", function(event) {
+ _this.toolbarHide();
+ var $i = $(this),
+ $div = $i.closest("div[dtree-click='"+eventName.itemNodeClick+"']"),
+ node = _this.getNodeParam($div);
+ // 复选框选中前的回调
+ var flag = _this.checkbarFun.chooseBefore($i, _this.getRequestParam(node));
+ _this.temp = [$i];
+ if(flag){_this.changeCheck();}
+ event.stopPropagation();
+ });
+ }
+
+ if(_this.menubar) {
+ // 绑定menubar的点击事件
+ _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).on("click", "button[d-menu]", function(event) {
+ event.stopPropagation();
+ _this.toolbarHide();
+ _this.menubarListener($(this).attr("d-menu"), "group");
+ });
+
+ // 绑定menubar的点击事件
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).on("click", "a[d-menu]", function(event) {
+ event.stopPropagation();
+ _this.toolbarHide();
+ _this.menubarListener($(this).attr("d-menu"), "toolbar");
+ });
+
+ // 绑定menubar的点击按钮事件
+ _this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").on("click", function(event) {
+ event.stopPropagation();
+ _this.toolbarHide();
+ _this.menubarListener($(this).attr("dtree-menu"), "freedom");
+ });
+ }
+
+ if(_this.toolbar) {
+ if(_this.toolbarWay == "contextmenu") {
+ //绑定所有子节点div的右键点击事件,用于显示toolbar
+ _this.obj.on("contextmenu", "div[dtree-click='"+eventName.itemNodeClick+"'][d-contextmenu='true'][dtree-disabled='false']", function(e){
+ var $div = $(this),
+ node = _this.getNodeParam($div);
+
+ _this.toolbarHide();
+ // toolbar加载前执行的方法,执行完毕之后创建按钮
+ _this.setToolbarDom().setToolbarPlace(_this.toolbarFun.loadToolbarBefore(event.cloneObj(_this.toolbarMenu), _this.getRequestParam(node), $div));
+
+ var e = e || window.event,
+ mx = e.pageX - $div.offset().left +45 ,
+ my = $div.offset().top - _this.obj.closest(_this.toolbarScroll).offset().top +15;
+
+ _this.navThis($div);
+ var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
+ $toolBarDiv.find(".layui-nav-child").addClass('layui-anim-fadein layui-show');
+ $toolBarDiv.css({'left':mx+'px','top':my+'px'});
+
+ e.stopPropagation();
+ return false;
+ });
+
+ // 绑定装载树的上层出现滚动条的容器,让toolbar隐藏
+ _this.obj.closest(_this.toolbarScroll).scroll(function() {
+ _this.toolbarHide();
+ });
+
+ // 绑定toolbar的点击事件
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).on("click", "a[dtree-tool]", function(event) {
+ event.stopPropagation();
+ var $div = _this.getNodeDom().nowOrRootDiv(),
+ node = _this.getNodeParam($div);
+ _this.toolbarHide();
+ var tool = $(this).attr("dtree-tool");
+ _this.toolbarListener(tool, $div);
+ });
+ } else if(_this.toolbarWay == "fixed") {
+ // 绑定toolbar的点击事件
+ _this.obj.on("click", "a[dtree-tool]", function(event) {
+ event.stopPropagation();
+ var $a = $(this),
+ $cite = $a.parent("em."+TOOLBAR_TOOL_EM).prev("cite"), //当前选中节点的text
+ $div = $cite.parent("div"),
+ node = _this.getNodeParam($div);
+ var tool = $a.attr("dtree-tool");
+
+ _this.toolbarHide();
+ _this.navThis($div);
+ _this.toolbarListener(tool, $div);
+ });
+ } else if(_this.toolbarWay == "follow") {
+ //绑定所有子节点div的mouseover mouseout事件,用于显示或隐藏toolbar
+ _this.obj.on("mouseover mouseout", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event){
+ var $div = $(this),
+ $toolBarEm = $div.children("em."+TOOLBAR_TOOL_EM);
+ if(event.type == "mouseover"){
+ $toolBarEm.removeClass(NAV_HIDE);
+ event.stopPropagation();
+ } else if(event.type == "mouseout"){
+ $toolBarEm.addClass(NAV_HIDE);
+ event.stopPropagation();
+ }
+ });
+
+ // 绑定toolbar的点击事件
+ _this.obj.on("click", "a[dtree-tool]", function(event) {
+ event.stopPropagation();
+ var $a = $(this),
+ $cite = $a.parent("em."+TOOLBAR_TOOL_EM).prev("cite"), //当前选中节点的text
+ $div = $cite.parent("div"),
+ node = _this.getNodeParam($div);
+ var tool = $a.attr("dtree-tool");
+
+ _this.toolbarHide();
+ _this.navThis($div);
+ _this.toolbarListener(tool, $div);
+ });
+ }
+ }
+
+ // 开启拖拽
+ /*if(_this.drawable) {
+ //绑定所有子节点div的拖拽事件
+ _this.obj.on("mousedown", "div[dtree-click='" + eventName.itemNodeClick + "'][dtree-disabled='false']", function (e) {
+ var moveCount = 0;
+ var $div = $(this);
+
+ // 克隆点击节点
+ var $tempDiv = $div.clone();
+
+ // 获取当前被点击节点的坐标
+ var e = e || window.event;
+ var x = $div.offset().left;
+ var y = $div.offset().top;
+ var left = e.pageX - x;
+ var top = e.pageY - y;
+
+
+ _this.obj.append($tempDiv);
+ // 克隆节点标记
+ $tempDiv.css({
+ "position": "absolute",
+ "background-color": "#FF8C69",
+ 'left' : x,
+ 'top' : top,
+ });
+ // 添加临时节点
+ $div.css('cursor', 'move');
+
+ $(document).on("mousemove", function (e1) {
+ // moveCount为了区别click事件
+ moveCount++;
+ if (moveCount > 2) {
+ // 计算坐标
+ var e1 = e1 || window.event;
+ var x1 = e1.pageX - left;
+ var y1 = e1.pageY - top;
+ var maxL = $(document).width() - $div.outerWidth();
+ var maxT = $(document).height() - $div.outerHeight();
+ //不允许超出浏览器范围
+ x1 = x1 < 0 ? 0: x1;
+ x1 = x1 > maxL ? maxL: x1;
+ y1 = y1 < 0 ? 0: y;
+ y1 = y1 > maxT ? maxT: y1;
+ //3.修改克隆节点的坐标
+ $tempDiv.css({
+ 'left' : x1,
+ 'top' : y1,
+ });
+ }
+ }).on("mouseup", function (e2) {
+ $(document).off("mousemove").off("mouseup");
+ });
+ });
+ }*/
+ };
+
+ // 绑定body的单击,让本页面所有的toolbar隐藏
+ $BODY.on("click", function(event){
+ $("div."+LI_DIV_TOOLBAR).find(".layui-show").removeClass('layui-anim-fadein layui-show');
+ });
+
+ // 解绑浏览器事件
+ DTree.prototype.unbindBrowserEvent = function(){
+ var _this = this;
+
+ // 本身事件解绑
+ _this.obj.unbind();
+ // 菜单栏解绑
+ if(_this.menubar){
+ _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).unbind();
+ if(_this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").length > 0){
+ _this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").unbind();
+ }
+ }
+
+ // 工具栏解绑
+ if(_this.toolbar){
+ if(_this.toolbarWay == "contextmenu") {
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).unbind();
+ if(_this.obj.closest(_this.toolbarScroll).length > 0){
+ _this.obj.closest(_this.toolbarScroll).unbind();
+ }
+ }
+ }
+ };
+
+
+ /** 外部访问 **/
+ var dtree = {
+ render: function(options){ // 初始化树
+ var dTree = null;
+ var id = event.getElemId(options);
+ if(id == "") {
+ layer.msg("页面中未找到绑定id", {icon:5});
+ } else {
+ dTree = DTrees[id];
+ if(typeof dTree === 'object'){
+ dTree.reloadSetting(options);
+ dTree.initTreePlus();
+ dTree.openTreePlus();
+ dTree.initNodeParam();
+ dTree.init();
+ dTree.unbindBrowserEvent();
+ dTree.bindBrowserEvent();
+ } else {
+ // 创建树
+ dTree = new DTree(options);
+ // 添加到树数组中去
+ DTrees[id] = dTree;
+ dTree.initTreePlus();
+ dTree.openTreePlus();
+ dTree.init();
+ dTree.bindBrowserEvent();
+ }
+ }
+
+ return dTree;
+ },
+ reload: function(dTree, options){ // 重新加载树
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ dTree.reloadSetting(options);
+ dTree.initTreePlus();
+ dTree.openTreePlus();
+ dTree.initNodeParam();
+ dTree.init();
+ dTree.unbindBrowserEvent();
+ dTree.bindBrowserEvent();
+ },
+ on: function(events, callback) { // 绑定事件
+ if(events.indexOf("'") > 0){
+ events = events.replace(/'/g,"");
+ }
+ if(events.indexOf('"') > 0) {
+ events = events.replace(/"/g,"");
+ }
+ return layui.onevent.call(this, MOD_NAME, events, callback);
+ },
+ click: function(dTree, id) { // 模拟单击事件
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ $("div[dtree-click='"+eventName.itemNodeClick+"'][dtree-id='"+dTree.obj[0].id+"'][data-id='"+id+"']").click();
+ },
+ getNowParam: function(dTree){ // 获取当前选中值
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.getNowParam(); // 获取当前选中值
+ },
+ getParam: function(dTree, id){ // 获取指定节点值
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.getParam(id); // 获取指定节点值
+ },
+ getParentParam: function(dTree, id){ // 获取参数的上级节点
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.getParentParam(id);
+ },
+ getAllParentParam: function(dTree, id){ // 获取参数的全部上级节点
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.getAllParentParam(id);
+ },
+ getChildParam: function(dTree, id){ // 获取参数的全部下级节点
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.getChildParam(id);
+ },
+ getCheckbarNodesParam: function(dTree){ // 获取复选框选中值
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return {};
+ }
+ return dTree.getCheckbarNodesParam(); // 获取复选框选中值
+ },
+ dataInit: function(dTree, chooseId){ // 初始化选中树,针对数据反选
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ if(chooseId){
+ return dTree.dataInit(chooseId);
+ }
+ },
+ chooseDataInit: function(dTree, chooseIds){ // 初始化复选框选中,针对数据反选
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ if(chooseIds){
+ return dTree.chooseDataInit(chooseIds);
+ }
+ },
+ changeCheckbarNodes: function(dTree){ //判断复选框是否发生变更
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.changeCheckbarNodes();
+ },
+ initNoAllCheck: function(dTree) { //复选框半选状态初始化设置
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.initNoAllCheck();
+ },
+ initAllCheck: function(dTree){ // 复选框选中状态初始化设置
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.initAllCheck();
+ },
+ escape: function(html){ // 字符串格式化
+ return event.escape(html);
+ },
+ unescape: function(str){ // 字符串反格式化
+ return event.unescape(str);
+ },
+ version: function(){ //获取版本号
+ return VERSION;
+ }
+ };
+
+ exports('dtree', dtree);
+});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.css b/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.css
new file mode 100755
index 0000000..df7af65
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.css
@@ -0,0 +1,229 @@
+@font-face {
+ font-family: 'dtreefont';
+ src: url('dtreefont.eot?x3m8fp');
+ src: url('dtreefont.eot?x3m8fp#iefix') format('embedded-opentype'),
+ url('dtreefont.ttf?x3m8fp') format('truetype'),
+ url('dtreefont.woff?x3m8fp') format('woff'),
+ url('dtreefont.svg?x3m8fp#dtreefont') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+[class^="dtree-icon-"], [class*=" dtree-icon-"] {
+ /* use !important to prevent issues with browser extensions that change font */
+ font-family: 'dtreefont' !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+}
+
+.dtree-icon-xiangxia1:before {
+ content: "\e771";
+}
+.dtree-icon-normal-file:before {
+ content: "\e60c";
+}
+.dtree-icon-xiangyou:before {
+ content: "\e78f";
+}
+.dtree-icon-ok-circle:before {
+ content: "\1005";
+}
+.dtree-icon-close1:before {
+ content: "\1006";
+}
+.dtree-icon-close-fill:before {
+ content: "\1007";
+}
+.dtree-icon-jian1:before {
+ content: "\e600";
+}
+.dtree-icon-jia1:before {
+ content: "\e601";
+}
+.dtree-icon-bianji:before {
+ content: "\e602";
+}
+.dtree-icon-yonghu:before {
+ content: "\e603";
+}
+.dtree-icon-shijian:before {
+ content: "\e606";
+}
+.dtree-icon-fuxuankuang-banxuan:before {
+ content: "\e607";
+}
+.dtree-icon-star:before {
+ content: "\e608";
+}
+.dtree-icon-wenjianjiazhankai:before {
+ content: "\e60e";
+}
+.dtree-icon-xiangmuxiaoxi:before {
+ content: "\e60f";
+}
+.dtree-icon-search2:before {
+ content: "\e615";
+}
+.dtree-icon-weibiaoti5:before {
+ content: "\e618";
+}
+.dtree-icon-layim-theme:before {
+ content: "\e61b";
+}
+.dtree-icon-shuye1:before {
+ content: "\e61e";
+}
+.dtree-icon-add-circle:before {
+ content: "\e61f";
+}
+.dtree-icon-xinxipilu:before {
+ content: "\e620";
+}
+.dtree-icon-set-sm:before {
+ content: "\e621";
+}
+.dtree-icon-about:before {
+ content: "\e623";
+}
+.dtree-icon-chart-screen:before {
+ content: "\e62a";
+}
+.dtree-icon-delete1:before {
+ content: "\e640";
+}
+.dtree-icon-share3:before {
+ content: "\e641";
+}
+.dtree-icon-youjian:before {
+ content: "\e642";
+}
+.dtree-icon-check:before {
+ content: "\e645";
+}
+.dtree-icon-close:before {
+ content: "\e646";
+}
+.dtree-icon-favorfill:before {
+ content: "\e64b";
+}
+.dtree-icon-favor:before {
+ content: "\e64c";
+}
+.dtree-icon-fuxuankuangxuanzhong:before {
+ content: "\e652";
+}
+.dtree-icon-fenguangbaobiao:before {
+ content: "\e655";
+}
+.dtree-icon-jian:before {
+ content: "\e656";
+}
+.dtree-icon-jia:before {
+ content: "\e657";
+}
+.dtree-icon-fenzhijigou:before {
+ content: "\e658";
+}
+.dtree-icon-roundcheckfill:before {
+ content: "\e659";
+}
+.dtree-icon-roundcheck:before {
+ content: "\e65a";
+}
+.dtree-icon-roundclosefill:before {
+ content: "\e65b";
+}
+.dtree-icon-roundclose:before {
+ content: "\e65c";
+}
+.dtree-icon-roundrightfill:before {
+ content: "\e65d";
+}
+.dtree-icon-roundright:before {
+ content: "\e65e";
+}
+.dtree-icon-like:before {
+ content: "\e66c";
+}
+.dtree-icon-samefill:before {
+ content: "\e671";
+}
+.dtree-icon-same:before {
+ content: "\e672";
+}
+.dtree-icon-evaluate:before {
+ content: "\e674";
+}
+.dtree-icon-circle1:before {
+ content: "\e687";
+}
+.dtree-icon-radio:before {
+ content: "\e688";
+}
+.dtree-icon-caidan_xunzhang:before {
+ content: "\e68e";
+}
+.dtree-icon-pulldown:before {
+ content: "\e6a0";
+}
+.dtree-icon-pullup:before {
+ content: "\e6a1";
+}
+.dtree-icon-refresh:before {
+ content: "\e6a4";
+}
+.dtree-icon-qrcode1:before {
+ content: "\e6b0";
+}
+.dtree-icon-profile1:before {
+ content: "\e6b7";
+}
+.dtree-icon-home1:before {
+ content: "\e6b8";
+}
+.dtree-icon-homefill:before {
+ content: "\e6bb";
+}
+.dtree-icon-roundaddfill:before {
+ content: "\e6d8";
+}
+.dtree-icon-roundadd:before {
+ content: "\e6d9";
+}
+.dtree-icon-fuxuankuang:before {
+ content: "\e6f2";
+}
+.dtree-icon-wefill:before {
+ content: "\e6f5";
+}
+.dtree-icon-sort:before {
+ content: "\e701";
+}
+.dtree-icon-repair:before {
+ content: "\e738";
+}
+.dtree-icon-shujudaping:before {
+ content: "\e742";
+}
+.dtree-icon-dian:before {
+ content: "\e7a5";
+}
+.dtree-icon-search_list_light:before {
+ content: "\e807";
+}
+.dtree-icon-round_list_light:before {
+ content: "\e82b";
+}
+.dtree-icon-star-fill:before {
+ content: "\e832";
+}
+.dtree-icon-rate:before {
+ content: "\e833";
+}
+.dtree-icon-move-up:before {
+ content: "\ea47";
+}
+.dtree-icon-move-down:before {
+ content: "\ea48";
+}
diff --git a/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.eot b/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.eot
new file mode 100755
index 0000000..68bf5f2
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.eot
Binary files differ
diff --git a/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.svg b/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.svg
new file mode 100755
index 0000000..90fe50f
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.svg
@@ -0,0 +1,80 @@
+<?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" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="896" descent="-128" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode=" " d="" />
+<glyph unicode="စ" glyph-name="ok-circle" d="M516.152-63.152c-60.696 0-119.595 11.895-175.057 35.353-53.555 22.652-101.646 55.073-142.936 96.365-41.291 41.291-73.713 89.382-96.364 142.936-23.458 55.462-35.353 114.36-35.353 175.056s11.895 119.595 35.353 175.057c22.652 53.555 55.073 101.646 96.364 142.936 41.29 41.291 89.382 73.713 142.936 96.364 55.462 23.458 114.36 35.353 175.057 35.353s119.595-11.895 175.057-35.353c53.555-22.652 101.645-55.073 142.936-96.364s73.712-89.381 96.364-142.936c23.459-55.462 35.353-114.36 35.353-175.057s-11.894-119.594-35.353-175.056c-22.652-53.555-55.072-101.645-96.364-142.936s-89.382-73.713-142.936-96.365c-55.461-23.458-114.36-35.353-175.057-35.353zM516.152 774.87c-214.116 0-388.312-174.196-388.312-388.312s174.196-388.312 388.312-388.312 388.312 174.196 388.312 388.312-174.195 388.312-388.312 388.312zM434.749 132.831l-225.256 225.257 79.595 79.594 145.661-145.661 308.47 308.468 79.594-79.595z" />
+<glyph unicode="ဆ" glyph-name="close1" d="M783.483 701.249l-271.483-271.474-271.483 271.474c-10.082 10.083-26.429 10.083-36.51 0-10.083-10.082-10.083-26.429 0-36.509l271.481-271.475-271.48-271.477c-10.083-10.081-10.083-26.428 0-36.508 10.082-10.082 26.429-10.082 36.51 0l271.482 271.475 271.483-271.475c10.082-10.082 26.429-10.082 36.513 0 10.081 10.083 10.081 26.428 0 36.508l-271.486 271.477 271.485 271.474c10.081 10.083 10.081 26.429 0 36.509-10.083 10.082-26.431 10.082-36.512 0.001z" />
+<glyph unicode="ဇ" glyph-name="close-fill" d="M512 822.022c-217.475 0-394.423-176.949-394.423-394.423s176.948-394.422 394.423-394.422c217.473 0 394.422 176.948 394.422 394.422s-176.949 394.423-394.422 394.423zM702.229 270.93c8.031-8.031 8.031-21.052 0-29.083s-21.052-8.031-29.083 0l-161.145 161.146-161.146-161.145c-8.031-8.031-21.052-8.031-29.083 0s-8.031 21.052 0 29.083l161.146 161.146-161.145 161.145c-8.031 8.031-8.031 21.052 0 29.083s21.052 8.031 29.083 0l161.146-161.146 161.144 161.146c8.031 8.031 21.052 8.031 29.083 0s8.031-21.052 0-29.083l-161.146-161.146 161.146-161.146z" />
+<glyph unicode="" glyph-name="jian1" d="M512.135 776.711c-216.356 0-392.38-176.025-392.38-392.38s176.025-392.38 392.38-392.38c216.356 0 392.381 176.024 392.381 392.38s-176.026 392.38-392.381 392.38zM512.135 40.996c-189.317 0-343.333 154.017-343.333 343.335s154.016 343.333 343.333 343.333c189.318 0 343.333-154.016 343.333-343.333 0-189.319-154.016-343.335-343.333-343.335zM659.278 408.854h-294.285c-13.556 0-24.524-10.968-24.524-24.523 0-13.531 10.968-24.524 24.524-24.524h294.285c13.556 0 24.524 10.993 24.524 24.524 0 13.555-10.968 24.523-24.524 24.523z" />
+<glyph unicode="" glyph-name="jia1" d="M511.515 775.812c-215.609 0-391.030-175.421-391.030-391.031s175.421-391.031 391.031-391.031c215.611 0 391.031 175.42 391.031 391.031s-175.42 391.031-391.032 391.031zM511.515 42.63c-188.665 0-342.151 153.484-342.151 342.151s153.486 342.152 342.151 342.152c188.666 0 342.153-153.486 342.153-342.152s-153.487-342.151-342.153-342.151zM658.152 409.221h-122.196v122.197c0 13.508-10.931 24.439-24.44 24.439s-24.439-10.931-24.439-24.439v-122.197h-122.196c-13.511 0-24.44-10.931-24.44-24.439 0-13.484 10.931-24.439 24.44-24.439h122.195v-122.197c0-13.484 10.931-24.439 24.439-24.439 13.51 0 24.44 10.955 24.44 24.439v122.197h122.196c13.51 0 24.44 10.955 24.44 24.439 0.001 13.509-10.93 24.44-24.439 24.44z" />
+<glyph unicode="" glyph-name="bianji" d="M468.551 64.961l402.683 477.563c25.851 30.583 21.845 76.822-8.738 102.551l-148.306 125.247c-30.583 25.851-76.822 21.845-102.551-8.738l-402.804-477.563-23.301-254.62c-0.85-9.345 2.913-18.569 10.073-24.637s16.869-8.253 25.972-5.825l246.974 66.021zM582.512 636.825l170.757-143.937-291.635-345.885-170.757 144.058 291.635 345.763zM676.569 725.783l148.427-125.125c6.068-5.098 6.796-14.442 1.699-20.511l-36.166-42.962-170.636 143.937 36.166 42.962c5.098 6.068 14.563 6.796 20.511 1.699zM246.701 65.447l15.899 173.185 152.189-128.281-168.087-44.905z" />
+<glyph unicode="" glyph-name="yonghu" d="M701.812 584.689c0-99.168-80.394-179.563-179.568-179.563-99.164 0-179.556 80.39-179.556 179.563 0 99.168 80.395 179.564 179.556 179.564 99.174 0 179.568-80.39 179.568-179.564zM780.721 159.555c0-123.196-115.728-140.102-258.479-140.102-142.74 0-258.468 16.894-258.468 140.094 0 123.192 115.726 223.067 258.479 223.067 142.749 0.003 258.468-99.869 258.468-223.056z" />
+<glyph unicode="" glyph-name="shijian" d="M512 839.111c-250.311 0-455.111-204.8-455.111-455.111s204.8-455.111 455.111-455.111 455.111 204.8 455.111 455.111-204.8 455.111-455.111 455.111M512-14.222c-221.867 0-398.222 176.355-398.222 398.222s176.355 398.222 398.222 398.222 398.222-176.355 398.222-398.222-176.355-398.222-398.222-398.222M512 384v284.444h-56.889v-341.333h284.445v56.889z" />
+<glyph unicode="" glyph-name="fuxuankuang-banxuan" d="M229.8 5.4c-50 0-90.7 40.7-90.7 90.7v284.3l752.9 1.5v-285.8c0-50-40.7-90.7-90.7-90.7h-571.5zM781.438-6h-535.875c-66.188 0-120.094 53.906-120.094 120.094v535.875c0 66.188 53.906 120.094 120.094 120.094h535.781c66.188 0 120.094-53.906 120.094-120.094v-535.875c0.094-66.188-53.813-120.094-120-120.094zM245.563 699.937c-27.563 0-49.969-22.406-49.969-49.969v-535.875c0-27.563 22.406-49.969 49.969-49.969h535.781c27.563 0 49.969 22.406 49.969 49.969v535.875c0 27.563-22.406 49.969-49.969 49.969h-535.781zM245.563 699.937" />
+<glyph unicode="" glyph-name="star" d="M749.625-84.153c-15.673 0-31.246 3.883-45.084 11.307l-192.526 103.637-192.469-103.609c-31.204-16.64-70.315-14.393-99.044 5.305-29.511 20.338-44.743 55.922-38.841 90.695l37.703 225.252-162.702 162.475c-25.003 24.889-33.465 60.985-22.059 94.194 11.349 32.91 40.064 56.576 74.965 61.753l221.326 32.896 96.128 199.58c15.488 32.085 48.853 52.807 84.992 52.807 36.167 0 69.518-20.736 84.964-52.807l96.156-199.58 221.298-32.91c34.873-5.163 63.616-28.8 74.98-61.696 11.392-33.28 2.944-69.362-22.030-94.251l-162.759-162.46 37.746-225.28c5.845-34.773-9.387-70.357-38.812-90.638-15.986-10.908-34.617-16.668-53.931-16.668zM512.014 91.548c4.636 0 9.273-1.138 13.483-3.385l205.938-110.862c12.373-6.642 28.316-5.803 39.936 2.133 11.392 7.836 17.124 21.006 14.891 34.304l-40.164 239.758c-1.508 9.088 1.451 18.332 7.964 24.832l173.141 172.843c9.458 9.429 12.686 23.026 8.405 35.484-4.38 12.672-15.701 21.874-29.525 23.922l-236.217 35.129c-9.316 1.38-17.365 7.296-21.447 15.787l-102.699 213.148c-6.030 12.53-19.257 20.608-33.707 20.608s-27.691-8.092-33.764-20.622l-102.642-213.134c-4.082-8.491-12.132-14.407-21.447-15.787l-236.231-35.129c-13.625-2.034-25.202-11.435-29.54-23.993-4.267-12.416-1.024-25.984 8.434-35.399l173.113-172.857c6.514-6.5 9.472-15.744 7.964-24.832l-40.135-239.744c-2.247-13.312 3.484-26.439 14.976-34.361 11.435-7.836 27.349-8.775 39.95-2.062l205.852 110.834c4.196 2.247 8.832 3.385 13.468 3.385zM200.32 439.211c-6.841 0-12.885 4.964-14.023 11.947-1.252 7.751 4.011 15.061 11.762 16.313l9.444 1.536c7.794 1.337 15.061-4.011 16.313-11.762s-4.011-15.061-11.762-16.313l-9.444-1.536c-0.754-0.128-1.536-0.185-2.29-0.185zM252.544 447.687c-6.684 0-12.644 4.722-13.938 11.534-1.493 7.708 3.556 15.175 11.264 16.654l153.927 29.696 58.055 133.148c3.157 7.182 11.548 10.496 18.716 7.353 7.211-3.143 10.51-11.52 7.367-18.716l-61.056-140.018c-1.877-4.295-5.746-7.396-10.354-8.277l-161.28-31.118c-0.91-0.185-1.806-0.256-2.702-0.256z" />
+<glyph unicode="" glyph-name="normal-file" d="M192 800v-832h640v620.992l-8.992 10.016-192 192-10.016 8.992h-428.992zM256 736h320v-192h192v-512h-512v704zM640 689.984l82.016-81.984h-82.016v82.016z" />
+<glyph unicode="" glyph-name="wenjianjiazhankai" d="M333.206 491.863h504.3v56.012c-0.012 61.888-50.179 112.055-112.066 112.067h-224.113c0 61.893-50.174 112.067-112.067 112.067v0h-224.133c-61.888-0.012-112.055-50.179-112.067-112.066v-560.313c0-14.289 2.964-27.837 7.832-40.39l160.246 320.535c36.685 55.779 50.191 112.088 112.067 112.088zM893.539 435.83h-504.279c-61.897 0-75.424-56.309-112.067-112.067l-168.121-280.145c0-61.897 50.191-56.033 112.067-56.033h504.3c61.876 0 75.403-11.96 112.067 56.033l168.079 280.145c0 0.006 0 0.014 0 0.021 0 61.881-50.164 112.045-112.045 112.045v0z" />
+<glyph unicode="" glyph-name="xiangmuxiaoxi" horiz-adv-x="1152" d="M578.575 733.268l-3.164 1.919c6.997-9.237 6.804-5.094 3.164-1.919v0zM177.111 329.683l358.478-161.157c31.662-14.924 45.32-14.924 79.641 0l358.479 161.158c17.676 8.218 24.14 47.012 24.14 67.918-23.022-11.541-55.653-27.978-56.318-28.158l-366.12-168.771-366.123 168.771c1.239-0.787-32.389 14.441-56.317 28.158 0-20.425 5.136-57.829 24.14-67.92v0zM575.411 31.842l-366.123 168.829c1.239-0.786-32.389 14.442-56.317 28.099 0-20.424 5.136-57.828 24.14-67.92l358.478-161.094c31.662-14.985 45.32-14.985 79.641 0l358.479 161.096c17.676 8.278 24.14 47.074 24.14 67.92-23.022-11.48-55.653-27.975-56.318-28.099l-366.12-168.831zM177.111 498.453l358.478-161.157c31.662-14.925 45.32-14.925 79.641 0l358.479 161.157c26.376 12.327 27.284 64.656 0 79.581l-358.478 189.27c-28.158 16.708-47.979 15.831-79.641 0l-358.479-189.27c-27.283-17.584-28.158-64.656 0-79.581v0zM575.411 735.187c0.374-0.122 0.702-0.314 0.97-0.522l365.152-196.392-366.122-154.329-366.123 154.328 366.123 196.915z" />
+<glyph unicode="" glyph-name="search2" d="M439.323 120.522c-49.28 0-97.098 9.657-142.127 28.7-43.48 18.389-82.523 44.706-116.044 78.226s-59.841 72.561-78.231 116.039c-19.043 45.028-28.7 92.845-28.7 142.123 0 49.284 9.656 97.105 28.7 142.133 18.389 43.479 44.71 82.52 78.232 116.039 33.519 33.515 72.563 59.833 116.044 78.219 45.027 19.040 92.846 28.695 142.126 28.695s97.099-9.654 142.127-28.695c43.481-18.386 82.526-44.704 116.045-78.221 33.521-33.518 59.842-72.56 78.231-116.039 19.042-45.029 28.7-92.849 28.7-142.133 0-49.278-9.657-97.095-28.702-142.123-18.389-43.477-44.708-82.52-78.229-116.039s-72.564-59.839-116.044-78.227c-45.028-19.043-92.847-28.698-142.128-28.698zM439.323 797.483c-171.976 0-311.888-139.906-311.888-311.875s139.912-311.874 311.888-311.874 311.888 139.907 311.888 311.874-139.912 311.875-311.888 311.875zM890.678-48.735c-22.122 0-42.904 8.562-58.542 24.115l-157.464 152.645 37.039 38.206 157.888-153.059c5.607-5.607 13.092-8.693 21.078-8.693 7.983 0 15.465 3.087 21.071 8.691 5.616 5.622 8.716 13.127 8.716 21.123 0 7.981-3.092 15.463-8.703 21.068l-0.302 0.307-152.746 157.563 38.208 37.035 152.612-157.427c15.571-15.638 24.145-36.423 24.145-58.549 0-22.196-8.626-43.055-24.287-58.736-15.668-15.666-36.515-24.288-58.714-24.288zM281.015 327.245c-42.34 42.321-65.653 98.584-65.644 158.421 0.008 59.818 23.319 116.075 65.638 158.408l37.635-37.62c-66.607-66.63-66.61-175.001-0.007-241.577l-37.621-37.632z" />
+<glyph unicode="" glyph-name="weibiaoti5" horiz-adv-x="1025" d="M458.632 712.273c12.75-33.75 48.75-57 86.25-58.5 10.5 0 12 0 21.75 0h354c31.5 0 57.75-27 57.75-58.5v-523.5c0-31.5-26.25-58.5-57.75-58.5h-808.5c-31.5 0-57.75 27-57.75 58.5v640.5c0 31.5 26.25 58.5 57.75 58.5h288.75M400.882 770.023v0c27.75-1.5 50.25-35.25 57.75-58.5" />
+<glyph unicode="" glyph-name="layim-theme" d="M958.831 538.643l-218.171 154.111h-100.54l-3.978-9.333c-0.371-0.872-38.022-86.861-124.773-88.667-35.692 0.764-67.207 15.5-93.681 43.828-20.659 22.106-30.375 44.584-30.457 44.777l-3.955 9.394h-100.588l-218.171-154.11 104.802-158.887 89.957 65.020-19.016-368.053h542.826l-19.016 368.052 89.957-65.019 104.803 158.887zM730.105 507.204l20.655-399.781h-478.174l20.656 399.781-115.939-83.798-36.324 55.070 159.44 111.642-19.276 30.639-160.079-112.090-14.548 22.056 185.921 131.33h71.078c5.332-10.044 15.434-26.78 30.952-43.581 32.048-34.696 72.257-53.486 116.346-54.411v-0.032c0.204 0.003 0.406 0.012 0.61 0.016 0.204-0.003 0.406-0.013 0.61-0.016v0.032c44.074 0.925 84.359 19.704 116.567 54.38 15.624 16.821 25.815 33.58 31.188 43.612h71.121l185.921-131.33-14.548-22.056-160.080 112.088-19.276-30.639 159.44-111.642-36.324-55.070-115.939 83.8z" />
+<glyph unicode="" glyph-name="shuye1" d="M515.2 734.4c1.3 0 2.4-0.2 3.4-0.6 27-11 216.1-231.5 212.2-426.3-3.2-163.8-151.2-176.9-198.1-176.9-8.9 0-14.1 0.5-14.1 0.5s-258.5 22-220 246.2c37.2 216.1 182 357 216.6 357.1M515.2 768c-52.5 0-122.8-93.3-136.4-112-40.7-56.1-93.7-149-115.1-273.2-12.5-72.5 1.5-134.1 41.5-183.3 72.6-89.2 204.6-101.4 210.2-101.9 1-0.1 7.3-0.6 17.3-0.6 110.9 0 230.4 55.1 233.5 209.9 2.2 111.7-52.9 224.7-99.4 299.8-41.3 66.5-104.3 145.8-134.2 158-5.5 2.2-11.3 3.3-17.4 3.3zM518.6 0.4c-9.8 0-17.7 7.5-17.7 16.8v716.6c0 9.3 7.9 16.8 17.7 16.8s17.7-7.5 17.7-16.8v-716.6c0-9.3-7.9-16.8-17.7-16.8zM518.6 459.7c-5.4 0-10.7 2.3-14.2 6.8-5.8 7.5-4.2 18 3.6 23.5l130.2 92.2c7.8 5.5 18.9 4 24.7-3.5s4.2-18-3.6-23.5l-130.2-92.2c-3.1-2.2-6.8-3.3-10.5-3.3zM518.6 225.1c-5.3 0-10.5 2.2-14 6.5-6 7.3-4.6 17.9 3.1 23.6l202.9 150.5c7.7 5.7 18.8 4.4 24.8-2.9s4.6-17.9-3.1-23.6l-202.8-150.5c-3.3-2.4-7.1-3.6-10.9-3.6zM518.6 323c-4.2 0-8.5 1.4-11.9 4.4l-185.3 160.2c-7.2 6.2-7.8 16.9-1.2 23.8s17.7 7.4 25 1.2l185.4-160.2c7.2-6.2 7.8-16.9 1.2-23.8-3.6-3.7-8.4-5.6-13.2-5.6z" />
+<glyph unicode="" glyph-name="add-circle" d="M675.040 412.736h-127.040v127.264c0 20.064-16.288 36.32-36.32 36.32-20.064 0-36.32-16.192-36.32-36.32v-127.232h-127.072c-20.064 0-36.352-16.32-36.352-36.352 0-20.064 16.224-36.352 36.352-36.352h127.072v-127.232c0-20 16.256-36.384 36.32-36.384 20.032 0 36.32 16.256 36.32 36.384v127.136h127.040c19.968 0 36.352 16.256 36.352 36.384-0.032 20.096-16.256 36.384-36.352 36.384v0zM511.328 830.56c-250.24 0-453.952-203.616-453.952-453.952s203.712-453.952 453.952-453.952c250.336 0 453.984 203.584 453.984 453.952 0 250.336-203.616 453.952-453.984 453.952v0zM511.328-20.576c-219.040 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.216c0.032-218.944-178.176-397.152-397.216-397.152v0zM511.328-20.576" />
+<glyph unicode="" glyph-name="xinxipilu" d="M369.647 225.683l-19.005 50.72-19.053-50.72h-50.704l41.179-31.699-18.989-57.093 47.566 34.888 47.583-34.888-19.036 57.093 41.206 31.699h-50.748zM350.643 453.792l-19.053-50.784h-50.704l41.179-31.714-18.989-57.068 47.566 34.895 47.583-34.895-19.036 57.068 41.206 31.714h-50.749l-19.004 50.784zM711.864 399.995h-207.876c-13.243 0-23.97-10.729-23.97-23.985 0-13.243 10.727-23.985 23.97-23.985h207.877c13.259 0 24.002 10.743 24.002 23.985-0.001 13.255-10.744 23.985-24.003 23.985zM767.831 767.778h-511.697c-70.645 0-127.908-57.263-127.908-127.925v-511.706c0-70.645 57.263-127.925 127.908-127.925h511.697c70.662 0 127.941 57.28 127.941 127.925v511.706c0 70.661-57.28 127.925-127.941 127.925zM516.231 719.806h163.153v-151.067l-67.988 42.786c-7.512 4.733-17.069 4.778-24.625 0.125l-70.539-43.411v151.566zM847.785 144.137c0-52.969-42.943-95.944-95.927-95.944h-479.733c-52.969 0-95.927 42.975-95.927 95.944v479.739c0 52.985 42.957 95.93 95.927 95.93h197.491v-193.277c0-8.447 4.578-16.223 11.948-20.346s16.395-3.937 23.579 0.499l93.695 57.652 91.446-57.527c3.78-2.389 8.089-3.592 12.43-3.592 3.873 0 7.745 0.968 11.258 2.904 7.42 4.108 12.040 11.931 12.040 20.41v193.277h25.846c52.984 0 95.927-42.944 95.927-95.93v-479.739zM711.864 208.099h-207.876c-13.243 0-23.97-10.711-23.97-23.985 0-13.243 10.727-23.985 23.97-23.985h207.877c13.259 0 24.002 10.743 24.002 23.985-0.001 13.275-10.744 23.985-24.003 23.985z" />
+<glyph unicode="" glyph-name="set-sm" d="M946.367 405.895c0.020 21.85-13.040 38.49-31.74 41.57-18.69 3.070-79.050 13.010-85.99 14.14-6.95 1.15-14.090 8.070-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.090-56.73 55.86-8.99 8.76-31.080 8.64-42.67 0.43-11.58-8.2-71.69-51.010-71.69-51.010s-9.97-6.89-20.67-2.64c-10.7 4.24-33.43 14.070-33.43 14.070s-7.19 5.43-9.68 19.79c-2.5 14.37-11.11 65.28-14.070 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.070-84.45-2.52-15.3-11.44-18.48-11.44-18.48s-19.56-8.060-29.91-12.31c-10.34-4.26-15.39-2.64-30.35 7.48-14.95 10.11-44.74 31.030-63.040 43.83-18.3 12.81-38.12 7.92-49.26-3.52s-36.060-35.77-51.020-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.21s10.84-19.5 8.36-26.82c-2.49-7.34-6.64-16.58-11.43-27.72-4.81-11.13-9.69-13.64-27.86-17.010-17.36-3.21-58.42-9.92-77.4-13.31-18.99-3.37-30.66-21.43-30.66-41.81v-64.66c0-24.34 13.2-37.24 38.42-41.93s62.66-10.66 74.77-12.61c12.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.030-64.51-11.74-16.4-6.45-37.83 4.98-49.85 11.44-12.030 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.010 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.030 3.64 31.11 19.92 31.26 39.92 0.15 20.020 0.070 48.61 0.090 65.98zM908.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.070-38.72-28.060-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.080 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.020-15.87-6.42 1.28 0.28-22.2-8.97s-30.23-27.62-33.73-48.24c-3.5-20.63-10.67-62.98-11.95-70.45s-5.55-11.1-13.66-11.1h-64.9c-8.11 0-11.74 2.99-14.52 11.95-2.77 8.97-10.030 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.42s-40.56 40.56-46.54 46.54c-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.090v66.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.030 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.010-38.85 54-44.4 61.9s-5.77 12.6 0.85 19.21c6.62 6.62 42.050 42.48 46.96 46.97 4.91 4.48 12.070 5.4 18.36 0.85 6.3-4.55 49.31-35.65 64.040-46.11s32.35-12.56 49.1-5.55c16.75 7.020 10.25 4.48 26.9 11.1s24.84 19.090 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.070 69.8 0c3.99 0.070 10.3-3.29 11.32-9.18 1.020-5.9 13.020-74.29 14.94-86.25 1.92-11.95 15.58-28.57 25.54-32.73s21.35-8.75 31.31-13.090c9.97-4.34 30.13-1.91 36.15 2.28 6.030 4.18 70.52 48.81 75.43 52.37s11.52 3.27 17.64-2.85 43.34-43.19 47.54-47.53c4.19-4.34 4.66-8.66 1.14-13.66-3.53-5.010-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.030 33.59-31.88s76.92-12.74 84.82-13.95c7.9-1.21 11.1-7.18 11.1-13.37s-0.21-62.55 0-68.32zM526.833 573.195c-110.45 0-200-89.54-200-200s89.55-200 200-200c110.46 0 200 89.54 200 200s-89.54 200-200 200zM526.833 208.195c-91.12 0-165 73.87-165 165s73.88 165 165 165c91.13 0 165-73.87 165-165s-73.87-165-165-165z" />
+<glyph unicode="" glyph-name="about" d="M514.272 834.608c-249.517 0-451.79-202.273-451.79-451.79s202.273-451.79 451.79-451.79 451.79 202.273 451.79 451.79-202.273 451.79-451.79 451.79zM514.272-20.129c-222.541 0-402.947 180.406-402.947 402.947s180.406 402.947 402.947 402.947 402.947-180.406 402.947-402.947-180.405-402.947-402.947-402.947zM514.295 593.979c-9.446-10.361-14.308-22.952-14.308-37.484 0-11.96 3.887-22.396 11.535-30.458 7.783-8.211 17.854-12.451 29.314-12.451 9.312 0 23.139 2.85 35.783 16.901 9.866 10.641 14.867 23.438 14.867 37.693 0 11.681-4.032 21.901-11.744 29.832-16.815 17.311-47.382 15.436-65.446-4.035zM549.461 293.283c-12.111-11.542-20.59-18.759-26.237-23.316 2.77 14.954 9.976 44.614 27.33 103.023 17.298 57.89 18.799 67.992 18.799 72.956 0 8.657-3.637 16.335-9.922 21.643-14.125 11.662-39.035 9.35-69.131-7.678-16.779-9.408-34.596-24.76-54.493-46.577l-10.377-11.542 34.425-26.549 8.819 8.715c9.573 9.293 16.086 15.352 20.412 19.394-26.295-86.46-39.093-140.191-39.093-164.262 0-10.907 3.172-19.971 9.573-26.839 6.46-7.039 15.51-10.737 25.892-10.737 10.146 0 21.792 3.926 35.922 11.949 12.741 7.212 31.883 23.030 58.642 48.191l10.838 10.392-31.307 30.475-10.091-9.238z" />
+<glyph unicode="" glyph-name="chart-screen" d="M963.931 179.219v34.824l-37.355-2.676v483.487h-235.163v70.463h-361.152v-70.463h-234.57v-480.81h-35.621v-34.824h432.583v-141.229h-90.314v-35.307h216.754v35.307h-90.314v141.228h435.153zM366.213 730.008h289.004v-35.307h-289.004v35.307zM364.818 332.731l-142.594 73.521 14.296 27.737 123.239-63.524 173.928 159.755 127.581-92.635 93.138 122.414 24.842-18.898-111.608-146.737-131.636 95.622-171.186-157.256z" />
+<glyph unicode="" glyph-name="delete1" 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" />
+<glyph unicode="" glyph-name="share3" d="M769.714 306.453c-51.754 0-97.702-24.851-126.571-63.269l-248.664 124.757c3.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.229s-70.841 158.229-158.229 158.229c-87.389 0-158.229-70.841-158.229-158.229 0-6.046 0.352-12.009 1.011-17.88l-261.275-131.085c-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.229c-0.001 87.387-70.836 158.228-158.225 158.228v0z" />
+<glyph unicode="" glyph-name="youjian" d="M896.699 598.971c0 23.926-19.428 43.444-43.444 43.444h-684.849c-24.016 0-43.444-19.428-43.444-43.444v-433.090c0-23.926 19.428-43.444 43.444-43.444h684.939c23.926 0 43.444 19.428 43.444 43.444v433.090zM544.111 346.762l-0.18-0.18c-17.629-16.19-45.243-16.19-62.782 0.090l-284.769 256.166h633.85l-286.118-256.076zM383.737 380.672l-219.198-194.014v391.175l219.198-197.162zM413.779 354.048l40.566-36.338c15.92-14.661 36.518-22.487 58.105-22.487 0 0 0.090 0 0.090 0 21.587 0 42.185 7.825 58.015 22.397l42.994 38.407 218.929-193.924h-635.559l216.86 191.945zM642.871 382.471l214.251 191.675v-381.371l-214.251 189.696z" />
+<glyph unicode="" glyph-name="check" d="M887.904 597.792c-12.864 12.064-33.152 11.488-45.216-1.408l-426.752-454.368-233.12 229.696c-12.608 12.416-32.864 12.288-45.28-0.32-12.416-12.576-12.256-32.864 0.352-45.248l256.48-252.672c0.096-0.096 0.224-0.128 0.32-0.224s0.128-0.224 0.224-0.32c2.016-1.92 4.448-3.008 6.784-4.288 1.152-0.672 2.144-1.664 3.36-2.144 3.776-1.472 7.776-2.24 11.744-2.24 4.192 0 8.384 0.832 12.288 2.496 1.312 0.544 2.336 1.664 3.552 2.368 2.4 1.408 4.896 2.592 6.944 4.672 0.096 0.096 0.128 0.256 0.224 0.352 0.064 0.096 0.192 0.128 0.288 0.224l449.184 478.208c12.16 12.832 11.488 33.088-1.376 45.216z" />
+<glyph unicode="" glyph-name="close" d="M557.312 382.752l265.28 263.904c12.544 12.48 12.608 32.704 0.128 45.248-12.512 12.576-32.704 12.608-45.248 0.128l-265.344-263.936-263.040 263.84c-12.448 12.48-32.704 12.544-45.248 0.064-12.512-12.48-12.544-32.736-0.064-45.28l262.976-263.776-265.152-263.744c-12.544-12.48-12.608-32.704-0.128-45.248 6.24-6.272 14.464-9.44 22.688-9.44 8.16 0 16.32 3.104 22.56 9.312l265.216 263.808 265.44-266.24c6.24-6.272 14.432-9.408 22.656-9.408 8.192 0 16.352 3.136 22.592 9.344 12.512 12.48 12.544 32.704 0.064 45.248l-265.376 266.176z" />
+<glyph unicode="" glyph-name="favorfill" d="M957.216 491.68c-3.808 11.36-13.632 19.68-25.504 21.504l-270.336 41.728-120.8 258.624c-5.248 11.232-16.544 18.432-28.928 18.464 0 0-0.032 0-0.064 0-12.384 0-23.648-7.136-28.928-18.336l-121.856-258.016-270.72-40.8c-11.872-1.792-21.728-10.048-25.568-21.408s-0.992-23.936 7.36-32.512l196.448-202.080-46.88-284.8c-1.984-12.096 3.104-24.256 13.12-31.328 9.984-7.072 23.168-7.808 33.888-1.92l241.824 133.024 241.312-133.856c4.832-2.624 10.176-3.968 15.52-3.968 0.256 0 0.48 0 0.64 0 17.696 0 32 14.304 32 32 0 3.968-0.704 7.776-2.016 11.296l-44.896 278.688 196.928 201.248c8.32 8.544 11.232 21.088 7.456 32.448z" />
+<glyph unicode="" glyph-name="favor" d="M767.104-63.936c-5.344 0-10.688 1.344-15.52 4.032l-241.312 133.856-241.824-133.024c-10.72-5.92-23.904-5.152-33.888 1.92-10.016 7.072-15.104 19.264-13.12 31.328l46.88 284.736-196.448 202.080c-8.256 8.512-11.168 20.928-7.456 32.192 3.68 11.296 13.312 19.616 25.024 21.632l155.072 26.592c17.632 2.944 33.984-8.736 36.96-26.144s-8.704-33.952-26.144-36.96l-95.168-16.32 165.344-170.080c7.072-7.296 10.272-17.504 8.64-27.488l-38.816-235.68 199.616 109.824c9.632 5.312 21.344 5.312 30.944-0.064l199.168-110.464-38.016 235.776c-1.632 10.016 1.632 20.224 8.704 27.456l164.672 168.256-225.664 34.816c-10.56 1.632-19.584 8.416-24.128 18.080l-99.2 212.384-100.064-211.84c-7.552-16-26.624-22.816-42.624-15.264-15.968 7.552-22.816 26.624-15.264 42.624l129.152 273.44c5.312 11.2 16.576 18.336 28.928 18.336 0 0 0.032 0 0.064 0 12.416-0.032 23.68-7.232 28.928-18.464l120.8-258.624 270.336-41.728c11.872-1.824 21.696-10.144 25.504-21.504 3.776-11.36 0.864-23.936-7.488-32.48l-196.928-201.216 45.92-284.864c1.952-12.096-3.2-24.256-13.216-31.296-5.472-3.936-11.904-5.856-18.368-5.856z" />
+<glyph unicode="" glyph-name="fuxuankuangxuanzhong" d="M734.155 767.755h-444.348c-89.223 0-161.563-72.339-161.563-161.58v-444.349c0-89.231 72.34-161.58 161.563-161.58h444.348c89.252 0 161.601 72.349 161.601 161.58v444.349c-0.001 89.242-72.35 161.58-161.601 161.58zM425.844 225.948l-1.055 1.055-1.054-1.055-139.548 139.539 37.003 37.011 103.602-103.601 260.606 260.587 36.983-37.003-296.537-296.534z" />
+<glyph unicode="" glyph-name="fenguangbaobiao" d="M892-16h-760c-11.046 0-20 8.954-20 20s8.954 20 20 20v0h760c11.046 0 20-8.954 20-20s-8.954-20-20-20v0zM232 344h-40c-22.091 0-40-17.909-40-40v0-200c0-22.091 17.909-40 40-40v0h40c22.091 0 40 17.909 40 40v0 200c0 22.091-17.909 40-40 40v0zM192 104v200h40v-200zM432 584h-40c-22.091 0-40-17.909-40-40v0-440c0-22.091 17.909-40 40-40h40c22.091 0 40 17.909 40 40v0 440c0 22.091-17.909 40-40 40v0zM392 104v440h40v-440zM632 504h-40c-22.091 0-40-17.909-40-40v0-360c0-22.091 17.909-40 40-40h40c22.091 0 40 17.909 40 40v0 360c0 22.091-17.909 40-40 40v0zM592 104v360h40v-360zM832 784h-40c-22.091 0-40-17.909-40-40v0-640c0-22.091 17.909-40 40-40h40c22.091 0 40 17.909 40 40v0 640c0 22.091-17.909 40-40 40v0zM792 104v640h40v-640z" />
+<glyph unicode="" glyph-name="jian" d="M887.157 25.931h-736.333v737.887h736.333v-737.887zM189.66 64.767h658.661v660.215h-658.661v-660.215zM741.91 376.233h-446.616c-10.874 0-19.418 8.544-19.418 19.418s8.544 19.418 19.418 19.418h446.616c10.874 0 19.418-8.544 19.418-19.418s-8.544-19.418-19.418-19.418z" />
+<glyph unicode="" glyph-name="jia" d="M887.157 25.931h-736.333v737.887h736.333v-737.887zM189.66 64.767h658.661v660.215h-658.661v-660.215zM741.91 376.233h-446.616c-10.874 0-19.418 8.544-19.418 19.418s8.544 19.418 19.418 19.418h446.616c10.874 0 19.418-8.544 19.418-19.418s-8.544-19.418-19.418-19.418zM518.991 161.081c-10.874 0-19.418 8.544-19.418 19.418v429.528c0 10.874 8.544 19.418 19.418 19.418s19.418-8.544 19.418-19.418v-429.528c0-10.097-8.544-19.418-19.418-19.418z" />
+<glyph unicode="" glyph-name="fenzhijigou" d="M822.689 422.836v19.418h-291.271v58.254h-38.836v-58.254h-291.271v-97.090h38.836v58.254h252.435v-58.254h38.836v58.254h252.435v-58.254h38.836v77.672zM356.655 733.525h310.689c21.449 0 38.836-17.388 38.836-38.836v0-155.345c0-21.449-17.388-38.836-38.836-38.836h-310.689c-21.449 0-38.836 17.388-38.836 38.836v0 155.345c0 21.449 17.388 38.836 38.836 38.836v0zM162.475 345.164h116.508c21.449 0 38.836-17.388 38.836-38.836v-233.017c0-21.449-17.388-38.836-38.836-38.836v0h-116.508c-21.449 0-38.836 17.388-38.836 38.836v0 233.017c0 21.449 17.388 38.836 38.836 38.836v0zM181.893 306.328c-10.724 0-19.418-8.694-19.418-19.418v0-194.181c0-10.724 8.694-19.418 19.418-19.418v0h77.672c10.724 0 19.418 8.694 19.418 19.418v194.181c0 10.724-8.694 19.418-19.418 19.418v0h-77.672zM453.746 345.164h116.508c21.449 0 38.836-17.388 38.836-38.836v-233.017c0-21.449-17.388-38.836-38.836-38.836v0h-116.508c-21.449 0-38.836 17.388-38.836 38.836v0 233.017c0 21.449 17.388 38.836 38.836 38.836v0zM473.164 306.328c-10.724 0-19.418-8.694-19.418-19.418v0-194.181c0-10.724 8.694-19.418 19.418-19.418v0h77.672c10.724 0 19.418 8.694 19.418 19.418v194.181c0 10.724-8.694 19.418-19.418 19.418v0h-77.672zM745.017 345.164h116.508c21.449 0 38.836-17.388 38.836-38.836v-233.017c0-21.449-17.388-38.836-38.836-38.836v0h-116.508c-21.449 0-38.836 17.388-38.836 38.836v0 233.017c0 21.449 17.388 38.836 38.836 38.836v0zM764.435 306.328c-10.724 0-19.418-8.694-19.418-19.418v0-194.181c0-10.724 8.694-19.418 19.418-19.418v0h77.672c10.724 0 19.418 8.694 19.418 19.418v194.181c0 10.724-8.694 19.418-19.418 19.418v0h-77.672z" />
+<glyph unicode="" glyph-name="roundcheckfill" d="M512 830.016c-245.92 0-446.016-200.096-446.016-446.016 0-245.952 200.064-446.016 446.016-446.016s446.016 200.064 446.016 446.016c0 245.92-200.064 446.016-446.016 446.016zM727.232 457.568l-256.224-259.008c-0.064-0.064-0.192-0.096-0.256-0.192-0.096-0.064-0.096-0.192-0.192-0.256-2.048-1.984-4.576-3.2-6.944-4.544-1.184-0.672-2.144-1.696-3.392-2.176-3.84-1.536-7.904-2.336-11.968-2.336-4.096 0-8.224 0.8-12.096 2.4-1.28 0.544-2.304 1.632-3.52 2.304-2.368 1.344-4.832 2.528-6.88 4.544-0.064 0.064-0.096 0.192-0.16 0.256-0.064 0.096-0.192 0.096-0.256 0.192l-126.016 129.504c-12.32 12.672-12.032 32.928 0.64 45.248 12.672 12.288 32.896 12.064 45.248-0.64l103.264-106.112 233.28 235.84c12.416 12.576 32.704 12.704 45.248 0.256 12.512-12.448 12.64-32.704 0.224-45.28z" />
+<glyph unicode="" glyph-name="roundcheck" d="M512-64c-247.040 0-448 200.96-448 448s200.96 448 448 448 448-200.96 448-448-200.96-448-448-448zM512 767.712c-211.584 0-383.712-172.128-383.712-383.712 0-211.552 172.128-383.712 383.712-383.712 211.552 0 383.712 172.16 383.712 383.712 0 211.584-172.16 383.712-383.712 383.712zM726.976 502.816c-12.544 12.448-32.832 12.32-45.248-0.256l-233.28-235.84-103.264 106.112c-12.352 12.704-32.608 12.928-45.248 0.64-12.672-12.32-12.96-32.608-0.64-45.248l126.016-129.504c0.064-0.096 0.192-0.096 0.256-0.192 0.064-0.064 0.096-0.192 0.16-0.256 2.016-1.984 4.512-3.2 6.88-4.544 1.248-0.672 2.24-1.792 3.52-2.304 3.872-1.6 8-2.4 12.096-2.4 4.064 0 8.128 0.8 11.968 2.336 1.248 0.512 2.208 1.536 3.392 2.176 2.4 1.344 4.896 2.528 6.944 4.544 0.064 0.064 0.096 0.192 0.192 0.256 0.064 0.096 0.16 0.128 0.256 0.192l256.224 259.008c12.448 12.608 12.32 32.864-0.224 45.28z" />
+<glyph unicode="" glyph-name="roundclosefill" d="M512 832c-247.008 0-448-200.96-448-448s200.96-448 448-448c247.008 0 448 200.96 448 448s-200.96 448-448 448zM694.752 246.016c12.48-12.544 12.448-32.768-0.064-45.248-6.24-6.208-14.4-9.344-22.592-9.344-8.224 0-16.416 3.136-22.656 9.408l-137.6 138.016-138.048-136.576c-6.24-6.144-14.368-9.248-22.496-9.248-8.256 0-16.48 3.168-22.752 9.504-12.416 12.576-12.32 32.8 0.256 45.248l137.888 136.384-137.376 137.824c-12.48 12.512-12.448 32.768 0.064 45.248 12.512 12.512 32.736 12.448 45.248-0.064l137.568-137.984 138.048 136.576c12.544 12.448 32.832 12.32 45.248-0.256 12.448-12.576 12.32-32.832-0.256-45.248l-137.888-136.384 137.408-137.856z" />
+<glyph unicode="" glyph-name="roundclose" d="M512-64c-247.040 0-448 200.96-448 448s200.96 448 448 448 448-200.96 448-448-200.96-448-448-448zM512 767.712c-211.584 0-383.712-172.128-383.712-383.712 0-211.552 172.128-383.712 383.712-383.712 211.552 0 383.712 172.16 383.712 383.712 0 211.584-172.16 383.712-383.712 383.712zM557.056 382.624l138.368 136.864c12.576 12.416 12.672 32.672 0.256 45.248s-32.704 12.672-45.248 0.256l-138.56-137.024-136.448 136.864c-12.512 12.512-32.736 12.576-45.248 0.064-12.512-12.48-12.544-32.736-0.064-45.248l136.256-136.672-137.376-135.904c-12.576-12.448-12.672-32.672-0.256-45.248 6.272-6.336 14.496-9.504 22.752-9.504 8.128 0 16.256 3.104 22.496 9.248l137.568 136.064 138.688-139.136c6.24-6.272 14.432-9.408 22.656-9.408 8.192 0 16.352 3.136 22.592 9.344 12.512 12.48 12.544 32.704 0.064 45.248l-138.496 138.944z" />
+<glyph unicode="" glyph-name="roundrightfill" d="M512 832c-247.040 0-448-200.96-448-448s200.96-448 448-448 448 200.96 448 448-200.96 448-448 448zM661.76 360.032l-160.256-158.496c-6.24-6.144-14.368-9.248-22.496-9.248-8.256 0-16.512 3.168-22.752 9.504-12.416 12.576-12.32 32.8 0.256 45.248l137.408 135.904-136.288 136.672c-12.48 12.512-12.448 32.768 0.064 45.248 12.512 12.512 32.768 12.448 45.248-0.064l158.912-159.36c0.032-0.032 0.032-0.064 0.064-0.096s0.064-0.032 0.096-0.064c2.944-2.976 5.056-6.432 6.592-10.048 0.064-0.128 0.224-0.256 0.256-0.384 4.736-11.616 2.368-25.44-7.104-34.816z" />
+<glyph unicode="" glyph-name="roundright" d="M512-64c-247.040 0-448 200.96-448 448s200.96 448 448 448 448-200.96 448-448-200.96-448-448-448zM512 768c-211.744 0-384-172.256-384-384s172.256-384 384-384c211.744 0 384 172.256 384 384s-172.256 384-384 384zM668.832 394.848c-0.032 0.128-0.192 0.256-0.256 0.384-1.536 3.616-3.648 7.072-6.592 10.048-0.032 0.032-0.064 0.032-0.096 0.064s-0.032 0.064-0.064 0.096l-158.912 159.36c-12.48 12.512-32.736 12.576-45.248 0.064-12.512-12.48-12.544-32.736-0.064-45.248l136.288-136.672-137.408-135.904c-12.576-12.448-12.672-32.672-0.256-45.248 6.24-6.336 14.496-9.504 22.752-9.504 8.128 0 16.256 3.104 22.496 9.248l160.256 158.496c9.504 9.376 11.872 23.2 7.104 34.816z" />
+<glyph unicode="" glyph-name="like" d="M512-32c-28.928 0-57.92 12.672-86.624 41.376l-319.104 322.624c-38.208 47.648-74.272 92.672-74.272 180 0 141.152 114.848 256 256 256 53.088 0 104-16.096 147.296-46.592 14.432-10.176 17.92-30.144 7.712-44.608-10.176-14.432-30.080-17.92-44.608-7.712-32.384 22.848-70.592 34.912-110.4 34.912-105.888 0-192-86.112-192-192 0-61.408 20.288-90.112 59.168-138.688l315.584-318.816c15.968-15.968 28.864-22.304 41.248-22.496 12.704-0.192 24.928 6.176 41.376 22.624l316.672 319.904c26.016 28.192 57.952 75.776 57.952 137.472 0 105.888-86.112 192-192 192-48.064 0-94.080-17.856-129.536-50.272l-134.080-134.112c-12.512-12.512-32.736-12.512-45.248 0s-12.512 32.736 0 45.248l135.104 135.136c48.32 44.192 109.664 68 173.76 68 141.152 0 256-114.848 256-256 0-82.368-41.152-144.288-75.68-181.696l-317.568-320.8c-28.8-28.832-57.792-41.504-86.752-41.504z" />
+<glyph unicode="" glyph-name="samefill" d="M352 544h128v-128h-128v128zM918.624 22.624l-145.664 145.664c56.672 66.944 91.040 153.344 91.040 247.712 0 211.744-172.256 384-384 384s-384-172.256-384-384c0-211.744 172.256-384 384-384 94.368 0 180.768 34.368 247.712 91.040l145.664-145.664c6.24-6.24 14.432-9.376 22.624-9.376s16.384 3.136 22.624 9.376c12.512 12.512 12.512 32.736 0 45.248zM288 384v192c0 17.664 14.336 32 32 32h192c17.664 0 32-14.336 32-32v-192c0-17.664-14.336-32-32-32h-192c-17.664 0-32 14.336-32 32zM640 288c0-17.696-14.304-32-32-32h-160c-17.664 0-32 14.304-32 32s14.336 32 32 32h128v128c0 17.664 14.304 32 32 32s32-14.336 32-32v-160z" />
+<glyph unicode="" glyph-name="same" d="M512 352h-192c-17.664 0-32 14.336-32 32v192c0 17.664 14.336 32 32 32h192c17.664 0 32-14.336 32-32v-192c0-17.664-14.336-32-32-32zM352 416h128v128h-128v-128zM608 256h-160c-17.664 0-32 14.304-32 32s14.336 32 32 32h128v128c0 17.664 14.304 32 32 32s32-14.336 32-32v-160c0-17.696-14.304-32-32-32zM896-32c-8.192 0-16.384 3.136-22.624 9.376l-167.104 167.104c-12.512 12.512-12.512 32.736 0 45.248 60.448 60.448 93.728 140.832 93.728 226.272 0 176.448-143.552 320-320 320s-320-143.552-320-320c0-176.448 143.552-320 320-320 39.328 0 77.76 7.072 114.176 20.96 16.448 6.24 35.008-1.984 41.312-18.496 6.272-16.512-1.984-35.008-18.496-41.312-43.712-16.672-89.792-25.152-136.992-25.152-211.744 0-384 172.256-384 384s172.256 384 384 384c211.744 0 384-172.256 384-384 0-91.808-32-178.72-90.784-247.968l145.408-145.408c12.512-12.512 12.512-32.736 0-45.248-6.24-6.24-14.432-9.376-22.624-9.376z" />
+<glyph unicode="" glyph-name="evaluate" d="M405.536-36.128c-8.8 0-17.568 3.584-23.904 10.688-83.232 93.216-217.856 94.112-220.64 94.112-0.096 0-0.096 0-0.192 0-17.568 0-31.904 14.176-32.032 31.744-0.128 17.664 14.016 32.064 31.648 32.256 6.656 0.352 165.664 0.192 268.96-115.488 11.776-13.184 10.624-33.408-2.56-45.184-6.080-5.44-13.696-8.128-21.28-8.128zM620.128-36.064c-7.776 0-15.584 2.816-21.76 8.544-12.96 12-13.76 32.256-1.728 45.216 106.976 115.52 262.752 115.392 268.896 115.136 17.696-0.192 31.872-14.656 31.68-32.32-0.192-17.568-14.464-31.68-32-31.68-0.096 0-0.16 0-0.256 0v0c-2.656 0-134.56-0.864-221.376-94.624-6.272-6.848-14.88-10.272-23.456-10.272zM563.712 126.688h-101.408c-3.232 0-6.368 0.48-9.344 1.408-108.256 13.888-200.256 76.704-259.552 177.44-68.832 116.992-84.608 268.576-39.2 377.216 4.896 11.68 16.224 19.392 28.896 19.648l9.632 0.096c60.96 0 117.888-11.52 169.696-34.304 37.44 68.448 80.192 120.384 127.328 154.688 2.496 2.176 5.344 4 8.512 5.344v0c9.888 4.288 21.376 3.36 30.432-2.528 1.568-1.024 3.040-2.176 4.384-3.456 47.264-34.688 88.832-85.856 126.464-155.744 52.832 23.872 111.072 35.968 173.632 35.968l9.792-0.096c12.672-0.256 24-7.968 28.896-19.648 45.408-108.672 29.664-260.256-39.232-377.248-59.296-100.672-151.264-163.52-259.488-177.44-3.040-0.832-6.176-1.344-9.44-1.344zM468 190.688h90.016c0.672 0.128 1.376 0.224 2.080 0.32 115.712 12.864 182.080 87.072 217.376 147.008 54.048 91.872 70.432 211.936 42.528 300.32-58.24-1.888-111.616-16.16-158.816-42.528-7.712-4.288-16.832-5.184-25.184-2.624-8.384 2.624-15.328 8.608-19.2 16.512-32.448 66.368-67.232 115.2-105.824 148.48-38.624-33.216-74.176-82.4-105.92-146.592-3.872-7.808-10.72-13.696-19.040-16.32-8.32-2.656-17.28-1.76-24.96 2.4-46.208 25.12-98.336 38.784-155.008 40.64-27.904-88.384-11.52-208.448 42.528-300.288 35.296-59.936 101.632-134.112 217.312-147.008 0.704-0.096 1.408-0.192 2.112-0.32zM512.768-64c-17.664 0-32 14.304-32 32v190.688c0 17.696 14.336 32 32 32s32-14.304 32-32v-190.688c-0.032-17.696-14.336-32-32-32z" />
+<glyph unicode="" glyph-name="circle1" d="M511.998 847.999c-256.259 0-463.998-207.739-463.998-464 0-256.258 207.739-463.998 463.998-463.998 256.263 0 464.002 207.741 464.002 463.998 0 256.261-207.739 464-464.002 464zM512.002-16.001c-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-400 0-220.912-179.086-400-399.998-400z" />
+<glyph unicode="" glyph-name="radio" d="M320.5 383.5c0-106.039 85.961-192 192-192s192 85.961 192 192v0c0 106.039-85.961 192-192 192s-192-85.961-192-192v0zM511.998 847.999c-256.259 0-463.998-207.739-463.998-464 0-256.258 207.739-463.998 463.998-463.998 256.263 0 464.002 207.741 464.002 463.998 0 256.261-207.739 464-464.002 464zM512.002-16.001c-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-400 0-220.912-179.086-400-399.998-400z" />
+<glyph unicode="" glyph-name="caidan_xunzhang" d="M649.791 471.365l70.787 105.298c2.628 3.877 4.197 8.656 4.203 13.803v139.135c0 27.283-22.199 49.47-49.47 49.47h-330.637c-27.272 0-49.47-22.187-49.47-49.47v-139.134c0.005-5.026 1.5-9.701 4.068-13.609l-0.058 0.094 69.518-106.517c-72.239-46.568-120.17-127.733-120.17-219.891 0-144.158 117.272-261.432 261.431-261.432s261.432 117.272 261.432 261.431c0 92.777-48.581 174.409-121.634 220.822zM509.992 511.976c-0.018 0-0.040 0-0.062 0-19.184 0-37.885-2.066-55.893-5.987l1.727 0.315v223.298h108.457v-223.298c-16.281 3.606-34.982 5.672-54.164 5.672-0.022 0-0.045 0-0.067 0h0.003zM675.311 598.004l-61.62-91.659v223.257h61.62v-131.598zM344.674 729.602h61.62v-226.209l-61.62 94.431v131.779zM509.992 38.582c-116.887 0-211.962 95.087-211.962 211.961s95.074 211.962 211.962 211.962 211.962-95.087 211.962-211.962-95.075-211.962-211.961-211.962zM509.993 423.338c-95.268 0-172.782-77.513-172.782-172.794s77.513-172.795 172.782-172.795c95.292 0 172.805 77.514 172.805 172.795s-77.513 172.794-172.805 172.794zM509.993 127.219c-67.997 0-123.312 55.328-123.312 123.325s55.315 123.323 123.312 123.323 123.337-55.327 123.337-123.324-55.339-123.325-123.337-123.325z" />
+<glyph unicode="" glyph-name="pulldown" d="M512-64c-247.040 0-448 200.96-448 448s200.96 448 448 448 448-200.96 448-448-200.96-448-448-448zM512 768c-211.744 0-384-172.256-384-384s172.256-384 384-384c211.744 0 384 172.256 384 384s-172.256 384-384 384zM694.56 373.856c-12.544 12.608-33.376 12.64-45.952 0.064l-104.608-103.904v306.656c0 17.76-14.208 32.16-32 32.16-17.76 0-32-14.4-32-32.16v-308.32l-105.216 106.688c-12.48 12.608-32.704 12.736-45.312 0.256-12.64-12.512-12.672-32.896-0.192-45.504l159.36-161.056c6.272-6.336 14.592-9.568 22.88-9.568 8.16 0 16.384 3.168 22.624 9.312 0.032 0.064 0.032 0.064 0.064 0.128 0.032 0 0.064 0 0.096 0.064l160.192 159.68c12.576 12.544 12.608 32.928 0.064 45.504z" />
+<glyph unicode="" glyph-name="pullup" d="M512-64c-247.040 0-448 200.96-448 448s200.96 448 448 448 448-200.96 448-448-200.96-448-448-448zM512 768c-211.744 0-384-172.256-384-384s172.256-384 384-384c211.744 0 384 172.256 384 384s-172.256 384-384 384zM694.464 437.632l-158.496 160.256c-9.344 9.472-23.168 11.84-34.784 7.136-0.736-0.288-1.312-0.992-2.016-1.344-2.976-1.472-5.952-3.072-8.448-5.536-0.032-0.032-0.032-0.064-0.064-0.096s-0.064-0.032-0.096-0.064l-159.36-158.912c-12.512-12.48-12.544-32.736-0.064-45.248 6.24-6.272 14.464-9.408 22.656-9.408 8.16 0 16.352 3.104 22.592 9.344l103.616 103.296v-305.056c0-17.696 14.336-32 32-32s32 14.304 32 32v306.752l104.96-106.112c6.24-6.336 14.496-9.504 22.752-9.504 8.128 0 16.256 3.072 22.496 9.248 12.576 12.416 12.704 32.672 0.256 45.248z" />
+<glyph unicode="" glyph-name="refresh" d="M939.456 639.776c-16.672 5.984-34.976-2.72-40.896-19.36l-24.768-69.344c-28.992 65.312-74.784 122.72-133.088 165.92-185.376 137.28-449.408 99.776-588.384-83.648-67.264-88.768-95.616-198.176-79.84-308.032 15.84-110.304 74.208-207.776 164.352-274.496 75.424-55.808 163.808-82.752 251.456-82.752 128.032 0 254.56 57.44 336.992 166.272 36.48 48.128 61.472 102.080 74.208 160.416 3.776 17.248-7.136 34.304-24.416 38.080-17.216 3.712-34.304-7.104-38.080-24.416-10.784-49.184-31.872-94.752-62.72-135.456-117.888-155.52-341.92-187.232-499.392-70.72-76.288 56.48-125.664 138.912-139.072 232.16-13.344 92.8 10.656 185.248 67.488 260.288 117.856 155.584 341.792 187.424 499.328 70.848 57.024-42.24 99.84-100.608 122.976-166.624l-109.984 42.944c-16.416 6.368-35.008-1.696-41.44-18.176s1.728-35.008 18.176-41.44l161.856-63.2c3.808-1.472 7.744-2.208 11.616-2.208 0.544 0 1.024 0.192 1.568 0.224 1.216-0.128 2.432-0.64 3.648-0.64 13.12 0 25.472 8.16 30.112 21.248l57.632 161.184c5.984 16.672-2.688 35.008-19.328 40.928z" />
+<glyph unicode="" glyph-name="qrcode1" d="M419.2 736v-256h-256v256h256M419.2 800h-256c-35.2 0-64-28.8-64-64v-256c0-35.2 28.8-64 64-64h256c35.2 0 64 28.8 64 64v256c0 35.2-28.8 64-64 64zM899.2 736v-256h-256v256h256M899.2 800h-256c-35.2 0-64-28.8-64-64v-256c0-35.2 28.8-64 64-64h256c35.2 0 64 28.8 64 64v256c0 35.2-28.8 64-64 64zM419.2 288v-256h-256v256h256M419.2 352h-256c-35.2 0-64-28.8-64-64v-256c0-35.2 28.8-64 64-64h256c35.2 0 64 28.8 64 64v256c0 35.2-28.8 64-64 64zM611.2 0c-19.2 0-32 12.8-32 32v256c0 19.2 12.8 32 32 32s32-12.8 32-32v-256c0-16-16-32-32-32zM768 0c-19.2 0-32 12.8-32 32v256c0 19.2 12.8 32 32 32s32-12.8 32-32v-256c0-16-16-32-32-32zM931.2 0c-19.2 0-32 12.8-32 32v256c0 19.2 12.8 32 32 32s32-12.8 32-32v-256c0-16-16-32-32-32z" />
+<glyph unicode="" glyph-name="profile1" d="M768 512c0 160-128 288-288 288s-288-128-288-288c0-108.8 57.6-201.6 147.2-249.6-121.6-48-214.4-153.6-240-288-3.2-16 6.4-35.2 25.6-38.4h3.2c16 0 28.8 9.6 32 25.6 28.8 150.4 160 259.2 313.6 262.4h6.4c160 0 288 128 288 288zM256 512c0 124.8 99.2 224 224 224s224-99.2 224-224c0-121.6-99.2-220.8-220.8-224h-9.6c-121.6 3.2-217.6 102.4-217.6 224zM896 192h-256c-19.2 0-32-12.8-32-32v-192c0-19.2 12.8-32 32-32h256c19.2 0 32 12.8 32 32v192c0 16-12.8 32-32 32zM864 0h-192v128h192v-128zM736 32h32c19.2 0 32 12.8 32 32s-12.8 32-32 32h-32c-19.2 0-32-12.8-32-32s16-32 32-32z" />
+<glyph unicode="" glyph-name="home1" d="M96 416c-9.6 0-19.2 3.2-25.6 12.8-12.8 12.8-9.6 35.2 3.2 44.8l377.6 310.4c35.2 25.6 86.4 25.6 118.4 0l377.6-307.2c12.8-9.6 16-32 3.2-44.8s-32-16-44.8-3.2l-374.4 300.8c-9.6 6.4-28.8 6.4-38.4 0l-377.6-307.2c-6.4-6.4-12.8-6.4-19.2-6.4zM816-32h-208c-19.2 0-32 12.8-32 32v150.4c0 22.4-38.4 44.8-67.2 44.8s-64-19.2-64-44.8v-150.4c0-19.2-12.8-32-32-32h-201.6c-48 0-83.2 35.2-83.2 80v304c0 19.2 12.8 32 32 32s32-12.8 32-32v-304c0-9.6 6.4-16 19.2-16h172.8v118.4c0 64 67.2 108.8 128 108.8s131.2-44.8 131.2-108.8v-118.4h176c9.6 0 16 0 16 19.2v300.8c0 19.2 12.8 32 32 32s32-12.8 32-32v-304c-3.2-48-35.2-80-83.2-80z" />
+<glyph unicode="" glyph-name="homefill" d="M947.2 473.6l-374.4 307.2c-32 25.6-86.4 25.6-118.4 0l-377.6-310.4c-12.8-6.4-16-22.4-9.6-35.2 3.2-12.8 16-19.2 28.8-19.2h32v-364.8c0-48 35.2-83.2 83.2-83.2h204.8c19.2 0 32 12.8 32 32v147.2c0 22.4 35.2 44.8 64 44.8s67.2-22.4 67.2-44.8v-147.2c0-19.2 12.8-32 32-32h208c48 0 80 32 80 83.2v364.8h32c12.8 0 25.6 9.6 28.8 22.4s0 25.6-12.8 35.2z" />
+<glyph unicode="" glyph-name="roundaddfill" d="M828.704 699.424c-84.608 84.192-197.056 130.56-316.704 130.56s-232.128-46.368-316.736-130.56c-84.64-84.224-131.264-196.256-131.264-315.424 0-119.2 46.624-231.2 131.232-315.424 84.608-84.192 197.088-130.56 316.736-130.56s232.128 46.368 316.704 130.56c84.672 84.256 131.296 196.288 131.264 315.456 0.032 119.168-46.56 231.168-131.232 315.392zM736 352h-192v-192c0-17.696-14.336-32-32-32s-32 14.304-32 32v192h-192c-17.664 0-32 14.336-32 32s14.336 32 32 32h192v192c0 17.664 14.336 32 32 32s32-14.336 32-32v-192h192c17.696 0 32-14.336 32-32s-14.304-32-32-32z" />
+<glyph unicode="" glyph-name="roundadd" d="M512-62.016c-119.648 0-232.128 46.368-316.736 130.56-84.64 84.256-131.264 196.256-131.264 315.456 0 119.168 46.624 231.2 131.232 315.424 84.608 84.192 197.088 130.56 316.736 130.56s232.128-46.368 316.704-130.56c84.672-84.224 131.264-196.256 131.264-315.392 0.032-119.2-46.592-231.232-131.264-315.456-84.544-84.192-197.024-130.592-316.672-130.592zM512 766.016c-102.624 0-199.072-39.744-271.584-111.936-72.48-72.128-112.416-168.064-112.416-270.080s39.904-197.952 112.384-270.048c72.512-72.192 168.96-111.936 271.584-111.936 102.592 0 199.072 39.744 271.584 111.936 72.48 72.16 112.416 168.064 112.384 270.080 0 102.016-39.904 197.92-112.384 270.016-72.48 72.192-168.96 111.968-271.552 111.968zM736 416h-192v192c0 17.664-14.336 32-32 32s-32-14.336-32-32v-192h-192c-17.664 0-32-14.336-32-32s14.336-32 32-32h192v-192c0-17.696 14.336-32 32-32s32 14.304 32 32v192h192c17.696 0 32 14.336 32 32s-14.304 32-32 32z" />
+<glyph unicode="" glyph-name="fuxuankuang" d="M768 768h-512c-70.4 0-128-57.6-128-128v-512c0-70.4 57.6-128 128-128h512c70.4 0 128 57.6 128 128v512c0 70.4-57.6 128-128 128zM832 128c0-35.2-28.8-64-64-64h-512c-35.2 0-64 28.8-64 64v512c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64v-512z" />
+<glyph unicode="" glyph-name="wefill" d="M768 163.2c-6.4 0-12.8 3.2-19.2 6.4-12.8 9.6-16 32-6.4 44.8 38.4 48 57.6 105.6 57.6 166.4 0 64-25.6 128-70.4 176-12.8 12.8-9.6 32 3.2 44.8s32 9.6 44.8-3.2c54.4-60.8 86.4-140.8 86.4-220.8 0-73.6-25.6-147.2-73.6-204.8-3.2-6.4-12.8-9.6-22.4-9.6zM275.2 163.2c-9.6 0-16 3.2-22.4 9.6-57.6 57.6-92.8 134.4-92.8 214.4s32 156.8 92.8 214.4c12.8 12.8 32 12.8 44.8 0s12.8-32 0-44.8c-44.8-48-73.6-108.8-73.6-169.6s25.6-121.6 73.6-169.6c12.8-12.8 12.8-32 0-44.8-6.4-6.4-12.8-9.6-22.4-9.6zM224 0c-6.4 0-16 3.2-22.4 6.4l-48 48c-76.8 92.8-121.6 208-121.6 329.6s44.8 240 124.8 329.6c16 16 28.8 32 44.8 44.8 16 9.6 35.2 9.6 48-3.2s9.6-32-3.2-44.8c-16-12.8-28.8-25.6-41.6-41.6-70.4-76.8-108.8-179.2-108.8-284.8s38.4-204.8 105.6-284.8c12.8-16 25.6-28.8 41.6-41.6 12.8-12.8 16-32 3.2-44.8-3.2-6.4-12.8-12.8-22.4-12.8zM800 0c-9.6 0-16 3.2-22.4 9.6-12.8 12.8-12.8 32 0 44.8 28.8 28.8 54.4 54.4 64 67.2 57.6 76.8 86.4 166.4 86.4 262.4 0 102.4-35.2 201.6-99.2 278.4-16 19.2-32 35.2-51.2 51.2-12.8 12.8-16 32-3.2 44.8s32 16 44.8 3.2c22.4-19.2 41.6-38.4 57.6-57.6 73.6-89.6 115.2-201.6 115.2-320 0-108.8-35.2-211.2-99.2-297.6-16-22.4-51.2-57.6-70.4-76.8-6.4-6.4-12.8-9.6-22.4-9.6zM672 489.6c-19.2 16-44.8 25.6-70.4 22.4s-48-16-64-35.2l-25.6-32-25.6 32c-32 41.6-92.8 48-134.4 12.8-19.2-16-32-41.6-32-67.2-3.2-25.6 6.4-51.2 22.4-73.6l96-118.4c19.2-22.4 44.8-35.2 70.4-35.2h3.2c28.8-3.2 57.6 12.8 76.8 35.2l96 118.4c32 41.6 25.6 105.6-12.8 140.8z" />
+<glyph unicode="" glyph-name="sort" d="M384 576h512c17.696 0 32 14.336 32 32s-14.304 32-32 32h-512c-17.664 0-32-14.336-32-32s14.336-32 32-32zM896 416h-512c-17.664 0-32-14.336-32-32s14.336-32 32-32h512c17.696 0 32 14.336 32 32s-14.304 32-32 32zM896 192h-512c-17.664 0-32-14.304-32-32s14.336-32 32-32h512c17.696 0 32 14.304 32 32s-14.304 32-32 32zM128 608c0 35.346 28.654 64 64 64s64-28.654 64-64v0c0-35.346-28.654-64-64-64s-64 28.654-64 64v0zM128 384c0 35.346 28.654 64 64 64s64-28.654 64-64v0c0-35.346-28.654-64-64-64s-64 28.654-64 64v0zM128 160c0 35.346 28.654 64 64 64s64-28.654 64-64v0c0-35.346-28.654-64-64-64s-64 28.654-64 64v0z" />
+<glyph unicode="" glyph-name="repair" d="M816.672-41.344c-8.192 0-16.384 3.136-22.624 9.376l-213.952 213.952c-12.512 12.512-12.512 32.736 0 45.248s32.736 12.512 45.248 0l191.328-191.328 33.408 33.376-190.848 190.848c-12.512 12.512-12.512 32.736 0 45.248s32.736 12.512 45.248 0l213.472-213.472c6.016-6.016 9.376-14.112 9.376-22.624s-3.36-16.64-9.376-22.624l-78.656-78.624c-6.272-6.24-14.464-9.376-22.624-9.376zM590.752 768c0 0.032 0 0.064 0 0.064 1.472 4.16 2.048 8.352 1.792 12.512 0 0 0 0 0 0s-0.032 0.064-0.032 0.096c-0.256 4.128-1.312 8.096-3.104 11.776-0.352 0.704-0.896 1.248-1.28 1.92-1.632 2.848-3.456 5.472-5.952 7.712-0.928 0.864-2.080 1.376-3.136 2.112-1.92 1.376-3.616 3.008-5.888 3.968-0.608 0.256-1.248 0.384-1.888 0.608-0.032 0-0.064 0.032-0.096 0.032-114.144 46.624-243.808 20.704-331.072-66.592-0.768-0.736-1.056-1.792-1.76-2.624-0.864-0.704-1.888-0.992-2.688-1.792l-161.984-161.344c-6.016-6.016-9.408-14.144-9.408-22.656s3.36-16.64 9.376-22.656l98.304-98.304c6.016-6.016 14.144-9.376 22.624-9.376s16.64 3.36 22.624 9.376l56.032 56.032 68.192-68.224c6.24-6.24 14.432-9.376 22.624-9.376s16.384 3.136 22.624 9.376c12.512 12.48 12.512 32.736 0 45.248l-90.816 90.848c-12.512 12.512-32.736 12.512-45.248 0l-56.032-56.032-52.992 53.024 139.264 138.72c0.832 0.8 1.12 1.888 1.824 2.752 0.864 0.704 1.92 0.992 2.72 1.824 40 39.936 91.296 63.072 144.864 68.768-2.208-1.664-4.384-3.392-6.56-5.12-8.96-6.784-17.632-14.016-25.664-22.048-0.544-0.544-0.736-1.248-1.216-1.824-19.232-19.36-35.936-41.024-49.568-64.512-2.464-4.224-4.768-8.448-7.008-12.736l0.416-0.224c-12.288-24.64-12.288-53.664 0.48-78.144 1.536-2.944 3.52-5.504 5.76-7.744 0.768-0.96 1.088-2.112 1.984-2.976l70.432-70.464c6.24-6.24 14.432-9.376 22.624-9.376s16.384 3.136 22.624 9.376c12.512 12.48 12.512 32.736 0 45.248l-67.072 67.072c-2.624 6.112-2.688 13.024 0.448 18.976 0.16 0.288 0.128 0.608 0.256 0.896 1.44 2.656 2.848 5.344 4.384 7.968 11.008 18.944 24.48 36.448 40.064 52.032 4.096 4.096 8.608 7.648 12.96 11.456 30.144 25.28 67.232 40.864 106.816 43.136 0.576 0.032 1.056 0.352 1.632 0.416 3.616 0.384 7.104 1.184 10.368 2.72 0.512 0.256 0.896 0.64 1.376 0.896 3.168 1.696 6.048 3.776 8.512 6.496 0.256 0.288 0.384 0.64 0.608 0.928 2.080 2.464 4.128 4.928 5.44 8.064 0.288 0.576 0.192 1.152 0.416 1.696zM289.536-64.032c-28.384 0-56.928 6.368-82.624 18.432-9.408 4.448-16.096 13.184-17.888 23.456-1.792 10.24 1.504 20.736 8.896 28.128l88.064 88.096-33.056 33.024-87.52-87.488c-7.424-7.424-18.048-10.848-28.384-8.832-10.336 1.888-19.104 8.704-23.392 18.304-32.736 72.64-17.088 159.072 38.944 215.104 50.048 50.080 126.048 68.384 193.952 47.040l238.688 238.72c-21.28 67.712-3.648 143.264 47.040 193.952 36.128 36.16 84.256 56.064 135.456 56.064 27.264 0 54.816-5.92 79.648-17.12 9.568-4.32 16.448-13.056 18.304-23.392 1.92-10.336-1.408-20.96-8.832-28.384l-88.8-88.8 33.024-33.056 89.376 89.344c7.392 7.392 17.92 10.72 28.128 8.896 10.272-1.792 19.040-8.48 23.456-17.888 34.496-73.376 19.424-160.96-37.536-217.92-36.096-36.096-84.128-56-135.296-56-20.704 0-41.536 3.392-61.216 9.952l-237.12-237.12c22.688-68.48 5.44-145.024-46.048-196.544-36.064-36.096-84.128-55.968-135.264-55.968zM282.592 0.16c36.352-2.112 71.36 11.392 96.992 37.024 37.952 37.952 47.936 96.384 24.864 145.408-5.76 12.224-3.232 26.72 6.336 36.256l266.816 266.848c9.536 9.536 24.032 12.032 36.256 6.336 47.936-22.56 108-12.544 145.408 24.864 25.952 25.92 38.784 61.408 36.992 96.96l-72.576-72.544c-6.016-6.016-14.112-9.376-22.624-9.376v0c-8.512 0-16.64 3.36-22.624 9.376l-78.272 78.272c-12.512 12.512-12.512 32.736 0 45.248l71.040 71.040c-35.072 0.896-68.8-12.384-93.696-37.28-37.92-37.92-48.064-94.272-25.856-143.552 5.44-12.128 2.848-26.368-6.56-35.776l-267.936-267.968c-9.376-9.376-23.648-11.936-35.776-6.56-47.68 21.504-106.624 11.104-143.584-25.856-25.504-25.536-38.464-59.392-37.408-93.856l69.92 69.92c12.512 12.512 32.736 12.512 45.248 0l78.304-78.272c6.016-6.016 9.376-14.112 9.376-22.624 0-8.48-3.36-16.64-9.376-22.624l-71.264-71.264z" />
+<glyph unicode="" glyph-name="shujudaping" d="M120.406 675.469v-523.031h776.719v523.031h-776.719zM865.344 184.125h-713.25v459.656h713.25v-459.656zM706.813 516.937c-17.531 0-31.688-14.156-31.688-31.688 0-3.844 0.656-7.5 1.875-10.875l-121.313-94.313c-5.813 6.188-14.063 10.125-23.25 10.125-8.719 0-16.688-3.563-22.406-9.281l-59.625 59.625c1.781 3.938 2.813 8.438 2.813 13.031 0 17.531-14.156 31.688-31.688 31.688s-31.688-14.156-31.688-31.688c0-4.031 0.75-7.875 2.156-11.438l-74.25-61.875c-5.813 6.094-13.969 9.938-22.969 9.938-17.531 0-31.688-14.156-31.688-31.688s14.156-31.688 31.688-31.688c17.531 0 31.688 14.156 31.688 31.688 0 4.031-0.75 7.875-2.156 11.438l74.25 61.875c5.813-6.094 13.969-9.938 22.969-9.938 8.719 0 16.688 3.563 22.406 9.281l59.625-59.625c-1.781-3.938-2.813-8.438-2.813-13.031 0-17.531 14.156-31.688 31.688-31.688s31.688 14.156 31.688 31.688c0 3.844-0.656 7.5-1.875 10.875l121.406 94.313c5.813-6.188 14.063-10.125 23.25-10.125 17.531 0 31.688 14.156 31.688 31.688s-14.25 31.688-31.781 31.688zM294.688 342.656c-8.719 0-15.844 7.125-15.844 15.844s7.125 15.844 15.844 15.844c8.719 0 15.844-7.125 15.844-15.844s-7.031-15.844-15.844-15.844zM421.531 437.719c-8.719 0-15.844 7.125-15.844 15.844s7.125 15.844 15.844 15.844 15.844-7.125 15.844-15.844-7.125-15.844-15.844-15.844zM532.531 342.656c-8.719 0-15.844 7.125-15.844 15.844s7.125 15.844 15.844 15.844 15.844-7.125 15.844-15.844-7.125-15.844-15.844-15.844zM706.813 469.406c-8.719 0-15.844 7.125-15.844 15.844s7.125 15.844 15.844 15.844c8.719 0 15.844-7.125 15.844-15.844s-7.031-15.844-15.844-15.844zM593.938 136.594l33.656-95.063h-253.594l33.656 95.063h-33.469l-47.719-126.844h348.75l-47.719 126.844h-33.563zM849.5 627.937h-681.563v-15.844h681.563v15.844z" />
+<glyph unicode="" glyph-name="xiangxia1" d="M163.397 606.831c-40.578 0-66.525-54.185-35.441-85.258l349.262-349.278c20.032-20.032 49.824-20.032 69.854 0l349.274 349.278c30.305 30.294 6.678 85.258-34.929 85.258h-698.021zM959.524 37.208" />
+<glyph unicode="" glyph-name="xiangyou" d="M289.169 35.397c0-40.578 54.185-66.525 85.258-35.441l349.278 349.262c20.032 20.032 20.032 49.824 0 69.854l-349.278 349.274c-30.294 30.305-85.258 6.678-85.258-34.929v-698.021zM858.792 831.524" />
+<glyph unicode="" glyph-name="dian" d="M352 384c0-88.366 71.634-160 160-160s160 71.634 160 160v0c0 88.366-71.634 160-160 160s-160-71.634-160-160v0z" />
+<glyph unicode="" glyph-name="search_list_light" d="M953.6 100.267l-145.067 192c53.333 44.8 89.6 113.067 89.6 187.733-2.133 136.533-110.933 245.333-247.467 245.333-134.4 0-245.333-108.8-245.333-245.333s110.933-245.333 245.333-245.333c44.8 0 85.333 12.8 121.6 32v-2.133l145.067-192c4.267-6.4 10.667-8.533 17.067-8.533 4.267 0 8.533 2.133 12.8 4.267 10.667 8.533 12.8 23.467 6.4 32zM448 480c0 110.933 91.733 202.667 202.667 202.667s202.667-91.733 202.667-202.667-91.733-202.667-202.667-202.667-202.667 91.733-202.667 202.667zM128 618.667h192c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333h-192c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333zM128 405.333c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h128c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333h-128zM467.2 194.133h-341.333c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h341.333c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333z" />
+<glyph unicode="" glyph-name="round_list_light" d="M512 832c-247.467 0-448-200.533-448-448s200.533-448 448-448 448 200.533 448 448-200.533 448-448 448zM512-21.333c-224 0-405.333 181.333-405.333 405.333s181.333 405.333 405.333 405.333 405.333-181.333 405.333-405.333-181.333-405.333-405.333-405.333zM746.667 554.667h-298.667c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h298.667c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333zM277.333 533.333c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0zM746.667 405.333h-298.667c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h298.667c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333zM277.333 384c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0zM746.667 256h-298.667c-12.8 0-21.333-8.533-21.333-21.333s8.533-21.333 21.333-21.333h298.667c12.8 0 21.333 8.533 21.333 21.333s-8.533 21.333-21.333 21.333zM277.333 234.667c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0z" />
+<glyph unicode="" glyph-name="star-fill" d="M752-43.2c-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.8s-30.4 40-25.6 64l43.2 224-164.8 153.6c-17.6 17.6-24 44.8-17.6 67.2 8 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.2l-164.8-155.2 41.6-224c4.8-25.6-6.4-49.6-25.6-64-9.6-8-22.4-12.8-36.8-12.8z" />
+<glyph unicode="" glyph-name="rate" d="M959.008 489.984l-308 47.008-139.008 295.008-139.008-295.008-308-47.008 223.008-228-52.992-324 276.992 152.992 276.992-152.992-52.992 324zM512 156l-208-116.992 40 235.008-179.008 182.016 242.016 32 104.992 224 104-224 240.992-34.016-176.992-180.992 36.992-235.008z" />
+<glyph unicode="" glyph-name="move-up" d="M704 384v-384h64v384h160l-192 192-192-192zM64 704h96v-64h-96v64zM192 704h96v-64h-96v64zM320 704h64v-96h-64v96zM64 480h64v-96h-64v96zM160 448h96v-64h-96v64zM288 448h96v-64h-96v64zM64 608h64v-96h-64v96zM320 576h64v-96h-64v96zM320 192v-192h-192v192h192zM384 256h-320v-320h320v320z" />
+<glyph unicode="" glyph-name="move-down" d="M768 192v384h-64v-384h-160l192-192 192 192zM320 640v-192h-192v192h192zM384 704h-320v-320h320v320zM64 256h96v-64h-96v64zM192 256h96v-64h-96v64zM320 256h64v-96h-64v96zM64 32h64v-96h-64v96zM160 0h96v-64h-96v64zM288 0h96v-64h-96v64zM64 160h64v-96h-64v96zM320 128h64v-96h-64v96z" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.ttf b/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.ttf
new file mode 100755
index 0000000..78bacd1
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.ttf
Binary files differ
diff --git a/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.woff b/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.woff
new file mode 100755
index 0000000..2b54645
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/dtree/font/dtreefont.woff
Binary files differ
diff --git a/payapi/src/main/resources/static/custom/module/dtree/font/icons.json b/payapi/src/main/resources/static/custom/module/dtree/font/icons.json
new file mode 100755
index 0000000..bdb595c
--- /dev/null
+++ b/payapi/src/main/resources/static/custom/module/dtree/font/icons.json
@@ -0,0 +1,283 @@
+{
+ "data": [{
+ "cls": "dtree-icon-xiangxia1",
+ "uncode": "e771"
+ },
+ {
+ "cls": "dtree-icon-xiangyou",
+ "uncode": "e78f"
+ },
+ {
+ "cls": "dtree-icon-jian",
+ "uncode": "e656"
+ },
+ {
+ "cls": "dtree-icon-jia",
+ "uncode": "e657"
+ },
+ {
+ "cls": "dtree-icon-weibiaoti5",
+ "uncode": "e618"
+ },
+ {
+ "cls": "dtree-icon-wenjianjiazhankai",
+ "uncode": "e60e"
+ },
+ {
+ "cls": "dtree-icon-dian",
+ "uncode": "e7a5"
+ },
+ {
+ "cls": "dtree-icon-yonghu",
+ "uncode": "e603"
+ },
+ {
+ "cls": "dtree-icon-fenzhijigou",
+ "uncode": "e658"
+ },
+ {
+ "cls": "dtree-icon-fenguangbaobiao",
+ "uncode": "e655"
+ },
+ {
+ "cls": "dtree-icon-xinxipilu",
+ "uncode": "e620"
+ },
+ {
+ "cls": "dtree-icon-shuye1",
+ "uncode": "e61e"
+ },
+ {
+ "cls": "dtree-icon-caidan_xunzhang",
+ "uncode": "e68e"
+ },
+ {
+ "cls": "dtree-icon-normal-file",
+ "uncode": "e60c"
+ },
+ {
+ "cls": "dtree-icon-roundclose",
+ "uncode": "e65c"
+ },
+ {
+ "cls": "dtree-icon-bianji",
+ "uncode": "e602"
+ },
+ {
+ "cls": "dtree-icon-roundadd",
+ "uncode": "e6d9"
+ },
+ {
+ "cls": "dtree-icon-fuxuankuangxuanzhong",
+ "uncode": "e652"
+ },
+ {
+ "cls": "dtree-icon-fuxuankuang",
+ "uncode": "e6f2"
+ },
+ {
+ "cls": "dtree-icon-fuxuankuang-banxuan",
+ "uncode": "e607"
+ },
+ {
+ "cls": "dtree-icon-search_list_light",
+ "uncode": "e807"
+ },
+ {
+ "cls": "dtree-icon-move-up",
+ "uncode": "ea47"
+ },
+ {
+ "cls": "dtree-icon-move-down",
+ "uncode": "ea48"
+ },
+ {
+ "cls": "dtree-icon-delete1",
+ "uncode": "e640"
+ },
+ {
+ "cls": "dtree-icon-refresh",
+ "uncode": "e6a4"
+ },
+ {
+ "cls": "dtree-icon-roundcheckfill",
+ "uncode": "e659"
+ },
+ {
+ "cls": "dtree-icon-roundclosefill",
+ "uncode": "e65b"
+ },
+ {
+ "cls": "dtree-icon-roundcheck",
+ "uncode": "e65a"
+ },
+ {
+ "cls": "dtree-icon-pulldown",
+ "uncode": "e6a0"
+ },
+ {
+ "cls": "dtree-icon-pullup",
+ "uncode": "e6a1"
+ },
+ {
+ "cls": "dtree-icon-set-sm",
+ "uncode": "e621"
+ },
+ {
+ "cls": "dtree-icon-rate",
+ "uncode": "e833"
+ },
+ {
+ "cls": "dtree-icon-jian1",
+ "uncode": "e600"
+ },
+ {
+ "cls": "dtree-icon-jia1",
+ "uncode": "e601"
+ },
+ {
+ "cls": "dtree-icon-shijian",
+ "uncode": "e606"
+ },
+ {
+ "cls": "dtree-icon-check",
+ "uncode": "e645"
+ },
+ {
+ "cls": "dtree-icon-close",
+ "uncode": "e646"
+ },
+ {
+ "cls": "dtree-icon-favorfill",
+ "uncode": "e64b"
+ },
+ {
+ "cls": "dtree-icon-favor",
+ "uncode": "e64c"
+ },
+ {
+ "cls": "dtree-icon-roundrightfill",
+ "uncode": "e65d"
+ },
+ {
+ "cls": "dtree-icon-roundright",
+ "uncode": "e65e"
+ },
+ {
+ "cls": "dtree-icon-samefill",
+ "uncode": "e671"
+ },
+ {
+ "cls": "dtree-icon-same",
+ "uncode": "e672"
+ },
+ {
+ "cls": "dtree-icon-qrcode1",
+ "uncode": "e6b0"
+ },
+ {
+ "cls": "dtree-icon-profile1",
+ "uncode": "e6b7"
+ },
+ {
+ "cls": "dtree-icon-home1",
+ "uncode": "e6b8"
+ },
+ {
+ "cls": "dtree-icon-homefill",
+ "uncode": "e6bb"
+ },
+ {
+ "cls": "dtree-icon-roundaddfill",
+ "uncode": "e6d8"
+ },
+ {
+ "cls": "dtree-icon-wefill",
+ "uncode": "e6f5"
+ },
+ {
+ "cls": "dtree-icon-sort",
+ "uncode": "e701"
+ },
+ {
+ "cls": "dtree-icon-round_list_light",
+ "uncode": "e82b"
+ },
+ {
+ "cls": "dtree-icon-search2",
+ "uncode": "e615"
+ },
+ {
+ "cls": "dtree-icon-close1",
+ "uncode": "1006"
+ },
+ {
+ "cls": "dtree-icon-close-fill",
+ "uncode": "1007"
+ },
+ {
+ "cls": "dtree-icon-chart-screen",
+ "uncode": "e62a"
+ },
+ {
+ "cls": "dtree-icon-star",
+ "uncode": "e608"
+ },
+ {
+ "cls": "dtree-icon-ok-circle",
+ "uncode": "1005"
+ },
+ {
+ "cls": "dtree-icon-add-circle",
+ "uncode": "e61f"
+ },
+ {
+ "cls": "dtree-icon-about",
+ "uncode": "e623"
+ },
+ {
+ "cls": "dtree-icon-circle1",
+ "uncode": "e687"
+ },
+ {
+ "cls": "dtree-icon-radio",
+ "uncode": "e688"
+ },
+ {
+ "cls": "dtree-icon-star-fill",
+ "uncode": "e832"
+ },
+ {
+ "cls": "dtree-icon-shujudaping",
+ "uncode": "e742"
+ },
+ {
+ "cls": "dtree-icon-share3",
+ "uncode": "e641"
+ },
+ {
+ "cls": "dtree-icon-youjian",
+ "uncode": "e642"
+ },
+ {
+ "cls": "dtree-icon-repair",
+ "uncode": "e738"
+ },
+ {
+ "cls": "dtree-icon-evaluate",
+ "uncode": "e674"
+ },
+ {
+ "cls": "dtree-icon-like",
+ "uncode": "e66c"
+ },
+ {
+ "cls": "dtree-icon-layim-theme",
+ "uncode": "e61b"
+ },
+ {
+ "cls": "dtree-icon-xiangmuxiaoxi",
+ "uncode": "e60f"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/custom.js b/payapi/src/main/resources/static/libs/custom.js
index 12564c2..d034401 100644
--- a/payapi/src/main/resources/static/libs/custom.js
+++ b/payapi/src/main/resources/static/libs/custom.js
@@ -66,6 +66,7 @@
.addNewDict("sexList")
.addNewDict("accountStatusList")
.addNewDict("allSubjectList")
+ .addNewDict("transcodeList")
},
getDict: function (dictType) {
var dict, that = this;
@@ -101,4 +102,10 @@
root.dateFormat = function (str) {
return str.replace(/^(\d{4})(\d{2})(\d{2})$/, '$1-$2-$3'); //yyyyMMdd --> yyyy-MM-dd
}
+
+ root.isempty = function (s) {
+ if (s == null || s.length == 0)
+ return true;
+ return /\s/.test(s);
+ }
}(window));
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/css/layui.css b/payapi/src/main/resources/static/libs/layui/css/layui.css
index 825e383..b4cd9a8 100755
--- a/payapi/src/main/resources/static/libs/layui/css/layui.css
+++ b/payapi/src/main/resources/static/libs/layui/css/layui.css
@@ -1,2 +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
+/** layui-v2.5.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-body,.layui-edge,.layui-elip{overflow:hidden}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-elip,.layui-form-checkbox span,.layui-form-pane .layui-form-label{text-overflow:ellipsis;white-space:nowrap}.layui-breadcrumb,.layui-tree-btnGroup{visibility:hidden}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}.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-disabled,.layui-disabled:hover{color:#8f8f8f!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=250);src:url(../font/iconfont.eot?v=250#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=250) format('woff2'),url(../font/iconfont.woff?v=250) format('woff'),url(../font/iconfont.ttf?v=250) format('truetype'),url(../font/iconfont.svg?v=250#layui-icon) 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-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-icon-addition:before{content:"\e624"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-service:before{content:"\e626"}.layui-icon-transfer:before{content:"\e691"}.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-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{position:fixed;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-checked{background-color:#5FB878}.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}.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!important;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:#8f8f8f;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-table td[data-edit=text]{cursor:text}.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-transfer-active,.layui-transfer-box{display:inline-block;vertical-align:middle}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#e6e6e6}.layui-transfer-box{position:relative;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#666}.layui-transfer-active{margin:0 15px}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5FB878;border-color:#5FB878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#FBFBFB;border-color:#e6e6e6;color:#C9C9C9}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#f2f2f2;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.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{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-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-iconClick,.layui-tree-main{display:inline-block;vertical-align:middle}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:'';position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:'';position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#666}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:'';position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-btnGroup,.layui-tree-editInput{position:relative;vertical-align:middle;display:inline-block}.layui-tree-spread>.layui-tree-entry>.layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#666}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.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
index 6f7f0a1..0743570 100755
--- a/payapi/src/main/resources/static/libs/layui/css/layui.mobile.css
+++ b/payapi/src/main/resources/static/libs/layui/css/layui.mobile.css
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index d0d3822..d5ecb86 100755
--- a/payapi/src/main/resources/static/libs/layui/css/modules/code.css
+++ b/payapi/src/main/resources/static/libs/layui/css/modules/code.css
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index f7e690e..6b10891 100755
--- 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
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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/layer.css b/payapi/src/main/resources/static/libs/layui/css/modules/layer/default/layer.css
index 157d537..7c50462 100755
--- 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
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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/font/iconfont.eot b/payapi/src/main/resources/static/libs/layui/font/iconfont.eot
index 93b3d5a..f30753f 100755
--- a/payapi/src/main/resources/static/libs/layui/font/iconfont.eot
+++ 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
index 1c7ffe9..f407df7 100755
--- a/payapi/src/main/resources/static/libs/layui/font/iconfont.svg
+++ b/payapi/src/main/resources/static/libs/layui/font/iconfont.svg
@@ -344,6 +344,9 @@
<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="addition" unicode="" d="M544 768L480 768 480 416 128 416 128 352 480 352 480 0 544 0 544 352 895.936 352 895.936 416 544 416Z" 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" />
@@ -374,6 +377,9 @@
<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="transfer" unicode="" d="M320 768H128c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h192c35.2 0 64 28.8 64 64V704c0 35.2-28.8 64-64 64z m0-672c0-16-16-32-32-32H160c-16 0-32 16-32 32V672c0 16 16 32 32 32h128c16 0 32-16 32-32v-576z m256 544h-64c-19.2 0-32-12.8-32-32s16-32 32-32h64c19.2 0 32 12.8 32 32s-16 32-32 32z m-64-448h-64c-19.2 0-32-12.8-32-32s16-32 32-32h64c19.2 0 32 12.8 32 32s-16 32-32 32z m384 576H704c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h192c35.2 0 64 28.8 64 64V704c0 35.2-28.8 64-64 64z m0-672c0-16-16-32-32-32H736c-16 0-32 16-32 32V672c0 16 16 32 32 32h128c16 0 32-16 32-32v-576z" 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" />
@@ -452,6 +458,9 @@
<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="service" unicode="" d="M895.44035 502.006246A31.340412 31.340412 0 0 1 895.44035 512.2398499999999 383.76015 383.76015 0 0 1 127.92005 512.2398499999999a31.340412 31.340412 0 0 1 0-10.233604 167.575265 167.575265 0 0 1-127.92005-159.900062V320.359775a168.854466 168.854466 0 0 1 140.712055-163.098064A351.140537 351.140537 0 0 1 401.029357-63.400375000000054h5.756402a95.940037 95.940037 0 1 1 0 63.960025 287.180512 287.180512 0 0 0-195.717677 156.062461h35.817614A40.294816 40.294816 0 0 1 287.820112 192.43972499999995V468.747033a40.294816 40.294816 0 0 1-40.934416 39.015615H191.880075A30.061212 30.061212 0 0 1 191.880075 512.2398499999999a319.800125 319.800125 0 0 0 639.60025 0 30.061212 30.061212 0 0 1 0-3.837601h-55.005622a40.294816 40.294816 0 0 1-40.934416-39.015616V192.43972499999995a40.294816 40.294816 0 0 1 40.934416-39.015615h72.274829A170.773267 170.773267 0 0 1 1023.3604 320.359775v21.746409a167.575265 167.575265 0 0 1-127.92005 159.900062zM496.329794 0.5596500000000333a31.980012 31.980012 0 1 0-31.980013-31.980012 31.980012 31.980012 0 0 0 31.980013 31.980012zM223.860087 220.582136h-49.249219A106.813242 106.813242 0 0 0 63.960025 320.359775v21.746409a106.813242 106.813242 0 0 0 110.650843 102.33604h49.249219zM959.400375 320.359775a106.813242 106.813242 0 0 0-110.650843-102.33604h-49.24922V444.442224h49.24922A106.813242 106.813242 0 0 0 959.400375 342.106184zM650.473454 750.171143l-23.665209 8.314803a31.980012 31.980012 0 0 1-19.827608-63.960025l18.548407-7.035602a31.980012 31.980012 0 1 1 24.94441 58.843223zM305.089319 674.698314A31.980012 31.980012 0 0 1 358.17614 640.1599 202.113679 202.113679 0 0 0 511.6802 716.91193a31.980012 31.980012 0 0 1 0 63.960025 263.515303 263.515303 0 0 1-206.590881-106.173641z" 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" />
@@ -467,6 +476,9 @@
<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" />
+ <glyph glyph-name="subtraction" unicode="" d="M785 348H239c-19.8 0-36 16.2-36 36s16.2 36 36 36h546c19.8 0 36-16.2 36-36s-16.2-36-36-36z" horiz-adv-x="1024" />
+
+
</font>
diff --git a/payapi/src/main/resources/static/libs/layui/font/iconfont.ttf b/payapi/src/main/resources/static/libs/layui/font/iconfont.ttf
index 0c8b0a5..3c22a23 100755
--- a/payapi/src/main/resources/static/libs/layui/font/iconfont.ttf
+++ 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
index 786bb2a..8c660ce 100755
--- a/payapi/src/main/resources/static/libs/layui/font/iconfont.woff
+++ b/payapi/src/main/resources/static/libs/layui/font/iconfont.woff
Binary files differ
diff --git a/payapi/src/main/resources/static/libs/layui/font/iconfont.woff2 b/payapi/src/main/resources/static/libs/layui/font/iconfont.woff2
new file mode 100755
index 0000000..928d66a
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/font/iconfont.woff2
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
index 2be2c8c..684fff8 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/carousel.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/carousel.js
@@ -1,2 +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
+/** layui-v2.5.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&&(clearInterval(e.timer),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
index b33f9d6..d72b548 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/code.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/code.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index fd99bf8..9c9cccc 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/colorpicker.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/colorpicker.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index ac628df..93610f8 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/element.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/element.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index 8a80c05..9343bcc 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/flow.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/flow.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index daa8ce5..1297eb0 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/form.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/form.js
@@ -1,2 +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
+/** layui-v2.5.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=this,n=t(r+'[lay-filter="'+e+'"]');return n.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),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter="'+e+'"]').eq(0);var a={},n={},l=i.find("input,select,textarea");return layui.each(l,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];a[i]=0|a[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(n[t.name]=t.value)}}),n},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"),g=i.find("dl"),x=g.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=g.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),x.removeClass(o),y=null,x.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),T()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||$(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||""))})},T=function(){var e=g.children("dd."+s);if(e[0]){var t=e.position().top,i=g.height(),a=e.height();t>i&&g.scrollTop(t+g.scrollTop()-i+a-5),t<0&&g.scrollTop(t+g.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),g.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=g.children("dd."+s);if(g.children("dd."+o)[0]&&"next"===t){var i=g.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():g.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 T()):i(t,y)):y=null};38===t&&i("prev"),40===t&&i("next"),13===t&&(e.preventDefault(),g.children("dd."+s).trigger("click"))});var $=function(e,i,a){var n=0;layui.each(x,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===x.length;return i(l),l},q=function(e){var t=this.value,i=e.keyCode;return 9!==i&&13!==i&&37!==i&&38!==i&&39!==i&&40!==i&&($(t,function(e){e?g.find("."+r)[0]||g.append('<p class="'+r+'">无匹配项</p>'):g.find("."+r).remove()},"keyup"),""===t&&g.find("."+r).remove(),void T())};f&&k.on("keyup",q).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(){$(k.val(),function(e){d||k.val("")},"blur")},200)}),x.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=null,a=f.config.verify,s="layui-form-danger",o={},c=t(this),u=c.parents(r),d=u.find("*[lay-verify]"),v=c.parents("form")[0],h=c.attr("lay-filter");return layui.each(d,function(l,r){var o=t(this),c=o.attr("lay-verify").split("|"),u=o.attr("lay-verType"),d=o.val();if(o.removeClass(s),layui.each(c,function(t,l){var c,f="",v="function"==typeof a[l];if(a[l]){var c=v?f=a[l](d,r):!a[l][0].test(d);if(f=f||a[l][1],"required"===l&&(f=o.attr("lay-reqText")||f),c)return"tips"===u?i.tips(f,function(){return"string"==typeof o.attr("lay-ignore")||"select"!==r.tagName.toLowerCase()&&!/^checkbox|radio$/.test(r.type)?o:o.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||setTimeout(function(){r.focus()},7),o.addClass(s),e=!0}}),e)return e}),!e&&(o=f.getValue(null,u),layui.event.call(this,l,"submit("+h+")",{elem:this,form:v,field:o}))},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
index 242696a..5b0d3e8 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/jquery.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/jquery.js
@@ -1,4 +1,4 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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(){
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
index ae0a591..4b79bec 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/laydate.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/laydate.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index 96caa11..282c6c4 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/layedit.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/layedit.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index c6d5378..bc81661 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/layer.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/layer.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index fd07fda..478c11f 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/laypage.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/laypage.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index d482d4e..dd0d567 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/laytpl.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/laytpl.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index 35cfdf0..bd2fe1b 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/mobile.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/mobile.js
@@ -1,2 +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
+/** layui-v2.5.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(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
index 762fb3a..bcc103f 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/rate.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/rate.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index 446378d..c39707d 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/slider.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/slider.js
@@ -1,2 +1,2 @@
-/** layui-v2.4.5 MIT License By https://www.layui.com */
+/** layui-v2.5.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
index e9217db..51b697f 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/table.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/table.js
@@ -1,2 +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
+/** layui-v2.5.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,y,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),{config:t,reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)}}},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=function(e,a,l,n){var o=e.templet?function(){return"function"==typeof e.templet?e.templet(l):i(t(e.templet).html()||String(a)).render(l)}():a;return n?t("<div>"+o+"</div>").text():o},y="table",h=".layui-table",f="layui-hide",p="layui-none",v="layui-table-view",m=".layui-table-tool",g=".layui-table-box",b=".layui-table-init",x=".layui-table-header",k=".layui-table-body",C=".layui-table-main",w=".layui-table-fixed",T=".layui-table-fixed-l",A=".layui-table-fixed-r",L=".layui-table-total",N=".layui-table-page",S=".layui-table-sort",W="layui-table-edit",_="layui-table-hover",E=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("")},z=['<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(""),H=['<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-anim layui-anim-rotate layui-anim-loop"></i>',"</div>","{{# } }}","{{# var left, right; }}",'<div class="layui-table-header">',E(),"</div>",'<div class="layui-table-body layui-table-main">',z,"</div>","{{# if(left){ }}",'<div class="layui-table-fixed layui-table-fixed-l">','<div class="layui-table-header">',E({fixed:!0}),"</div>",'<div class="layui-table-body">',z,"</div>","</div>","{{# }; }}","{{# if(right){ }}",'<div class="layui-table-fixed layui-table-fixed-r">','<div class="layui-table-header">',E({fixed:"right"}),'<div class="layui-table-mend"></div>',"</div>",'<div class="layui-table-body">',z,"</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(""),R=t(window),F=t(document),j=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};j.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},j.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=R.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+v),o=e.elem=t(i(H).render({VIEW_CLASS:v,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(m),e.layBox=o.find(g),e.layHeader=o.find(x),e.layMain=o.find(C),e.layBody=o.find(k),e.layFixed=o.find(w),e.layFixLeft=o.find(T),e.layFixRight=o.find(A),e.layTotal=o.find(L),e.layPage=o.find(N),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(x).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},j.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])},j.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)})})},j.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="string"==typeof t?r[t]: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(""))},j.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"](f),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},j.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)})})},j.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)},j.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},j.prototype.reload=function(e){var i=this;e=e||{},delete i.haveInit,e.data&&e.data.constructor===Array&&delete i.config.data,i.config=t.extend(!0,{},i.config,e),i.render()},j.prototype.errorView=function(e){var i=this,a=i.layMain.find("."+p),l=t('<div class="'+p+'">'+(e||"Error")+"</div>");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(f),i.layMain.find("tbody").html(""),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},j.prototype.page=1,j.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)),i.loading(),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.errorView(t[n.msgName]||'返回的数据不符合规范,正确的成功状态码应为:"'+n.statusName+'": '+n.statusCode)):(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.errorView("数据接口请求异常:"+t),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,c[n.countName]),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},j.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},j.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,y=e[s.response.dataName]||[],h=[],v=[],m=[],g=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(y,function(a,l){var o=[],y=[],p=[],g=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,v=l[c];if(void 0!==v&&null!==v||(v=""),!r.colGroup){var m=['<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="'+v+'"'),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(f),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:g},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 g}return r.toolbar?i(t(r.toolbar).html()||"").render(n):u(r,v,n)}(),"</div></td>"].join("");o.push(m),r.fixed&&"right"!==r.fixed&&y.push(m),"right"===r.fixed&&p.push(m)}}),h.push('<tr data-index="'+a+'">'+o.join("")+"</tr>"),v.push('<tr data-index="'+a+'">'+y.join("")+"</tr>"),m.push('<tr data-index="'+a+'">'+p.join("")+"</tr>"))}),c.layBody.scrollTop(0),c.layMain.find("."+p).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(v.join("")),c.layFixRight.find("tbody").html(m.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 d.cache[c.key]=y,c.layPage[0==o||0===y.length&&1==n?"addClass":"removeClass"](f),r?g():0===y.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(f),g(),c.renderTotal(y),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.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},j.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))})}),t.dataTotal={};var l=[];t.eachCols(function(e,n){var o=n.field||e,r=function(){var e=n.totalRowText||"",t=parseFloat(a[o]).toFixed(2),i={};return i[o]=t,t=u(n,t,i),n.totalRow?t||e:e}(),d=['<td data-field="'+o+'" data-key="'+i.index+"-"+n.key+'" '+function(){var e=[];return n.align&&e.push('align="'+n.align+'"'),n.style&&e.push('style="'+n.style+'"'),n.minWidth&&e.push('data-minwidth="'+n.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return n.hide&&e.push(f),n.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','<div class="layui-table-cell laytable-cell-'+function(){var e=i.index+"-"+n.key;return"normal"===n.type?e:e+" laytable-cell-"+n.type}()+'">'+r,"</div></td>"].join("");n.field&&(t.dataTotal[o]=r),l.push(d)}),t.layTotal.find("tbody").html("<tr>"+l.join("")+"</tr>")}},j.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},j.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},j.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)},j.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},u=c.config,h=u.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},u.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[u.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,y,"sort("+h+")",{field:n,type:i})},j.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(b).remove()):(i.layInit=t(['<div class="layui-table-init">','<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>',"</div>"].join("")),i.layBox.append(i.layInit)))},j.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)},j.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)))},j.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})},j.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=R.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-=t.layPage.outerHeight()||41),t.layMain.css("height",e-2))},j.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},j.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(k).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](f),e.layFixRight.css("right",a-1)},j.prototype.events=function(){var e,i=this,a=i.config,o=t("body"),c={},s=i.layHeader.find("th"),h=".layui-table-cell",p=a.elem.attr("lay-filter");i.layTool.on("click","*[lay-event]",function(e){var o=t(this),c=o.attr("lay-event"),s=function(e){var l=t(e.list),n=t('<ul class="layui-table-tool-panel"></ul>');n.html(l),a.height&&n.css("max-height",a.height-(i.layTool.outerHeight()||50)),o.find(".layui-table-tool-panel")[0]||o.append(n),i.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),F.trigger("table.tool.panel.remove"),l.close(i.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return i.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 l=t(e.elem),n=this.checked,o=l.data("key"),r=l.data("parentkey");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+"-"+t===o){var d=l.hide;l.hide=!n,i.elem.find('*[data-key="'+a.index+"-"+o+'"]')[n?"removeClass":"addClass"](f),d!=l.hide&&i.setParentCol(!n,r),i.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,l){l.on("click",function(){var e=t(this).data("type");d.exportFile.call(i,a.id,null,e)})}});break;case"LAYTABLE_PRINT":var u=window.open("打印窗口","_blank"),h=["<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(i.layHeader.html());v.append(i.layMain.find("table").html()),v.append(i.layTotal.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),u.document.write(h+v.prop("outerHTML")),u.document.close(),u.print(),u.close()}layui.event.call(this,y,"toolbar("+p+")",t.extend({event:c,config:a},{}))}),s.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var l=t(this);if(c.allowResize){var n=l.data("key");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=l.data("minwidth")||a.cellMinWidth})}}),F.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var a=c.ruleWidth+t.clientX-c.offset[0];a<c.minWidth&&(a=c.minWidth),c.rule.style.width=a+"px",l.close(i.tipsIndex)}e=1}}).on("mouseup",function(t){c.resizeStart&&(c={},o.css("cursor",""),i.scrollPatch()),2===e&&(e=null)}),s.on("click",function(a){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 i.sort(n,l,null,!0)):e=2}).find(S+" .layui-edge ").on("click",function(e){var a=t(this),l=a.index(),n=a.parents("th").eq(0).data("field");layui.stope(e),0===l?i.sort(n,"asc",null,!0):i.sort(n,"desc",null,!0)});var v=function(e){var a=t(this),l=a.parents("tr").eq(0).data("index"),n=i.layBody.find('tr[data-index="'+l+'"]'),o=d.cache[i.key]||[];return o=o[l]||{},t.extend({tr:n,data:d.clearCacheKey(o),del:function(){d.cache[i.key][l]=[],n.remove(),i.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,t){if(e in o){var a,l=n.children('td[data-field="'+e+'"]');o[e]=t,i.eachCols(function(t,i){i.field==e&&i.templet&&(a=i.templet)}),l.children(h).html(u({templet:a},t,o)),l.data("content",t)}})}},e)};i.elem.on("click",'input[name="layTableCheckbox"]+',function(){var e=t(this).prev(),a=i.layBody.find('input[name="layTableCheckbox"]'),l=e.parents("tr").eq(0).data("index"),n=e[0].checked,o="layTableAllChoose"===e.attr("lay-filter");o?(a.each(function(e,t){t.checked=n,i.setCheckData(e,n)}),i.syncCheckAll(),i.renderForm("checkbox")):(i.setCheckData(l,n),i.syncCheckAll()),layui.event.call(e[0],y,"checkbox("+p+")",v.call(e[0],{checked:n,type:o?"all":"one"}))}),i.elem.on("click",'input[lay-type="layTableRadio"]+',function(){var e=t(this).prev(),a=e[0].checked,l=d.cache[i.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}),i.setThisRowChecked(n),layui.event.call(this,y,"radio("+p+")",v.call(this,{checked:a}))}),i.layBody.on("mouseenter","tr",function(){var e=t(this),a=e.index();e.data("off")||i.layBody.find("tr:eq("+a+")").addClass(_)}).on("mouseleave","tr",function(){var e=t(this),a=e.index();e.data("off")||i.layBody.find("tr:eq("+a+")").removeClass(_)}).on("click","tr",function(){m.call(this,"row")}).on("dblclick","tr",function(){m.call(this,"rowDouble")});var m=function(e){var i=t(this);i.data("off")||layui.event.call(this,y,e+"("+p+")",v.call(i.children("td")[0]))};i.layBody.on("change","."+W,function(){var e=t(this),a=this.value,l=e.parent().data("field"),n=e.parents("tr").eq(0).data("index"),o=d.cache[i.key][n];o[l]=a,layui.event.call(this,y,"edit("+p+")",v.call(this,{value:a,field:l}))}).on("blur","."+W,function(){var e,a=t(this),l=this,n=a.parent().data("field"),o=a.parents("tr").eq(0).data("index"),r=d.cache[i.key][o];i.eachCols(function(t,i){i.field==n&&i.templet&&(e=i.templet)}),a.siblings(h).html(function(t){return u({templet:e},t,r)}(l.value)),a.parent().data("content",l.value),a.remove()}),i.layBody.on("click","td",function(e){var i=t(this),a=(i.data("field"),i.data("edit")),l=i.children(h);if(!i.data("off")&&a){var n=t('<input class="layui-input '+W+'">');return n[0].value=i.data("content")||l.text(),i.find("."+W)[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(h);if(!i.data("off"))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>')}};i.layBody.on("click","."+g,function(e){var n=t(this),o=n.parent(),d=o.children(h);i.tipsIndex=l.tips(['<div class="layui-table-tips-main" style="margin-top: -'+(d.height()+16)+"px;"+function(){return"sm"===a.size?"padding: 4px 15px; font-size: 12px;":"lg"===a.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:i.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)}),i.layBody.on("click","*[lay-event]",function(){var e=t(this),a=e.parents("tr").eq(0).data("index");layui.event.call(this,y,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),i.setThisRowChecked(a)}),i.layMain.on("scroll",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(k).scrollTop(n),l.close(i.tipsIndex)}),R.on("resize",function(){i.resize()})},function(){F.on("click",function(){F.trigger("table.remove.tool.panel")}),F.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()})}(),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){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var l=c.config[e]||{},n={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],s=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(s.href="data:"+n+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],l=[],n=[];return layui.each(t,function(t,a){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(a),function(e,t){n.push('"'+(t||"")+'"')})):d.eachCols(e,function(e,l){if(l.field&&"normal"==l.type&&!l.hide){var o=a[l.field];void 0!==o&&null!==o||(o=""),0==t&&i.push(l.title||""),n.push('"'+u(l,o,a,"text")+'"')}}),l.push(n.join(","))}),layui.each(a.dataTotal,function(e,t){n.push(t)}),i.join(",")+"\r\n"+l.join("\r\n")+"\r\n"+n.join(",")}()),s.download=(l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(s),s.click(),void document.body.removeChild(s))},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,t){var i=s(e);if(i){var a=c.that[e];return a.reload(t),c.call(a)}},d.render=function(e){var t=new j(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(y,d)});
\ No newline at end of file
diff --git a/payapi/src/main/resources/static/libs/layui/lay/modules/transfer.js b/payapi/src/main/resources/static/libs/layui/lay/modules/transfer.js
new file mode 100755
index 0000000..6b7b677
--- /dev/null
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/transfer.js
@@ -0,0 +1,2 @@
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ ;layui.define(["laytpl","form"],function(e){"use strict";var a=layui.$,t=layui.laytpl,n=layui.form,i="transfer",l={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,i,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c="layui-hide",o="layui-btn-disabled",d="layui-none",s="layui-transfer-box",u="layui-transfer-header",h="layui-transfer-search",f="layui-transfer-active",y="layui-transfer-data",p=function(e){return e=e||{},['<div class="layui-transfer-box" data-index="'+e.index+'">','<div class="layui-transfer-header">','<input type="checkbox" name="'+e.checkAllName+'" lay-filter="layTransferCheckbox" lay-type="all" lay-skin="primary" title="{{ d.data.title['+e.index+"] || 'list"+(e.index+1)+"' }}\">","</div>","{{# if(d.data.showSearch){ }}",'<div class="layui-transfer-search">','<i class="layui-icon layui-icon-search"></i>','<input type="input" class="layui-input" placeholder="关键词搜索">',"</div>","{{# } }}",'<ul class="layui-transfer-data"></ul>',"</div>"].join("")},v=['<div class="layui-transfer layui-form layui-border-box" lay-filter="LAY-transfer-{{ d.index }}">',p({index:0,checkAllName:"layTransferLeftCheckAll"}),'<div class="layui-transfer-active">','<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="0">','<i class="layui-icon layui-icon-next"></i>',"</button>",'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="1">','<i class="layui-icon layui-icon-prev"></i>',"</button>","</div>",p({index:1,checkAllName:"layTransferRightCheckAll"}),"</div>"].join(""),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:["列表一","列表二"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"无数据",searchNone:"无匹配数据"}},x.prototype.reload=function(e){var t=this;layui.each(e,function(e,a){a.constructor===Array&&delete t.config[e]}),t.config=a.extend(!0,{},t.config,e),t.render()},x.prototype.render=function(){var e=this,n=e.config,i=e.elem=a(t(v).render({data:n,index:e.index})),l=n.elem=a(n.elem);l[0]&&(n.data=n.data||[],n.value=n.value||[],e.key=n.id||e.index,l.html(e.elem),e.layBox=e.elem.find("."+s),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+h),e.layData=i.find("."+y),e.layBtn=i.find("."+f+" .layui-btn"),e.layBox.css({width:n.width,height:n.height}),e.layData.css({height:function(){return n.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,n=["<li>",'<input type="checkbox" name="'+a[t].checkName+'" lay-skin="primary" lay-filter="layTransferCheckbox" title="'+e.title+'"'+(e.disabled?" disabled":"")+(e.checked?" checked":"")+' value="'+e.value+'">',"</li>"].join("");a[t].views.push(n),delete e.selected}),e.layData.eq(0).html(a[0].views.join("")),e.layData.eq(1).html(a[1].views.join("")),e.renderCheckBtn()},x.prototype.renderForm=function(e){n.render(e,"LAY-transfer-"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,n=t.config;e=e||{},t.layBox.each(function(i){var l=a(this),r=l.find("."+y),d=l.find("."+u).find('input[type="checkbox"]'),s=r.find('input[type="checkbox"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data("hide");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop("checked",f&&h===s.length),t.layBtn.eq(i)[f?"removeClass":"addClass"](o),!e.stopNone){var p=r.children("li:not(."+c+")").length;t.noneView(r,p?"":n.text.none)}}),t.renderForm("checkbox")},x.prototype.noneView=function(e,t){var n=a('<p class="layui-none">'+(t||"")+"</p>");e.find("."+d)[0]&&e.find("."+d).remove(),t.replace(/\s/g,"")&&e.append(n)},x.prototype.setValue=function(){var e=this,t=e.config,n=[];return e.layBox.eq(1).find("."+y+' input[type="checkbox"]').each(function(){var e=a(this).data("hide");e||n.push(this.value)}),t.value=n,e},x.prototype.parseData=function(e){var t=this,n=t.config,i=[];return layui.each(n.data,function(t,l){l=("function"==typeof n.parseData?n.parseData(l):l)||l,i.push(l=a.extend({},l)),layui.each(n.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),n.data=i,t},x.prototype.getData=function(e){var a=this,t=a.config,n=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&n.push(t)})}),n},x.prototype.events=function(){var e=this,t=e.config;e.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var t=a(this).prev(),n=t[0].checked,i=t.parents("."+s).eq(0).find("."+y);t[0].disabled||("all"===t.attr("lay-type")&&i.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=n)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on("click",function(){var n=a(this),i=n.data("index"),l=e.layBox.eq(i),r=[];if(!n.hasClass(o)){e.layBox.eq(i).each(function(t){var n=a(this),i=n.find("."+y);i.children("li").each(function(){var t=a(this),n=t.find('input[type="checkbox"]'),i=n.data("hide");n[0].checked&&!i&&(n[0].checked=!1,l.siblings("."+s).find("."+y).append(t.clone()),t.remove(),r.push(n[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings("."+s).find("."+h+" input");""===c.val()||c.trigger("keyup"),t.onchange&&t.onchange(e.getData(r),i)}}),e.laySearch.find("input").on("keyup",function(){var n=this.value,i=a(this).parents("."+h).eq(0).siblings("."+y),l=i.children("li");l.each(function(){var e=a(this),t=e.find('input[type="checkbox"]'),i=t[0].title.indexOf(n)!==-1;e[i?"removeClass":"addClass"](c),t.data("hide",!i)}),e.renderCheckBtn();var r=l.length===i.children("li."+c).length;e.noneView(i,r?t.text.searchNone:"")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(i,l)});
\ 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
index e8c053d..15fb294 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/tree.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/tree.js
@@ -1,2 +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
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ ;layui.define("form",function(e){"use strict";var i=layui.$,a=layui.form,n=layui.layer,t="tree",r={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var a=this;return a.config=i.extend({},a.config,e),a},on:function(e,i){return layui.onevent.call(this,t,e,i)}},l=function(){var e=this,i=e.config,a=i.id||e.index;return l.that[a]=e,l.config[a]=i,{config:i,reload:function(i){e.reload.call(e,i)},getChecked:function(){return e.getChecked.call(e)},setChecked:function(i){return e.setChecked.call(e,i)}}},c="layui-hide",d="layui-disabled",s="layui-tree-set",o="layui-tree-iconClick",h="layui-icon-addition",u="layui-icon-subtraction",p="layui-tree-entry",f="layui-tree-main",y="layui-tree-txt",v="layui-tree-pack",C="layui-tree-spread",k="layui-tree-setLineShort",m="layui-tree-showLine",x="layui-tree-lineExtend",b=function(e){var a=this;a.index=++r.index,a.config=i.extend({},a.config,r.config,e),a.render()};b.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"未命名",none:"无数据"}},b.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){i.constructor===Array&&delete a.config[e]}),a.config=i.extend(!0,{},a.config,e),a.render()},b.prototype.render=function(){var e=this,a=e.config;e.checkids=[];var n=i('<div class="layui-tree'+(a.showCheckbox?" layui-form":"")+(a.showLine?" layui-tree-line":"")+'" lay-filter="LAY-tree-'+e.index+'"></div>');e.tree(n);var t=a.elem=i(a.elem);if(t[0]){if(e.key=a.id||e.index,e.elem=n,e.elemNone=i('<div class="layui-tree-emptyText">'+a.text.none+"</div>"),t.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);a.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=i(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(k),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(k)}),e.events()}},b.prototype.renderForm=function(e){a.render(e,"LAY-tree-"+this.index)},b.prototype.tree=function(e,a){var n=this,t=n.config,r=a||t.data;layui.each(r,function(a,r){var l=r.children&&r.children.length>0,o=i('<div class="layui-tree-pack" '+(r.spread?'style="display: block;"':"")+'"></div>'),h=i(['<div data-id="'+r.id+'" class="layui-tree-set'+(r.spread?" layui-tree-spread":"")+(r.checked?" layui-tree-checkedFirst":"")+'">','<div class="layui-tree-entry">','<div class="layui-tree-main">',function(){return t.showLine?l?'<span class="layui-tree-iconClick layui-tree-icon"><i class="layui-icon '+(r.spread?"layui-icon-subtraction":"layui-icon-addition")+'"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-icon layui-icon-file"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow '+(l?"":c)+'"></i></span>'}(),function(){return t.showCheckbox?'<input type="checkbox" name="'+(r.field||"layuiTreeCheck_"+r.id)+'" same="layuiTreeCheck" lay-skin="primary" '+(r.disabled?"disabled":"")+' value="'+r.id+'">':""}(),function(){return t.isJump&&r.href?'<a href="'+r.href+'" target="_blank" class="'+y+'">'+(r.title||r.label||t.text.defaultNodeName)+"</a>":'<span class="'+y+(r.disabled?" "+d:"")+'">'+(r.title||r.label||t.text.defaultNodeName)+"</span>"}(),"</div>",function(){if(!t.edit)return"";var e={add:'<i class="layui-icon layui-icon-add-1" data-type="add"></i>',update:'<i class="layui-icon layui-icon-edit" data-type="update"></i>',del:'<i class="layui-icon layui-icon-delete" data-type="del"></i>'},i=['<div class="layui-btn-group layui-tree-btnGroup">'];return t.edit===!0&&(t.edit=["update","del"]),"object"==typeof t.edit?(layui.each(t.edit,function(a,n){i.push(e[n]||"")}),i.join("")+"</div>"):void 0}(),"</div></div>"].join(""));l&&(h.append(o),n.tree(o,r.children)),e.append(h),h.prev("."+s)[0]&&h.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),l||h.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),n.spread(h,r),t.showCheckbox&&(r.checked&&n.checkids.push(r.id),n.checkClick(h,r)),t.edit&&n.operate(h,r)})},b.prototype.spread=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f),c=r.find("."+o),k=r.find("."+y),m=t.onlyIconControl?c:l,x="";m.on("click",function(i){var a=e.children("."+v),n=m.children(".layui-icon")[0]?m.children(".layui-icon"):m.find(".layui-tree-icon").children(".layui-icon");if(a[0]){if(e.hasClass(C))e.removeClass(C),a.slideUp(200),n.removeClass(u).addClass(h);else if(e.addClass(C),a.slideDown(200),n.addClass(u).removeClass(h),t.accordion){var r=e.siblings("."+s);r.removeClass(C),r.children("."+v).slideUp(200),r.find(".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)}}else x="normal"}),k.on("click",function(){var n=i(this);n.hasClass(d)||(x=e.hasClass(C)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:e,state:x,data:a}))})},b.prototype.setCheckbox=function(e,i,a){var n=this,t=(n.config,a.prop("checked"));if(!a.prop("disabled")){if("object"==typeof i.children||e.find("."+v)[0]){var r=e.find("."+v).find('input[same="layuiTreeCheck"]');r.each(function(){this.disabled||(this.checked=t)})}var l=function(e){if(e.parents("."+s)[0]){var i,a=e.parent("."+v),n=a.parent(),r=a.prev().find('input[same="layuiTreeCheck"]');t?r.prop("checked",t):(a.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||r.prop("checked",!1)),l(n)}};l(e),n.renderForm("checkbox")}},b.prototype.checkClick=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f);l.on("click",'input[same="layuiTreeCheck"]+',function(r){layui.stope(r);var l=i(this).prev(),c=l.prop("checked");l.prop("disabled")||(n.setCheckbox(e,a,l),t.oncheck&&t.oncheck({elem:e,checked:c,data:a}))})},b.prototype.operate=function(e,a){var t=this,r=t.config,l=e.children("."+p),d=l.children("."+f);l.children(".layui-tree-btnGroup").on("click",".layui-icon",function(l){layui.stope(l);var f=i(this).data("type"),b=e.children("."+v),g={data:a,type:f,elem:e};if("add"==f){b[0]||(r.showLine?(d.find("."+o).addClass("layui-tree-icon"),d.find("."+o).children(".layui-icon").addClass(h).removeClass("layui-icon-file")):d.find(".layui-tree-iconArrow").removeClass(c),e.append('<div class="layui-tree-pack"></div>'));var w=r.operate&&r.operate(g),N={};if(N.title=r.text.defaultNodeName,N.id=w,t.tree(e.children("."+v),[N]),r.showLine)if(b[0])b.hasClass(x)||b.addClass(x),e.find("."+v).each(function(){i(this).children("."+s).last().addClass(k)}),b.children("."+s).last().prev().hasClass(k)?b.children("."+s).last().prev().removeClass(k):b.children("."+s).last().removeClass(k),!e.parent("."+v)[0]&&e.next()[0]&&b.children("."+s).last().removeClass(k);else{var T=e.siblings("."+s),L=1,A=e.parent("."+v);layui.each(T,function(e,a){i(a).children("."+v)[0]||(L=0)}),1==L?(T.children("."+v).addClass(m),T.children("."+v).children("."+s).removeClass(k),e.children("."+v).addClass(m),A.removeClass(x),A.children("."+s).last().children("."+v).children("."+s).last().addClass(k)):e.children("."+v).children("."+s).addClass(k)}if(!r.showCheckbox)return;if(d.find('input[same="layuiTreeCheck"]')[0].checked){var I=e.children("."+v).children("."+s).last();I.find('input[same="layuiTreeCheck"]')[0].checked=!0}t.renderForm("checkbox")}else if("update"==f){var F=d.children("."+y).html();d.children("."+y).html(""),d.append('<input type="text" class="layui-tree-editInput">'),d.children(".layui-tree-editInput").val(F).focus();var j=function(e){var i=e.val().trim();i=i?i:r.text.defaultNodeName,e.remove(),d.children("."+y).html(i),g.data.title=i,r.operate&&r.operate(g)};d.children(".layui-tree-editInput").blur(function(){j(i(this))}),d.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),j(i(this)))})}else n.confirm('确认删除该节点 "<span style="color: #999;">'+(a.title||"")+'</span>" 吗?',function(a){if(r.operate&&r.operate(g),g.status="remove",n.close(a),!e.prev("."+s)[0]&&!e.next("."+s)[0]&&!e.parent("."+v)[0])return e.remove(),void t.elem.append(t.elemNone);if(e.siblings("."+s).children("."+p)[0]){if(r.showCheckbox){var l=function(e){if(e.parents("."+s)[0]){var a=e.siblings("."+s).children("."+p),n=e.parent("."+v).prev(),r=n.find('input[same="layuiTreeCheck"]')[0],c=1,d=0;0==r.checked&&(a.each(function(e,a){var n=i(a).find('input[same="layuiTreeCheck"]')[0];0!=n.checked||n.disabled||(c=0),n.disabled||(d=1)}),1==c&&1==d&&(r.checked=!0,t.renderForm("checkbox"),l(n.parent("."+s))))}};l(e)}if(r.showLine){var d=e.siblings("."+s),h=1,f=e.parent("."+v);layui.each(d,function(e,a){i(a).children("."+v)[0]||(h=0)}),1==h?(b[0]||(f.removeClass(x),d.children("."+v).addClass(m),d.children("."+v).children("."+s).removeClass(k)),e.next()[0]?f.children("."+s).last().children("."+v).children("."+s).last().addClass(k):e.prev().children("."+v).children("."+s).last().addClass(k),e.next()[0]||e.parents("."+s)[1]||e.parents("."+s).eq(0).next()[0]||e.prev("."+s).addClass(k)):!e.next()[0]&&e.hasClass(k)&&e.prev().addClass(k)}}else{var y=e.parent("."+v).prev();if(r.showLine){y.find("."+o).removeClass("layui-tree-icon"),y.find("."+o).children(".layui-icon").removeClass(u).addClass("layui-icon-file");var w=y.parents("."+v).eq(0);w.addClass(x),w.children("."+s).each(function(){i(this).children("."+v).children("."+s).last().addClass(k)})}else y.find(".layui-tree-iconArrow").addClass(c);e.parents("."+s).eq(0).removeClass(C),e.parent("."+v).remove()}e.remove()})})},b.prototype.events=function(){var e=this,a=e.config;e.elem.find(".layui-tree-checkedFirst");e.setChecked(e.checkids),e.elem.find(".layui-tree-search").on("keyup",function(){var n=i(this),t=n.val(),r=n.nextAll(),l=[];r.find("."+y).each(function(){var e=i(this).parents("."+p);if(i(this).html().indexOf(t)!=-1){l.push(i(this).parent());var a=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+v)[0]&&a(e.parent("."+v).parent("."+s))};a(e.parent("."+s))}}),r.find("."+p).each(function(){var e=i(this).parent("."+s);e.hasClass("layui-tree-searchShow")||e.addClass(c)}),0==r.find(".layui-tree-searchShow").length&&e.elem.append(e.elemNone),a.onsearch&&a.onsearch({elem:l})}),e.elem.find(".layui-tree-search").on("keydown",function(){i(this).nextAll().find("."+p).each(function(){var e=i(this).parent("."+s);e.removeClass("layui-tree-searchShow "+c)}),i(".layui-tree-emptyText")[0]&&i(".layui-tree-emptyText").remove()})},b.prototype.getChecked=function(){var e=this,a=e.config,n=[],t=[];e.elem.find(".layui-form-checked").each(function(){n.push(i(this).prev()[0].value)});var r=function(e,a){layui.each(e,function(e,t){layui.each(n,function(e,n){if(t.id==n){var l=i.extend({},t);return delete l.children,a.push(l),t.children&&(l.children=[],r(t.children,l.children)),!0}})})};return r(i.extend({},a.data),t),t},b.prototype.setChecked=function(e){var a=this;a.config;a.elem.find("."+s).each(function(a,n){var t=i(this).data("id"),r=i(n).children("."+p).find('input[same="layuiTreeCheck"]'),l=r.next();if("number"==typeof e){if(t==e)return r[0].checked||l.click(),!1}else"object"==typeof e&&layui.each(e,function(e,i){if(i==t&&!r[0].checked)return l.click(),!0})})},l.that={},l.config={},r.reload=function(e,i){var a=l.that[e];return a.reload(i),l.call(a)},r.getChecked=function(e){var i=l.that[e];return i.getChecked()},r.setChecked=function(e,i){var a=l.that[e];return a.setChecked(i)},r.render=function(e){var i=new b(e);return l.call(i)},e(t,r)});
\ 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
index 404d534..262b513 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/upload.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/upload.js
@@ -1,2 +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
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ ;layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,n=layui.hint(),o=layui.device(),a={config:{},set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,r,e,t)}},l=function(){var e=this;return{upload:function(t){e.upload.call(e,t)},reload:function(t){e.reload.call(e,t)},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 i=this;i.config=t.extend({},i.config,a.config,e),i.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var i=this,e=i.config;e.elem=t(e.elem),e.bindAction=t(e.bindAction),i.file(),i.events()},p.prototype.file=function(){var e=this,i=e.config,n=e.elemFile=t(['<input class="'+u+'" type="file" accept="'+i.acceptMime+'" name="'+i.field+'"',i.multiple?" multiple":"",">"].join("")),a=i.elem.next();(a.hasClass(u)||a.hasClass(c))&&a.remove(),o.ie&&o.ie<10&&i.elem.wrap('<div class="layui-upload-wrap"></div>'),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(n),o.ie&&o.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,i=e.config,n=t('<iframe id="'+f+'" class="'+f+'" name="'+f+'" frameborder="0"></iframe>'),o=t(['<form target="'+f+'" class="'+c+'" method="post" key="set-mine" enctype="multipart/form-data" action="'+i.url+'">',"</form>"].join(""));t("#"+f)[0]||t("body").append(n),i.elem.next().hasClass(c)||(e.elemFile.wrap(o),i.elem.next("."+c).append(function(){var e=[];return layui.each(i.data,function(t,i){i="function"==typeof i?i():i,e.push('<input type="hidden" name="'+t+'" value="'+i+'">')}),e.join("")}()))},p.prototype.msg=function(e){return i.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 t=this;window.FileReader&&layui.each(t.chooseFiles,function(t,i){var n=new FileReader;n.readAsDataURL(i),n.onload=function(){e&&e(t,i,this.result)}})},p.prototype.upload=function(e,i){var n,a=this,l=a.config,r=a.elemFile[0],u=function(){var i=0,n=0,o=e||a.files||a.chooseFiles||r.files,u=function(){l.multiple&&i+n===a.fileLength&&"function"==typeof l.allDone&&l.allDone({total:a.fileLength,successful:i,aborted:n})};layui.each(o,function(e,o){var r=new FormData;r.append(l.field,o),layui.each(l.data,function(e,t){t="function"==typeof t?t():t,r.append(e,t)}),t.ajax({url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(t){i++,d(e,t),u()},error:function(){n++,a.msg("请求上传接口出现异常"),m(e),u()},xhr:function(){var e=new XMLHttpRequest;return e.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=Math.floor(e.loaded/e.total*100);"function"==typeof l.progress&&l.progress(t,e)}}),e}})})},c=function(){var e=t("#"+f);a.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var t,i=e.contents().find("body");try{t=i.text()}catch(n){a.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}t&&(clearInterval(p.timer),i.html(""),d(0,t))},30)},d=function(e,t){if(a.elemFile.next("."+s).remove(),r.value="","object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(t,e||0,function(e){a.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){a.upload(e)})},h=l.exts,v=function(){var t=[];return layui.each(e||a.chooseFiles,function(e,i){t.push(i.name)}),t}(),g={preview:function(e){a.preview(e)},upload:function(e,t){var i={};i[e]=t,a.upload(i)},pushFile:function(){return a.files=a.files||{},layui.each(a.chooseFiles,function(e,t){a.files[e]=t}),a.files},resetFile:function(e,t,i){var n=new File([t],i);a.files=a.files||{},a.files[e]=n}},y=function(){if("choose"!==i&&!l.auto||(l.choose&&l.choose(g),"choose"!==i))return l.before&&l.before(g),o.ie?o.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 a.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return a.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return a.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,t){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(t))||(n=!0)}),n)return a.msg("选择的图片中包含不支持的格式"),r.value=""}if(a.fileLength=function(){var t=0,i=e||a.files||a.chooseFiles||r.files;return layui.each(i,function(){t++}),t}(),l.number&&a.fileLength>l.number)return a.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(o.ie&&o.ie<10)){var F;if(layui.each(a.chooseFiles,function(e,t){if(t.size>1024*l.size){var i=l.size/1024;i=i>=1?i.toFixed(2)+"MB":l.size+"KB",r.value="",F=i}}),F)return a.msg("文件不能超过"+F)}y()}},p.prototype.reload=function(e){e=e||{},delete e.elem,delete e.bindAction;var i=this,e=i.config=t.extend({},i.config,a.config,e),n=e.elem.next();n.attr({name:e.name,accept:e.acceptMime,multiple:e.multiple})},p.prototype.events=function(){var e=this,i=e.config,a=function(t){e.chooseFiles={},layui.each(t,function(t,i){var n=(new Date).getTime();e.chooseFiles[n+"-"+t]=i})},l=function(t,n){var o=e.elemFile,a=t.length>1?t.length+"个文件":(t[0]||{}).name||o[0].value.match(/[^\/\\]+\..+/g)||[]||"";o.next().hasClass(s)&&o.next().remove(),e.upload(null,"choose"),e.isFile()||i.choose||o.after('<span class="layui-inline '+s+'">'+a+"</span>")};i.elem.off("upload.start").on("upload.start",function(){var o=t(this),a=o.attr("lay-data");if(a)try{a=new Function("return "+a)(),e.config=t.extend({},i,a)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+a)}e.config.item=o,e.elemFile[0].click()}),o.ie&&o.ie<10||i.elem.off("upload.over").on("upload.over",function(){var e=t(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=t(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,o){var r=t(this),u=o.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),a(u),i.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var t=this.files||[];a(t),i.auto?e.upload():l(t)}),i.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),i.elem.data("haveEvents")||(e.elemFile.on("change",function(){t(this).trigger("upload.change")}),i.elem.on("click",function(){e.isFile()||t(this).trigger("upload.start")}),i.drag&&i.elem.on("dragover",function(e){e.preventDefault(),t(this).trigger("upload.over")}).on("dragleave",function(e){t(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),t(this).trigger("upload.drop",e)}),i.bindAction.on("click",function(){t(this).trigger("upload.action")}),i.elem.data("haveEvents",!0))},a.render=function(e){var t=new p(e);return l.call(t)},e(r,a)});
\ 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
index 8d38508..256f47a 100755
--- a/payapi/src/main/resources/static/libs/layui/lay/modules/util.js
+++ b/payapi/src/main/resources/static/libs/layui/lay/modules/util.js
@@ -1,2 +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
+/** layui-v2.5.5 MIT License By https://www.layui.com */
+ ;layui.define("jquery",function(t){"use strict";var e=layui.$,i={fixbar:function(t){var i,n,a="layui-fixbar",o="layui-fixbar-top",r=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="'+a+'">',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 '+o+'" lay-type="top" style="'+t.bgcolor+'">'+c[2]+"</li>","</ul>"].join("")),s=g.find("."+o),u=function(){var e=r.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+a)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),n=i.attr("lay-type");"top"===n&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var n=this,a="function"==typeof e,o=new Date(t).getTime(),r=new Date(!e||a?(new Date).getTime():e).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=e);var g=setTimeout(function(){n.countdown(t,r+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,n=[[],[]],a=(new Date).getTime()-new Date(t).getTime();return a>6912e5?(a=new Date(t),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),e||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=12e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var n=t.length;n<e;n++)i+="0";return t<Math.pow(10,e)?i+(0|t):t},toDateString:function(t,e){var i=this,n=new Date(t||new Date),a=[i.digit(n.getFullYear(),4),i.digit(n.getMonth()+1),i.digit(n.getDate())],o=[i.digit(n.getHours()),i.digit(n.getMinutes()),i.digit(n.getSeconds())];return e=e||"yyyy-MM-dd HH:mm:ss",e.replace(/yyyy/g,a[0]).replace(/MM/g,a[1]).replace(/dd/g,a[2]).replace(/HH/g,o[0]).replace(/mm/g,o[1]).replace(/ss/g,o[2])},escape:function(t){return String(t||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")},event:function(t,n,a){n=i.event[t]=e.extend(!0,i.event[t],n)||{},e("body").on(a||"click","*["+t+"]",function(){var i=e(this),a=i.attr(t);n[a]&&n[a].call(this,i)})}};!function(t,e,i){"$:nomunge";function n(){a=e[l](function(){o.each(function(){var e=t(this),i=e.width(),n=e.height(),a=t.data(this,g);(i!==a.w||n!==a.h)&&e.trigger(c,[a.w=i,a.h=n])}),n()},r[s])}var a,o=t([]),r=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";r[s]=250,r[u]=!0,t.event.special[c]={setup:function(){if(!r[u]&&this[l])return!1;var e=t(this);o=o.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===o.length&&n()},teardown:function(){if(!r[u]&&this[l])return!1;var e=t(this);o=o.not(e),e.removeData(g),o.length||clearTimeout(a)},add:function(e){function n(e,n,o){var r=t(this),l=t.data(this,g)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[u]&&this[l])return!1;var a;return t.isFunction(e)?(a=e,n):(a=e.handler,void(e.handler=n))}}}(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
index 5cd5973..1d911b3 100755
--- a/payapi/src/main/resources/static/libs/layui/layui.all.js
+++ b/payapi/src/main/resources/static/libs/layui/layui.all.js
@@ -1,5 +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]={}),
+/** layui-v2.5.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.5.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",transfer:"modules/transfer",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.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
+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 t=layui.$,i=layui.layer,n=layui.hint(),o=layui.device(),a={config:{},set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,r,e,t)}},l=function(){var e=this;return{upload:function(t){e.upload.call(e,t)},reload:function(t){e.reload.call(e,t)},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 i=this;i.config=t.extend({},i.config,a.config,e),i.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var i=this,e=i.config;e.elem=t(e.elem),e.bindAction=t(e.bindAction),i.file(),i.events()},p.prototype.file=function(){var e=this,i=e.config,n=e.elemFile=t(['<input class="'+u+'" type="file" accept="'+i.acceptMime+'" name="'+i.field+'"',i.multiple?" multiple":"",">"].join("")),a=i.elem.next();(a.hasClass(u)||a.hasClass(c))&&a.remove(),o.ie&&o.ie<10&&i.elem.wrap('<div class="layui-upload-wrap"></div>'),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(n),o.ie&&o.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,i=e.config,n=t('<iframe id="'+f+'" class="'+f+'" name="'+f+'" frameborder="0"></iframe>'),o=t(['<form target="'+f+'" class="'+c+'" method="post" key="set-mine" enctype="multipart/form-data" action="'+i.url+'">',"</form>"].join(""));t("#"+f)[0]||t("body").append(n),i.elem.next().hasClass(c)||(e.elemFile.wrap(o),i.elem.next("."+c).append(function(){var e=[];return layui.each(i.data,function(t,i){i="function"==typeof i?i():i,e.push('<input type="hidden" name="'+t+'" value="'+i+'">')}),e.join("")}()))},p.prototype.msg=function(e){return i.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 t=this;window.FileReader&&layui.each(t.chooseFiles,function(t,i){var n=new FileReader;n.readAsDataURL(i),n.onload=function(){e&&e(t,i,this.result)}})},p.prototype.upload=function(e,i){var n,a=this,l=a.config,r=a.elemFile[0],u=function(){var i=0,n=0,o=e||a.files||a.chooseFiles||r.files,u=function(){l.multiple&&i+n===a.fileLength&&"function"==typeof l.allDone&&l.allDone({total:a.fileLength,successful:i,aborted:n})};layui.each(o,function(e,o){var r=new FormData;r.append(l.field,o),layui.each(l.data,function(e,t){t="function"==typeof t?t():t,r.append(e,t)}),t.ajax({url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(t){i++,d(e,t),u()},error:function(){n++,a.msg("请求上传接口出现异常"),m(e),u()},xhr:function(){var e=new XMLHttpRequest;return e.upload.addEventListener("progress",function(e){if(e.lengthComputable){var t=Math.floor(e.loaded/e.total*100);"function"==typeof l.progress&&l.progress(t,e)}}),e}})})},c=function(){var e=t("#"+f);a.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var t,i=e.contents().find("body");try{t=i.text()}catch(n){a.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}t&&(clearInterval(p.timer),i.html(""),d(0,t))},30)},d=function(e,t){if(a.elemFile.next("."+s).remove(),r.value="","object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(t,e||0,function(e){a.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){a.upload(e)})},h=l.exts,v=function(){var t=[];return layui.each(e||a.chooseFiles,function(e,i){t.push(i.name)}),t}(),g={preview:function(e){a.preview(e)},upload:function(e,t){var i={};i[e]=t,a.upload(i)},pushFile:function(){return a.files=a.files||{},layui.each(a.chooseFiles,function(e,t){a.files[e]=t}),a.files},resetFile:function(e,t,i){var n=new File([t],i);a.files=a.files||{},a.files[e]=n}},y=function(){if("choose"!==i&&!l.auto||(l.choose&&l.choose(g),"choose"!==i))return l.before&&l.before(g),o.ie?o.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 a.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return a.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return a.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,t){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(t))||(n=!0)}),n)return a.msg("选择的图片中包含不支持的格式"),r.value=""}if(a.fileLength=function(){var t=0,i=e||a.files||a.chooseFiles||r.files;return layui.each(i,function(){t++}),t}(),l.number&&a.fileLength>l.number)return a.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(o.ie&&o.ie<10)){var F;if(layui.each(a.chooseFiles,function(e,t){if(t.size>1024*l.size){var i=l.size/1024;i=i>=1?i.toFixed(2)+"MB":l.size+"KB",r.value="",F=i}}),F)return a.msg("文件不能超过"+F)}y()}},p.prototype.reload=function(e){e=e||{},delete e.elem,delete e.bindAction;var i=this,e=i.config=t.extend({},i.config,a.config,e),n=e.elem.next();n.attr({name:e.name,accept:e.acceptMime,multiple:e.multiple})},p.prototype.events=function(){var e=this,i=e.config,a=function(t){e.chooseFiles={},layui.each(t,function(t,i){var n=(new Date).getTime();e.chooseFiles[n+"-"+t]=i})},l=function(t,n){var o=e.elemFile,a=t.length>1?t.length+"个文件":(t[0]||{}).name||o[0].value.match(/[^\/\\]+\..+/g)||[]||"";o.next().hasClass(s)&&o.next().remove(),e.upload(null,"choose"),e.isFile()||i.choose||o.after('<span class="layui-inline '+s+'">'+a+"</span>")};i.elem.off("upload.start").on("upload.start",function(){var o=t(this),a=o.attr("lay-data");if(a)try{a=new Function("return "+a)(),e.config=t.extend({},i,a)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+a)}e.config.item=o,e.elemFile[0].click()}),o.ie&&o.ie<10||i.elem.off("upload.over").on("upload.over",function(){var e=t(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=t(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,o){var r=t(this),u=o.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),a(u),i.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var t=this.files||[];a(t),i.auto?e.upload():l(t)}),i.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),i.elem.data("haveEvents")||(e.elemFile.on("change",function(){t(this).trigger("upload.change")}),i.elem.on("click",function(){e.isFile()||t(this).trigger("upload.start")}),i.drag&&i.elem.on("dragover",function(e){e.preventDefault(),t(this).trigger("upload.over")}).on("dragleave",function(e){t(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),t(this).trigger("upload.drop",e)}),i.bindAction.on("click",function(){t(this).trigger("upload.action")}),i.elem.data("haveEvents",!0))},a.render=function(e){var t=new p(e);return l.call(t)},e(r,a)});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=this,n=t(r+'[lay-filter="'+e+'"]');return n.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),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter="'+e+'"]').eq(0);var a={},n={},l=i.find("input,select,textarea");return layui.each(l,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];a[i]=0|a[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+a[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(n[t.name]=t.value)}}),n},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"),g=i.find("dl"),x=g.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=g.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),x.removeClass(o),y=null,x.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),T()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||$(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||""))})},T=function(){var e=g.children("dd."+s);if(e[0]){var t=e.position().top,i=g.height(),a=e.height();t>i&&g.scrollTop(t+g.scrollTop()-i+a-5),t<0&&g.scrollTop(t+g.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),g.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=g.children("dd."+s);if(g.children("dd."+o)[0]&&"next"===t){var i=g.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():g.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 T()):i(t,y)):y=null};38===t&&i("prev"),40===t&&i("next"),13===t&&(e.preventDefault(),g.children("dd."+s).trigger("click"))});var $=function(e,i,a){var n=0;layui.each(x,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===x.length;return i(l),l},q=function(e){var t=this.value,i=e.keyCode;return 9!==i&&13!==i&&37!==i&&38!==i&&39!==i&&40!==i&&($(t,function(e){e?g.find("."+r)[0]||g.append('<p class="'+r+'">无匹配项</p>'):g.find("."+r).remove()},"keyup"),""===t&&g.find("."+r).remove(),void T())};f&&k.on("keyup",q).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(){$(k.val(),function(e){d||k.val("")},"blur")},200)}),x.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=null,a=f.config.verify,s="layui-form-danger",o={},c=t(this),u=c.parents(r),d=u.find("*[lay-verify]"),v=c.parents("form")[0],h=c.attr("lay-filter");return layui.each(d,function(l,r){var o=t(this),c=o.attr("lay-verify").split("|"),u=o.attr("lay-verType"),d=o.val();if(o.removeClass(s),layui.each(c,function(t,l){var c,f="",v="function"==typeof a[l];if(a[l]){var c=v?f=a[l](d,r):!a[l][0].test(d);if(f=f||a[l][1],"required"===l&&(f=o.attr("lay-reqText")||f),c)return"tips"===u?i.tips(f,function(){return"string"==typeof o.attr("lay-ignore")||"select"!==r.tagName.toLowerCase()&&!/^checkbox|radio$/.test(r.type)?o:o.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||setTimeout(function(){r.focus()},7),o.addClass(s),e=!0}}),e)return e}),!e&&(o=f.getValue(null,u),layui.event.call(this,l,"submit("+h+")",{elem:this,form:v,field:o}))},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("form",function(e){"use strict";var i=layui.$,a=layui.form,n=layui.layer,t="tree",r={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var a=this;return a.config=i.extend({},a.config,e),a},on:function(e,i){return layui.onevent.call(this,t,e,i)}},l=function(){var e=this,i=e.config,a=i.id||e.index;return l.that[a]=e,l.config[a]=i,{config:i,reload:function(i){e.reload.call(e,i)},getChecked:function(){return e.getChecked.call(e)},setChecked:function(i){return e.setChecked.call(e,i)}}},c="layui-hide",d="layui-disabled",s="layui-tree-set",o="layui-tree-iconClick",h="layui-icon-addition",u="layui-icon-subtraction",p="layui-tree-entry",f="layui-tree-main",y="layui-tree-txt",v="layui-tree-pack",C="layui-tree-spread",k="layui-tree-setLineShort",m="layui-tree-showLine",x="layui-tree-lineExtend",b=function(e){var a=this;a.index=++r.index,a.config=i.extend({},a.config,r.config,e),a.render()};b.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"未命名",none:"无数据"}},b.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){i.constructor===Array&&delete a.config[e]}),a.config=i.extend(!0,{},a.config,e),a.render()},b.prototype.render=function(){var e=this,a=e.config;e.checkids=[];var n=i('<div class="layui-tree'+(a.showCheckbox?" layui-form":"")+(a.showLine?" layui-tree-line":"")+'" lay-filter="LAY-tree-'+e.index+'"></div>');e.tree(n);var t=a.elem=i(a.elem);if(t[0]){if(e.key=a.id||e.index,e.elem=n,e.elemNone=i('<div class="layui-tree-emptyText">'+a.text.none+"</div>"),t.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);a.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=i(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(k),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(k)}),e.events()}},b.prototype.renderForm=function(e){a.render(e,"LAY-tree-"+this.index)},b.prototype.tree=function(e,a){var n=this,t=n.config,r=a||t.data;layui.each(r,function(a,r){var l=r.children&&r.children.length>0,o=i('<div class="layui-tree-pack" '+(r.spread?'style="display: block;"':"")+'"></div>'),h=i(['<div data-id="'+r.id+'" class="layui-tree-set'+(r.spread?" layui-tree-spread":"")+(r.checked?" layui-tree-checkedFirst":"")+'">','<div class="layui-tree-entry">','<div class="layui-tree-main">',function(){return t.showLine?l?'<span class="layui-tree-iconClick layui-tree-icon"><i class="layui-icon '+(r.spread?"layui-icon-subtraction":"layui-icon-addition")+'"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-icon layui-icon-file"></i></span>':'<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow '+(l?"":c)+'"></i></span>'}(),function(){return t.showCheckbox?'<input type="checkbox" name="'+(r.field||"layuiTreeCheck_"+r.id)+'" same="layuiTreeCheck" lay-skin="primary" '+(r.disabled?"disabled":"")+' value="'+r.id+'">':""}(),function(){return t.isJump&&r.href?'<a href="'+r.href+'" target="_blank" class="'+y+'">'+(r.title||r.label||t.text.defaultNodeName)+"</a>":'<span class="'+y+(r.disabled?" "+d:"")+'">'+(r.title||r.label||t.text.defaultNodeName)+"</span>"}(),"</div>",function(){if(!t.edit)return"";var e={add:'<i class="layui-icon layui-icon-add-1" data-type="add"></i>',update:'<i class="layui-icon layui-icon-edit" data-type="update"></i>',del:'<i class="layui-icon layui-icon-delete" data-type="del"></i>'},i=['<div class="layui-btn-group layui-tree-btnGroup">'];return t.edit===!0&&(t.edit=["update","del"]),"object"==typeof t.edit?(layui.each(t.edit,function(a,n){i.push(e[n]||"")}),i.join("")+"</div>"):void 0}(),"</div></div>"].join(""));l&&(h.append(o),n.tree(o,r.children)),e.append(h),h.prev("."+s)[0]&&h.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),l||h.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),n.spread(h,r),t.showCheckbox&&(r.checked&&n.checkids.push(r.id),n.checkClick(h,r)),t.edit&&n.operate(h,r)})},b.prototype.spread=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f),c=r.find("."+o),k=r.find("."+y),m=t.onlyIconControl?c:l,x="";m.on("click",function(i){var a=e.children("."+v),n=m.children(".layui-icon")[0]?m.children(".layui-icon"):m.find(".layui-tree-icon").children(".layui-icon");if(a[0]){if(e.hasClass(C))e.removeClass(C),a.slideUp(200),n.removeClass(u).addClass(h);else if(e.addClass(C),a.slideDown(200),n.addClass(u).removeClass(h),t.accordion){var r=e.siblings("."+s);r.removeClass(C),r.children("."+v).slideUp(200),r.find(".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)}}else x="normal"}),k.on("click",function(){var n=i(this);n.hasClass(d)||(x=e.hasClass(C)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:e,state:x,data:a}))})},b.prototype.setCheckbox=function(e,i,a){var n=this,t=(n.config,a.prop("checked"));if(!a.prop("disabled")){if("object"==typeof i.children||e.find("."+v)[0]){var r=e.find("."+v).find('input[same="layuiTreeCheck"]');r.each(function(){this.disabled||(this.checked=t)})}var l=function(e){if(e.parents("."+s)[0]){var i,a=e.parent("."+v),n=a.parent(),r=a.prev().find('input[same="layuiTreeCheck"]');t?r.prop("checked",t):(a.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||r.prop("checked",!1)),l(n)}};l(e),n.renderForm("checkbox")}},b.prototype.checkClick=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f);l.on("click",'input[same="layuiTreeCheck"]+',function(r){layui.stope(r);var l=i(this).prev(),c=l.prop("checked");l.prop("disabled")||(n.setCheckbox(e,a,l),t.oncheck&&t.oncheck({elem:e,checked:c,data:a}))})},b.prototype.operate=function(e,a){var t=this,r=t.config,l=e.children("."+p),d=l.children("."+f);l.children(".layui-tree-btnGroup").on("click",".layui-icon",function(l){layui.stope(l);var f=i(this).data("type"),b=e.children("."+v),g={data:a,type:f,elem:e};if("add"==f){b[0]||(r.showLine?(d.find("."+o).addClass("layui-tree-icon"),d.find("."+o).children(".layui-icon").addClass(h).removeClass("layui-icon-file")):d.find(".layui-tree-iconArrow").removeClass(c),e.append('<div class="layui-tree-pack"></div>'));var w=r.operate&&r.operate(g),N={};if(N.title=r.text.defaultNodeName,N.id=w,t.tree(e.children("."+v),[N]),r.showLine)if(b[0])b.hasClass(x)||b.addClass(x),e.find("."+v).each(function(){i(this).children("."+s).last().addClass(k)}),b.children("."+s).last().prev().hasClass(k)?b.children("."+s).last().prev().removeClass(k):b.children("."+s).last().removeClass(k),!e.parent("."+v)[0]&&e.next()[0]&&b.children("."+s).last().removeClass(k);else{var T=e.siblings("."+s),L=1,A=e.parent("."+v);layui.each(T,function(e,a){i(a).children("."+v)[0]||(L=0)}),1==L?(T.children("."+v).addClass(m),T.children("."+v).children("."+s).removeClass(k),e.children("."+v).addClass(m),A.removeClass(x),A.children("."+s).last().children("."+v).children("."+s).last().addClass(k)):e.children("."+v).children("."+s).addClass(k)}if(!r.showCheckbox)return;if(d.find('input[same="layuiTreeCheck"]')[0].checked){var I=e.children("."+v).children("."+s).last();I.find('input[same="layuiTreeCheck"]')[0].checked=!0}t.renderForm("checkbox")}else if("update"==f){var F=d.children("."+y).html();d.children("."+y).html(""),d.append('<input type="text" class="layui-tree-editInput">'),d.children(".layui-tree-editInput").val(F).focus();var j=function(e){var i=e.val().trim();i=i?i:r.text.defaultNodeName,e.remove(),d.children("."+y).html(i),g.data.title=i,r.operate&&r.operate(g)};d.children(".layui-tree-editInput").blur(function(){j(i(this))}),d.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),j(i(this)))})}else n.confirm('确认删除该节点 "<span style="color: #999;">'+(a.title||"")+'</span>" 吗?',function(a){if(r.operate&&r.operate(g),g.status="remove",n.close(a),!e.prev("."+s)[0]&&!e.next("."+s)[0]&&!e.parent("."+v)[0])return e.remove(),void t.elem.append(t.elemNone);if(e.siblings("."+s).children("."+p)[0]){if(r.showCheckbox){var l=function(e){if(e.parents("."+s)[0]){var a=e.siblings("."+s).children("."+p),n=e.parent("."+v).prev(),r=n.find('input[same="layuiTreeCheck"]')[0],c=1,d=0;0==r.checked&&(a.each(function(e,a){var n=i(a).find('input[same="layuiTreeCheck"]')[0];0!=n.checked||n.disabled||(c=0),n.disabled||(d=1)}),1==c&&1==d&&(r.checked=!0,t.renderForm("checkbox"),l(n.parent("."+s))))}};l(e)}if(r.showLine){var d=e.siblings("."+s),h=1,f=e.parent("."+v);layui.each(d,function(e,a){i(a).children("."+v)[0]||(h=0)}),1==h?(b[0]||(f.removeClass(x),d.children("."+v).addClass(m),d.children("."+v).children("."+s).removeClass(k)),e.next()[0]?f.children("."+s).last().children("."+v).children("."+s).last().addClass(k):e.prev().children("."+v).children("."+s).last().addClass(k),e.next()[0]||e.parents("."+s)[1]||e.parents("."+s).eq(0).next()[0]||e.prev("."+s).addClass(k)):!e.next()[0]&&e.hasClass(k)&&e.prev().addClass(k)}}else{var y=e.parent("."+v).prev();if(r.showLine){y.find("."+o).removeClass("layui-tree-icon"),y.find("."+o).children(".layui-icon").removeClass(u).addClass("layui-icon-file");var w=y.parents("."+v).eq(0);w.addClass(x),w.children("."+s).each(function(){i(this).children("."+v).children("."+s).last().addClass(k)})}else y.find(".layui-tree-iconArrow").addClass(c);e.parents("."+s).eq(0).removeClass(C),e.parent("."+v).remove()}e.remove()})})},b.prototype.events=function(){var e=this,a=e.config;e.elem.find(".layui-tree-checkedFirst");e.setChecked(e.checkids),e.elem.find(".layui-tree-search").on("keyup",function(){var n=i(this),t=n.val(),r=n.nextAll(),l=[];r.find("."+y).each(function(){var e=i(this).parents("."+p);if(i(this).html().indexOf(t)!=-1){l.push(i(this).parent());var a=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+v)[0]&&a(e.parent("."+v).parent("."+s))};a(e.parent("."+s))}}),r.find("."+p).each(function(){var e=i(this).parent("."+s);e.hasClass("layui-tree-searchShow")||e.addClass(c)}),0==r.find(".layui-tree-searchShow").length&&e.elem.append(e.elemNone),a.onsearch&&a.onsearch({elem:l})}),e.elem.find(".layui-tree-search").on("keydown",function(){i(this).nextAll().find("."+p).each(function(){var e=i(this).parent("."+s);e.removeClass("layui-tree-searchShow "+c)}),i(".layui-tree-emptyText")[0]&&i(".layui-tree-emptyText").remove()})},b.prototype.getChecked=function(){var e=this,a=e.config,n=[],t=[];e.elem.find(".layui-form-checked").each(function(){n.push(i(this).prev()[0].value)});var r=function(e,a){layui.each(e,function(e,t){layui.each(n,function(e,n){if(t.id==n){var l=i.extend({},t);return delete l.children,a.push(l),t.children&&(l.children=[],r(t.children,l.children)),!0}})})};return r(i.extend({},a.data),t),t},b.prototype.setChecked=function(e){var a=this;a.config;a.elem.find("."+s).each(function(a,n){var t=i(this).data("id"),r=i(n).children("."+p).find('input[same="layuiTreeCheck"]'),l=r.next();if("number"==typeof e){if(t==e)return r[0].checked||l.click(),!1}else"object"==typeof e&&layui.each(e,function(e,i){if(i==t&&!r[0].checked)return l.click(),!0})})},l.that={},l.config={},r.reload=function(e,i){var a=l.that[e];return a.reload(i),l.call(a)},r.getChecked=function(e){var i=l.that[e];return i.getChecked()},r.setChecked=function(e,i){var a=l.that[e];return a.setChecked(i)},r.render=function(e){var i=new b(e);return l.call(i)},e(t,r)});layui.define(["laytpl","form"],function(e){"use strict";var a=layui.$,t=layui.laytpl,n=layui.form,i="transfer",l={config:{},index:layui[i]?layui[i].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,i,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c="layui-hide",o="layui-btn-disabled",d="layui-none",s="layui-transfer-box",u="layui-transfer-header",h="layui-transfer-search",f="layui-transfer-active",y="layui-transfer-data",p=function(e){return e=e||{},['<div class="layui-transfer-box" data-index="'+e.index+'">','<div class="layui-transfer-header">','<input type="checkbox" name="'+e.checkAllName+'" lay-filter="layTransferCheckbox" lay-type="all" lay-skin="primary" title="{{ d.data.title['+e.index+"] || 'list"+(e.index+1)+"' }}\">","</div>","{{# if(d.data.showSearch){ }}",'<div class="layui-transfer-search">','<i class="layui-icon layui-icon-search"></i>','<input type="input" class="layui-input" placeholder="关键词搜索">',"</div>","{{# } }}",'<ul class="layui-transfer-data"></ul>',"</div>"].join("")},v=['<div class="layui-transfer layui-form layui-border-box" lay-filter="LAY-transfer-{{ d.index }}">',p({index:0,checkAllName:"layTransferLeftCheckAll"}),'<div class="layui-transfer-active">','<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="0">','<i class="layui-icon layui-icon-next"></i>',"</button>",'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="1">','<i class="layui-icon layui-icon-prev"></i>',"</button>","</div>",p({index:1,checkAllName:"layTransferRightCheckAll"}),"</div>"].join(""),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:["列表一","列表二"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"无数据",searchNone:"无匹配数据"}},x.prototype.reload=function(e){var t=this;layui.each(e,function(e,a){a.constructor===Array&&delete t.config[e]}),t.config=a.extend(!0,{},t.config,e),t.render()},x.prototype.render=function(){var e=this,n=e.config,i=e.elem=a(t(v).render({data:n,index:e.index})),l=n.elem=a(n.elem);l[0]&&(n.data=n.data||[],n.value=n.value||[],e.key=n.id||e.index,l.html(e.elem),e.layBox=e.elem.find("."+s),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+h),e.layData=i.find("."+y),e.layBtn=i.find("."+f+" .layui-btn"),e.layBox.css({width:n.width,height:n.height}),e.layData.css({height:function(){return n.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,n=["<li>",'<input type="checkbox" name="'+a[t].checkName+'" lay-skin="primary" lay-filter="layTransferCheckbox" title="'+e.title+'"'+(e.disabled?" disabled":"")+(e.checked?" checked":"")+' value="'+e.value+'">',"</li>"].join("");a[t].views.push(n),delete e.selected}),e.layData.eq(0).html(a[0].views.join("")),e.layData.eq(1).html(a[1].views.join("")),e.renderCheckBtn()},x.prototype.renderForm=function(e){n.render(e,"LAY-transfer-"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,n=t.config;e=e||{},t.layBox.each(function(i){var l=a(this),r=l.find("."+y),d=l.find("."+u).find('input[type="checkbox"]'),s=r.find('input[type="checkbox"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data("hide");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop("checked",f&&h===s.length),t.layBtn.eq(i)[f?"removeClass":"addClass"](o),!e.stopNone){var p=r.children("li:not(."+c+")").length;t.noneView(r,p?"":n.text.none)}}),t.renderForm("checkbox")},x.prototype.noneView=function(e,t){var n=a('<p class="layui-none">'+(t||"")+"</p>");e.find("."+d)[0]&&e.find("."+d).remove(),t.replace(/\s/g,"")&&e.append(n)},x.prototype.setValue=function(){var e=this,t=e.config,n=[];return e.layBox.eq(1).find("."+y+' input[type="checkbox"]').each(function(){var e=a(this).data("hide");e||n.push(this.value)}),t.value=n,e},x.prototype.parseData=function(e){var t=this,n=t.config,i=[];return layui.each(n.data,function(t,l){l=("function"==typeof n.parseData?n.parseData(l):l)||l,i.push(l=a.extend({},l)),layui.each(n.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),n.data=i,t},x.prototype.getData=function(e){var a=this,t=a.config,n=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&n.push(t)})}),n},x.prototype.events=function(){var e=this,t=e.config;e.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var t=a(this).prev(),n=t[0].checked,i=t.parents("."+s).eq(0).find("."+y);t[0].disabled||("all"===t.attr("lay-type")&&i.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=n)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on("click",function(){var n=a(this),i=n.data("index"),l=e.layBox.eq(i),r=[];if(!n.hasClass(o)){e.layBox.eq(i).each(function(t){var n=a(this),i=n.find("."+y);i.children("li").each(function(){var t=a(this),n=t.find('input[type="checkbox"]'),i=n.data("hide");n[0].checked&&!i&&(n[0].checked=!1,l.siblings("."+s).find("."+y).append(t.clone()),t.remove(),r.push(n[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings("."+s).find("."+h+" input");""===c.val()||c.trigger("keyup"),t.onchange&&t.onchange(e.getData(r),i)}}),e.laySearch.find("input").on("keyup",function(){var n=this.value,i=a(this).parents("."+h).eq(0).siblings("."+y),l=i.children("li");l.each(function(){var e=a(this),t=e.find('input[type="checkbox"]'),i=t[0].title.indexOf(n)!==-1;e[i?"removeClass":"addClass"](c),t.data("hide",!i)}),e.renderCheckBtn();var r=l.length===i.children("li."+c).length;e.noneView(i,r?t.text.searchNone:"")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(i,l)});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,y,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),{config:t,reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)}}},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=function(e,a,l,n){var o=e.templet?function(){return"function"==typeof e.templet?e.templet(l):i(t(e.templet).html()||String(a)).render(l)}():a;return n?t("<div>"+o+"</div>").text():o},y="table",h=".layui-table",f="layui-hide",p="layui-none",v="layui-table-view",m=".layui-table-tool",g=".layui-table-box",b=".layui-table-init",x=".layui-table-header",k=".layui-table-body",C=".layui-table-main",w=".layui-table-fixed",T=".layui-table-fixed-l",A=".layui-table-fixed-r",L=".layui-table-total",N=".layui-table-page",S=".layui-table-sort",W="layui-table-edit",_="layui-table-hover",E=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("")},z=['<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(""),H=['<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-anim layui-anim-rotate layui-anim-loop"></i>',"</div>","{{# } }}","{{# var left, right; }}",'<div class="layui-table-header">',E(),"</div>",'<div class="layui-table-body layui-table-main">',z,"</div>","{{# if(left){ }}",'<div class="layui-table-fixed layui-table-fixed-l">','<div class="layui-table-header">',E({fixed:!0}),"</div>",'<div class="layui-table-body">',z,"</div>","</div>","{{# }; }}","{{# if(right){ }}",'<div class="layui-table-fixed layui-table-fixed-r">','<div class="layui-table-header">',E({fixed:"right"}),'<div class="layui-table-mend"></div>',"</div>",'<div class="layui-table-body">',z,"</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(""),R=t(window),F=t(document),j=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};j.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},j.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=R.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+v),o=e.elem=t(i(H).render({VIEW_CLASS:v,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(m),e.layBox=o.find(g),e.layHeader=o.find(x),e.layMain=o.find(C),e.layBody=o.find(k),e.layFixed=o.find(w),e.layFixLeft=o.find(T),e.layFixRight=o.find(A),e.layTotal=o.find(L),e.layPage=o.find(N),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(x).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},j.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])},j.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)})})},j.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="string"==typeof t?r[t]: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(""))},j.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"](f),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},j.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)})})},j.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)},j.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},j.prototype.reload=function(e){var i=this;e=e||{},delete i.haveInit,e.data&&e.data.constructor===Array&&delete i.config.data,i.config=t.extend(!0,{},i.config,e),i.render()},j.prototype.errorView=function(e){var i=this,a=i.layMain.find("."+p),l=t('<div class="'+p+'">'+(e||"Error")+"</div>");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(f),i.layMain.find("tbody").html(""),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},j.prototype.page=1,j.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)),i.loading(),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.errorView(t[n.msgName]||'返回的数据不符合规范,正确的成功状态码应为:"'+n.statusName+'": '+n.statusCode)):(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.errorView("数据接口请求异常:"+t),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,c[n.countName]),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},j.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},j.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,y=e[s.response.dataName]||[],h=[],v=[],m=[],g=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(y,function(a,l){var o=[],y=[],p=[],g=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,v=l[c];if(void 0!==v&&null!==v||(v=""),!r.colGroup){var m=['<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="'+v+'"'),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(f),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:g},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 g}return r.toolbar?i(t(r.toolbar).html()||"").render(n):u(r,v,n)}(),"</div></td>"].join("");o.push(m),r.fixed&&"right"!==r.fixed&&y.push(m),"right"===r.fixed&&p.push(m)}}),h.push('<tr data-index="'+a+'">'+o.join("")+"</tr>"),v.push('<tr data-index="'+a+'">'+y.join("")+"</tr>"),m.push('<tr data-index="'+a+'">'+p.join("")+"</tr>"))}),c.layBody.scrollTop(0),c.layMain.find("."+p).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(v.join("")),c.layFixRight.find("tbody").html(m.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 d.cache[c.key]=y,c.layPage[0==o||0===y.length&&1==n?"addClass":"removeClass"](f),r?g():0===y.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(f),g(),c.renderTotal(y),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.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},j.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))})}),t.dataTotal={};var l=[];t.eachCols(function(e,n){var o=n.field||e,r=function(){var e=n.totalRowText||"",t=parseFloat(a[o]).toFixed(2),i={};return i[o]=t,t=u(n,t,i),n.totalRow?t||e:e}(),d=['<td data-field="'+o+'" data-key="'+i.index+"-"+n.key+'" '+function(){var e=[];return n.align&&e.push('align="'+n.align+'"'),n.style&&e.push('style="'+n.style+'"'),n.minWidth&&e.push('data-minwidth="'+n.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return n.hide&&e.push(f),n.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','<div class="layui-table-cell laytable-cell-'+function(){var e=i.index+"-"+n.key;return"normal"===n.type?e:e+" laytable-cell-"+n.type}()+'">'+r,"</div></td>"].join("");n.field&&(t.dataTotal[o]=r),l.push(d)}),t.layTotal.find("tbody").html("<tr>"+l.join("")+"</tr>")}},j.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},j.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},j.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)},j.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},u=c.config,h=u.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},u.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[u.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,y,"sort("+h+")",{field:n,type:i})},j.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(b).remove()):(i.layInit=t(['<div class="layui-table-init">','<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>',"</div>"].join("")),i.layBox.append(i.layInit)))},j.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)},j.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)))},j.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})},j.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=R.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-=t.layPage.outerHeight()||41),t.layMain.css("height",e-2))},j.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},j.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(k).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](f),e.layFixRight.css("right",a-1)},j.prototype.events=function(){var e,i=this,a=i.config,o=t("body"),c={},s=i.layHeader.find("th"),h=".layui-table-cell",p=a.elem.attr("lay-filter");i.layTool.on("click","*[lay-event]",function(e){var o=t(this),c=o.attr("lay-event"),s=function(e){var l=t(e.list),n=t('<ul class="layui-table-tool-panel"></ul>');n.html(l),a.height&&n.css("max-height",a.height-(i.layTool.outerHeight()||50)),o.find(".layui-table-tool-panel")[0]||o.append(n),i.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),F.trigger("table.tool.panel.remove"),l.close(i.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return i.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 l=t(e.elem),n=this.checked,o=l.data("key"),r=l.data("parentkey");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+"-"+t===o){var d=l.hide;l.hide=!n,i.elem.find('*[data-key="'+a.index+"-"+o+'"]')[n?"removeClass":"addClass"](f),d!=l.hide&&i.setParentCol(!n,r),i.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,l){l.on("click",function(){var e=t(this).data("type");d.exportFile.call(i,a.id,null,e)})}});break;case"LAYTABLE_PRINT":var u=window.open("打印窗口","_blank"),h=["<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(i.layHeader.html());v.append(i.layMain.find("table").html()),v.append(i.layTotal.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),u.document.write(h+v.prop("outerHTML")),u.document.close(),u.print(),u.close()}layui.event.call(this,y,"toolbar("+p+")",t.extend({event:c,config:a},{}))}),s.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var l=t(this);if(c.allowResize){var n=l.data("key");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();c.rule=e,c.ruleWidth=parseFloat(t),c.minWidth=l.data("minwidth")||a.cellMinWidth})}}),F.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var a=c.ruleWidth+t.clientX-c.offset[0];a<c.minWidth&&(a=c.minWidth),c.rule.style.width=a+"px",l.close(i.tipsIndex)}e=1}}).on("mouseup",function(t){c.resizeStart&&(c={},o.css("cursor",""),i.scrollPatch()),2===e&&(e=null)}),s.on("click",function(a){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 i.sort(n,l,null,!0)):e=2}).find(S+" .layui-edge ").on("click",function(e){var a=t(this),l=a.index(),n=a.parents("th").eq(0).data("field");layui.stope(e),0===l?i.sort(n,"asc",null,!0):i.sort(n,"desc",null,!0)});var v=function(e){var a=t(this),l=a.parents("tr").eq(0).data("index"),n=i.layBody.find('tr[data-index="'+l+'"]'),o=d.cache[i.key]||[];return o=o[l]||{},t.extend({tr:n,data:d.clearCacheKey(o),del:function(){d.cache[i.key][l]=[],n.remove(),i.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,t){if(e in o){var a,l=n.children('td[data-field="'+e+'"]');o[e]=t,i.eachCols(function(t,i){i.field==e&&i.templet&&(a=i.templet)}),l.children(h).html(u({templet:a},t,o)),l.data("content",t)}})}},e)};i.elem.on("click",'input[name="layTableCheckbox"]+',function(){var e=t(this).prev(),a=i.layBody.find('input[name="layTableCheckbox"]'),l=e.parents("tr").eq(0).data("index"),n=e[0].checked,o="layTableAllChoose"===e.attr("lay-filter");o?(a.each(function(e,t){t.checked=n,i.setCheckData(e,n)}),i.syncCheckAll(),i.renderForm("checkbox")):(i.setCheckData(l,n),i.syncCheckAll()),layui.event.call(e[0],y,"checkbox("+p+")",v.call(e[0],{checked:n,type:o?"all":"one"}))}),i.elem.on("click",'input[lay-type="layTableRadio"]+',function(){var e=t(this).prev(),a=e[0].checked,l=d.cache[i.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}),i.setThisRowChecked(n),layui.event.call(this,y,"radio("+p+")",v.call(this,{checked:a}))}),i.layBody.on("mouseenter","tr",function(){var e=t(this),a=e.index();e.data("off")||i.layBody.find("tr:eq("+a+")").addClass(_)}).on("mouseleave","tr",function(){var e=t(this),a=e.index();e.data("off")||i.layBody.find("tr:eq("+a+")").removeClass(_)}).on("click","tr",function(){m.call(this,"row")}).on("dblclick","tr",function(){m.call(this,"rowDouble")});var m=function(e){var i=t(this);i.data("off")||layui.event.call(this,y,e+"("+p+")",v.call(i.children("td")[0]))};i.layBody.on("change","."+W,function(){var e=t(this),a=this.value,l=e.parent().data("field"),n=e.parents("tr").eq(0).data("index"),o=d.cache[i.key][n];o[l]=a,layui.event.call(this,y,"edit("+p+")",v.call(this,{value:a,field:l}))}).on("blur","."+W,function(){var e,a=t(this),l=this,n=a.parent().data("field"),o=a.parents("tr").eq(0).data("index"),r=d.cache[i.key][o];i.eachCols(function(t,i){i.field==n&&i.templet&&(e=i.templet)}),a.siblings(h).html(function(t){return u({templet:e},t,r)}(l.value)),a.parent().data("content",l.value),a.remove()}),i.layBody.on("click","td",function(e){var i=t(this),a=(i.data("field"),i.data("edit")),l=i.children(h);if(!i.data("off")&&a){var n=t('<input class="layui-input '+W+'">');return n[0].value=i.data("content")||l.text(),i.find("."+W)[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(h);if(!i.data("off"))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>')}};i.layBody.on("click","."+g,function(e){var n=t(this),o=n.parent(),d=o.children(h);i.tipsIndex=l.tips(['<div class="layui-table-tips-main" style="margin-top: -'+(d.height()+16)+"px;"+function(){return"sm"===a.size?"padding: 4px 15px; font-size: 12px;":"lg"===a.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:i.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)}),i.layBody.on("click","*[lay-event]",function(){var e=t(this),a=e.parents("tr").eq(0).data("index");layui.event.call(this,y,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),i.setThisRowChecked(a)}),i.layMain.on("scroll",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(k).scrollTop(n),l.close(i.tipsIndex)}),R.on("resize",function(){i.resize()})},function(){F.on("click",function(){F.trigger("table.remove.tool.panel")}),F.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()})}(),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){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var l=c.config[e]||{},n={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],s=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(s.href="data:"+n+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],l=[],n=[];return layui.each(t,function(t,a){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(a),function(e,t){n.push('"'+(t||"")+'"')})):d.eachCols(e,function(e,l){if(l.field&&"normal"==l.type&&!l.hide){var o=a[l.field];void 0!==o&&null!==o||(o=""),0==t&&i.push(l.title||""),n.push('"'+u(l,o,a,"text")+'"')}}),l.push(n.join(","))}),layui.each(a.dataTotal,function(e,t){n.push(t)}),i.join(",")+"\r\n"+l.join("\r\n")+"\r\n"+n.join(",")}()),s.download=(l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(s),s.click(),void document.body.removeChild(s))},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,t){var i=s(e);if(i){var a=c.that[e];return a.reload(t),c.call(a)}},d.render=function(e){var t=new j(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(y,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&&(clearInterval(e.timer),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,n,a="layui-fixbar",o="layui-fixbar-top",r=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="'+a+'">',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 '+o+'" lay-type="top" style="'+t.bgcolor+'">'+c[2]+"</li>","</ul>"].join("")),s=g.find("."+o),u=function(){var e=r.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+a)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),n=i.attr("lay-type");"top"===n&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,n)}),r.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var n=this,a="function"==typeof e,o=new Date(t).getTime(),r=new Date(!e||a?(new Date).getTime():e).getTime(),l=o-r,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=e);var g=setTimeout(function(){n.countdown(t,r+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,n=[[],[]],a=(new Date).getTime()-new Date(t).getTime();return a>6912e5?(a=new Date(t),n[0][0]=i.digit(a.getFullYear(),4),n[0][1]=i.digit(a.getMonth()+1),n[0][2]=i.digit(a.getDate()),e||(n[1][0]=i.digit(a.getHours()),n[1][1]=i.digit(a.getMinutes()),n[1][2]=i.digit(a.getSeconds())),n[0].join("-")+" "+n[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=12e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var n=t.length;n<e;n++)i+="0";return t<Math.pow(10,e)?i+(0|t):t},toDateString:function(t,e){var i=this,n=new Date(t||new Date),a=[i.digit(n.getFullYear(),4),i.digit(n.getMonth()+1),i.digit(n.getDate())],o=[i.digit(n.getHours()),i.digit(n.getMinutes()),i.digit(n.getSeconds())];return e=e||"yyyy-MM-dd HH:mm:ss",e.replace(/yyyy/g,a[0]).replace(/MM/g,a[1]).replace(/dd/g,a[2]).replace(/HH/g,o[0]).replace(/mm/g,o[1]).replace(/ss/g,o[2])},escape:function(t){return String(t||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,""")},event:function(t,n,a){n=i.event[t]=e.extend(!0,i.event[t],n)||{},e("body").on(a||"click","*["+t+"]",function(){var i=e(this),a=i.attr(t);n[a]&&n[a].call(this,i)})}};!function(t,e,i){"$:nomunge";function n(){a=e[l](function(){o.each(function(){var e=t(this),i=e.width(),n=e.height(),a=t.data(this,g);(i!==a.w||n!==a.h)&&e.trigger(c,[a.w=i,a.h=n])}),n()},r[s])}var a,o=t([]),r=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";r[s]=250,r[u]=!0,t.event.special[c]={setup:function(){if(!r[u]&&this[l])return!1;var e=t(this);o=o.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===o.length&&n()},teardown:function(){if(!r[u]&&this[l])return!1;var e=t(this);o=o.not(e),e.removeData(g),o.length||clearTimeout(a)},add:function(e){function n(e,n,o){var r=t(this),l=t.data(this,g)||{};l.w=n!==i?n:r.width(),l.h=o!==i?o:r.height(),a.apply(this,arguments)}if(!r[u]&&this[l])return!1;var a;return t.isFunction(e)?(a=e,n):(a=e.handler,void(e.handler=n))}}}(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
index 3cd51c2..4615b57 100755
--- a/payapi/src/main/resources/static/libs/layui/layui.js
+++ b/payapi/src/main/resources/static/libs/layui/layui.js
@@ -1,2 +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
+/** layui-v2.5.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.5.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",transfer:"modules/transfer",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.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/templates/system/dtl/shopdtl.html b/payapi/src/main/resources/templates/system/dtl/shopdtl.html
index ecebe4e..e606eae 100644
--- a/payapi/src/main/resources/templates/system/dtl/shopdtl.html
+++ b/payapi/src/main/resources/templates/system/dtl/shopdtl.html
@@ -27,7 +27,7 @@
<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">
+ <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>
@@ -38,7 +38,7 @@
<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">
+ <select name="status" id="shopdtl-search-status" class="layui-select">
<option value=""> 全部</option>
<option th:each="st:${dtlStatusList}" th:value="${st.dictval}"
th:text="${st.dictcaption}"></option>
@@ -182,12 +182,12 @@
endAccdate: $("#shopdtl-search-endAccdate").val(),
startTransdate: $("#shopdtl-search-startTransdate").val(),
endTransdate: $("#shopdtl-search-endTransdate").val(),
- personname: $("#shopdtl-search-personname").val(),
+ shopname: $("#shopdtl-search-shopname").val(),
shopaccno: $("#shopdtl-search-shopaccno").val(),
- sourceType: $("#shopdtl-search-sourceType").val(),
+ sourcetype: $("#shopdtl-search-sourcetype").val(),
tradeflag: $("#shopdtl-search-tradeflag").val(),
transcode: $("#shopdtl-search-transcode").val(),
- transStatus: $("#shopdtl-search-transStatus").val()
+ status: $("#shopdtl-search-status").val()
}, page: {curr: 1}
});
});
@@ -200,10 +200,10 @@
"endTransdate": "",
"shopname": "",
"shopaccno": "",
- "sourceType": "",
+ "sourcetype": "",
"tradeflag": "",
"transcode": "",
- "transStatus": ""
+ "status": ""
});
form.render("select");
treeSelect.revokeNode('shopdtl-search-shopaccno-filter');
@@ -217,10 +217,14 @@
cols: [
[
{field: 'refno', title: '参考号', align: 'center', width: 200, sort: true},
- {field: 'accdate', title: '记账日期', align: 'center', width: 100, sort: true},
+ {field: 'accdate', title: '记账日期', align: 'center', width: 110, 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: 'amount', title: '交易金额', align: 'center', width: 120, sort: true, templet: function (e) {
+ return parseFloat(e.amount).toFixed(2);
+ }
+ },
{
field: 'transStatus',
title: '状态',
@@ -240,23 +244,23 @@
}
}
},
- {
- 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: '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: 110, sort: true},
+ {field: 'transtime', title: '交易时间', align: 'center', width: 110, sort: true},
{
field: 'sourceType',
title: '支付方式',
@@ -279,7 +283,7 @@
{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}
+ {field: 'remark', title: '备注信息', align: 'center', width: 250}
]
]
});
diff --git a/payapi/src/main/resources/templates/system/dtl/userdtl.html b/payapi/src/main/resources/templates/system/dtl/userdtl.html
index 85c7665..dfd3526 100644
--- a/payapi/src/main/resources/templates/system/dtl/userdtl.html
+++ b/payapi/src/main/resources/templates/system/dtl/userdtl.html
@@ -35,7 +35,7 @@
<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">
+ <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>
@@ -63,7 +63,7 @@
<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">
+ <select name="status" id="userdtl-search-transStatus" class="layui-select">
<option value=""> 全部</option>
<option th:each="st:${dtlStatusList}" th:value="${st.dictval}"
th:text="${st.dictcaption}"></option>
@@ -148,10 +148,10 @@
endTransdate: $("#userdtl-search-endTransdate").val(),
personname: $("#userdtl-search-personname").val(),
cardno: $("#userdtl-search-cardno").val(),
- sourceType: $("#userdtl-search-sourceType").val(),
+ sourcetype: $("#userdtl-search-sourceType").val(),
tradeflag: $("#userdtl-search-tradeflag").val(),
transcode: $("#userdtl-search-transcode").val(),
- transStatus: $("#userdtl-search-transStatus").val()
+ status: $("#userdtl-search-transStatus").val()
}, page: {curr: 1}
});
});
@@ -164,10 +164,10 @@
"endTransdate": "",
"personname": "",
"cardno": "",
- "sourceType": "",
+ "sourcetype": "",
"tradeflag": "",
"transcode": "",
- "transStatus": ""
+ "status": ""
});
form.render("select");
});
@@ -180,10 +180,14 @@
cols: [
[
{field: 'refno', title: '参考号', align: 'center', width: 200, sort: true},
- {field: 'accdate', title: '记账日期', align: 'center', width: 100, sort: true},
+ {field: 'accdate', title: '记账日期', align: 'center', width: 110, 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: 'amount', title: '交易金额', align: 'center', width: 120, sort: true, templet: function (e) {
+ return parseFloat(e.amount).toFixed(2);
+ }
+ },
{
field: 'status',
title: '状态',
@@ -203,23 +207,23 @@
}
}
},
- {
- 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: '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: 110, sort: true},
+ {field: 'transtime', title: '交易时间', align: 'center', width: 110, sort: true},
{
field: 'sourceType',
title: '支付方式',
@@ -242,7 +246,7 @@
{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}
+ {field: 'remark', title: '备注信息', align: 'center', width: 250}
]
]
});
diff --git a/payapi/src/main/resources/templates/system/param/sourcetype.html b/payapi/src/main/resources/templates/system/param/sourcetype.html
index 74087c2..ec041be 100644
--- a/payapi/src/main/resources/templates/system/param/sourcetype.html
+++ b/payapi/src/main/resources/templates/system/param/sourcetype.html
@@ -128,7 +128,7 @@
},
{
field: 'consumeEnable',
- title: '能否消费',
+ title: '允许消费',
align: 'center',
templet: '#consumeenable-tpl-state',
sort: true
@@ -142,7 +142,7 @@
},
{
field: 'reversable',
- title: '能否冲正',
+ title: '允许撤销',
align: 'center',
templet: '#reversable-tpl-state',
sort: true
diff --git a/payapi/src/main/resources/templates/system/param/sourcetypeconfig.html b/payapi/src/main/resources/templates/system/param/sourcetypeconfig.html
index 4058462..4cc1461 100644
--- a/payapi/src/main/resources/templates/system/param/sourcetypeconfig.html
+++ b/payapi/src/main/resources/templates/system/param/sourcetypeconfig.html
@@ -8,11 +8,11 @@
</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 class="layui-input-block" style="margin:0;display: inline;float: left;width: 25%;">
+ <label class="layui-form-label" style="float: right;width: 100%;" th:text="${config.configName}">参数名</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}" th:placeholder="${config.configName}" autocomplete="off"/>
+ <div class="layui-input-block" style="margin:0;display: inline;float: right;width: 75%;">
+ <input type="text" th:name="${config.configid}" class="layui-input" th:value="${config.configValue}" th:placeholder="${config.configid}" autocomplete="off"/>
</div>
</div>
diff --git a/payapi/src/main/resources/templates/system/param/sourcetypeform.html b/payapi/src/main/resources/templates/system/param/sourcetypeform.html
index ca3f5df..60fd97d 100644
--- a/payapi/src/main/resources/templates/system/param/sourcetypeform.html
+++ b/payapi/src/main/resources/templates/system/param/sourcetypeform.html
@@ -52,7 +52,7 @@
</div>
<div class="layui-form-item">
- <label class="layui-form-label">能否消费</label>
+ <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/>
@@ -68,7 +68,7 @@
</div>
<div class="layui-form-item">
- <label class="layui-form-label">能否冲正</label>
+ <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/>
diff --git a/payapi/src/main/resources/templates/system/report/shopbusiness.html b/payapi/src/main/resources/templates/system/report/shopbusiness.html
index 9638612..93833b1 100644
--- a/payapi/src/main/resources/templates/system/report/shopbusiness.html
+++ b/payapi/src/main/resources/templates/system/report/shopbusiness.html
@@ -2,24 +2,26 @@
<div class="layui-card-header">
<h2 class="header-title">商户营业情况表</h2>
<span class="layui-breadcrumb pull-right">
- <a href="#">结算中心</a>
+ <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-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}"
+ <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}"
+ <input type="text" name="enddate" id="shopbusiness-search-enddate" placeholder="截止日期"
+ th:value="${maxdate}"
autocomplete="off" class="layui-input"/>
</div>
</div>
@@ -27,14 +29,16 @@
<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"
+ <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="显示未交易商户"/>
+ <input type="checkbox" name="nodealshow" id="shopbusiness-search-nodealshow" lay-skin="primary"
+ title="显示未交易商户"/>
</div>
</div>
@@ -54,7 +58,8 @@
<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>
+ <button class="layui-btn layui-btn-sm" id="btn-expand-shopbusiness" lay-event="shopbusinessExpandAll">全部展开
+ </button>
</div>
</script>
@@ -124,13 +129,17 @@
page: false,
where: obj,
showicon: false,
- toolbar:'#shopbusiness-toolbar',
+ toolbar: '#shopbusiness-toolbar',
cols: [
[
{field: 'shopname', title: '商户名称', align: 'left'},
{field: 'summary', title: '交易摘要', align: 'center'},
{field: 'transcnt', title: '交易次数', align: 'center'},
- {field: 'transamt', title: '交易金额', align: 'center'}
+ {
+ field: 'transamt', title: '交易金额', align: 'center', templet: function (e) {
+ return parseFloat(e.transamt).toFixed(2);
+ }
+ }
]
],
done: function (res, curr, count) {
@@ -167,8 +176,8 @@
});
});
- table.on('toolbar(shopbusinessTable-filter)', function(obj){
- switch(obj.event){
+ table.on('toolbar(shopbusinessTable-filter)', function (obj) {
+ switch (obj.event) {
case 'shopbusinessShowFold':
treetable.foldAll('#shopbusinessTable');
break;
diff --git a/payapi/src/main/resources/templates/system/report/subjectday.html b/payapi/src/main/resources/templates/system/report/subjectday.html
index 11453f8..9ff137c 100644
--- a/payapi/src/main/resources/templates/system/report/subjectday.html
+++ b/payapi/src/main/resources/templates/system/report/subjectday.html
@@ -2,7 +2,7 @@
<div class="layui-card-header">
<h2 class="header-title">科目汇总表</h2>
<span class="layui-breadcrumb pull-right">
- <a href="#">结算中心</a>
+ <a href="#">报表中心</a>
<a><cite>科目汇总表</cite></a>
</span>
</div>
@@ -103,16 +103,41 @@
}
},
- {align: 'center', title: '期初余额', colspan: 2},
+ // {align: 'center', title: '期初余额', colspan: 2},
{align: 'center', title: '本期发生额', colspan: 2},
- {align: 'center', title: '期末余额', colspan: 2}
+ {
+ align: 'center', title: '期末扎差', rowspan: 2, templet: function (e) {
+ if(e.balflag == 1){
+ return parseFloat(e.drbal).toFixed(2);
+ }else{
+ return parseFloat(e.crbal).toFixed(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'}
+ // {field: 'lastdaydrbal', title: '借方', align: 'center'},
+ // {field: 'lastdaycrbal', title: '贷方', align: 'center'},
+ {
+ field: 'dramt', title: '借方', align: 'center', templet: function (e) {
+ return parseFloat(e.dramt).toFixed(2);
+ }
+ },
+ {
+ field: 'cramt', title: '贷方', align: 'center', templet: function (e) {
+ return parseFloat(e.cramt).toFixed(2);
+ }
+ }
+ // ,{
+ // field: 'drbal', title: '借方', align: 'center', templet: function (e) {
+ // return parseFloat(e.drbal).toFixed(2);
+ // }
+ // },
+ // {
+ // field: 'crbal', title: '贷方', align: 'center', templet: function (e) {
+ // return parseFloat(e.crbal).toFixed(2);
+ // }
+ // }
]
],
// cols: [
diff --git a/payapi/src/main/resources/templates/system/report/subjectdetail.html b/payapi/src/main/resources/templates/system/report/subjectdetail.html
index f1b65e9..3898f99 100644
--- a/payapi/src/main/resources/templates/system/report/subjectdetail.html
+++ b/payapi/src/main/resources/templates/system/report/subjectdetail.html
@@ -2,7 +2,7 @@
<div class="layui-card-header">
<h2 class="header-title">科目明细账</h2>
<span class="layui-breadcrumb pull-right">
- <a href="#">结算中心</a>
+ <a href="#">报表中心</a>
<a><cite>科目明细账</cite></a>
</span>
</div>
@@ -26,7 +26,7 @@
<div class="layui-inline">
<label class="layui-form-label">选择科目</label>
<div class="layui-input-block">
- <input type="text" name="subjid" id="subjectdetail-search-subjid" placeholder="选择科目" lay-filter="subjectdetail-search-subjid-filter"
+ <input type="text" name="subjno" id="subjectdetail-search-subjno" placeholder="选择科目" lay-filter="subjectdetail-search-subjno-filter"
autocomplete="off" class="layui-input"/>
</div>
</div>
@@ -72,7 +72,7 @@
});
treeSelect.render({
- elem: '#subjectdetail-search-subjid',
+ elem: '#subjectdetail-search-subjno',
data: '[[@{/report/subjectselecttree}]]',
type: 'get',
placeholder: '选择科目',
@@ -92,7 +92,7 @@
if(treeNode.accno == '0'){
layer.msg("请选择末级科目", {icon: 2, time:1500});
$("#subjectdetail-search-subjid").val("");
- treeSelect.revokeNode('subjectdetail-search-subjid-filter');
+ treeSelect.revokeNode('subjectdetail-search-subjno-filter');
return false;
}
return true;
@@ -119,10 +119,18 @@
return dateFormat('' + d.voucherdate);
}
},
- {field: 'voucherno', title: '凭证号', align: 'center', width: 80, sort: true},
+ {field: 'voucherno', title: '凭证号', align: 'center', width: 100, sort: true},
{field: 'summary', title: '摘要', align: 'center'},
- {field: 'dramt', title: '借方发生额', align: 'center'},
- {field: 'cramt', title: '贷方发生额', align: 'center'},
+ {
+ field: 'dramt', title: '借方发生额', align: 'center', templet: function (e) {
+ return parseFloat(e.dramt).toFixed(2);
+ }
+ },
+ {
+ field: 'cramt', title: '贷方发生额', align: 'center', templet: function (e) {
+ return parseFloat(e.cramt).toFixed(2);
+ }
+ },
{
field: 'balflag', title: '方向', align: 'center', width: 80, templet: function (d) {
if (d.balflag == 1) {
@@ -132,7 +140,11 @@
}
}
},
- {field: 'balance', title: '余额', align: 'center'},
+ {
+ field: 'balance', title: '余额', align: 'center', templet: function (e) {
+ return parseFloat(e.balance).toFixed(2);
+ }
+ },
{field: 'oppname', title: '对方户名', align: 'center'}
]
]
@@ -141,14 +153,14 @@
renderTable({
startdate: $('#subjectdetail-search-startdate').val(),
enddate: $('#subjectdetail-search-enddate').val(),
- subjid: null
+ subjno: null
})
$('#subjectdetail-search-btn').click(function () {
var startdate = $("#subjectdetail-search-startdate").val();
var enddate = $("#subjectdetail-search-enddate").val();
- var subjid = $("#subjectdetail-search-subjid").val();
+ var subjid = $("#subjectdetail-search-subjno").val();
if (null == startdate || "" == $.trim(startdate)) {
layer.msg('请选择起始日期', {icon: 2, time: 1500});
return;
@@ -165,7 +177,7 @@
renderTable({
startdate: startdate,
enddate: enddate,
- subjid: subjid
+ subjno: subjid
})
});
diff --git a/payapi/src/main/resources/templates/system/settlelog/index.html b/payapi/src/main/resources/templates/system/settlelog/index.html
new file mode 100644
index 0000000..2e381f2
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/settlelog/index.html
@@ -0,0 +1,158 @@
+<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-settlelog-accdate" class="layui-input search-input" type="text" style="width: 150px;"
+ placeholder="输入执行日期查询"/> 
+ <select id="search-settlelog-status" class="layui-select search-input">
+ <option value="">--请选择状态--</option>
+ <option value="success">成功</option>
+ <option value="error">失败</option>
+ </select>
+ <button id="search-settlelog-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ <button id="search-settlelog-deal" class="layui-btn icon-btn layui-btn-normal" data-type="add"><i
+ class="layui-icon"></i>执行结算
+ </button>
+ <button id="search-settlelog-reset" class="layui-btn layui-btn-primary" data-type="reset"><i
+ class="layui-icon"></i>清 空
+ </button>
+ </div>
+ <table class="layui-table" id="settlementLogTable" lay-filter="settlementLogTable-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: '#search-settlelog-accdate',
+ trigger: 'click'
+ });
+
+ // 渲染表格
+ table.render({
+ elem: '#settlementLogTable',
+ url: '[[@{/settlelog/datalist}]]',
+ page: true,
+ cols: [
+ [
+ {
+ field: 'starttime',
+ title: '开始时间',
+ width: 200,
+ align: 'center',
+ fixed: 'left',
+ sort: true,
+ templet: function (e) {
+ return admin.formatDate(e.starttime);
+ }
+ },
+ {
+ field: 'endtime',
+ title: '结束时间',
+ width: 200,
+ align: 'center',
+ fixed: 'left',
+ sort: true,
+ templet: function (e) {
+ if(null!=e.endtime) {
+ return admin.formatDate(e.endtime);
+ }else{
+ return '';
+ }
+ }
+ },
+ {
+ field: 'errcode', title: '状态', width: 100, align: 'center', sort: true, templet: function (e) {
+ if (null == e.errcode) {
+ return '';
+ } else if ('0' == e.errcode) {
+ return '<span class="layui-badge layui-bg-green">成功</span>';
+ } else if('-99' == e.errcode){
+ return '<span class="layui-badge layui-bg-gray">无效</span>';
+ } else {
+ return '<span class="layui-badge">失败</span>';
+ }
+ }
+ },
+ {
+ align: 'center', title: '执行时间', width: 120, templet: function (e) {
+ if (null == e.endtime) {
+ return '-';
+ }
+ var seconds = moment(e.endtime, 'YYYYMMDDHHmmss').diff(moment(e.starttime, 'YYYYMMDDHHmmss'), 'seconds');
+ if (seconds > 0) {
+ var h = parseInt(seconds / 3600);
+ var m = parseInt((seconds - 3600 * h) / 60);
+ var s = seconds % 60;
+ var msg = '';
+ if (h > 0) {
+ msg = msg + h + '时';
+ }
+ if (m > 0) {
+ msg = msg + m + '分';
+ }
+ if (s > 0) {
+ msg = msg + s + '秒';
+ }
+ return msg;
+ } else {
+ return '0';
+ }
+ }
+ },
+ {field: 'errcode', title: '错误码', width: 100, align: 'center'},
+ {field: 'errmsg', title: '错误信息', align: 'left'}
+ ]
+ ]
+ });
+ // 搜索按钮点击事件
+ $('#search-settlelog-search').click(function () {
+ var accdate = $("#search-settlelog-accdate").val();
+ var status = $("#search-settlelog-status").val();
+ table.reload('settlementLogTable', {where: {accdate: accdate, status: status}, page: {curr: 1}});
+ });
+
+ $('#search-settlelog-deal').click(function () {
+ layer.confirm("确定要调起结算吗?", function () {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/settlelog/dosettle}]]', {
+ _csrf: token
+ }, function (data) {
+ if (data.code === 200) {
+ layer.msg(data.msg, {icon: 1, time: 1000});
+ table.reload('settlementLogTable');
+ } 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});
+ return;
+ }
+ }, function (err) {
+ admin.errorBack(err);
+ });
+ });
+ });
+
+ $('#search-settlelog-reset').click(function () {
+ $("#search-settlelog-accdate").val("");
+ $("#search-settlelog-status").val("");
+ form.render("select");
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/shop/addshop.html b/payapi/src/main/resources/templates/system/shop/addshop.html
new file mode 100644
index 0000000..9a2a8cc
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/shop/addshop.html
@@ -0,0 +1,340 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">新增商户</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#!_shop_index">商户管理</a>
+ <a><cite>新增商户</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div id="shop-add-info" class="layui-form toolbar" lay-filter="shop-add-info-form">
+ <div class="layui-card-header">商户基本信息</div>
+ <div class="layui-form-item" style="margin-left: 15px;margin-top: 15px;">
+ <label class="layui-form-label" style="color: red;width: 100px;"><span
+ style="color: red;">*</span>商户类型</label>
+ <div class="layui-input-inline">
+ <select name="shoptype" id="shop-add-shoptype" lay-filter="shop-add-shoptype-filter"
+ lay-verify="required">
+ <option value="group">商户组</option>
+ <option value="normal">结算商户</option>
+ </select>
+ </div>
+ <div class="layui-form-mid layui-word-aux">
+ 注意:商户组无商户编码,且能创建下级商户。结算商户是叶子商户,会创建商户编码。保存后无法修改!!!
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">商户序号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="shopid" class="layui-input" style="background-color: #f1f1f1;"
+ value="0"
+ readonly="readonly"/>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">商户编码</label>
+ <div class="layui-input-inline">
+ <input type="text" name="shopaccno" autocomplete="off" style="background-color: #f1f1f1;"
+ class="layui-input" readonly="readonly"/>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;"><span
+ style="color: red;">*</span>上级商户序号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="fshopid" id="shop-add-fshopid" class="layui-input"
+ autocomplete="off" placeholder="请选择"
+ lay-verify="required|number"/>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;"><span
+ style="color: red;">*</span>商户名</label>
+ <div class="layui-input-inline">
+ <input type="text" name="shopname" id="shop-add-shopname" autocomplete="off"
+ class="layui-input" maxlength="30" lay-verify="required"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-header">商户营业信息</div>
+ <div class="layui-card-body">
+ <div class="layui-form-item" style="margin-left: 15px;margin-top: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>营业执照编号</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <input name="businessLicenseNo" id="shop-add-businessLicenseNo" class="layui-input" maxlength="18"
+ autocomplete="off"/>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>税务登记证号</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <input name="taxRegistrationNo" id="shop-add-taxRegistrationNo" class="layui-input"
+ autocomplete="off"/>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>商户经营地址</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <input name="addr" id="shop-add-addr" class="layui-input" autocomplete="off"/>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span style="color: red;">*</span>法人姓名</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <input name="legalPersonName" id="shop-add-legalPersonName" class="layui-input"
+ autocomplete="off"/>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>法人证件类型</label>
+ <div class="layui-input-inline">
+ <select name="legalPersonIdtype" id="shop-add-legalPersonIdtype" lay-filter="shop-add-legalPersonIdtype-filter" class="layui-select">
+ <option th:each="bean : ${idtypeList}" th:value="${bean.dictval}">[[${bean.dictcaption}]]</option>
+ </select>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>法人证件号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="legalPersonIdno" id="shop-add-legalPersonIdno" class="layui-input"
+ maxlength="20"
+ 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">
+ <label class="layui-form-label" style="width: 100px;">姓名</label>
+ <div class="layui-input-inline">
+ <input type="text" name="contactman" id="shop-add-contactman" class="layui-input"
+ autocomplete="off"/>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">手机号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="mobile" id="shop-add-mobile" class="layui-input" maxlength="20"
+ autocomplete="off"
+ lay-verify="mobile"/>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">邮箱</label>
+ <div class="layui-input-inline">
+ <input type="text" name="email" class="layui-input" autocomplete="off" id="shop-add-email"
+ lay-verify="swEmail"/>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">电话</label>
+ <div class="layui-input-inline">
+ <input type="text" name="tel" id="shop-add-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-add-btn-filter" lay-submit
+ id="submitbtn-shop-add-btn">保存
+ </button>
+ <button class="layui-btn layui-btn-primary" type="button" id="submitbtn-shop-return-btn">返回
+ </button>
+ <div class="layui-inline" style="margin-left: 10px;">
+ <input type="checkbox" id="shop-add-continue-flag" lay-skin="primary"
+ title="继续新增"/>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<script>
+ layui.use(['form', 'table', 'admin', 'jquery', 'element', 'treeSelect'], function () {
+ var form = layui.form;
+ var admin = layui.admin;
+ var $ = layui.jquery;
+ var element = layui.element;
+ var treeSelect = layui.treeSelect;
+
+ $("#shop-add-legalPersonIdtype").val("idcard");
+ form.render("select");
+ 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 "邮箱格式不正确";
+ }
+ }
+ });
+
+ treeSelect.render({
+ elem: '#shop-add-fshopid',
+ data: '[[@{/shop/selectshopgroup}]]',
+ type: 'get',
+ placeholder: '请选择',
+ search: false,
+ style: {
+ folder: {
+ enable: false
+ },
+ line: {
+ enable: true
+ }
+ },
+ // 点击回调
+ click: function (d) {
+ var treeNode = d.current;
+ return true;
+ },
+ success: function (d) {
+ console.log(d); // 加载完成后的回调函数
+ }
+ });
+
+ $("#submitbtn-shop-return-btn").click(function(){
+ element.tabDelete('admin-pagetabs', '_shop_manager_add'); //关闭现有详情
+ element.tabChange('admin-pagetabs','_shop_index');
+ admin.refresh();
+ });
+
+ $("#submitbtn-shop-add-btn").click(function () {
+ var shoptype = $("#shop-add-shoptype").val();
+ var fshopid = $("#shop-add-fshopid").val();
+ var shopname = $("#shop-add-shopname").val();
+ var businessLicenseNo = $("#shop-add-businessLicenseNo").val();
+ var taxRegistrationNo = $("#shop-add-taxRegistrationNo").val();
+ var addr = $("#shop-add-addr").val();
+ var legalPersonName = $("#shop-add-legalPersonName").val();
+ var legalPersonIdtype = $("#shop-add-legalPersonIdtype").val();
+ var legalPersonIdno = $("#shop-add-legalPersonIdno").val();
+ var contactman = $("#shop-add-contactman").val();
+ var mobile = $("#shop-add-mobile").val();
+ var email = $("#shop-add-email").val();
+ var tel = $("#shop-add-tel").val();
+ var token = $("meta[name='_csrf_token']").attr("value");
+ if (isempty(shoptype)) {
+ layer.msg("请选择商户类型", {icon: 2, time: 1000});
+ $("#shop-add-shoptype").focus();
+ return;
+ }
+ if (isempty(fshopid)) {
+ layer.msg("请选择上级商户", {icon: 2, time: 1000});
+ $("#shop-add-fshopid").focus();
+ return;
+ }
+ if (isempty(shopname)) {
+ layer.msg("请填写商户名称", {icon: 2, time: 1000});
+ $("#shop-add-shopname").focus();
+ return;
+ }
+ if ("normal" == shoptype) {
+ if (isempty(businessLicenseNo)) {
+ layer.msg("请填写商户营业执照编号", {icon: 2, time: 1000});
+ $("#shop-add-businessLicenseNo").focus();
+ return;
+ }else if($.trim(businessLicenseNo).length != 18 && $.trim(businessLicenseNo).length != 15){
+ layer.msg("请正确填写商户营业执照编号", {icon: 2, time: 1000});
+ $("#shop-add-businessLicenseNo").focus();
+ return;
+ }
+
+ if (isempty(taxRegistrationNo)) {
+ layer.msg("请填写商户税务登记证号", {icon: 2, time: 1000});
+ $("#shop-add-taxRegistrationNo").focus();
+ return;
+ }
+ if (isempty(addr)) {
+ layer.msg("请填写商户经营地址", {icon: 2, time: 1000});
+ $("#shop-add-addr").focus();
+ return;
+ }
+ if (isempty(legalPersonName)) {
+ layer.msg("请填写商户法人姓名", {icon: 2, time: 1000});
+ $("#shop-add-legalPersonName").focus();
+ return;
+ }
+ if (isempty(legalPersonIdtype)) {
+ layer.msg("请选择法人证件类型", {icon: 2, time: 1000});
+ $("#shop-add-legalPersonIdtype").focus();
+ return;
+ }
+ if (isempty(legalPersonIdno)) {
+ layer.msg("请填写法人证件号", {icon: 2, time: 1000});
+ $("#shop-add-legalPersonIdno").focus();
+ return;
+ }
+ }
+
+ if (!isempty(businessLicenseNo) && $.trim(businessLicenseNo).length != 18 && $.trim(businessLicenseNo).length != 15) {
+ layer.msg("请正确填写商户营业执照编号", {icon: 2, time: 1000});
+ $("#shop-add-businessLicenseNo").focus();
+ return;
+ }
+
+ var str = $("#shop-add-shoptype").find("option:selected").text();
+ layer.confirm("确定要新增【" + str + " - " + shopname + " 】吗?", function () {
+ admin.go('[[@{/shop/addshop}]]', {
+ shoptype: shoptype,
+ fshopid: fshopid,
+ shopname: shopname,
+ businessLicenseNo: businessLicenseNo,
+ taxRegistrationNo: taxRegistrationNo,
+ addr: addr,
+ legalPersonName: legalPersonName,
+ legalPersonIdtype: legalPersonIdtype,
+ legalPersonIdno: legalPersonIdno,
+ contactman: contactman,
+ mobile: mobile,
+ email: email,
+ tel: tel,
+ _csrf: token
+ }, function (data) {
+ if (data.code === 200) {
+ layer.msg(data.msg, {icon: 1, time: 1000});
+ if (!$("#shop-add-continue-flag").is(":checked")) {
+ element.tabDelete('admin-pagetabs', '_shop_manager_add'); //关闭现有详情
+ element.tabChange('admin-pagetabs','_shop_index');
+ admin.refresh();
+ }
+ } 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});
+ return;
+ }
+ }, function (err) {
+ admin.errorBack(err);
+ });
+ });
+ });
+ });
+</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
index 028a976..ea8218e 100644
--- a/payapi/src/main/resources/templates/system/shop/config.html
+++ b/payapi/src/main/resources/templates/system/shop/config.html
@@ -11,11 +11,13 @@
<div class="layui-col-xs5 layui-col-md3">
<div class="layui-card">
<div class="layui-card-header">
- 商户树<span style="font-size: 12px;">(双击结算商户查询)</span>
+ 商户树<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>
+ <input type="hidden" id="shop-sourcetype-config-selected-shopaccno"/>
+ <input type="hidden" id="shop-sourcetype-config-selected-shopname"/>
+ <div class="layui-card-body layui-show"
+ style="border: 1px solid #ddd;padding: 10px;min-height: 520px;overflow: auto;margin-top: 16px;"
+ id="shop-payconfig-ztree">
</div>
</div>
</div>
@@ -76,33 +78,40 @@
</script>
<script>
- layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ layui.use(['form', 'table', 'layer', 'admin', 'element', 'tree'], function () {
var form = layui.form;
var table = layui.table;
var admin = layui.admin;
+ var tree = layui.tree;
+
form.render('select');
- var initTree = function (nodes) {
- var menuSetting = {
- view: {
- dblClickExpand: false,
- showLine: true,
- showIcon: true,
- selectedMulti: false
- },
- data: {
- simpleData: {
- enable: true
+ var renderTree = function (nodes) {
+ tree.render({
+ elem: '#shop-payconfig-ztree',
+ data: nodes,
+ showCheckbox: false,
+ accordion: true,
+ click: function (obj) {
+ $("#shop-sourcetype-config-selected-shopaccno").val(""); //清空
+ $("#shop-sourcetype-config-selected-shopname").val(""); //清空
+ var nd = obj.data;
+ if (null == nd.field || "" == nd.field) {
+ layer.msg("请选择结算商户查询", {icon: 2, time: 1000});
+ return;
}
- },
- callback: {
- onDblClick: ondblclick
+ $("#shop-sourcetype-config-selected-shopaccno").val(nd.field);
+ $("#shop-sourcetype-config-selected-shopname").val(nd.title);
+ table.reload('shopPaytypeTable', {
+ where: {sourcetype: $("#search-sourceType").val(), shopaccno: nd.field},
+ page: {curr: 1}
+ });
}
- };
- $.fn.zTree.init($("#shopacctree"), menuSetting, nodes);
+ });
}
+
admin.dgo('[[@{/shop/shopacctree}]]', {}, function (data) {
if (data.code === 200) {
- initTree(data.data);
+ renderTree(data.data);
} else if (data.code === 401) {
layer.msg(data.msg, {icon: 2, time: 1500}, function () {
location.replace('[[@{/login}]]');
@@ -124,18 +133,6 @@
table.reload('shopPaytypeTable', {where: {sourcetype: ptype, shopaccno: ""}, page: {curr: 1}});
});
- function ondblclick(event, treeId, treeNode) {
- if (treeNode.shoptype !== 'normal' || "" === treeNode.shopaccno) {
- layer.msg("请选择结算商户查询", {icon: 2, time: 1000});
- return;
- }
- var ptype = $("#search-sourceType").val();
- table.reload('shopPaytypeTable', {
- where: {sourcetype: ptype, shopaccno: treeNode.shopaccno},
- page: {curr: 1}
- });
- }
-
// 渲染表格
table.render({
elem: '#shopPaytypeTable',
@@ -146,7 +143,7 @@
[
{
field: 'shopaccno',
- title: '商户账号',
+ title: '商户编码',
width: 150,
align: 'center',
fixed: 'left',
@@ -156,7 +153,7 @@
{field: 'paydesc', title: '支付方式', align: 'center', sort: true},
{
field: 'consumeEnable',
- title: '能否消费',
+ title: '允许消费',
align: 'center',
width: 110,
templet: '#shop-consumeenable-tpl-state',
@@ -172,7 +169,7 @@
},
{
field: 'reverseEnable',
- title: '能否冲正',
+ title: '允许撤销',
align: 'center',
width: 110,
templet: '#shop-reverseenable-tpl-state',
@@ -256,31 +253,31 @@
}
$('#btn-add-shopsourcetype').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});
+ // var ztree = $.fn.zTree.getZTreeObj("shopacctree");
+ // var shopNodes = ztree.getSelectedNodes();
+ debugger
+ var shopaccno = $("#shop-sourcetype-config-selected-shopaccno").val();
+ var shopname = $("#shop-sourcetype-config-selected-shopname").val();
+ if (undefined == shopaccno || null == shopaccno || shopaccno.length == 0) {
+ layer.msg("请先点击选取左侧的一个结算商户", {icon: 2, time: 1000});
return;
}
- var shopNode = shopNodes[0]; //选中商户
- if (shopNode.shoptype !== 'normal' || "" === shopNode.shopaccno) {
- layer.msg("请选择结算商户!", {icon: 2, time: 1000});
- return;
- }
+
admin.putTempData('t_addshopsourcetype', {
- shopaccno: shopNode.shopaccno,
- shopname: shopNode.name.slice(shopNode.id.length + 1) //23_第一食堂,截取商户名称
+ shopaccno: shopaccno,
+ shopname: shopname //23_第一食堂,截取商户名称
});
admin.popupCenter({
title: "新增支付能力",
path: '[[@{/shop/load4addsourcetype}]]',
finish: function () {
table.reload('shopPaytypeTable', {
- where: {sourcetype: "", shopaccno: shopNode.shopaccno},
+ where: {sourcetype: "", shopaccno: shopaccno},
page: {curr: 1}
});
}
});
+
});
//监听单元格
diff --git a/payapi/src/main/resources/templates/system/shop/configform.html b/payapi/src/main/resources/templates/system/shop/configform.html
index 79cf14e..f3a5a07 100644
--- a/payapi/src/main/resources/templates/system/shop/configform.html
+++ b/payapi/src/main/resources/templates/system/shop/configform.html
@@ -1,6 +1,6 @@
<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>
+ <label class="layui-form-label">商户编码</label>
<div class="layui-input-block">
<input name="shopaccno" class="layui-input" readonly="readonly" lay-verify="required"/>
</div>
@@ -22,7 +22,7 @@
</div>
<div class="layui-form-item">
- <label class="layui-form-label">能否消费</label>
+ <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>
@@ -36,7 +36,7 @@
</div>
<div class="layui-form-item">
- <label class="layui-form-label">能否冲正</label>
+ <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>
diff --git a/payapi/src/main/resources/templates/system/shop/configpara.html b/payapi/src/main/resources/templates/system/shop/configpara.html
index 762778c..8fb337b 100644
--- a/payapi/src/main/resources/templates/system/shop/configpara.html
+++ b/payapi/src/main/resources/templates/system/shop/configpara.html
@@ -10,11 +10,11 @@
</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 class="layui-input-block" style="margin:0;display: inline;float: left;width: 25%;">
+ <label class="layui-form-label" style="float: right;width: 100%;" th:text="${config.configName}">参数名</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}" th:placeholder="${config.configName}" autocomplete="off"/>
+ <div class="layui-input-block" style="margin:0;display: inline;float: right;width: 75%;">
+ <input type="text" th:name="${config.configid}" class="layui-input" th:value="${config.configValue}" th:placeholder="${config.configid}" autocomplete="off"/>
</div>
</div>
diff --git a/payapi/src/main/resources/templates/system/shop/index.html b/payapi/src/main/resources/templates/system/shop/index.html
index 78ef8af..f0d145d 100644
--- a/payapi/src/main/resources/templates/system/shop/index.html
+++ b/payapi/src/main/resources/templates/system/shop/index.html
@@ -13,153 +13,38 @@
<div class="layui-card-header">
商户树<span style="font-size: 12px;">(双击商户进行修改)</span>
</div>
- <div class="layui-card-body layui-show" style="margin-bottom: 15px;">
- <ul id="shoptree" class="ztree"
- style="background-color: #D7F9F7;max-height: 527px;overflow:auto;"></ul>
+ <div class="layui-card-body layui-show"
+ style="border: 1px solid #ddd;padding: 10px;min-height: 520px;overflow: auto;margin-top: 16px;"
+ id="shop-manager-ztree">
</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-form-item" style="margin-left: 15px;">
- <label class="layui-form-label" style="color: red;"><span
- style="color: red;">*</span>商户类型</label>
- <div class="layui-input-inline">
- <select name="shoptype" id="shoptype" lay-filter="shoptype-filter"
- lay-verify="required">
- <option value="root">根商户</option>
- <option value="group">商户组</option>
- <option value="normal">结算商户</option>
- </select>
- </div>
- <div class="layui-form-mid layui-word-aux">
- 注意:商户组无商户账号,且能创建下级商户。结算商户是叶子商户,会创建商户账号。保存后无法修改!!!
- </div>
- </div>
- <div class="layui-card-body">
- <div class="layui-form-item">
- <div class="layui-inline">
- <label class="layui-form-label">商户号</label>
- <div class="layui-input-inline">
- <input type="text" name="shopid" class="layui-input"
- style="background-color: #f1f1f1;"
- readonly="readonly"/>
- </div>
- </div>
- <div class="layui-inline">
- <label class="layui-form-label">商户账号</label>
- <div class="layui-input-inline">
- <input type="text" name="shopaccno" autocomplete="off"
- style="background-color: #f1f1f1;"
- class="layui-input" readonly="readonly"/>
- </div>
- </div>
- </div>
- <div class="layui-form-item">
- <div class="layui-inline">
- <label class="layui-form-label"><span
- style="color: red;">*</span>上级商户号</label>
- <div class="layui-input-inline">
- <input type="text" name="fshopid" id="fshopid" class="layui-input"
- autocomplete="off"
- lay-verify="required|number"/>
- </div>
- </div>
- <div class="layui-inline">
- <label class="layui-form-label"><span
- style="color: red;">*</span>商户名</label>
- <div class="layui-input-inline">
- <input type="text" name="shopname" autocomplete="off"
- class="layui-input" maxlength="30" lay-verify="required"/>
- </div>
- </div>
- </div>
-
- <div class="layui-form-item">
- <div class="layui-inline">
- <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">
- <label class="layui-form-label">地址</label>
- <div class="layui-input-inline">
- <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">
- <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">
- <label class="layui-form-label">手机号</label>
- <div class="layui-input-inline">
- <input type="text" name="mobile" class="layui-input" maxlength="20"
- autocomplete="off"
- lay-verify="mobile"/>
- </div>
- </div>
- </div>
- <div class="layui-form-item">
- <div class="layui-inline">
- <label class="layui-form-label">证件类型</label>
- <div class="layui-input-inline">
- <select name="idtype" lay-filter="idtype-filter">
- <option th:each="bean : ${idtypeList}" th:value="${bean.dictval}">[[${bean.dictcaption}]]</option>
- </select>
- </div>
- </div>
- <div class="layui-inline">
- <label class="layui-form-label">证件号</label>
- <div class="layui-input-inline">
- <input type="text" name="idno" class="layui-input" maxlength="20"
- autocomplete="off"/>
- </div>
- </div>
- </div>
- <div class="layui-form-item">
- <div class="layui-inline">
- <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">
- <label class="layui-form-label">电话</label>
- <div class="layui-input-inline">
- <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">保存
+ <div class="layui-card-body">
+ <div class="layui-form toolbar">
+ 商户状态:
+ <select id="shop-manager-search-status">
+ <option value=""> 全部</option>
+ <option value="normal">正常</option>
+ <option value="closed">注销</option>
+ <option value="uncheck">待审核</option>
+ <option value="reject">驳回</option>
+ </select>
+ <input id="shop-manager-search-shopname" class="layui-input search-input" type="text"
+ placeholder="商户名称"/> 
+ <button id="shop-manager-search-btn" class="layui-btn icon-btn" data-type="search"><i
+ class="layui-icon"></i>搜索
</button>
- <button class="layui-btn layui-btn-primary" type="button" id="cancelbtn">取消
+ <button id="shop-manager-search-add-btn" class="layui-btn icon-btn" data-type="add"><i
+ class="layui-icon"></i>新增
</button>
- <div class="layui-inline" style="margin-left: 10px;" id="shop-add-hid-div">
- <input type="checkbox" id="shop-add-continue-flag" lay-skin="primary"
- title="继续新增"/>
- </div>
+ <button id="shop-manager-search-reset-btn" class="layui-btn layui-btn-primary"
+ data-type="reset"><i class="layui-icon"></i>清 空
+ </button>
+ <input type="hidden" id="shop-manager-global-needcheck" th:value="${shopNeedCheck}" />
</div>
+ <table class="layui-table" id="shopManagerTable" lay-filter="shopManagerTable-filter"></table>
</div>
</div>
</div>
@@ -167,245 +52,47 @@
</div>
</div>
+<!-- 表格操作列 -->
+<script type="text/html" id="shop-manager-table-bar">
+ <a class="layui-btn layui-bg-blue layui-btn-xs" lay-event="showShop">查看详情</a>
+ {{# if(d.status !='closed') { }}
+ <a class="layui-btn layui-btn-xs" lay-event="editShop">修改</a>
+ <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delShop">删除</a>
+ {{# } }}
+ {{# if($("#shop-manager-global-needcheck").val() == 'true'){ }}
+ <a class="layui-btn layui-bg-orange layui-btn-xs" lay-event="showShopCheck">审批意见</a>
+ {{# } }}
+</script>
+
<script>
- layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+ layui.use(['form', 'table', 'layer', 'admin', 'element', 'tree', 'index'], function () {
var form = layui.form;
var table = layui.table;
var admin = layui.admin;
+ var tree = layui.tree;
var $ = layui.jquery;
+ var index = layui.index;
+ var element = layui.element;
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 && treeNode != null) {
- 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 === 'normal') {
- newNode["iconSkin"] = "pIcon02";
- } else {
- newNode["iconSkin"] = "pIcon01";
- }
- zTree.addNodes(ftreeNode, newNode); //新加树节点
- }
- layer.msg(result.msg, {icon: 1});
- if (!$("#shop-add-continue-flag").is(":checked")) {
- $("#shop-info").hide();
- }
- } else if (result.code === 401) {
- layer.msg(result.msg, {icon: 2, time: 1500}, function () {
- location.replace('[[@{/login}]]');
- }, 1000);
- } 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 !== 'normal') {
- 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": "normal",
- "zipcode": "",
- "addr": "",
- "contactman": "",
- "idtype": "idcard",
- "idno": "",
- "mobile": "",
- "email": "",
- "tel": ""
+ var renderShopTree = function (nodes) {
+ tree.render({
+ elem: '#shop-manager-ztree',
+ data: nodes,
+ showCheckbox: false,
+ accordion: true,
+ click: function (obj) {
+ var nd = obj.data;
+ table.reload('shopManagerTable', {
+ where: {status: '', shopname: '', shopid: nd.id},
+ page: {curr: 1}
});
- $("#fshopid").attr("readonly", "readonly");
- $("#shoptype option[value='root']").remove();
- $("#shoptype").removeAttr("disabled");
- form.render('select');
- $("#submitbtn-shop-btn").text("新增");
- $("#shop-add-continue-flag").prop("checked", false);
- $("#shop-add-hid-div").show();
- $("#shop-info").show();
- return false;
- });
- }
- }
-
- function ondblclick(event, treeId, treeNode) {
- admin.dgo('[[@{/shop/getshopinfo}]]', {
- "shopid": treeNode.id
- }, function (data) {
- console.log("getshopinfo返回", data);
- if (data.code === 200) {
- debugger
- var root_index = $("#shoptype option[value='root']").attr("index");
- if(undefined == root_index){
- $("#shoptype").append("<option value=\"root\">根商户</option>");
- }
- if(null==data.shop.idtype){
- data.shop["idtype"]="idcard"
- }
- form.val("shop-info-form", data.shop);
- $("#fshopid").removeAttr("readonly");
- $("#shoptype").attr('disabled', 'disabled');
- form.render('select');
- $("#submitbtn-shop-btn").text("保存");
- $("#shop-add-continue-flag").prop("checked", false);
- $("#shop-add-hid-div").hide();
- $("#shop-info").show();
- } else if (data.code === 401) {
- layer.msg(data.msg, {icon: 2, time: 1500}, function () {
- location.replace('[[@{/login}]]');
- }, 1000);
- } 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);
+ renderShopTree(data.data);
} else if (data.code === 401) {
layer.msg(data.msg, {icon: 2, time: 1500}, function () {
location.replace('[[@{/login}]]');
@@ -417,5 +104,151 @@
console.log(ret);
layer.msg('查询商户树失败了,请稍后再试', {icon: 2});
});
+
+ $('#shop-manager-search-reset-btn').click(function () {
+ $("#shop-manager-search-status").val("");
+ $("#shop-manager-search-shopname").val("");
+ form.render('select');
+ });
+
+ $('#shop-manager-search-btn').click(function () {
+ table.reload('shopManagerTable', {
+ where: {
+ status: $("#shop-manager-search-status").val(),
+ shopname: $("#shop-manager-search-shopname").val(),
+ shopid: null
+ }, page: {curr: 1}
+ });
+ });
+
+ $("#shop-manager-search-add-btn").click(function () {
+ // element.tabDelete('admin-pagetabs', '_shop_manager_add');
+ index.openNewTab({
+ url: "[[@{/shop/load4addshop}]]",
+ menuId: '_shop_manager_add',
+ title: '新增商户'
+ });
+ });
+
+ // 渲染表格
+ table.render({
+ elem: '#shopManagerTable',
+ url: '[[@{/shop/shoplist}]]',
+ page: true,
+ width: 1010,
+ cols: [
+ [ {align: 'center', title: '操作', align: 'center', width: 260, fixed: 'left', toolbar: '#shop-manager-table-bar'},
+ {
+ field: 'shopid',
+ title: '商户序号',
+ width: 120,
+ align: 'center',
+ sort: true
+ },
+ {field: 'shopname', title: '商户名称', align: 'center', sort: true},
+ {
+ field: 'status', title: '商户状态', width: 110, align: 'center', sort: true, templet: function (e) {
+ if (e.status == 'uncheck') {
+ return '<span class="layui-badge layui-bg-orange">待审核</span>';
+ } else if (e.status == 'normal') {
+ return '<span class="layui-badge layui-bg-green">正常</span>';
+ } else if (e.status == 'closed') {
+ return '<span class="layui-badge layui-bg-gray">注销</span>';
+ } else if (e.status == 'reject') {
+ return '<span class="layui-badge">驳回</span>';
+ } else {
+ return e.status;
+ }
+ }
+ },
+ {
+ field: 'shoptype',
+ title: '商户类型',
+ align: 'center',
+ width: 110,
+ sort: true,
+ templet: function (e) {
+ if (e.shoptype == 'root') {
+ return '根节点';
+ } else if (e.shoptype == 'group') {
+ return '商户组';
+ } else if (e.shoptype == 'normal') {
+ return '结算商户';
+ } else {
+ return e.shoptype
+ }
+ }
+ },
+ {
+ field: 'shopaccno',
+ title: '商户编码',
+ align: 'center',
+ width: 120,
+ sort: true,
+ templet: function (e) {
+ if (null != e.shopaccno && '' != e.shopaccno) {
+ return e.shopaccno;
+ } else {
+ return '-';
+ }
+ }
+ }
+ ]
+ ]
+ });
+
+ //监听单元格
+ table.on('tool(shopManagerTable-filter)', function (obj) {
+ var data = obj.data;
+ if('showShop' == obj.event){
+ //查看详情
+ element.tabDelete('admin-pagetabs', '_shop_manager_detail');
+ index.openNewTab({
+ url: "[[@{/shop/getshopinfo}]]?shopid="+data.shopid,
+ menuId: '_shop_manager_detail',
+ title: '商户详情'
+ });
+ }else if('editShop' == obj.event){
+ //修改
+ element.tabDelete('admin-pagetabs', '_shop_manager_update');
+ index.openNewTab({
+ url: "[[@{/shop/load4updateshop}]]?shopid="+data.shopid,
+ menuId: '_shop_manager_update',
+ title: '修改商户'
+ });
+ }else if('delShop' == obj.event){
+ //删除
+ layer.confirm("确定要删除该商户吗?", function () {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/shop/deleteshop}]]', {
+ shopid: data.shopid,
+ _csrf: token
+ }, function (data) {
+ if (data.code === 200) {
+ layer.msg(data.msg, {icon: 1, time: 1000});
+ // table.reload('shopManagerTable');
+ admin.refresh();
+ } 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});
+ return;
+ }
+ }, function (err) {
+ admin.errorBack(err);
+ });
+ });
+ }else if('showShopCheck' == obj.event){
+ //审核意见
+ element.tabDelete('admin-pagetabs', '_shop_manager_chkdtl');
+ index.openNewTab({
+ url: "[[@{/shop/getshopchk}]]?shopid="+data.shopid,
+ menuId: '_shop_manager_chkdtl',
+ title: '审批意见'
+ });
+ }
+ });
});
</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/shop/opercheck.html b/payapi/src/main/resources/templates/system/shop/opercheck.html
new file mode 100644
index 0000000..972939c
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/shop/opercheck.html
@@ -0,0 +1,239 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">审核商户</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#!_shop_shopcheck">商户审批</a>
+ <a><cite>审核商户</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form toolbar" lay-filter="shop-check-info-form">
+ <div class="layui-card-header">商户基本信息</div>
+ <div class="layui-form-item" style="margin-left: 15px;margin-top: 15px;">
+ <label class="layui-form-label" style="color: red;width: 100px;"><span
+ style="color: red;">*</span>商户类型</label>
+ <div class="layui-input-inline">
+ <div th:if="${shop.shoptype} eq 'root' " class="layui-input" style="padding-top: 8px;">根节点</div>
+ <div th:if="${shop.shoptype} eq 'group' " class="layui-input" style="padding-top: 8px;">商户组</div>
+ <div th:if="${shop.shoptype} eq 'normal' " class="layui-input" style="padding-top: 8px;">结算商户</div>
+ </div>
+ <div class="layui-form-mid layui-word-aux">
+ 注意:商户组无商户编码,且能创建下级商户。结算商户是叶子商户,会创建商户编码。保存后无法修改!!!
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">商户序号</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.shopid}]]</div>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">商户编码</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.shopaccno}]]</div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;"><span
+ style="color: red;">*</span>上级商户序号</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.fshopname}]]</div>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;"><span
+ style="color: red;">*</span>商户名</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.shopname}]]</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-header">商户营业信息</div>
+ <div class="layui-card-body">
+ <div class="layui-form-item" style="margin-left: 15px;margin-top: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>营业执照编号</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.businessLicenseNo}]]</div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>税务登记证号</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.taxRegistrationNo}]]</div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>商户经营地址</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.addr}]]</div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span style="color: red;">*</span>法人姓名</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.legalPersonName}]]</div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>法人证件类型</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.legalPersonIdtype}]]</div>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>法人证件号</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.legalPersonIdno}]]</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-header">商户联系人信息</div>
+ <div class="layui-card-body">
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">姓名</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.contactman}]]</div>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">手机号</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.mobile}]]</div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">邮箱</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.email}]]</div>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">电话</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.tel}]]</div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="layui-card-header">商户审核</div>
+ <div class="layui-card-body" style="padding-left: 0;margin-bottom: 15px;">
+ <div style="padding: 20px 0;background-color: #f8f8f8;">
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;">审批流程号:</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${operChkdtl.chkNo}]]</div>
+ <input type="hidden" id="hidden-shop-oper-check-chkno" th:value="${operChkdtl.chkNo}"/>
+ </div>
+ </div>
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;">操作类型:</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;color: red;">[[${operChkdtl.chkMode}]]商户
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;color: red;">审核意见:</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <textarea placeholder="请输入意见" class="layui-textarea" id="shop-oper-check-chkmsg" maxlength="200"></textarea>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="padding-bottom: 20px;text-align: center;">
+ <button class="layui-btn" type="button" id="submitbtn-shop-check-pass-btn">同 意
+ </button>
+ <button class="layui-btn layui-btn-danger" type="button" id="submitbtn-shop-check-reject-btn">驳 回
+ </button>
+ <button class="layui-btn layui-btn-primary" type="button" id="submitbtn-shop-check-return-btn">返 回
+ </button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<script>
+ layui.use(['form', 'table', 'admin', 'jquery', 'element'], function () {
+ var form = layui.form;
+ var admin = layui.admin;
+ var $ = layui.jquery;
+ var element = layui.element;
+
+ $("#submitbtn-shop-check-return-btn").click(function () {
+ element.tabDelete('admin-pagetabs', '_shop_operchk_check'); //关闭现有详情
+ element.tabChange('admin-pagetabs', '_shop_shopcheck');
+ admin.refresh();
+ });
+
+ $("#submitbtn-shop-check-pass-btn").click(function () {
+ var chkmsg = $("#shop-oper-check-chkmsg").val();
+ // layer.confirm("确定同意吗?", function () {
+ doShopCheck('normal', chkmsg);
+ // });
+ });
+
+ $("#submitbtn-shop-check-reject-btn").click(function () {
+ var chkmsg = $("#shop-oper-check-chkmsg").val();
+ if(isempty(chkmsg)){
+ layer.msg("驳回时必须填写审核意见", {icon: 2, time: 1500});
+ return;
+ }
+ // layer.confirm("确定驳回吗?", function () {
+ doShopCheck('reject', chkmsg);
+ // });
+ });
+
+ function doShopCheck(type, msg) {
+ var chkno = $("#hidden-shop-oper-check-chkno").val();
+ var token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/shop/docheckshop}]]', {
+ chkno: chkno,
+ chkresult: type,
+ chkmsg: msg,
+ _csrf: token
+ }, function (data) {
+ if (data.code === 200) {
+ layer.msg(data.msg, {icon: 1, time: 1000});
+ element.tabDelete('admin-pagetabs', '_shop_operchk_check'); //关闭现有详情
+ element.tabChange('admin-pagetabs', '_shop_shopcheck');
+ admin.refresh();
+ } else if(data.code === 299){
+ layer.msg('审核操作成功,但必须驳回! '+data.msg, {icon: 2, time: 1000});
+ element.tabDelete('admin-pagetabs', '_shop_operchk_check'); //关闭现有详情
+ element.tabChange('admin-pagetabs', '_shop_shopcheck');
+ admin.refresh();
+ } 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});
+ return;
+ }
+ }, function (err) {
+ admin.errorBack(err);
+ });
+ }
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/shop/shopcheck.html b/payapi/src/main/resources/templates/system/shop/shopcheck.html
new file mode 100644
index 0000000..270c86a
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/shop/shopcheck.html
@@ -0,0 +1,134 @@
+<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-shop-operchk-searchkey" class="layui-input search-input" type="text" maxlength="30"
+ style="width: 280px;" placeholder="输入审批流程编号,申请人,审核人查询"/>
+ <select id="search-shop-operchk-status" class="layui-select search-input">
+ <option value="">选择状态</option>
+ <option value="uncheck">待审核</option>
+ <option value="normal">同意</option>
+ <option value="reject">驳回</option>
+ </select>
+ <button id="btn-search-shop-operchk" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-reset-shop-operchk" class="layui-btn layui-btn-primary" data-type="reset"><i
+ class="layui-icon"></i>清 空
+ </button>
+ </div>
+ <table class="layui-table" id="shopOperchkTable" lay-filter="shopOperchkTable-filter"></table>
+ </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="shop-operchk-table-bar">
+ {{# if(d.chkResult =='uncheck') { }}
+ <a class="layui-btn layui-btn-xs" lay-event="checkShop">审核</a>
+ {{# } }}
+</script>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'element', 'index'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ var element = layui.element;
+ var index = layui.index;
+
+ form.render("select");
+ // 渲染表格
+ table.render({
+ elem: '#shopOperchkTable',
+ url: '[[@{/shop/shopchecklist}]]',
+ page: true,
+ cols: [
+ [
+ {align: 'center', title: '操作', align: 'center', width: 80, fixed: 'left', toolbar: '#shop-operchk-table-bar'},
+ {field: 'chkNo', title: '审批流程编号', align: 'center', width: 140, fixed: 'left', sort: true},
+ {
+ field: 'createOpername',
+ title: '申请人',
+ width: 150,
+ align: 'center'
+ },
+ {
+ field: 'createtime',
+ title: '申请时间',
+ align: 'center',
+ width: 190,
+ sort: true,
+ templet: function (e) {
+ return admin.formatDate(e.createtime);
+ }
+ },
+ {
+ field: 'chkMode', title: '操作类型', align: 'center', width: 100, templet: function (e) {
+ return e.chkMode + '商户';
+ }
+ },
+ {
+ field: 'chkResult', title: '状态', align: 'center', width: 100, templet: function (e) {
+ if ("uncheck" == e.chkResult) {
+ return '<span class="layui-badge layui-bg-orange">待审核</span>';
+ } else if ("normal" == e.chkResult) {
+ return '<span class="layui-badge layui-bg-green">同意</span>';
+ } else if ("reject" == e.chkResult) {
+ return '<span class="layui-badge">驳回</span>';
+ } else {
+ return e.chkResult;
+ }
+ }
+ },
+ {field: 'chkMsg', title: '审核意见', align: 'center'},
+ {field: 'checkOpername', title: '审核人', align: 'center', width: 150},
+ {
+ field: 'checktime',
+ title: '审核时间',
+ align: 'center',
+ width: 190,
+ sort: true,
+ templet: function (e) {
+ return admin.formatDate(e.checktime);
+ }
+ }
+ ]
+ ]
+ });
+
+ // 搜索按钮点击事件
+ $('#btn-search-shop-operchk').click(function () {
+ table.reload('shopOperchkTable', {
+ where: {
+ status: $("#search-shop-operchk-status").val(),
+ searchkey: $("#search-shop-operchk-searchkey").val()
+ }, page: {curr: 1}
+ });
+ });
+
+ $('#btn-reset-shop-operchk').click(function () {
+ $("#search-shop-operchk-status").val("");
+ $("#search-shop-operchk-searchkey").val("");
+ });
+
+ //监听单元格
+ table.on('tool(shopOperchkTable-filter)', function (obj) {
+ var data = obj.data;
+ if('checkShop' == obj.event){
+ //查看详情
+ element.tabDelete('admin-pagetabs', '_shop_operchk_check');
+ index.openNewTab({
+ url: "[[@{/shop/opercheck}]]?chkno="+data.chkNo,
+ menuId: '_shop_operchk_check',
+ title: '审核商户'
+ });
+ }
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/shop/shopchk.html b/payapi/src/main/resources/templates/system/shop/shopchk.html
new file mode 100644
index 0000000..ed8e62d
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/shop/shopchk.html
@@ -0,0 +1,144 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">审批意见</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#!_shop_index">商户管理</a>
+ <a><cite>审批意见</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form" lay-filter="shop-manager-chkdtl-search-form">
+ <div class="layui-form-item" style="margin-bottom: 0;">
+ <div class="layui-inline">
+ <label class="layui-form-label">关键字</label>
+ <div class="layui-input-block" style="width: 300px;">
+ <input type="text" name="searchkey" id="shop-manager-chkdtl-search--searchkey"
+ class="layui-input"
+ placeholder="输入审批流程编号,申请人,审核人查询"/>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label">审核状态</label>
+ <div class="layui-input-block" style="width: 260px;">
+ <select name="status" id="shop-manager-chkdtl-search-status" class="layui-select">
+ <option value="">请选择</option>
+ <option value="uncheck">待审核</option>
+ <option value="normal">同意</option>
+ <option value="reject">驳回</option>
+ </select>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <input type="hidden" name="shopid" id="shop-manager-chkdtl-search-shopid"
+ th:value="${selectShopid}"/>
+ </div>
+ <div class="layui-inline" style="margin-left: 20px;">
+ <button id="shop-manager-chkdtl-search-btn" class="layui-btn icon-btn" data-type="search"><i
+ class="layui-icon"></i>搜索
+ </button>
+ <button id="shop-manager-chkdtl-return-btn" class="layui-btn layui-btn-warm">返回</button>
+ <button id="shop-manager-chkdtl-reset-btn" class="layui-btn layui-btn-primary" data-type="reset">清空
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <table class="layui-table" id="shopManagerChkdtlTable" lay-filter="shopManagerChkdtlTable-filter"></table>
+ </div>
+</div>
+
+<!--<script type="text/html" id="shop-manager-chkdtl-toolbar">-->
+<!--<div class="layui-btn-container"></div>-->
+<!--</script>-->
+
+<script>
+ layui.use(['form', 'table', 'admin', 'element'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+ var element = layui.element;
+
+ form.render("select");
+
+ // 渲染表格
+ var renderTable = function (obj) {
+ table.render({
+ id: 'shopManagerChkdtlTable',
+ title: '审批意见',
+ elem: '#shopManagerChkdtlTable',
+ url: '[[@{/shop/getshopchklist}]]',
+ page: true,
+ where: obj,
+ // toolbar: '#shop-manager-chkdtl-toolbar',
+ cols: [
+ [
+ {field: 'chkNo', title: '审批流程编号', align: 'center', width: 140, fixed: 'left', sort: true},
+ {
+ field: 'createOpername',
+ title: '申请人',
+ width: 150,
+ align: 'center'
+ },
+ {
+ field: 'createtime',
+ title: '申请时间',
+ align: 'center',
+ width: 190,
+ sort: true,
+ templet: function (e) {
+ return admin.formatDate(e.createtime);
+ }
+ },
+ {field: 'chkMode', title: '操作类型', align: 'center', width: 100},
+ {
+ field: 'chkResult', title: '状态', align: 'center', width: 100, templet: function (e) {
+ if ("uncheck" == e.chkResult) {
+ return '<span class="layui-badge layui-bg-orange">待审核</span>';
+ } else if ("normal" == e.chkResult) {
+ return '<span class="layui-badge layui-bg-green">同意</span>';
+ } else if ("reject" == e.chkResult) {
+ return '<span class="layui-badge">驳回</span>';
+ } else {
+ return e.chkResult;
+ }
+ }
+ },
+ {field: 'chkMsg', title: '审核意见', align: 'center'},
+ {field: 'checkOpername', title: '审核人', align: 'center', width: 150},
+ {
+ field: 'checktime', title: '审核时间', align: 'center', width: 190, sort: true, templet: function (e) {
+ return admin.formatDate(e.checktime);
+ }
+ }
+ ]
+ ]
+ });
+ }
+ renderTable({
+ shopid: $("#shop-manager-chkdtl-search-shopid").val()
+ });
+
+ $("#shop-manager-chkdtl-search-btn").click(function () {
+ table.reload('shopManagerChkdtlTable', {
+ where: {
+ shopid: $("#shop-manager-chkdtl-search-shopid").val(),
+ status: $("#shop-manager-chkdtl-search-status").val(),
+ searchkey: $("#shop-manager-chkdtl-search--searchkey").val(),
+ }, page: {curr: 1}
+ });
+ });
+
+ $("#shop-manager-chkdtl-reset-btn").click(function () {
+ $("#shop-manager-chkdtl-search-status").val("");
+ $("#shop-manager-chkdtl-search--searchkey").val("");
+ form.render("select");
+ });
+
+ $("#shop-manager-chkdtl-return-btn").click(function () {
+ element.tabDelete('admin-pagetabs', '_shop_manager_chkdtl'); //关闭现有详情
+ element.tabChange('admin-pagetabs', '_shop_index');
+ // admin.refresh();
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/shop/shopdetail.html b/payapi/src/main/resources/templates/system/shop/shopdetail.html
new file mode 100644
index 0000000..6ccb40e
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/shop/shopdetail.html
@@ -0,0 +1,209 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">商户详情</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#!_shop_index">商户管理</a>
+ <a><cite>商户详情</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div id="shop-detail-info" class="layui-form toolbar" lay-filter="shop-detail-info-form">
+ <div class="layui-card-header">商户基本信息</div>
+ <div class="layui-form-item" style="margin-left: 15px;margin-top: 15px;">
+ <label class="layui-form-label" style="color: red;width: 100px;"><span
+ style="color: red;">*</span>商户类型</label>
+ <div class="layui-input-inline">
+ <select name="shoptype" id="shop-detail-shoptype" lay-filter="shop-detail-shoptype-filter"
+ lay-verify="required" disabled="disabled">
+ <option value="root" th:selected="${shop.shoptype=='root'}">根节点</option>
+ <option value="group" th:selected="${shop.shoptype=='group'}">商户组</option>
+ <option value="normal" th:selected="${shop.shoptype=='normal'}">结算商户</option>
+ </select>
+ </div>
+ <div class="layui-form-mid layui-word-aux">
+ 注意:商户组无商户编码,且能创建下级商户。结算商户是叶子商户,会创建商户编码。保存后无法修改!!!
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">商户序号</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.shopid}]]</div>
+ <input type="hidden" id="hidden-shop-detail-fshopid" th:value="${shop.fshopid}"/>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">商户编号</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.shopaccno}]]</div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;"><span
+ style="color: red;">*</span>上级商户序号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="fshopid" id="shop-detail-fshopid" lay-filter="shop-detail-fshopid"
+ class="layui-input" autocomplete="off" placeholder="请选择"
+ lay-verify="required|number"/>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;"><span
+ style="color: red;">*</span>商户名</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.shopname}]]</div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;color: red;">商户状态</label>
+ <div class="layui-input-inline">
+ <div th:if="${shop.status} eq 'uncheck' " class="layui-input" style="padding-top: 8px;color: orange;font-weight: bold;font-size: 16px;">待审核</div>
+ <div th:if="${shop.status} eq 'normal' " class="layui-input" style="padding-top: 8px;color: green;font-weight: bold;font-size: 16px;">正 常</div>
+ <div th:if="${shop.status} eq 'closed' " class="layui-input" style="padding-top: 8px;color: #ddd;font-weight: bold;font-size: 16px;">注 销</div>
+ <div th:if="${shop.status} eq 'reject' " class="layui-input" style="padding-top: 8px;color: red;font-weight: bold;font-size: 16px;">驳 回</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-header">商户营业信息</div>
+ <div class="layui-card-body">
+ <div class="layui-form-item" style="margin-left: 15px;margin-top: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>营业执照编号</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.businessLicenseNo}]]</div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>税务登记证号</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.taxRegistrationNo}]]</div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>商户经营地址</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.addr}]]</div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span style="color: red;">*</span>法人姓名</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.legalPersonName}]]</div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>法人证件类型</label>
+ <div class="layui-input-inline">
+ <select name="legalPersonIdtype" id="shop-detail-legalPersonIdtype" th:field="*{shop.legalPersonIdtype}"
+ lay-filter="shop-detail-legalPersonIdtype-filter" class="layui-select" disabled="disabled">
+ <option th:each="bean : ${idtypeList}" th:value="${bean.dictval}">[[${bean.dictcaption}]]</option>
+ </select>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>法人证件号</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.legalPersonIdno}]]</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-header">商户联系人信息</div>
+ <div class="layui-card-body">
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">姓名</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.contactman}]]</div>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">手机号</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.mobile}]]</div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">邮箱</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.email}]]</div>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">电话</label>
+ <div class="layui-input-inline">
+ <div class="layui-input" style="padding-top: 8px;">[[${shop.tel}]]</div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="padding-bottom: 20px;text-align: center;">
+ <button class="layui-btn layui-btn-primary" type="button" id="submitbtn-shop-detail-return-btn">返回
+ </button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<script>
+ layui.use(['form', 'table', 'admin', 'jquery', 'element', 'treeSelect'], function () {
+ var form = layui.form;
+ var admin = layui.admin;
+ var $ = layui.jquery;
+ var element = layui.element;
+ var treeSelect = layui.treeSelect;
+
+ form.render("select");
+
+ treeSelect.render({
+ elem: '#shop-detail-fshopid',
+ data: '[[@{/shop/selectshopgroup}]]',
+ type: 'get',
+ placeholder: '请选择',
+ search: false,
+ style: {
+ folder: {
+ enable: false
+ },
+ line: {
+ enable: true
+ }
+ },
+ // 点击回调
+ click: function (d) {
+ var treeNode = d.current;
+ return true;
+ },
+ success: function (d) {
+ console.log(d); // 加载完成后的回调函数
+ var df = $("#hidden-shop-detail-fshopid").val();
+ treeSelect.checkNode('shop-detail-fshopid', df);
+ treeSelect.disabled();
+ }
+ });
+
+ $("#submitbtn-shop-detail-return-btn").click(function () {
+ element.tabDelete('admin-pagetabs', '_shop_manager_detail'); //关闭现有详情
+ element.tabChange('admin-pagetabs', '_shop_index');
+ admin.refresh();
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/shop/updateshop.html b/payapi/src/main/resources/templates/system/shop/updateshop.html
new file mode 100644
index 0000000..1314aca
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/shop/updateshop.html
@@ -0,0 +1,344 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">修改商户</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#!_shop_index">商户管理</a>
+ <a><cite>修改商户</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div id="shop-update-info" class="layui-form toolbar" lay-filter="shop-update-info-form">
+ <div class="layui-card-header">商户基本信息</div>
+ <div class="layui-form-item" style="margin-left: 15px;margin-top: 15px;">
+ <label class="layui-form-label" style="color: red;width: 100px;"><span
+ style="color: red;">*</span>商户类型</label>
+ <div class="layui-input-inline">
+ <select name="shoptype" id="shop-update-shoptype" lay-filter="shop-update-shoptype-filter"
+ lay-verify="required" disabled="disabled">
+ <option value="root" th:selected="${shop.shoptype=='root'}">根节点</option>
+ <option value="group" th:selected="${shop.shoptype=='group'}">商户组</option>
+ <option value="normal" th:selected="${shop.shoptype=='normal'}">结算商户</option>
+ </select>
+ </div>
+ <div class="layui-form-mid layui-word-aux">
+ 注意:商户组无商户编码,且能创建下级商户。结算商户是叶子商户,会创建商户编码。保存后无法修改!!!
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">商户序号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="shopid" class="layui-input" style="background-color: #f1f1f1;"
+ id="shop-update-shopid" th:value="${shop.shopid}"
+ readonly="readonly"/>
+ <input type="hidden" id="hidden-shop-update-fshopid" th:value="${shop.fshopid}"/>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">商户编码</label>
+ <div class="layui-input-inline">
+ <input type="text" name="shopaccno" autocomplete="off" style="background-color: #f1f1f1;"
+ class="layui-input" readonly="readonly" th:value="${shop.shopaccno}" />
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;"><span
+ style="color: red;">*</span>上级商户序号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="fshopid" id="shop-update-fshopid" lay-filter="shop-update-fshopid"
+ class="layui-input" autocomplete="off" placeholder="请选择"
+ lay-verify="required|number"/>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;"><span
+ style="color: red;">*</span>商户名</label>
+ <div class="layui-input-inline">
+ <input type="text" name="shopname" id="shop-update-shopname" autocomplete="off" th:value="${shop.shopname}"
+ class="layui-input" maxlength="30" lay-verify="required"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-header">商户营业信息</div>
+ <div class="layui-card-body">
+ <div class="layui-form-item" style="margin-left: 15px;margin-top: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>营业执照编号</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <input name="businessLicenseNo" id="shop-update-businessLicenseNo" class="layui-input" maxlength="18"
+ autocomplete="off" th:value="${shop.businessLicenseNo}" />
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>税务登记证号</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <input name="taxRegistrationNo" id="shop-update-taxRegistrationNo" class="layui-input"
+ autocomplete="off" th:value="${shop.taxRegistrationNo}" />
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>商户经营地址</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <input name="addr" id="shop-update-addr" class="layui-input" autocomplete="off" th:value="${shop.addr}" />
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <label class="layui-form-label" style="width: 90px;"><span style="color: red;">*</span>法人姓名</label>
+ <div class="layui-input-inline" style="width: 525px;">
+ <input name="legalPersonName" id="shop-update-legalPersonName" class="layui-input"
+ autocomplete="off" th:value="${shop.legalPersonName}" />
+ </div>
+ </div>
+
+ <div class="layui-form-item" style="margin-left: 15px;">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>法人证件类型</label>
+ <div class="layui-input-inline">
+ <select name="legalPersonIdtype" id="shop-update-legalPersonIdtype" th:field="*{shop.legalPersonIdtype}"
+ lay-filter="shop-update-legalPersonIdtype-filter" class="layui-select">
+ <option th:each="bean : ${idtypeList}" th:value="${bean.dictval}">[[${bean.dictcaption}]]</option>
+ </select>
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 90px;"><span
+ style="color: red;">*</span>法人证件号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="legalPersonIdno" id="shop-update-legalPersonIdno"
+ class="layui-input" th:value="${shop.legalPersonIdno}"
+ maxlength="20"
+ 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">
+ <label class="layui-form-label" style="width: 100px;">姓名</label>
+ <div class="layui-input-inline">
+ <input type="text" name="contactman" id="shop-update-contactman" class="layui-input"
+ autocomplete="off" th:value="${shop.contactman}" />
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">手机号</label>
+ <div class="layui-input-inline">
+ <input type="text" name="mobile" id="shop-update-mobile" class="layui-input" maxlength="20"
+ autocomplete="off" th:value="${shop.mobile}"
+ lay-verify="mobile"/>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">邮箱</label>
+ <div class="layui-input-inline">
+ <input type="text" name="email" class="layui-input" autocomplete="off"
+ id="shop-update-email" th:value="${shop.email}" />
+ </div>
+ </div>
+ <div class="layui-inline">
+ <label class="layui-form-label" style="width: 100px;">电话</label>
+ <div class="layui-input-inline">
+ <input type="text" name="tel" id="shop-update-tel" class="layui-input" maxlength="20"
+ autocomplete="off" th:value="${shop.tel}" />
+ </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-update-btn-filter" lay-submit
+ id="submitbtn-shop-update-btn">保存
+ </button>
+ <button class="layui-btn layui-btn-primary" type="button" id="submitbtn-shop-update-return-btn">返回
+ </button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<script>
+ layui.use(['form', 'table', 'admin', 'jquery', 'element', 'treeSelect'], function () {
+ var form = layui.form;
+ var admin = layui.admin;
+ var $ = layui.jquery;
+ var element = layui.element;
+ var treeSelect = layui.treeSelect;
+
+ 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 "邮箱格式不正确";
+ }
+ }
+ });
+
+ treeSelect.render({
+ elem: '#shop-update-fshopid',
+ data: '[[@{/shop/selectshopgroup}]]',
+ type: 'get',
+ placeholder: '请选择',
+ search: false,
+ style: {
+ folder: {
+ enable: false
+ },
+ line: {
+ enable: true
+ }
+ },
+ // 点击回调
+ click: function (d) {
+ var treeNode = d.current;
+ return true;
+ },
+ success: function (d) {
+ console.log(d); // 加载完成后的回调函数
+ var df = $("#hidden-shop-update-fshopid").val();
+ treeSelect.checkNode('shop-update-fshopid', df);
+ }
+ });
+
+
+
+ $("#submitbtn-shop-update-return-btn").click(function () {
+ element.tabDelete('admin-pagetabs', '_shop_manager_update'); //关闭现有详情
+ element.tabChange('admin-pagetabs', '_shop_index');
+ admin.refresh();
+ });
+
+ $("#submitbtn-shop-update-btn").click(function () {
+ var shopid = $("#shop-update-shopid").val();
+ var shoptype = $("#shop-update-shoptype").val();
+ var fshopid = $("#shop-update-fshopid").val();
+ var shopname = $("#shop-update-shopname").val();
+ var businessLicenseNo = $("#shop-update-businessLicenseNo").val();
+ var taxRegistrationNo = $("#shop-update-taxRegistrationNo").val();
+ var addr = $("#shop-update-addr").val();
+ var legalPersonName = $("#shop-update-legalPersonName").val();
+ var legalPersonIdtype = $("#shop-update-legalPersonIdtype").val();
+ var legalPersonIdno = $("#shop-update-legalPersonIdno").val();
+ var contactman = $("#shop-update-contactman").val();
+ var mobile = $("#shop-update-mobile").val();
+ var email = $("#shop-update-email").val();
+ var tel = $("#shop-update-tel").val();
+ var token = $("meta[name='_csrf_token']").attr("value");
+ if (isempty(shopid)) {
+ layer.msg("商户序号为空,请返回重新操作", {icon: 2, time: 1000});
+ $("#shop-update-shoptype").focus();
+ return;
+ }
+ if (isempty(fshopid)) {
+ layer.msg("请选择上级商户", {icon: 2, time: 1000});
+ $("#shop-update-fshopid").focus();
+ return;
+ }else if(shopid == fshopid){
+ layer.msg("上级商户不能是本身", {icon: 2, time: 1000});
+ $("#shop-update-fshopid").focus();
+ return;
+ }
+ if (isempty(shopname)) {
+ layer.msg("请填写商户名称", {icon: 2, time: 1000});
+ $("#shop-update-shopname").focus();
+ return;
+ }
+ if ("normal" == shoptype) {
+ if (isempty(businessLicenseNo)) {
+ layer.msg("请填写商户营业执照编号", {icon: 2, time: 1000});
+ $("#shop-update-businessLicenseNo").focus();
+ return;
+ }else if($.trim(businessLicenseNo).length != 18 && $.trim(businessLicenseNo).length != 15){
+ layer.msg("请正确填写商户营业执照编号", {icon: 2, time: 1000});
+ $("#shop-update-businessLicenseNo").focus();
+ return;
+ }
+
+ if (isempty(taxRegistrationNo)) {
+ layer.msg("请填写商户税务登记证号", {icon: 2, time: 1000});
+ $("#shop-update-taxRegistrationNo").focus();
+ return;
+ }
+ if (isempty(addr)) {
+ layer.msg("请填写商户经营地址", {icon: 2, time: 1000});
+ $("#shop-update-addr").focus();
+ return;
+ }
+ if (isempty(legalPersonName)) {
+ layer.msg("请填写商户法人姓名", {icon: 2, time: 1000});
+ $("#shop-update-legalPersonName").focus();
+ return;
+ }
+ if (isempty(legalPersonIdtype)) {
+ layer.msg("请选择法人证件类型", {icon: 2, time: 1000});
+ $("#shop-update-legalPersonIdtype").focus();
+ return;
+ }
+ if (isempty(legalPersonIdno)) {
+ layer.msg("请填写法人证件号", {icon: 2, time: 1000});
+ $("#shop-update-legalPersonIdno").focus();
+ return;
+ }
+ }
+
+ if (!isempty(businessLicenseNo) && $.trim(businessLicenseNo).length != 18 && $.trim(businessLicenseNo).length != 15) {
+ layer.msg("请正确填写商户营业执照编号", {icon: 2, time: 1000});
+ $("#shop-update-businessLicenseNo").focus();
+ return;
+ }
+
+ layer.confirm("确定要保存吗?", function () {
+ admin.go('[[@{/shop/updateshop}]]', {
+ shopid: shopid,
+ fshopid: fshopid,
+ shopname: shopname,
+ businessLicenseNo: businessLicenseNo,
+ taxRegistrationNo: taxRegistrationNo,
+ addr: addr,
+ legalPersonName: legalPersonName,
+ legalPersonIdtype: legalPersonIdtype,
+ legalPersonIdno: legalPersonIdno,
+ contactman: contactman,
+ mobile: mobile,
+ email: email,
+ tel: tel,
+ _csrf: token
+ }, function (data) {
+ if (data.code === 200) {
+ layer.msg(data.msg, {icon: 1, time: 1000});
+ element.tabDelete('admin-pagetabs', '_shop_manager_update'); //关闭现有详情
+ element.tabChange('admin-pagetabs', '_shop_index');
+ admin.refresh();
+ } 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});
+ return;
+ }
+ }, function (err) {
+ admin.errorBack(err);
+ });
+ });
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/thirdchk/chkdtl.html b/payapi/src/main/resources/templates/system/thirdchk/chkdtl.html
new file mode 100644
index 0000000..dba78cb
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/thirdchk/chkdtl.html
@@ -0,0 +1,188 @@
+<div class="layui-card">
+ <div class="layui-card-header">
+ <h2 class="header-title">对账详情</h2>
+ <span class="layui-breadcrumb pull-right">
+ <a href="#!_thirdchk_chkfile">对账明细查询</a>
+ <a><cite>对账详情</cite></a>
+ </span>
+ </div>
+ <div class="layui-card-body">
+ <div class="layui-form" lay-filter="thirdchk-chkdtl-search-form">
+ <div class="layui-form-item" style="margin-bottom: 0;">
+ <div class="layui-inline">
+ <label class="layui-form-label">关键字</label>
+ <div class="layui-input-block" style="width: 260px;">
+ <input type="text" name="searchkey" id="thirdchk-chkdtl-search-searchkey" class="layui-input"
+ placeholder="输入本地流水号、第三方流水号查询"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <label class="layui-form-label">对账结果</label>
+ <div class="layui-input-block" style="height: 35px;">
+ <select name="chkresult" id="thirdchk-chkdtl-search-chkresult"
+ lay-filter="thirdchk-chkdtl-search-chkresult-filter">
+ <option value="">全部</option>
+ <option value="uncheck">未检查</option>
+ <option value="equal">双方一致</option>
+ <option value="nocharge">本地流水未入账</option>
+ <option value="notexist">本地流水不存在</option>
+ <option value="surplus">本地多流水</option>
+ <option value="diff">金额不相等</option>
+ <option value="error">流水异常</option>
+ </select>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <input type="hidden" id="thirdchk-chkdtl-search-chkfileid" th:value="${chkfileid}"/>
+ <div class="layui-input-block" style="margin-left: 0;">
+ <input type="checkbox" name="errorshow" id="thirdchk-chkdtl-search-errorshow" value="yes"
+ lay-skin="primary" title="仅显示不平"/>
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <button id="thirdchk-chkdtl-search-btn" class="layui-btn icon-btn" data-type="search"><i
+ class="layui-icon"></i>搜索
+ </button>
+ <button id="thirdchk-chkdtl-reset-btn" class="layui-btn layui-btn-primary" data-type="reset">清空
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <table class="layui-table" id="thirdchkChkdtlTable" lay-filter="thirdchkChkdtlTable-filter"></table>
+ </div>
+</div>
+
+<script type="text/html" id="thirdchk-chkdtl-toolbar">
+ <div class="layui-btn-container"></div>
+</script>
+
+<script>
+ layui.use(['form', 'table', 'admin'], function () {
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin;
+
+ form.render("select");
+ form.render("checkbox");
+
+ // 渲染表格
+ var renderTable = function (obj) {
+ table.render({
+ id: 'thirdchkChkdtlTable',
+ title: '对账详情',
+ elem: '#thirdchkChkdtlTable',
+ url: '[[@{/thirdchk/chkdtllist}]]',
+ page: true,
+ where: obj,
+ toolbar: '#thirdchk-chkdtl-toolbar',
+ cols: [
+ [
+ {field: 'accdate', title: '账单日期', align: 'center', width: 100, fixed: 'left'},
+ {
+ field: 'sourcetype',
+ title: '支付方式',
+ width: 200,
+ align: 'center',
+ fixed: 'left',
+ templet: function (e) {
+ return getTempDictValue('sourcetypeList', e.sourcetype);
+ }
+ },
+ {field: 'recordno', title: '记录号', align: 'center', width: 80, fixed: 'left'},
+ {
+ field: 'amount', title: '交易金额', align: 'center', width: 100, templet: function (e) {
+ return parseFloat(e.amount).toFixed(2);
+ }
+ },
+ {
+ field: 'chkresult', title: '对账结果', align: 'center', width: 150, templet: function (e) {
+ if ("uncheck" == e.chkresult) {
+ return '<span class="layui-badge layui-bg-gray">未检查</span>';
+ } else if ("equal" == e.chkresult) {
+ return '<span class="layui-badge layui-bg-green">双方一致</span>';
+ } else if ("nocharge" == e.chkresult) {
+ return '<span class="layui-badge layui-bg-orange">本地流水未入账</span>';
+ } else if ("notexist" == e.chkresult) {
+ return '<span class="layui-badge layui-bg-orange">本地流水不存在</span>';
+ } else if ("surplus" == e.chkresult) {
+ return '<span class="layui-badge">本地多流水</span>';
+ } else if ("diff" == e.chkresult) {
+ return '<span class="layui-badge">金额不相等</span>';
+ } else {
+ return '<span class="layui-badge">流水异常</span>';
+ }
+ }
+ },
+ {
+ field: 'resolved', title: '处理结果', align: 'center', width: 100, templet: function (e) {
+ if ("none" == e.resolved) {
+ return '-';
+ } else if ("equal" == e.resolved) {
+ if ("equal" == e.chkresult) {
+ return '一致';
+ } else {
+ return '补账后一致';
+ }
+ } else if ("add" == e.resolved) {
+ return '需补账';
+ } else if ("fail" == e.resolved) {
+ return '补账失败';
+ } else if ("hangup" == e.resolved) {
+ return '异常挂起';
+ } else {
+ return e.resolved;
+ }
+ }
+ },
+ {field: 'remark', title: '备注', align: 'center', width: 200},
+ {field: 'localRefno', title: '本地流水号', align: 'center', width: 200},
+ {field: 'otherRefno', title: '外部流水号', align: 'center', width: 200},
+ {field: 'otherAccdate', title: '外部记账日期', align: 'center', width: 100},
+ {
+ field: 'transtype', title: '交易类型', align: 'center', width: 100, templet: function (e) {
+ if ("pay" == e.transtype) {
+ return '支付';
+ } else if ("refund" == e.transtype) {
+ return '退款';
+ } else if ("cancel" == e.transtype) {
+ return '撤销';
+ } else {
+ return e.transtype;
+ }
+ }
+ },
+ {field: 'extdata', title: '扩展字段', align: 'center', width: 200}
+ ]
+ ]
+ });
+ }
+ renderTable({
+ chkfileid: $("#thirdchk-chkdtl-search-chkfileid").val(),
+ errorshow: false
+ });
+
+ $("#thirdchk-chkdtl-search-btn").click(function () {
+ table.reload('thirdchkChkdtlTable', {
+ where: {
+ chkfileid: $("#thirdchk-chkdtl-search-chkfileid").val(),
+ searchkey: $("#thirdchk-chkdtl-search-searchkey").val(),
+ chkresult: $("#thirdchk-chkdtl-search-chkresult").val(),
+ errorshow: $("#thirdchk-chkdtl-search-errorshow").is(':checked')
+ }, page: {curr: 1}
+ });
+ });
+
+ $("#thirdchk-chkdtl-reset-btn").click(function () {
+ $("#thirdchk-chkdtl-search-searchkey").val("");
+ $("#thirdchk-chkdtl-search-chkresult").val("");
+ $("#thirdchk-chkdtl-search-errorshow").prop("checked", false);
+ form.render("select");
+ form.render("checkbox");
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/thirdchk/chkfile.html b/payapi/src/main/resources/templates/system/thirdchk/chkfile.html
new file mode 100644
index 0000000..0a5bb52
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/thirdchk/chkfile.html
@@ -0,0 +1,173 @@
+<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="thirdchk-chkfile-search-form">
+ <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="thirdchk-chkfile-search-startdate" placeholder="起始日期"
+ autocomplete="off" class="layui-input"/>
+ </div>
+ <div class="layui-form-mid">-</div>
+ <div class="layui-input-inline">
+ <input type="text" name="enddate" id="thirdchk-chkfile-search-enddate" 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: 35px;">
+ <select name="sourcetype" id="thirdchk-chkfile-search-sourcetype"
+ lay-filter="thirdchk-chkfile-search-sourcetype-filter">
+ <option value=""> 全部</option>
+ <option th:each="pt:${checkSourcetypeList}" th:value="${pt.sourceType}"
+ th:text="${pt.paydesc}"></option>
+ </select> 
+ </div>
+ </div>
+
+ <div class="layui-inline">
+ <button id="btn-search-thirdchk-chkfile" class="layui-btn icon-btn"><i class="layui-icon"></i> 搜 索</button>
+ <button id="thirdchk-chkfile-reset-btn" class="layui-btn layui-btn-primary" data-type="reset"> 清 空
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-card-body">
+ <table class="layui-table" id="thirdchkChkfileTable" lay-filter="thirdchkChkfileTable-filter"></table>
+ </div>
+</div>
+
+<script type="text/html" id="thirdchk-chkfile-toolbar">
+ <div class="layui-btn-container"></div>
+</script>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="thirdchk-chkfile-table-bar">
+ <a class="layui-btn layui-btn-xs layui-btn-normal" lay-event="load4chkdtl">查看详情</a>
+</script>
+
+<script>
+ layui.use(['form', 'table', 'layer', 'admin', 'laydate', 'index','element'], function () {
+ var $ = layui.jquery;
+ var form = layui.form;
+ var table = layui.table;
+ var admin = layui.admin
+ var laydate = layui.laydate;
+ var index = layui.index;
+ var element = layui.element;
+
+ form.render("select");
+ laydate.render({
+ elem: '#thirdchk-chkfile-search-startdate',
+ trigger: 'click'
+ });
+ laydate.render({
+ elem: '#thirdchk-chkfile-search-enddate',
+ trigger: 'click'
+ });
+
+ // 渲染表格
+ table.render({
+ id: 'thirdchkChkfileTable',
+ title: '对账明细表',
+ elem: '#thirdchkChkfileTable',
+ url: '[[@{/thirdchk/chkfilelist}]]',
+ toolbar: '#thirdchk-chkfile-toolbar',
+ page: true,
+ cols: [
+ [
+ {
+ align: 'center',
+ title: '操作',
+ width: 100,
+ fixed: 'left',
+ toolbar: '#thirdchk-chkfile-table-bar'
+ },
+ {
+ field: 'sourcetype',
+ title: '名称',
+ width: 200,
+ align: 'center',
+ fixed: 'left',
+ templet: function (e) {
+ return getTempDictValue('sourcetypeList', e.sourcetype);
+ }
+ },
+ {field: 'accdate', title: '账单日期', width: 120, align: 'center', fixed: 'left'},
+ {field: 'othercnt', title: '外部总笔数', width: 120, align: 'center'},
+ {
+ field: 'otheramt', title: '外部总金额', width: 120, align: 'center', templet: function (e) {
+ return parseFloat(e.otheramt).toFixed(2);
+ }
+ },
+ {field: 'localcnt', title: '本地总笔数', width: 120, align: 'center'},
+ {
+ field: 'localamt', title: '本地总金额', width: 110, align: 'center', templet: function (e) {
+ return parseFloat(e.localamt).toFixed(2);
+ }
+ },
+ {
+ field: 'status', title: '账单状态', width: 120, align: 'center', templet: function (e) {
+ if ('init' == e.status) {
+ return '<span class="layui-badge layui-bg-gray">初始化</span>';
+ } else if ('uncheck' == e.status) {
+ return '<span class="layui-badge layui-bg-orange">待对账</span>';
+ } else if ('finish' == e.status) {
+ return '<span class="layui-badge layui-bg-green">对账完成</span>';
+ } else if ('error' == e.status) {
+ return '<span class="layui-badge">异常</span>';
+ } else if ('checkout' == e.status) {
+ return '<span class="layui-badge layui-bg-blue">校对完成</span>';
+ } else {
+ return e.status;
+ }
+ }
+ },
+ {field: 'remark', title: '对账结果', align: 'left'}
+ ]
+ ]
+ });
+
+ $("#btn-search-thirdchk-chkfile").click(function () {
+ var startdate = $("#thirdchk-chkfile-search-startdate").val();
+ var enddate = $("#thirdchk-chkfile-search-enddate").val();
+ var sourcetype = $("#thirdchk-chkfile-search-sourcetype").val();
+ table.reload('thirdchkChkfileTable', {
+ where: {
+ startdate: startdate,
+ enddate: enddate,
+ sourcetype: sourcetype
+ }, page: {curr: 1}
+ });
+ });
+
+ $("#thirdchk-chkfile-reset-btn").click(function () {
+ $("#thirdchk-chkfile-search-startdate").val("");
+ $("#thirdchk-chkfile-search-enddate").val("");
+ $("#thirdchk-chkfile-search-sourcetype").val("");
+ form.render("select");
+ });
+
+ //监听单元格
+ table.on('tool(thirdchkChkfileTable-filter)', function (obj) {
+ if ('load4chkdtl' == obj.event) {
+ element.tabDelete('admin-pagetabs', '_thirdchk_chkdtl'); //关闭现有详情
+ index.openNewTab({
+ url: "[[@{/thirdchk/chkdtl}]]?chkfileid=" + obj.data.id,
+ menuId: '_thirdchk_chkdtl',
+ title: '对账详情'
+ })
+ }
+ });
+ });
+</script>
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/thirdchk/chkstatus.html b/payapi/src/main/resources/templates/system/thirdchk/chkstatus.html
new file mode 100644
index 0000000..73f1fb7
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/thirdchk/chkstatus.html
@@ -0,0 +1,133 @@
+<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-chkstatus-searchkey" class="layui-input search-input" type="text" maxlength="20"
+ placeholder="输入支付能力、名称查询"/> 
+ <button id="btn-chkstatus-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon"></i>搜索
+ </button>
+ <button id="btn-chkstatus-reset" class="layui-btn layui-btn-primary" data-type="reset"><i
+ class="layui-icon"></i>清 空
+ </button>
+ </div>
+ <table class="layui-table" id="checkStatusTable" lay-filter="checkStatusTable-filter"></table>
+ </div>
+</div>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="chkstatus-forceRechk-tpl-state">
+ <input type="checkbox" lay-filter="chkstatus-forceRechk-tpl-state" value="{{d.id}}" lay-skin="switch"
+ lay-text="启用|关闭" {{d.forceRecheck== true?'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: '#checkStatusTable',
+ url: '[[@{/thirdchk/chkstatuslist}]]',
+ page: true,
+ cols: [
+ [
+ {field: 'sourceType', title: '支付方式', width: 130, align: 'center', fixed: 'left', sort: true},
+ {
+ field: 'sourceType',
+ title: '名称',
+ width: 200,
+ align: 'center',
+ fixed: 'left',
+ templet: function (e) {
+ return getTempDictValue('sourcetypeList', e.sourceType);
+ }
+ },
+ {field: 'startAccdate', title: '起始日期', width: 110, align: 'center'},
+ {field: 'checkAccdate', title: '对账日期', width: 110, align: 'center'},
+ {
+ field: 'checkFileOk', title: '下载账单状态', width: 120, align: 'center', templet: function (e) {
+ if (e.checkFileOk) {
+ return '<span style="color: green">已成功</span>';
+ } else {
+ return '<span style="color: red;">未成功</span>';
+ }
+ }
+ },
+ {
+ field: 'checkStatus', title: '对账状态', width: 100, align: 'center', templet: function (e) {
+ if (e.checkStatus) {
+ return '<span style="color: green">已完成</span>';
+ } else {
+ return '<span style="color: red;">未完成</span>';
+ }
+ }
+ },
+ {
+ field: 'settleStatus', title: '清算状态', width: 100, align: 'center', templet: function (e) {
+ if (e.settleStatus) {
+ return '<span style="color: green">已完成</span>';
+ } else {
+ return '<span style="color: red;">未完成</span>';
+ }
+ }
+ },
+ {
+ field: 'forceRecheck',
+ title: '强制重对',
+ width: 100,
+ align: 'center',
+ templet: '#chkstatus-forceRechk-tpl-state',
+ },
+ {field: 'remark', title: '备注', align: 'left'}
+ ]
+ ]
+ });
+
+ // 搜索按钮点击事件
+ $('#btn-chkstatus-search').click(function () {
+ var skey = $("#search-chkstatus-searchkey").val();
+ table.reload('checkStatusTable', {where: {searchkey: skey}, page: {curr: 1}});
+
+ });
+
+ $('#btn-reset-sysparam').click(function () {
+ $("#search-chkstatus-searchkey").val("");
+ });
+
+ // 修改状态
+ form.on('switch(chkstatus-forceRechk-tpl-state)', function (obj) {
+ var token = $("meta[name='_csrf_token']").attr("value");
+ admin.go('[[@{/thirdchk/forcerecheck}]]', {
+ chkid: obj.elem.value,
+ enable: obj.elem.checked,
+ _csrf: token
+ }, function (data) {
+ console.log(data);
+ if (data.code === 200) {
+ layer.msg(data.msg, {icon: 1, time: 1000});
+ table.reload('checkStatusTable');
+ } 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 (err) {
+ admin.errorBack(err);
+ $(obj.elem).prop('checked', !obj.elem.checked);
+ form.render('checkbox');
+ });
+ });
+ });
+</script>
\ 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
index c8b875f..9e7bd63 100644
--- a/payapi/src/test/kotlin/com/supwisdom/dlpay/DlpayApplicationTests.kt
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/DlpayApplicationTests.kt
@@ -1,11 +1,22 @@
package com.supwisdom.dlpay
+import com.supwisdom.dlpay.api.service.KafkaSendMsgService
+import org.junit.Test
import org.junit.runner.RunWith
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.junit4.SpringRunner
@RunWith(SpringRunner::class)
@SpringBootTest
-abstract class DlpayApplicationTests{
+@EnableAutoConfiguration
+class DlpayApplicationTests{
+ @Autowired
+ private lateinit var kafkaSendMsgService: KafkaSendMsgService
+ @Test
+ fun kafkaSendMsg(){
+ kafkaSendMsgService.sendJpushMessage("402882816be4b6b9016be4b78ab30001","交易提醒","你有一笔0.01元的支出,点击查看详情","20190725112512000017", mutableMapOf(),"")
+ }
}
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt
index 62a56a3..91bd2e1 100644
--- a/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt
@@ -5,6 +5,8 @@
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.ActiveProfiles
+import org.springframework.test.context.TestPropertySource
import org.springframework.test.context.junit4.SpringRunner
import org.springframework.test.web.servlet.MockMvc
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt
index 0899c9a..01d6e50 100644
--- a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt
@@ -1,7 +1,9 @@
package com.supwisdom.dlpay.controller
import com.supwisdom.dlpay.MvcBaseTest
+import com.supwisdom.dlpay.api.service.KafkaSendMsgService
import org.junit.Test
+import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.MediaType
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.test.web.servlet.result.MockMvcResultHandlers
@@ -11,6 +13,7 @@
* Created by shuwei on 2019/4/16.
*/
class ApiControllerTest : MvcBaseTest() {
+
@Test
fun testYktPay() {
//TODO prepare data
@@ -21,4 +24,5 @@
.andDo(MockMvcResultHandlers.print())
.andReturn()
}
+
}
\ No newline at end of file
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/utils_test.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/utils_test.kt
new file mode 100644
index 0000000..33cba31
--- /dev/null
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/utils_test.kt
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay
+
+import com.supwisdom.dlpay.agent.AgentResponse
+import junit.framework.Assert.assertNotNull
+import org.junit.Test
+
+class UtilsTest {
+ @Test
+ fun testAgentResponse() {
+ val response = AgentResponse<String>()
+ assertNotNull(response.payload)
+ }
+}
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 42be481..35b2274 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,2 +1,3 @@
rootProject.name = 'payapi'
-include 'payapi', 'payapi-sdk', 'payapi-common', 'ynrcc-agent'
+include 'payapi', 'payapi-sdk', 'payapi-common', 'ynrcc-agent','oauth'
+
diff --git a/ynrcc-agent/build.gradle b/ynrcc-agent/build.gradle
index 20cc9b3..4c222f6 100644
--- a/ynrcc-agent/build.gradle
+++ b/ynrcc-agent/build.gradle
@@ -31,11 +31,12 @@
docker {
def imageVersion
- if(details.commitDistance > 0 || !details.isCleanTag) {
+ if (details.gitHashFull.startsWith(details.lastTag) || !details.isCleanTag) {
imageVersion = 'dev'
} else {
imageVersion = details.lastTag
}
+ println("Docker image tag : " + imageVersion)
name 'harbor.supwisdom.com/dali/ynrcc:' + imageVersion
println(jar.archivePath)
files jar.archivePath
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/Util/DlpayUtil.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/Util/DlpayUtil.java
index 4dbd2bb..d5150df 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/Util/DlpayUtil.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/Util/DlpayUtil.java
@@ -24,15 +24,17 @@
* socket方式请求农商行
*/
public static String send(String ip, int port, int timeout, String data) throws UnknownHostException, IOException {
+ long t1 = System.currentTimeMillis();
+ System.out.println("ynrcc socket start:");
Socket client = new Socket(ip, port);
client.setSoTimeout(timeout * 1000); //timeout秒
- PrintWriter printWriter = new PrintWriter(client.getOutputStream());
+ PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(client.getOutputStream(), "GBK"));
// 发送消息
printWriter.println(data);
printWriter.flush();
// 读取返回信息
- InputStreamReader streamReader = new InputStreamReader(client.getInputStream());
+ InputStreamReader streamReader = new InputStreamReader(client.getInputStream(), "GBK");
BufferedReader reader = new BufferedReader(streamReader);
StringBuffer content = new StringBuffer(); //存返回信息
int ch;
@@ -41,6 +43,8 @@
}
reader.close();
client.close();
+ long t2 = System.currentTimeMillis();
+ System.out.println("ynrcc socket return! "+(t2-t1)+"ms");
return content.toString();
}
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/CheckFileHeader.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/CheckFileHeader.java
new file mode 100644
index 0000000..b25ebd4
--- /dev/null
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/CheckFileHeader.java
@@ -0,0 +1,69 @@
+package com.supwisdom.agent.api.bean;
+
+/**
+ * 第一行:总笔数|总金额|代扣总笔数|代扣总金额|退款总笔数|退款总金额|
+ */
+public class CheckFileHeader {
+ public static final String[] chkFileHeaderColumnList = new String[]{"totalCount", "totalAmount", "payCount",
+ "payAmount", "refundCount", "refundAmount"};
+
+ private int totalCount;
+ private long totalAmount;
+ private int payCount;
+ private long payAmount;
+ private int refundCount;
+ private long refundAmount;
+
+ public int getTotalCount() {
+ return totalCount;
+ }
+
+ public void setTotalCount(int totalCount) {
+ this.totalCount = totalCount;
+ }
+
+ public long getTotalAmount() {
+ return totalAmount;
+ }
+
+ public void setTotalAmount(long totalAmount) {
+ this.totalAmount = totalAmount;
+ }
+
+ public int getPayCount() {
+ return payCount;
+ }
+
+ public void setPayCount(int payCount) {
+ this.payCount = payCount;
+ }
+
+ public long getPayAmount() {
+ return payAmount;
+ }
+
+ public void setPayAmount(long payAmount) {
+ this.payAmount = payAmount;
+ }
+
+ public int getRefundCount() {
+ return refundCount;
+ }
+
+ public void setRefundCount(int refundCount) {
+ this.refundCount = refundCount;
+ }
+
+ public long getRefundAmount() {
+ return refundAmount;
+ }
+
+ public void setRefundAmount(long refundAmount) {
+ this.refundAmount = refundAmount;
+ }
+
+ public boolean isZero() {
+ return (totalAmount == 0 && totalCount == 0
+ && payAmount == 0 && payCount == 0 && refundAmount == 0 && refundCount == 0);
+ }
+}
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/DlpayReq.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/DlpayReq.java
index 03f957f..7fae31a 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/DlpayReq.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/DlpayReq.java
@@ -2,6 +2,8 @@
import com.supwisdom.agent.Util.MD5;
+import java.io.UnsupportedEncodingException;
+
public class DlpayReq {
private static final String prefix = "<?xml version=\"1.0\" encoding=\"GBK\"?>";
private static final String BANKCARD_BIND_TRANSCODE = "BC5510";
@@ -36,8 +38,8 @@
/**
* 市民卡绑定请求XML
- * */
- public String getBindCardXml() {
+ */
+ public String getBindCardXml() throws UnsupportedEncodingException {
StringBuffer xml = new StringBuffer();
xml.append(prefix)
.append("<root>")
@@ -52,14 +54,13 @@
.append("<ID_NO>").append(idNo).append("</ID_NO>")
.append("<PHONE>").append(phone).append("</PHONE>")
.append("</root>");
- return String.format("%08d", xml.toString().length()) + xml.toString();
+ return String.format("%08d", xml.toString().getBytes("GBK").length) + xml.toString();
}
-
/**
* 市民卡签约/解约请求XML
- * */
- public String getSignXml(){
+ */
+ public String getSignXml() throws UnsupportedEncodingException {
StringBuffer xml = new StringBuffer();
xml.append(prefix)
.append("<root>")
@@ -75,13 +76,13 @@
.append("<PHONE>").append(phone).append("</PHONE>")
.append("<TRANS_TYPE>").append(transType).append("</TRANS_TYPE>")
.append("</root>");
- return String.format("%08d", xml.toString().length()) + xml.toString();
+ return String.format("%08d", xml.toString().getBytes("GBK").length) + xml.toString();
}
/**
* 市民卡代扣消费接口请求报文
- * */
- public String getCardpayXml(){
+ */
+ public String getCardpayXml() throws UnsupportedEncodingException {
StringBuffer xml = new StringBuffer();
xml.append(prefix)
.append("<root>")
@@ -100,13 +101,13 @@
.append("<DESCRIPTION>").append(description).append("</DESCRIPTION>")
.append("<MAC>").append(MD5.encodeByMD5ForYnrcc(merchantBcno + bcNo + amount)).append("</MAC>")
.append("</root>");
- return String.format("%08d", xml.toString().length()) + xml.toString();
+ return String.format("%08d", xml.toString().getBytes("GBK").length) + xml.toString();
}
/**
* 市民卡退款接口请求报文
- * */
- public String getPayRefundXml(){
+ */
+ public String getPayRefundXml() throws UnsupportedEncodingException {
StringBuffer xml = new StringBuffer();
xml.append(prefix)
.append("<root>")
@@ -118,13 +119,13 @@
.append("<AMOUNT>").append(amount).append("</AMOUNT>")
.append("<DESCRIPTION>").append(description).append("</DESCRIPTION>")
.append("</root>");
- return String.format("%08d", xml.toString().length()) + xml.toString();
+ return String.format("%08d", xml.toString().getBytes("GBK").length) + xml.toString();
}
/**
* 市民卡交易查询接口请求报文
- * */
- public String getQueryResultXml(){
+ */
+ public String getQueryResultXml() throws UnsupportedEncodingException {
StringBuffer xml = new StringBuffer();
xml.append(prefix)
.append("<root>")
@@ -134,13 +135,13 @@
.append("<SN>").append(sn).append("</SN>")
.append("<ORI_SN>").append(oriSn).append("</ORI_SN>")
.append("</root>");
- return String.format("%08d", xml.toString().length()) + xml.toString();
+ return String.format("%08d", xml.toString().getBytes("GBK").length) + xml.toString();
}
/**
* 市民卡对账接口请求报文
- * */
- public String getChkfileXml(){
+ */
+ public String getChkfileXml() throws UnsupportedEncodingException {
StringBuffer xml = new StringBuffer();
xml.append(prefix)
.append("<root>")
@@ -151,7 +152,7 @@
.append("<DZDATE>").append(chkdate).append("</DZDATE>")
.append("<MERCHANT_BCNO>").append("</MERCHANT_BCNO>")
.append("</root>");
- return String.format("%08d", xml.toString().length()) + xml.toString();
+ return String.format("%08d", xml.toString().getBytes("GBK").length) + xml.toString();
}
public String getTransdate() {
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/controller/YnrccApiController.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/controller/YnrccApiController.java
index af77687..56e4d60 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/controller/YnrccApiController.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/controller/YnrccApiController.java
@@ -4,6 +4,7 @@
import com.supwisdom.agent.Util.DlpayUtil;
import com.supwisdom.agent.Util.ErrorCode;
import com.supwisdom.agent.Util.StringUtil;
+import com.supwisdom.agent.api.bean.CheckFileHeader;
import com.supwisdom.agent.api.bean.CheckFileLine;
import com.supwisdom.agent.api.bean.DlpayReq;
import com.supwisdom.agent.api.bean.DlpayResp;
@@ -15,7 +16,10 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.FormParam;
@@ -42,7 +46,7 @@
Constant.COL_REFNO, Constant.COL_AGENT_REFNO, Constant.COL_PAYERID, Constant.COL_PAYEEID,
Constant.COL_AGENT_DATE, Constant.COL_AMOUNT, Constant.COL_SUMMARY};
- private static final String chkFileDelimiter = "|";
+ private static final String chkFileDelimiter = "\\|";
private static final String FLAG_WITHHOLD = "BC5512";
private static final String FLAG_REFUND = "BC5513";
@@ -401,9 +405,10 @@
try {
Map<String, String> data = new HashMap<>();
for (int col = 0; col < column.length; ++col) {
- data.put(column[col], fields[col]);
+ data.put(fields[col], column[col]);
}
BeanUtils.populate(bean, data);
+ return;
} catch (InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
@@ -433,8 +438,9 @@
private void parseFile(String filePath, OutputStream output) {
int lineno = 1;
+ BufferedReader reader = null;
try {
- BufferedReader reader = new BufferedReader(
+ reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(filePath), "GBK"));
String header = reader.readLine();
@@ -450,7 +456,7 @@
writeLine(output, Constant.COL_REFNO, Constant.COL_AGENT_REFNO,
Constant.COL_AGENT_DATE, Constant.COL_FLAG, Constant.COL_PAYERID,
Constant.COL_PAYEEID, Constant.COL_STATUS,
- Constant.COL_AMOUNT, Constant.COL_SUMMARY);
+ Constant.COL_AMOUNT, Constant.COL_SUMMARY, Constant.COL_RECORDNO);
while (true) {
String line = reader.readLine();
if (line == null) {
@@ -467,7 +473,7 @@
fileHeader.setPayCount(fileHeader.getPayCount() - 1);
fileHeader.setPayAmount(fileHeader.getPayAmount() - record.getAmount());
} else if (FLAG_REFUND.equals(record.getFlag())) {
- amount = -record.getAmount();
+ amount = record.getAmount();
flag = Constant.FLAG_REFUND;
fileHeader.setRefundCount(fileHeader.getRefundCount() - 1);
fileHeader.setRefundAmount(fileHeader.getRefundAmount() - record.getAmount());
@@ -478,7 +484,7 @@
fileHeader.setTotalAmount(fileHeader.getTotalAmount() - record.getAmount());
writeLine(output, record.getRefno(), record.getAgentrefno(), record.getAgentdate(),
flag, record.getPayerid(), record.getPayeeid(), Constant.STATUS_SUCCESS,
- amount, record.getSummary());
+ amount, record.getSummary(), lineno - 1);
}
if (!fileHeader.isZero()) {
throw new IllegalArgumentException("对账文件总金额与笔数与明细不符");
@@ -486,86 +492,28 @@
} catch (IOException e) {
e.printStackTrace();
throw new IllegalArgumentException("对账文件数据格式错误,行数 " + lineno + " 。");
+ } finally {
+ try {
+ if (null != reader) {
+ reader.close();
+ }
+ } catch (Exception ex) {
+ }
}
}
@GetMapping("/download")
- public void downloadFile(@RequestParam("filename") String filename, HttpServletResponse response) throws IOException {
- try {
- String loaclfile = ynrccApiService.getChkfilePath(filename);
- parseFile(loaclfile, response.getOutputStream());
- } catch (Exception e) {
- e.printStackTrace();
- response.sendError(HttpStatus.SERVICE_UNAVAILABLE.value(), e.getMessage());
- }
- }
-
-
- /**
- * 第一行:总笔数|总金额|代扣总笔数|代扣总金额|退款总笔数|退款总金额|
- */
- private static class CheckFileHeader {
- static final String[] chkFileHeaderColumnList = new String[]{"totalCount", "totalAmount", "payCount",
- "payAmount", "refundCount", "refundAmount"};
-
- private int totalCount;
- private int totalAmount;
- private int payCount;
- private int payAmount;
- private int refundCount;
- private int refundAmount;
-
- int getTotalCount() {
- return totalCount;
- }
-
- void setTotalCount(int totalCount) {
- this.totalCount = totalCount;
- }
-
- int getTotalAmount() {
- return totalAmount;
- }
-
- void setTotalAmount(int totalAmount) {
- this.totalAmount = totalAmount;
- }
-
- int getPayCount() {
- return payCount;
- }
-
- void setPayCount(int payCount) {
- this.payCount = payCount;
- }
-
- int getPayAmount() {
- return payAmount;
- }
-
- void setPayAmount(int payAmount) {
- this.payAmount = payAmount;
- }
-
- int getRefundCount() {
- return refundCount;
- }
-
- void setRefundCount(int refundCount) {
- this.refundCount = refundCount;
- }
-
- int getRefundAmount() {
- return refundAmount;
- }
-
- void setRefundAmount(int refundAmount) {
- this.refundAmount = refundAmount;
- }
-
- boolean isZero() {
- return (totalAmount == 0 && totalCount == 0
- && payAmount == 0 && payCount == 0 && refundAmount == 0 && refundCount == 0);
- }
+ public ResponseEntity<StreamingResponseBody> downloadFile(@RequestParam("filename") String filename,
+ HttpServletResponse response) throws Exception {
+ response.setContentType(MediaType.TEXT_PLAIN_VALUE);
+ String loaclfile = ynrccApiService.getChkfilePath(filename);
+// parseFile(loaclfile, response.getOutputStream());
+ StreamingResponseBody stream = new StreamingResponseBody() {
+ @Override
+ public void writeTo(OutputStream outputStream) throws IOException {
+ parseFile(loaclfile, outputStream);
+ }
+ };
+ return new ResponseEntity(stream, HttpStatus.OK);
}
}
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccApiServiceImpl.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccApiServiceImpl.java
index 4ae422e..1d492e0 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccApiServiceImpl.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccApiServiceImpl.java
@@ -1,5 +1,6 @@
package com.supwisdom.agent.api.service.impl;
+import com.google.gson.Gson;
import com.supwisdom.agent.Util.BussinessException;
import com.supwisdom.agent.Util.DlpayUtil;
import com.supwisdom.agent.Util.StringUtil;
@@ -76,6 +77,7 @@
try {
DlpayResp resp = XmlUtils.getXmlToObject(returnXml.substring(8), "GBK", DlpayResp.class);
+ logger.info("==========refno=[" + req.getSn() + "]成功返回:" + new Gson().toJson(resp));
return resp;
} catch (Exception e) {
throw new BussinessException("返回报文解析异常!");
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccParamCheckServiceImpl.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccParamCheckServiceImpl.java
index 52009b1..069bf8f 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccParamCheckServiceImpl.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccParamCheckServiceImpl.java
@@ -115,7 +115,7 @@
}
}
- return true;
+ return false;
}
@Override
@@ -221,7 +221,7 @@
return false;
}
- if (StringUtil.checkDatetimeValid(checkdate,"yyyyMMdd")) {
+ if (!StringUtil.checkDatetimeValid(checkdate,"yyyyMMdd")) {
resp.setCode(ErrorCode.REQ_PARAM_ERROR);
resp.setMessage("请求参数错误[对账日期]");
return false;
diff --git a/ynrcc-agent/src/main/resources/application.properties b/ynrcc-agent/src/main/resources/application.properties
index babfea2..ce97d4b 100644
--- a/ynrcc-agent/src/main/resources/application.properties
+++ b/ynrcc-agent/src/main/resources/application.properties
@@ -34,7 +34,7 @@
############# YNRCC SOCKET ###############
ynrcc.socket.ip=127.0.0.1
ynrcc.socket.port=8089
-## 超时时间(分钟)
+## 超时时间
ynrcc.socket.timeout=10
ynrcc.md5.key=80816b7947ed016bff8079557735006e
ynrcc.chkfile.ftp.enabled=false