优化用户管理模块,增加 jpa beanvalidation 错误信息的处理
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
index 9e31db8..a8cfbd6 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
@@ -1,14 +1,18 @@
 package com.supwisdom.dlpay.api.domain;
 
+import com.supwisdom.dlpay.api.annotation.IDNoCheck;
+import com.supwisdom.dlpay.api.annotation.MobileNumber;
 import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
+import javax.validation.constraints.Email;
 import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_PERSON",
     indexes = {@Index(name = "person_name_idx", columnList = "name"),
         @Index(name = "person_idno_uk", unique = true, columnList = "idtype,idno")})
+@IDNoCheck(message = "证件信息错误", idno = "idno", idtype = "idtype")
 public class TPerson {
   @Id
   @GenericGenerator(name = "idGenerator", strategy = "uuid")
@@ -39,12 +43,14 @@
   private String nation;
 
   @Column(name = "EMAIL", length = 60)
+  @Email(message = "电子邮件格式错误")
   private String email;
 
   @Column(name = "TEL", length = 20)
   private String tel;
 
   @Column(name = "MOBILE", length = 30)
+  @MobileNumber(message = "手机号格式错误")
   private String mobile;
 
   @Column(name = "ADDR", length = 240)
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java
index 9c78b00..16e68da 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java
@@ -5,6 +5,7 @@
 import com.supwisdom.dlpay.system.service.DictionaryProxy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
@@ -20,7 +21,7 @@
   }
 
   @GetMapping("/dictpool")
-  public Map getDictDataByDicttype(@FormParam("dicttype") String dictType, HttpServletRequest request) {
+  public Map getDictDataByDicttype(@RequestParam("dicttype") String dictType, HttpServletRequest request) {
     dictType = request.getParameter("dicttype");
     return dictionaryProxy.getDictionaryAsMap(dictType);
   }
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 9fab5f0..874a539 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.api
 
+import com.supwisdom.dlpay.api.bean.JsonResult
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException
 import com.supwisdom.dlpay.exception.TransactionCheckException
 import com.supwisdom.dlpay.exception.TransactionException
@@ -18,17 +19,16 @@
 import org.springframework.http.ResponseEntity
 import org.springframework.security.core.context.SecurityContextHolder
 import org.springframework.stereotype.Component
+import org.springframework.transaction.TransactionSystemException
+import org.springframework.web.bind.MethodArgumentNotValidException
+import org.springframework.web.bind.annotation.ControllerAdvice
 import org.springframework.web.bind.annotation.ExceptionHandler
 import org.springframework.web.bind.annotation.RestControllerAdvice
+import org.springframework.web.context.request.WebRequest
+import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
 import java.lang.reflect.UndeclaredThrowableException
 import javax.servlet.http.HttpServletRequest
-import java.util.stream.Collectors
-import org.springframework.validation.BindingResultUtils.getBindingResult
-import java.util.LinkedHashMap
-import org.springframework.web.context.request.WebRequest
-import org.springframework.web.bind.MethodArgumentNotValidException
-import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
-import org.springframework.web.bind.annotation.ControllerAdvice
+import javax.validation.ConstraintViolationException
 
 
 @RestControllerAdvice("com.supwisdom.dlpay.api")
@@ -52,9 +52,18 @@
     }
 }
 
+@ControllerAdvice("com.supwisdom.dlpay")
+class MvcControllerAdvice {
+    private val logger = KotlinLogging.logger { }
+    @ExceptionHandler(ConstraintViolationException::class)
+    fun handleException(e: ConstraintViolationException): ResponseEntity<Any> {
+        logger.error { "unhandle exception : $e" }
+        return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(e)
+    }
+}
+
 @ControllerAdvice
 class CustomGlobalExceptionHandler : ResponseEntityExceptionHandler() {
-
     // error handle for @Valid
     override fun handleMethodArgumentNotValid(ex: MethodArgumentNotValidException,
                                               headers: HttpHeaders,
@@ -66,6 +75,22 @@
                 .fail(300001, msg))
 
     }
