chenyi 1 tahun lalu
induk
melakukan
52dd0fb4c9

+ 5 - 0
pom.xml

@@ -121,6 +121,11 @@
             <artifactId>opencv</artifactId>
             <version>3.4.2-1</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.6</version>
+        </dependency>
     </dependencies>
 
     <!--阿里云镜像源(因需要提交到GithubActions,会引起依赖下载过慢的问题)-->

+ 48 - 0
src/main/java/com/test/xiaoshi/test/common/exception/BusinessException.java

@@ -0,0 +1,48 @@
+package com.test.xiaoshi.test.common.exception;
+
+
+/**
+ * @ClassName
+ * @Description 业务异常
+ * @Author 陈凯裕
+ * @Date 2022/6/27 18:02
+ * @Version TODO
+ **/
+public class BusinessException extends RuntimeException {
+
+	private static final long serialVersionUID = 3200004685293133433L;
+	private String errorCode;// 异常代码
+	private String errorMessage;// 异常信息
+
+	public BusinessException(String errorCode, String errorMessage) {
+		this.errorCode = errorCode;
+		this.errorMessage = errorMessage;
+	}
+
+	public BusinessException(ExceptionEnum e) {
+		this.errorMessage = e.getMessage();
+		this.errorCode = e.getCode();
+	}
+
+
+	public String getErrorCode() {
+		return errorCode;
+	}
+
+	public void setErrorCode(String errorCode) {
+		this.errorCode = errorCode;
+	}
+
+	public String getErrorMessage() {
+		return errorMessage;
+	}
+
+	public void setErrorMessage(String errorMessage) {
+		this.errorMessage = errorMessage;
+	}
+
+	public static long getSerialversionuid() {
+		return serialVersionUID;
+	}
+
+}

+ 139 - 0
src/main/java/com/test/xiaoshi/test/common/exception/ExceptionEnum.java

