Browse Source

日志管理相关代码提交

songxinlu 3 years ago
parent
commit
da0d0cff10
31 changed files with 1449 additions and 93 deletions
  1. 7 1
      pom.xml
  2. 285 0
      src/main/java/com/diagbot/aop/LogAspect.java
  3. 1 0
      src/main/java/com/diagbot/config/ResourceServerConfigurer.java
  4. 1 0
      src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
  5. 2 0
      src/main/java/com/diagbot/dto/QcCasesDTO.java
  6. 45 0
      src/main/java/com/diagbot/dto/SysLoginLogDTO.java
  7. 65 0
      src/main/java/com/diagbot/dto/SysOperationLogDTO.java
  8. 8 81
      src/main/java/com/diagbot/entity/SysHospitalSet.java
  9. 91 0
      src/main/java/com/diagbot/entity/SysLoginLog.java
  10. 121 0
      src/main/java/com/diagbot/entity/SysOperationLog.java
  11. 30 0
      src/main/java/com/diagbot/facade/LogManagementFacade.java
  12. 20 0
      src/main/java/com/diagbot/facade/LoginLogFacade.java
  13. 29 0
      src/main/java/com/diagbot/facade/OperationLogFacade.java
  14. 4 0
      src/main/java/com/diagbot/facade/QcCasesFacade.java
  15. 18 0
      src/main/java/com/diagbot/facade/SysHospitalSetFacade.java
  16. 3 0
      src/main/java/com/diagbot/mapper/QcCasesMapper.java
  17. 23 0
      src/main/java/com/diagbot/mapper/SysLoginLogMapper.java
  18. 21 0
      src/main/java/com/diagbot/mapper/SysOperationLogMapper.java
  19. 16 0
      src/main/java/com/diagbot/service/SysLoginLogService.java
  20. 16 0
      src/main/java/com/diagbot/service/SysOperationLogService.java
  21. 20 0
      src/main/java/com/diagbot/service/impl/SysLoginLogServiceImpl.java
  22. 20 0
      src/main/java/com/diagbot/service/impl/SysOperationLogServiceImpl.java
  23. 50 0
      src/main/java/com/diagbot/util/AddressUtils.java
  24. 179 0
      src/main/java/com/diagbot/util/HttpUtils.java
  25. 155 0
      src/main/java/com/diagbot/util/IpUtils.java
  26. 32 0
      src/main/java/com/diagbot/vo/SysLoginLogVO.java
  27. 50 0
      src/main/java/com/diagbot/vo/SysOperationLogVO.java
  28. 16 11
      src/main/java/com/diagbot/web/LogManagementController.java
  29. 19 0
      src/main/resources/mapper/QcCasesMapper.xml
  30. 45 0
      src/main/resources/mapper/SysLoginLogMapper.xml
  31. 57 0
      src/main/resources/mapper/SysOperationLogMapper.xml

+ 7 - 1
pom.xml

@@ -38,6 +38,7 @@
         <easypoi.version>4.2.0</easypoi.version>
         <patchca.version>1.1.2</patchca.version>
         <hutool.version>5.0.7</hutool.version>
+        <bitwalker.version>1.21</bitwalker.version>
         <docker-maven-plugin.version>1.2.1</docker-maven-plugin.version>
         <docker.image.prefix>192.168.2.121:5000/diagbotcloud</docker.image.prefix>
         <registryUrl>http://192.168.2.121:5000/repository/diagbotcloud/</registryUrl>
@@ -224,7 +225,12 @@
             <version>6.2.0.jre8</version>
             <scope>runtime</scope>
         </dependency>
-
+        <!-- 解析客户端操作系统、浏览器等 -->
+        <dependency>
+            <groupId>eu.bitwalker</groupId>
+            <artifactId>UserAgentUtils</artifactId>
+            <version>${bitwalker.version}</version>
+        </dependency>
     </dependencies>
 
     <!-- 私有仓库 -->

+ 285 - 0
src/main/java/com/diagbot/aop/LogAspect.java

