极简Springboot+Mybatis-Plus+Vue零基础萌新都看得懂的分页查询(富含前后端项目案例)

news2024/11/16 10:16:53

目录

springboot配置相关

依赖配置

yaml配置

 MySQL创建与使用

(可拿软件包+项目系统)

创建数据库

创建数据表

mybatis-plus相关

 Mapper配置

​编辑

启动类放MapperScan

启动类中配置

添加config配置文件

Springboot编码

实体类

mapperc(Dao)层

Service层

Sevice接口

Controller层

vue相关

界面展现

代码展现

解决跨域问题

config包中添加一个跨域请求允许


springboot配置相关

依赖配置

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.7</version>
        </dependency>

     
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
    </dependencies>

yaml配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/你的数据库名字?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    username: 你的数据库账号
    password: 你的数据库密码
  
mybatis-plus:
  configuration:
    #这个配置会将执行的sql打印出来,在开发或测试的时候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    call-setters-on-nulls: true
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0
      id-type: auto #ID自增
  

 MySQL创建与使用

(可拿软件包+项目系统)

Navicat软件那些数据库软件(公棕号 wmcode 自取) 随便搞个数据表

我这里就以日记系统(需要可以点进去看看)为例吧、

创建数据库

创建数据表

这里插个题外话,就是数据库有数据 删除部分之后 索引还是递增的解决方法

MySQL | 恢复数据表内的索引为初始值1(有兴趣点击查看)


mybatis-plus相关

(可以去官网复制也行)

MyBatis-Plus 🚀 为简化开发而生

 Mapper配置

继承Mybatis-Plus的接口

启动类放MapperScan

复制Mapper文件夹路径

启动类中配置

添加config配置文件

创建一个config包并创建类名任意,这里以官网给的为例

@Configuration

//这里启动类有的话 就不用写了 完全可以删了
@MapperScan("scan.your.mapper.package") 

public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {

        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

         // 这里一定要选好数据库类型
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        return interceptor;
    }
}

Springboot编码

实体类

package com.diarysytem.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@TableName("diary")
public class Diary {

    @TableField(value = "diary_pid")
    private Integer tasksPid;

    @TableField(value = "diary_title")
    private String diaryTitle;

    @TableField(value = "diary_content")
    private String diaryContent;

    @TableField(value = "diary_mood")
    private double diaryMood;

    @TableField(value = "diary_body")
    private double diaryBody;

    @TableField(value = "diary_time")
    private String diaryTime;

    @TableField(value = "diary_delete")
    private int diaryDelete;


}

mapperc(Dao)层

package com.diarysytem.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.diarysytem.entity.Diary;
import org.apache.ibatis.annotations.Mapper;


@Mapper
public interface DiaryMapper extends BaseMapper<Diary> {
}

Service层

package com.diarysytem.service;

import com.diarysytem.entity.Diary;


public interface DiaryService {

    public boolean userInsertDiary(Diary diary);
}

Sevice接口

package com.diarysytem.service.Impl;

import com.diarysytem.entity.Diary;
import com.diarysytem.mapper.DiaryMapper;
import com.diarysytem.service.DiaryService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DiaryServiceImpl implements DiaryService {

    private DiaryMapper diaryMapper;

    @Autowired
    public DiaryServiceImpl(DiaryMapper diaryMapper) {
        this.diaryMapper = diaryMapper;
    }

    @Override
    public boolean userInsertDiary(Diary diary) {
        return diaryMapper.insert(diary) > 0;
    }
}

Controller层

package com.diarysytem.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.diarysytem.entity.Diary;
import com.diarysytem.entity.WebDiary;
import com.diarysytem.mapper.DiaryMapper;
import com.diarysytem.service.DiaryService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@AllArgsConstructor
public class DirayController {
    private DiaryMapper diaryMapper;

    private DiaryService diaryService;

