1、以书籍为例进行 书本的新增&删除&修改&模糊查询,实现书本信息管理系统。
2、运用工具+技术
工具:IntelliJ IDEA 、HBuilder X、MYSQL数据库
后台技术:SpringBoot 前端技术:vue+elementUI

3、注意事项
- jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/lxy?useUnicode=true&characterEncoding=UTF-8&useSSL=false
- jdbc.username=root
- jdbc.password=1234
- jdbc.initialSize=10
- jdbc.maxTotal=100
- jdbc.maxIdle=50
- jdbc.minIdle=10
- jdbc.maxWaitMillis=-1
-
-
-
"D:\repository\mvn-repository\mysql\mysql-connector-java\5.1.44\mysql-connector-java-5.1.44.jar"/>
一、生成书本表
- DROP TABLE IF EXISTS `t_book_vue`;
- CREATE TABLE `t_book_vue` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `bookname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
- `price` float NOT NULL,
- `booktype` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
- PRIMARY KEY (`id`) USING BTREE
- ) ENGINE = InnoDB AUTO_INCREMENT = 41 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '书本信息表' ROW_FORMAT = Dynamic;
-
- INSERT INTO `t_book_vue` VALUES (1, '西游记', 100, '名著');
- INSERT INTO `t_book_vue` VALUES (2, '红楼梦', 110, '名著');
- INSERT INTO `t_book_vue` VALUES (3, '三国演义', 121, '名著');
二、打开HBuilderX 导入book_html文件
在终端下载npm,执行命令:npm install(npm i),下载成功之后运行项目,执行命令:npm run dev
三、在Idea中 导入java项目,配置数据库相关设置,在generatorConfig.xml文件中table配置表信息,进行生成表,然后在编写Sevice层&SeviceImpl层&Controller层。
1、BookMapper.java
- package com.zking.ssm.mapper;
-
- import com.zking.ssm.model.Book;
- import org.springframework.stereotype.Repository;
-
- import java.util.List;
- import java.util.Map;
-
- @Repository
- public interface BookMapper {
- //删除书本
- int deleteByPrimaryKey(Integer id);
- //新增书本
- int insert(Book record);
- //根据书本编号查询书本信息
- Book selectByPrimaryKey(Integer id);
- //修改书本信息
- int updateByPrimaryKey(Book record);
- //模糊查询书本
- List
queryBookPager(Book book); - }
2、BookMapper.xml
- "1.0" encoding="UTF-8" ?>
- mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
- <mapper namespace="com.zking.ssm.mapper.BookMapper" >
- <resultMap id="BaseResultMap" type="com.zking.ssm.model.Book" >
- <constructor >
- <idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
- <arg column="bookname" jdbcType="VARCHAR" javaType="java.lang.String" />
- <arg column="price" jdbcType="REAL" javaType="java.lang.Float" />
- <arg column="booktype" jdbcType="VARCHAR" javaType="java.lang.String" />
- constructor>
- resultMap>
- <sql id="Base_Column_List" >
- id, bookname, price, booktype
- sql>
- <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
- select <include refid="Base_Column_List" /> from t_book_vue
- where id = #{id,jdbcType=INTEGER}
- select>
- <select id="queryBookPager" resultType="com.zking.ssm.model.Book">
- select <include refid="Base_Column_List"/> from t_book_vue
- <where>
- <if test="null!=bookname and ''!=bookname">
- bookname like concat('%',#{bookname},'%')
- if>
- where>
- order by id desc
- select>
- <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
- delete from t_book_vue where id = #{id,jdbcType=INTEGER}
- delete>
- <insert id="insert" parameterType="com.zking.ssm.model.Book" >
- insert into t_book_vue (bookname, price,booktype)
- values (#{bookname,jdbcType=VARCHAR}, #{price,jdbcType=REAL},
- #{booktype,jdbcType=VARCHAR})
- insert>
- <update id="updateByPrimaryKey" parameterType="com.zking.ssm.model.Book" >
- update t_book_vue
- set bookname = #{bookname,jdbcType=VARCHAR},
- price = #{price,jdbcType=REAL},
- booktype = #{booktype,jdbcType=VARCHAR}
- where id = #{id,jdbcType=INTEGER}
- update>
- mapper>
3、 IBookService.java
- package com.zking.ssm.service;
-
- import com.zking.ssm.model.Book;
- import com.zking.ssm.util.PageBean;
-
- import java.util.List;
- import java.util.Map;
-
- public interface IBookService {
- int deleteByPrimaryKey(Integer id);
-
- int insert(Book record);
-
- Book selectByPrimaryKey(Integer id);
-
- int updateByPrimaryKey(Book record);
-
- List
queryBookPager(Book book, PageBean pageBean); - }
4、BookServiceImpl.java
- package com.zking.ssm.service.impl;
-
- import com.zking.ssm.mapper.BookMapper;
- import com.zking.ssm.model.Book;
- import com.zking.ssm.service.IBookService;
- import com.zking.ssm.util.PageBean;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
-
- import java.util.List;
- import java.util.Map;
-
- @Service
- public class BookServiceImpl implements IBookService {
-
- @Autowired
- private BookMapper bookMapper;
-
- @Override
- public int deleteByPrimaryKey(Integer id) {
- return bookMapper.deleteByPrimaryKey(id);
- }
-
- @Override
- public int insert(Book record) {
- return bookMapper.insert(record);
- }
-
- @Override
- public Book selectByPrimaryKey(Integer id) {
- return bookMapper.selectByPrimaryKey(id);
- }
-
- @Override
- public int updateByPrimaryKey(Book record) {
- return bookMapper.updateByPrimaryKey(record);
- }
-
- @Override
- public List
queryBookPager(Book book, PageBean pageBean) { - return bookMapper.queryBookPager(book);
- }
-
- }
5、BookController.java
- package com.zking.ssm.controller;
-
- import com.zking.ssm.model.Book;
- import com.zking.ssm.service.IBookService;
- import com.zking.ssm.util.JsonResponseBody;
- import com.zking.ssm.util.PageBean;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import javax.servlet.http.HttpServletRequest;
- import java.util.List;
-
- @Controller
- @RequestMapping("/book")
- public class BookController {
-
- @Autowired
- private IBookService bookService;
-
- @RequestMapping("/addBook")
- @ResponseBody
- public JsonResponseBody> addBook(Book book){
- try {
- bookService.insert(book);
- return new JsonResponseBody<>("新增书本成功",true,0,null);
- } catch (Exception e) {
- e.printStackTrace();
- return new JsonResponseBody<>("新增书本失败",false,0,null);
- }
- }
-
- @RequestMapping("/editBook")
- @ResponseBody
- public JsonResponseBody> editBook(Book book){
- try {
- bookService.updateByPrimaryKey(book);
- return new JsonResponseBody<>("编辑书本成功",true,0,null);
- } catch (Exception e) {
- e.printStackTrace();
- return new JsonResponseBody<>("编辑书本失败",false,0,null);
- }
- }
-
- @RequestMapping("/delBook")
- @ResponseBody
- public JsonResponseBody> delBook(Book book){
- try {
- bookService.deleteByPrimaryKey(book.getId());
- return new JsonResponseBody<>("删除书本成功",true,0,null);
- } catch (Exception e) {
- e.printStackTrace();
- return new JsonResponseBody<>("删除书本失败",false,0,null);
- }
- }
-
- @RequestMapping("/queryBookPager")
- @ResponseBody
- public JsonResponseBody
> queryBookPager(Book book, HttpServletRequest req){
- try {
- PageBean pageBean=new PageBean();
- pageBean.setRequest(req);
- List
books = bookService.queryBookPager(book, pageBean); - return new JsonResponseBody<>("OK",true,pageBean.getTotal(),books);
- } catch (Exception e) {
- e.printStackTrace();
- return new JsonResponseBody<>("分页查询书本失败",false,0,null);
- }
- }
- }
6、后端代码编写完成,可先运行tomcat测试一下
四、在前端中编写页面代码
1、先将后端的ip地址配置到action.js中
- /**
- * 对后台请求的地址的封装,URL格式如下:
- * 模块名_实体名_操作
- */
- export default {
- //http://localhost:8080/ssm/user/userLogin
- 'SERVER': 'http://localhost:8080/ssm', //服务器
- 'INIT_MENU':'/module/queryRootNode', //初始化首页左侧菜单
- 'QUERY_BOOK_PAGE':'/book/queryBookPager', //书本管理分页查询接口
- 'ADD_BOOK':'/book/addBook', //书本新增接口
- 'EDIT_BOOK':'/book/editBook', //书本编辑接口
- 'DEL_BOOK':'/book/delBook', //书本删除接口
- 'VUEX_TEST':'/vuex/queryVuex', //Vuex测试接口
- 'getFullPath': k => { //获得请求的完整地址,用于mockjs测试时使用
- return this.SERVER + this[k];
- }
- }
2、 在view文件中编写BookList.vue
- "margin: 15px;">
-
-
"/" style="font-size: 16px;"> -
"{ path: '/' }">首页 -
-
-
"true" style="margin-top: 15px;margin-bottom: -15px;"> -
"书本名称:"> -
"bookname" placeholder="请输入书本名称"> -
-
-
"primary" @click="query(1)">查询 -
"primary" @click="open">新增 -
-
-
-
"tableData" stripe style="width: 100%"> -
"id" label="书本编号"> -
-
"bookname" label="书本名称"> -
-
"price" label="书本价格"> -
-
"booktype" label="书本类型"> -
-
"操作"> - "scope">
-
- size="mini"
- @click="handleEdit(scope.row)">编辑
-
- size="mini"
- type="danger"
- @click="handleDelete(scope.row)">删除
-
-
-
-
-
- @size-change="handleSizeChange"
- @current-change="handleCurrentChange"
- :current-page="page"
- :page-sizes="[10, 20, 30, 40]"
- :page-size="rows"
- layout="total, sizes, prev, pager, next, jumper"
- :total="total">
-
-
-
"false" @close="closeDialog" :title="title" :visible.sync="dialogFormVisible"> -
"book" :rules="rules" ref="book"> -
"书本编号" :label-width="formLabelWidth"> -
"readonly" v-model="book.id" autocomplete="off"> -
-
"bookname" label="书本名称" :label-width="formLabelWidth"> -
"book.bookname" autocomplete="off"> -
-
"price" label="书本价格" :label-width="formLabelWidth"> -
"book.price" autocomplete="off"> -
-
"booktype" label="书本类型" :label-width="formLabelWidth"> -
"book.booktype" style="width: 100%;"> -
"">---请选择--- -
for="bt in booktypes" - :label="bt.btName" :value="bt.btId" :key="bt.btId">
-
-
-
- "footer" class="dialog-footer">
-
@click="dialogFormVisible = false">取 消 -
"primary" @click="save">确 定 -
-
-
-
- export default {
- name: 'BookList',
- data: function() {
- return {
- bookname: '',
- tableData:[],
- page:1,
- rows:10,
- total:0,
- title:'书本新增',
- dialogFormVisible:false, //默认隐藏
- formLabelWidth:'90px',
- booktypes:[
- {btId:'悬疑',btName:'悬疑'},
- {btId:'玄幻',btName:'玄幻'},
- {btId:'文学',btName:'文学'},
- {btId:'名著',btName:'名著'},
- {btId:'言情',btName:'言情'}
- ],
- book:{
- id:'',
- bookname:'',
- price:'',
- booktype:''
- },
- rules: {
- bookname: [ //trigger:触发器
- { required: true, message: '请输入书本名称', trigger: 'blur' },
- { min: 3, message: '长度至少3个字符', trigger: 'blur' }
- ],
- price: [ //trigger:触发器
- { required: true, message: '请输入书本价格', trigger: 'blur' },
- ],
- booktype: [
- { required: true, message: '请选择书本类型', trigger: 'change' },
- ]
- }
- }
- },
- methods: {
- handleEdit:function(row){
- console.log(row);
- this.book={
- id:row.id,
- bookname:row.bookname,
- price:row.price,
- booktype:row.booktype
- };
- this.title="书本编辑";
- this.dialogFormVisible=true;
- },
- handleDelete:function(row){
- this.$confirm('你确定要删除这本书吗?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- }).then(() => {
- let url=this.axios.urls.DEL_BOOK;
- //发起请求
- this.axios.post(url,{id:row.id}).then(resp => {
- let data = resp.data;
- if (data.success) {
- this.$message({
- message: data.msg,
- type: 'success'
- });
- //刷新列表
- this.query(this.page);
- } else {
- this.$message({
- message: data.msg,
- type: 'error'
- });
- }
- }).catch(err => {
- console.log(err);
- });
- }).catch(() => {});
- },
- closeDialog:function(){
- //清空表单数据
- this.book={
- id:'',
- bookname:'',
- price:'',
- booktype:''
- };
- //清空表单验证
- this.$refs['book'].resetFields();
- //关闭之后都变新增
- this.title="书本新增";
- },
- save:function(){
- //新增和编辑的操作按钮
- this.$refs['book'].validate((valid) => {
- if (valid) { //总是默认为新增
- let url=this.axios.urls.ADD_BOOK;
- if(this.title=="书本编辑")
- url=this.axios.urls.EDIT_BOOK;
- //发起请求
- this.axios.post(url,this.book).then(resp => {
- let data = resp.data;
- if (data.success) {
- this.$message({
- message: data.msg,
- type: 'success'
- });
- //关闭对话框
- this.dialogFormVisible=false;
- //刷新列表
- this.query(this.page);
- } else {
- this.$message({
- message: data.msg,
- type: 'error'
- });
- }
- }).catch(err => {
- console.log(err);
- });
- } else {
- console.log('error submit!!');
- return false;
- }
- });
- },
- open:function(){ //打开对话框
- this.dialogFormVisible=true;
- },
- //每页显示条数的改变事件
- handleSizeChange:function(r){
- console.log("每页显示条数:"+r);
- this.rows=r;
- this.page=1;
- this.query(1);
- },
- //每页页码的改变事件
- handleCurrentChange:function(p){
- console.log("当前页码:"+p);
- this.page=p;
- this.query(p);
- },
- query: function(p) {
- //请求参数
- let params={
- bookname:this.bookname,
- page:p,
- rows:this.rows
- };
- //请求路径
- let url = this.axios.urls.QUERY_BOOK_PAGE;
- //发送请求
- this.axios.post(url,params).then(resp=>{
- let data = resp.data;
- console.log(data);
- this.tableData=resp.data.rows;
- this.total=resp.data.total;
- }).catch(err=>{
- console.log(err);
- })
- }
- }
- }
-
- /* elementUI dialog弹出框样式优化 */
- .el-dialog {
- position: absolute;
- top: 50%;
- left: 50%;
- margin: 0 !important;
- transform: translate(-50%, -50%);
- max-height: calc(100% - 30px);
- max-width: calc(100% - 30px);
- display: flex;
- flex-direction: column;
- /* 圆角效果 */
- border-radius: 0.4em;
- }
-
- .el-dialog>.el-dialog__body {
- overflow: auto;
- }
-
- .el-dialog__header {
- background-color: #F5F7FA;
- border-bottom: 1px solid #ccc;
- font-size: 14px;
- font-weight: bold;
- padding: 15px 20px 15px;
- /* 圆角效果 */
- border-radius: 0.4em 0.4em 0em 0em;
- }
-
- .el-dialog__body {
- padding: 20px 15px;
- }
-
- .el-dialog__footer {
- background-color: #F5F7FA;
- border-top: 1px solid #ccc;
- padding: 15px;
- /* 圆角效果 */
- border-radius: 0em 0em 0.4em 0.4em;
- }
-
- .el-form>.el-form-item:last-child {
- margin-bottom: 0px;
- }
前后端书本分离项目 页面最终效果:
查询所有:
模糊查询:
页面验证:
-
相关阅读:
【好玩】如何在github主页放一条贪吃蛇
踩坑记录---openFeign高并发阻塞分析与解决
springSecurity自定义认证逻辑,重写登陆,token过滤,退出
2022年地理信息系统与遥感专业就业前景与升学高校排名选择
Cpolar在Linux系统中的应用(网页篇2)
数据存储(二)WebStorage 之 sessionStorage、globalStorage、localStorage
VXLAN基础
MySQL-如何合理正确使用索引
darknet c++源码阅读笔记-01-activation_kernels.cu
大聪明教你学Java | 比校验文件后缀名更靠谱的上传文件校验方式 —— 文件魔数校验
-
原文地址:https://blog.csdn.net/m0_61911999/article/details/127794751