Ver código fonte

Merge branch 'master' of http://116.63.33.55/git/industry-data-platform

lry 10 meses atrás
pai
commit
184fd27349

+ 51 - 0
industry-system/cqcy-ei-common/src/main/java/com/example/opc_common/entity/OperationLog.java

@@ -0,0 +1,51 @@
+package com.example.opc_common.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class OperationLog implements Serializable {
+
+    private static final long serialVersionUID = -96536212774977561L;
+
+    /**
+     * 主键id
+     */
+    private Integer id;
+    /**
+     * 模块名称
+     */
+    private String modelName;
+
+    /**
+     * 操作类型
+     */
+    private String operationName;
+    /**
+     * 日志内容
+     */
+    private String content;
+    /**
+     * 用户id
+     */
+    private String userId;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * IP地址
+     */
+    private String ipAddress;
+    /**
+     * 操作状态
+     */
+    private Integer operationStatus;
+    /**
+     * 耗时
+     */
+    private String consumeTime;
+
+}

+ 52 - 0
industry-system/industry-da/src/main/java/com/example/opc_da/config/OpcuaClientConfig.java

@@ -0,0 +1,52 @@
+package com.example.opc_da.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Data
+public class OpcuaClientConfig {
+
+    @Value("${opcua.client.app.name}")
+    private String appName;
+
+    @Value("${opcua.client.app.uri}")
+    private String appUri;
+
+    @Value("${opcua.client.cert.path}")
+    private String certPath;
+
+    @Value("${opcua.client.cert.file}")
+    private String certFile;
+
+    @Value("${opcua.client.cert.alias}")
+    private String certAlias;
+
+    @Value("${opcua.client.cert.commonName}")
+    private String certCommonName;
+
+    @Value("${opcua.client.cert.organization}")
+    private String certOrganization;
+
+    @Value("${opcua.client.cert.organizationUnit}")
+    private String certOrganizationUnit;
+
+    @Value("${opcua.client.cert.localityName}")
+    private String certLocalityName;
+
+    @Value("${opcua.client.cert.stateName}")
+    private String certStateName;
+
+    @Value("${opcua.client.cert.countryCode}")
+    private String certCountryCode;
+
+    @Value("${opcua.client.cert.dnsName}")
+    private String certDnsName;
+
+    @Value("${opcua.client.cert.ipAddress}")
+    private String certIpAddress;
+
+    @Value("${opcua.client.cert.keystorePassword}")
+    private String certKeystorePassword;
+}

+ 45 - 0
industry-system/industry-da/src/main/java/com/example/opc_da/controller/OperationLogController.java

@@ -0,0 +1,45 @@
+package com.example.opc_da.controller;
+
+import com.example.opc_common.enums.ResultEnum;
+import com.example.opc_common.util.Blank;
+import com.example.opc_common.util.Result;
+import com.example.opc_da.annotation.PermissionControl;
+import com.example.opc_da.service.LogService;
+import com.example.opc_da.service.OperationLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 操作日志管理
+ */
+@RestController
+@RequestMapping("operationLog")
+@Slf4j
+public class OperationLogController {
+
+    @Autowired
+    private OperationLogService operationLogService;
+
+    @GetMapping("/getLogPage")
+    @PermissionControl
+    public Result getLogPage(int page, int limit, String modelName,String operationName, String content, String userId, String ipAddress, String startDate, String endDate) {
+        if (Blank.isEmpty(page, limit) || page < 1 || limit < 1) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), ResultEnum.REQUEST_WRONGPARAMS.getRespMsg());
+        }
+        return operationLogService.getLogPage(page, limit, modelName, operationName, content, userId, ipAddress,startDate,endDate);
+    }
+
+    /**
+     * 删除6个月之前数据
+     */
+    @GetMapping("/deleteByDate")
+    @PermissionControl
+    public Result deleteOperationLogByTime(){
+        return operationLogService.deleteOperationLogByTime();
+    }
+
+
+}

+ 22 - 0
industry-system/industry-da/src/main/java/com/example/opc_da/dao/OperationLogDao.java

