Springboot快速开发-书本信息管理系统(项目源码)

news2025/4/12 12:20:14

【我后续会发一个资源包,里面是所有代码,数据库表设计也有,大学生可以直接用,导入数据库运行,再导入后端项目和前端项目,再去网页运行就好了,效果图下面有】

 

 

 

1、考核要求:

  1. 数据库:MYSQL5.7+
  2. 后台技术:SpringBoot
  3. 前端技术:vue+elementui
  4. 代码简洁、有合理的注解,前面页面排版工整

2、考核注意事项

1.运行sql脚本,创建数据库及书本表(根据我的实体类建表就可以了,整个项目可直接运行,跨域问题已处理,前后端的端口也已处理)

2.后台代码注意事项

        a.Maven地址的修改(修改成你自己的);

        b.依赖可能不在本地,需要联网重新下载;

        c.jdbc.properties设置,数据库相关配置:数据库名/账号/密码,请修改成自己电脑所对应的账号和密码。

        d.generatorConfig.xml设置:Ⅰ:修改classPathEntry配置,更换成本地maven仓库中mysql数据库jdbc驱动jar包的位置;Ⅱ:修改table配置表信息(tableName和domainObjectName),更换成考试中对应数据库表;Ⅲ:点击Edit Configurations...配置,添加Maven,输入命名:mybatis-gerenator:gerenate -e;

        e.application.yml设置:数据库相关设置:数据库名/帐号/密码,请修改成自己电脑对应的帐号和密码

        f.由于电脑tomcat以及jdk的安装位置不一样,请重新配置jdk和tomcat

        g.以上步骤完成,先不要写任何代码,先将web项目发布至tomcat并启动,如果首页访问成功,表示web项目部署成功,可以开始编写后台代码了

3.前端代码注意事项:

1.vue项目框架已搭建完成,为减小源码大小,相关模块已删除,运行项目前,请先进入vue项目根目录,使用npm install命令下载相关模块(此步骤需要联网)

2.项目启动后无需添加路由或*.vue文件,运行后会直接跳转到BookList.vue,在此vue文件中添加相关功能即可

3.开动

generatorConfig.xml、jdbc.properties、application.yml这三个配置文件我就不展示了,有需要的下载我的资源包

数据库表建好之后→导入前端(可以把需要的依赖先下载,然后干自己的事)→导入后端(进行我上面所说的那些后端操作)→写完代码运行后端→在写前端代码(运行前端)

以下是后端的代码:

Model层:Book

package com.zking.spboot.model;

public class Book {
    private Integer id;

    private String bookname;

    private Float price;

    private String booktype;

    public Book(Integer id, String bookname, Float price, String booktype) {
        this.id = id;
        this.bookname = bookname;
        this.price = price;
        this.booktype = booktype;
    }

    public Book() {
        super();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBookname() {
        return bookname;
    }

    public void setBookname(String bookname) {
        this.bookname = bookname;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    public String getBooktype() {
        return booktype;
    }

    public void setBooktype(String booktype) {
        this.booktype = booktype;
    }
}

Mapper层:BookMapper

package com.zking.spboot.mapper;

import com.zking.spboot.model.Book;
import org.springframework.stereotype.Repository;

import java.util.List;
@Repository
public interface BookMapper {

    /**
     * 根据书本名称模糊查询
     * @param book
     * @return
     */
    List<Book> queryAll(Book book);

    int deleteByPrimaryKey(Integer id);

    int insert(Book record);

    int insertSelective(Book record);

    Book selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(Book record);

    int updateByPrimaryKey(Book record);
}

Service层:BookService

package com.zking.spboot.service;

import com.zking.spboot.model.Book;
import org.springframework.stereotype.Repository;

import java.util.List;

public interface BookService {

    /**
     * 根据书本名称模糊查询
     * @param book
     * @return
     */
    List<Book> queryAll(Book book);

    /**
     * 新增书本
     * @param record
     * @return
     */
    int insert(Book record);

}

impl层:BookServiceImpl

package com.zking.spboot.service.impl;

import com.zking.spboot.mapper.BookMapper;
import com.zking.spboot.model.Book;
import com.zking.spboot.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 实现类
 */
@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookMapper bookMapper;

    @Override
    public List<Book> queryAll(Book book) {
        return bookMapper.queryAll(book);
    }

    @Override
    public int insert(Book record) {
        return bookMapper.insert(record);
    }


}

Controller层:BookController

package com.zking.spboot.controller;

import com.zking.spboot.model.Book;
import com.zking.spboot.service.BookService;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/book")
public class BookController {

