commit c57d9580edb59fd9bbe40b15fc85ade881eb2928
Author: PC-20200604TTHR\Administrator <349091389@qq.com>
Date: Thu Mar 28 09:31:44 2024 +0800
初始化项目
diff --git a/common/pom.xml b/common/pom.xml
new file mode 100644
index 0000000..46ba43c
--- /dev/null
+++ b/common/pom.xml
@@ -0,0 +1,55 @@
+
+
+
+ com.mh
+ mh_esi
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ com.mh
+ common
+ 0.0.1-SNAPSHOT
+ jar
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ 1.8
+ 1.8
+
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.31
+
+
+
+ com.github.pagehelper
+ pagehelper-spring-boot-starter
+ 1.2.13
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ commons-beanutils
+ commons-beanutils
+ 1.9.3
+
+
+
+ org.apache.poi
+ poi-ooxml
+ 4.0.1
+
+
+
diff --git a/common/src/main/java/com/mh/common/dto/RespDTO.java b/common/src/main/java/com/mh/common/dto/RespDTO.java
new file mode 100644
index 0000000..06cb8d6
--- /dev/null
+++ b/common/src/main/java/com/mh/common/dto/RespDTO.java
@@ -0,0 +1,26 @@
+package com.mh.common.dto;
+
+import java.io.Serializable;
+
+public class RespDTO implements Serializable{
+
+
+ public int code = 0;
+ public String error = "";
+ public T data;
+
+ public static RespDTO onSuc(Object data) {
+ RespDTO resp = new RespDTO();
+ resp.data = data;
+ return resp;
+ }
+
+ @Override
+ public String toString() {
+ return "RespDTO{" +
+ "code=" + code +
+ ", error='" + error + '\'' +
+ ", data=" + data +
+ '}';
+ }
+}
diff --git a/common/src/main/java/com/mh/common/exception/BaseErrorInfo.java b/common/src/main/java/com/mh/common/exception/BaseErrorInfo.java
new file mode 100644
index 0000000..83a7af2
--- /dev/null
+++ b/common/src/main/java/com/mh/common/exception/BaseErrorInfo.java
@@ -0,0 +1,9 @@
+package com.mh.common.exception;
+
+public interface BaseErrorInfo {
+ /** 错误码*/
+ int getResultCode();
+
+ /** 错误描述*/
+ String getResultMsg();
+}
diff --git a/common/src/main/java/com/mh/common/exception/CommonNum.java b/common/src/main/java/com/mh/common/exception/CommonNum.java
new file mode 100644
index 0000000..5141a1b
--- /dev/null
+++ b/common/src/main/java/com/mh/common/exception/CommonNum.java
@@ -0,0 +1,50 @@
+package com.mh.common.exception;
+
+public enum CommonNum implements BaseErrorInfo {
+ /**
+ * 自定义错误信息
+ */
+ SUCCESS(200, "成功!"),
+ BODY_NOT_MATCH(400,"请求的数据格式不符!"),
+ SIGNATURE_NOT_MATCH(401,"请求的数字签名不匹配!"),
+ NOT_FOUND(404, "未找到该资源!"),
+ INTERNAL_SERVER_ERROR(500, "服务器内部错误!"),
+ SERVER_BUSY(503,"服务器正忙,请稍后再试!"),
+
+ OK(0, ""),
+ FAIL(-1, "操作失败"),
+ RPC_ERROR(-2,"远程调度失败"),
+ USER_NOT_FOUND(1000,"用户不存在"),
+ USER_PASSWORD_ERROR(1001,"密码错误"),
+ GET_TOKEN_FAIL(1002,"获取token失败"),
+ TOKEN_IS_NOT_MATCH_USER(1003,"请使用自己的token进行接口请求"),
+ BLOG_IS_NOT_EXIST(2001,"该博客不存在");
+
+ /**
+ * 错误码
+ */
+ private int resultCode;
+
+ /**
+ * 错误描述
+ */
+ private String resultMsg;
+
+
+ CommonNum(int resultCode, String resultMsg) {
+ this.resultCode = resultCode;
+ this.resultMsg = resultMsg;
+ }
+
+ @Override
+ public int getResultCode() {
+ return resultCode;
+ }
+
+ @Override
+ public String getResultMsg() {
+ return resultMsg;
+ }
+}
+
+
diff --git a/common/src/main/java/com/mh/common/exception/GlobalException.java b/common/src/main/java/com/mh/common/exception/GlobalException.java
new file mode 100644
index 0000000..188411a
--- /dev/null
+++ b/common/src/main/java/com/mh/common/exception/GlobalException.java
@@ -0,0 +1,52 @@
+package com.mh.common.exception;
+import com.mh.common.http.HttpResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@ControllerAdvice
+public class GlobalException {
+ private static final Logger logger = LoggerFactory.getLogger(GlobalException.class);
+
+ /**
+ * 处理自定义异常
+ * @param e
+ * @return
+ */
+ @ResponseBody
+ @ExceptionHandler(value = ServiceRuntimeException.class)
+ public HttpResult serviceRuntimeException(ServiceRuntimeException e){
+ logger.error("发生业务异常!原因是:{}",e.getMessage());
+ return HttpResult.error(e.getCode(),e.getMessage());
+
+ }
+
+ /**
+ * 处理空指针异常
+ * @param e
+ * @return
+ */
+ @ResponseBody
+ @ExceptionHandler(value = NullPointerException.class)
+ public HttpResult exceptionHandler(NullPointerException e){
+ logger.error("发生空指针异常!原因是:",e);
+ return HttpResult.error(CommonNum.BODY_NOT_MATCH.toString());
+
+ }
+
+ /**
+ * 其它异常
+ * @param e
+ * @return
+ */
+ @ResponseBody
+ @ExceptionHandler(value = Exception.class)
+ public HttpResult exceptionHandler(Exception e){
+ logger.error("发生空指针异常!原因是:",e);
+ return HttpResult.error(CommonNum.INTERNAL_SERVER_ERROR.toString());
+
+ }
+
+}
diff --git a/common/src/main/java/com/mh/common/exception/ServiceRuntimeException.java b/common/src/main/java/com/mh/common/exception/ServiceRuntimeException.java
new file mode 100644
index 0000000..c659a54
--- /dev/null
+++ b/common/src/main/java/com/mh/common/exception/ServiceRuntimeException.java
@@ -0,0 +1,64 @@
+package com.mh.common.exception;
+
+public class ServiceRuntimeException extends RuntimeException{
+ /**
+ * 错误码
+ */
+ private int code;
+ /**
+ * 错误信息
+ */
+ private String message;
+
+ public ServiceRuntimeException(String message){
+ super(message);
+ this.message = message;
+
+ }
+
+ public ServiceRuntimeException(int code,String message){
+ super(message);
+ this.code = code;
+ this.message = message;
+
+ }
+
+ //Throwable是Error和Exception的父类,用来定义所有可以作为异常被抛出来的类。
+ public ServiceRuntimeException(int code,String message,Throwable cause){
+ super(message,cause);
+ this.code = code;
+ this.message = message;
+
+ }
+
+ public ServiceRuntimeException(BaseErrorInfo baseErrorInfo){
+ super(baseErrorInfo.getResultMsg());
+ this.code = baseErrorInfo.getResultCode();
+ this.message = baseErrorInfo.getResultMsg();
+ }
+
+ public ServiceRuntimeException(BaseErrorInfo baseErrorInfo,Throwable cause){
+ super(baseErrorInfo.getResultMsg(),cause);
+ this.code = baseErrorInfo.getResultCode();
+ this.message = baseErrorInfo.getResultMsg();
+ }
+
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
+
diff --git a/common/src/main/java/com/mh/common/http/HttpResult.java b/common/src/main/java/com/mh/common/http/HttpResult.java
new file mode 100644
index 0000000..c320830
--- /dev/null
+++ b/common/src/main/java/com/mh/common/http/HttpResult.java
@@ -0,0 +1,96 @@
+package com.mh.common.http;
+
+/**
+ * HTTP结果封装
+ * @author Louis
+ * @date Jan 12, 2019
+ */
+public class HttpResult {
+
+ private int code = 200; // 为成功
+ private String msg; // 消息
+ private Object data; // 数据对象
+ private int count; // 记录数
+
+ public static HttpResult error() {
+
+ return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
+ }
+
+ public static HttpResult error(String msg)
+ {
+ return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
+ }
+
+ public static HttpResult error(int code, String msg) {
+ HttpResult r = new HttpResult();
+ r.setCode(code);
+ r.setMsg(msg);
+ return r;
+ }
+
+ public static HttpResult ok(String msg) {
+ HttpResult r = new HttpResult();
+ r.setMsg(msg);
+ return r;
+ }
+
+ public static HttpResult ok(Object data) {
+ HttpResult r = new HttpResult();
+ r.setData(data);
+ return r;
+ }
+
+ public static HttpResult ok(String msg, Object data) {
+ HttpResult r = new HttpResult();
+ r.setMsg(msg);
+ r.setData(data);
+ return r;
+ }
+
+ public static HttpResult ok(int count, Object data) {
+ HttpResult r = new HttpResult();
+ r.setCount(count);
+ r.setData(data);
+ return r;
+ }
+
+ public static HttpResult ok() {
+ HttpResult r = new HttpResult();
+ r.setMsg("success");
+ r.setCode(200);
+ return r;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+ public void setData(Object data) {
+ this.data = data;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+}
diff --git a/common/src/main/java/com/mh/common/http/HttpStatus.java b/common/src/main/java/com/mh/common/http/HttpStatus.java
new file mode 100644
index 0000000..1c73e17
--- /dev/null
+++ b/common/src/main/java/com/mh/common/http/HttpStatus.java
@@ -0,0 +1,149 @@
+package com.mh.common.http;
+
+/**
+ * Constants enumerating the HTTP status codes.
+ * All status codes defined in RFC1945 (HTTP/1.0), RFC2616 (HTTP/1.1), and
+ * RFC2518 (WebDAV) are listed.
+ *
+ *
+ *
+ * @since 4.0
+ */
+public interface HttpStatus {
+
+ // --- 1xx Informational ---
+
+ /** {@code 100 Continue} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_CONTINUE = 100;
+ /** {@code 101 Switching Protocols} (HTTP/1.1 - RFC 2616)*/
+ public static final int SC_SWITCHING_PROTOCOLS = 101;
+ /** {@code 102 Processing} (WebDAV - RFC 2518) */
+ public static final int SC_PROCESSING = 102;
+
+ // --- 2xx Success ---
+
+ /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_OK = 200;
+ /** {@code 201 Created} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_CREATED = 201;
+ /** {@code 202 Accepted} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_ACCEPTED = 202;
+ /** {@code 203 Non Authoritative Information} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
+ /** {@code 204 No Content} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_NO_CONTENT = 204;
+ /** {@code 205 Reset Content} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_RESET_CONTENT = 205;
+ /** {@code 206 Partial Content} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_PARTIAL_CONTENT = 206;
+ /**
+ * {@code 207 Multi-Status} (WebDAV - RFC 2518)
+ * or
+ * {@code 207 Partial Update OK} (HTTP/1.1 - draft-ietf-http-v11-spec-rev-01?)
+ */
+ public static final int SC_MULTI_STATUS = 207;
+
+ // --- 3xx Redirection ---
+
+ /** {@code 300 Mutliple Choices} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_MULTIPLE_CHOICES = 300;
+ /** {@code 301 Moved Permanently} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_MOVED_PERMANENTLY = 301;
+ /** {@code 302 Moved Temporarily} (Sometimes {@code Found}) (HTTP/1.0 - RFC 1945) */
+ public static final int SC_MOVED_TEMPORARILY = 302;
+ /** {@code 303 See Other} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_SEE_OTHER = 303;
+ /** {@code 304 Not Modified} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_NOT_MODIFIED = 304;
+ /** {@code 305 Use Proxy} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_USE_PROXY = 305;
+ /** {@code 307 Temporary Redirect} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_TEMPORARY_REDIRECT = 307;
+
+ // --- 4xx Client Error ---
+
+ /** {@code 400 Bad Request} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_BAD_REQUEST = 400;
+ /** {@code 401 Unauthorized} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_UNAUTHORIZED = 401;
+ /** {@code 402 Payment Required} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_PAYMENT_REQUIRED = 402;
+ /** {@code 403 Forbidden} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_FORBIDDEN = 403;
+ /** {@code 404 Not Found} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_NOT_FOUND = 404;
+ /** {@code 405 Method Not Allowed} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_METHOD_NOT_ALLOWED = 405;
+ /** {@code 406 Not Acceptable} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_NOT_ACCEPTABLE = 406;
+ /** {@code 407 Proxy Authentication Required} (HTTP/1.1 - RFC 2616)*/
+ public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
+ /** {@code 408 Request Timeout} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_REQUEST_TIMEOUT = 408;
+ /** {@code 409 Conflict} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_CONFLICT = 409;
+ /** {@code 410 Gone} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_GONE = 410;
+ /** {@code 411 Length Required} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_LENGTH_REQUIRED = 411;
+ /** {@code 412 Precondition Failed} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_PRECONDITION_FAILED = 412;
+ /** {@code 413 Request Entity Too Large} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_REQUEST_TOO_LONG = 413;
+ /** {@code 414 Request-URI Too Long} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_REQUEST_URI_TOO_LONG = 414;
+ /** {@code 415 Unsupported Media Type} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
+ /** {@code 416 Requested Range Not Satisfiable} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
+ /** {@code 417 Expectation Failed} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_EXPECTATION_FAILED = 417;
+
+ /**
+ * Static constant for a 418 error.
+ * {@code 418 Unprocessable Entity} (WebDAV drafts?)
+ * or {@code 418 Reauthentication Required} (HTTP/1.1 drafts?)
+ */
+ // not used
+ // public static final int SC_UNPROCESSABLE_ENTITY = 418;
+
+ /**
+ * Static constant for a 419 error.
+ * {@code 419 Insufficient Space on Resource}
+ * (WebDAV - draft-ietf-webdav-protocol-05?)
+ * or {@code 419 Proxy Reauthentication Required}
+ * (HTTP/1.1 drafts?)
+ */
+ public static final int SC_INSUFFICIENT_SPACE_ON_RESOURCE = 419;
+ /**
+ * Static constant for a 420 error.
+ * {@code 420 Method Failure}
+ * (WebDAV - draft-ietf-webdav-protocol-05?)
+ */
+ public static final int SC_METHOD_FAILURE = 420;
+ /** {@code 422 Unprocessable Entity} (WebDAV - RFC 2518) */
+ public static final int SC_UNPROCESSABLE_ENTITY = 422;
+ /** {@code 423 Locked} (WebDAV - RFC 2518) */
+ public static final int SC_LOCKED = 423;
+ /** {@code 424 Failed Dependency} (WebDAV - RFC 2518) */
+ public static final int SC_FAILED_DEPENDENCY = 424;
+
+ // --- 5xx Server Error ---
+
+ /** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_INTERNAL_SERVER_ERROR = 500;
+ /** {@code 501 Not Implemented} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_NOT_IMPLEMENTED = 501;
+ /** {@code 502 Bad Gateway} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_BAD_GATEWAY = 502;
+ /** {@code 503 Service Unavailable} (HTTP/1.0 - RFC 1945) */
+ public static final int SC_SERVICE_UNAVAILABLE = 503;
+ /** {@code 504 Gateway Timeout} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_GATEWAY_TIMEOUT = 504;
+ /** {@code 505 HTTP Version Not Supported} (HTTP/1.1 - RFC 2616) */
+ public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
+
+ /** {@code 507 Insufficient Storage} (WebDAV - RFC 2518) */
+ public static final int SC_INSUFFICIENT_STORAGE = 507;
+
+}
diff --git a/common/src/main/java/com/mh/common/page/ColumnFilter.java b/common/src/main/java/com/mh/common/page/ColumnFilter.java
new file mode 100644
index 0000000..9a1a5ac
--- /dev/null
+++ b/common/src/main/java/com/mh/common/page/ColumnFilter.java
@@ -0,0 +1,32 @@
+package com.mh.common.page;
+
+/**
+ * 分页查询列过滤器
+ * @author Louis
+ * @date Aug 19, 2018
+ */
+public class ColumnFilter {
+
+ /**
+ * 过滤列名
+ */
+ private String name;
+ /**
+ * 查询的值
+ */
+ private String value;
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+}
diff --git a/common/src/main/java/com/mh/common/page/MybatisPageHelper.java b/common/src/main/java/com/mh/common/page/MybatisPageHelper.java
new file mode 100644
index 0000000..7e6d4b1
--- /dev/null
+++ b/common/src/main/java/com/mh/common/page/MybatisPageHelper.java
@@ -0,0 +1,63 @@
+package com.mh.common.page;
+
+import java.util.List;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.mh.common.utils.ReflectionUtils;
+
+/**
+ * MyBatis 分页查询助手
+ * @author Louis
+ * @date Jan 12, 2019
+ */
+public class MybatisPageHelper {
+
+ public static final String findPage = "findPage";
+
+ /**
+ * 分页查询, 约定查询方法名为 “findPage”
+ * @param pageRequest 分页请求
+ * @param mapper Dao对象,MyBatis的 Mapper
+ * @param
+ * @return
+ */
+ public static PageResult findPage(PageRequest pageRequest, Object mapper) {
+ return findPage(pageRequest, mapper, findPage);
+ }
+
+ /**
+ * 调用分页插件进行分页查询
+ * @param pageRequest 分页请求
+ * @param mapper Dao对象,MyBatis的 Mapper
+ * @param queryMethodName 要分页的查询方法名
+ * @param args 方法参数
+ * @return
+ */
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public static PageResult findPage(PageRequest pageRequest, Object mapper, String queryMethodName, Object... args) {
+ // 设置分页参数
+ int pageNum = pageRequest.getPageNum();
+ int pageSize = pageRequest.getPageSize();
+ PageHelper.startPage(pageNum, pageSize);
+ // 利用反射调用查询方法
+ Object result = ReflectionUtils.invoke(mapper, queryMethodName, args);
+ return getPageResult(pageRequest, new PageInfo((List) result));
+ }
+
+ /**
+ * 将分页信息封装到统一的接口
+ * @param pageRequest
+ * @return
+ */
+ private static PageResult getPageResult(PageRequest pageRequest, PageInfo> pageInfo) {
+ PageResult pageResult = new PageResult();
+ pageResult.setPageNum(pageInfo.getPageNum());
+ pageResult.setPageSize(pageInfo.getPageSize());
+ pageResult.setTotalSize(pageInfo.getTotal());
+ pageResult.setTotalPages(pageInfo.getPages());
+ pageResult.setContent(pageInfo.getList());
+ return pageResult;
+ }
+
+}
diff --git a/common/src/main/java/com/mh/common/page/PageRequest.java b/common/src/main/java/com/mh/common/page/PageRequest.java
new file mode 100644
index 0000000..97ed3dd
--- /dev/null
+++ b/common/src/main/java/com/mh/common/page/PageRequest.java
@@ -0,0 +1,46 @@
+package com.mh.common.page;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 分页请求
+ * @author Louis
+ * @date Aug 19, 2018
+ */
+public class PageRequest {
+ /**
+ * 当前页码
+ */
+ private int pageNum = 1;
+ /**
+ * 每页数量
+ */
+ private int pageSize = 10;
+ /**
+ * 每页数量
+ */
+ private Map columnFilters = new HashMap();
+
+ public int getPageNum() {
+ return pageNum;
+ }
+ public void setPageNum(int pageNum) {
+ this.pageNum = pageNum;
+ }
+ public int getPageSize() {
+ return pageSize;
+ }
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+ public Map getColumnFilters() {
+ return columnFilters;
+ }
+ public void setColumnFilters(Map columnFilters) {
+ this.columnFilters = columnFilters;
+ }
+ public ColumnFilter getColumnFilter(String name) {
+ return columnFilters.get(name);
+ }
+}
diff --git a/common/src/main/java/com/mh/common/page/PageResult.java b/common/src/main/java/com/mh/common/page/PageResult.java
new file mode 100644
index 0000000..2c9ad52
--- /dev/null
+++ b/common/src/main/java/com/mh/common/page/PageResult.java
@@ -0,0 +1,61 @@
+package com.mh.common.page;
+
+import java.util.List;
+
+/**
+ * 分页返回结果
+ * @author Louis
+ * @date Jan 12, 2019
+ */
+public class PageResult {
+ /**
+ * 当前页码
+ */
+ private int pageNum;
+ /**
+ * 每页数量
+ */
+ private int pageSize;
+ /**
+ * 记录总数
+ */
+ private long totalSize;
+ /**
+ * 页码总数
+ */
+ private int totalPages;
+ /**
+ * 分页数据
+ */
+ private List> content;
+ public int getPageNum() {
+ return pageNum;
+ }
+ public void setPageNum(int pageNum) {
+ this.pageNum = pageNum;
+ }
+ public int getPageSize() {
+ return pageSize;
+ }
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+ public long getTotalSize() {
+ return totalSize;
+ }
+ public void setTotalSize(long totalSize) {
+ this.totalSize = totalSize;
+ }
+ public int getTotalPages() {
+ return totalPages;
+ }
+ public void setTotalPages(int totalPages) {
+ this.totalPages = totalPages;
+ }
+ public List> getContent() {
+ return content;
+ }
+ public void setContent(List> content) {
+ this.content = content;
+ }
+}
diff --git a/common/src/main/java/com/mh/common/service/CurdService.java b/common/src/main/java/com/mh/common/service/CurdService.java
new file mode 100644
index 0000000..a76e871
--- /dev/null
+++ b/common/src/main/java/com/mh/common/service/CurdService.java
@@ -0,0 +1,50 @@
+package com.mh.common.service;
+
+import com.mh.common.page.PageRequest;
+import com.mh.common.page.PageResult;
+
+import java.util.List;
+
+/**
+ * 通用CURD接口
+ */
+public interface CurdService {
+
+ /**
+ * 保存操作
+ * @param record
+ * @return
+ */
+ int save(T record);
+
+ /**
+ * 删除操作
+ * @param record
+ * @return
+ */
+ int delete(T record);
+
+ /**
+ * 批量删除操作
+ * @param records
+ */
+ int delete(List records);
+
+ /**
+ * 根据ID查询
+ * @param id
+ * @return
+ */
+ T findById(Long id);
+
+ /**
+ * 分页查询
+ * 这里统一封装了分页请求和结果,避免直接引入具体框架的分页对象, 如MyBatis或JPA的分页对象
+ * 从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会
+ * 影响服务层以上的分页接口,起到了解耦的作用
+ * @param pageRequest 自定义,统一分页查询请求
+ * @return PageResult 自定义,统一分页查询结果
+ */
+ PageResult findPage(PageRequest pageRequest);
+
+}
\ No newline at end of file
diff --git a/common/src/main/java/com/mh/common/utils/DateTimeUtils.java b/common/src/main/java/com/mh/common/utils/DateTimeUtils.java
new file mode 100644
index 0000000..ae7d735
--- /dev/null
+++ b/common/src/main/java/com/mh/common/utils/DateTimeUtils.java
@@ -0,0 +1,32 @@
+package com.mh.common.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 日期时间相关工具
+ * @author Louis
+ * @date Jan 14, 2019
+ */
+public class DateTimeUtils {
+
+ public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+
+ /**
+ * 获取当前标准格式化日期时间
+ * @param date
+ * @return
+ */
+ public static String getDateTime() {
+ return getDateTime(new Date());
+ }
+
+ /**
+ * 标准格式化日期时间
+ * @param date
+ * @return
+ */
+ public static String getDateTime(Date date) {
+ return (new SimpleDateFormat(DATE_FORMAT)).format(date);
+ }
+}
diff --git a/common/src/main/java/com/mh/common/utils/FileUtils.java b/common/src/main/java/com/mh/common/utils/FileUtils.java
new file mode 100644
index 0000000..addd5af
--- /dev/null
+++ b/common/src/main/java/com/mh/common/utils/FileUtils.java
@@ -0,0 +1,42 @@
+package com.mh.common.utils;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+/**
+ * 文件相关操作
+ * @author Louis
+ * @date Jan 14, 2019
+ */
+public class FileUtils {
+
+ /**
+ * 下载文件
+ * @param response
+ * @param file
+ * @param newFileName
+ */
+ public static void downloadFile(HttpServletResponse response, File file, String newFileName) {
+ try {
+ response.setHeader("Content-Disposition", "attachment; filename=" + new String(newFileName.getBytes("ISO-8859-1"), "UTF-8"));
+ BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
+ InputStream is = new FileInputStream(file.getAbsolutePath());
+ BufferedInputStream bis = new BufferedInputStream(is);
+ int length = 0;
+ byte[] temp = new byte[1 * 1024 * 10];
+ while ((length = bis.read(temp)) != -1) {
+ bos.write(temp, 0, length);
+ }
+ bos.flush();
+ bis.close();
+ bos.close();
+ is.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/common/src/main/java/com/mh/common/utils/IOUtils.java b/common/src/main/java/com/mh/common/utils/IOUtils.java
new file mode 100644
index 0000000..1c0c9b0
--- /dev/null
+++ b/common/src/main/java/com/mh/common/utils/IOUtils.java
@@ -0,0 +1,26 @@
+package com.mh.common.utils;
+
+import java.io.Closeable;
+import java.io.IOException;
+
+/**
+ * IO相关工具类
+ * @author Louis
+ * @date Oct 29, 2018
+ */
+public class IOUtils {
+
+ /**
+ * 关闭对象,连接
+ * @param closeable
+ */
+ public static void closeQuietly(final Closeable closeable) {
+ try {
+ if (closeable != null) {
+ closeable.close();
+ }
+ } catch (final IOException ioe) {
+ // ignore
+ }
+ }
+}
diff --git a/common/src/main/java/com/mh/common/utils/PoiUtils.java b/common/src/main/java/com/mh/common/utils/PoiUtils.java
new file mode 100644
index 0000000..29badd6
--- /dev/null
+++ b/common/src/main/java/com/mh/common/utils/PoiUtils.java
@@ -0,0 +1,41 @@
+//package com.mh.common.utils;
+//
+//import java.io.File;
+//import java.io.FileNotFoundException;
+//import java.io.FileOutputStream;
+//import java.io.IOException;
+//import java.io.OutputStream;
+//
+//import org.apache.poi.ss.usermodel.Workbook;
+//
+///**
+// * POI相关操作
+// * @author Louis
+// * @date Jan 14, 2019
+// */
+//public class PoiUtils {
+//
+// /**
+// * 生成Excel文件
+// * @param workbook
+// * @param fileName
+// * @return
+// */
+// public static File createExcelFile(Workbook workbook, String fileName) {
+// OutputStream stream = null;
+// File file = null;
+// try {
+// file = File.createTempFile(fileName, ".xlsx");
+// stream = new FileOutputStream(file.getAbsoluteFile());
+// workbook.write(stream);
+// } catch (FileNotFoundException e) {
+// e.printStackTrace();
+// } catch (IOException e) {
+// e.printStackTrace();
+// } finally {
+// IOUtils.closeQuietly(workbook);
+// IOUtils.closeQuietly(stream);
+// }
+// return file;
+// }
+//}
diff --git a/common/src/main/java/com/mh/common/utils/ReflectionUtils.java b/common/src/main/java/com/mh/common/utils/ReflectionUtils.java
new file mode 100644
index 0000000..57c1a38
--- /dev/null
+++ b/common/src/main/java/com/mh/common/utils/ReflectionUtils.java
@@ -0,0 +1,78 @@
+package com.mh.common.utils;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * 反射相关辅助方法
+ * @author Louis
+ * @date Aug 19, 2018
+ */
+public class ReflectionUtils {
+
+
+ /**
+ * 根据方法名调用指定对象的方法
+ * @param object 要调用方法的对象
+ * @param method 要调用的方法名
+ * @param args 参数对象数组
+ * @return
+ */
+ public static Object invoke(Object object, String method, Object... args) {
+ Object result = null;
+ Class extends Object> clazz = object.getClass();
+ Method queryMethod = getMethod(clazz, method, args);
+ if(queryMethod != null) {
+ try {
+ result = queryMethod.invoke(object, args);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ } else {
+ try {
+ throw new NoSuchMethodException(clazz.getName() + " 类中没有找到 " + method + " 方法。");
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ }
+ }
+ return result;
+ }
+
+ /**
+ * 根据方法名和参数对象查找方法
+ * @param clazz
+ * @param name
+ * @param args 参数实例数据
+ * @return
+ */
+ public static Method getMethod(Class extends Object> clazz, String name, Object[] args) {
+ Method queryMethod = null;
+ Method[] methods = clazz.getMethods();
+ for(Method method:methods) {
+ if(method.getName().equals(name)) {
+ Class>[] parameterTypes = method.getParameterTypes();
+ if(parameterTypes.length == args.length) {
+ boolean isSameMethod = true;
+ for(int i=0; i
+
+ 4.0.0
+ com.mh
+ mh_esi
+ 1.0-SNAPSHOT
+ pom
+
+ common
+ user-service
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.5.RELEASE
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ Hoxton.SR3
+ 2.9.2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.jolokia
+ jolokia-core
+
+
+ io.springfox
+ springfox-swagger2
+ ${swagger.version}
+
+
+ io.springfox
+ springfox-swagger-ui
+ ${swagger.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+ 2.2.5.RELEASE
+
+
+ org.rxtx
+ rxtx
+ 2.1.7
+
+
+ com.github.purejavacomm
+ purejavacomm
+ 1.0.1.RELEASE
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
diff --git a/user-service/HELP.md b/user-service/HELP.md
new file mode 100644
index 0000000..5ea1b3b
--- /dev/null
+++ b/user-service/HELP.md
@@ -0,0 +1,33 @@
+# Getting Started
+
+### Reference Documentation
+For further reference, please consider the following sections:
+
+* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
+* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/maven-plugin/)
+* [Spring Web](https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#boot-features-developing-web-applications)
+
+### Guides
+The following guides illustrate how to use some features concretely:
+
+* [Service Registration and Discovery](https://spring.io/guides/gs/service-registration-and-discovery/)
+* [Circuit Breaker](https://spring.io/guides/gs/circuit-breaker/)
+* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)
+* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)
+* [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/)
+
+# Spring Cloud Netflix Maintenance Mode
+
+The dependencies listed below are in maintenance mode. We do not recommend adding them to
+new projects:
+
+* Hystrix
+* Hystrix Dashboard
+
+The decision to move most of the Spring Cloud Netflix projects to maintenance mode was
+a response to Netflix not continuing maintenance of many of the libraries that we provided
+support for.
+
+Please see [this blog entry](https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now#spring-cloud-netflix-projects-entering-maintenance-mode)
+for more information on maintenance mode and a list of suggested replacements for those
+libraries.
diff --git a/user-service/lib/.idea/lib.iml b/user-service/lib/.idea/lib.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/user-service/lib/.idea/lib.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/user-service/lib/.idea/misc.xml b/user-service/lib/.idea/misc.xml
new file mode 100644
index 0000000..28a804d
--- /dev/null
+++ b/user-service/lib/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/user-service/lib/.idea/modules.xml b/user-service/lib/.idea/modules.xml
new file mode 100644
index 0000000..b0c4ff6
--- /dev/null
+++ b/user-service/lib/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/user-service/lib/.idea/vcs.xml b/user-service/lib/.idea/vcs.xml
new file mode 100644
index 0000000..b2bdec2
--- /dev/null
+++ b/user-service/lib/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/user-service/lib/.idea/workspace.xml b/user-service/lib/.idea/workspace.xml
new file mode 100644
index 0000000..1347e5a
--- /dev/null
+++ b/user-service/lib/.idea/workspace.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1663641449492
+
+
+ 1663641449492
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/user-service/lib/RXTXcomm.jar b/user-service/lib/RXTXcomm.jar
new file mode 100644
index 0000000..e1e7503
Binary files /dev/null and b/user-service/lib/RXTXcomm.jar differ
diff --git a/user-service/pom.xml b/user-service/pom.xml
new file mode 100644
index 0000000..d652165
--- /dev/null
+++ b/user-service/pom.xml
@@ -0,0 +1,203 @@
+
+
+ 4.0.0
+
+ com.mh
+ mh_esi
+ 1.0-SNAPSHOT
+
+ com.mh
+ user-service
+ 0.0.1-SNAPSHOT
+ user-service
+ jar
+ Demo project for Spring Boot
+
+
+ 1.8
+ Hoxton.SR3
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+ import
+
+
+
+ org.springframework.boot
+ spring-boot-starter-quartz
+
+
+ org.springframework.cloud
+ spring-cloud-starter-config
+ 2.2.2.RELEASE
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+ 2.8.8
+
+
+ com.alibaba
+ fastjson
+ 1.2.41
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 2.1.2
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.1.18
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+ runtime
+
+
+
+ log4j
+ log4j
+ 1.2.17
+
+
+ io.netty
+ netty-all
+ 5.0.0.Alpha2
+
+
+
+ com.github.penggle
+ kaptcha
+ 2.3.2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+ io.jsonwebtoken
+ jjwt
+ 0.9.1
+
+
+ com.mh
+ common
+ 0.0.1-SNAPSHOT
+
+
+
+ de.codecentric
+ spring-boot-admin-starter-client
+ 2.2.2
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ tk.mybatis
+ mapper
+ 3.3.9
+
+
+ org.apache.commons
+ commons-pool2
+
+
+ net.sf.json-lib
+ json-lib
+ 2.4
+ jdk15
+
+
+ org.springframework.boot
+ spring-boot-starter-amqp
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
+
+
+
+
+ src/main/java
+
+ **/sqlmapper/*.xml
+
+ false
+
+
+ src/main/resources
+
+ **/*.*
+
+ true
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 2.7.2
+
+
+
+
+
diff --git a/user-service/src/main/java/com/mh/user/UserServiceApplication.java b/user-service/src/main/java/com/mh/user/UserServiceApplication.java
new file mode 100644
index 0000000..8ec61f4
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/UserServiceApplication.java
@@ -0,0 +1,57 @@
+package com.mh.user;
+
+import com.mh.user.constants.Constant;
+import com.mh.user.job.CollectionLoopRunner;
+import com.mh.user.netty.EchoServer;
+import com.mh.user.service.DeviceCodeParamService;
+import com.mh.user.utils.GetReadOrder485;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import javax.annotation.PreDestroy;
+
+
+@SpringBootApplication(scanBasePackages = "com.mh.user")
+@EnableScheduling
+//@ServletComponentScan
+public class UserServiceApplication extends SpringBootServletInitializer {
+
+ private static final Logger log = Logger.getLogger(UserServiceApplication.class);
+
+ @Autowired
+ DeviceCodeParamService deviceCodeParamService;
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
+ return builder.sources(UserServiceApplication.class);
+ }
+
+ public static void main(String[] args) { //一共四个地方要修改,UserServiceApplication,RabbitmqConfig,log4j,bootstrap,DealDataJob
+
+ SpringApplication.run(UserServiceApplication.class, args);
+ //System.out.println(Constant.projectId);
+ //Constant.projectId=7;
+ //System.out.println(Constant.projectId);
+ GetReadOrder485 getReadOrder485=new GetReadOrder485();
+ getReadOrder485.createOrderParam("2"); //生成采集参数,1新珠江,2广合科技,3广大科技,6珠江国际,7保利山庄,8东莞迎宾馆
+ try{
+ new EchoServer(6001).start(); // 调用服务器的start方法,网关作为客户端,6006新珠江,6001广合科技,6077广大科技
+// new EchoServer2(6013).start(); // 6028(6006)珠江国际,5000保利山庄,6004东莞迎宾馆
+// log.info("测试日志路径========!");
+ }catch (Exception e){
+ System.out.println("端口已占用!");
+ }
+ }
+
+ @PreDestroy
+ public void destory() {
+ //关闭应用前 关闭端口
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/annotation/SysLogger.java b/user-service/src/main/java/com/mh/user/annotation/SysLogger.java
new file mode 100644
index 0000000..0b5f36b
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/annotation/SysLogger.java
@@ -0,0 +1,15 @@
+package com.mh.user.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * Created by fangzhipeng on 2017/7/12.
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface SysLogger {
+
+ String value() default ""; // 模块
+ String optDesc() default ""; // 业务操作描述
+}
diff --git a/user-service/src/main/java/com/mh/user/annotation/applicationListener.java b/user-service/src/main/java/com/mh/user/annotation/applicationListener.java
new file mode 100644
index 0000000..5ba461e
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/annotation/applicationListener.java
@@ -0,0 +1,23 @@
+package com.mh.user.annotation;
+import javax.servlet.ServletContextAttributeEvent;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+
+@WebListener
+public class applicationListener implements ServletContextListener,ServletContextAttributeListener{
+
+ @Override
+ public void contextDestroyed(ServletContextEvent arg0) {
+ System.getProperties().remove("log4jDirKey");
+ }
+
+ @Override
+ public void contextInitialized(ServletContextEvent arg0) {
+ String log4jDir=arg0.getServletContext().getRealPath("/");
+ System.setProperty("log4jDirKey", log4jDir);
+// System.out.println(log4jDir);
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java b/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java
new file mode 100644
index 0000000..cb54017
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/aspect/DaoAspect.java
@@ -0,0 +1,91 @@
+package com.mh.user.aspect;
+
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.mh.common.utils.StringUtils;
+import com.mh.user.utils.SecurityUtils;
+import org.apache.commons.beanutils.BeanUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+/**
+ * DAO切面,插入创建人,创建时间,修改人,修改时间
+ * @author Louis
+ * @date Oct 29, 2018
+ */
+@Aspect
+@Component
+@Configuration
+public class DaoAspect {
+ private static final String createBy = "createBy";
+ private static final String createTime = "createTime";
+ private static final String lastUpdateBy = "lastUpdateBy";
+ private static final String lastUpdateTime = "lastUpdateTime";
+
+ @Pointcut("execution(* com.mh.*.mapper.*.update*(..))")
+ public void daoUpdate() {
+ }
+
+ @Pointcut("execution(* com.mh.*.mapper.*.insert*(..))")
+ public void daoCreate() {
+ }
+
+ @Around("daoUpdate()")
+ public Object doAroundUpdate(ProceedingJoinPoint pjp) throws Throwable {
+ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+ if (attributes == null) {
+ return pjp.proceed();
+ }
+ HttpServletRequest request = attributes.getRequest();
+ String token = request.getHeader("token");
+ String username = getUserName();
+ if (token != null && username != null) {
+ Object[] objects = pjp.getArgs();
+ if (objects != null && objects.length > 0) {
+ for (Object arg : objects) {
+ BeanUtils.setProperty(arg, lastUpdateBy, username);
+ BeanUtils.setProperty(arg, lastUpdateTime, new Date());
+ }
+ }
+ }
+ Object object = pjp.proceed();
+ return object;
+
+ }
+
+ @Around("daoCreate()")
+ public Object doAroundCreate(ProceedingJoinPoint pjp) throws Throwable {
+ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+ if (attributes == null) {
+ return pjp.proceed();
+ }
+ Object[] objects = pjp.getArgs();
+ if (objects != null && objects.length > 0) {
+ for (Object arg : objects) {
+ String username = getUserName();
+ if (username != null) {
+ if (StringUtils.isBlank(BeanUtils.getProperty(arg, createBy))) {
+ BeanUtils.setProperty(arg, createBy, username);
+ }
+ if (StringUtils.isBlank(BeanUtils.getProperty(arg, createTime))) {
+ BeanUtils.setProperty(arg, createTime, new Date());
+ }
+ }
+ }
+ }
+ Object object = pjp.proceed();
+ return object;
+ }
+
+ private String getUserName() {
+ return SecurityUtils.getUsername();
+ }
+}
diff --git a/user-service/src/main/java/com/mh/user/aspect/SysLogAspect.java b/user-service/src/main/java/com/mh/user/aspect/SysLogAspect.java
new file mode 100644
index 0000000..74b8a70
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/aspect/SysLogAspect.java
@@ -0,0 +1,127 @@
+package com.mh.user.aspect;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.mh.user.annotation.SysLogger;
+import com.mh.user.model.SysLog;
+import com.mh.user.service.SysLogService;
+import com.mh.user.utils.HttpUtils;
+import com.mh.user.utils.IPUtils;
+import com.mh.user.utils.SecurityUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+/**
+ * 系统日志,切面处理类,记录日志
+ */
+@Aspect
+@Component
+public class SysLogAspect {
+
+ @Autowired
+ private SysLogService sysLogService;
+
+ //@Pointcut("execution(* com.mh.*.service.*.*(..))")
+ @Pointcut("@annotation(com.mh.user.annotation.SysLogger)")
+ public void logPointCut() {
+
+ }
+
+ @Around("logPointCut()")
+ public Object around(ProceedingJoinPoint point) throws Throwable {
+ long beginTime = System.currentTimeMillis();
+ // 执行方法
+ Object result = point.proceed();
+ // 执行时长(毫秒)
+ long time = System.currentTimeMillis() - beginTime;
+ // 保存日志
+ saveSysLog(point, time);
+ return result;
+
+ }
+
+ private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
+ SysLog sysLog = new SysLog();
+ String methodName = joinPoint.getSignature().getName();
+ Method method = currentMethod(joinPoint,methodName);
+ SysLogger sysLogger = method.getAnnotation(SysLogger.class);
+ String module = sysLogger.value(); //操作模块
+ String optDesc=sysLogger.optDesc(); //操作描述
+ sysLog.setOperation(module);
+ sysLog.setOptDesc(optDesc);
+ String userName = SecurityUtils.getUsername(); //用户名称
+ if(joinPoint.getTarget() instanceof SysLogService) {
+ return ;
+ }
+ MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+
+ // 请求的方法名
+ String className = joinPoint.getTarget().getClass().getName();
+ String methodName1 = signature.getName();
+ sysLog.setMethod(className + "." + methodName1 + "()");
+
+ // 请求的参数
+ Object[] args = joinPoint.getArgs();
+ try{
+ String params = JSONObject.toJSONString(args[0]);
+ if(params.length() > 200) {
+ params = params.substring(0, 200) + "...";
+ }
+ sysLog.setParams(params);
+ } catch (Exception e){
+ }
+ // 获取request
+ HttpServletRequest request = HttpUtils.getHttpServletRequest();
+ // 设置IP地址
+ sysLog.setIp(IPUtils.getIpAddr(request));
+ String ip=IPUtils.getRemoteIp();
+ // 用户名
+ sysLog.setUserName(userName);
+ Date date1 = SecurityUtils.getLoginTime();
+ // 登录时间
+ sysLog.setCreateTime(date1);
+ Date date=new Date();
+ // 最后操作时间
+ sysLog.setLastUpdateTime(date);
+ // 执行时长(毫秒)
+ sysLog.setTime(time);
+ // 保存系统日志
+ sysLogService.save(sysLog);
+ }
+
+ /**
+ * 获取当前执行的方法
+ *
+ * @param joinPoint 连接点
+ * @param methodName 方法名称
+ * @return 方法
+ */
+ private Method currentMethod(JoinPoint joinPoint, String methodName) {
+ /**
+ * 获取目标类的所有方法,找到当前要执行的方法
+ */
+ Method[] methods = joinPoint.getTarget().getClass().getMethods();
+ Method resultMethod = null;
+ for (Method method : methods) {
+ if (method.getName().equals(methodName)) {
+ resultMethod = method;
+ break;
+ }
+ }
+ return resultMethod;
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/component/ReceiveHandler.java b/user-service/src/main/java/com/mh/user/component/ReceiveHandler.java
new file mode 100644
index 0000000..afb4662
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/component/ReceiveHandler.java
@@ -0,0 +1,71 @@
+package com.mh.user.component;
+
+import com.alibaba.druid.sql.visitor.functions.Isnull;
+import com.alibaba.fastjson.JSONObject;
+import com.mh.user.config.RabbitmqConfig;
+import com.mh.user.model.QueueParam;
+import com.mh.user.utils.AnalysisReceiveOrder485;
+import com.rabbitmq.client.AMQP;
+import com.rabbitmq.client.Channel;
+import com.rabbitmq.client.impl.AMQImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.log4j.Logger;
+import org.springframework.amqp.core.ExchangeTypes;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.Exchange;
+import org.springframework.amqp.rabbit.annotation.Queue;
+import org.springframework.amqp.rabbit.annotation.QueueBinding;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * 队列消费接收消息
+ */
+@Component
+public class ReceiveHandler {
+
+ private static final Logger log = Logger.getLogger(ReceiveHandler.class);
+ //监听队列
+// @RabbitListener(bindings = @QueueBinding(
+// value = @Queue(value = "queue_zjjd", durable = "true"),
+// exchange = @Exchange(
+// value = "topic.exchange",
+// ignoreDeclarationExceptions = "true",
+// type = ExchangeTypes.TOPIC
+// ),
+// key = {"topic.#.zjjd.#"}),ackMode = "MANUAL")
+ @RabbitListener(queues = RabbitmqConfig.QUEUE_NAME,containerFactory = "simpleRabbitListenerContainerFactory")
+ public void rece_msg(String msg,Channel channel, Message message) throws IOException {
+ log.info("当前线程:{},收到的简单消息:{}"+Thread.currentThread().getName()+msg);
+ try {
+ String show="";
+ if(msg!=null && msg.length()>0){
+ JSONObject JSONObj=JSONObject.parseObject(msg);
+ AnalysisReceiveOrder485 analysisReceive=new AnalysisReceiveOrder485();
+ QueueParam queueParam=new QueueParam();
+ queueParam.setRecData(JSONObj.getString("recData"));
+ queueParam.setDeviceType(JSONObj.getString("deviceType"));
+ queueParam.setRegisterAddr(JSONObj.getString("registerAddr"));
+ queueParam.setProjectID(JSONObj.getString("projectID"));
+ queueParam.setCopyTime(JSONObj.getString("copyTime"));
+ String deviceType=JSONObj.getString("deviceType");
+ show=deviceType+",数据:"+JSONObj.getString("recData");
+ log.info("从队列接受到的信息-->"+show);
+ if(deviceType!=null && deviceType.equals("电表")){
+ analysisReceive.analysisMeterQueue(queueParam);
+ }else if(deviceType.equals("冷量计")){
+ analysisReceive.analysisCloudQueue(queueParam);
+ }
+ }
+ //告诉服务器收到这条消息 已经被我消费了 可以在队列删掉 这样以后就不会再发了 否则消息服务器以为这条消息没处理掉 重启应用后还会在发
+ channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+ } catch (Exception e) {
+// e.printStackTrace();
+ //丢弃这条消息
+ channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
+ log.info("消费队列信息异常");
+ }
+ }
+}
diff --git a/user-service/src/main/java/com/mh/user/config/CorsConfig.java b/user-service/src/main/java/com/mh/user/config/CorsConfig.java
new file mode 100644
index 0000000..0f057a2
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/CorsConfig.java
@@ -0,0 +1,41 @@
+package com.mh.user.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * 跨域配置
+ * @author Louis
+ * @date Oct 29, 2018
+ */
+@Configuration
+public class CorsConfig implements WebMvcConfigurer {
+
+
+ @Autowired(required = false)
+ private PrimessionInterceptor primessionInterceptor;
+
+ /**
+ * 注册拦截器
+ */
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+
+ registry.addInterceptor(primessionInterceptor);
+ }
+
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**") // 允许跨域访问的路径
+ .allowedOrigins("*") // 允许跨域访问的源
+ .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许请求方法
+ .maxAge(168000) // 预检间隔时间
+ .allowedHeaders("*") // 允许头部设置
+ .allowCredentials(true); // 是否发送cookie
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/config/DruidConfig.java b/user-service/src/main/java/com/mh/user/config/DruidConfig.java
new file mode 100644
index 0000000..3823b5d
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/DruidConfig.java
@@ -0,0 +1,117 @@
+package com.mh.user.config;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.Filter;
+import javax.servlet.Servlet;
+import javax.sql.DataSource;
+
+import com.alibaba.druid.wall.WallConfig;
+import com.alibaba.druid.wall.WallFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.support.http.StatViewServlet;
+import com.alibaba.druid.support.http.WebStatFilter;
+
+/**
+ * @author ljf
+ * @title :
+ * @description :
+ * @updateTime 2020-03-13
+ * @throws :
+ */
+@Configuration
+@EnableConfigurationProperties({DruidDataSourceProperties.class})
+public class DruidConfig {
+ @Autowired
+ private DruidDataSourceProperties properties;
+
+ @Bean
+ @ConditionalOnMissingBean
+ public DataSource druidDataSource() {
+ DruidDataSource druidDataSource = new DruidDataSource();
+ druidDataSource.setDriverClassName(properties.getDriverClassName());
+ druidDataSource.setUrl(properties.getUrl());
+ druidDataSource.setUsername(properties.getUsername());
+ druidDataSource.setPassword(properties.getPassword());
+ druidDataSource.setInitialSize(properties.getInitialSize());
+ druidDataSource.setMinIdle(properties.getMinIdle());
+ druidDataSource.setMaxActive(properties.getMaxActive());
+ druidDataSource.setMaxWait(properties.getMaxWait());
+ druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
+ druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
+ druidDataSource.setValidationQuery(properties.getValidationQuery());
+ druidDataSource.setTestWhileIdle(properties.isTestWhileIdle());
+ druidDataSource.setTestOnBorrow(properties.isTestOnBorrow());
+ druidDataSource.setTestOnReturn(properties.isTestOnReturn());
+ druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements());
+ druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());
+
+ List list=new ArrayList<>();
+ WallFilter wallFilter=new WallFilter();
+ WallConfig config = new WallConfig();
+ //允许一次执行多条语句
+ config.setMultiStatementAllow(true);
+ //允许非基本语句的其他语句
+ //config.setNoneBaseStatementAllow(true);
+ wallFilter.setConfig(config);
+ list.add(wallFilter);
+ druidDataSource.setProxyFilters(list);
+
+ try {
+ druidDataSource.setFilters(properties.getFilters());
+ druidDataSource.init();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+
+ return druidDataSource;
+ }
+
+ /**
+ * 注册Servlet信息, 配置监控视图
+ *
+ * @return
+ */
+ @Bean
+ @ConditionalOnMissingBean
+ public ServletRegistrationBean druidServlet() {
+ ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
+
+ //白名单:
+// servletRegistrationBean.addInitParameter("allow","127.0.0.1,139.196.87.48");
+ //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
+ servletRegistrationBean.addInitParameter("deny","192.168.1.222");
+ //登录查看信息的账号密码, 用于登录Druid监控后台
+ servletRegistrationBean.addInitParameter("loginUsername", "admin");
+ servletRegistrationBean.addInitParameter("loginPassword", "admin");
+ //是否能够重置数据.
+ servletRegistrationBean.addInitParameter("resetEnable", "true");
+ return servletRegistrationBean;
+
+ }
+
+ /**
+ * 注册Filter信息, 监控拦截器
+ *
+ * @return
+ */
+ @Bean
+ @ConditionalOnMissingBean
+ public FilterRegistrationBean filterRegistrationBean() {
+ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
+ filterRegistrationBean.setFilter(new WebStatFilter());
+ filterRegistrationBean.addUrlPatterns("/*");
+ filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
+ return filterRegistrationBean;
+ }
+}
diff --git a/user-service/src/main/java/com/mh/user/config/DruidDataSourceProperties.java b/user-service/src/main/java/com/mh/user/config/DruidDataSourceProperties.java
new file mode 100644
index 0000000..69c5d14
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/DruidDataSourceProperties.java
@@ -0,0 +1,172 @@
+package com.mh.user.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @author ljf
+ * @title :
+ * @description :
+ * @updateTime 2020-03-13
+ * @throws :
+ */
+@ConfigurationProperties(prefix = "spring.datasource.druid")
+public class DruidDataSourceProperties {
+
+ // jdbc
+ private String driverClassName;
+ private String url;
+ private String username;
+ private String password;
+ // jdbc connection pool
+ private int initialSize;
+ private int minIdle;
+ private int maxActive = 100;
+ private long maxWait;
+ private long timeBetweenEvictionRunsMillis;
+ private long minEvictableIdleTimeMillis;
+ private String validationQuery;
+ private boolean testWhileIdle;
+ private boolean testOnBorrow;
+ private boolean testOnReturn;
+ private boolean poolPreparedStatements;
+ private int maxPoolPreparedStatementPerConnectionSize;
+ // filter
+ private String filters;
+
+ public int getInitialSize() {
+ return initialSize;
+ }
+
+ public void setInitialSize(int initialSize) {
+ this.initialSize = initialSize;
+ }
+
+ public int getMinIdle() {
+ return minIdle;
+ }
+
+ public void setMinIdle(int minIdle) {
+ this.minIdle = minIdle;
+ }
+
+ public int getMaxActive() {
+ return maxActive;
+ }
+
+ public void setMaxActive(int maxActive) {
+ this.maxActive = maxActive;
+ }
+
+ public long getMaxWait() {
+ return maxWait;
+ }
+
+ public void setMaxWait(long maxWait) {
+ this.maxWait = maxWait;
+ }
+
+ public long getTimeBetweenEvictionRunsMillis() {
+ return timeBetweenEvictionRunsMillis;
+ }
+
+ public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
+ this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
+ }
+
+ public long getMinEvictableIdleTimeMillis() {
+ return minEvictableIdleTimeMillis;
+ }
+
+ public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
+ this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
+ }
+
+ public String getValidationQuery() {
+ return validationQuery;
+ }
+
+ public void setValidationQuery(String validationQuery) {
+ this.validationQuery = validationQuery;
+ }
+
+ public boolean isTestWhileIdle() {
+ return testWhileIdle;
+ }
+
+ public void setTestWhileIdle(boolean testWhileIdle) {
+ this.testWhileIdle = testWhileIdle;
+ }
+
+ public boolean isTestOnBorrow() {
+ return testOnBorrow;
+ }
+
+ public void setTestOnBorrow(boolean testOnBorrow) {
+ this.testOnBorrow = testOnBorrow;
+ }
+
+ public boolean isTestOnReturn() {
+ return testOnReturn;
+ }
+
+ public void setTestOnReturn(boolean testOnReturn) {
+ this.testOnReturn = testOnReturn;
+ }
+
+ public boolean isPoolPreparedStatements() {
+ return poolPreparedStatements;
+ }
+
+ public void setPoolPreparedStatements(boolean poolPreparedStatements) {
+ this.poolPreparedStatements = poolPreparedStatements;
+ }
+
+ public int getMaxPoolPreparedStatementPerConnectionSize() {
+ return maxPoolPreparedStatementPerConnectionSize;
+ }
+
+ public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
+ this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
+ }
+
+ public String getFilters() {
+ return filters;
+ }
+
+ public void setFilters(String filters) {
+ this.filters = filters;
+ }
+
+ public String getDriverClassName() {
+ return driverClassName;
+ }
+
+ public void setDriverClassName(String driverClassName) {
+ this.driverClassName = driverClassName;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/config/DruidStatViewServlet.java b/user-service/src/main/java/com/mh/user/config/DruidStatViewServlet.java
new file mode 100644
index 0000000..c87b213
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/DruidStatViewServlet.java
@@ -0,0 +1,17 @@
+package com.mh.user.config;
+
+import com.alibaba.druid.support.http.StatViewServlet;
+
+/**
+ * druid监控视图配置
+ */
+//@WebServlet(urlPatterns = "/druid/*", initParams={
+// @WebInitParam(name="allow",value="192.168.6.195"), // IP白名单 (没有配置或者为空,则允许所有访问)
+// @WebInitParam(name="deny",value="192.168.6.73"), // IP黑名单 (存在共同时,deny优先于allow)
+// @WebInitParam(name="loginUsername",value="admin"), // 用户名
+// @WebInitParam(name="loginPassword",value="admin"), // 密码
+// @WebInitParam(name="resetEnable",value="true") // 禁用HTML页面上的“Reset All”功能
+//})
+public class DruidStatViewServlet extends StatViewServlet {
+ private static final long serialVersionUID = 7359758657306626394L;
+}
\ No newline at end of file
diff --git a/user-service/src/main/java/com/mh/user/config/KaptchaConfig.java b/user-service/src/main/java/com/mh/user/config/KaptchaConfig.java
new file mode 100644
index 0000000..434994f
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/KaptchaConfig.java
@@ -0,0 +1,56 @@
+package com.mh.user.config;
+
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+/**
+ * author:ljf
+ * update:2020-03-13
+ * description:登陆验证码
+ */
+@Configuration
+public class KaptchaConfig {
+
+ @Bean
+ public DefaultKaptcha getDefaultKaptcha(){
+ DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+ Properties properties = new Properties();
+ // 图片边框,合法值:yes[默认] , no
+ properties.setProperty("kaptcha.border", "no");
+ // 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue.默认black
+ properties.setProperty("kaptcha.border.color", "105,179,90");
+ // 边框厚度,合法值:>0,默认1
+// properties.setProperty("kaptcha.border.thickness", "1");
+ // 图片宽,默认200
+ properties.setProperty("kaptcha.image.width", "110");
+ // 图片高,默认50
+ properties.setProperty("kaptcha.image.height", "40");
+ // 字体大小,默认40px
+ properties.setProperty("kaptcha.textproducer.font.size", "35");
+ // 字体,默认Arial, Courier
+ properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
+ // 字体颜色,合法值: r,g,b 或者 white,black,blue.默认black
+ properties.setProperty("kaptcha.textproducer.font.color", "blue");
+ // session key,默认KAPTCHA_SESSION_KEY
+ properties.setProperty("kaptcha.session.key", "code");
+ // session date,默认KAPTCHA_SESSION_DATE
+// properties.setProperty("kaptcha.session.date", "KAPTCHA_SESSION_DATE");
+ // 验证码长度,默认5
+ properties.setProperty("kaptcha.textproducer.char.length", "4");
+ // 文字间隔,默认2
+ properties.setProperty("kaptcha.textproducer.char.space", "5");
+ // 干扰 颜色,合法值: r,g,b 或者 white,black,blue.默认black
+// properties.setProperty("kaptcha.noise.color", "black");
+ // 更多可参考:https://blog.csdn.net/elephantboy/article/details/52795309
+
+ Config config = new Config(properties);
+ defaultKaptcha.setConfig(config);
+
+ return defaultKaptcha;
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/config/PrimessionInterceptor.java b/user-service/src/main/java/com/mh/user/config/PrimessionInterceptor.java
new file mode 100644
index 0000000..5e13b7f
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/PrimessionInterceptor.java
@@ -0,0 +1,68 @@
+package com.mh.user.config;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.mh.user.dynamic.datasource.DataSourceContextHolder;
+import com.mh.user.dynamic.datasource.DataSourceObject;
+import com.mh.user.entity.DBEntity;
+import com.mh.user.service.SysUserService;
+import com.mh.user.utils.JwtTokenUtils;
+import com.mh.user.utils.AESUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author chison
+ * @date 2020-09-03 08:44
+ * @Description 请求拦截器
+ */
+@Component
+public class PrimessionInterceptor implements HandlerInterceptor {
+
+
+ @Autowired
+ private SysUserService sysUserService;
+
+ /**
+ * 根据token获取用户项目信息,对数据源进行切换
+ * @param request
+ * @param response
+ * @param handler
+ * @return
+ * @throws Exception
+ */
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ String token = request.getHeader("token");
+ if (token != null && token.contains("token")) {
+ JSONObject jsonObject = (JSONObject) JSON.parse(token);
+ System.out.println("header---->" + jsonObject.get("token"));
+ if (jsonObject.get("token") !=null ) {
+ token = jsonObject.get("token").toString();
+ }
+ System.out.println(" token==> " + token);
+ }
+ String uri = request.getRequestURI();
+ System.out.println(uri);
+ DataSourceContextHolder.setDBType("default");
+ // 除了中间库业务的请求都使用多数据源切换
+// if(!(uri.contains("/sysUser") || uri.contains("/sysRole") || uri.contains("/sysMenu") )){
+// if(token != null){
+// String userName = JwtTokenUtils.getUsernameFromToken(token);
+// System.out.println(userName);
+// DBEntity dbEntity = sysUserService.queryDBInfo(userName);
+// dbEntity.setDB_Pwd(AESUtil.AESdecrypt(dbEntity.getDB_Pwd()));
+// // 切换数据源
+// DataSourceObject dataSourceObject = new DataSourceObject();
+// String SourceName = "sqlServer-"+dbEntity.getDB_Names();
+// dataSourceObject.SwitchSQLServerDataSource(dbEntity,SourceName);
+// DataSourceContextHolder.setDBType(SourceName);
+// }
+// }
+ return true;
+ }
+}
diff --git a/user-service/src/main/java/com/mh/user/config/QuartzConfig.java b/user-service/src/main/java/com/mh/user/config/QuartzConfig.java
new file mode 100644
index 0000000..b12777e
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/QuartzConfig.java
@@ -0,0 +1,54 @@
+package com.mh.user.config;
+
+import com.mh.user.job.JobFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Scheduler;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+
+/**
+ * @author ljf
+ * @title : Quartz配置
+ * @description :
+ * @updateTime 2020-04-03
+ * @throws :
+ */
+@Slf4j
+@Configuration
+public class QuartzConfig {
+
+ private JobFactory jobFactory;
+
+ /**
+ * @author jinhaoxun
+ * @description 构造器
+ * @param jobFactory
+ */
+ public QuartzConfig(JobFactory jobFactory){
+ this.jobFactory = jobFactory;
+ }
+
+ /**
+ * @author jinhaoxun
+ * @description 配置SchedulerFactoryBean,将一个方法产生为Bean并交给Spring容器管理
+ * @return SchedulerFactoryBean
+ */
+ @Bean
+ public SchedulerFactoryBean schedulerFactoryBean() {
+// log.info("开始注入定时任务调度器工厂...");
+ System.out.println("开始注入定时任务调度器工厂...");
+ SchedulerFactoryBean factory = new SchedulerFactoryBean();// Spring提供SchedulerFactoryBean为Scheduler提供配置信息,并被Spring容器管理其生命周期
+ factory.setJobFactory(jobFactory);// 设置自定义Job Factory,用于Spring管理Job bean
+ factory.setOverwriteExistingJobs(true);// 覆盖存在的定时任务
+ factory.setStartupDelay(30); //延时30秒启动定时任务,避免系统未完全启动却开始执行定时任务的情况
+// log.info("注入定时任务调度器工厂成功!");
+ System.out.println("注入定时任务调度器工厂成功!");
+ return factory;
+ }
+
+ @Bean(name = "scheduler")
+ public Scheduler scheduler() {
+ return schedulerFactoryBean().getScheduler();
+ }
+}
diff --git a/user-service/src/main/java/com/mh/user/config/RabbitmqConfig.java b/user-service/src/main/java/com/mh/user/config/RabbitmqConfig.java
new file mode 100644
index 0000000..7cd8f13
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/RabbitmqConfig.java
@@ -0,0 +1,87 @@
+package com.mh.user.config;
+
+import com.mh.user.component.ReceiveHandler;
+import com.mh.user.constants.Constant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.log4j.Logger;
+import org.springframework.amqp.core.*;
+import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
+import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
+import org.springframework.amqp.rabbit.connection.ConnectionFactory;
+import org.springframework.amqp.support.converter.MessageConverter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.SimpleAsyncTaskExecutor;
+import org.springframework.transaction.PlatformTransactionManager;
+
+/**
+ *队列绑定队列、绑定交换机、绑定路由KEY
+ */
+@Configuration
+public class RabbitmqConfig {
+
+ private static final Logger log = Logger.getLogger(RabbitmqConfig.class);
+
+// public static final String QUEUE_NAME = "queue_zjjd"; //采集队列,珠江酒店
+
+// public static final String QUEUE_NAME = "queue_gdkj"; //采集队列,广大科技
+ public static final String QUEUE_NAME = "queue_ghkj"; //采集队列,广和科技
+// public static final String QUEUE_NAME = "queue_zjgj"; //采集队列,珠江国际
+// public static final String QUEUE_NAME = "queue_blsz"; //采集队列,保利山庄
+// public static final String QUEUE_NAME = "queue_dgybg"; //采集队列,东莞迎宾馆
+ public static final String EXCHANGE_NAME="topic.exchange"; //topics类型交换机==============
+// public static final String ROUTINGKEY_NAME="topic.#.zjjd.#"; //路由KEY,珠江酒店
+// public static final String ROUTINGKEY_NAME="topic.#.gdkj.#"; //路由KEY,广大科技
+ public static final String ROUTINGKEY_NAME="topic.#.ghkj.#"; //路由KEY,广和科技
+// public static final String ROUTINGKEY_NAME="topic.#.zjgj.#"; //路由KEY,珠江国际
+// public static final String ROUTINGKEY_NAME="topic.#.blsz.#"; //路由KEY,保利山庄
+// public static final String ROUTINGKEY_NAME="topic.#.dgybg.#"; //路由KEY,东莞迎宾馆
+
+ @Autowired
+ private CachingConnectionFactory connectionFactory;
+
+ //声明交换机
+ @Bean(EXCHANGE_NAME)
+ public Exchange exchange(){
+ //durable(true) 持久化,mq重启之后交换机还在
+ return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
+ }
+
+ //声明队列
+ /*
+ * new Queue(QUEUE_EMAIL,true,false,false)
+ * durable="true" 持久化 rabbitmq重启的时候不需要创建新的队列
+ * auto-delete 表示消息队列没有在使用时将被自动删除 默认是false
+ * exclusive 表示该消息队列是否只在当前connection生效,默认是false
+ */
+ //声明队列
+ @Bean(QUEUE_NAME)
+ public Queue queue(){
+ log.info("声明队列"+QUEUE_NAME);
+ return new Queue(QUEUE_NAME);
+ }
+
+ //ROUTINGKEY_WX队列绑定交换机,指定routingKey
+ @Bean
+ public Binding bindingQueue(@Qualifier(QUEUE_NAME) Queue queue,
+ @Qualifier(EXCHANGE_NAME) Exchange exchange){
+ log.info(QUEUE_NAME+"队列绑定到交换机topic.exchange");
+ return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_NAME).noargs();
+ }
+
+ //应该是处理多线程消费的
+ @Bean
+ public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(){
+ SimpleRabbitListenerContainerFactory listenerContainerFactory = new SimpleRabbitListenerContainerFactory();
+ listenerContainerFactory.setConnectionFactory(connectionFactory);
+ listenerContainerFactory.setConcurrentConsumers(3);
+ listenerContainerFactory.setMaxConcurrentConsumers(5);
+ listenerContainerFactory.setPrefetchCount(1);//预处理消息个数
+ listenerContainerFactory.setAcknowledgeMode(AcknowledgeMode.MANUAL);//开启消息确认机制
+ return listenerContainerFactory;
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/config/RestTemplateConfig.java b/user-service/src/main/java/com/mh/user/config/RestTemplateConfig.java
new file mode 100644
index 0000000..f6074d8
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/RestTemplateConfig.java
@@ -0,0 +1,14 @@
+package com.mh.user.config;
+
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author ljf
+ * @title :
+ * @description : redis配置
+ * @updateTime 2020-08-20
+ * @throws :
+ */
+@Configuration
+public class RestTemplateConfig {
+}
diff --git a/user-service/src/main/java/com/mh/user/config/SwaggerConfig.java b/user-service/src/main/java/com/mh/user/config/SwaggerConfig.java
new file mode 100644
index 0000000..4079b06
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/SwaggerConfig.java
@@ -0,0 +1,49 @@
+package com.mh.user.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author ljf
+ * @title :
+ * @description :
+ * @updateTime 2020-03-13
+ * @throws :
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+ @Bean
+ public Docket createRestApi(){
+ // 添加请求参数,我们这里把token作为请求头部参数传入后端
+ ParameterBuilder parameterBuilder = new ParameterBuilder();
+ List parameters = new ArrayList();
+ parameterBuilder.name("token").description("令牌")
+ .modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+ parameters.add(parameterBuilder.build());
+ return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
+ .apis(RequestHandlerSelectors.any()).paths(PathSelectors.any())
+ .build().globalOperationParameters(parameters);
+// return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
+// .apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build();
+ }
+
+ private ApiInfo apiInfo(){
+ return new ApiInfoBuilder().build();
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/config/WebSecurityConfig.java b/user-service/src/main/java/com/mh/user/config/WebSecurityConfig.java
new file mode 100644
index 0000000..637a2f6
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/config/WebSecurityConfig.java
@@ -0,0 +1,83 @@
+package com.mh.user.config;
+
+import com.mh.user.security.JwtAuthenticationFilter;
+import com.mh.user.security.JwtAuthenticationProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.authentication.AuthenticationManager;
+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.core.userdetails.UserDetailsService;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler;
+import org.springframework.web.cors.CorsUtils;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+
+/**
+ * Spring Security配置
+ * @author Louis
+ * @date Jan 14, 2019
+ */
+@Configuration
+@EnableWebSecurity // 开启Spring Security
+//@EnableGlobalMethodSecurity(prePostEnabled = true) // 开启权限注解,如:@PreAuthorize注解
+public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Qualifier("userDetailsServiceImpl")
+ @Autowired
+ private UserDetailsService userDetailsService;
+
+ @Override
+ public void configure(AuthenticationManagerBuilder auth) throws Exception {
+ // 使用自定义身份验证组件
+ auth.authenticationProvider(new JwtAuthenticationProvider(userDetailsService));
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ // 禁用 csrf, 由于使用的是JWT,我们这里不需要csrf
+// System.out.println("test0");
+// http.cors().and().csrf().disable()
+// .authorizeRequests()
+// // 跨域预检请求
+// .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
+// // web jars
+// .antMatchers("/webjars/**").permitAll()
+// // 查看SQL监控(druid)
+// .antMatchers("/druid/**").permitAll()
+// // 首页和登录页面
+// .antMatchers("/").permitAll()
+// .antMatchers("/login").permitAll()
+// // swagger
+// .antMatchers("/swagger-ui.html").permitAll()
+// .antMatchers("/swagger-resources/**").permitAll()
+// .antMatchers("/v2/api-docs").permitAll()
+// .antMatchers("/webjars/springfox-swagger-ui/**").permitAll()
+// // 验证码
+// .antMatchers("/captcha.jpg**").permitAll()
+// // 服务监控
+// .antMatchers("/actuator/**").permitAll()
+// // 其他所有请求需要身份认证
+// .anyRequest().authenticated();
+// // 退出登录处理器
+// http.logout().logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler());
+// // token验证过滤器
+// http.addFilterBefore(new JwtAuthenticationFilter(authenticationManager()), UsernamePasswordAuthenticationFilter.class);
+// System.out.println("test0_1");
+ // 禁用token验证
+ http.csrf().disable().authorizeRequests().anyRequest().permitAll().and().logout().permitAll();
+ }
+
+ @Bean
+ @Override
+ public AuthenticationManager authenticationManager() throws Exception {
+ return super.authenticationManager();
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/constants/Constant.java b/user-service/src/main/java/com/mh/user/constants/Constant.java
new file mode 100644
index 0000000..a4a65c6
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/constants/Constant.java
@@ -0,0 +1,18 @@
+package com.mh.user.constants;
+
+/**
+ * @author ljf
+ * @title :
+ * @description : 存放一些公共全局参数
+ * @updateTime 2020-05-29
+ * @throws :
+ */
+public class Constant {
+
+ public static boolean CONTROL_WEB_FLAG = false;
+ public static boolean SEND_STATUS = false; // 指令发送状态
+ public static boolean FLAG = false;
+ public static boolean WEB_FLAG = false; // 判断是否有前端指令下发
+ public static int projectId=1; // 项目编号
+
+}
diff --git a/user-service/src/main/java/com/mh/user/constants/SocketMessage.java b/user-service/src/main/java/com/mh/user/constants/SocketMessage.java
new file mode 100644
index 0000000..cc3c616
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/constants/SocketMessage.java
@@ -0,0 +1,33 @@
+package com.mh.user.constants;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author ljf
+ * @title :
+ * @description :
+ * @updateTime 2020-06-09
+ * @throws :
+ */
+@PropertySource("classpath:socket.yml")
+@ConfigurationProperties(prefix = "socket")
+@Setter
+@Getter
+@Component
+public class SocketMessage {
+
+ @Value("${IP}")
+ private String IP;
+
+ @Value("${port}")
+ private int port;
+
+ @Value("${overtime}")
+ private int overTime;
+
+}
diff --git a/user-service/src/main/java/com/mh/user/constants/SysConstants.java b/user-service/src/main/java/com/mh/user/constants/SysConstants.java
new file mode 100644
index 0000000..0e93a31
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/constants/SysConstants.java
@@ -0,0 +1,11 @@
+package com.mh.user.constants;
+
+/**
+ * author: ljf
+ * desc: 系统常量值
+ */
+public interface SysConstants {
+
+ // 系统管理员用户名
+ String ADMIN = "admin";
+}
diff --git a/user-service/src/main/java/com/mh/user/controller/AreaController.java b/user-service/src/main/java/com/mh/user/controller/AreaController.java
new file mode 100644
index 0000000..4b7c1fd
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/controller/AreaController.java
@@ -0,0 +1,38 @@
+package com.mh.user.controller;
+
+import com.mh.common.http.HttpResult;
+import com.mh.user.entity.AreaEntity;
+import com.mh.user.entity.ExceptionTableData;
+import com.mh.user.service.AreaService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author nxr
+ * @title : 校区接口
+ * @description :
+ * @updateTime 2022-06-09
+ * @throws :
+ */
+@RestController
+@RequestMapping("area")
+public class AreaController {
+
+ @Autowired
+ private AreaService areaService;
+
+ @PreAuthorize("hasAuthority('sys:area:view')")
+ @PostMapping(value = "/findArea")
+ public HttpResult findArea() {
+ List list=areaService.findAll();
+// System.out.println("test");
+ return HttpResult.ok("500",list);
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/controller/BuildingController.java b/user-service/src/main/java/com/mh/user/controller/BuildingController.java
new file mode 100644
index 0000000..cd387a4
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/controller/BuildingController.java
@@ -0,0 +1,90 @@
+package com.mh.user.controller;
+
+import com.mh.common.http.HttpResult;
+import com.mh.user.annotation.SysLogger;
+import com.mh.user.entity.BuildingEntity;
+import com.mh.user.model.BuildingModel;
+import com.mh.user.service.BuildingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("building")
+public class BuildingController {
+
+ @Autowired
+ private BuildingService buildingService;
+
+ //保存
+ @SysLogger(value="楼栋管理",optDesc = "添加楼栋信息")
+ @PostMapping(value="/save")
+ public HttpResult saveBuilding(@RequestBody BuildingEntity buildingEntity) {
+ try{
+ return HttpResult.ok(buildingService.saveBuilding(buildingEntity));
+ }catch (Exception e){
+ e.printStackTrace();
+ return HttpResult.error();
+ }
+
+ }
+
+ //修改
+ @SysLogger(value="楼栋管理",optDesc = "编辑楼栋信息")
+ @PostMapping(value="/update")
+ public HttpResult updateBuilding(@RequestBody BuildingEntity buildingEntity) {
+ return HttpResult.ok(buildingService.updateBuilding(buildingEntity));
+ }
+
+ //查询所有
+ @SysLogger(value="楼栋管理",optDesc = "查询楼栋信息")
+ @PostMapping(value = "/query")
+ public HttpResult queryBuilding(@RequestParam(value = "buildingId", required = false)String buildingId,
+ @RequestParam(value= "page", required=true)Integer page,
+ @RequestParam(value= "limit", required=true)Integer limit) {
+ try{
+ int count=buildingService.getCount(buildingId, page,limit);
+ List records=buildingService.queryBuilding(buildingId, page,limit);
+ return HttpResult.ok(count,records);
+ }catch (Exception e){
+ e.printStackTrace();
+ return HttpResult.error();
+ }
+ }
+
+ //查询楼栋名称
+ @PostMapping(value="/name")
+ public HttpResult selectBuildingName() {
+ try{
+ List list=buildingService.selectBuildingName();
+ return HttpResult.ok(list);
+ }catch (Exception e){
+ e.printStackTrace();
+ return HttpResult.error();
+ }
+
+ }
+
+ // 删除多
+ @PostMapping(value="/deletes")
+ public HttpResult delete(@RequestBody List records) {
+ return HttpResult.ok(buildingService.deleteBuilding(records));
+ }
+
+ // 删除单个
+ @SysLogger(value="楼栋管理",optDesc = "删除楼栋信息")
+ @PostMapping(value="/delete")
+ public HttpResult delete(@RequestParam String id ) {
+ return HttpResult.ok(buildingService.deleteBuilding(id));
+ }
+
+ // 查询编号
+ @PostMapping(value="/selectBuildingId")
+ public HttpResult selectBuildingId(@RequestParam String buildingName ) {
+ String id=buildingService.selectBuildingId(buildingName);
+ return HttpResult.ok(id);
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/controller/ChartController.java b/user-service/src/main/java/com/mh/user/controller/ChartController.java
new file mode 100644
index 0000000..6ca7ed4
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/controller/ChartController.java
@@ -0,0 +1,56 @@
+package com.mh.user.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.mh.common.http.HttpResult;
+import com.mh.user.entity.chart.ChartEntity;
+import com.mh.user.entity.chart.GetChartParams;
+import com.mh.user.service.chart.ChartService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author ljf
+ * @title : 图表查询接口
+ * @description :
+ * @updateTime 2020-07-17
+ * @throws :
+ */
+@RestController
+@RequestMapping("/report")
+public class ChartController {
+
+ @Autowired
+ private ChartService chartService;
+
+ @PostMapping("/getFirstColChartsData")
+ public HttpResult getFirstColChartsData(@RequestBody GetChartParams getChartParams) {
+ System.out.println(getChartParams.toString());
+ // 遍历数组参数
+ StringBuilder chooseIndexIds = new StringBuilder();
+ int b = 0;
+ for (int a :
+ getChartParams.getChooseIndexId()) {
+ b = b + 1;
+ if (b == 1) {
+ chooseIndexIds = new StringBuilder(String.valueOf(a));
+ } else {
+ chooseIndexIds.append(",").append(a);
+ }
+ }
+ System.out.println(chooseIndexIds);
+ Map map = new HashMap<>();
+ map.put("choose_index_ids", chooseIndexIds.toString());
+ map.put("begin_time",getChartParams.getBeginTime());
+ map.put("end_time",getChartParams.getEndTime());
+ map.put("type",getChartParams.getType());
+ map.put("chart_id",getChartParams.getChartId());
+ List chartEntityList = chartService.queryChartData(map);
+ System.out.println(JSONArray.toJSONString(chartEntityList));
+ return HttpResult.ok("success",chartEntityList);
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/controller/ChillersController.java b/user-service/src/main/java/com/mh/user/controller/ChillersController.java
new file mode 100644
index 0000000..5308074
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/controller/ChillersController.java
@@ -0,0 +1,140 @@
+package com.mh.user.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.mh.common.http.HttpResult;
+import com.mh.user.dto.DisplayBoxDataDTO;
+import com.mh.user.dto.TableInfoDTO;
+import com.mh.user.entity.GaugeEntity;
+import com.mh.user.entity.HostValue;
+import com.mh.user.entity.TableDataEntity;
+import com.mh.user.entity.TableInfoEntity;
+import com.mh.user.service.chillers.ChillersService;
+import com.mh.user.service.chillers.DeviceDisplayService;
+import com.mh.user.service.chillers.GaugeService;
+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 java.util.List;
+
+/**
+ * @author ljf
+ * @title :
+ * @description : 设备监控操作控制接口
+ * @updateTime 2020-05-20
+ * @throws :
+ */
+@RestController
+public class ChillersController {
+
+ private final ChillersService chillersService;
+ private final DeviceDisplayService deviceDisplayService;
+
+ public ChillersController(ChillersService chillersService, DeviceDisplayService deviceDisplayService) {
+ this.chillersService = chillersService;
+ this.deviceDisplayService = deviceDisplayService;
+ }
+
+ // 查询冷水机组各个部位的状态值
+// @GetMapping("/chillers")
+
+ /**
+ * 查询冷水机组进出水温度值等设备数据详情
+ * @param deviceType
+ * @param type
+ * @return
+ */
+ @GetMapping("/charts/getDisplayBoxData")
+ public HttpResult getDisplayBoxData(@RequestParam(value = "deviceType") String deviceType,
+ @RequestParam(value = "type") Integer type) {
+ List displayBoxDataDTOS = deviceDisplayService.deviceDisplayBoxData(deviceType, String.valueOf(type));
+ return HttpResult.ok("success", displayBoxDataDTOS);
+ }
+
+ /**
+ * 主机监测详情左侧表格数据
+ * @param deviceName
+ * @return
+ */
+ @GetMapping("/charts/getHostTableOneData")
+ public HttpResult queryChillersOneTable(@RequestParam(value = "deviceName") String deviceName) {
+ TableInfoDTO tableInfoDTO = new TableInfoDTO<>();
+ tableInfoDTO.setTableInfo(chillersService.queryLeftAndRightData(deviceName, 1));
+ return HttpResult.ok("success", tableInfoDTO);
+ }
+
+ /**
+ * 主机监测详情顶部表格数据
+ * @param deviceName
+ * @return
+ */
+ @GetMapping("/charts/getHostTopData")
+ public HttpResult queryChillersTopTable(@RequestParam(value = "deviceName", required = true) String deviceName) {
+ TableInfoDTO tableInfoDTO = new TableInfoDTO<>();
+ tableInfoDTO.setTableInfo(chillersService.queryTopData(deviceName, 1));
+ return HttpResult.ok("success", tableInfoDTO);
+ }
+
+ /**
+ * 主机监测详情右侧一表格数据
+ * @param deviceName
+ * @return
+ */
+ @GetMapping("/charts/getHostTableTwoData")
+ public HttpResult queryChillersRightTable(@RequestParam(value = "deviceName", required = true) String deviceName) {
+ TableInfoDTO tableInfoDTO = new TableInfoDTO<>();
+ tableInfoDTO.setTableInfo(chillersService.queryLeftAndRightData(deviceName, 2));
+ return HttpResult.ok("success", tableInfoDTO);
+ }
+
+ /**
+ * 主机监测详情右侧二表格数据
+ * @param deviceName
+ * @return
+ */
+ @GetMapping("/charts/getHostTableThreeData")
+ public HttpResult queryChillersRightTable1(@RequestParam(value = "deviceName", required = true) String deviceName) {
+ TableInfoDTO tableInfoDTO = new TableInfoDTO<>();
+ tableInfoDTO.setTableInfo(chillersService.queryLeftAndRightData(deviceName, 3));
+ return HttpResult.ok("success", tableInfoDTO);
+ }
+
+ // 冷却泵、冷冻泵、冷却塔详情页顶部表格数据
+ @GetMapping("/charts/getPumpOrTowerTopTableData")
+ public HttpResult getPumpOrTowerTopData(@RequestParam(value = "deviceName", required = true) String deviceName) {
+ TableInfoDTO tableInfoDTO = new TableInfoDTO<>();
+ tableInfoDTO.setTableInfo(chillersService.queryLeftAndRightData(deviceName, 1));
+ return HttpResult.ok("success", tableInfoDTO);
+ }
+
+ // 冷却泵、冷冻泵、冷却塔详情页顶部数据
+// @GetMapping("/charts/getPumpOrTowerTopTableData")
+ @GetMapping("/charts/getPumpOrTowerTopData")
+ public HttpResult getPumpOrTowerTopTableData(@RequestParam(value = "deviceName", required = true) String deviceName) {
+ TableInfoDTO tableInfoDTO = new TableInfoDTO<>();
+ tableInfoDTO.setTableInfo(chillersService.queryTopData(deviceName, 1));
+ return HttpResult.ok("success", tableInfoDTO);
+ }
+
+
+ // 获取冷却/冷冻水进出水温度、主机/冷却塔温度
+ @GetMapping("/operation/getTempValue")
+ public HttpResult getTempValue(@RequestParam(value = "deviceType", required = true) String deviceType) {
+ List hostValueList = chillersService.queryTempValue(deviceType);
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("values", hostValueList);
+ return HttpResult.ok("success",jsonObject);
+ }
+
+ @Autowired
+ private GaugeService gaugeService;
+
+ // 设备监控页表盘分析图
+ @GetMapping("/charts/getGaugeData")
+ public HttpResult getGaugeData(@RequestParam(value = "type") String type, @RequestParam(value = "deviceName") String deviceName) {
+ GaugeEntity gaugeEntity = gaugeService.getGaugeData(type,deviceName);
+ return HttpResult.ok("success",gaugeEntity);
+ }
+
+}
diff --git a/user-service/src/main/java/com/mh/user/controller/DataResultController.java b/user-service/src/main/java/com/mh/user/controller/DataResultController.java
new file mode 100644
index 0000000..e49f766
--- /dev/null
+++ b/user-service/src/main/java/com/mh/user/controller/DataResultController.java
@@ -0,0 +1,328 @@
+package com.mh.user.controller;
+
+import com.mh.common.http.HttpResult;
+import com.mh.user.annotation.SysLogger;
+import com.mh.user.entity.DataResultChEntity;
+import com.mh.user.entity.DataResultEntity;
+import com.mh.user.service.BuildingService;
+import com.mh.user.service.DataResultService;
+import com.mh.user.utils.ExchangeStringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@RestController
+@RequestMapping("dataResult")
+public class DataResultController {
+
+ @Autowired
+ DataResultService dataResultService;
+
+ @Autowired
+ BuildingService buildingService;
+
+
+ @SysLogger(value="中央空调",optDesc = "数据分析查询")
+ @PostMapping(value="/query")
+ public HttpResult queryDataResult(@RequestParam(value = "projectID", required = false) String projectID,
+ @RequestParam(value= "startDate", required=false)String startDate,
+ @RequestParam(value= "endDate", required=false)String endDate,
+ @RequestParam(value= "deviceType", required=false)String deviceType,
+ @RequestParam(value= "page", required=true)Integer page,
+ @RequestParam(value= "limit", required=true)Integer limit) {
+
+ try{
+
+ int count=dataResultService.getDataResultCount(projectID,startDate,endDate,deviceType,page,limit);
+ List records=dataResultService.queryDataResult(projectID,startDate,endDate,deviceType,page,limit);
+ return HttpResult.ok(count,records);
+
+ }catch (Exception e){
+ e.printStackTrace();
+ return HttpResult.error();
+ }
+ }
+
+ @SysLogger(value="中央空调",optDesc = "能耗分析按小时查询")
+ @PostMapping(value="/hour")
+ public HttpResult queryDataResultMi(@RequestParam(value= "projectID", required=false)String projectID,
+ @RequestParam(value= "dateType", required=false)String dateType,
+ @RequestParam(value= "curDate", required=false)String curDate,
+ @RequestParam(value="page", required=false) int page,
+ @RequestParam(value="limit", required=false) int limit) {
+ try{
+ if(projectID!=null && projectID.length()>0){
+ String startDate="";
+ curDate=curDate.substring(0,16)+":00";
+ if (dateType.equals("1小时")){
+ startDate= ExchangeStringUtil.dateRoll(1,curDate);
+ List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,0);
+ int count=dataResultService.dataResultOneMiCount(projectID,startDate,curDate);
+ return HttpResult.ok(count,records);
+ }else if (dateType.equals("2小时")){
+ startDate=ExchangeStringUtil.dateRoll(2,curDate);
+ List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,0);
+ int count=dataResultService.dataResultOneMiCount(projectID,startDate,curDate);
+ return HttpResult.ok(count,records);
+ }else if (dateType.equals("8小时")){
+ startDate=ExchangeStringUtil.dateRoll(8,curDate);
+ List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,1);
+ int count=dataResultService.dataResultFiveMiCount(projectID,startDate,curDate);
+ return HttpResult.ok(count,records);
+ }else if (dateType.equals("12小时")){
+ startDate=ExchangeStringUtil.dateRoll(12,curDate);
+ List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,1);
+ int count=dataResultService.dataResultFiveMiCount(projectID,startDate,curDate);
+ return HttpResult.ok(count,records);
+ }else if (dateType.equals("24小时")){
+ startDate=ExchangeStringUtil.dateRoll(24,curDate);
+ List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,2);
+ int count=dataResultService.dataResultFifteenMiCount(projectID,startDate,curDate);
+ return HttpResult.ok(count,records);
+ }else{ //1小时
+ startDate=ExchangeStringUtil.dateRoll(1,curDate);
+ List records=dataResultService.queryDataResultMi(projectID,startDate,curDate,page,limit,0);
+ int count=dataResultService.dataResultOneMiCount(projectID,startDate,curDate);
+ return HttpResult.ok(count,records);
+ }
+ }else{
+ return HttpResult.error();
+ }
+ }catch (Exception e){
+// e.printStackTrace();
+ return HttpResult.error();
+ }
+ }
+
+ @SysLogger(value="中央空调",optDesc = "能耗分析按分钟查询")
+ @PostMapping(value="/minute")
+ public HttpResult queryDataResultSec(@RequestParam(value= "projectID", required=false)String projectID,
+ @RequestParam(value= "dateType", required=false)String dateType,
+ @RequestParam(value= "curDate", required=false)String curDate,
+ @RequestParam(value="page",required=false) int page,
+ @RequestParam(value="limit",required=false) int limit) {
+
+ try{
+ SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ String startDate=""; //起始时间
+ String strDate=""; //遍历时间
+ String strDate2="";
+ curDate=curDate.substring(0,16)+":00";
+ if (dateType.equals("1分钟")){
+ startDate= ExchangeStringUtil.dateTime(1,curDate);
+ List records=dataResultService.queryDataResultSec(projectID,startDate,curDate);
+ String deviceAddr=records.get(0).getDeviceAddr();
+ String projectName=records.get(0).getProjectName();
+
+// Date date=df.parse(startDate); //顺序
+ Date date=df.parse(curDate); //倒序
+ List