    // 写入日记
    @PostMapping("write")
    public Boolean userWriteDiary(@RequestBody WebDiary webDiary){
        Diary tempDiary = new Diary();
        tempDiary.setTasksPid(null);
        tempDiary.setDiaryTitle(webDiary.getDiaryTitle());
        tempDiary.setDiaryContent(webDiary.getDiaryContent());
        tempDiary.setDiaryMood(webDiary.getDiaryMood());
        tempDiary.setDiaryBody(webDiary.getDiaryBody());
        tempDiary.setDiaryTime(webDiary.getDiaryTime());
        tempDiary.setDiaryDelete(0);
        return diaryService.userInsertDiary(tempDiary);
    }

    //分页查询(这里方便演示就直接注入 service 了)
    @GetMapping("fpage")
    public Page<Diary> fenPages(int current,int size){
        Page<Diary> page = new Page<>(current,size);
        return diaryMapper.selectPage(page, null);
    }

}

vue相关

以我项目为例 有需要了解下面自取

Springboot+vue自制可爱英语日记系统

界面展现

代码展现

<script>
import dayjs from 'dayjs';
import axios from 'axios';

export default {
  data() {
    return {
      userDiaryList: [],
      currentPage: 1, // 当前页面
      totalPages: 0, // 总页面
      pageSize: 3 // 每个页面的数量
    };
  },
  created() {
    axios.get('http://127.0.0.1:8887/fpage', {
        params: {
          current: this.currentPage, // 页数 = sum / size
          size: this.pageSize //每页显示多少条
        }
      })
      .then(res => {
        console.log(res.data);
        const { records, pages, current } = res.data;
        this.userDiaryList = records;
        this.totalPages = pages;
        this.currentPage = current;
      });
  },
  methods: {
    getUpPage(){
        this.currentPage--;
        axios.get('http://127.0.0.1:8887/fpage', {
            params: {
            current: this.currentPage, // 页数 = sum / size
            size: this.pageSize //每页显示多少条
            }
        })
        .then(res => {
            console.log(res.data);
            const { records, pages, current } = res.data;
            this.userDiaryList = records;
            this.totalPages = pages;
            this.currentPage = current;
        });
    },
    getNextPage(){
        this.currentPage++;
        axios.get('http://127.0.0.1:8887/fpage', {
            params: {
            current: this.currentPage, // 页数 = sum / size
            size: this.pageSize //每页显示多少条
            }
        })
        .then(res => {
            console.log(res.data);
            const { records, pages, current } = res.data;
            this.userDiaryList = records;
            this.totalPages = pages;
            this.currentPage = current;
        });
    },
    userDiaryListClick(index){
        console.log(index);
        this.currentPage = index;
        axios.get('http://127.0.0.1:8887/fpage', {
            params: {
            current: this.currentPage, // 页数 = sum / size
            size: this.pageSize //每页显示多少条
            }
        })
        .then(res => {
            console.log(res.data);
            const { records, pages, current } = res.data;
            this.userDiaryList = records;
            this.totalPages = pages;
            this.currentPage = current;
        });
    },
    TImeZhuanHuan(time){
        try {
            console.log(time)
            const date = dayjs(time);
            if (!date.isValid()) {
            throw new Error('Invalid timestamp');
            }
            return this.formattedDate = date.format('YYYY-MM-DD HH:mm:ss');
        } catch (error) {
            console.error('Error formatting timestamp:', error);
            return this.formattedDate = 'Invalid timestamp';
        }
    }
    
  }
}
</script>