@@ -0,0 +1,22 @@
+package com.example.opc_da.dao;
+
+import com.example.opc_common.entity.Log;
+import com.example.opc_common.entity.OperationLog;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface OperationLogDao {
+
+    Long getLogCount(String modelName, String operationName, String content, String userId, String ipAddress, String startDate, String endDate);
+
+    List<Log> getLogPage(Long startNum, Long limitNum, String modelName, String operationName, String content, String userId, String ipAddress, String startDate, String endDate);
+
+    Integer insertLog(OperationLog operationLog);
+
+    /**
+     * 删除6个月以前的数据
+     */
+    Integer deleteOperationLogByTime(String time);
+}

+ 16 - 0
industry-system/industry-da/src/main/java/com/example/opc_da/service/OperationLogService.java

@@ -0,0 +1,16 @@
+package com.example.opc_da.service;
+
+import com.example.opc_common.entity.OperationLog;
+import com.example.opc_common.util.Result;
+
+public interface OperationLogService {
+
+    Result getLogPage(int page, int limit, String modelName, String operationName, String content, String userId, String ipAddress, String startDate, String endDate);
+
+    Result insertLog(OperationLog operationLog);
+
+    /**
+     * 删除6个月之前数据
+     */
+    Result deleteOperationLogByTime();
+}

+ 53 - 0
industry-system/industry-da/src/main/java/com/example/opc_da/service/impl/OperationLogServiceImpl.java

@@ -0,0 +1,53 @@
+package com.example.opc_da.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.example.opc_common.entity.Log;
+import com.example.opc_common.entity.OperationLog;
+import com.example.opc_common.enums.ResultEnum;
+import com.example.opc_common.util.Result;
+import com.example.opc_da.dao.OperationLogDao;
+import com.example.opc_da.service.OperationLogService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.List;
+
+@Service
+@Transactional
+public class OperationLogServiceImpl implements OperationLogService {
+
+    @Resource
+    private OperationLogDao operationLogDao;
+
+    @Override
+    public Result getLogPage(int page, int limit, String modelName, String operationName, String content, String userId, String ipAddress, String startDate, String endDate) {
+        JSONObject jsonObject = new JSONObject();
+        Long count = operationLogDao.getLogCount(modelName, operationName, content, userId, ipAddress, startDate, endDate);
+        Long startNum = Long.valueOf((page - 1) * limit);
+        List<Log> logList = operationLogDao.getLogPage(startNum, Long.valueOf(limit), modelName, operationName, content, userId, ipAddress, startDate, endDate);
+        jsonObject.put("count", count);
+        jsonObject.put("logList", logList);
+        return Result.ok(jsonObject);
+    }
+
+    @Override
+    public Result insertLog(OperationLog operationLog) {
+        if (operationLogDao.insertLog(operationLog) <= 0) {
+            return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "添加操作日志失败");
+        }
+        return Result.ok("添加操作日志成功");
+    }
+
+    @Override
+    public Result deleteOperationLogByTime() {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Calendar instance = Calendar.getInstance();
+        instance.add(Calendar.MONDAY, -6);
+        String date = simpleDateFormat.format(instance.getTime());
+        return Result.ok(operationLogDao.deleteOperationLogByTime(date));
+    }
+
+}

+ 31 - 19
industry-system/industry-da/src/main/java/com/example/opc_da/validate/dataSource/KeyStoreLoader.java

@@ -1,16 +1,20 @@
 package com.example.opc_da.validate.dataSource;
 
