Commit a08d18d6 by 陈健智

用户操作记录

parent 26963056
...@@ -4,13 +4,18 @@ import com.alibaba.fastjson.JSON; ...@@ -4,13 +4,18 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.common.GenericAttribute; import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.dao.BehaviorDao; import com.zhiwei.brandkbs2.dao.BehaviorDao;
import com.zhiwei.brandkbs2.dao.UserLogRecordDao;
import com.zhiwei.brandkbs2.model.ResponseResult; import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.Behavior; import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.pojo.UserInfo;
import com.zhiwei.brandkbs2.pojo.UserLogRecord;
import com.zhiwei.brandkbs2.service.UserService; import com.zhiwei.brandkbs2.service.UserService;
import com.zhiwei.brandkbs2.util.Tools; import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.middleware.auth.util.JwtUtil; import com.zhiwei.middleware.auth.util.JwtUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
...@@ -24,6 +29,7 @@ import org.springframework.web.servlet.HandlerMapping; ...@@ -24,6 +29,7 @@ import org.springframework.web.servlet.HandlerMapping;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.*; import java.util.*;
...@@ -46,9 +52,12 @@ public class AopLogRecord { ...@@ -46,9 +52,12 @@ public class AopLogRecord {
@Resource(name = "behaviorDao") @Resource(name = "behaviorDao")
private BehaviorDao behaviorDao; private BehaviorDao behaviorDao;
@Resource(name = "UserLogRecordDao")
private UserLogRecordDao userLogRecordDao;
private static final List<String> URL_PATTERNS = Arrays.asList("/getNewAll", "/getNew", "/schedule"); private static final List<String> URL_PATTERNS = Arrays.asList("/getNewAll", "/getNew", "/schedule");
@AfterReturning(value = "execution(public * com..controller..admin..*Controller.*(..)) || execution(* com..controller..app..*Controller.*(..))", returning = "ResponseResult") @AfterReturning(value = "execution(public * com..controller..admin..*Controller.*(..)) || execution(* com..controller..app..*Controller.*(..)) || execution(* com..controller..LoginController.checkBind())", returning = "ResponseResult")
private void beforeLog(JoinPoint joinPoint, ResponseResult ResponseResult) throws UnknownHostException, ClassNotFoundException{ private void beforeLog(JoinPoint joinPoint, ResponseResult ResponseResult) throws UnknownHostException, ClassNotFoundException{
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
// RequestContextHolder 顾名思义 持有 request 上下文的容器 // RequestContextHolder 顾名思义 持有 request 上下文的容器
...@@ -84,7 +93,8 @@ public class AopLogRecord { ...@@ -84,7 +93,8 @@ public class AopLogRecord {
} }
String userId = userIdObj.toString(); String userId = userIdObj.toString();
String projectId = request.getHeader("pid"); String projectId = request.getHeader("pid");
String nickName = userService.queryUserInfo(userId, projectId).getNickname(); UserInfo userInfo = userService.queryUserInfo(userId, projectId);
String nickName = userInfo.getNickname();
// 请求地址和服务器地址 // 请求地址和服务器地址
String severAddress = InetAddress.getLocalHost().getHostAddress(); String severAddress = InetAddress.getLocalHost().getHostAddress();
String ipAddress = Tools.getIpAddress(request); String ipAddress = Tools.getIpAddress(request);
...@@ -92,57 +102,75 @@ public class AopLogRecord { ...@@ -92,57 +102,75 @@ public class AopLogRecord {
List<Map<String, Object>> arguments = getRequestArguments(joinPoint); List<Map<String, Object>> arguments = getRequestArguments(joinPoint);
Behavior behavior = new Behavior(userId, projectId, nickName, ipAddress, now, controller, method, backstage, Behavior behavior = new Behavior(userId, projectId, nickName, ipAddress, now, controller, method, backstage,
uri, methodName, httpMethod, arguments, now, severAddress, null); uri, methodName, httpMethod, arguments, now, severAddress, null);
setInfo(behavior, uri, joinPoint, methodSignature, arguments, ResponseResult); UserLogRecord userLogRecord = userLogRecord(projectId, userInfo, joinPoint, methodSignature, ResponseResult);
if (Objects.nonNull(userLogRecord)) {
userLogRecordDao.insertOne(userLogRecord);
}
String collectionName = behaviorDao.generateCollectionName(); String collectionName = behaviorDao.generateCollectionName();
behaviorDao.insertOneWithoutId(behavior, collectionName); behaviorDao.insertOneWithoutId(behavior, collectionName);
} }
} }
} }
/** private UserLogRecord userLogRecord(String projectId, UserInfo userInfo, JoinPoint joinPoint, MethodSignature methodSignature, ResponseResult responseResult) {
* 用户行为实体搜索关键词、渠道库渠道、事件详情事件名赋值 long now = System.currentTimeMillis();
*
* @param behavior
* @param uri
* @param joinPoint
* @param methodSignature
* @param arguments
* @param ResponseResult
*/
private void setInfo(Behavior behavior, String uri, JoinPoint joinPoint, MethodSignature methodSignature, List<Map<String, Object>> arguments, ResponseResult ResponseResult) {
String record = null;
Object[] args = joinPoint.getArgs(); Object[] args = joinPoint.getArgs();
// 搜索接口关键词记录 Method method = methodSignature.getMethod();
if (uri.contains("/app/search") && !Tools.isEmpty(args)) { // 方法上无@LogRecord注解
if (1 == arguments.size()) { if (!method.isAnnotationPresent(LogRecord.class)) {
if (!(args[0] instanceof Integer) && !(args[0] instanceof String)) { return null;
}
String prefix = method.getAnnotation(LogRecord.class).description();
// 注解上操作描述description为空或空字符
if (StringUtils.isEmpty(prefix)){
return null;
}
String[] value = method.getAnnotation(LogRecord.class).values();
// 注解value为空字符串(value使用默认值未设置)
if (1 == value.length && StringUtils.isEmpty(value[0])){
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix, userInfo.getRoleId(), now, now);
}
// 获取接口传参(value为获取传参的具体字段)并与操作描述description拼接返回,传参值为实体
if (method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity()) {
JSONObject jsonObject = (JSONObject) JSON.toJSON(args[0]); JSONObject jsonObject = (JSONObject) JSON.toJSON(args[0]);
record = Objects.nonNull(jsonObject.get("keyword")) ? String.valueOf(jsonObject.get("keyword")) : String.valueOf(jsonObject.get("search")); List<Object> res = new ArrayList<>(value.length);
for (String v : value) {
Object o = jsonObject.get(v);
if (Objects.nonNull(o)) {
res.add(o);
} }
} else { }
String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concat(res) : "";
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now);
}
// 获取接口传参(value为获取传参的具体字段)并与操作描述description拼接返回,传参值不为实体
if (method.getAnnotation(LogRecord.class).arguments() && !method.getAnnotation(LogRecord.class).entity()) {
String[] parameterNames = methodSignature.getParameterNames(); String[] parameterNames = methodSignature.getParameterNames();
List<Object> res = new ArrayList<>(value.length);
for (String v : value) {
for (int i = 0; i < parameterNames.length; i++) { for (int i = 0; i < parameterNames.length; i++) {
if (Objects.equals(parameterNames[i], "keyword")) { if (Objects.equals(parameterNames[i], v)) {
record = String.valueOf(args[i]); res.add(args[i]);
} }
} }
} }
behavior.setRecord(record); String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concat(res) : "";
return; return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now);
}
// 获取接口返回值(value为获取返回值的具体字段)并与操作描述description拼接返回,返回值为实体
if (!method.getAnnotation(LogRecord.class).arguments() && method.getAnnotation(LogRecord.class).entity()) {
List<Object> res = new ArrayList<>(value.length);
for (String v : value) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(responseResult.getData());
String s = String.valueOf(jsonObject.get(v));
if (Objects.nonNull(s)) {
res.add(s);
} }
// 渠道记录
if (uri.contains("/app/channel/baseInfo")) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(ResponseResult.getData());
record = Tools.concat(jsonObject.get("platform"), jsonObject.get("realSource"), jsonObject.get("source"));
behavior.setRecord(record);
return;
} }
// 事件标题记录 String suffix = CollectionUtils.isNotEmpty(res) ? "-" + Tools.concat(res) : "";
if (uri.contains("/app/event/detail/baseInfo")) { return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix + suffix, userInfo.getRoleId(), now, now);
JSONObject jsonObject = (JSONObject) JSON.toJSON(ResponseResult.getData());
record = String.valueOf(jsonObject.get("title"));
behavior.setRecord(record);
} }
return new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), prefix, userInfo.getRoleId(), now, now);
} }
/** /**
......
package com.zhiwei.brandkbs2.aop;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogRecord {
String[] values() default "";
String description() default "";
boolean arguments() default false;
boolean entity() default false;
}
package com.zhiwei.brandkbs2.controller; package com.zhiwei.brandkbs2.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.enmus.RoleEnum; import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult; import com.zhiwei.brandkbs2.model.ResponseResult;
...@@ -82,6 +83,7 @@ public class LoginController extends BaseController { ...@@ -82,6 +83,7 @@ public class LoginController extends BaseController {
} }
@ApiOperation("校验用户是否已有绑定关系") @ApiOperation("校验用户是否已有绑定关系")
@LogRecord(description = "登录")
@GetMapping("/user/login/checkBind") @GetMapping("/user/login/checkBind")
public ResponseResult checkBind() { public ResponseResult checkBind() {
return ResponseResult.success(userService.checkUserRoles()); return ResponseResult.success(userService.checkUserRoles());
......
...@@ -5,6 +5,7 @@ import com.zhiwei.brandkbs2.auth.UserThreadLocal; ...@@ -5,6 +5,7 @@ import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil; import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO; import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportUserLogRecordDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum; import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.ResponseResult; import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.service.BehaviorService; import com.zhiwei.brandkbs2.service.BehaviorService;
...@@ -13,10 +14,7 @@ import io.swagger.annotations.Api; ...@@ -13,10 +14,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
...@@ -77,4 +75,41 @@ public class BehaviorController extends BaseController { ...@@ -77,4 +75,41 @@ public class BehaviorController extends BaseController {
return ResponseResult.success(); return ResponseResult.success();
} }
@ApiOperation("记录用户操作记录")
@GetMapping("/logRecord/save")
public ResponseResult saveUserLogRecord(@RequestParam(value = "description") String description) {
behaviorService.saveUserLogRecord(description);
return ResponseResult.success();
}
@ApiOperation("分页查询用户操作记录列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "pageSize", value = "每页记录数", defaultValue = "10", paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "startTime", value = "开始时间", required = true, paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", required = true, paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "keyword", value = "关键词",defaultValue = "", paramType = "query", dataType = "string")
})
@GetMapping("/logRecord/list")
public ResponseResult findLogRecordList(@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "pageSize", defaultValue = "10") int pageSize,
@RequestParam("startTime") long startTime,
@RequestParam("endTime") long endTime,
@RequestParam(value = "keyword", defaultValue = "") String keyword) {
return ResponseResult.success(behaviorService.findLogRecordList(page, pageSize, startTime, endTime, keyword));
}
@ApiOperation("下载用户操作记录列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "startTime", value = "开始时间", required = true, paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", required = true, paramType = "query", dataType = "long"),
})
@GetMapping("/logRecord/download")
public ResponseResult downloadLogRecordList(@RequestParam("startTime") long startTime,
@RequestParam("endTime") long endTime) {
List<ExportUserLogRecordDTO> list = behaviorService.downloadUserLogRecord(startTime, endTime);
String sheetName = ProjectService.getProjectVOById(UserThreadLocal.getProjectId()).getProjectName() + "_操作记录";
EasyExcelUtil.download(sheetName, sheetName, ExportUserLogRecordDTO.class, list, response);
return ResponseResult.success();
}
} }
package com.zhiwei.brandkbs2.controller.app; package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil; import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
...@@ -46,6 +47,7 @@ public class AppArticleController extends BaseController { ...@@ -46,6 +47,7 @@ public class AppArticleController extends BaseController {
@ApiOperation("舆情列表") @ApiOperation("舆情列表")
@PostMapping("/mark/list") @PostMapping("/mark/list")
@LogRecord(description = "舆情库-舆情列表")
public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getYuqingMarkList(markSearchDTO)); return ResponseResult.success(markDataService.getYuqingMarkList(markSearchDTO));
} }
...@@ -107,6 +109,7 @@ public class AppArticleController extends BaseController { ...@@ -107,6 +109,7 @@ public class AppArticleController extends BaseController {
@ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "long"), @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long") @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long")
}) })
@LogRecord(description = "舆情库-舆情分析")
@GetMapping("/emotion/proportion") @GetMapping("/emotion/proportion")
public ResponseResult getMarkEmotionProportion(@RequestParam(value = "startTime", required = false) Long startTime, public ResponseResult getMarkEmotionProportion(@RequestParam(value = "startTime", required = false) Long startTime,
@RequestParam(value = "endTime", required = false) Long endTime) { @RequestParam(value = "endTime", required = false) Long endTime) {
...@@ -156,6 +159,7 @@ public class AppArticleController extends BaseController { ...@@ -156,6 +159,7 @@ public class AppArticleController extends BaseController {
@ApiOperation("舆情简报-全部报告列表") @ApiOperation("舆情简报-全部报告列表")
@GetMapping("/report/list") @GetMapping("/report/list")
@LogRecord(description = "舆情库-舆情简报")
public ResponseResult findReportList(ReportSearchDTO reportSearch) { public ResponseResult findReportList(ReportSearchDTO reportSearch) {
return ResponseResult.success(reportService.findReportList(reportSearch)); return ResponseResult.success(reportService.findReportList(reportSearch));
} }
......
package com.zhiwei.brandkbs2.controller.app; package com.zhiwei.brandkbs2.controller.app;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil; import com.zhiwei.brandkbs2.easyexcel.EasyExcelUtil;
...@@ -41,6 +42,7 @@ public class AppChannelController extends BaseController { ...@@ -41,6 +42,7 @@ public class AppChannelController extends BaseController {
@ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int"), @ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int"),
}) })
@ApiOperation("渠道库-活跃渠道榜") @ApiOperation("渠道库-活跃渠道榜")
@LogRecord(description = "渠道库-活跃渠道榜")
@GetMapping("/list/active") @GetMapping("/list/active")
public ResponseResult getActiveChannelList(@RequestParam(value = "contendId", defaultValue = "0") String contendId, public ResponseResult getActiveChannelList(@RequestParam(value = "contendId", defaultValue = "0") String contendId,
@RequestParam(value = "platform", required = false) String platform, @RequestParam(value = "platform", required = false) String platform,
...@@ -61,6 +63,7 @@ public class AppChannelController extends BaseController { ...@@ -61,6 +63,7 @@ public class AppChannelController extends BaseController {
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long"), @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int") @ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int")
}) })
@LogRecord(description = "渠道库-友好渠道榜")
@GetMapping("/list/positive") @GetMapping("/list/positive")
public ResponseResult getPositiveList(@RequestParam(value = "contendId", defaultValue = "0") String contendId, public ResponseResult getPositiveList(@RequestParam(value = "contendId", defaultValue = "0") String contendId,
@RequestParam(value = "platform", required = false) String platform, @RequestParam(value = "platform", required = false) String platform,
...@@ -82,6 +85,7 @@ public class AppChannelController extends BaseController { ...@@ -82,6 +85,7 @@ public class AppChannelController extends BaseController {
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long"), @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int") @ApiImplicitParam(name = "pageSize", value = "选取前几", defaultValue = "50", paramType = "query", dataType = "int")
}) })
@LogRecord(description = "渠道库-敏感渠道榜")
@GetMapping("/list/negative") @GetMapping("/list/negative")
public ResponseResult getNegativeList(@RequestParam(value = "contendId", defaultValue = "0") String contendId, public ResponseResult getNegativeList(@RequestParam(value = "contendId", defaultValue = "0") String contendId,
@RequestParam(value = "platform", required = false) String platform, @RequestParam(value = "platform", required = false) String platform,
...@@ -109,6 +113,7 @@ public class AppChannelController extends BaseController { ...@@ -109,6 +113,7 @@ public class AppChannelController extends BaseController {
@ApiOperation("渠道库-收藏渠道列表") @ApiOperation("渠道库-收藏渠道列表")
@ApiImplicitParams(@ApiImplicitParam(name = "contendId", value = "品牌ID", paramType = "query", dataType = "string")) @ApiImplicitParams(@ApiImplicitParam(name = "contendId", value = "品牌ID", paramType = "query", dataType = "string"))
@LogRecord(description = "渠道库-收藏渠道")
@GetMapping("/list/collect") @GetMapping("/list/collect")
public ResponseResult getCollectList(@RequestParam(value = "contendId", required = false, defaultValue = "0") String contendId) { public ResponseResult getCollectList(@RequestParam(value = "contendId", required = false, defaultValue = "0") String contendId) {
return ResponseResult.success(channelService.getCollectList(contendId)); return ResponseResult.success(channelService.getCollectList(contendId));
......
package com.zhiwei.brandkbs2.controller.app; package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
...@@ -41,12 +42,14 @@ public class AppContendController extends BaseController { ...@@ -41,12 +42,14 @@ public class AppContendController extends BaseController {
} }
@ApiOperation("竞品库-竞品舆情-搜索结果列表") @ApiOperation("竞品库-竞品舆情-搜索结果列表")
@LogRecord(description = "竞品舆情库-竞品舆情")
@PostMapping("/list") @PostMapping("/list")
public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO){ public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO){
return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO)); return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO));
} }
@ApiOperation("竞品库-竞品分析-舆情总结页面") @ApiOperation("竞品库-竞品分析-舆情总结页面")
@LogRecord(description = "竞品舆情库-竞品对比")
@PostMapping("/summary") @PostMapping("/summary")
public ResponseResult getSummary(@RequestBody MarkSearchDTO markSearchDTO) throws IOException { public ResponseResult getSummary(@RequestBody MarkSearchDTO markSearchDTO) throws IOException {
return ResponseResult.success(markDataService.getContendSummary(markSearchDTO, true)); return ResponseResult.success(markDataService.getContendSummary(markSearchDTO, true));
......
...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app; ...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
...@@ -73,6 +74,7 @@ public class AppCrisisController extends BaseController { ...@@ -73,6 +74,7 @@ public class AppCrisisController extends BaseController {
} }
@ApiOperation("危机库-危机库列表") @ApiOperation("危机库-危机库列表")
@LogRecord(description = "危机案例库")
@GetMapping("/crisisList") @GetMapping("/crisisList")
public ResponseResult crisisList(@RequestParam(value = "page",defaultValue = "1") Integer page, public ResponseResult crisisList(@RequestParam(value = "page",defaultValue = "1") Integer page,
@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize, @RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize,
......
...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app; ...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
...@@ -121,6 +122,7 @@ public class AppEventController extends BaseController { ...@@ -121,6 +122,7 @@ public class AppEventController extends BaseController {
} }
@ApiOperation("前台事件库-全网事件库-列表") @ApiOperation("前台事件库-全网事件库-列表")
@LogRecord(description = "事件库-全网事件库")
@GetMapping("/getWholeNetworkEventsList") @GetMapping("/getWholeNetworkEventsList")
public ResponseResult getWholeNetworkEventsList(@RequestParam(value = "firstType", required = false, defaultValue = "") String firstType, public ResponseResult getWholeNetworkEventsList(@RequestParam(value = "firstType", required = false, defaultValue = "") String firstType,
@RequestParam(value = "start", required = false, defaultValue = "0") long start, @RequestParam(value = "start", required = false, defaultValue = "0") long start,
...@@ -162,6 +164,7 @@ public class AppEventController extends BaseController { ...@@ -162,6 +164,7 @@ public class AppEventController extends BaseController {
} }
@ApiOperation("前台事件库-品牌事件库-获取品牌事件库事件列表") @ApiOperation("前台事件库-品牌事件库-获取品牌事件库事件列表")
@LogRecord(description = "事件库-品牌事件库")
@PostMapping("/eventList") @PostMapping("/eventList")
public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){ public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){
return ResponseResult.success(eventService.getEventListMiddleware(dto)); return ResponseResult.success(eventService.getEventListMiddleware(dto));
...@@ -174,6 +177,7 @@ public class AppEventController extends BaseController { ...@@ -174,6 +177,7 @@ public class AppEventController extends BaseController {
} }
@ApiOperation("前台事件库-事件监测-获取事件监测列表") @ApiOperation("前台事件库-事件监测-获取事件监测列表")
@LogRecord(description = "事件库-事件分析")
@GetMapping("/eventMonitor") @GetMapping("/eventMonitor")
public ResponseResult getEventMonitor(@RequestParam(value = "page", defaultValue = "1") Integer page, public ResponseResult getEventMonitor(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize){ @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize){
...@@ -219,6 +223,7 @@ public class AppEventController extends BaseController { ...@@ -219,6 +223,7 @@ public class AppEventController extends BaseController {
@ApiOperation("前台事件库-事件详情-获取事件基础信息") @ApiOperation("前台事件库-事件详情-获取事件基础信息")
@GetMapping("/detail/baseInfo") @GetMapping("/detail/baseInfo")
@LogRecord(values = "title", description = "事件库-品牌事件库", arguments = false, entity = true)
@Auth(role = RoleEnum.NO_AUTHORISE) @Auth(role = RoleEnum.NO_AUTHORISE)
public ResponseResult eventBaseInfo(@RequestParam(value = "eventId") String eventId){ public ResponseResult eventBaseInfo(@RequestParam(value = "eventId") String eventId){
return ResponseResult.success(eventService.eventBaseInfo(eventId)); return ResponseResult.success(eventService.eventBaseInfo(eventId));
......
...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app; ...@@ -2,6 +2,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.RedisKeyPrefix; import com.zhiwei.brandkbs2.common.RedisKeyPrefix;
...@@ -77,6 +78,7 @@ public class AppHotController extends BaseController { ...@@ -77,6 +78,7 @@ public class AppHotController extends BaseController {
* bilibili-ranking B站 * bilibili-ranking B站
*/ */
@ApiOperation("热点库-列表") @ApiOperation("热点库-列表")
@LogRecord(description = "热点库")
@GetMapping("/getHotList") @GetMapping("/getHotList")
public ResponseResult getHotList(@RequestParam(value = "sortType", defaultValue = "realTime") String sortType, public ResponseResult getHotList(@RequestParam(value = "sortType", defaultValue = "realTime") String sortType,
@RequestParam(value = "type", defaultValue = "weibo") String type) { @RequestParam(value = "type", defaultValue = "weibo") String type) {
......
package com.zhiwei.brandkbs2.controller.app; package com.zhiwei.brandkbs2.controller.app;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.controller.BaseController; import com.zhiwei.brandkbs2.controller.BaseController;
import com.zhiwei.brandkbs2.enmus.RoleEnum; import com.zhiwei.brandkbs2.enmus.RoleEnum;
...@@ -38,6 +39,7 @@ public class AppIndexController extends BaseController { ...@@ -38,6 +39,7 @@ public class AppIndexController extends BaseController {
@ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "long"), @ApiImplicitParam(name = "startTime", value = "开始时间", paramType = "query", dataType = "long"),
@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long") @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "long")
}) })
@LogRecord(description = "首页")
@GetMapping("/yuqing-amount") @GetMapping("/yuqing-amount")
public ResponseResult getYuqingAmount(@RequestParam(value = "startTime", required = false) Long startTime, public ResponseResult getYuqingAmount(@RequestParam(value = "startTime", required = false) Long startTime,
@RequestParam(value = "endTime", required = false) Long endTime) { @RequestParam(value = "endTime", required = false) Long endTime) {
......
...@@ -3,6 +3,7 @@ package com.zhiwei.brandkbs2.controller.app; ...@@ -3,6 +3,7 @@ package com.zhiwei.brandkbs2.controller.app;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.aop.LogRecord;
import com.zhiwei.brandkbs2.auth.Auth; import com.zhiwei.brandkbs2.auth.Auth;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.config.Constant; import com.zhiwei.brandkbs2.config.Constant;
...@@ -76,6 +77,7 @@ public class AppSearchController extends BaseController { ...@@ -76,6 +77,7 @@ public class AppSearchController extends BaseController {
ProjectService projectService; ProjectService projectService;
@ApiOperation("搜索-查热点") @ApiOperation("搜索-查热点")
@LogRecord(values = "keyword", description = "查热点", arguments = true, entity = false)
@GetMapping("/hot/list") @GetMapping("/hot/list")
public ResponseResult searchHotList(@RequestParam(value = "pageSize", defaultValue = "10") Integer limit, public ResponseResult searchHotList(@RequestParam(value = "pageSize", defaultValue = "10") Integer limit,
@RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "page", defaultValue = "1") Integer page,
...@@ -91,6 +93,7 @@ public class AppSearchController extends BaseController { ...@@ -91,6 +93,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-查危机") @ApiOperation("搜索-查危机")
@LogRecord(values = "keyword", description = "查危机", arguments = true, entity = false)
@GetMapping("/crisisSearch") @GetMapping("/crisisSearch")
public ResponseResult crisisSearch(@RequestParam(value = "page", defaultValue = "1") Integer page, public ResponseResult crisisSearch(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize, @RequestParam(value = "pageSize", defaultValue = "3") Integer pageSize,
...@@ -112,6 +115,7 @@ public class AppSearchController extends BaseController { ...@@ -112,6 +115,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-全网事件库-查事件") @ApiOperation("搜索-全网事件库-查事件")
@LogRecord(values = "keyword", description = "查事件", arguments = true, entity = false)
@GetMapping("/getWholeNetworkEvents") @GetMapping("/getWholeNetworkEvents")
public ResponseResult getWholeNetworkEvents(@RequestParam("keyword") String keyword, public ResponseResult getWholeNetworkEvents(@RequestParam("keyword") String keyword,
@RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "page", defaultValue = "1") Integer page,
...@@ -131,6 +135,7 @@ public class AppSearchController extends BaseController { ...@@ -131,6 +135,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-全网搜") @ApiOperation("搜索-全网搜")
@LogRecord(values = {"keyword", "search"}, description = "全网搜", arguments = true, entity = true)
@PostMapping("/searchWhole") @PostMapping("/searchWhole")
public ResponseResult searchWholeNetwork(@RequestBody SearchFilterDTO dto) { public ResponseResult searchWholeNetwork(@RequestBody SearchFilterDTO dto) {
// 针对商业数据库做限制 // 针对商业数据库做限制
...@@ -171,6 +176,7 @@ public class AppSearchController extends BaseController { ...@@ -171,6 +176,7 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("舆情列表") @ApiOperation("舆情列表")
@LogRecord(values = "keyword", description = "查舆情", arguments = true, entity = true)
@PostMapping("/mark/list") @PostMapping("/mark/list")
public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult getYuqingMarkList(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getYuqingMarkList(markSearchDTO)); return ResponseResult.success(markDataService.getYuqingMarkList(markSearchDTO));
...@@ -201,6 +207,7 @@ public class AppSearchController extends BaseController { ...@@ -201,6 +207,7 @@ public class AppSearchController extends BaseController {
@ApiOperation("搜索-渠道列表") @ApiOperation("搜索-渠道列表")
@LogRecord(values = "keyword", description = "查渠道", arguments = true, entity = true)
@PostMapping(value = "/channel/channelList") @PostMapping(value = "/channel/channelList")
public ResponseResult getChannelList(@RequestBody ChannelSearchDTO channelSearchDTO) { public ResponseResult getChannelList(@RequestBody ChannelSearchDTO channelSearchDTO) {
return ResponseResult.success(channelService.getChannelListNew(channelSearchDTO.getPage(), channelSearchDTO.getPageSize(), return ResponseResult.success(channelService.getChannelListNew(channelSearchDTO.getPage(), channelSearchDTO.getPageSize(),
...@@ -238,12 +245,14 @@ public class AppSearchController extends BaseController { ...@@ -238,12 +245,14 @@ public class AppSearchController extends BaseController {
} }
@ApiOperation("搜索-前台事件库-品牌事件库-新") @ApiOperation("搜索-前台事件库-品牌事件库-新")
@LogRecord(values = "keyword", description = "查事件", arguments = true, entity = true)
@PostMapping("/event/newList") @PostMapping("/event/newList")
public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){ public ResponseResult getEventListMiddleware(@RequestBody BrandkbsEventSearchDTO dto){
return ResponseResult.success(eventService.getEventListMiddleware(dto)); return ResponseResult.success(eventService.getEventListMiddleware(dto));
} }
@ApiOperation("搜索-查竞品") @ApiOperation("搜索-查竞品")
@LogRecord(values = "keyword", description = "查竞品",arguments = true, entity = true)
@PostMapping("/contend/list") @PostMapping("/contend/list")
public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO) { public ResponseResult getContendSearchList(@RequestBody MarkSearchDTO markSearchDTO) {
return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO)); return ResponseResult.success(markDataService.getContendSearchList(markSearchDTO));
......
package com.zhiwei.brandkbs2.dao;
import com.zhiwei.brandkbs2.pojo.UserLogRecord;
/**
* @ClassName: UserLogRecordDao
* @Description UserLogRecordDao
* @author: cjz
* @date: 2023-03-22 10:46
*/
public interface UserLogRecordDao extends BaseMongoDao<UserLogRecord>{
}
package com.zhiwei.brandkbs2.dao.impl;
import com.zhiwei.brandkbs2.dao.UserLogRecordDao;
import com.zhiwei.brandkbs2.pojo.UserLogRecord;
import org.springframework.stereotype.Component;
@Component("UserLogRecordDao")
public class UserLogRecordDaoImpl extends BaseMongoDaoImpl<UserLogRecord> implements UserLogRecordDao {
private static final String COLLECTION_NAME = "brandkbs_user_log_record";
public UserLogRecordDaoImpl() {
super(COLLECTION_NAME);
}
}
package com.zhiwei.brandkbs2.easyexcel.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author cjz
* @version 1.0
* @description 导出用户操作实体类
* @date 2023/03/22 14:14
*/
@Data
public class ExportUserLogRecordDTO {
@ExcelProperty("用户名")
private String nickname;
@ExcelProperty("记录")
private String description;
@ExcelProperty("操作时间")
private Date time;
@ExcelProperty("用户身份")
private String role;
}
package com.zhiwei.brandkbs2.pojo;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* @ClassName: UserLogRecord
* @Description 用户操作记录实体类
* @author: cjz
* @date: 2023-03-21 10:16
*/
@Getter
@Setter
@AllArgsConstructor
@Document(collection = "brandkbs_user_log_record")
public class UserLogRecord extends AbstractBaseMongo{
/**
* 项目id
*/
private String projectId;
/**
* 用户id
*/
private String userId;
/**
* nickname
*/
private String nickname;
/**
* 操作记录描述
*/
private String description;
/**
* 用户权限id
*/
private Integer roleId;
/**
* 创建时间
*/
private Long cTime;
/**
* 更新时间
*/
private Long updateTime;
}
package com.zhiwei.brandkbs2.service; package com.zhiwei.brandkbs2.service;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO; import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportUserLogRecordDTO;
import com.zhiwei.brandkbs2.pojo.Behavior; import com.zhiwei.brandkbs2.pojo.Behavior;
import com.zhiwei.brandkbs2.pojo.UserLogRecord;
import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO; import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO; import com.zhiwei.brandkbs2.pojo.vo.PageVO;
...@@ -46,4 +48,30 @@ public interface BehaviorService { ...@@ -46,4 +48,30 @@ public interface BehaviorService {
*/ */
List<ExportBehaviorDTO> download(long startTime, long endTime, boolean backstage); List<ExportBehaviorDTO> download(long startTime, long endTime, boolean backstage);
/**
* 记录用户操作记录
*
* @param description
*/
void saveUserLogRecord(String description);
/**
* 分页查询用户操作记录列表
*
* @param page 页码
* @param size 大小
* @param startTime 开始时间
* @param endTime 结束时间
* @param nickname 用户昵称
* @return 用户行为列表
*/
PageVO<UserLogRecord> findLogRecordList(int page, int size, long startTime, long endTime, String nickname);
/**
* 下载用户操作记录列表
* @param startTime
* @param endTime
* @return
*/
List<ExportUserLogRecordDTO> downloadUserLogRecord(long startTime, long endTime);
} }
package com.zhiwei.brandkbs2.service.impl; package com.zhiwei.brandkbs2.service.impl;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.dao.BehaviorDao; import com.zhiwei.brandkbs2.dao.BehaviorDao;
import com.zhiwei.brandkbs2.dao.UserDao; import com.zhiwei.brandkbs2.dao.UserDao;
import com.zhiwei.brandkbs2.dao.UserLogRecordDao;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO; import com.zhiwei.brandkbs2.easyexcel.dto.ExportBehaviorDTO;
import com.zhiwei.brandkbs2.easyexcel.dto.ExportUserLogRecordDTO;
import com.zhiwei.brandkbs2.enmus.RoleEnum; import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.pojo.Behavior; import com.zhiwei.brandkbs2.pojo.*;
import com.zhiwei.brandkbs2.pojo.User;
import com.zhiwei.brandkbs2.pojo.UserRole;
import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO; import com.zhiwei.brandkbs2.pojo.vo.BehaviorVO;
import com.zhiwei.brandkbs2.pojo.vo.PageVO; import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.BehaviorService; import com.zhiwei.brandkbs2.service.BehaviorService;
import com.zhiwei.brandkbs2.service.UserService;
import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.middleware.auth.util.JwtUtil;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList; import java.util.*;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -37,12 +41,21 @@ import java.util.stream.Collectors; ...@@ -37,12 +41,21 @@ import java.util.stream.Collectors;
public class BehaviorServiceImpl implements BehaviorService { public class BehaviorServiceImpl implements BehaviorService {
public static final Logger log = LogManager.getLogger(BehaviorServiceImpl.class); public static final Logger log = LogManager.getLogger(BehaviorServiceImpl.class);
@Value("${jwt.key}")
private String jwtKey;
@Resource(name = "behaviorDao") @Resource(name = "behaviorDao")
private BehaviorDao behaviorDao; private BehaviorDao behaviorDao;
@Resource(name = "userDao") @Resource(name = "userDao")
private UserDao userDao; private UserDao userDao;
@Resource(name = "UserLogRecordDao")
private UserLogRecordDao userLogRecordDao;
@Resource(name = "userServiceImpl")
private UserService userService;
@Resource(name = "mongoUtil") @Resource(name = "mongoUtil")
private com.zhiwei.brandkbs2.util.MongoUtil mongoUtil; private com.zhiwei.brandkbs2.util.MongoUtil mongoUtil;
...@@ -139,6 +152,71 @@ public class BehaviorServiceImpl implements BehaviorService { ...@@ -139,6 +152,71 @@ public class BehaviorServiceImpl implements BehaviorService {
return resList; return resList;
} }
@Override
public void saveUserLogRecord(String description) {
long now = System.currentTimeMillis();
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// 获取request对象
HttpServletRequest request = Objects.requireNonNull(requestAttributes).getRequest();
if (!(Tools.isNullOrUndefined(request.getHeader(jwtKey)))) {
Map<String, Object> map = JwtUtil.unsign(request.getHeader(jwtKey), Map.class);
if (null == map) {
return;
}
Object userIdObj = map.get(GenericAttribute.USER_ID);
// 无用户信息不做记录
if (null == userIdObj) {
return;
}
String userId = userIdObj.toString();
String projectId = UserThreadLocal.getProjectId();
UserInfo userInfo = userService.queryUserInfo(userId, projectId);
if (null == userInfo) {
return;
}
UserLogRecord userLogRecord = new UserLogRecord(projectId, userInfo.getUserId(), userInfo.getNickname(), description, userInfo.getRoleId(), now, now);
userLogRecordDao.insertOne(userLogRecord);
}
}
@Override
public PageVO<UserLogRecord> findLogRecordList(int page, int size, long startTime, long endTime, String nickname) {
String projectId = UserThreadLocal.getProjectId();
Query query = new Query();
query.addCriteria(Criteria.where("cTime").gte(startTime).lt(endTime));
query.addCriteria(Criteria.where("projectId").is(projectId));
userLogRecordDao.addSort(query, "{\"cTime\":\"descend\"}");
if (StringUtils.isNotEmpty(nickname)) {
userDao.addKeywordFuzz(query, nickname, "nickname");
}
long count = userLogRecordDao.count(query);
int skipCount = (page - 1) * size;
query.limit(size);
query.skip(skipCount);
List<UserLogRecord> resList = userLogRecordDao.findList(query);
return PageVO.createPageVo(count, page, size, resList);
}
@Override
public List<ExportUserLogRecordDTO> downloadUserLogRecord(long startTime, long endTime) {
String projectId = UserThreadLocal.getProjectId();
Query query = new Query();
query.addCriteria(Criteria.where("cTime").gte(startTime).lt(endTime));
query.addCriteria(Criteria.where("projectId").is(projectId));
userLogRecordDao.addSort(query, "{\"cTime\":\"descend\"}");
List<UserLogRecord> logRecordList = userLogRecordDao.findList(query);
List<ExportUserLogRecordDTO> resList = new ArrayList<>(logRecordList.size());
logRecordList.forEach(record -> {
ExportUserLogRecordDTO dto = new ExportUserLogRecordDTO();
dto.setNickname(record.getNickname());
dto.setDescription(record.getDescription());
dto.setTime(new Date(record.getCTime()));
dto.setRole(RoleEnum.getNameByState(record.getRoleId()));
resList.add(dto);
});
return resList;
}
private Integer getRoleId(String userId, String projectId) { private Integer getRoleId(String userId, String projectId) {
User user = userDao.findOneById(userId); User user = userDao.findOneById(userId);
Integer roleId = -1; Integer roleId = -1;
......
...@@ -521,6 +521,21 @@ public class Tools { ...@@ -521,6 +521,21 @@ public class Tools {
return resultStr.substring(0, resultStr.length() - 1); return resultStr.substring(0, resultStr.length() - 1);
} }
/**
* 拼接字符串,以_隔开
*
* @param objects 可变参数
* @return 拼接后的字符串
*/
public static String concat(List<Object> objects) {
StringBuilder sb = new StringBuilder();
for (Object obj : objects) {
sb.append(obj).append(Constant.DEFAULT_SEPARATOR);
}
String resultStr = sb.toString();
return resultStr.substring(0, resultStr.length() - 1);
}
public static String[] split(String concatStr) { public static String[] split(String concatStr) {
return concatStr.split(Constant.DEFAULT_SEPARATOR); return concatStr.split(Constant.DEFAULT_SEPARATOR);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment