SpringBoot和前端联动实现存储浏览记录功能

 更新时间:2024年01月06日 11:41:03   作者:Alkaid_slc  
这篇文章主要介绍了SpringBoot和前端联动实现存储浏览记录功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

浏览课程历史记录表 Browsing history

id varchar(32) 非空 主键索引 浏览记录主键id

course_id varchar(32) 非空 普通索引 课程id

course_name varchar(1024) 非空 课程名称

user_id varchar(32) 非空 普通索引 用户id

user_name varchar(1024) 可空 用户名称

last_viewing_time datetime 非空 最后观看时间

在关闭(跳转离开)该课程的时候,异步发请求,先使用 用户id和课程id去查这个表,看看是否存在该条记录,存在,则获取并设置最新的时间,不存在,则设置最新时间,并插入该数据

离开当前页面出发异步请求(navigator.sendBeacon原理请搜索其他博客)

$(window).on('unload', function (e) {
    // 使用navigator.sendBeacon发请求
    const blob = new Blob([JSON.stringify({ 'courseId': courseId})], { type: 'application/json; charset=UTF-8'});
    navigator.sendBeacon(url,blob)
    console.log("离开了页面");
});

后端接受请求增加浏览记录

controller.java

后端接受请求增加浏览记录
@ApiOperation("添加该用户的浏览记录")
@PostMapping("/addBrowsingHistory")
public BaseResult<String> addBrowsingHistory(@RequestBody BrowsingHistory browsingHistory) {
    if (browsingHistory.getCourseId().isEmpty()){
        throw new RuntimeException("参数错误");
    }
    String userId = super.getOperatorId();//用户id
    browsingHistory.setUserId(userId);
    //根据用户id和课程id查询是否有该记录
    browsingHistoryService.addHistory(browsingHistory);
    return getBaseResultSuccess("ok","记录成功");
} 
@ApiOperation("获取该用户的浏览记录")
@PostMapping("/getBrowsingHistory")
public BaseResult<BaseQueryPageDTO<BrowsingHistory>> getBrowsingHistory(@RequestBody BrowsingHistory browsingHistory) {
    String userId = super.getOperatorId();
    browsingHistory.setUserId(userId);
    BaseQueryPageDTO<BrowsingHistory> page = browsingHistoryService.getHistoryPage(browsingHistory);
    return getBaseResultSuccess(page,"获取浏览记录成功");
}

service.java

//添加记录
public void addHistory(BrowsingHistory browsingHistory) {
    String userId = browsingHistory.getUserId();//用户id
    String courseId = browsingHistory.getCourseId();//课程id
    LambdaQueryWrapper<BrowsingHistory> eq = new LambdaQueryWrapper<BrowsingHistory>()
            .eq(BrowsingHistory::getUserId, userId)
            .eq(BrowsingHistory::getCourseId, courseId);
    BrowsingHistory oldHistory = baseMapper.selectOne(eq);
    Date date = new Date();
    if (BeanUtil.isNotEmpty(oldHistory)){
        //有记录,更新
        oldHistory.setLastViewingTime(date);
        oldHistory.setUpdateTime(date);
        baseMapper.updateById(oldHistory);
    }else{
        //无记录,新增
        //获取用户名,课程名,插入
        LambdaQueryWrapper<Examiner> eq1 = new LambdaQueryWrapper<Examiner>().eq(Examiner::getId, userId).select(Examiner::getName);
        String userName = examinerMapper.selectOne(eq1).getName();
        LambdaQueryWrapper<CaseShare> eq2 = new LambdaQueryWrapper<CaseShare>().eq(CaseShare::getId, courseId).select(CaseShare::getCaseName);
        String courseName = caseShareMapper.selectOne(eq2).getCaseName();
        browsingHistory.setLastViewingTime(date);
        browsingHistory.setUserName(userName);
        browsingHistory.setCourseName(courseName);
        browsingHistory.setCreateTime(date);
        browsingHistory.setUpdateTime(date);
        baseMapper.insert(browsingHistory);
    }
}
//获取浏览记录,需要按照最后浏览时间查询
public BaseQueryPageDTO<BrowsingHistory> getHistoryPage(BrowsingHistory browsingHistory) {
    IPage<BrowsingHistory> page =
            new Page<>(browsingHistory.getPageNum(), browsingHistory.getPageSize());
    IPage<BrowsingHistory> iPage = baseMapper.getPage(page, BrowsingHistory);
    return new BaseQueryPageDTO<>(
            iPage.getCurrent(),
            iPage.getSize(),
            iPage.getPages(),
            iPage.getTotal(),
            iPage.getRecords()
    );
} 
public interface BrowsingHistoryMapper extends BaseMapper<BrowsingHistory> {
    IPage<BrowsingHistory> getPage(IPage<BrowsingHistory> page,@Param("entity") BrowsingHistory browsingHistory);
}
<select id="getPage" resultType="com.xxx.entity.BrowsingHistory">
    select
        csbh.id as id,
        csbh.course_id as courseId,
        csbh.course_name as courseName,
        csbh.user_id as userId,
        csbh.user_name as userName,
        csbh.last_viewing_time as lastViewingTime
    from
        case_share_browsing_history csbh
        <where>
            <if test="entity.userId != null and entity.userId !=''">
                and csbh.user_id = #{entity.userId}
            </if>
        </where>
    order by csbh.last_viewing_time desc
</select>

到此这篇关于SpringBoot和前端联动实现存储浏览记录的文章就介绍到这了,更多相关SpringBoot存储浏览记录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot2零基础到精通之数据库专项精讲

    SpringBoot2零基础到精通之数据库专项精讲

    SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架,本篇我们来学习如何连接数据库进行操作
    2022-03-03
  • SpringMVC一步到位精通拦截器

    SpringMVC一步到位精通拦截器

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器的概念及入门案例,感兴趣的可以尝试一下
    2022-12-12
  • 详解SpringMVC在IDEA中的第一个程序

    详解SpringMVC在IDEA中的第一个程序

    Spring MVC 属于Spring Framework的一部分,是一种Spring框架内置的MVC的实现。这篇文章主要介绍了SpringMVC在IDEA中的第一个程序,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Spring Boot Debug调试过程图解

    Spring Boot Debug调试过程图解

    这篇文章主要介绍了Spring Boot Debug调试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • IDEA中解决 git pull 冲突的方法

    IDEA中解决 git pull 冲突的方法

    这篇文章主要介绍了IDEA中解决 git pull 冲突的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • IDEA下因Lombok插件产生的Library source does not match the bytecode报错问题及解决方法(亲测可用)

    IDEA下因Lombok插件产生的Library source does not match the bytecode报

    这篇文章主要介绍了IDEA下因Lombok插件产生的Library source does not match the bytecode报错问题及解决方法,亲测试过好用,需要的朋友可以参考下
    2020-04-04
  • Jmeter跨线程组共享cookie过程图解

    Jmeter跨线程组共享cookie过程图解

    这篇文章主要介绍了Jmeter跨线程组共享cookie过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java算法之重新排列数组例题

    Java算法之重新排列数组例题

    这篇文章主要介绍了Java算法之重新排列数组例题,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-08-08
  • Java并发编程中的生产者与消费者模型简述

    Java并发编程中的生产者与消费者模型简述

    这篇文章主要介绍了Java并发编程中的生产者与消费者模型简述,多线程并发是Java编程中最终要的部分之一,需要的朋友可以参考下
    2015-07-07
  • springsecurity基于token的认证方式

    springsecurity基于token的认证方式

    本文主要介绍了springsecurity基于token的认证方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论