在若依框架上开发查询用户累计登录天数功能

2024-08-28 23:36

本文主要是介绍在若依框架上开发查询用户累计登录天数功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

在现代Web应用开发中,用户体验至关重要。其中一个重要的方面就是用户的活跃度管理,其中累计登录天数是一个衡量用户活跃程度的重要指标。本文将详细介绍如何在一个基于若依框架的应用中实现查询用户累计登录天数的功能,并且确保查询条件符合当前登录用户的信息、登录类型相同(登录、登出)以及状态正常。

二、背景知识

在开始之前,我们需要了解一些基础知识:

  • 若依框架:这是一个基于Spring Boot的后台管理系统框架,它提供了丰富的组件和工具来快速搭建后端服务。
  • MyBatis Plus:这是MyBatis的一个扩展插件,简化了常见的CRUD操作,并提供了强大的Lambda表达式支持。
  • Spring Security:一个为Spring应用程序提供安全性的框架,用于认证和授权。
三、技术栈
  • 后端:Java + Spring Boot
  • 数据持久层:MyBatis Plus
  • 安全框架:Spring Security
四、实现步骤
  1. 定义登录日志实体类

    假设我们已经有了一个LoginLogDO实体类,它至少包含以下字段:

    public class LoginLogDO implements Serializable {private static final long serialVersionUID = 1L;private String username;private Integer type;private Integer status;private LocalDate loginDate; // 登录日期// getter 和 setter 方法
    }
    

    这里我们假设loginDate字段已经是一个LocalDate类型,这样可以直接用于日期比较,无需额外转换。

  2. 创建登录日志数据访问层

    在若依框架中,我们可以利用MyBatis Plus提供的BaseMapper接口来创建一个登录日志的数据访问层:

    @Mapper
    public interface LoginLogMapper extends BaseMapper<LoginLogDO> {// 自定义方法
    }
    
  3. 编写业务逻辑

    接下来,我们需要在服务层编写一个方法来计算累计登录天数。这个方法将利用MyBatis Plus的查询功能来获取所有符合条件的登录日志,并计算不重复的登录日期数量。

    @Service
    public class LoginLogService {@Autowiredprivate LoginLogMapper loginLogMapper;@Autowiredprivate SecurityHelper securityHelper;/*** 计算用户的累计登录天数* @return 累计登录天数*/public long calculateLoginDaysCount() {String currentUser = securityHelper.getUsername();// 构建查询条件Wrapper<LoginLogDO> countWrapper = Wrappers.<LoginLogDO>lambdaQuery().eq(LoginLogDO::getUsername, currentUser) // 当前登录用户.eq(LoginLogDO::getType, LoginConstants.TYPE_LOGIN) // 登录或登出类型.eq(LoginLogDO::getStatus, CommonYNEnum.Y.integerVal()); // 状态正常// 获取所有符合条件的日志记录List<LoginLogDO> loginLogs = loginLogMapper.selectList(countWrapper);// 提取并去重登录日期return loginLogs.stream().map(LoginLogDO::getLoginTime).map(date -> date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()).distinct().count();}
    }
    
  4. 添加安全辅助类

    SecurityHelper 是一个帮助类,用于获取当前登录的用户名。这里假设它有一个静态方法 getUsername() 来获取用户名。

    public class SecurityHelper {public static String getUsername() {Authentication authentication = SecurityContextHolder.getContext().getAuthentication();if (authentication == null || !authentication.isAuthenticated()) {throw new RuntimeException("未认证");}return authentication.getName();}
    }
    
  5. 定义常量和枚举

    • LoginConstants.TYPE_LOGINLoginConstants.TYPE_LOGOUT:分别代表登录和登出类型的常量值。
    • CommonYNEnum.Y.integerVal():表示“是”的枚举值,通常用来表示成功的状态。
    public class LoginConstants {public static final int TYPE_LOGIN = 1;public static final int TYPE_LOGOUT = 2;
    }public enum CommonYNEnum {Y(1), N(0);private int integerVal;CommonYNEnum(int integerVal) {this.integerVal = integerVal;}public int integerVal() {return integerVal;}
    }
    
  6. 测试功能

    在完成以上步骤后,可以通过单元测试或集成测试来验证该功能是否正确工作。

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class LoginLogServiceTest {@Autowiredprivate LoginLogService loginLogService;@Testpublic void testCalculateLoginDaysCount() {long loginDaysCount = loginLogService.calculateLoginDaysCount();System.out.println("累计登录天数: " + loginDaysCount);// 断言或其他验证}
    }
    
五、注意事项
  • 日期类型:确保 getLoginDate 方法返回的是 LocalDate 类型的对象,以便于后续的日期处理。如果返回的是 java.util.DateLocalDateTime,则需要调整日期转换的方式。
  • 异常处理:处理可能出现的异常情况,例如数据库查询失败等。可以使用 try-catch 块或者 @ExceptionHandler 注解来捕获并处理异常。
  • 性能优化:对于大数据量的系统,可以考虑使用索引来加速查询,或者采用分页查询的方式减少单次查询的数据量。
  • 安全性:确保只有经过身份验证的用户才能调用此服务方法,并且只能查询自己的登录记录。
六、总结

通过上述步骤,我们可以在基于若依框架的应用中实现一个简单的用户累计登录天数的查询功能。

这篇关于在若依框架上开发查询用户累计登录天数功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116209

相关文章

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分