Commit e2c3879a79e1f6ce550f63c21ca3e52826a6ac29
1 parent
1113ff62
logging service supported
Showing
11 changed files
with
650 additions
and
0 deletions
assistant-logging/src/main/java/com/diligrp/assistant/logging/LoggingConfiguration.java
1 | package com.diligrp.assistant.logging; | 1 | package com.diligrp.assistant.logging; |
2 | 2 | ||
3 | +import com.diligrp.assistant.shared.mybatis.MybatisMapperSupport; | ||
4 | +import org.mybatis.spring.annotation.MapperScan; | ||
3 | import org.springframework.context.annotation.ComponentScan; | 5 | import org.springframework.context.annotation.ComponentScan; |
4 | import org.springframework.context.annotation.Configuration; | 6 | import org.springframework.context.annotation.Configuration; |
5 | 7 | ||
6 | @Configuration | 8 | @Configuration |
7 | @ComponentScan("com.diligrp.assistant.logging") | 9 | @ComponentScan("com.diligrp.assistant.logging") |
10 | +@MapperScan(basePackages = {"com.diligrp.assistant.logging.dao"}, markerInterface = MybatisMapperSupport.class) | ||
8 | public class LoggingConfiguration { | 11 | public class LoggingConfiguration { |
9 | } | 12 | } |
assistant-logging/src/main/java/com/diligrp/assistant/logging/controller/UserEventController.java
0 → 100644
1 | +package com.diligrp.assistant.logging.controller; | ||
2 | + | ||
3 | +import com.diligrp.assistant.logging.domain.EventPageQuery; | ||
4 | +import com.diligrp.assistant.logging.domain.UserEventDTO; | ||
5 | +import com.diligrp.assistant.logging.service.UserEventService; | ||
6 | +import com.diligrp.assistant.shared.domain.Message; | ||
7 | +import com.diligrp.assistant.shared.domain.PageMessage; | ||
8 | +import com.diligrp.assistant.shared.service.ThreadPollService; | ||
9 | +import com.diligrp.assistant.shared.util.AssertUtils; | ||
10 | +import jakarta.annotation.Resource; | ||
11 | +import org.springframework.web.bind.annotation.RequestBody; | ||
12 | +import org.springframework.web.bind.annotation.RequestMapping; | ||
13 | +import org.springframework.web.bind.annotation.RequestParam; | ||
14 | +import org.springframework.web.bind.annotation.RestController; | ||
15 | + | ||
16 | +import java.time.LocalDateTime; | ||
17 | +import java.util.List; | ||
18 | + | ||
19 | +@RestController | ||
20 | +@RequestMapping("/logging/event") | ||
21 | +public class UserEventController { | ||
22 | + | ||
23 | + @Resource | ||
24 | + private UserEventService userEventService; | ||
25 | + | ||
26 | + @RequestMapping(value = "/fire.do") | ||
27 | + public Message<?> fire(@RequestBody UserEventDTO request, @RequestParam(value = "async", defaultValue = "false") boolean async) { | ||
28 | + AssertUtils.notEmpty(request.getModuleId(), "moduleId missed"); | ||
29 | + AssertUtils.notEmpty(request.getAction(), "action missed"); | ||
30 | + AssertUtils.notEmpty(request.getObjectId(), "objectId missed"); | ||
31 | + AssertUtils.notNull(request.getWhen(), "when missed"); | ||
32 | + AssertUtils.notEmpty(request.getUserId(), "userId missed"); | ||
33 | + | ||
34 | + if (async) { | ||
35 | + ThreadPollService.getInstance().submit(() -> userEventService.insertUserEvent(request)); | ||
36 | + } else { | ||
37 | + userEventService.insertUserEvent(request); | ||
38 | + } | ||
39 | + return Message.success(); | ||
40 | + } | ||
41 | + | ||
42 | + @RequestMapping(value = "/fires.do") | ||
43 | + public Message<?> fires(@RequestBody List<UserEventDTO> request, @RequestParam(value = "async", defaultValue = "false") boolean async) { | ||
44 | + request.stream().forEach(event -> { | ||
45 | + AssertUtils.notEmpty(event.getModuleId(), "moduleId missed"); | ||
46 | + AssertUtils.notEmpty(event.getAction(), "action missed"); | ||
47 | + AssertUtils.notEmpty(event.getObjectId(), "objectId missed"); | ||
48 | + AssertUtils.notNull(event.getWhen(), "when missed"); | ||
49 | + AssertUtils.notEmpty(event.getUserId(), "userId missed"); | ||
50 | + }); | ||
51 | + | ||
52 | + if (async) { | ||
53 | + ThreadPollService.getInstance().submit(() -> userEventService.insertUserEvents(request)); | ||
54 | + } else { | ||
55 | + userEventService.insertUserEvents(request); | ||
56 | + } | ||
57 | + return Message.success(); | ||
58 | + } | ||
59 | + | ||
60 | + @RequestMapping(value = "/list.do") | ||
61 | + public PageMessage<UserEventDTO> list(@RequestBody EventPageQuery request) { | ||
62 | + AssertUtils.notNull(request.getStartTime(), "startTime missed"); | ||
63 | + AssertUtils.notNull(request.getPageNo(), "pageNo missed"); | ||
64 | + AssertUtils.notNull(request.getPageSize(), "pageSize missed"); | ||
65 | + AssertUtils.isTrue(request.getPageNo() > 0, "invalid pageNo"); | ||
66 | + AssertUtils.isTrue(request.getPageSize() > 0, "invalid pageSize"); | ||
67 | + | ||
68 | + // 如果未指定结束时间,则查询一天的日志数据 | ||
69 | + LocalDateTime endTime = request.getEndTime() == null ? request.getStartTime().plusDays(1) : request.getEndTime(); | ||
70 | + request.setEndTime(endTime); | ||
71 | + request.from(request.getPageNo(), request.getPageSize()); | ||
72 | + | ||
73 | + return userEventService.listUserEvents(request); | ||
74 | + } | ||
75 | +} |
assistant-logging/src/main/java/com/diligrp/assistant/logging/dao/UserEventDao.java
0 → 100644
1 | +package com.diligrp.assistant.logging.dao; | ||
2 | + | ||
3 | +import com.diligrp.assistant.logging.domain.EventPageQuery; | ||
4 | +import com.diligrp.assistant.logging.model.UserEventDo; | ||
5 | +import com.diligrp.assistant.shared.mybatis.MybatisMapperSupport; | ||
6 | +import org.springframework.stereotype.Repository; | ||
7 | + | ||
8 | +import java.util.List; | ||
9 | + | ||
10 | +@Repository("userEventDao") | ||
11 | +public interface UserEventDao extends MybatisMapperSupport { | ||
12 | + void insertUserEvent(UserEventDo event); | ||
13 | + | ||
14 | + void insertUserEvents(List<UserEventDo> events); | ||
15 | + | ||
16 | + long countUserEvents(EventPageQuery query); | ||
17 | + | ||
18 | + List<UserEventDo> listUserEvents(EventPageQuery query); | ||
19 | +} |
assistant-logging/src/main/java/com/diligrp/assistant/logging/domain/EventPageQuery.java
0 → 100644
1 | +package com.diligrp.assistant.logging.domain; | ||
2 | + | ||
3 | +import com.diligrp.assistant.shared.domain.PageQuery; | ||
4 | + | ||
5 | +import java.time.LocalDateTime; | ||
6 | + | ||
7 | +public class EventPageQuery extends PageQuery { | ||
8 | + // 页号 | ||
9 | + private Integer pageNo = 1; | ||
10 | + // 每页记录数 | ||
11 | + private Integer pageSize = 20; | ||
12 | + // 事件分组ID | ||
13 | + private String groupId; | ||
14 | + // 系统模块ID | ||
15 | + private String moduleId; | ||
16 | + // 事件动作 | ||
17 | + private String action; | ||
18 | + // 操作对象ID | ||
19 | + private String objectId; | ||
20 | + // 操作对象 | ||
21 | + private String objectName; | ||
22 | + // 操作人ID | ||
23 | + private String userId; | ||
24 | + // 操作人 | ||
25 | + private String userName; | ||
26 | + // 事件来源-IP/MAC | ||
27 | + private String source; | ||
28 | + // 开始时间 | ||
29 | + private LocalDateTime startTime; | ||
30 | + // 结束时间 | ||
31 | + private LocalDateTime endTime; | ||
32 | + | ||
33 | + public Integer getPageNo() { | ||
34 | + return pageNo; | ||
35 | + } | ||
36 | + | ||
37 | + public void setPageNo(Integer pageNo) { | ||
38 | + this.pageNo = pageNo; | ||
39 | + } | ||
40 | + | ||
41 | + public Integer getPageSize() { | ||
42 | + return pageSize; | ||
43 | + } | ||
44 | + | ||
45 | + public void setPageSize(Integer pageSize) { | ||
46 | + this.pageSize = pageSize; | ||
47 | + } | ||
48 | + | ||
49 | + public String getGroupId() { | ||
50 | + return groupId; | ||
51 | + } | ||
52 | + | ||
53 | + public void setGroupId(String groupId) { | ||
54 | + this.groupId = groupId; | ||
55 | + } | ||
56 | + | ||
57 | + public String getModuleId() { | ||
58 | + return moduleId; | ||
59 | + } | ||
60 | + | ||
61 | + public void setModuleId(String moduleId) { | ||
62 | + this.moduleId = moduleId; | ||
63 | + } | ||
64 | + | ||
65 | + public String getAction() { | ||
66 | + return action; | ||
67 | + } | ||
68 | + | ||
69 | + public void setAction(String action) { | ||
70 | + this.action = action; | ||
71 | + } | ||
72 | + | ||
73 | + public String getObjectId() { | ||
74 | + return objectId; | ||
75 | + } | ||
76 | + | ||
77 | + public void setObjectId(String objectId) { | ||
78 | + this.objectId = objectId; | ||
79 | + } | ||
80 | + | ||
81 | + public String getObjectName() { | ||
82 | + return objectName; | ||
83 | + } | ||
84 | + | ||
85 | + public void setObjectName(String objectName) { | ||
86 | + this.objectName = objectName; | ||
87 | + } | ||
88 | + | ||
89 | + public String getUserId() { | ||
90 | + return userId; | ||
91 | + } | ||
92 | + | ||
93 | + public void setUserId(String userId) { | ||
94 | + this.userId = userId; | ||
95 | + } | ||
96 | + | ||
97 | + public String getUserName() { | ||
98 | + return userName; | ||
99 | + } | ||
100 | + | ||
101 | + public void setUserName(String userName) { | ||
102 | + this.userName = userName; | ||
103 | + } | ||
104 | + | ||
105 | + public String getSource() { | ||
106 | + return source; | ||
107 | + } | ||
108 | + | ||
109 | + public void setSource(String source) { | ||
110 | + this.source = source; | ||
111 | + } | ||
112 | + | ||
113 | + public LocalDateTime getStartTime() { | ||
114 | + return startTime; | ||
115 | + } | ||
116 | + | ||
117 | + public void setStartTime(LocalDateTime startTime) { | ||
118 | + this.startTime = startTime; | ||
119 | + } | ||
120 | + | ||
121 | + public LocalDateTime getEndTime() { | ||
122 | + return endTime; | ||
123 | + } | ||
124 | + | ||
125 | + public void setEndTime(LocalDateTime endTime) { | ||
126 | + this.endTime = endTime; | ||
127 | + } | ||
128 | +} |
assistant-logging/src/main/java/com/diligrp/assistant/logging/domain/UserEventDTO.java
0 → 100644
assistant-logging/src/main/java/com/diligrp/assistant/logging/model/UserEventDo.java
0 → 100644
1 | +package com.diligrp.assistant.logging.model; | ||
2 | + | ||
3 | +import com.diligrp.assistant.shared.domain.BaseDo; | ||
4 | + | ||
5 | +import java.time.LocalDateTime; | ||
6 | + | ||
7 | +public class UserEventDo extends BaseDo { | ||
8 | + // 事件分组ID | ||
9 | + private String groupId; | ||
10 | + // 系统模块ID | ||
11 | + private String moduleId; | ||
12 | + // 事件动作 | ||
13 | + private String action; | ||
14 | + // 操作对象ID | ||
15 | + private String objectId; | ||
16 | + // 操作对象 | ||
17 | + private String objectName; | ||
18 | + // 事件描述 | ||
19 | + private String event; | ||
20 | + // 发生时间 | ||
21 | + private LocalDateTime when; | ||
22 | + // 操作人ID | ||
23 | + private String userId; | ||
24 | + // 操作人 | ||
25 | + private String userName; | ||
26 | + // 事件来源-IP/MAC | ||
27 | + private String source; | ||
28 | + | ||
29 | + public String getGroupId() { | ||
30 | + return groupId; | ||
31 | + } | ||
32 | + | ||
33 | + public void setGroupId(String groupId) { | ||
34 | + this.groupId = groupId; | ||
35 | + } | ||
36 | + | ||
37 | + public String getModuleId() { | ||
38 | + return moduleId; | ||
39 | + } | ||
40 | + | ||
41 | + public void setModuleId(String moduleId) { | ||
42 | + this.moduleId = moduleId; | ||
43 | + } | ||
44 | + | ||
45 | + public String getAction() { | ||
46 | + return action; | ||
47 | + } | ||
48 | + | ||
49 | + public void setAction(String action) { | ||
50 | + this.action = action; | ||
51 | + } | ||
52 | + | ||
53 | + public String getObjectId() { | ||
54 | + return objectId; | ||
55 | + } | ||
56 | + | ||
57 | + public void setObjectId(String objectId) { | ||
58 | + this.objectId = objectId; | ||
59 | + } | ||
60 | + | ||
61 | + public String getObjectName() { | ||
62 | + return objectName; | ||
63 | + } | ||
64 | + | ||
65 | + public void setObjectName(String objectName) { | ||
66 | + this.objectName = objectName; | ||
67 | + } | ||
68 | + | ||
69 | + public String getEvent() { | ||
70 | + return event; | ||
71 | + } | ||
72 | + | ||
73 | + public void setEvent(String event) { | ||
74 | + this.event = event; | ||
75 | + } | ||
76 | + | ||
77 | + public LocalDateTime getWhen() { | ||
78 | + return when; | ||
79 | + } | ||
80 | + | ||
81 | + public void setWhen(LocalDateTime when) { | ||
82 | + this.when = when; | ||
83 | + } | ||
84 | + | ||
85 | + public String getUserId() { | ||
86 | + return userId; | ||
87 | + } | ||
88 | + | ||
89 | + public void setUserId(String userId) { | ||
90 | + this.userId = userId; | ||
91 | + } | ||
92 | + | ||
93 | + public String getUserName() { | ||
94 | + return userName; | ||
95 | + } | ||
96 | + | ||
97 | + public void setUserName(String userName) { | ||
98 | + this.userName = userName; | ||
99 | + } | ||
100 | + | ||
101 | + public String getSource() { | ||
102 | + return source; | ||
103 | + } | ||
104 | + | ||
105 | + public void setSource(String source) { | ||
106 | + this.source = source; | ||
107 | + } | ||
108 | + | ||
109 | + public static Builder builder() { | ||
110 | + return new UserEventDo().new Builder(); | ||
111 | + } | ||
112 | + | ||
113 | + public class Builder { | ||
114 | + public Builder groupId(String groupId) { | ||
115 | + UserEventDo.this.groupId = groupId; | ||
116 | + return this; | ||
117 | + } | ||
118 | + | ||
119 | + public Builder moduleId(String moduleId) { | ||
120 | + UserEventDo.this.moduleId = moduleId; | ||
121 | + return this; | ||
122 | + } | ||
123 | + | ||
124 | + public Builder action(String action) { | ||
125 | + UserEventDo.this.action = action; | ||
126 | + return this; | ||
127 | + } | ||
128 | + | ||
129 | + public Builder objectId(String objectId) { | ||
130 | + UserEventDo.this.objectId = objectId; | ||
131 | + return this; | ||
132 | + } | ||
133 | + | ||
134 | + public Builder objectName(String objectName) { | ||
135 | + UserEventDo.this.objectName = objectName; | ||
136 | + return this; | ||
137 | + } | ||
138 | + | ||
139 | + public Builder event(String event) { | ||
140 | + UserEventDo.this.event = event; | ||
141 | + return this; | ||
142 | + } | ||
143 | + | ||
144 | + public Builder when(LocalDateTime when) { | ||
145 | + UserEventDo.this.when = when; | ||
146 | + return this; | ||
147 | + } | ||
148 | + | ||
149 | + public Builder userId(String userId) { | ||
150 | + UserEventDo.this.userId = userId; | ||
151 | + return this; | ||
152 | + } | ||
153 | + | ||
154 | + public Builder userName(String userName) { | ||
155 | + UserEventDo.this.userName = userName; | ||
156 | + return this; | ||
157 | + } | ||
158 | + | ||
159 | + public Builder source(String source) { | ||
160 | + UserEventDo.this.source = source; | ||
161 | + return this; | ||
162 | + } | ||
163 | + | ||
164 | + public Builder createdTime(LocalDateTime createdTime) { | ||
165 | + UserEventDo.this.createdTime = createdTime; | ||
166 | + return this; | ||
167 | + } | ||
168 | + | ||
169 | + public UserEventDo build() { | ||
170 | + return UserEventDo.this; | ||
171 | + } | ||
172 | + } | ||
173 | +} |
assistant-logging/src/main/java/com/diligrp/assistant/logging/service/UserEventService.java
0 → 100644
1 | +package com.diligrp.assistant.logging.service; | ||
2 | + | ||
3 | +import com.diligrp.assistant.logging.domain.EventPageQuery; | ||
4 | +import com.diligrp.assistant.logging.domain.UserEventDTO; | ||
5 | +import com.diligrp.assistant.logging.model.UserEventDo; | ||
6 | +import com.diligrp.assistant.shared.domain.PageMessage; | ||
7 | + | ||
8 | +import java.util.List; | ||
9 | + | ||
10 | +public interface UserEventService { | ||
11 | + void insertUserEvent(UserEventDTO event); | ||
12 | + | ||
13 | + void insertUserEvents(List<UserEventDTO> events); | ||
14 | + | ||
15 | + PageMessage<UserEventDTO> listUserEvents(EventPageQuery query); | ||
16 | +} |
assistant-logging/src/main/java/com/diligrp/assistant/logging/service/impl/UserEventServiceImpl.java
0 → 100644
1 | +package com.diligrp.assistant.logging.service.impl; | ||
2 | + | ||
3 | +import com.diligrp.assistant.logging.dao.UserEventDao; | ||
4 | +import com.diligrp.assistant.logging.domain.EventPageQuery; | ||
5 | +import com.diligrp.assistant.logging.domain.UserEventDTO; | ||
6 | +import com.diligrp.assistant.logging.model.UserEventDo; | ||
7 | +import com.diligrp.assistant.logging.service.UserEventService; | ||
8 | +import com.diligrp.assistant.logging.util.UserEventConverters; | ||
9 | +import com.diligrp.assistant.shared.domain.PageMessage; | ||
10 | +import jakarta.annotation.Resource; | ||
11 | +import org.springframework.stereotype.Service; | ||
12 | +import org.springframework.transaction.annotation.Transactional; | ||
13 | + | ||
14 | +import java.time.LocalDateTime; | ||
15 | +import java.util.Collections; | ||
16 | +import java.util.List; | ||
17 | +import java.util.stream.Collectors; | ||
18 | + | ||
19 | +@Service("userEventService") | ||
20 | +public class UserEventServiceImpl implements UserEventService { | ||
21 | + | ||
22 | + @Resource | ||
23 | + private UserEventDao userEventDao; | ||
24 | + | ||
25 | + @Override | ||
26 | + @Transactional(rollbackFor = Exception.class) | ||
27 | + public void insertUserEvent(UserEventDTO event) { | ||
28 | + event.setCreatedTime(LocalDateTime.now()); | ||
29 | + userEventDao.insertUserEvent(UserEventConverters.DTO2DO.convert(event)); | ||
30 | + } | ||
31 | + | ||
32 | + @Override | ||
33 | + @Transactional(rollbackFor = Exception.class) | ||
34 | + public void insertUserEvents(List<UserEventDTO> events) { | ||
35 | + LocalDateTime now = LocalDateTime.now(); | ||
36 | + events.forEach(event -> event.setCreatedTime(now)); | ||
37 | + userEventDao.insertUserEvents(events.stream().map(UserEventConverters.DTO2DO::convert).collect(Collectors.toList())); | ||
38 | + } | ||
39 | + | ||
40 | + @Override | ||
41 | + public PageMessage<UserEventDTO> listUserEvents(EventPageQuery query) { | ||
42 | + long total = userEventDao.countUserEvents(query); | ||
43 | + List<UserEventDTO> dtos = null; | ||
44 | + | ||
45 | + if (total > 0) { | ||
46 | + dtos = userEventDao.listUserEvents(query).stream().map(UserEventConverters.DO2DTO::convert).collect(Collectors.toList()); | ||
47 | + } else { | ||
48 | + dtos = Collections.emptyList(); | ||
49 | + } | ||
50 | + | ||
51 | + return PageMessage.success(total, dtos); | ||
52 | + } | ||
53 | +} |
assistant-logging/src/main/java/com/diligrp/assistant/logging/util/UserEventConverters.java
0 → 100644
1 | +package com.diligrp.assistant.logging.util; | ||
2 | + | ||
3 | +import com.diligrp.assistant.logging.domain.UserEventDTO; | ||
4 | +import com.diligrp.assistant.logging.model.UserEventDo; | ||
5 | +import org.springframework.core.convert.converter.Converter; | ||
6 | + | ||
7 | +public final class UserEventConverters { | ||
8 | + public static final Converter<UserEventDTO, UserEventDo> DTO2DO = new DTO2DO(); | ||
9 | + | ||
10 | + public static final Converter<UserEventDo, UserEventDTO> DO2DTO = new DO2DTO(); | ||
11 | + | ||
12 | + private static class DTO2DO implements Converter<UserEventDTO, UserEventDo> { | ||
13 | + @Override | ||
14 | + public UserEventDo convert(UserEventDTO source) { | ||
15 | + return (UserEventDo) source; | ||
16 | + } | ||
17 | + } | ||
18 | + | ||
19 | + private static class DO2DTO implements Converter<UserEventDo, UserEventDTO> { | ||
20 | + @Override | ||
21 | + public UserEventDTO convert(UserEventDo source) { | ||
22 | + UserEventDTO dto = new UserEventDTO(); | ||
23 | + dto.setGroupId(source.getGroupId()); | ||
24 | + dto.setModuleId(source.getModuleId()); | ||
25 | + dto.setAction(source.getAction()); | ||
26 | + dto.setObjectId(source.getObjectId()); | ||
27 | + dto.setObjectName(source.getObjectName()); | ||
28 | + dto.setEvent(source.getEvent()); | ||
29 | + dto.setWhen(source.getWhen()); | ||
30 | + dto.setUserId(source.getUserId()); | ||
31 | + dto.setUserName(source.getUserName()); | ||
32 | + dto.setCreatedTime(source.getCreatedTime()); | ||
33 | + | ||
34 | + return dto; | ||
35 | + } | ||
36 | + } | ||
37 | +} |
assistant-logging/src/main/resources/com/diligrp/assistant/dao/mapper/UserEventDao.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8" ?> | ||
2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" | ||
3 | + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||
4 | + | ||
5 | +<mapper namespace="com.diligrp.assistant.logging.dao.UserEventDao"> | ||
6 | + <resultMap id="UserEventMap" type="com.diligrp.assistant.logging.model.UserEventDo"> | ||
7 | + <id column="id" property="id"/> | ||
8 | + <result column="group_id" property="groupId"/> | ||
9 | + <result column="module_id" property="moduleId"/> | ||
10 | + <result column="action" property="action"/> | ||
11 | + <result column="object_id" property="objectId"/> | ||
12 | + <result column="object_name" property="objectName"/> | ||
13 | + <result column="event" property="event"/> | ||
14 | + <result column="when" property="when"/> | ||
15 | + <result column="user_id" property="userId"/> | ||
16 | + <result column="user_name" property="userName"/> | ||
17 | + <result column="source" property="source"/> | ||
18 | + <result column="created_time" property="createdTime"/> | ||
19 | + </resultMap> | ||
20 | + | ||
21 | + <insert id="insertUserEvent" parameterType="com.diligrp.assistant.sms.model.SmsTemplateDo"> | ||
22 | + INSERT INTO logging_user_event | ||
23 | + (`group_id`, `module_id`, `action`, `object_id`, `object_name`, `event`, `when`, `user_id`, `user_name`, `source`, `created_time`) | ||
24 | + VALUES | ||
25 | + (#{groupId}, #{moduleId}, #{action}, #{objectId}, #{objectName}, #{event}, #{when}, #{userId}, #{userName}, #{source}, #{createdTime}) | ||
26 | + </insert> | ||
27 | + | ||
28 | + <insert id="insertUserEvents"> | ||
29 | + INSERT INTO logging_user_event | ||
30 | + (`group_id`, `module_id`, `action`, `object_id`, `object_name`, `event`, `when`, `user_id`, `user_name`, `source`, `created_time`) | ||
31 | + VALUES | ||
32 | + <foreach collection="list" item="item" separator=","> | ||
33 | + (#{item.groupId}, #{item.moduleId}, #{item.action}, #{item.objectId}, #{item.objectName}, #{item.event}, #{item.when}, #{item.userId}, #{item.userName}, #{item.source}, #{item.createdTime}) | ||
34 | + </foreach> | ||
35 | + </insert> | ||
36 | + | ||
37 | + <select id="countUserEvents" parameterType="com.diligrp.assistant.logging.domain.EventPageQuery" resultType="long"> | ||
38 | + SELECT | ||
39 | + COUNT(*) | ||
40 | + FROM | ||
41 | + logging_user_event | ||
42 | + <where> | ||
43 | + <if test="groupId != null"> | ||
44 | + AND `group_id` = #{groupId} | ||
45 | + </if> | ||
46 | + <if test="moduleId != null"> | ||
47 | + AND `module_id` = #{moduleId} | ||
48 | + </if> | ||
49 | + <if test="action != null"> | ||
50 | + AND `action` = #{action} | ||
51 | + </if> | ||
52 | + <if test="objectId != null"> | ||
53 | + AND `object_id` = #{objectId} | ||
54 | + </if> | ||
55 | + <if test="objectName != null"> | ||
56 | + AND `object_name` = #{objectName} | ||
57 | + </if> | ||
58 | + <if test="userId != null"> | ||
59 | + AND `user_id` = #{userId} | ||
60 | + </if> | ||
61 | + <if test="userName != null"> | ||
62 | + AND `user_name` = #{userName} | ||
63 | + </if> | ||
64 | + <if test="source != null"> | ||
65 | + AND `source` = #{source} | ||
66 | + </if> | ||
67 | + <if test="startTime != null"> | ||
68 | + <![CDATA[AND `when` >= #{startTime}]]> | ||
69 | + </if> | ||
70 | + <if test="endTime != null"> | ||
71 | + <![CDATA[AND `when` <= #{endTime}]]> | ||
72 | + </if> | ||
73 | + </where> | ||
74 | + </select> | ||
75 | + | ||
76 | + <select id="listUserEvents" parameterType="com.diligrp.assistant.logging.domain.EventPageQuery" resultMap="UserEventMap"> | ||
77 | + SELECT | ||
78 | + * | ||
79 | + FROM | ||
80 | + logging_user_event | ||
81 | + <where> | ||
82 | + <if test="groupId != null"> | ||
83 | + AND `group_id` = #{groupId} | ||
84 | + </if> | ||
85 | + <if test="moduleId != null"> | ||
86 | + AND `module_id` = #{moduleId} | ||
87 | + </if> | ||
88 | + <if test="action != null"> | ||
89 | + AND `action` = #{action} | ||
90 | + </if> | ||
91 | + <if test="objectId != null"> | ||
92 | + AND `object_id` = #{objectId} | ||
93 | + </if> | ||
94 | + <if test="objectName != null"> | ||
95 | + AND `object_name` = #{objectName} | ||
96 | + </if> | ||
97 | + <if test="userId != null"> | ||
98 | + AND `user_id` = #{userId} | ||
99 | + </if> | ||
100 | + <if test="userName != null"> | ||
101 | + AND `user_name` = #{userName} | ||
102 | + </if> | ||
103 | + <if test="source != null"> | ||
104 | + AND `source` = #{source} | ||
105 | + </if> | ||
106 | + <if test="startTime != null"> | ||
107 | + <![CDATA[AND `when` >= #{startTime}]]> | ||
108 | + </if> | ||
109 | + <if test="endTime != null"> | ||
110 | + <![CDATA[AND `when` <= #{endTime}]]> | ||
111 | + </if> | ||
112 | + </where> | ||
113 | + ORDER BY id DESC | ||
114 | + LIMIT #{start}, #{limit} | ||
115 | + </select> | ||
116 | +</mapper> |
scripts/dili-assistant.sql
@@ -156,3 +156,27 @@ CREATE TABLE `product_category` ( | @@ -156,3 +156,27 @@ CREATE TABLE `product_category` ( | ||
156 | KEY `idx_product_category_name` (`name`) USING BTREE, | 156 | KEY `idx_product_category_name` (`name`) USING BTREE, |
157 | KEY `idx_product_category_shortCode` (`short_code`, `py_code`) USING BTREE | 157 | KEY `idx_product_category_shortCode` (`short_code`, `py_code`) USING BTREE |
158 | ) ENGINE=InnoDB; | 158 | ) ENGINE=InnoDB; |
159 | + | ||
160 | +-- -------------------------------------------------------------------- | ||
161 | +-- 用户操作日志 | ||
162 | +-- -------------------------------------------------------------------- | ||
163 | +DROP TABLE IF EXISTS `logging_user_event`; | ||
164 | +CREATE TABLE `logging_user_event` ( | ||
165 | + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', | ||
166 | + `group_id` VARCHAR(20) COMMENT '事件分组ID', -- 按照商户/市场/店铺/卖家/业务系统等进行分组 | ||
167 | + `module_id` VARCHAR(40) NOT NULL COMMENT '系统模块ID', -- 如:订单管理/商品销售 | ||
168 | + `action` VARCHAR(20) NOT NULL COMMENT '事件动作', -- 如:新增/删除/修改/审核 | ||
169 | + `object_id` VARCHAR(20) NOT NULL COMMENT '操作对象ID', -- 事件发生的对象 | ||
170 | + `object_name` VARCHAR(40) COMMENT '操作对象', | ||
171 | + `event` VARCHAR(250) COMMENT '事件描述', -- 详细事件描述,按照需要进行拼接 | ||
172 | + `when` DATETIME NOT NULL COMMENT '发生时间', | ||
173 | + `user_id` VARCHAR(20) NOT NULL COMMENT '操作人ID', | ||
174 | + `user_name` VARCHAR(40) COMMENT '操作人', | ||
175 | + `source` VARCHAR(40) COMMENT '事件来源-IP/MAC', -- 可记录客户端IP/MAC地址/手机设备标识 | ||
176 | + `created_time` DATETIME COMMENT '创建时间', | ||
177 | + PRIMARY KEY (`id`), | ||
178 | + KEY `idx_user_event_objectId` (`object_id`) USING BTREE, | ||
179 | + KEY `idx_user_event_action` (`action`, `module_id`) USING BTREE, | ||
180 | + KEY `idx_user_event_when` (`when`) USING BTREE, | ||
181 | + KEY `idx_user_event_userId` (`user_id`) USING BTREE | ||
182 | +) ENGINE=InnoDB; |