<template>

  <div>
    <main class="read">
      <h1 class="am_r_top_1 h1s">Search for diary<span class="pagsNumber">({{this.currentPage}}/{{ this.totalPages }})</span></h1>
      <div class="search am_r_1">
        <span>Search</span>
        <input type="text" placeholder="Search for diary" class="search_input">
      </div>
      
      <div class="userDiaryItems">
        <div class="userDiaryList am_r_5" v-for="(item, index) in userDiaryList" :key="index">
          <div class="userDiaryList_left">
            <span class="userDiaryList_left_number">No.{{ item.tasksPid }}</span>
            <h2>{{ item.diaryTitle }}</h2>
            <span class="userDiaryList_left_time">
                <span>{{ TImeZhuanHuan(item.diaryTime) }}</span>   
                <span class="userStatusImg"><img  src="/public/xiai.png" alt=""> {{ item.diaryMood}}</span>
                <span class="userStatusImg"><img  src="/public/tizhizhishu.png" alt="">  {{ item.diaryBody }}</span>
            </span>
          </div>
          <div class="userDiaryList_right">
            <span>browse</span>
            <span>------</span>
            <span>delete</span>
          </div>
        </div>
      </div>
    </main>
    <!-- 分页导航 -->

    <div class="pages am_r_3">
        <button @click="getUpPage" class="buts">上一页</button>

        <el-scrollbar style="width: 80%;padding: 10px 0;">
            <ul class="scrollbar-flex-content">
                <li v-for="index in totalPages" :key="index" class="scrollbar-demo-item" @click="userDiaryListClick(index)">{{index}}</li>
            </ul>
        </el-scrollbar>

        <button @click="getNextPage" class="buts">下一页</button>
    </div>


  </div>

</template>


<style scoped>
.userStatusImg{
    padding: 0 10px;
}
.userStatusImg img{
    margin: 0 0 -2px 0;
    width: 20px;
}
.pagsNumber{
    padding: 0 10px;
    font-size: 22px;
}
.pages{
    display: flex;
    justify-content: space-evenly;
    align-items: center;

}
.buts{
    border-radius: 10px;
    padding: 10px 5px;
    border: 0;
    background-color: rgb(248, 189, 144);
    color: #fff;

}
.buts:hover{
    cursor: pointer;
    background-color: rgb(254, 133, 40);

}

.scrollbar-flex-content {
    padding: 15px 0;
    display: flex;
}
.scrollbar-demo-item {
    padding: 5px 15px;
    display: flex;
    align-items: center;
    justify-content: center;
    margin: 0 5px;
    text-align: center;
    border-radius: 4px;
    font-size: 18px;
    color: rgb(159, 100, 32);
    background-color: rgb(255, 233, 209);

}
.scrollbar-demo-item:hover{
    cursor: pointer;
    background-color: rgb(255, 220, 183);


}


.userDiaryItems{
    height: 50vh;
}

.pagination a{
    text-decoration: none;
    font-weight: bold;
    font-size: 18px;
    color: rgb(212, 147, 77);

}
.userDiaryList{
    display: flex;
    justify-content: space-between;
    padding: 10px 10px 10px 10px;
    border-radius: 10px;
    margin: 10px 0;
    align-items: center;
    background-color: rgb(255, 233, 209);
}

.userDiaryList_left_number{
    font-size: 18px;
    font-weight: bold;
    color: rgb(204, 175, 141);
}
.userDiaryList_left h2{
    overflow: hidden;
    padding: 10px 0 0px 10px;
    font-size: 25px;
    font-weight: bold;
    color: rgb(159, 100, 32);
}


.userDiaryList_left_time{
    display: flex;
    padding: 5px 0 10px 10px;
    font-size: 18px;
    color: rgb(204, 175, 141);
}
.userDiaryList_right{
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}
.userDiaryList_right span{
    font-size: 18px;
    font-weight: bold;
    color: rgb(204, 175, 141);
}
.search{
    display: flex;
    padding: 10px 10px 10px 10px;
    border-radius: 10px;
    margin: 10px 0;
    align-items: center;
    background-color: rgb(255, 233, 209);
}
.search span{
    display: flex;
    justify-content: center;
    align-items: center;
    width: 15%;
    padding: 10px 0;
    margin: 0 5px 0 0;
    border-radius: 10px;
    font-weight: bold;
    font-size: 25px;
    color: rgb(255, 255, 255);
    background-color: rgb(254, 133, 40);
    box-shadow: 0 3px 10px rgba(201, 102, 27, 0.525);

}
.search input{
    width: 85%;
    border-radius: 10px;
    border: 0;
    padding: 15px;
    outline: none;
    font-size: 18px;
    font-weight: bold;
    color: rgb(121, 91, 33);

}
</style>