-import com.example.opc_common.enums.ResultEnum;
-import com.example.opc_common.exception.CustomException;
+import cn.hutool.core.io.FileUtil;
+import com.example.opc_da.config.OpcuaClientConfig;
 import org.eclipse.milo.opcua.sdk.server.util.HostnameUtil;
 import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateBuilder;
 import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.net.URL;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -32,10 +36,20 @@ public class KeyStoreLoader {
     // 密钥对对象
     private KeyPair clientKeyPair;
 
-    public KeyStoreLoader getKeyStoreLoader(String certificateAlias, String certificateDir, char[] certificateKey) throws KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException {
-        Path serverKeyStore = Paths.get(certificateDir);
+    public KeyStoreLoader getKeyStoreLoader(OpcuaClientConfig opcuaClientConfig) throws Exception {
+        String certificateAlias = opcuaClientConfig.getCertAlias();
+        char[] certificateKey = opcuaClientConfig.getCertKeystorePassword().toCharArray();
+
+        String certificateDir = opcuaClientConfig.getCertPath();
+        if(!FileUtil.exist(certificateDir)){
+            FileUtil.mkdir(certificateDir);
+        }
+        // PKCS12的加密标准的文件后缀是.pfx,其中包含了公钥和私钥。
+        // 而其他如.der等的格式只包含公钥,私钥在另外的文件中。
+        Path serverKeyStore = Paths.get(certificateDir).resolve(opcuaClientConfig.getCertFile());
         if (!Files.exists(serverKeyStore)) {
-            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "证书不存在");
+            //throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "证书不存在");
+            createCertificate(opcuaClientConfig, certificateAlias, serverKeyStore, certificateKey);
         }
         // 创建一个使用`PKCS12`加密标准的KeyStore。KeyStore在后面将作为读取和生成证书的对象。
         KeyStore keyStore = KeyStore.getInstance("PKCS12");
@@ -64,30 +78,28 @@ public class KeyStoreLoader {
      * 创建证书
      *
      * @param certificateAlias 证书别名
-     * @param certificateDir   证书路径,包含证书的文件名(jellyleo-client.pfx)
+     * @param serverKeyStore   证书路径,包含证书的文件名(jellyleo-client.pfx)
      * @param certificateKey   证书秘钥
      * @throws Exception
      */
-    public void createCertificate(String certificateAlias, String certificateDir, char[] certificateKey) throws Exception {
-        Path serverKeyStore = Paths.get(certificateDir);
-
+    public void createCertificate(OpcuaClientConfig opcuaClientConfig, String certificateAlias, Path serverKeyStore, char[] certificateKey) throws Exception {
         // 创建一个使用`PKCS12`加密标准的KeyStore。KeyStore在后面将作为读取和生成证书的对象。
         KeyStore keyStore = KeyStore.getInstance("PKCS12");
-
+        keyStore.load(null, certificateKey);
         // 用2048位的RAS算法。`SelfSignedCertificateGenerator`为Milo库的对象。
         KeyPair keyPair = SelfSignedCertificateGenerator.generateRsaKeyPair(2048);
         // `SelfSignedCertificateBuilder`也是Milo库的对象,用来生成证书。
         // 中间所设置的证书属性可以自行修改。
         SelfSignedCertificateBuilder builder = new SelfSignedCertificateBuilder(keyPair)
-                .setCommonName("UaClient@Jellyleo")
-                .setOrganization("JL")
-                .setOrganizationalUnit("per")
-                .setLocalityName("jl")
-                .setStateName("JiangSu")
-                .setCountryCode("CN")
-                .setApplicationUri("urn:Jellyleo:UnifiedAutomation:UaExpert@Jellyleo")
-                .addDnsName("Jellyleo")
-                .addIpAddress("127.0.0.1");
+                .setCommonName(opcuaClientConfig.getCertCommonName())
+                .setOrganization(opcuaClientConfig.getCertOrganization())
+                .setOrganizationalUnit(opcuaClientConfig.getCertOrganizationUnit())
+                .setLocalityName(opcuaClientConfig.getCertLocalityName())
+                .setStateName(opcuaClientConfig.getCertStateName())
+                .setCountryCode(opcuaClientConfig.getCertCountryCode())
+                .setApplicationUri(opcuaClientConfig.getAppUri())
+                .addDnsName(opcuaClientConfig.getCertDnsName())
+                .addIpAddress(opcuaClientConfig.getCertIpAddress());
 
         // 获取证书中列出的尽可能多的主机名和IP地址。
         for (String hostname : HostnameUtil.getHostnames("0.0.0.0")) {

+ 26 - 27
industry-system/industry-da/src/main/java/com/example/opc_da/validate/dataSource/OpcUaValidate.java

@@ -7,10 +7,13 @@ import com.example.opc_common.enums.ResultEnum;
 import com.example.opc_common.exception.CustomException;
 import com.example.opc_common.util.Blank;
 import com.example.opc_common.util.Result;
+import com.example.opc_da.config.OpcuaClientConfig;
+import com.example.opc_da.config.SpringContextUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
 import org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfig;
 import org.eclipse.milo.opcua.sdk.client.api.config.OpcUaClientConfigBuilder;
+import org.eclipse.milo.opcua.sdk.client.api.identity.AnonymousProvider;
 import org.eclipse.milo.opcua.sdk.client.api.identity.UsernameProvider;
 import org.eclipse.milo.opcua.sdk.client.api.identity.X509IdentityProvider;
 import org.eclipse.milo.opcua.sdk.client.nodes.UaNode;
@@ -31,9 +34,6 @@ import org.eclipse.milo.opcua.stack.core.types.structured.*;
 import org.jetbrains.annotations.NotNull;
 
 import java.security.KeyPair;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.UnrecoverableKeyException;
 import java.security.cert.X509Certificate;
 import java.util.*;
 import java.util.concurrent.ExecutionException;
@@ -45,6 +45,9 @@ import java.util.function.Predicate;
  */
 @Slf4j
 public class OpcUaValidate implements DataSourceValidate {
+
+    private static OpcuaClientConfig opcuaClientConfig = SpringContextUtils.getBean(OpcuaClientConfig.class);
+
     @Override
     public void Validate(DataSource dataSource) {
         if (Blank.isEmpty(dataSource.getIpAddress(), dataSource.getIpPort(), dataSource.getIdentityProvider())) {
@@ -192,7 +195,7 @@ public class OpcUaValidate implements DataSourceValidate {
                 map.put("itemReadName", str + "." + name);
 //                map.put("nodeId", nd.getNodeId());
                 map.put("nodeIndex", nd.getNodeId().getNamespaceIndex().intValue());
-                map.put("identifier",nd.getNodeId().getIdentifier());
+                map.put("identifier", nd.getNodeId().getIdentifier());
                 map.put("dataType", nd.getNodeId().getType());
                 map.put("description", nd.getDescription());
                 mapLeaveList.add(map);
@@ -225,7 +228,7 @@ public class OpcUaValidate implements DataSourceValidate {
                 map.put("nodeId", nd.getNodeId());
                 map.put("nodeIndex", nd.getNodeId().getNamespaceIndex().intValue());
                 map.put("dataType", nd.getNodeId().getType());
-                map.put("identifier",nd.getNodeId().getIdentifier());
+                map.put("identifier", nd.getNodeId().getIdentifier());
                 map.put("description", nd.getDescription());
                 mapList.add(map);
             }
@@ -252,7 +255,7 @@ public class OpcUaValidate implements DataSourceValidate {
      *
      * @return
      */
-    private static OpcUaClientConfig getOpcUaClientConfig(DataSource dataSource) throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException {
+    private static OpcUaClientConfig getOpcUaClientConfig(DataSource dataSource) throws Exception {
         List<EndpointDescription> endpoints = null;
         EndpointDescription endpoint = null;
         String endpointUrl = "opc.tcp://" + dataSource.getIpAddress() + ":" + dataSource.getIpPort();
@@ -274,36 +277,32 @@ public class OpcUaValidate implements DataSourceValidate {
             e.printStackTrace();
             throw new RuntimeException(e);
         }
+        OpcUaClientConfigBuilder config = OpcUaClientConfig.builder()
+                .setApplicationName(LocalizedText.english(opcuaClientConfig.getAppName()))
+                .setApplicationUri(opcuaClientConfig.getAppUri())
+                .setEndpoint(endpoint);
+
+        KeyStoreLoader keyStoreLoader = new KeyStoreLoader();
+        keyStoreLoader.getKeyStoreLoader(opcuaClientConfig);
+        X509Certificate clientCertificate = keyStoreLoader.getClientCertificate();
+        KeyPair clientKeyPair = keyStoreLoader.getClientKeyPair();
+
+        if (dataSource.getSecurityMode() != 1) {
+            // 非None 需要证书和密钥
+            config.setCertificate(clientCertificate).setKeyPair(clientKeyPair);
+        }
         //使用账号密码登录
         if (dataSource.getIdentityProvider() == UserTokenType.UserName.getValue()) {
-            return OpcUaClientConfig.builder()
-                    .setApplicationName(LocalizedText.english("OpcUaClientWithCertificateExample"))
-                    .setApplicationUri("urn:example:OpcUaClientWithCertificateExample")
-                    .setEndpoint(endpoint)
-                    .setIdentityProvider(new UsernameProvider(dataSource.getIpUserName(), dataSource.getIpPassword()))
+            return config.setIdentityProvider(new UsernameProvider(dataSource.getIpUserName(), dataSource.getIpPassword()))
                     .build();
             //使用证书登录
         } else if (dataSource.getIdentityProvider() == UserTokenType.Certificate.getValue()) {
-            KeyStoreLoader keyStoreLoader = new KeyStoreLoader();
-            keyStoreLoader.getKeyStoreLoader("jlclient-ai", dataSource.getCertificateDir(), dataSource.getCertificateKey().toCharArray());
-            X509Certificate clientCertificate = keyStoreLoader.getClientCertificate();
-            KeyPair clientKeyPair = keyStoreLoader.getClientKeyPair();
             // 配置客户端SSLContext,使用证书
-            return OpcUaClientConfig.builder()
-                    .setApplicationName(LocalizedText.english("OpcUaClientWithCertificateExample"))
-                    .setApplicationUri("urn:example:OpcUaClientWithCertificateExample")
-                    .setEndpoint(endpoint)
-                    .setCertificate(clientCertificate)
-                    .setKeyPair(clientKeyPair)
-                    .setIdentityProvider(new X509IdentityProvider(clientCertificate, clientKeyPair.getPrivate()))
+            return config.setIdentityProvider(new X509IdentityProvider(clientCertificate, clientKeyPair.getPrivate()))
                     .build();
             //否则为匿名登录
         } else {
-            return OpcUaClientConfig.builder()
-                    .setApplicationName(LocalizedText.english("OpcUaClientWithCertificateExample"))
-                    .setApplicationUri("urn:example:OpcUaClientWithCertificateExample")
-                    .setEndpoint(endpoint)
-                    .build();
+            return config.setIdentityProvider(new AnonymousProvider()).build();
         }
     }
 

+ 7 - 2
industry-system/industry-da/src/main/resources/application-dev.yml

@@ -6,6 +6,11 @@ file:
   # 清理间隔时间段前的pdf打印临时文件,单位:天
   # 默认清理1天前的pdf打印临时文件
   pdf-delete-days: 1
+#opcua客户端配置参数
+opcua:
+  client:
+    cert:
+      path: "D:/security"
 
 spring:
   servlet:
@@ -50,8 +55,8 @@ spring:
 
 #mybatis:
 #  configuration:
-#    开启sql日志文件
+#    #开启sql日志文件
 #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 #logging:
 #  level:
-#    root: error
+#    root: info

+ 5 - 0
industry-system/industry-da/src/main/resources/application-prod.yml

@@ -6,6 +6,11 @@ file:
   # 清理间隔时间段前的pdf打印临时文件,单位:天
   # 默认清理1天前的pdf打印临时文件
   pdf-delete-days: 1
+#opcua客户端配置参数
+opcua:
+  client:
+    cert:
+      path: "/home/security"
 
 spring:
   servlet:

+ 7 - 2
industry-system/industry-da/src/main/resources/application-test.yml

@@ -1,11 +1,16 @@
 server:
   port: 8089
 file:
-  path: E:/EI_Report/upload/chuanyi/
-  commonPath: E:/EI_Report/upload/file/
+  path: /EI_Report/upload/chuanyi/
+  commonPath: /EI_Report/upload/file/
   # 清理间隔时间段前的pdf打印临时文件,单位:天
   # 默认清理1天前的pdf打印临时文件
   pdf-delete-days: 1
+#opcua客户端配置参数
+opcua:
+  client:
+    cert:
+      path: "/EI_Report/security"
 
 spring:
   servlet:

+ 20 - 1
industry-system/industry-da/src/main/resources/application.yml

@@ -30,7 +30,26 @@ springboot:
       publicKeysStorePath: "/publicCerts.store"
       storePass: "#0#cyc2023!"
       licensePath: ./license.lic
-
+#opcua客户端配置参数
+opcua:
+  client:
+    app:
+      name: "UaClient@cydcs"
+      uri: "urn:cydcs:UnifiedAutomation:UaExpert@cydcs"
+    cert:
+      # 在子配置文件中配置
+      path: ""
+      file: "cydcs-uaclient.pfx"
+      alias: "cydcs-uaclient"
+      commonName: "UaClient@cydcs"
+      organization: "CQCY"
+      organizationUnit: "DCS"
+      localityName: "ChongQing"
+      stateName: "ChongQing"
+      countryCode: "CN"
+      dnsName: "cydcs"
+      ipAddress: "127.0.0.1"
+      keystorePassword: "123456"
 telegraf:
   client:
     port: 12080

+ 85 - 0
industry-system/industry-da/src/main/resources/mapper/OperationLogDao.xml

@@ -0,0 +1,85 @@
+<?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.example.opc_da.dao.OperationLogDao">
+
+    <insert id="insertOperationLog">
+        insert into t_operation_log(model_name, operation_name, content, user_id, create_time, ip_address, operation_status,
+                            consume_time)
+            VALUE (#{modelName}, #{operationName}, #{content}, #{userId}, now(), #{ipAddress}, #{operationStatus},
+                #{consumeTime})
+    </insert>
+
+    <select id="getOperationLogCount" resultType="java.lang.Long">
+        select count(*)
+        from t_operation_log
+        <where>
+            <if test="modelName != null and modelName !=''">
+                AND model_name LIKE CONCAT('%', #{modelName}, '%')
+            </if>
+            <if test="operationName != null and operationName !=''">
+                AND operation_name LIKE CONCAT('%', #{operationName}, '%')
+            </if>
+            <if test="content != null and content !=''">
+                AND content LIKE CONCAT('%', #{content}, '%')
+            </if>
+            <if test="userId != null and userId !=''">
+                AND user_id LIKE CONCAT('%', #{userId}, '%')
+            </if>
+            <if test="ipAddress != null and ipAddress !=''">
+                AND ip_address LIKE CONCAT('%', #{ipAddress}, '%')
+            </if>
+            <if test="startDate !=null and startDate != ''">
+                AND create_time > #{startDate}
+            </if>
+            <if test="endDate !=null and endDate !=''">
+                AND create_time &lt; #{endDate}
+            </if>
+        </where>
+    </select>
+
+    <select id="getOperationLogPage" resultType="com.example.opc_common.entity.OperationLog">
+        select id,
+        model_name,
+        operation_name,
+        content,
+        user_id,
+        create_time,
+        ip_address,
+        operation_status,
+        consume_time
+        from t_operation_log
+        <where>
+            <if test="modelName != null and modelName !=''">
+                AND model_name LIKE CONCAT('%', #{modelName}, '%')
+            </if>
+            <if test="operationName != null and operationName !=''">
+                AND operation_name LIKE CONCAT('%', #{operationName}, '%')
+            </if>
+            <if test="content != null and content !=''">
+                AND content LIKE CONCAT('%', #{content}, '%')
+            </if>
+            <if test="userId != null and userId !=''">
+                AND user_id LIKE CONCAT('%', #{userId}, '%')
+            </if>
+            <if test="ipAddress != null and ipAddress !=''">
+                AND ip_address LIKE CONCAT('%', #{ipAddress}, '%')
+            </if>
+            <if test="startDate !=null and startDate != ''">
+                AND create_time > #{startDate}
+            </if>
+            <if test="endDate !=null and endDate !=''">
+                AND create_time &lt; #{endDate}
+            </if>
+        </where>
+        order by create_time DESC
+        limit #{startNum},#{limitNum}
+    </select>
+
+    <!--删除6个月之前的数据-->
+    <delete id="deleteOperationLogByTime">
+        DELETE
+        FROM t_operation_log
+        WHERE create_time &lt; #{time}
+    </delete>
+
+</mapper>