@@ -0,0 +1,139 @@
+package com.test.xiaoshi.test.common.exception;
+
+public enum ExceptionEnum {
+
+    /*APP端 100000-300000*/
+    SUCCESS("000000", "调用成功"),
+    SYSTEM_ERROR("999999", "系统异常"),
+    PARAMETER_VERIFICATION_ERROR("000001", "数据参数校验异常"),
+    PHONE_FORMAT_ERROR("000002","手机号格式错误"),
+    TOKEN_INVALID("000003","token无效"),
+    LANGUAGE_CODE_NULL("000004","languageCode不能为空"),
+    LANGUAGES_CODE_INVALID("000005","languageCode无效"),
+    VERIFICATION_CODE_INVALID("10001","当前验证码失效,请重新获取"),
+    CODE_WRONG("10002","验证码错误"),
+
+    EXCEL_READ_ERROR("10016","excel有错误,请先处理"),
+    INIT_GENERICITY_BEAN_ERROR("10003","泛型实例化异常"),
+    THE_PHONE_CANNOT_BE_EMPTY("10004","手机号不能为空"),
+    THE_STUDENT_IS_NOT_EXIST("10005","该学生不存在"),
+    THE_CODE_IS_NOT_NULL("10006","验证码不能为空"),
+    OPERATIONS_ARE_TOO_FREQUENT("10007","操作频繁"),
+    THE_STUDENT_HAS_EXIST("10008","很抱歉,该实名身份已被其他用户关联"),
+    ID_CARD_FORMAT_ERROR("10009","身份证格式错误"),
+    THE_RELATIONSHIP_ALREADY_ASSOCIATED("10010","您的孩子已经和您关联"),
+    DO_NOT_FIT_STUDENT_REQUIRE("10011","很抱歉,您不符合学员要求"),
+    THE_USER_IS_EXIST("10012","该用户已实名"),
+    REAL_NAME_AND_ID_CARD_NOT_MATCH("10013", "实名认证失败,请核对姓名与证件号码"),
+    PLEASE_CONTACT_YOUR_CHILD_FIRST("10014", "请先关联你的孩子"),
+    WX_REQUEST_EXCEPTION("10015","微信请求异常"),
+    WX_OPEN_ID_TOKEN_NOT_VALID("10016","openIdToken无效"),
+
+
+    USER_NOT_REAL_NAME("10020","未实名用户无法查看订单"),
+    TOURIST_DOES_NOT_HAVE_ORDER("10021","游客无法查看订单"),
+
+
+    /*海外学校端 400000-600000*/
+    SCHOOL_ACCOUNT_NOT_EXIST("400001","账号不存在"),
+    SCHOOL_PASSWORD_INVALID("400002","密码错误"),
+
+    /*后台管理  600000-900000*/
+    SYNC_HRS7_ERROR("600001","连接其他业务系统失败"),
+    REQUEST_WAS_ABORTED("600002","请求失败"),
+    THE_STUDENT_IS_EXIST("600003","该学员已存在"),
+    THE_RECORD_METHOD_MUST_TO_BE_MANUAL("600004", "记录方式必须为手工记录"),
+    THE_CUSTODIAN_HAS_RELATED_USER("600005", "该家长已经关联过用户,不可重复"),
+    THE_CUSTODIAN_HAS_EXISTED("600005", "家长已存在"),
+    PROPERTY_VALUE_ALREADY_EXIST("600006","可选项已存在"),
+    MANAGE_USER_EXIST("600007","手机号已经存在"),
+    MANAGE_POSITION_CODE_EXIST("600008","职位code已经存在"),
+    MANAGE_POSITION_EXIST("600009","职位已经存在"),
+    MANAGE_ROLE_EXIST("600009","角色已经存在"),
+    MANAGE_ROLE_CODE_EXIST("600010","角色code已经存在"),
+    MANAGE_RESOURCE_CODE_EXIST("600011","权限code已经存在"),
+    MANAGE_MENU_LIMIT("600012","菜单层级超出限制"),
+    MANAGE_RESOURCE_HAVE_CHILD("600013","资源存在子级资源,无法删除"),
+    MANAGE_USER_ACCOUNT_NOT_EXIST("600014","账号不存在"),
+    MANAGE_USER_FORBIDDEN("600015","账号已被封禁"),
+    MANAGE_USER_PASSWORD_ERROR("600016","密码错误"),
+    ACCOUNT_NOT_EXIST("600014", "账号不存在,请联系管理员开通账号"),
+    //产品相关
+    PRODUCT_DOES_NOT_HAVE_FAT_NODE("600050", "产品未配置流程大节点"),
+    PRODUCT_DOES_NOT_HAVE_SMALL_NODE("600051", "产品未配置流程小节点"),
+    SMALL_NODE_NOT_EXIST("600052", "节点不存在"),
+    ORDER_DOES_NOT_HAVE_NODE("600053", "订单没有节点"),
+    ORDER_NOT_EXIST("600054", "订单不存在"),
+    PAY_CAN_NOT_CLOSE("600055", "缴费单无法关闭,请检查缴费单状态"),
+    AMOUNT_CAN_NOT_LESS_THAN_ZERO("600056", "金额不可小于0"),
+    ORDER_TREATY_REAPEATABLE_INITIATE("600057","同类型合同不可重复发起"),
+    TREATY_ALREADY_SIGNED("600058","合同未签订,不可审核"),
+    TREATY_ALREADY_PASS("600059","合同已经审核,不可取消"),
+    TREATY_NOT_EXIST("600060","合同不存在"),
+    APP_NEWS_NOT_EXIST("600061","app信息不存在"),
+    PROCESS_NOT_EXIST("600062","流程不存在"),
+    PROCESS_IS_OVER("600063","流程已结束"),
+    PROCESS_CAN_NOT_RETURN_BACK("600064","流程不可回退到指定节点"),
+    NODE_CAN_NOT_REFUSE("600065","节点不可驳回"),
+    PROCESS_PARAM_NOT_VALID("600066","发起流程参数无效"),
+    DATA_NOT_ALL_COMPLETE("600067","有资料未确认,无法通过流程"),
+    REPEATED_INITIATION("600068","请勿重复发起流程"),
+    ORDER_CANT_CANCEL("600069","存在未完成缴费单或者未完成流程,订单不可关闭"),
+    POPUP_ALREADY_EXIST("600070","弹窗已经存在"),
+    STUDENT_STATUS_CANT_CHANGE("600071","学员状态不可更改"),
+    STUDENT_ORDER_REPEAT("600072","请勿重复添加同一订单"),
+    ROOT_ALREADY_EXIST("600073","服务机构下已有管理员"),
+    PHONE_ALREADY_EXIST("600074","手机号重复"),
+
+    /*文件服务*/
+    UPLOAD_IMAGE_TYPE_ERROR("900010","上传图片格式错误!"),
+    FILE_TOO_BIG("900011","上传文件大小不能超过100M"),
+    FILE_NO_HAVE_NAME("900012","未传文件名或文件名为空"),
+    REMOTE_FILE_READ_ERROR("900020","远程文件读取失败"),
+
+    /*海外用工端*/
+    ENTERPRISE_ACCOUNT_NOT_EXIST("700001","账号不存在"),
+    ENTERPRISE_PASSWORD_INVALID("700002","密码错误"),
+    WX_APPLY_ACCESS_TOKEN_ERROR("800001", "获取微信token失败"),
+    WX_PHONE_REQUIRE_ERROR("800001", "获取手机号失败"),
+
+    ALREADY_REAL_NAMED("1000001", "用户已实名,无法获取此积分"),
+    HAS_CONSULT_WITH_VOCATION_TEACHER_JOB("1000002", "已经咨询过职业导师"),
+    POINT_JOB_NOT_EXISTS("1000003", "积分任务不存在"),
+
+
+    /*学员池*/
+    STUDENT_POOL_ALREADY_EXISTS("1000004", "学员池已存在"),
+    STUDENT_IMPORT_FILE_HAS_NO_DATA("1000005", "文件无数据"),
+    TEMPLATE_FILE_FORMAT_ERROR("1000006", "文件格式错误"),
+    CANT_IMPORT_EMPTY("1000007", "不能导入空文件"),
+
+    /*服务机构*/
+    SERVICE_ORG_ALREADY_EXISTS("2000001", "服务机构已存在"),
+
+    CRM_USER_DO_NOT_LOGIN("2000021", "CRM用户未登录");
+
+    private String code;// 异常代码
+    private String message;// 异常信息
+
+    ExceptionEnum(String code, String message) {
+        this.code = code;
+        this.message = 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;
+    }
+}

