From 89fd47bacef92906ee527e9470cfa096fc03a168 Mon Sep 17 00:00:00 2001 From: fit2-zhao Date: Tue, 25 Jan 2022 18:43:22 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97):?= =?UTF-8?q?=20=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97=E5=92=8C=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E8=B5=84=E6=BA=90=E7=9A=84=E5=85=B3=E7=B3=BB=E8=A7=A3?= =?UTF-8?q?=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/domain/OperatingLogResource.java | 15 + .../domain/OperatingLogResourceExample.java | 410 ++++++++++++++++++ .../mapper/OperatingLogResourceMapper.java | 31 ++ .../mapper/OperatingLogResourceMapper.xml | 181 ++++++++ .../base/mapper/ext/ExtOperatingLogMapper.xml | 110 +++-- .../metersphere/log/aspect/MsLogAspect.java | 12 +- .../controller/OperatingLogController.java | 9 + .../log/service/OperatingLogService.java | 37 +- .../db/migration/V107__v1.18_release.sql | 11 + .../settings/operatinglog/OperatingLog.vue | 9 +- 10 files changed, 754 insertions(+), 71 deletions(-) create mode 100644 backend/src/main/java/io/metersphere/base/domain/OperatingLogResource.java create mode 100644 backend/src/main/java/io/metersphere/base/domain/OperatingLogResourceExample.java create mode 100644 backend/src/main/java/io/metersphere/base/mapper/OperatingLogResourceMapper.java create mode 100644 backend/src/main/java/io/metersphere/base/mapper/OperatingLogResourceMapper.xml create mode 100644 backend/src/main/resources/db/migration/V107__v1.18_release.sql diff --git a/backend/src/main/java/io/metersphere/base/domain/OperatingLogResource.java b/backend/src/main/java/io/metersphere/base/domain/OperatingLogResource.java new file mode 100644 index 0000000000..82110ec47a --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/OperatingLogResource.java @@ -0,0 +1,15 @@ +package io.metersphere.base.domain; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class OperatingLogResource implements Serializable { + private String id; + + private String operatingLogId; + + private String sourceId; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/OperatingLogResourceExample.java b/backend/src/main/java/io/metersphere/base/domain/OperatingLogResourceExample.java new file mode 100644 index 0000000000..ac2ab9b6fa --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/OperatingLogResourceExample.java @@ -0,0 +1,410 @@ +package io.metersphere.base.domain; + +import java.util.ArrayList; +import java.util.List; + +public class OperatingLogResourceExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public OperatingLogResourceExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(String value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(String value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(String value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(String value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(String value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(String value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLike(String value) { + addCriterion("id like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotLike(String value) { + addCriterion("id not like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(String value1, String value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(String value1, String value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdIsNull() { + addCriterion("operating_log_id is null"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdIsNotNull() { + addCriterion("operating_log_id is not null"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdEqualTo(String value) { + addCriterion("operating_log_id =", value, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdNotEqualTo(String value) { + addCriterion("operating_log_id <>", value, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdGreaterThan(String value) { + addCriterion("operating_log_id >", value, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdGreaterThanOrEqualTo(String value) { + addCriterion("operating_log_id >=", value, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdLessThan(String value) { + addCriterion("operating_log_id <", value, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdLessThanOrEqualTo(String value) { + addCriterion("operating_log_id <=", value, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdLike(String value) { + addCriterion("operating_log_id like", value, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdNotLike(String value) { + addCriterion("operating_log_id not like", value, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdIn(List values) { + addCriterion("operating_log_id in", values, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdNotIn(List values) { + addCriterion("operating_log_id not in", values, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdBetween(String value1, String value2) { + addCriterion("operating_log_id between", value1, value2, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andOperatingLogIdNotBetween(String value1, String value2) { + addCriterion("operating_log_id not between", value1, value2, "operatingLogId"); + return (Criteria) this; + } + + public Criteria andSourceIdIsNull() { + addCriterion("source_id is null"); + return (Criteria) this; + } + + public Criteria andSourceIdIsNotNull() { + addCriterion("source_id is not null"); + return (Criteria) this; + } + + public Criteria andSourceIdEqualTo(String value) { + addCriterion("source_id =", value, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdNotEqualTo(String value) { + addCriterion("source_id <>", value, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdGreaterThan(String value) { + addCriterion("source_id >", value, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdGreaterThanOrEqualTo(String value) { + addCriterion("source_id >=", value, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdLessThan(String value) { + addCriterion("source_id <", value, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdLessThanOrEqualTo(String value) { + addCriterion("source_id <=", value, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdLike(String value) { + addCriterion("source_id like", value, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdNotLike(String value) { + addCriterion("source_id not like", value, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdIn(List values) { + addCriterion("source_id in", values, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdNotIn(List values) { + addCriterion("source_id not in", values, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdBetween(String value1, String value2) { + addCriterion("source_id between", value1, value2, "sourceId"); + return (Criteria) this; + } + + public Criteria andSourceIdNotBetween(String value1, String value2) { + addCriterion("source_id not between", value1, value2, "sourceId"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/OperatingLogResourceMapper.java b/backend/src/main/java/io/metersphere/base/mapper/OperatingLogResourceMapper.java new file mode 100644 index 0000000000..5fa3e40530 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/OperatingLogResourceMapper.java @@ -0,0 +1,31 @@ +package io.metersphere.base.mapper; + +import io.metersphere.base.domain.OperatingLogResource; +import io.metersphere.base.domain.OperatingLogResourceExample; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface OperatingLogResourceMapper { + long countByExample(OperatingLogResourceExample example); + + int deleteByExample(OperatingLogResourceExample example); + + int deleteByPrimaryKey(String id); + + int insert(OperatingLogResource record); + + int insertSelective(OperatingLogResource record); + + List selectByExample(OperatingLogResourceExample example); + + OperatingLogResource selectByPrimaryKey(String id); + + int updateByExampleSelective(@Param("record") OperatingLogResource record, @Param("example") OperatingLogResourceExample example); + + int updateByExample(@Param("record") OperatingLogResource record, @Param("example") OperatingLogResourceExample example); + + int updateByPrimaryKeySelective(OperatingLogResource record); + + int updateByPrimaryKey(OperatingLogResource record); +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/OperatingLogResourceMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/OperatingLogResourceMapper.xml new file mode 100644 index 0000000000..16f384a367 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/OperatingLogResourceMapper.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, operating_log_id, source_id + + + + + delete from operating_log_resource + where id = #{id,jdbcType=VARCHAR} + + + delete from operating_log_resource + + + + + + insert into operating_log_resource (id, operating_log_id, source_id + ) + values (#{id,jdbcType=VARCHAR}, #{operatingLogId,jdbcType=VARCHAR}, #{sourceId,jdbcType=VARCHAR} + ) + + + insert into operating_log_resource + + + id, + + + operating_log_id, + + + source_id, + + + + + #{id,jdbcType=VARCHAR}, + + + #{operatingLogId,jdbcType=VARCHAR}, + + + #{sourceId,jdbcType=VARCHAR}, + + + + + + update operating_log_resource + + + id = #{record.id,jdbcType=VARCHAR}, + + + operating_log_id = #{record.operatingLogId,jdbcType=VARCHAR}, + + + source_id = #{record.sourceId,jdbcType=VARCHAR}, + + + + + + + + update operating_log_resource + set id = #{record.id,jdbcType=VARCHAR}, + operating_log_id = #{record.operatingLogId,jdbcType=VARCHAR}, + source_id = #{record.sourceId,jdbcType=VARCHAR} + + + + + + update operating_log_resource + + + operating_log_id = #{operatingLogId,jdbcType=VARCHAR}, + + + source_id = #{sourceId,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=VARCHAR} + + + update operating_log_resource + set operating_log_id = #{operatingLogId,jdbcType=VARCHAR}, + source_id = #{sourceId,jdbcType=VARCHAR} + where id = #{id,jdbcType=VARCHAR} + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOperatingLogMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOperatingLogMapper.xml index e9683befe1..b573a62fb7 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOperatingLogMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtOperatingLogMapper.xml @@ -4,35 +4,36 @@ + order by t.oper_time desc + diff --git a/backend/src/main/java/io/metersphere/log/aspect/MsLogAspect.java b/backend/src/main/java/io/metersphere/log/aspect/MsLogAspect.java index 57810e7882..c28e9d93dc 100644 --- a/backend/src/main/java/io/metersphere/log/aspect/MsLogAspect.java +++ b/backend/src/main/java/io/metersphere/log/aspect/MsLogAspect.java @@ -78,7 +78,6 @@ public class MsLogAspect { Object[] args = joinPoint.getArgs(); MsAuditLog msLog = method.getAnnotation(MsAuditLog.class); if (msLog != null && StringUtils.isNotEmpty(msLog.beforeEvent())) { - // 操作内容 //获取方法参数名 String[] params = discoverer.getParameterNames(method); //将参数纳入Spring管理 @@ -107,7 +106,7 @@ public class MsLogAspect { } } } catch (Exception e) { - LogUtil.error(e); + LogUtil.error("操作日志写入异常:" + joinPoint.getSignature()); } } @@ -201,7 +200,7 @@ public class MsLogAspect { } if (StringUtils.isNotEmpty(content) && StringUtils.isNotEmpty(msLog.beforeValue())) { OperatingLogDetails details = JSON.parseObject(content, OperatingLogDetails.class); - List columns = ReflexObjectUtil.compared(JSON.parseObject(msLog.beforeValue(), OperatingLogDetails.class), details,msLog.module()); + List columns = ReflexObjectUtil.compared(JSON.parseObject(msLog.beforeValue(), OperatingLogDetails.class), details, msLog.module()); details.setColumns(columns); msOperLog.setOperContent(JSON.toJSONString(details)); msOperLog.setSourceId(details.getSourceId()); @@ -256,17 +255,14 @@ public class MsLogAspect { } String path = request.getServletPath(); - if (StringUtils.isNotEmpty(msOperLog.getSourceId()) && msOperLog.getSourceId().length() > 6000) { - msOperLog.setSourceId(msOperLog.getSourceId().substring(0, 5999)); - } if (StringUtils.isNotEmpty(msOperLog.getOperTitle()) && msOperLog.getOperTitle().length() > 6000) { msOperLog.setOperTitle(msOperLog.getOperTitle().substring(0, 5999)); } msOperLog.setOperPath(path); - operatingLogService.create(msOperLog); + operatingLogService.create(msOperLog, msOperLog.getSourceId()); } } catch (Exception e) { - LogUtil.error(e); + LogUtil.error("操作日志写入异常:" + joinPoint.getSignature()); } } } diff --git a/backend/src/main/java/io/metersphere/log/controller/OperatingLogController.java b/backend/src/main/java/io/metersphere/log/controller/OperatingLogController.java index 9b26270a8c..d62116344b 100644 --- a/backend/src/main/java/io/metersphere/log/controller/OperatingLogController.java +++ b/backend/src/main/java/io/metersphere/log/controller/OperatingLogController.java @@ -2,6 +2,7 @@ package io.metersphere.log.controller; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; +import io.metersphere.base.domain.OperatingLogWithBLOBs; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.log.service.OperatingLogService; @@ -11,6 +12,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; +import java.util.UUID; @RestController @RequestMapping(value = "/operating/log") @@ -35,4 +37,11 @@ public class OperatingLogController { return operatingLogService.findBySourceId(request); } + @PostMapping("/save") + public void save(@RequestBody OperatingLogWithBLOBs msOperLog) { + //保存获取的操作 + msOperLog.setId(UUID.randomUUID().toString()); + String sourceIds = msOperLog.getSourceId(); + operatingLogService.create(msOperLog, sourceIds); + } } diff --git a/backend/src/main/java/io/metersphere/log/service/OperatingLogService.java b/backend/src/main/java/io/metersphere/log/service/OperatingLogService.java index a074e5d8a7..11a19605e3 100644 --- a/backend/src/main/java/io/metersphere/log/service/OperatingLogService.java +++ b/backend/src/main/java/io/metersphere/log/service/OperatingLogService.java @@ -1,8 +1,10 @@ package io.metersphere.log.service; import com.alibaba.fastjson.JSON; +import io.metersphere.base.domain.OperatingLogResource; import io.metersphere.base.domain.OperatingLogWithBLOBs; import io.metersphere.base.mapper.OperatingLogMapper; +import io.metersphere.base.mapper.OperatingLogResourceMapper; import io.metersphere.base.mapper.ext.ExtOperatingLogMapper; import io.metersphere.commons.utils.BeanUtils; import io.metersphere.log.vo.OperatingLogDTO; @@ -10,12 +12,17 @@ import io.metersphere.log.vo.OperatingLogDetails; import io.metersphere.log.vo.OperatingLogRequest; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.session.ExecutorType; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; +import java.util.UUID; @Service @Transactional(rollbackFor = Exception.class) @@ -24,9 +31,36 @@ public class OperatingLogService { private OperatingLogMapper operatingLogMapper; @Resource private ExtOperatingLogMapper extOperatingLogMapper; + @Resource + private SqlSessionFactory sqlSessionFactory; - public void create(OperatingLogWithBLOBs log) { + public void create(OperatingLogWithBLOBs log, String sourceIds) { + log.setSourceId(""); operatingLogMapper.insert(log); + System.out.println(JSON.toJSONString(log)); + if (StringUtils.isNotEmpty(sourceIds)) { + List ids = new ArrayList<>(); + if (sourceIds.startsWith("[")) { + ids = JSON.parseObject(sourceIds, List.class); + } else { + ids.add(sourceIds.replace("\"", "")); + } + SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); + OperatingLogResourceMapper batchMapper = sqlSession.getMapper(OperatingLogResourceMapper.class); + if (CollectionUtils.isNotEmpty(ids)) { + ids.forEach(item -> { + OperatingLogResource resource = new OperatingLogResource(); + resource.setId(UUID.randomUUID().toString()); + resource.setOperatingLogId(log.getId()); + resource.setSourceId(item); + batchMapper.insert(resource); + }); + sqlSession.flushStatements(); + if (sqlSession != null && sqlSessionFactory != null) { + SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory); + } + } + } } public List list(OperatingLogRequest request) { @@ -48,7 +82,6 @@ public class OperatingLogService { } public List findBySourceId(OperatingLogRequest request) { - request.setSourceId("%" + request.getSourceId() + "%"); List logWithBLOBs = extOperatingLogMapper.findBySourceId(request); List dtos = new ArrayList<>(); if (CollectionUtils.isNotEmpty(logWithBLOBs)) { diff --git a/backend/src/main/resources/db/migration/V107__v1.18_release.sql b/backend/src/main/resources/db/migration/V107__v1.18_release.sql new file mode 100644 index 0000000000..047f938288 --- /dev/null +++ b/backend/src/main/resources/db/migration/V107__v1.18_release.sql @@ -0,0 +1,11 @@ +ALTER TABLE `operating_log` ADD INDEX oper_time_index ( `oper_time` ); + +CREATE TABLE `operating_log_resource` +( + `id` varchar(50) NOT NULL COMMENT 'ID', + `operating_log_id` varchar(50) NOT NULL COMMENT 'Operating log ID', + `source_id` varchar(50) NOT NULL COMMENT 'operating source id', + PRIMARY KEY (`id`), + KEY `operating_log_id_index` (`operating_log_id`), + KEY `source_id_index` (`source_id`) +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE utf8mb4_general_ci; \ No newline at end of file diff --git a/frontend/src/business/components/settings/operatinglog/OperatingLog.vue b/frontend/src/business/components/settings/operatinglog/OperatingLog.vue index 8835e096e1..3115e338bb 100644 --- a/frontend/src/business/components/settings/operatinglog/OperatingLog.vue +++ b/frontend/src/business/components/settings/operatinglog/OperatingLog.vue @@ -1,5 +1,5 @@