简单收藏功能的实现(SpringBoot,MybatisPlus,Vue)

这篇具有很好参考价值的文章主要介绍了简单收藏功能的实现(SpringBoot,MybatisPlus,Vue)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  现在涉及到应用或者网站开发的东西,都少不了收藏功能,我本人在做一个新手项目时也需要这个功能,于是我就通过自己的想法实现了一个简单的收藏功能,下面分享给大家,希望对大家思路有帮助。

目录

整体思路

数据库表的设计

收藏与取消收藏功能

查询用户的所有收藏功能


整体思路

  首先是数据库表的设计,这里准备用两个表,一个是课程内容的表,一个是专门用来收藏的表,我们在收藏的同时给课程表的选择人数加一,并且在收藏表里新增一条相关内容,用课程id这个字段将两张表联系起来。

数据库表的设计

课程表:

public class Course {
    @TableId(type = IdType.AUTO)
    private int id;
    private String courseName;
    private String courseCover;
    private String courseVip;
    private String courseAge;
    private String courseAdmin;
    private long peopleNumber;
}

收藏表:

public class Collect {
    @TableId(type = IdType.AUTO)
    private int id;
    private int userId;
    private int courseId;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date collectDate;
}

这是我的持久层相关代码,也就是与数据库的表相对应的工具类,大家可以参考,收藏表里的courseId就对应课程表里的id。

收藏与取消收藏功能

首先需要在前端绑定一个点击事件方法:

collect(id) {
      this.$confirm('是否确定收藏课程?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(
          () => {
            this.$axios.post("/collect/course",{
              courseId: id,
              userId: 1,
            }).then(res => {
              if (res && res.status === 200) {
                this.isCollect = true;
                this.$message({
                  type: 'success',
                  message: '已收藏成功'
                })
              }
            })
          }
      )
    },

这里我们将相应的课程id与用户id发送到后端,然后进行收藏表字段的增添和人数增加就行,然后里面有一个属性叫isCollect是用于判断是否收藏的,后面用于前端图标的显示。

然后是Controller接口的编写:

@PostMapping("/course")
    public Result collectCourse(@RequestBody CollectDTO collect){
        try {
            collectService.collectCourse(collect);
            courseService.collectCourse(collect.getCourseId());
            return R.success();
        }
        catch (Exception e){
            e.printStackTrace();
            return R.fail("上传失败");
        }
    }

这里需要调用两个service,因为我们既需要在收藏表里增添,也需要在课程表里增加收藏人数。

Service层代码在MyBatis Plus的加持下很简单:

//收藏课程
    @Override
    public void collectCourse(CollectDTO collect) {
        Collect newCollect = new Collect();
        newCollect.setCourseId(collect.getCourseId());
        newCollect.setUserId(collect.getUserId());
        newCollect.setCollectDate(new Date());
        collectMapper.insert(newCollect);
    }

增加人数我们将相应的课程字段取出,然后数量加一再进行更新就行

//收藏使课程选择人数加一
    @Override
    public void collectCourse(int id) {
        Course course = courseMapper.selectById(id);
        long a = courseMapper.selectById(id).getPeopleNumber();
        a=a+1;
        course.setPeopleNumber(a);
        courseMapper.updateById(course);
    }

取消收藏也是同样的道理,大家可以尝试自己编写。

然后是前端页面加载时判断是否收藏,这里我们可以用到Vue的v-if和v-else:

<!--          已收藏  如果iscollect为true显示已收藏,绑定取消收藏功能-->
      <el-button class="button" v-if="isCollect" @click.prevent="delCollect(course.id)" circle><i class="el-icon-star-on"/></el-button>
      <!--          未收藏  绑定点击收藏按钮-->
      <el-button class="button" v-else @click.prevent="collect(course.id)" circle><i class="el-icon-star-off"/></el-button>

这里就与我们刚刚的收藏功能属性相关联了,如果收藏了我们属性设置为true,如果没有收藏则设置为false。

现在我们需要在加载页面时就判断是否收藏了当前课程,需要在前端编写一个方法:

api() {
      return [
        axios.get("/course/selectCourse",{
          params: {
            id: this.$route.query.id,
          }
        }),
        axios.get("/collect/isCollect",{
          params: {
            courseId: this.$route.query.id,
            userId: 1
          }
        })
      ]
    },
    loadCourse () {
      axios.all(this.api()).then(axios.spread((res1,res2) => {
        this.course = res1.data
        console.log(this.course);
        if(res2.data.hasOwnProperty('id')){
          this.isCollect = true;
        }
      }))
    },

这里我用到了axios的并发请求,因为需要取到课程数据渲染到页面的同时判断是否收藏,判断收藏时我们需要向后端发送userId和courseId两个字段同时比对才能判断出是否收藏,如果收藏了就返回相应的数据,没有收藏的话就会返回空,这里我们就取其中的id属性判断是否存在就行(isCollect默认为false)。

判断收藏的Controller很简单,直接调用collectService就行

@GetMapping("/isCollect")
    public Collect isCollect(int userId,int courseId){
        return collectService.isCollect(userId,courseId);
}

然后是service层代码:

//通过两个字段判断用户是否收藏
    @Override
    public Collect isCollect(int userId, int courseId) {
        LambdaQueryWrapper<Collect> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Collect::getUserId,userId).eq(Collect::getCourseId,courseId);
        return collectMapper.selectOne(wrapper);
    }

直接使用MyBatis Plus的相关功能进行比对就行,很方便,以上就是简易的收藏功能。

查询用户的所有收藏功能

这个问题最开始非常困扰我,因为我也是第一次做,我这样实现的收藏功能如果要查看一个用户的所有收藏的话我需要先从收藏表里将所有的课程id查询出来,再用这些id去课程表里面查询,查询出来还需要是Page类型,因为方便前端布局,好在最后实现了想法。

首先是前端页面编写一个初始加载方法,将用户的id以及页码和当页大小传给后端:

methods: {
    load() {
      axios.get('/collect/view',{
        params: {
          userId: 1,
          page: 1,
          size: this.size
        }
      }).then(
          res => {
            this.courses = res.data.records
            this.total = res.data.total
            console.log(this.courses)
          }
      )
    },
    handleCurrentChange(page) {
      axios.get('/course/view?',{
        params: {
          userId: 1,
          page: page,
          size: this.size
        }
      }).then(
          res => {
            this.courses = res.data.records
            this.total = res.data.total
            console.log(this.courses)
          }
      )
    }
  },
  created() {
    this.load()
  },

分页的地方我用了element-ui的分页工具。

然后是Controller的编写:

@GetMapping("/view")
    public Page<Course> view(int userId,int page, int size) {
        List<Collect> collects = collectService.view(userId);
        return courseService.selectCollect(collects,page,size);
    }

这里我先用list将收藏表的相关对象查询后放在里面,然后再遍历这个list来进行查询相关课程

collectService:

//找出收藏的书籍
    @Override
    public List<Collect> view(int userId) {
        LambdaQueryWrapper<Collect> wrapper = new LambdaQueryWrapper<>();
        List<Collect> collects = collectMapper.selectList(wrapper.eq(Collect::getUserId,userId));
        return collects;
    }

courseService:

//遍历list获取书籍信息再修改为page类型
    @Override
    public Page<Course> selectCollect(List<Collect> collects,int pageNum,int pageSize) {
        List<Course> list = new ArrayList<>();
        for(int i=0;i<collects.size();i++){
            Collect c = collects.get(i);
            list.add(courseMapper.selectById(c.getCourseId()));
        }
        System.out.println(list);
        Page<Course> page = new Page<>(pageNum, pageSize);
        int start = (int)((page.getCurrent() - 1) * page.getSize());
        // 当前页最后一条数据在List中的位置
        int end = (int)((start + page.getSize()) > list.size() ? list.size() : (page.getSize() * page.getCurrent()));
        page.setRecords(new ArrayList<>());
        if (page.getSize()*(page.getCurrent()-1) <= page.getTotal()) {
            // 分隔列表 当前页存在数据时 设置
            page.setRecords(list.subList(start, end));
        }
        page.setTotal(list.size());
        return page;
    }

这里我没有想到直接查询成为Page类型的方法所以我先一个个查询之后放入list里面再将list转化为page。

以上就是简单收藏功能的实现,方法肯定不是最好的,但是思路希望对大家有帮助,需要源码可以私。

VX公众号 loquat分享站,回复 收藏 获取源码文章来源地址https://www.toymoban.com/news/detail-400352.html