    @Autowired
    private BookService bookService;

    @RequestMapping("/addBook")
    public JsonResponsBody<?> addBook(Book book){
        bookService.insert(book);
        return new JsonResponsBody<>();
    }

    @RequestMapping("/queryAll")
    public JsonResponsBody<List<Book>> queryAll(Book book){
        List<Book> books = bookService.queryAll(book);
        return new JsonResponsBody<>(200,"OK",books);
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    class JsonResponsBody<T>{
        private int code=200;
        private String mag="Ok";
        private T data;
    }
}

以下是前端的代码:

前端接收后端的请求路径,src下面的action.js

/**
 * 对后台请求的地址的封装,URL格式如下:
 * 模块名_实体名_操作
 */
export default {
	//服务器
	'SERVER': 'http://localhost:8080/spboot',
	'ADD':'book/addBook',
	'ALL':'book/queryAll',
	//获得请求的完整地址,用于mockjs测试时使用
	'getFullPath': k => {
		return this.SERVER + this[k];
	}
}

前端页面:

<template>
	<div>
		<!-- <h1 align="center">SpringBoot阶段机试,ts={{ts}}</h1> -->
		<!-- 1.搜索栏 -->
		<el-form :inline="true">
			<el-form-item label="书本名称">
				<el-input v-model="bookname" placeholder="书本名称"></el-input>
			</el-form-item>
			<el-form-item>
				<el-button type="primary" @click="query">查询</el-button>
				<el-button type="primary" @click="open">新增</el-button>
			</el-form-item>
		</el-form>
		<!-- 2.数据表格 -->
		<el-table :data="tableData" style="width: 100%">
			<el-table-column prop="id" label="书本编号" width="180">
			</el-table-column>
			<el-table-column prop="bookname" label="书本名称" width="180">
			</el-table-column>
			<el-table-column prop="price" label="书本价格">
			</el-table-column>
			<el-table-column prop="booktype" label="书本类型">
			</el-table-column>
		</el-table>
		<!-- 3.弹出框 -->
		<el-dialog title="新增" :visible.sync="dialogFormVisible" @close="close">
			<el-form :model="book" :rules="rules" ref="book">
				<el-form-item prop="bookname" label="书本名称" label-width="90px">
					<el-input v-model="book.bookname" autocomplete="off"></el-input>
				</el-form-item>
				<el-form-item prop="price" label="书本价格" label-width="90px">
			  <el-input v-model="book.price" autocomplete="off"></el-input>
				</el-form-item>
				<el-form-item prop="booktype" label="书本类型" label-width="90px">
					<el-select style="width:100%;" v-model="book.booktype" placeholder="请选择书本类型">
						<el-option label="玄幻" value="玄幻"></el-option>
						<el-option label="文学" value="文学"></el-option>
					</el-select>
				</el-form-item>
			</el-form>
			<div slot="footer" class="dialog-footer">
				<el-button @click="dialogFormVisible = false">取 消</el-button>
				<el-button type="primary" @click="save">确 定</el-button>
			</div>
		</el-dialog>
	</div>
</template>

<script>
	export default {
		data: function() {
			return {
				ts: new Date().getTime(),
				bookname: '',
				tableData: [],
				dialogFormVisible: false,
				book: {
					bookname: '',
					price: '',
					booktype: ''
				},
				rules: {
					bookname: [{
						required: true,
						message: '请输入书本名称',
						trigger: 'blur'
				 }, ],
					price: [{
						required: true,
						message: '请输入书本价格',
						trigger: 'blur'
					}, ],
					booktype: [{
						required: true,
						message: '请选择书本类型',
						trigger: 'change'
					}, ]
				}
			};
		},
		methods: {
			close:function(){
				//清空表单数据
				this.book={
					bookname: '',
					price: '',
					booktype: ''
				};
				//清空表单验证
				this.$refs['book'].resetFields();
			},
			save: function() {
				this.$refs['book'].validate((valid) => {
					if (valid) {
						let url=this.axios.urls.ADD;
						this.axios.post(url,this.book).then(resp => {
							let data = resp.data; //data  -->  date  XXXXXX
							// {code:200,msg:'OK',data:[....]}
							if(data.code==200){
								//关闭弹出框
								this.dialogFormVisible=false;
								//再次查询列表方法
								this.query();
							}else{
								this.$message.error('新增失败!');
							}
						}).catch(err => {

						})
					} else {
						console.log('error submit!!');
						return false;
					}
				});
			},
			query: function() {
				//1.定义查询参数
				let params = {
					bookname: this.bookname
				};
				//2.获取请求路径
				let url = this.axios.urls.ALL;
				//3.发起ajax请求
				this.axios.post(url, params).then(resp => {
					let data = resp.data; //data  -->  date  XXXXXX
					// {code:200,msg:'OK',data:[....]}
					console.log(data);
					this.tableData = data.data;
				}).catch(err => {

				})
			},
			open: function() {
				this.dialogFormVisible = true;
			}
		}
	}
</script>

<style>
</style>