解决跨域问题

我前端是localhost:8888,后端是127.0.0.1:8887

我直接在后端进行跨域操作了

config包中添加一个跨域请求允许

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8888")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true);
    }
}

(到底啦)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chiplet SPI User Guide 详细解读

目录 一. 基本介绍 1.1.整体结构 1.2. 结构细节与功能描述 二. 输入输出接口 2.1. IO Ports for SPI Leader 2.2. IO Ports for SPI Follower 2.3. SPI Mode Configuration 2.4. Leader IP和Follower IP功能图 三. SPI Programming 3.1. Leader Register Descripti…

ubuntu 配置opencv-python-imsow()报错

python调用imshow&#xff08;&#xff09;时出现下面的错误&#xff1a; error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-c…

六个开源的PDF转Markdown项目

✨ 1: gptpdf gptpdf 是一个利用VLLM解析PDF为Markdown的工具&#xff0c;几乎完美支持数学公式、表格等。 GPTPDF 是一个使用视觉大模型&#xff08;如 GPT-4o&#xff09;将 PDF 文件解析成 Markdown 文件的工具。它主要用于高效地解析 PDF 文档中的排版、数学公式、表格、…

springboot专利信息服务管理系统-计算机毕业设计源码97187

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

【王佩丰 Excel 基础教程】第三讲:查找、替换、定位

文章目录 前言一、查找与替换1.1、按值查找1.2、按格式查找1.3、是否开启单元格匹配1.4、模糊查询 二、定位工具2.1、名称框的相关操作2.2、批注的相关介绍2.2.1、批注的基本操作2.2.2、批注的格式 2.3、使用 “ 定位条件 ” 解决以下问题 总结 前言 跟着B站学习王佩丰 Excel …

LLM工具调用破局:Few-shot Prompting

在大型语言模型&#xff08;LLM&#xff09;的应用中&#xff0c;工具的使用至关重要。我们一直在研究如何提升LLM调用工具的性能。一种常见的提升方法是通过少量样本提示&#xff0c;即将一些模型输入的示例和期望的输出结果直接展示给模型。据Language Models are Few-Shot L…

Jmeter下载、安装、永久汉化(Windows环境)

1、JDK下载 JDK8下载地址https://www.oracle.com/java/technologies/downloads/#java8-windows JDK8的Windows的64位&#xff1a; 2、Jmeter下载 jmeter下载地址https://jmeter.apache.org/download_jmeter.cgi 3、配置环境变量 安装好后&#xff0c;把jdk和jmeter都配置到…

4.JAVA-运算符

算数运算符 隐式类型转换 强制转换 字符串操作 字符相加 小结 自增自减运算符 赋值运算符 关系运算符 逻辑运算符 短路逻辑运算 三元运算符 运算符优先级 这里小括号优先于所有&#xff0c;所以想要哪一个优先运算&#xff0c;就可以将哪一个用小括号扩起来&#xff0c;比较方便…

科普贴:什么是大模型?快速了解大模型基本概念

在人工智能的世界里&#xff0c;大模型就像超级大脑一样&#xff0c;能够处理和理解大量的信息。你可能听说过ChatGPT&#xff0c;它就是大模型的一个典型代表。那么&#xff0c;什么是大模型呢&#xff1f;让我们一起来探索这个神奇的领域。 什么是大模型&#xff1f; 想象一…

EC与小鹅通震撼对接全攻略,一键解锁商业新纪元