@@ -0,0 +1,285 @@
+package com.diagbot.aop;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.diagbot.dto.QcCasesDTO;
+import com.diagbot.dto.SysLoginLogDTO;
+import com.diagbot.dto.SysOperationLogDTO;
+import com.diagbot.entity.SysHospitalSet;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.facade.LoginLogFacade;
+import com.diagbot.facade.OperationLogFacade;
+import com.diagbot.facade.SysHospitalSetFacade;
+import com.diagbot.util.AddressUtils;
+import com.diagbot.util.HttpUtils;
+import com.diagbot.util.IpUtils;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.StringUtil;
+import com.diagbot.util.SysUserUtils;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import eu.bitwalker.useragentutils.UserAgent;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.stereotype.Component;
+import sun.plugin.cache.OldCacheEntry;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:日志记录处理
+ * @author: songxl
+ * @time: 2022/5/09 14:28
+ */
+
+@Aspect
+@Component
+public class LogAspect {
+    @Autowired
+    LoginLogFacade loginLogFacade;
+    @Autowired
+    SysHospitalSetFacade sysHospitalSetFacade;
+    @Autowired
+    OperationLogFacade operationLogFacade;
+
+    // 操作配置织入点
+    @Pointcut("execution(public * com.diagbot.web.*.*(..))" +
+            "&& !execution(public * com.diagbot.web.SysUserController.getJwt(..))"+
+            "&& !execution(public * com.diagbot.web.SysUserController.getCaptcha(..))"+
+            "&& !execution(public * com.diagbot.web.SysUserController.getJwtNoPass(..))"+
+            "&& !execution(public * com.diagbot.web.SysUserController.getHospitalMark(..))"+
+            "&& !execution(public * com.diagbot.web.SysUserController.midifyPassword(..))"
+    )
+    public void operPointCut() {
+    }
+
+    // 登录织入点
+    @Pointcut("execution(public * com.diagbot.web.SysUserController.getJwt(..))")
+    public void loginAfterReturning() {
+    }
+
+
+    /**
+     * 登录成功之后执行
+     *
+     * @param
+     */
+    @AfterReturning(pointcut = "loginAfterReturning()", returning = "jsonResult")
+    public void loginAfterReturning(JoinPoint joinPoint, Object jsonResult) {
+        loginLogHandle(joinPoint, jsonResult);
+    }
+
+    /**
+     * 操作之前执行
+     *
+     * @param
+     */
+    @Before(value = "operPointCut()")
+    public void operPointCut(JoinPoint joinPoint) {
+        operationLogHandler(joinPoint);
+    }
+
+    private void operationLogHandler(JoinPoint joinPoint) {
+        try {
+            //1.去sys_hospital_set表中拿所有需要进行操作日志记录的url
+            List<SysHospitalSet> hospitalSets = sysHospitalSetFacade
+                    .getHospitalSetByRemark(Long.parseLong(SysUserUtils.getCurrentHospitalID()),"operationLog");
+            if(ListUtil.isNotEmpty(hospitalSets)){
+                havingOperation(hospitalSets,HttpUtils.getHttpServletRequest(),joinPoint);
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    private void havingOperation(List<SysHospitalSet> hospitalSets, HttpServletRequest httpServletRequest,JoinPoint joinPoint) {
+        //1.判断该请求是否需要操作日志记录
+        hospitalSets.stream().forEach(hospitalSet->{
+            if(matchers(hospitalSet.getCode(),httpServletRequest)){
+                String params = getControllerMethodDescription(joinPoint);
+                try {
+                    String old = getOldOperation(HttpUtils.getHttpServletRequest().getRequestURI(),params);
+                    //对比
+                    comparePara(old,params);
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        });
+    }
+
+    private void comparePara(String old, String params) {
+        //对比新旧数据变化
+
+        //拼接操作结果
+    }
+
+    private String getOldOperation(String requestURI,String params) {
+        String out = "";
+        switch (requestURI){
+            case "/qc/cases/saveQcCases"://修改模块分值
+                if(StringUtil.isNotEmpty(params)){
+                    //通过id获取模块名称以及目前分值
+                    JSONArray paramsArr = JSONArray.parseArray(params);
+                    QcCasesDTO old = operationLogFacade.getQcCasesById(paramsArr.getJSONObject(0).getString("id"));
+                    out = old.toString();
+                }
+                break;
+        }
+        return out;
+    }
+
+
+    /**
+     * 返回信息相同日志代码复用
+     *
+     * @param joinPoint
+     * @Return com.diagbot.dto.SysOperationLogDTO
+     */
+    public SysOperationLogDTO multiplexing(JoinPoint joinPoint) {
+
+        SysOperationLogDTO operationLog = new SysOperationLogDTO();
+        Date date = new Date();
+        operationLog.setOperationDate(date);
+        operationLog.setGmtCreate(date);
+        operationLog.setOperationId(SysUserUtils.getCurrentPrincipleID() == null ? 0l : Long.parseLong(SysUserUtils.getCurrentPrincipleID()));
+        operationLog.setOperationName(SysUserUtils.getCurrentPrinciple());
+        String ip = HttpUtils.getIpAddress();
+        if (IpUtils.isIPv4LiteralAddress(ip)) {
+            operationLog.setOperationIp(ip);
+        } else {
+            operationLog.setRemark("[非ipv4地址]:" + ip);
+        }
+
+        // 设置方法名称
+        String className = joinPoint.getTarget().getClass().getName();
+        String methodName = joinPoint.getSignature().getName();
+        operationLog.setOperationMethod(className + "." + methodName + "()");
+        // 设置请求方式
+        operationLog.setOperationWay(HttpUtils.getHttpServletRequest().getMethod());
+        operationLog.setOperationUrl(HttpUtils.getHttpServletRequest().getRequestURI());
+        // 处理设置注解上的参数
+        try {
+            String params = getControllerMethodDescription(joinPoint);
+            if (StringUtils.isNotBlank(params)) {
+                operationLog.setOperationParam(params);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return operationLog;
+    }
+
+    /**
+     * @Description:获取请求的参数
+     * @Param: [joinPoint, logInformation]
+     * @return: void
+     * @Author: cy
+     * @Date: 2021/9/2
+     */
+    private String getControllerMethodDescription(JoinPoint joinPoint) {
+        Map<String, String[]> map = HttpUtils.getHttpServletRequest().getParameterMap();
+        if (MapUtils.isNotEmpty(map)) {
+            String params = JSONObject.toJSONString(map);
+            return params;
+        } else {
+            Object args = joinPoint.getArgs();
+            if (null != args) {
+                String params = argsArrayToString(joinPoint.getArgs());
+                return params;
+            }
+        }
+        return "";
+    }
+
+
+    /**
+     * 参数拼装
+     *
+     * @Description:
+     * @Param: [paramsArray]
+     * @return: java.lang.String
+     * @Author: cy
+     * @Date: 2021/9/2
+     */
+    private String argsArrayToString(Object[] paramsArray) {
+        String params = "";
+        if (paramsArray != null && paramsArray.length > 0) {
+            for (int i = 0; i < paramsArray.length; i++) {
+                if (null != (paramsArray[i])) {
+                    Object jsonObj = JSONObject.toJSONString(paramsArray[i]);
+                    params += jsonObj.toString() + " ";
+                }
+            }
+        }
+        return params.trim();
+    }
+
+    public void loginLogHandle(JoinPoint joinPoint, Object jsonResult) {
+        // 返回参数
+        if (null != jsonResult) {
+            ObjectMapper objectWriter = new ObjectMapper();
+            try {
+                String strResult = objectWriter.writeValueAsString(jsonResult);
+                JSONObject JSONResult = JSONObject.parseObject(strResult);
+                SysLoginLogDTO loginLog = new SysLoginLogDTO();
+                Date date = new Date();
+                loginLog.setLoginDate(date);
+                loginLog.setGmtCreate(date);
+                String token = JSONResult.getJSONObject("data").get("accessToken").toString();
+                DecodedJWT jwt = decodedJWT(token);
+                Map<String, Claim> claims = jwt.getClaims();
+                Claim claimUID = claims.get("user_id");
+                Claim claimUName = claims.get("user_name");
+                loginLog.setLoginId(claimUID.asLong());
+                loginLog.setLoginName(claimUName.asString());
+                loginLog.setLoginIp(HttpUtils.getIpAddress() == null ? "" : HttpUtils.getIpAddress());
+                UserAgent userAgent = UserAgent.parseUserAgentString(HttpUtils.getHttpServletRequest().getHeader("User-Agent"));
+                loginLog.setLoginAddress(AddressUtils.getRealAddressByIP(loginLog.getLoginIp()));
+                // 获取客户端浏览器
+                String browser = userAgent.getBrowser().getName();
+                loginLog.setLoginBrowser(browser);
+
+                //插入登录日志
+                loginLogFacade.getBaseMapper().addLoginLog(loginLog);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public static DecodedJWT decodedJWT(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt;
+        } catch (JWTDecodeException var2) {
+            var2.printStackTrace();
+            throw new CommonException(CommonErrorCode.ANALYZER_TOKEN_FAIL);
+        }
+    }
+
+
+    private boolean matchers(String url,HttpServletRequest request) {
+        AntPathRequestMatcher matcher = new AntPathRequestMatcher(url);
+        if (matcher.matches(request)) {
+            return true;
+        }
+        return false;
+    }
+}
+
+

+ 1 - 0
src/main/java/com/diagbot/config/ResourceServerConfigurer.java

@@ -295,6 +295,7 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                 .antMatchers("/consoleByDoctor/**").permitAll()
                 .antMatchers("/qc/getDoctorDetail/**").permitAll()
                 .antMatchers("/h5/statistics/**").permitAll()
+                .antMatchers("/logManage/**").permitAll()
                 .antMatchers("/**").authenticated();
         //                .antMatchers("/**").permitAll();
     }

+ 1 - 0
src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java

@@ -372,6 +372,7 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/consoleByDoctor/**", request)
                 || matchers("/qc/getDoctorDetail/**", request)
                 || matchers("/h5/statistics/**", request)
+                || matchers("/logManage/**", request)
                 || matchers("/", request)) {
             return true;
         }

+ 2 - 0
src/main/java/com/diagbot/dto/QcCasesDTO.java

@@ -2,6 +2,7 @@ package com.diagbot.dto;
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.ToString;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -14,6 +15,7 @@ import java.util.Date;
  */
 @Getter
 @Setter
+@ToString
 public class QcCasesDTO {
     /**
      * 主键

+ 45 - 0
src/main/java/com/diagbot/dto/SysLoginLogDTO.java

@@ -0,0 +1,45 @@
+package com.diagbot.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * @Description:
+ * @author: songxl
+ * @time: 2022/5/09 14:28
+ */
+@Getter
+@Setter
+@ApiModel("系统登录日志列表页-接口出参")
+public class SysLoginLogDTO implements Serializable {
+
+    private static final long serialVersionUID = 6123084820573676056L;
+
+
+    @ApiModelProperty(value = "登录用户ID")
+    private Long loginId;
+
+    @ApiModelProperty(value = "登录用户名")
+    private String loginName;
+
+    @ApiModelProperty(value = "登录日期")
+    private Date loginDate;
+
+    @ApiModelProperty(value = "登录ip")
+    private String loginIp;
+
+    @ApiModelProperty(value = "地区")
+    private String loginAddress;
+
+    @ApiModelProperty(value = "浏览器")
+    private String loginBrowser;
+
+    @ApiModelProperty(value = "创建日期")
+    private Date GmtCreate;
+}

+ 65 - 0
src/main/java/com/diagbot/dto/SysOperationLogDTO.java

@@ -0,0 +1,65 @@
+package com.diagbot.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * @Description:
+ * @author: songxl
+ * @time: 2022/5/09 14:28
+ */
+@Getter
+@Setter
+@ApiModel("系统登录日志列表页-接口出参")
+public class SysOperationLogDTO implements Serializable {
+
+    private static final long serialVersionUID = -2781154978311006059L;
+
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @ApiModelProperty(value = "操作人用户ID")
+    private Long operationId;
+
+    @ApiModelProperty(value = "操作人用户名")
+    private String operationName;
+
+    @ApiModelProperty(value = "操作日期")
+    private Date operationDate;
+
+    @ApiModelProperty(value = "操作记录")
+    private String operationRecord;
+
+    @ApiModelProperty(value = "ip地址")
+    private String operationIp;
+
+    @ApiModelProperty(value = "操作地址")
+    private String operationAddress;
+
+    @ApiModelProperty(value = "操作方法")
+    private String operationMethod;
+
+    @ApiModelProperty(value = "操作请求方式")
+    private String operationWay;
+
+    @ApiModelProperty(value = "操作url")
+    private String operationUrl;
+
+    @ApiModelProperty(value = "操作参数")
+    private String operationParam;
+
+    @ApiModelProperty(value = "返回参数")
+    private String jsonResult;
+
+    @ApiModelProperty(value = "记录创建时间")
+    private Date gmtCreate;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+}

+ 8 - 81
src/main/java/com/diagbot/entity/SysHospitalSet.java

@@ -2,8 +2,11 @@ package com.diagbot.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * <p>
@@ -13,6 +16,8 @@ import java.io.Serializable;
  * @author zhoutg
  * @since 2020-07-06
  */
+@Getter
+@Setter
 public class SysHospitalSet implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -31,12 +36,12 @@ public class SysHospitalSet implements Serializable {
     /**
      * 记录创建时间
      */
-    private LocalDateTime gmtCreate;
+    private Date gmtCreate;
 
     /**
      * 记录修改时间,如果时间是1970年则表示纪录未修改
      */
-    private LocalDateTime gmtModified;
+    private Date gmtModified;
 
     /**
      * 创建人,0表示无创建人值
@@ -70,84 +75,6 @@ public class SysHospitalSet implements Serializable {
      */
     private String remark;
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-    public String getIsDeleted() {
-        return isDeleted;
-    }
-
-    public void setIsDeleted(String isDeleted) {
-        this.isDeleted = isDeleted;
-    }
-    public LocalDateTime getGmtCreate() {
-        return gmtCreate;
-    }
-
-    public void setGmtCreate(LocalDateTime gmtCreate) {
-        this.gmtCreate = gmtCreate;
-    }
-    public LocalDateTime getGmtModified() {
-        return gmtModified;
-    }
-
-    public void setGmtModified(LocalDateTime gmtModified) {
-        this.gmtModified = gmtModified;
-    }
-    public String getCreator() {
-        return creator;
-    }
-
-    public void setCreator(String creator) {
-        this.creator = creator;
-    }
-    public String getModifier() {
-        return modifier;
-    }
-
-    public void setModifier(String modifier) {
-        this.modifier = modifier;
-    }
-    public Long getHospitalId() {
-        return hospitalId;
-    }
-
-    public void setHospitalId(Long hospitalId) {
-        this.hospitalId = hospitalId;
-    }
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-    public String getRemark() {
-        return remark;
-    }
-
-    public void setRemark(String remark) {
-        this.remark = remark;
-    }
-
     @Override
     public String toString() {
         return "SysHospitalSet{" +

+ 91 - 0
src/main/java/com/diagbot/entity/SysLoginLog.java

@@ -0,0 +1,91 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统登录日志表
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+@Getter
+@Setter
+public class SysLoginLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 登录用户ID
+     */
+    private Long loginId;
+
+    /**
+     * 登录用户名
+     */
+    private String loginName;
+
+    /**
+     * 登录日期
+     */
+    private Date loginDate;
+
+    /**
+     * 登录ip
+     */
+    private Long loginIp;
+
+    /**
+     * 登录ip地址
+     */
+    private String loginAddress;
+
+    /**
+     * 浏览器
+     */
+    private String loginBrowser;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 121 - 0
src/main/java/com/diagbot/entity/SysOperationLog.java

@@ -0,0 +1,121 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统操作日志表
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+@Getter
+@Setter
+public class SysOperationLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 操作人用户ID
+     */
+    private Long operationId;
+
+    /**
+     * 操作人用户名
+     */
+    private String operationName;
+
+    /**
+     * 操作日期
+     */
+    private Date operationDate;
+
+    /**
+     * 操作记录
+     */
+    private String operationRecord;
+
+    /**
+     * ip地址
+     */
+    private Long operationIp;
+
+    /**
+     * 操作地址
+     */
+    private String operationAddress;
+
+    /**
+     * 操作方法
+     */
+    private String operationMethod;
+
+    /**
+     * 操作请求方式
+     */
+    private String operationWay;
+
+    /**
+     * 操作url
+     */
+    private String operationUrl;
+
+    /**
+     * 操作参数
+     */
+    private String operationParam;
+
+    /**
+     * 返回参数
+     */
+    private String jsonResult;
+
+    /**
+     * 是否归档(0:未归档,1:已归档)
+     */
+    private String isPlacefile;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 30 - 0
src/main/java/com/diagbot/facade/LogManagementFacade.java

@@ -1,5 +1,11 @@
 package com.diagbot.facade;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.SysLoginLogDTO;
+import com.diagbot.dto.SysOperationLogDTO;
+import com.diagbot.vo.SysLoginLogVO;
+import com.diagbot.vo.SysOperationLogVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 /**
@@ -9,4 +15,28 @@ import org.springframework.stereotype.Component;
  */
 @Component
 public class LogManagementFacade {
+    @Autowired
+    private LoginLogFacade loginLogFacade;
+    @Autowired
+    private OperationLogFacade operationLogFacade;
+
+    /**
+     *查看登录日志
+     *
+     * @param sysLoginLogVO
+     * @Return com.baomidou.mybatisplus.core.metadata.IPage<com.diagbot.dto.SysLoginLogDTO>
+     */
+    public IPage<SysLoginLogDTO> getLoginLog(SysLoginLogVO sysLoginLogVO) {
+        return loginLogFacade.getLoginLog(sysLoginLogVO);
+    }
+
+    /**
+     *查看操作日志
+     *
+     * @param sysOperationLogVO
+     * @Return com.baomidou.mybatisplus.core.metadata.IPage<com.diagbot.dto.SysOperationLogDTO>
+     */
+    public IPage<SysOperationLogDTO> getOperationLog(SysOperationLogVO sysOperationLogVO) {
+        return operationLogFacade.getOperationLog(sysOperationLogVO);
+    }
 }

+ 20 - 0
src/main/java/com/diagbot/facade/LoginLogFacade.java

@@ -0,0 +1,20 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.SysLoginLogDTO;
+import com.diagbot.service.impl.SysLoginLogServiceImpl;
+import com.diagbot.vo.SysLoginLogVO;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:登录日志处理类
+ * @author: songxl
+ * @time: 2022/5/9 14:33
+ */
+@Component
+public class LoginLogFacade extends SysLoginLogServiceImpl {
+
+    public IPage<SysLoginLogDTO> getLoginLog(SysLoginLogVO sysLoginLogVO) {
+        return this.getBaseMapper().getLoginLog(sysLoginLogVO);
+    }
+}

+ 29 - 0
src/main/java/com/diagbot/facade/OperationLogFacade.java

@@ -0,0 +1,29 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.QcCasesDTO;
+import com.diagbot.dto.SysOperationLogDTO;
+import com.diagbot.service.impl.SysOperationLogServiceImpl;
+import com.diagbot.util.SysUserUtils;
+import com.diagbot.vo.SysOperationLogVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:操作日志处理类
+ * @author: songxl
+ * @time: 2022/5/10 9:49
+ */
+@Component
+public class OperationLogFacade extends SysOperationLogServiceImpl {
+    @Autowired
+    QcCasesFacade qcCasesFacade;
+
+    public IPage<SysOperationLogDTO> getOperationLog(SysOperationLogVO sysOperationLogVO) {
+        return this.getBaseMapper().getOperationLog(sysOperationLogVO);
+    }
+
+    public QcCasesDTO getQcCasesById(String id) {
+        return qcCasesFacade.getQcCasesById(id, SysUserUtils.getCurrentHospitalID());
+    }
+}

+ 4 - 0
src/main/java/com/diagbot/facade/QcCasesFacade.java

@@ -85,4 +85,8 @@ public class QcCasesFacade extends QcCasesServiceImpl {
         dataNew = BeanUtil.listCopyTo(data, QcCasesAllDTO.class);
         return dataNew;
     }
+
+    public QcCasesDTO getQcCasesById(String id, String currentHospitalID) {
+        return this.getBaseMapper().getQcCasesById(id,currentHospitalID);
+    }
 }

+ 18 - 0
src/main/java/com/diagbot/facade/SysHospitalSetFacade.java

@@ -5,8 +5,11 @@ import com.diagbot.entity.SysHospitalSet;
 import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.service.impl.SysHospitalSetServiceImpl;
 import com.diagbot.util.StringUtil;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
+
 /**
  * @Description:
  * @author: gaodm
@@ -44,4 +47,19 @@ public class SysHospitalSetFacade extends SysHospitalSetServiceImpl {
         }
         return res;
     }
+
+    /**
+     *获取remark相同的一些列配置
+     *
+     * @param hospitalId
+     * @param remark
+     * @Return java.util.List<com.diagbot.entity.SysHospitalSet>
+     */
+    @Cacheable(value = "cache", key = "'operationLog:hospId_'+#hospitalId")
+    public List<SysHospitalSet> getHospitalSetByRemark(Long hospitalId, String remark) {
+        return this.list(new QueryWrapper<SysHospitalSet>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("hospital_id", hospitalId)
+                .eq("remark", remark));
+    }
 }

+ 3 - 0
src/main/java/com/diagbot/mapper/QcCasesMapper.java

@@ -5,6 +5,7 @@ import com.diagbot.dto.NumDTO;
 import com.diagbot.dto.QcCasesDTO;
 import com.diagbot.entity.QcCases;
 import com.diagbot.vo.QcCasesQueryVO;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -25,4 +26,6 @@ public interface QcCasesMapper extends BaseMapper<QcCases> {
      * @return
      */
     List<NumDTO> entryGroupByCase();
+
+    QcCasesDTO getQcCasesById(@Param("id") String id, @Param("hospitalId")String hospitalId);
 }

+ 23 - 0
src/main/java/com/diagbot/mapper/SysLoginLogMapper.java

@@ -0,0 +1,23 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.SysLoginLogDTO;
+import com.diagbot.entity.SysLoginLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.vo.SysLoginLogVO;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 系统登录日志表 Mapper 接口
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+public interface SysLoginLogMapper extends BaseMapper<SysLoginLog> {
+
+    IPage<SysLoginLogDTO> getLoginLog(@Param("sysLoginLogVO") SysLoginLogVO sysLoginLogVO);
+
+    void addLoginLog(SysLoginLogDTO loginLog);
+}

+ 21 - 0
src/main/java/com/diagbot/mapper/SysOperationLogMapper.java

@@ -0,0 +1,21 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.SysOperationLogDTO;
+import com.diagbot.entity.SysOperationLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.vo.SysOperationLogVO;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 系统操作日志表 Mapper 接口
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+public interface SysOperationLogMapper extends BaseMapper<SysOperationLog> {
+
+    IPage<SysOperationLogDTO> getOperationLog(@Param("sysOperationLogVO") SysOperationLogVO sysOperationLogVO);
+}

+ 16 - 0
src/main/java/com/diagbot/service/SysLoginLogService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.SysLoginLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 系统登录日志表 服务类
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+public interface SysLoginLogService extends IService<SysLoginLog> {
+
+}

+ 16 - 0
src/main/java/com/diagbot/service/SysOperationLogService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.SysOperationLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 系统操作日志表 服务类
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+public interface SysOperationLogService extends IService<SysOperationLog> {
+
+}

+ 20 - 0
src/main/java/com/diagbot/service/impl/SysLoginLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.SysLoginLog;
+import com.diagbot.mapper.SysLoginLogMapper;
+import com.diagbot.service.SysLoginLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统登录日志表 服务实现类
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+@Service
+public class SysLoginLogServiceImpl extends ServiceImpl<SysLoginLogMapper, SysLoginLog> implements SysLoginLogService {
+
+}

+ 20 - 0
src/main/java/com/diagbot/service/impl/SysOperationLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.SysOperationLog;
+import com.diagbot.mapper.SysOperationLogMapper;
+import com.diagbot.service.SysOperationLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 系统操作日志表 服务实现类
+ * </p>
+ *
+ * @author zhanghang
+ * @since 2022-05-09
+ */
+@Service
+public class SysOperationLogServiceImpl extends ServiceImpl<SysOperationLogMapper, SysOperationLog> implements SysOperationLogService {
+
+}

+ 50 - 0
src/main/java/com/diagbot/util/AddressUtils.java

@@ -0,0 +1,50 @@
+package com.diagbot.util;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @Description:获取地址类
+ * @Author: cy
+ * @time: 2021/9/5 16:59
+ */
+
+public class AddressUtils {
+    private static final Logger log = LoggerFactory.getLogger(AddressUtils.class);
+
+    // IP地址查询
+    public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";
+
+    // 未知地址
+    public static final String UNKNOWN = "未知地址";
+
+    public static String getRealAddressByIP(String ip) {
+        String address = UNKNOWN;
+        if(StringUtils.isBlank(ip)){
+            return UNKNOWN;
+        }
+        // 内网不查询
+        if (IpUtils.internalIp(ip)) {
+            return "内网IP";
+        }
+        try {
+            String rspStr = HttpUtils.sendPost(IP_URL, "ip=" + ip + "&json=true");
+            if (StringUtil.isNotBlank(rspStr)) {
+                log.error("获取地理位置异常 {}", ip);
+                return UNKNOWN;
+            }
+            JSONObject obj = JSONObject.parseObject(rspStr);
+            String region = obj.getString("pro");
+            String city = obj.getString("city");
+            return String.format("%s %s", region, city);
+        } catch (Exception e) {
+            log.error("获取地理位置异常 {}", e);
+        }
+
+        return address;
+    }
+}
+
+

+ 179 - 0
src/main/java/com/diagbot/util/HttpUtils.java

@@ -0,0 +1,179 @@
+package com.diagbot.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.ConnectException;
+import java.net.SocketTimeoutException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Enumeration;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @Description: http请求功能工具类
+ * @author: gaodm
+ * @time: 2018/8/3 17:45
+ */
+@Slf4j
+public class HttpUtils {
+
+    /**
+     * 获取当前请求的HttpServletRequest实例
+     *
+     * @return
+     */
+    public static HttpServletRequest getHttpServletRequest() {
+        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+    }
+
+    /**
+     * 获取当前请求的请求头Map实例
+     *
+     * @return
+     */
+    public static Map<String, String> getHeaders() {
+        return getHeaders(getHttpServletRequest());
+    }
+
+    /**
+     * 获取当前请求的请求头Map实例中,键为key的值
+     *
+     * @param key
+     * @return
+     */
+    public static String getHeader(String key) {
+        return getHttpServletRequest().getHeader(key);
+    }
+
+    /**
+     * 获取当前请求的请求客户端的真实ip地址
+     *
+     * @return
+     */
+    public static String getIpAddress() {
+        // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
+        return getIpAddress(getHttpServletRequest());
+    }
+
+    /**
+     * 根据HttpServletRequest获取请求头Map实例
+     *
+     * @param request
+     * @return
+     */
+    public static Map<String, String> getHeaders(HttpServletRequest request) {
+        Map<String, String> map = new LinkedHashMap<>();
+        Enumeration<String> enumeration = request.getHeaderNames();
+        while (enumeration.hasMoreElements()) {
+            String key = enumeration.nextElement();
+            String value = request.getHeader(key);
+            map.put(key, value);
+        }
+        return map;
+    }
+
+    /**
+     * 根据HttpServletRequest获取请求客户端的真实ip地址
+     *
+     * @param request
+     * @return
+     */
+    public static String getIpAddress(HttpServletRequest request) {
+        // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
+        String ip = request.getHeader("X-Forwarded-For");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("Proxy-Client-IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTP_CLIENT_IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("X-Real-IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getRemoteAddr();
+            }
+        } else if (ip.length() > 15) {
+            String[] ips = ip.split(",");
+            for (int index = 0; index < ips.length; index++) {
+                String strIp = (String) ips[index];
+                if (!("unknown".equalsIgnoreCase(strIp))) {
+                    ip = strIp;
+                    break;
+                }
+            }
+        }
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
+    }
+
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
+     * @param url   发送请求的 URL
+     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @return 所代表远程资源的响应结果
+     */
+    public static String sendPost(String url, String param) {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+        try {
+            String urlNameString = url;
+            log.debug("sendPost - {}", urlNameString);
+            URL realUrl = new URL(urlNameString);
+            URLConnection conn = realUrl.openConnection();
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("contentType", "utf-8");
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            out = new PrintWriter(conn.getOutputStream());
+            out.print(param);
+            out.flush();
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+            log.debug("recv - {}", result);
+        } catch (ConnectException e) {
+            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+        } catch (SocketTimeoutException e) {
+            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+        } catch (IOException e) {
+            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+        } catch (Exception e) {
+            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+        } finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) {
+                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
+            }
+        }
+        return result.toString();
+    }
+
+}

+ 155 - 0
src/main/java/com/diagbot/util/IpUtils.java

@@ -0,0 +1,155 @@
+package com.diagbot.util;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * @Description:获取IP方法
+ * @Author: cy
+ * @time: 2021/9/5 17:00
+ */
+
+public class IpUtils {
+
+    private static final int INADDR4SZ = 4;
+    private static final int INADDR16SZ = 16;
+    private static final int INT16SZ = 2;
+
+    public static String getIpAddr(HttpServletRequest request) {
+        if (request == null) {
+            return "unknown";
+        }
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("X-Forwarded-For");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("X-Real-IP");
+        }
+
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
+    }
+
+    public static boolean internalIp(String ip) {
+        byte[] addr = textToNumericFormatV4(ip);
+        return internalIp(addr) || "127.0.0.1".equals(ip);
+    }
+
+    private static boolean internalIp(byte[] addr) {
+        if (null == addr || addr.length < 2) {
+            return true;
+        }
+        final byte b0 = addr[0];
+        final byte b1 = addr[1];
+        // 10.x.x.x/8
+        final byte SECTION_1 = 0x0A;
+        // 172.16.x.x/12
+        final byte SECTION_2 = (byte) 0xAC;
+        final byte SECTION_3 = (byte) 0x10;
+        final byte SECTION_4 = (byte) 0x1F;
+        // 192.168.x.x/16
+        final byte SECTION_5 = (byte) 0xC0;
+        final byte SECTION_6 = (byte) 0xA8;
+        switch (b0) {
+            case SECTION_1:
+                return true;
+            case SECTION_2:
+                if (b1 >= SECTION_3 && b1 <= SECTION_4) {
+                    return true;
+                }
+            case SECTION_5:
+                switch (b1) {
+                    case SECTION_6:
+                        return true;
+                }
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * 将IPv4地址转换成字节
+     *
+     * @param src IPv4地址
+     * @return byte 字节
+     */
+    public static byte[] textToNumericFormatV4(String src)
+    {
+        byte[] res = new byte[INADDR4SZ];
+
+        long tmpValue = 0;
+        int currByte = 0;
+        boolean newOctet = true;
+
+        int len = src.length();
+        if (len == 0 || len > 15) {
+            return null;
+        }
+
+        for (int i = 0; i < len; i++) {
+            char c = src.charAt(i);
+            if (c == '.') {
+                if (newOctet || tmpValue < 0 || tmpValue > 0xff || currByte == 3) {
+                    return null;
+                }
+                res[currByte++] = (byte) (tmpValue & 0xff);
+                tmpValue = 0;
+                newOctet = true;
+            } else {
+                int digit = Character.digit(c, 10);
+                if (digit < 0) {
+                    return null;
+                }
+                tmpValue *= 10;
+                tmpValue += digit;
+                newOctet = false;
+            }
+        }
+        if (newOctet || tmpValue < 0 || tmpValue >= (1L << ((4 - currByte) * 8))) {
+            return null;
+        }
+        switch (currByte) {
+            case 0:
+                res[0] = (byte) ((tmpValue >> 24) & 0xff);
+            case 1:
+                res[1] = (byte) ((tmpValue >> 16) & 0xff);
+            case 2:
+                res[2] = (byte) ((tmpValue >>  8) & 0xff);
+            case 3:
+                res[3] = (byte) ((tmpValue >>  0) & 0xff);
+        }
+        return res;
+    }
+
+    public static String getHostIp() {
+        try {
+            return InetAddress.getLocalHost().getHostAddress();
+        } catch (UnknownHostException e) {
+        }
+        return "127.0.0.1";
+    }
+
+    public static String getHostName() {
+        try {
+            return InetAddress.getLocalHost().getHostName();
+        } catch (UnknownHostException e) {
+        }
+        return "未知";
+    }
+
+    public static boolean isIPv4LiteralAddress(String src) {
+        return textToNumericFormatV4(src) != null;
+    }
+
+}

+ 32 - 0
src/main/java/com/diagbot/vo/SysLoginLogVO.java

@@ -0,0 +1,32 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+
+
+/**
+ * @Description:
+ * @author: songxl
+ * @time: 2022/5/09 14:28
+ */
+@Getter
+@Setter
+@ApiModel("系统登录日志列表页-接口入参")
+public class SysLoginLogVO extends Page implements Serializable {
+
+    private static final long serialVersionUID = -7393452900176171499L;
+
+    @ApiModelProperty(value = "登录用户名")
+    private String loginName;
+
+
+    @ApiModelProperty(value = "ip地址")
+    private String loginIp;
+
+}

+ 50 - 0
src/main/java/com/diagbot/vo/SysOperationLogVO.java

@@ -0,0 +1,50 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+
+
+/**
+ * @Description:
+ * @author: songxl
+ * @time: 2022/5/09 14:28
+ */
+@Getter
+@Setter
+@ApiModel("操作日志列表页-接口入参")
+public class SysOperationLogVO extends Page implements Serializable {
+
+    private static final long serialVersionUID = -6958100906151636839L;
+
+    /**
+     * 操作用户
+     */
+    @ApiModelProperty(value = "操作用户")
+    String operationName;
+    /**
+     * 操作开始时间
+     */
+    @ApiModelProperty(value = "操作开始时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd  HH:mm:ss")
+    String startDate;
+
+    /**
+     * 操作结束时间
+     */
+    @ApiModelProperty(value = "操作结束时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd  HH:mm:ss")
+    String endDate;
+
+    /**
+     * 是否归档(0:未归档,1:已归档)
+     */
+    @ApiModelProperty(value = "是否归档(0:未归档,1:已归档)")
+    private String isPlacefile = "0";
+
+}

+ 16 - 11
src/main/java/com/diagbot/web/LogManagementController.java

@@ -1,7 +1,12 @@
 package com.diagbot.web;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.dto.RespDTO;
+import com.diagbot.dto.SysLoginLogDTO;
+import com.diagbot.dto.SysOperationLogDTO;
 import com.diagbot.facade.LogManagementFacade;
+import com.diagbot.vo.SysLoginLogVO;
+import com.diagbot.vo.SysOperationLogVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,17 +29,17 @@ public class LogManagementController {
     private LogManagementFacade logManagementFacade;
 
 
-//    @ApiOperation(value = "查看登录日志[by:songxl]")
-//    @PostMapping("/loginLogPage")
-//    public RespDTO<IPage<LoginLogDTO>> loginLogPage(@RequestBody GetLoginLogVO getLoginLogVO) {
-//        return RespDTO.onSuc(logManagementFacade.getLoginLog(getLoginLogVO));
-//    }
-//
-//    @ApiOperation(value = "查看操作日志[by:songxl]")
-//    @PostMapping("/operationLogPage")
-//    public RespDTO<IPage<OperationLogDTO>> operationLogPage(@RequestBody GetOperationLogVO getOperationLogVO) {
-//        return RespDTO.onSuc(logManagementFacade.getOperationLog(getOperationLogVO));
-//    }
+    @ApiOperation(value = "查看登录日志[by:songxl]")
+    @PostMapping("/loginLogPage")
+    public RespDTO<IPage<SysLoginLogDTO>> loginLogPage(@RequestBody SysLoginLogVO sysLoginLogVO) {
+        return RespDTO.onSuc(logManagementFacade.getLoginLog(sysLoginLogVO));
+    }
+
+    @ApiOperation(value = "查看操作日志[by:songxl]")
+    @PostMapping("/operationLogPage")
+    public RespDTO<IPage<SysOperationLogDTO>> operationLogPage(@RequestBody SysOperationLogVO sysOperationLogVO) {
+        return RespDTO.onSuc(logManagementFacade.getOperationLog(sysOperationLogVO));
+    }
 
 
 }

+ 19 - 0
src/main/resources/mapper/QcCasesMapper.xml

@@ -50,4 +50,23 @@
         a.id,
         a.`name`
     </select>
+    <select id="getQcCasesById" resultType="com.diagbot.dto.QcCasesDTO">
+        SELECT
+        qch.*,
+        qc.`name` AS NAME,
+        qc.prefix AS prefix
+        FROM
+        `qc_cases_hospital` qch,
+        qc_cases qc
+        WHERE
+        qch.cases_id = qc.id
+        AND qch.is_deleted = 'N'
+        AND qc.is_deleted = 'N'
+        <if test="id != null and id != ''">
+            and qch.id = #{id}
+        </if>
+        <if test="hospitalId != null and hospitalId != ''">
+            and qch.hospital_id = #{hospitalId}
+        </if>
+    </select>
 </mapper>

+ 45 - 0
src/main/resources/mapper/SysLoginLogMapper.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.SysLoginLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.SysLoginLog">
+        <id column="id" property="id" />
+        <result column="login_id" property="loginId" />
+        <result column="login_name" property="loginName" />
+        <result column="login_date" property="loginDate" />
+        <result column="login_ip" property="loginIp" />
+        <result column="login_address" property="loginAddress" />
+        <result column="login_browser" property="loginBrowser" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="remark" property="remark" />
+    </resultMap>
+    <insert id="addLoginLog">
+        insert into sys_login_log(login_id,login_name,login_date,login_ip,login_address,login_browser,gmt_create)
+        values (#{loginId},#{loginName},#{loginDate},INET_ATON(#{loginIp}),#{loginAddress},#{loginBrowser},#{gmtCreate})
+    </insert>
+    <select id="getLoginLog" resultType="com.diagbot.dto.SysLoginLogDTO">
+        select
+        a.login_id as loginId,
+        a.login_name as loginName,
+        a.login_date as loginDate,
+        INET_NTOA(a.login_ip) as loginIp,
+        a.login_address as loginAddress,
+        a.login_browser as loginBrowser
+        from sys_login_log a
+        where
+        1 = 1
+        <if test="sysLoginLogVO.loginName != null and sysLoginLogVO.loginName != ''">
+            AND a.login_name like CONCAT('%',#{sysLoginLogVO.loginName},'%')
+        </if>
+        <if test="sysLoginLogVO.loginIp != null and sysLoginLogVO.loginIp != ''">
+            AND INET_NTOA(a.login_ip) like CONCAT('%',#{sysLoginLogVO.loginIp},'%')
+        </if>
+        order by a.login_date desc
+    </select>
+
+</mapper>

+ 57 - 0
src/main/resources/mapper/SysOperationLogMapper.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.SysOperationLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.SysOperationLog">
+        <id column="id" property="id" />
+        <result column="operation_id" property="operationId" />
+        <result column="operation_name" property="operationName" />
+        <result column="operation_date" property="operationDate" />
+        <result column="operation_record" property="operationRecord" />
+        <result column="operation_ip" property="operationIp" />
+        <result column="operation_address" property="operationAddress" />
+        <result column="operation_method" property="operationMethod" />
+        <result column="operation_way" property="operationWay" />
+        <result column="operation_url" property="operationUrl" />
+        <result column="operation_param" property="operationParam" />
+        <result column="json_result" property="jsonResult" />
+        <result column="is_placefile" property="isPlacefile" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="remark" property="remark" />
+    </resultMap>
+    <select id="getOperationLog" resultType="com.diagbot.dto.SysOperationLogDTO">
+        SELECT
+        a.id,
+        a.operation_id AS operationId,
+        a.operation_name AS operationName,
+        a.operation_date AS operationDate,
+        a.operation_method AS operationMethod,
+        a.operation_way AS operationWay,
+        a.operation_url AS operationUrl,
+        a.operation_param AS operationParam,
+        INET_NTOA(a.operation_ip) AS operationIp,
+        a.operation_address AS operationAddress,
+        a.json_result AS jsonResult
+        FROM
+        sys_operation_log a
+        where
+        1 = 1
+        <if test="sysOperationLogVO.operationName != null and sysOperationLogVO.operationName != ''">
+            AND a.operation_name like CONCAT('%',#{sysOperationLogVO.operationName},'%')
+        </if>
+        <if test="sysOperationLogVO.isPlacefile != null and sysOperationLogVO.isPlacefile != ''">
+            AND a.is_placefile = #{sysOperationLogVO.isPlacefile}
+        </if>
+        <if test="sysOperationLogVO.startDate != null and sysOperationLogVO.endDate != null">
+            <![CDATA[ AND a.operation_date >= #{sysOperationLogVO.startDate}]]>
+            <![CDATA[ AND a.operation_date <= #{sysOperationLogVO.endDate}]]>
+        </if>
+        order by a.operation_date desc
+    </select>
+
+</mapper>