上一篇文章已经通过在Ubuntu上安装MongoDB详细介绍了MongoDB的各种命令用法。
Ubuntu上安装、使用MongoDB详细教程https://blog.csdn.net/heyl163_/article/details/133781878
这篇文章介绍一下在windows上安装MongoDB,并通过在springboot项目中使用MongoDB记录用户操作的日志~
目录
一、安装MongoDB
第一步:开始安装流程
第二步:勾选接受条款
第三步:选择安装路径
第四步:安装为本地服务
第五步:不安装Compass
最后一步:点击安装编辑
二、springboot整合MongoDB
第一步:添加MongoDB的依赖
第二步:配置数据库信息
第三步:使用MongoTemplate
三、MongoDB实战
第一步:创建MongoDB实体类
第二步:创建AOP类
一、安装MongoDB
通过以下网盘链接下载MongoDB
链接:https://pan.baidu.com/s/19W4k3QURjw9YzVAqbPoQ2A?pwd=m4lh
提取码:m4lh
复制这段内容后打开百度网盘手机App,操作更方便哦
第一步:开始安装流程
双击下载下来的安装包,开始拉起安装流程
第二步:勾选接受条款
第三步:选择安装路径
第四步:安装为本地服务
第五步:不安装Compass
最后一步:点击安装
二、springboot整合MongoDB
第一步:添加MongoDB的依赖
springboot有整合了MongoDB的依赖,直接在项目的pom.xml中引入,版本和springboot版本一致
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
第二步:配置数据库信息
spring:
data:
mongodb:
port: 27017
host: 127.0.0.1
database: mhxysy
第三步:使用MongoTemplate
springboot测试类
package cn.edu.sgu.www.mhxysy;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import java.util.List;
/**
* springboot测试类
* @author heyunlin
* @version 1.0
*/
@SpringBootTest
class MhxysyTests {
private final MongoTemplate mongoTemplate;
@Autowired
MhxysyTests(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
@Test
void contextLoads() {
boolean exists = mongoTemplate.collectionExists(MongoDBCollectionKeys.KEY_mhxysy);
if (!exists) {
mongoTemplate.createCollection(MongoDBCollectionKeys.KEY_mhxysy);
} else {
List<Object> list = mongoTemplate.findAll(Object.class);
System.out.println(list);
}
}
}
MongoDBCollectionKeys接口
package cn.edu.sgu.www.mhxysy.consts;
/**
* MongoDB集合名称常量接口
* @author heyunlin
* @version 1.0
*/
public interface MongoDBCollectionKeys {
/**
* 集合后缀
*/
String suffix = "_operateLogs";
/**
* mhxysy服务的MongoDB集合名称
*/
String KEY_mhxysy = "mhxysy" + suffix;
/**
* authority服务的MongoDB集合名称
*/
String KEY_authority = "authority" + suffix;
}
三、MongoDB实战
使用AOP的环绕通知,把系统的访问日志保存到MongoDB中。
第一步:创建MongoDB实体类
package cn.edu.sgu.www.mhxysy.aop;
import cn.edu.sgu.www.mhxysy.consts.MongoDBCollectionKeys;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
/**
* @author heyunlin
* @version 1.0
*/
@Data
@Document(collection = MongoDBCollectionKeys.KEY_mhxysy)
public class OperateLog implements Serializable {
private static final long serialVersionUID = 18L;
/**
* 编号
*/
private String id;
/**
* 访问用户编号
*/
private String userId;
/**
* 访问用户名称
*/
private String username;
/**
* IP地址
*/
private String ip;
/**
* 操作url
*/
private String operateUrl;
/**
* 操作名称
*/
private String operateName;
/**
* 浏览器类型
*/
private String browserType;
/**
* 请求参数
*/
private String requestParams;
/**
* 操作时间
*/
private String operateTime;
}
第二步:创建AOP类
package cn.edu.sgu.www.mhxysy.aop;
import cn.edu.sgu.www.mhxysy.config.property.SystemSettingsProperties;
import cn.edu.sgu.www.mhxysy.consts.IdentifierPrefixes;
import cn.edu.sgu.www.mhxysy.redis.RedisUtils;
import cn.edu.sgu.www.mhxysy.util.*;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
/**
* @author heyunlin
* @version 1.0
*/
@Slf4j
@Aspect
@Component
public class LogAop {
private final RedisUtils redisUtils;
private final MongoTemplate mongoTemplate;
private final SystemSettingsProperties systemSettingsProperties;
@Autowired
public LogAop(RedisUtils redisUtils, MongoTemplate mongoTemplate, SystemSettingsProperties systemSettingsProperties) {
this.redisUtils = redisUtils;
this.mongoTemplate = mongoTemplate;
this.systemSettingsProperties = systemSettingsProperties;
}
@Pointcut("execution(public * cn.edu.sgu.www.mhxysy.controller..*.*(..))")
public void logAop() { }
@Around("logAop()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
HttpServletRequest request = HttpUtils.getRequest();
String requestURI = request.getRequestURI();
// 开启日志才保存
if (systemSettingsProperties.isEnableLog()) {
Object[] args = joinPoint.getArgs();
String requestArgs = null;
if (args != null && args.length > 0) {
requestArgs = Arrays.toString(joinPoint.getArgs());
log.debug("操作资源参数:{} => {}", requestURI, requestArgs);
}
// 获取方法签名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
// 获取方法上的@ApiOperation注解
ApiOperation annotation = signature.getMethod().getDeclaredAnnotation(ApiOperation.class);
/*
* 保存日志到MongoDB
*/
OperateLog operateLog = new OperateLog();
operateLog.setId(uuid());
boolean isLogin = UserUtils.getSubject().isAuthenticated();
if (isLogin) {
operateLog.setUserId(UserUtils.getUserId());
operateLog.setUsername(UserUtils.getLoginUsername());
}
operateLog.setIp(IpUtils.getIp());
operateLog.setBrowserType(IpUtils.getBrowserType());
operateLog.setOperateUrl(requestURI);
operateLog.setRequestParams(requestArgs);
operateLog.setOperateTime(StringUtils.toTimeString(TimeUtils.now()));
operateLog.setOperateName(annotation.value());
mongoTemplate.save(operateLog);
//mongoTemplate.save(operateLog, MongoDBCollectionKeys.KEY_mhxysy);
}
return joinPoint.proceed();
}
private String uuid() {
return IdentifierPrefixes.PREFIX_OPERATE_LOG + redisUtils.uuid();
}
}
SystemSettingsProperties是自己定义的配置类的映射类
package cn.edu.sgu.www.mhxysy.config.property;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author heyunlin
* @version 1.0
*/
@Data
@ApiModel
@Component
@ConfigurationProperties(prefix = "system.settings")
public class SystemSettingsProperties {
/**
* 百度地图的应用AK
*/
@ApiModelProperty(value = "应用AK")
private String ak;
/**
* 百度地图sn校验的SK
*/
@ApiModelProperty(value = "校验SK")
private String sk;
/**
* 时区ID
*/
@ApiModelProperty(value = "时区ID")
private String zoneId;
/**
* 是否开启日志
*/
@ApiModelProperty(value = "是否开启日志")
private boolean enableLog;
/**
* session过期时间
*/
@ApiModelProperty(value = "session过期时间")
private Long sessionTimeout;
/**
* 是否使用真实地理位置
*/
@ApiModelProperty(value = "是否使用真实地理位置")
private boolean useRealLocation;
/**
* 是否开启鉴权
*/
@ApiModelProperty(value = "是否开启鉴权")
private boolean enableAuthorization;
/**
* 是否自动创建表
*/
@ApiModelProperty(value = "是否自动创建表")
private boolean enableTableAutoCreation;
/**
* 是否开启actuator端点的鉴权
*/
@ApiModelProperty(value = "是否开启actuator端点的鉴权")
private boolean enableActuatorAuthorization;
}
MongoTemplate有两个重载的save()方法
public class MongoTemplate implements MongoOperations, ApplicationContextAware, IndexOperationsProvider {
@Override
public <T> T save(T objectToSave) {
Assert.notNull(objectToSave, "Object to save must not be null!");
return save(objectToSave, getCollectionName(ClassUtils.getUserClass(objectToSave)));
}
@Override
@SuppressWarnings("unchecked")
public <T> T save(T objectToSave, String collectionName) {
Assert.notNull(objectToSave, "Object to save must not be null!");
Assert.hasText(collectionName, "Collection name must not be null or empty!");
AdaptibleEntity<T> source = operations.forEntity(objectToSave, mongoConverter.getConversionService());
return source.isVersionedEntity() //
? doSaveVersioned(source, collectionName) //
: (T) doSave(collectionName, objectToSave, this.mongoConverter);
}
}
当MongoDB的实体类上通过@Document的collection属性指定了集合名称时,使用第一个单参数save()方法即可。
如果没有指定collection属性,则使用第二个save()方法指定将当前数据保存在哪个集合。
@Document(collection = MongoDBCollectionKeys.KEY_mhxysy)
好了,文章就分享到这里了,看完不要忘了点赞+收藏哦~
springboot整合mongodb案例项目https://gitee.com/muyu-chengfeng/springboot-mongodb.git