+
+    @ExceptionHandler(TransactionSystemException::class)
+    fun handleContraintViolationException(e: TransactionSystemException): ResponseEntity<Any> {
+        logger.error { "unhandle exception : $e" }
+        var cause = e.cause
+        while (cause != null) {
+            if (cause is ConstraintViolationException) {
+                val msg = cause.constraintViolations.joinToString {
+                    it.message
+                }
+                return ResponseEntity.status(HttpStatus.OK).body(JsonResult.error(msg))
+            }
+            cause = cause.cause
+        }
+        return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(e)
+    }
 }
 
 @Component
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
index fdeebca..0f44e62 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -505,60 +505,60 @@
 INSERT INTO "tb_transcode" ("transcode", "transname", "tenantid")
 VALUES (3500, '账户充值', '{tenantid}');
 
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('cancel', 'reverseFlagList', '冲正', '冲正状态', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('reverse', 'reverseFlagList', '手工撤销', '冲正状态', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('none', 'reverseFlagList', '-', '冲正状态', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('init', 'dtlStatusList', '初始化', '流水状态', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('success', 'dtlStatusList', '交易成功', '流水状态', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('fail', 'dtlStatusList', '交易失败', '流水状态', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('wip', 'dtlStatusList','待支付', '流水状态', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('cancel','dtlStatusList', '交易取消', '流水状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (1, 'cancel', 'reverseFlagList', '冲正', '冲正状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (2, 'reverse', '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")
+VALUES (4, 'init', 'dtlStatusList', '初始化', '流水状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (5, 'success', 'dtlStatusList', '交易成功', '流水状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (6, 'fail', 'dtlStatusList', '交易失败', '流水状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (7, 'wip', 'dtlStatusList','待支付', '流水状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (8, 'cancel','dtlStatusList', '交易取消', '流水状态', '{tenantid}');
 
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('idcard', 'idtypeList', '身份证', '证件类型', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('residence_booklet', 'idtypeList', '户口簿', '证件类型', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('passport', 'idtypeList', '护照', '证件类型', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('hk_macau_pass', 'idtypeList', '港澳居民来往内地通行证', '证件类型', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('taiwan_pass', 'idtypeList', '港澳通行证', '台湾同胞来往内地通行证', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('foreigner_residence_permit', 'idtypeList', '港澳通行证', '外国人居留证', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('military_idcard', 'idtypeList', '港澳通行证', '军官证', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('soldier_idcard', 'idtypeList', '港澳通行证', '士兵证', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('driving_license', 'idtypeList', '驾照', '证件类型', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('student_idcard', 'idtypeList', '学工号', '证件类型', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('unknown', 'idtypeList', '其他', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (9, 'idcard', 'idtypeList', '身份证', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (10, 'residence_booklet', 'idtypeList', '户口簿', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (11, 'passport', 'idtypeList', '护照', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (12, 'hk_macau_pass', 'idtypeList', '港澳居民来往内地通行证', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (13, 'taiwan_pass', 'idtypeList', '港澳通行证', '台湾同胞来往内地通行证', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (14, 'foreigner_residence_permit', 'idtypeList', '港澳通行证', '外国人居留证', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (15, 'military_idcard', 'idtypeList', '港澳通行证', '军官证', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (16, 'soldier_idcard', 'idtypeList', '港澳通行证', '士兵证', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (17, 'driving_license', 'idtypeList', '驾照', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (18, 'student_idcard', 'idtypeList', '学工号', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (19, 'unknown', 'idtypeList', '其他', '证件类型', '{tenantid}');
 
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('male', 'sexList', '男', '性别', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('female', 'sexList', '女', '性别', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('unknown', 'sexList', '未知', '性别', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (20, 'male', 'sexList', '男', '性别', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (21, 'female', 'sexList', '女', '性别', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (22, 'unknown', 'sexList', '未知', '性别', '{tenantid}');
 
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('normal', 'accountStatusList', '正常', '账户状态', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('closed', 'accountStatusList', '注销', '账户状态', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('locked', 'accountStatusList', '锁定', '账户状态', '{tenantid}');
-INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('unknown', 'accountStatusList', '异常', '账户状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (23, 'normal', 'accountStatusList', '正常', '账户状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (24, 'closed', 'accountStatusList', '注销', '账户状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (25, 'locked', 'accountStatusList', '锁定', '账户状态', '{tenantid}');
+INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES (26, 'unknown', 'accountStatusList', '异常', '账户状态', '{tenantid}');
 ----------------------------------------------------
 commit;
\ No newline at end of file
diff --git a/payapi/src/main/resources/templates/system/user/add.html b/payapi/src/main/resources/templates/system/user/add.html
index f886aca..f33976e 100755
--- a/payapi/src/main/resources/templates/system/user/add.html
+++ b/payapi/src/main/resources/templates/system/user/add.html
@@ -86,14 +86,13 @@
                 data : JSON.stringify(data.field),
                 success : function(result) {
                     layer.closeAll('loading');
-                    if (result.code == 200) {
+                    if (result.code === 200) {
                         layer.msg(result.msg, {icon: 1});
                         admin.finishPopupCenter();
-                    } else if (result.code == 401) {
+                    } else if (result.code === 401) {
                         layer.msg(result.msg, {icon: 2, time: 1500}, function () {
                             location.replace('[[@{/login}]]');
                         }, 1000);
-                        return;
                     } else {
                         console.log('err:' + result.code);
                         layer.msg(result.msg, {icon: 2});