到了这里,关于简单收藏功能的实现(SpringBoot,MybatisPlus,Vue)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue+Websocket<简单实现聊天功能>

    此篇文章是针对 Websocket 的简单了解和应用,利用 Nodejs 简单搭建一个服务器加以实现。 首先创建一个 vue 项目,会vue的我就不必多说了; 然后再创建一个 server 文件夹,在终端上打开该文件夹,输入 vue init (一直敲 \\\"回车\\\" 键),最后再建一个 server.js 文件,如下图 代码如下

    2023年04月22日
    浏览(42)
  • Springboot + Websocket的集成实现简单的聊天室功能

    WebSocket是一种网络通信协议,它可以在单个TCP连接上实现双向(全双工)通信。WebSocket使用HTML5标准,并且可以在客户端和服务器之间建立持久连接,这意味着连接在浏览器刷新或关闭后仍然保持打开状态。 WebSocket的主要优点包括: 1. 双向通信:WebSocket支持客户端和服务器之

    2024年03月21日
    浏览(47)
  • springboot项目实现导出pdf功能,这也太简单了吧

    在现代Web应用程序中,导出数据为PDF格式是一项常见需求。本文将详细介绍如何使用Spring Boot框架和iText库实现导出PDF功能。首先,我们会添加必要的依赖项,并创建一个PDF生成类来设置内容、样式和格式。然后,我们会在控制器中调用该类,并使用HTTP响应返回导出的PDF文件。最后,我们会提供代码示例和常见的PDF处理操作,以帮助你灵活地扩展和自定义导出的PDF文件。通过按照本文的步骤,你将能够简单地集成导出PDF功能到你的Spring Boot项目中。

    2024年02月07日
    浏览(60)
  • Vue+SpringBoot实现评论功能

    评论系统相信大家并不陌生,在社交网络相关的软件中是一种常见的功能。然而对于初学者来说,实现一个完整的评论系统并不容易。本文笔者以 Vue+SpringBoot 前后端分离的架构细说博客评论功能的实现思路。 对于一个评论系统主要包含评论人,评论时间,评论内容,评论回

    2023年04月08日
    浏览(49)
  • MyBatisPlus实现多租户功能

    前言 :多租户是一种软件架构技术,在多用户的环境下,共有同一套系统,并且要注意数据之间的隔离性。 1.1、SaaS多租户  SaaS,是Software-as-a-Service的缩写名称,意思为软件即服务,即通过网络提供软件服务。  SaaS平台供应商将应用软件统一部署在自己的服务器上,客户可

    2024年02月10日
    浏览(40)
  • SpringBoot+Vue实现文件上传功能

    目录 1.后端代码部分: 2.前端代码部分 3.效果展示 1.后端代码部分: 2.前端代码部分 3.效果展示      

    2024年02月12日
    浏览(52)
  • vue表格实现一个简单的合并单元格功能

    用的是vue2+ant-design-vue 但是vue3或者element-ui也是同理 先上效果 需要后端的数据将相同id的放在一起 否则也会有问题 例如:

    2024年02月11日
    浏览(51)
  • SpringBoot+Vue实现一个系统登录功能

    1. 创建一个Spring Boot项目,添加Web和Security依赖。 2. 创建一个User实体类,用于存储用户信息。 3. 创建一个UserDetailsService接口的实现类,用于加载用户信息。 4. 创建一个WebSecurityConfig类,继承WebSecurityConfigurerAdapter,并重写configure方法,配置SpringSecurity。 5. 在Vue项目中创建一个

    2024年01月15日
    浏览(36)
  • vue+springboot登录与注册功能的实现

     大致效果: 在component目录下新建一个ValidCode.vue: 在登录页引入:  效果图(可以看到多了验证码): 首先准备数据库:  用IDEA创建springboot工程: 创建springboot教程 连接数据库: application.yml: 目录结构: 按照该目录创建文件夹  CorsConfig:解决跨域问题 Result:返回数据

    2024年02月19日
    浏览(40)
  • SpringBoot+Vue 实现图片验证码功能需求

    文章底部有个人公众号: 热爱技术的小郑 。主要分享开发知识、有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 写过验证码保存到Redis中的需求开发、也写过验证码调用第三方接口直接发送到手机的需求开

    2024年02月14日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包