客户介绍&#xff1a; 某企业管理咨询有限公司是一家深耕于商务服务业的专业咨询公司&#xff0c;隶属于商界联合品牌旗下。自成立以来&#xff0c;公司一直致力于在团队、产品及服务品质上不断投入与提升&#xff0c;公司的主要业务范围广泛&#xff0c;包括但不限于企业管理…

什么是PLM?

PLM&#xff08;Product Lifecycle Management&#xff0c;产品全生命周期管理&#xff09;是一种先进的企业信息化管理理念&#xff0c;旨在帮助企业从产品的概念设计、研发、生产制造、销售、售后服务&#xff0c;直到产品报废回收的整个生命周期进行管理和优化。PLM系统通过…

洗地机哪家好?四款洗地机好洗地机的品牌推荐

随着“懒人经济”的兴起&#xff0c;洗地机作为家居清洁领域的革新者&#xff0c;正逐步融入越来越多家庭的生活之中。面对市场上繁多的洗地机品牌与型号&#xff0c;消费者往往感到难以抉择&#xff1a;“洗地机哪个牌子最佳&#xff1f;”为了解答这一疑问&#xff0c;本文精…

JavaScript青少年简明教程:函数及其相关知识(上)

JavaScript青少年简明教程&#xff1a;函数及其相关知识&#xff08;上&#xff09; 在JavaScript中&#xff0c;函数是一段可以重复使用的代码块&#xff0c;它执行特定的任务并可能返回结果。 内置函数&#xff08;Built-in Functions&#xff09; 内置函数是编程语言中预先…

TinyMCE一些问题

1.element 在el-dialog中使用tinymce导致富文本弹窗在el-dialog后面的问题 原因是富文本的弹窗层级太低了 在APP.vue中添加样式即可解决 /* 富文本菜单 */ .tox-tinymce-aux {z-index: 9999 !important; }2.element 在el-dialog中点击富文本的功能栏报错 由于 aria-hidden 属…

系统架构设计师 - 知识产权与标准化

知识产权与标准化 知识产权与标准化&#xff08;3分&#xff09;保护范围与对象 ★ ★ ★ ★法律法规 保护期限 ★ ★知识产权人确定 ★ ★ ★ ★侵权判断 ★ ★ ★ ★标准化&#xff08;了解&#xff09;★标准的分类标准的编号 大家好呀&#xff01;我是小笙&#xff0c;本章…

WebSocket程序设计

协议说明 WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。Websocket主要用在B/S架构的应用程序中&#xff0c;在 WebSocket API 中&#xff0c;浏览器和服务器只…

Redis缓存数据库进阶——Redis与分布式锁(6)

分布式锁简介 1. 什么是分布式锁 分布式锁是一种在分布式系统环境下&#xff0c;通过多个节点对共享资源进行访问控制的一种同步机制。它的主要目的是防止多个节点同时操作同一份数据&#xff0c;从而避免数据的不一致性。 线程锁&#xff1a; 也被称为互斥锁&#xff08;Mu…

捷配告诉你半孔是如何做出来的

在PCB设计和制造领域&#xff0c;电镀半孔&#xff08;也称为齿形孔&#xff09;是一种创新技术&#xff0c;它通过焊接为单独的PCB模块提供了一种节省空间的互连方式。捷配在生产过程中经常遇到客户对这种技术的询问&#xff0c;以下是对其工作原理、设计指南和制造工艺的介绍…

Java1.3标准之重要特性及用法实例(十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

唯美贺卡制作QQ微信小程序完整源码/无需后台直接运营

这是一款用于发送唯美贺卡的一个小程序&#xff0c;界面唯美简洁&#xff0c;无需后台可直接运营&#xff0c;可以自定义卡片内容图标、邮票等元素&#xff0c;QQ微信小程序都可以直接使用&#xff0c;对接了部分广告&#xff0c;大家可以根据自己的广告id进行替换。 小程序主…