 以上就是今天的分享!!!

刚好有大学生找我帮忙写这个项目,我想可以与大家分享一下代码,有其他同行需要代码的也可以找我。感谢支持!

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

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

相关文章

笔试强训第22天--(第一个只出现一次的字符 小易的升级之路)

选择 B 从头找和从尾找不都得遍历嘛 B 错了建议给自己来个大嘴巴子 C 老演员了 A 一个从头来&#xff0c;一个从尾来&#xff0c;这样才能全满嘛 A 从1开始存的 但是依然是头指针等于尾指针的时候是空&#xff0c;但是你不留一个空间不存数据&#xff0c;那满的时候也是头指针等…

HAWE油缸_哈威油缸

HAWE油缸_哈威油缸宁波秉圣主要做的型号:HSE24-20,HSE16-8,HSE12-8,HSA32-20&#xff0c;HSE16-16&#xff0c;SHA32-20&#xff0c;SHA40-25等。 HAWE防爆阀宁波秉圣常作的型号:EXGZ4-12-GM24,NSWP2D/M/20-G24EX,VP1Z-G24EX,NBVP16R/2-G24EX,PSL41/160-3-E1-G24EX-3m,PSV4S2/2…

期末前端web大作业——名侦探柯南网页制作 Hbuiderx制作网页 静态HTML网页单页制作 dreamweaver网页设计与制作代码 web前端期末大作业

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

32岁事业无成,我终于选择放过自己了

作为一名热爱编程的程序员&#xff0c;我一直在思考&#xff0c;既然我热爱这份职业&#xff0c;如果我能在工作中获得人生意义&#xff0c;岂不是两全其美。于是&#xff0c;我去看了一本书《发现你的天赋》。很多人评价&#xff0c;照着上面的引导认真做题&#xff0c;不仅能…

springboot2.X整合mybatis使用joda时间格式变量完成插入操作

开发工具使用的idea2022.3&#xff0c;数据库是mysql5.X系列&#xff0c;springboot用的是2.7系列&#xff0c;使用了java8的joda类型的时间格式完成mybatis的插入操作。下面贴代码说明实现过程 项目结构如下图&#xff1a; 下面说一些关键的maven配置 <!-- springboot myb…

如何检测和克服MLOps中的模型漂移

image.png机器学习 (ML) 被广泛认为是数字化转型的基石&#xff0c;但 ML 模型最容易受到数字环境变化动态的影响。 ML 模型由创建它们的时间段内可用的变量和参数定义和优化。 让我们看看一个基于垃圾邮件的通用模板创建的 ML 模型的案例&#xff0c;该模板当时可能正在激增。…

安装【银河麒麟V10】linux系统

最近客户的服务器是麒麟的操作系统&#xff0c;因为要在上面安装我们的应用所以&#xff0c;要找镜像在本地搭建测试环境&#xff0c;看看有什么问题&#xff0c;把遇到的问题和操作总结一下。因为客户的服务器是内网&#xff0c;没网还需要挂载镜像&#xff0c;所以还需要挂载…

Linux命令从入门到实战 ---- 磁盘管理类

du 查看文件和目录占用的磁盘空间 du disk usage 磁盘占用情况 基本语法 du [选项] 目录/文件 显示目录下每个子目录的磁盘使用情况 选项功能-h将文件大小转换成人类便于阅读的形式-a查看子目录和文件-c显示所有的文件和子文件后&#xff0c;显示总和-s只显示总和–max-depth…

docker-compse整合redis集群

这里写自定义目录标题配置配置、数据和logs目录配置docker-compose配置集群总结本文是通过docker-compose在linux配置redis高可用。前提条件是系统中需要安装docker和docker-compose。配置配置、数据和logs目录 mkdir -p /home/docker-redis在当前目录下创建cluster-conf.conf…

回溯法求解n个元素的集合的幂集

目录 1.回溯法 2.集合的幂集本质问题 3.集合的幂集 &#xff08;1&#xff09;集合 &#xff08;2&#xff09;求解集合的幂集 &#xff08;3&#xff09;算法描述 &#xff08;4&#xff09;算法实现 &#xff08;5&#xff09;算法拓展 1.回溯法 回溯法也是设计递归…

Android App开发实战之实现微信记账本(附源码 超详细必看)

需要源码或图片集请点赞关注收藏后评论区留言~~~ 一、需求描述 好用的记账本必须具备两项基本功能。一项时记录新帐单&#xff0c;另一项时查看账单列表&#xff0c;其中账单的记录操作要求用户输入账单的明细要素&#xff0c;包括账单的发生时间&#xff0c;账单的收支类型&a…

C++ 输入输出及txt文件输入示例

std::istream typedef basic_istream<char> istream;输入流对象可以读取和解释来自字符序列的输入。 提供了特定的成员来执行这些输入操作&#xff08;参见下面的函数&#xff09;。 标准对象 cin 就是这种类型的对象。 std::istream::getline istream& getline (…

Web3 用例全解析:传统品牌加速进入 Web3 的原因?

Web3 有能力彻底改变品牌和客户相互联系的方式。许多品牌已经在尝试使用 NFT 和元宇宙来提高品牌知名度和消费者忠诚度&#xff0c;这是传统社交媒体和电子商务渠道根本无法做到的。 NIKE、Panini 和 Vodafone 是最早认识到 NFT 价值的公司&#xff0c;而 Gucci、Balmain、Prad…

C语言百日刷题第七天

C语言百日刷题第七天61. 写一个函数isPowerOfTwo判断是不是2的幂次方62. 写一个函数isPowerOfThree判断是不是3的幂次方63.n 的第 k 个因子64.有效的完全平方数65.搜索旋转排序数组66.桌上拿硬币67.计算生成元68.计算分子量69.最佳情侣身高差70.拯救外星人61. 写一个函数isPowe…

计算机毕业设计springboot+vue+elementUI校园疫情防控系统

项目介绍 基本实现了校园疫情防控系统应有的主要功能模块&#xff0c;本系统有管理员、学生。管理员&#xff1a;首页、个人中心、核酸检测管理、体温状态管理、学生管理、学生状态管理、休假申请管理、出入登记管理、疫情知识管理、论坛管理、系统管理。学生权限&#xff1b;…

矩阵分析与计算学习记录-广义逆矩阵

本章重点内容&#xff1a; Penrose方程 {1}-逆的计算及性质 Moore-Penrose逆的计算及性质 tips&#xff1a;广义逆矩阵是在系数矩阵不可逆的情况下进行求解 1. Penrose方程 1.1 广义逆的定义与计算 1.2 Penrose方程基本概念 2. {1}-逆的计算及性质 2.1 {1}-逆的计算 2.2 …

大白话之 Iptables

背景 今天在安装traefik的时候遇见了很神奇的问题&#xff0c;80端口没有任何程序在监听&#xff0c;但是访问的话会返回it works&#xff0c;想来想去可能是iptables的问题&#xff0c;由于Iptables每次都是现查&#xff0c;所以觉得还是理解不到位&#xff0c;总结一波。 表…

远距离WiFi无线传输方案,CV5200模组通信应用,无线自组网技术

无线自组网是一种特殊的无线通信技术&#xff0c;无需依赖任何预先架设的网络设施就可以快速自动组网&#xff0c;并具有很强的抗毁性和灵活性。 特别适用于远距离&#xff0c;高速率的场合&#xff0c;比如无人机&#xff0c;安防监控&#xff0c;智慧建筑&#xff0c;智慧农…

分布式事务Seata源码解析13:TCC事务模式实现原理

文章目录一、前言二、GlobalTransactionScanner1、判断某一个Bean是否需要做TCC动态代理1> 判断bean实现的接口中是否有接口标注了LocalTCC注解2> 当Bean的某一个接口实现了LocalTCC注解之后&#xff0c;解析相应接口中的TCC内容&#xff1a;TCCResource数据样例3> TC…

mysql是怎么运行的-笔记

文章目录启动**MySQL**服务器程序 **1.3.1 UNIX**里启动服务器程序**Windows**里启动服务器程序服务器处理客户端请求常用存储引擎一些重要的字符集**MySQL**中的**utf8**和**utf8mb4**比较规则的查看MySQL有四个级别的字符集和比较规则**InnoDB**记录结构compact 行格式变长字…