昨天的时候我们先在网上找了测试类,测试了一下mongdb的简单使用,今天就来实地在项目中用一用
没安装mongodb的参考我上一篇文章:idea+springboot+mongodb的简单测试使用分享
其实我们初学者最好是安装一个可视化的工具,这样方便我们管理数据:
下载地址:MongoDB Compass
我们选择Msi 安装版的,然后安装。
安装完成以后就可以打开软件使用了。
默认连接我们的27017端口
说完这个,现在来说一下我的业务需求:
今日用户活跃度:登录了web产品的用户数统计
今日用户访问量:用户每打开一个网站页面就被记录1次。用户多次打开同一页面,浏览量值累计。
思路:
用户登陆了就要把用户id,用户ip,用户名字等存入t_user_login,添加一条记录;同时要在t_user_visits表插入一条记录
用户访问了就t_user_visits表插入一条记录
开始干!
1.首先在拦截器中拦截,然后获取我们需要的信息
2.将获取的信息存入MongoDB
3.然后统计人数
1>先复制出一个拦截器取名为AccessLogInterceptor,然后修改
public class AccessLogInterceptor implements HandlerInterceptor {@Autowiredprivate MongoTemplate mongoTemplate;@Autowiredprivate SysParamMapper sysParamMapper;@Autowiredprivate UserMapper userMapper;private void responseForbiddenResult( HttpServletResponse httpResponse) {try {httpResponse.setContentType("application/json;charset=UTF-8");PrintWriter pw = httpResponse.getWriter();pw.write(JSONObject.toJSONString(ResultUtil.getResult(ResultCode.FORBIDDEN)));pw.flush();} catch (IOException e) {e.printStackTrace();throw new RuntimeException(e);}}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {return true;}/*** 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)* 我们主要修改这个方法 里的代码*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {//通过request获取用户正式ipString ip = IPUtil.getIpAddress(request);HttpSession session = request.getSession();//获取用户登陆的userIDString userID = request.getSession().getAttribute(WebConstants.CURRENT_USER_ID).toString();int userId = Integer.parseInt(userID);User user = userMapper.get(userId);//判断当前URL是否为登陆的url如果是就给userLoginDoc插入一条数据if("/v1/user/login_sms".equals(request.getRequestURI())){UserLoginDoc userLoginDoc = new UserLoginDoc();userLoginDoc.setUserName(user.getUsername());userLoginDoc.setCreateTime(new Date());userLoginDoc.setLastIp(ip);userLoginDoc.setUserId(user.getUserId());mongoTemplate.save(userLoginDoc,"t_user_login");}//不管访问那个页面都要在这个UserAccessDoc插入一条数据UserAccessDoc userAccessDoc = new UserAccessDoc();userAccessDoc.setUserId(user.getUserId());userAccessDoc.setAccessUrl(request.getRequestURI());userAccessDoc.setLastIp(ip);userAccessDoc.setUserName(user.getUsername());userAccessDoc.setCreateTime(new Date());mongoTemplate.save(userAccessDoc,"t_user_visits");}/*** 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {}
}
实体类:
@Getter
@Setter
@ToString
public class UserLoginDoc implements Serializable {private Integer userId;private String userName;private Date createTime;private String lastIp;}
上面就已经存到我们的MongoDB中了,现在就要去查询总数
//获取当天0点的时间
Date morning = DateUtil.getTimesmorning();
//获取第二天0点的时间
Date times = DateUtil.getTimesnight();
int loginCount = mongoTemplate.aggregate(Aggregation.newAggregation(Aggregation.match(where("createTime").gte(morning).lte(times))),"t_user_login", BasicDBObject.class).getMappedResults().size();