上一篇文章已经通过在Ubuntu上安装MongoDB详细介绍了MongoDB的各种命令用法。
Ubuntu上安装、使用MongoDB详细教程 https://blog.csdn.net/heyl163_/article/details/133781878
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)
使用Navicat连接MongoDB
推荐一款非常简单实用的数据库连接工具Navicat Premium https://blog.csdn.net/heyl163_/article/details/132111378
https://blog.csdn.net/heyl163_/article/details/132111378
好了,文章就分享到这里了,看完不要忘了点赞+收藏哦~
springboot整合mongodb案例项目 https://gitee.com/muyu-chengfeng/springboot-mongodb.git
https://gitee.com/muyu-chengfeng/springboot-mongodb.git



