+ 49 - 0
src/main/java/com/test/xiaoshi/test/common/exception/GlobalExceptionHandler.java

@@ -0,0 +1,49 @@
+package com.test.xiaoshi.test.common.exception;
+
+import com.test.xiaoshi.test.common.response.ResponseData;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+
+
+@RestControllerAdvice
+public class GlobalExceptionHandler  {
+
+    @ExceptionHandler(Exception.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//500
+    public ResponseData<String> exceptionHandler(Exception e, HttpServletResponse response) {
+//        LogHelper.warnLog(e);
+        return new ResponseData<>(ExceptionEnum.SYSTEM_ERROR.getCode(), ExceptionEnum.SYSTEM_ERROR.getMessage());
+    }
+
+    @ExceptionHandler(BusinessException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//500
+    public ResponseData<Object> exceptionHandler(BusinessException e, HttpServletResponse response) {
+//        LogHelper.warnLog(e);
+        return new ResponseData<>(e.getErrorCode(),e.getErrorMessage());
+    }
+
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//500
+    public ResponseData<Object> exceptionHandler(MethodArgumentNotValidException e, HttpServletResponse response) {
+//        LogHelper.warnLog(e,"数据参数校验异常");
+        if(StringUtils.isEmpty(e.getBindingResult().getFieldError().getDefaultMessage()))
+            return new ResponseData<>(ExceptionEnum.PARAMETER_VERIFICATION_ERROR.getCode(),ExceptionEnum.PARAMETER_VERIFICATION_ERROR.getMessage());
+        else
+            return new ResponseData<>(ExceptionEnum.PARAMETER_VERIFICATION_ERROR.getCode(),e.getBindingResult().getFieldError().getDefaultMessage());
+    }
+
+    @ExceptionHandler(HttpMessageNotReadableException.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//500
+    public ResponseData<Object> exceptionHandler(HttpMessageNotReadableException e, HttpServletResponse response) {
+//        LogHelper.warnLog(e,"数据参数校验异常");
+        return new ResponseData<>(ExceptionEnum.PARAMETER_VERIFICATION_ERROR.getCode(),ExceptionEnum.PARAMETER_VERIFICATION_ERROR.getMessage());
+    }
+
+}

+ 23 - 0
src/main/java/com/test/xiaoshi/test/common/log/BusinessLogTypeEnum.java

@@ -0,0 +1,23 @@
+package com.test.xiaoshi.test.common.log;
+
+public enum BusinessLogTypeEnum {
+	ECOMMERCE("ecommerce","小世电商模块");
+	private String desc;
+	private String type;
+	private BusinessLogTypeEnum(String type, String desc) {
+		this.setType(type);
+		this.setDesc(desc);
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getDesc() {
+		return desc;
+	}
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+}

+ 213 - 0
src/main/java/com/test/xiaoshi/test/common/log/LogHelper.java

@@ -0,0 +1,213 @@
+package com.test.xiaoshi.test.common.log;
+
+
+import com.test.xiaoshi.test.common.exception.BusinessException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/**
+ * 日志工具类
+ * @author Peach
+ *
+ */
+public class LogHelper {
+	
+	private static Logger logger = null;
+
+	//------------------------------------------系统日志记录-------------------------
+	/**
+	 * @param info
+	 */
+	public static void log(Object...info) {
+		logger = LoggerFactory.getLogger("");
+		logger.info("info={}",info);
+	}
+	
+	public static void log(Throwable e,Object...info) {
+		logger = LoggerFactory.getLogger("");
+		logger.info("exception={} info={}",throwable2String(e),info);
+	}
+	
+	/**
+	 * @param clazz
+	 * @param info
+	 */
+	public static void log(Class clazz, String info) {
+		logger = LoggerFactory.getLogger(clazz);
+		logger.info(info);
+	}
+	
+	/**
+	 * @param clazz
+	 * @param e
+	 */
+	public static void log(Class clazz, Throwable e) {
+		log(clazz,throwable2String(e));
+	}
+	
+	/**
+	 * @param name
+	 * @param info
+	 */
+	@Deprecated
+	public static void log(String name, String info) {
+		logger = LoggerFactory.getLogger(name);
+		logger.info(name+"-"+info);
+	}
+	
+	/**
+	 * @param name
+	 * @param e
+	 */
+	@Deprecated
+	public static void log(String name, Throwable e) {
+		log(name,throwable2String(e));
+	}
+	
+	
+	/**
+	 * @param name
+	 * @param info
+	 * @param e
+	 */
+	@Deprecated
+	public static void log(String name, String info,Throwable e) {
+		log(name,info+"-"+throwable2String(e));
+	}
+	
+	
+	/**
+	 * @param clazz
+	 * @param info
+	 * @param e
+	 */
+	public static void log(Class clazz, String info,Throwable e) {
+		log(clazz,info+"-"+throwable2String(e));
+	}
+	
+	/**
+	 * 将异常信息转为string
+	 * @param e
+	 * @return
+	 */
+	private static String throwable2String(Throwable e){
+		if(checkBaseBusinessException(e)) {
+			BusinessException bbe = (BusinessException)e;
+			return "----->"+bbe.getErrorMessage();
+		}
+		PrintWriter pw = null;
+		StringWriter sw = null;
+		try{
+			sw = new StringWriter();
+			pw = new PrintWriter(sw);
+			e.printStackTrace(pw);
+			pw.flush();
+			sw.flush();
+		}catch (Exception e1) {
+			logger.info(e.getMessage());
+		}finally{
+			if(sw!=null){
+				try{
+					sw.close();
+				}catch (Exception e2) {
+					e2.printStackTrace();
+					return "";
+				}
+			}else{
+				return "";
+			}
+			if(pw!=null){
+				pw.close();
+			}
+			return sw.toString();
+		}
+		
+	}
+	
+	
+	/**
+	* @Title: checkBaseBusinessException
+	* @Description: 判断异常是否为系统异常
+	* @param @param e
+	* @param @return    参数
+	* @return boolean    返回类型
+	* @throws
+	* @author Orange
+	* @date 2019年1月23日
+	*/
+	private static boolean checkBaseBusinessException(Throwable e) {
+		return BusinessException.class.isInstance(e);
+	}
+	
+	
+	//------------------------------------------多业务日志记录-------------------------
+	
+	/**
+	* @Title: log
+	* @Description: 多业务动态日志
+	* @param @param businessLogTypeEnum
+	* @param @param info    参数
+	* @return void    返回类型
+	* @throws
+	* @author Orange
+	* @date 2019年1月21日
+	*/
+	public static void log(BusinessLogTypeEnum businessLogTypeEnum, Object...info) {
+		MDC.put("businessName", businessLogTypeEnum.getType());
+		Logger logger = LoggerFactory.getLogger("business_log");
+		logger.info("businessName={}, info={}", businessLogTypeEnum.getType(), info);
+		MDC.remove(businessLogTypeEnum.getType());
+	}
+	
+	
+	
+	/**
+	* @Title: log
+	* @Description: 多业务动态日志
+	* @param @param businessLogTypeEnum
+	* @param @param e
+	* @param @param info    参数
+	* @return void    返回类型
+	* @throws
+	* @author Orange
+	* @date 2019年1月21日
+	*/
+	public static void log(BusinessLogTypeEnum businessLogTypeEnum,Throwable e,Object...info) {
+		MDC.put("businessName", businessLogTypeEnum.getType());
+		Logger logger = LoggerFactory.getLogger("business_log");
+		logger.info("businessName={}, exception={} ,info={}", businessLogTypeEnum.getType(), throwable2String(e),info);
+		MDC.remove(businessLogTypeEnum.getType());
+	}
+	
+	
+	
+	/**
+	* @Title: warnLog
+	* @Description: 警告日志
+	* @param @param e
+	* @param @param info    参数
+	* @return void    返回类型
+	* @throws
+	* @author Orange
+	* @date 2019年1月26日
+	*/
+	public static void warnLog(Throwable e,Object...info) {
+		//系统级别日志不打印
+		if(checkBaseBusinessException(e)) {
+			log(e,info);
+		}else {
+			Logger logger = LoggerFactory.getLogger("error_log");
+			logger.warn("[System Exception] exception={} ,info={}", throwable2String(e),info);
+		}
+	}
+
+	public static void warnLog(String warnInfo){
+		Logger logger = LoggerFactory.getLogger("error_log");
+		logger.warn(warnInfo);
+	}
+
+}

+ 40 - 0
src/main/java/com/test/xiaoshi/test/common/response/BaseResponsePageDTO.java

@@ -0,0 +1,40 @@
+package com.test.xiaoshi.test.common.response;
+
+public class BaseResponsePageDTO {
+	private Long pageNo;
+	private Long pageSize;
+	private Long total;
+	private Long pages;
+
+	public Long getPageNo() {
+		return pageNo;
+	}
+
+	public void setPageNo(Long pageNo) {
+		this.pageNo = pageNo;
+	}
+
+	public Long getPageSize() {
+		return pageSize;
+	}
+
+	public void setPageSize(Long pageSize) {
+		this.pageSize = pageSize;
+	}
+
+	public Long getTotal() {
+		return total;
+	}
+
+	public void setTotal(Long total) {
+		this.total = total;
+	}
+
+	public Long getPages() {
+		return pages;
+	}
+
+	public void setPages(Long pages) {
+		this.pages = pages;
+	}
+}

+ 49 - 0
src/main/java/com/test/xiaoshi/test/common/response/ResponseData.java

@@ -0,0 +1,49 @@
+package com.test.xiaoshi.test.common.response;
+import com.test.xiaoshi.test.common.exception.BusinessException;
+import com.test.xiaoshi.test.common.exception.ExceptionEnum;
+
+
+public class ResponseData<T> {
+	private String code;//结果代码
+	private String message;//结果信息
+	private T data;//数据集
+	
+	public ResponseData() throws BusinessException {
+		this(ExceptionEnum.SUCCESS.getCode(),ExceptionEnum.SUCCESS.getMessage(),null);
+	}
+
+	public ResponseData(T data) throws BusinessException {
+		this(ExceptionEnum.SUCCESS.getCode(),ExceptionEnum.SUCCESS.getMessage(),data);
+	}
+	
+	public ResponseData(String code, String message) throws BusinessException {
+		this(code,message,null);
+	}
+	
+	public ResponseData(String code, String message, T data) throws BusinessException {
+		this.code = code;
+		this.message = message;
+		this.data = data;
+	}
+
+
+	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;
+	}
+	public T getData() {
+		return data;
+	}
+	public void setData(T data) {
+		this.data = data;
+	}
+
+}