• 前后端分离页面(从数据库到前端、后端手把手教你如何搭建 -- 功能实现:增加查询)


    目录

    一、准备条件

    前台

    后台

     二、数据库设计

    建议不要导入,导入有乱码的风险;新建查询运行下面代码更快捷。

     三、导入前端项目

    导入后使用命令行打开黑窗口,测试一下有没有npm -v环境

     如果出现命令无效,就使用管理员身份打开黑窗口

    npm install 

    npm run dev

    四、后台项目导入步骤及编码

     如果忘记电脑的maven在那个盘,使用 mvn -version 查找本机 maven 地址​编辑

    生成mapper类中添加注解 @Repository 

    添加模糊查询方法

    编写SQL

     编写service ​编辑

    编写实现类

    创建controller类

     controller层代码提供

    五、前端编码

    action.js

    index.js 

     编写页面,BookList.vue

     六、前后台代码提供

    后台:

    application.yml

    jdbc.properties

    generatorConfig.xml

    BookMapper

    BookMapper.xml

    BookService

    BookServiceImpl

    BookController

    前台:

    action.js

    router-index.js

    BookList.vue


    一、准备条件

    小编事先准备了一份前台、后台的基本架构的代码,如果你手上有现有的那就按照小编的步骤来就ok,没有就需要创建spa项目、后台项目。

    前台:

       

     后台:

       

     二、数据库设计

    建议不要导入,导入有乱码的风险;新建查询运行下面代码更快捷。

    1. create database if not exists bookshop default charset utf8 collate utf8_general_ci;
    2. use bookshop;
    3. create table t_book(
    4. id int not null auto_increment primary key comment '书本编号',
    5. bookname varchar(50) not null comment '书本名称',
    6. price float default 0 comment '书本价格',
    7. booktype varchar(20) comment '书本类型'
    8. ) comment '书本信息表';
    9. insert into t_book(bookname,price,booktype) values
    10. ('三国演义',110,'战争'),
    11. ('西游记',120,'神话'),
    12. ('红楼梦',130,'古典');

          

     三、导入前端项目

    导入手上有的,没有就创建,至于怎么创建,小编就不详讲了。

    怎么导入嘞,你找到项目用鼠标拖进去,也可以右键找到项目地址导入。

     

    导入后使用命令行打开黑窗口,测试一下有没有npm -v环境

     如果出现命令无效,就使用管理员身份打开黑窗口

     

     跳转项目所在盘,将路径复制进去,再输入npm -v

    npm install 

    npm run dev

    或者在HBuilder X中,启动前端看一下页面能不能展示出来

     前端页面可以展示出来,准备后台编码

    四、后台项目导入步骤及编码

    打开IDEA

    找到,选中

     选中maven,finish下一步

     如果忘记电脑的maven在那个盘,使用 mvn -version 查找本机 maven 地址

     项目导入idea中,第一步-->Settings-->maven-->配置maven

    看 application.yml 该改的改一改,数据库名称什么的

     

     jdbc.properties 也改巴改巴,总之改为你电脑的数据库的密码或名称就ok

    generatorConfig.xml 更改指定数据库jdbc驱动jar包的位置,你的jar放哪嘞,应该忘记了吧,问题不大 
    mysql-connector-java\5.1.44\  拷贝它,在本机目录中搜索

    亦或者,打开更改配置maven的地址

     手动复制地址过来后,检查一下Javabean生成位置等,就可以编辑生成表了

    怎么生成呢,小编目前知道的方式有两种方式,教大家一个简单快捷的。

     

     BUILD SUCCESS ok了

    生成mapper类中添加注解 @Repository 

     

    添加模糊查询方法

    编写SQL

    1. <select id="query" resultType="com.zking.spboot.model.Book">
    2. select <include refid="Base_Column_List"/> from t_book where 1=1
    3. <if test="null!=bookname and ''!=bookname">
    4. and bookname like concat('%',#{bookname},'%')
    5. if>
    6. select>

     编写service 

    记得将Mapper层的@Repository 注解删掉,service不用注解

    编写实现类

     ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

     添加注解@Service

    创建controller类

     controller层代码提供

    1. package com.zking.spboot.controller;
    2. import com.zking.spboot.model.Book;
    3. import com.zking.spboot.service.BookService;
    4. import lombok.AllArgsConstructor;
    5. import lombok.Data;
    6. import lombok.NoArgsConstructor;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.web.bind.annotation.RequestMapping;
    9. import org.springframework.web.bind.annotation.RestController;
    10. import java.util.List;
    11. /**
    12. * @author 小坤
    13. * @create 2022-11-18-19:19
    14. */
    15. @RestController
    16. @RequestMapping("/book")
    17. public class BookController {
    18. @Autowired
    19. private BookService bookService;
    20. @RequestMapping("/query")
    21. public JsonResponseBody query(Book book){
    22. List books=bookService.query(book);
    23. return new JsonResponseBody<>(200,"ok",books);
    24. }
    25. @RequestMapping("/add")
    26. public JsonResponseBody add(Book book){
    27. bookService.insert(book);
    28. return new JsonResponseBody<>();
    29. }
    30. @Data
    31. @AllArgsConstructor
    32. @NoArgsConstructor
    33. class JsonResponseBody{
    34. private int code=200;
    35. private String msg="ok";
    36. private T data;
    37. }
    38. }

    运行测试一波

    五、前端编码

    先把这边编写好

    action.js

     ​​​​​​​

    index.js 

     

     编写页面,BookList.vue

    最终效果,想要展示成这样,我们拜读element ui 官网,找到自己需要的样式拷贝下来,改巴改巴

     表单form,搜索栏

     数据表格 table  随便找一个,小编就用第一个最丑的基础表格

     对话框 自定义内容

    表单校验

     ​​​​​​​

     六、前后台代码提供

    后台:

    application.yml

    1. server:
    2. port: 8080
    3. servlet:
    4. context-path: /spboot
    5. spring:
    6. datasource:
    7. type: com.alibaba.druid.pool.DruidDataSource
    8. driver-class-name: com.mysql.jdbc.Driver
    9. url: jdbc:mysql://localhost:3306/bookshop?useUnicode=true&characterEncoding=utf8&useSSL=false
    10. username: root
    11. password: 123456
    12. druid:
    13. initial-size: 5
    14. min-idle: 5
    15. max-active: 20
    16. max-wait: 60000
    17. time-between-eviction-runs-millis: 60000
    18. min-evictable-idle-time-millis: 30000
    19. validation-query: SELECT 1 FROM DUAL
    20. test-while-idle: true
    21. test-on-borrow: true
    22. test-on-return: false
    23. pool-prepared-statements: true
    24. max-pool-prepared-statement-per-connection-size: 20
    25. filter:
    26. stat:
    27. merge-sql: true
    28. slow-sql-millis: 5000
    29. web-stat-filter:
    30. enabled: true
    31. url-pattern: /*
    32. exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
    33. session-stat-enable: true
    34. session-stat-max-count: 100
    35. stat-view-servlet:
    36. enabled: true
    37. url-pattern: /druid/*
    38. reset-enable: true
    39. login-username: admin
    40. login-password: admin
    41. allow: 127.0.0.1
    42. #deny: 192.168.1.100
    43. freemarker:
    44. cache: false
    45. charset: UTF-8
    46. content-type: text/html
    47. suffix: .ftl
    48. template-loader-path: classpath:/templates
    49. mybatis:
    50. mapper-locations: classpath:mapper/*.xml
    51. type-aliases-package: com.zking.spboot.model
    52. configuration:
    53. map-underscore-to-camel-case: true
    54. logging:
    55. level:
    56. com.zking.spboot.mapper: debug
    57. pagehelper:
    58. helperDialect: mysql
    59. reasonable: true
    60. supportMethodsArguments: true
    61. params: count=countSql

    jdbc.properties

    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/bookshop?useUnicode=true&characterEncoding=UTF-8
    3. jdbc.username=root
    4. jdbc.password=123456

    generatorConfig.xml

    1. "1.0" encoding="UTF-8" ?>
    2. generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    4. <generatorConfiguration>
    5. <properties resource="jdbc.properties"/>
    6. <classPathEntry location="E:\SoftwareInstallPath\Maven\apache-maven-3.5.0-bin\apache-maven-3.5.0-bin\mvn_repository\mysql\mysql-connector-java\5.1.44\"/>
    7. <context id="infoGuardian">
    8. <commentGenerator>
    9. <property name="suppressAllComments" value="true"/>
    10. <property name="suppressDate" value="true"/>
    11. commentGenerator>
    12. <jdbcConnection driverClass="${jdbc.driver}"
    13. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    14. <javaTypeResolver>
    15. <property name="forceBigDecimals" value="false"/>
    16. javaTypeResolver>
    17. <javaModelGenerator targetPackage="com.zking.spboot.model"
    18. targetProject="src/main/java">
    19. <property name="enableSubPackages" value="false"/>
    20. <property name="constructorBased" value="true"/>
    21. <property name="trimStrings" value="false"/>
    22. <property name="immutable" value="false"/>
    23. javaModelGenerator>
    24. <sqlMapGenerator targetPackage="com.zking.spboot.mapper"
    25. targetProject="src/main/resources">
    26. <property name="enableSubPackages" value="false"/>
    27. sqlMapGenerator>
    28. <javaClientGenerator targetPackage="com.zking.spboot.mapper"
    29. targetProject="src/main/java" type="XMLMAPPER">
    30. <property name="enableSubPackages" value="false"/>
    31. javaClientGenerator>
    32. <table schema="" tableName="t_book" domainObjectName="Book"
    33. enableCountByExample="false" enableDeleteByExample="false"
    34. enableSelectByExample="false" enableUpdateByExample="false">
    35. table>
    36. context>
    37. generatorConfiguration>

    BookMapper

    1. package com.zking.spboot.mapper;
    2. import com.zking.spboot.model.Book;
    3. import org.springframework.stereotype.Repository;
    4. import java.util.List;
    5. @Repository
    6. public interface BookMapper {
    7. int deleteByPrimaryKey(Integer id);
    8. /**
    9. * 根据书本名称模糊查询书本信息
    10. * @param book
    11. * @return
    12. */
    13. List query(Book book);
    14. /**
    15. * 新增书本
    16. * @param record
    17. * @return
    18. */
    19. int insert(Book record);
    20. int insertSelective(Book record);
    21. Book selectByPrimaryKey(Integer id);
    22. int updateByPrimaryKeySelective(Book record);
    23. int updateByPrimaryKey(Book record);
    24. }

    BookMapper.xml

    1. "1.0" encoding="UTF-8" ?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    3. <mapper namespace="com.zking.spboot.mapper.BookMapper" >
    4. <resultMap id="BaseResultMap" type="com.zking.spboot.model.Book" >
    5. <constructor >
    6. <idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
    7. <arg column="bookname" jdbcType="VARCHAR" javaType="java.lang.String" />
    8. <arg column="price" jdbcType="REAL" javaType="java.lang.Float" />
    9. <arg column="booktype" jdbcType="VARCHAR" javaType="java.lang.String" />
    10. constructor>
    11. resultMap>
    12. <sql id="Base_Column_List" >
    13. id, bookname, price, booktype
    14. sql>
    15. <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    16. select
    17. <include refid="Base_Column_List" />
    18. from t_book
    19. where id = #{id,jdbcType=INTEGER}
    20. select>
    21. <select id="query" resultType="com.zking.spboot.model.Book">
    22. select <include refid="Base_Column_List"/> from t_book where 1=1
    23. <if test="null!=bookname and ''!=bookname">
    24. and bookname like concat('%',#{bookname},'%')
    25. if>
    26. select>
    27. <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    28. delete from t_book
    29. where id = #{id,jdbcType=INTEGER}
    30. delete>
    31. <insert id="insert" parameterType="com.zking.spboot.model.Book" >
    32. insert into t_book (bookname, price,
    33. booktype)
    34. values (#{bookname,jdbcType=VARCHAR}, #{price,jdbcType=REAL},
    35. #{booktype,jdbcType=VARCHAR})
    36. insert>
    37. <insert id="insertSelective" parameterType="com.zking.spboot.model.Book" >
    38. insert into t_book
    39. <trim prefix="(" suffix=")" suffixOverrides="," >
    40. <if test="id != null" >
    41. id,
    42. if>
    43. <if test="bookname != null" >
    44. bookname,
    45. if>
    46. <if test="price != null" >
    47. price,
    48. if>
    49. <if test="booktype != null" >
    50. booktype,
    51. if>
    52. trim>
    53. <trim prefix="values (" suffix=")" suffixOverrides="," >
    54. <if test="id != null" >
    55. #{id,jdbcType=INTEGER},
    56. if>
    57. <if test="bookname != null" >
    58. #{bookname,jdbcType=VARCHAR},
    59. if>
    60. <if test="price != null" >
    61. #{price,jdbcType=REAL},
    62. if>
    63. <if test="booktype != null" >
    64. #{booktype,jdbcType=VARCHAR},
    65. if>
    66. trim>
    67. insert>
    68. <update id="updateByPrimaryKeySelective" parameterType="com.zking.spboot.model.Book" >
    69. update t_book
    70. <set >
    71. <if test="bookname != null" >
    72. bookname = #{bookname,jdbcType=VARCHAR},
    73. if>
    74. <if test="price != null" >
    75. price = #{price,jdbcType=REAL},
    76. if>
    77. <if test="booktype != null" >
    78. booktype = #{booktype,jdbcType=VARCHAR},
    79. if>
    80. set>
    81. where id = #{id,jdbcType=INTEGER}
    82. update>
    83. <update id="updateByPrimaryKey" parameterType="com.zking.spboot.model.Book" >
    84. update t_book
    85. set bookname = #{bookname,jdbcType=VARCHAR},
    86. price = #{price,jdbcType=REAL},
    87. booktype = #{booktype,jdbcType=VARCHAR}
    88. where id = #{id,jdbcType=INTEGER}
    89. update>
    90. mapper>

    BookService

    1. package com.zking.spboot.service;
    2. import com.zking.spboot.model.Book;
    3. import org.springframework.stereotype.Repository;
    4. import java.util.List;
    5. public interface BookService {
    6. /**
    7. * 根据书本名称模糊查询书本信息
    8. * @param book
    9. * @return
    10. */
    11. List query(Book book);
    12. /**
    13. * 新增书本
    14. * @param record
    15. * @return
    16. */
    17. int insert(Book record);
    18. }

    BookServiceImpl

    1. package com.zking.spboot.service.Impl;
    2. import com.zking.spboot.mapper.BookMapper;
    3. import com.zking.spboot.model.Book;
    4. import com.zking.spboot.service.BookService;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. import java.util.List;
    8. /**
    9. * @author 小坤
    10. * @create 2022-11-18-19:15
    11. */
    12. @Service
    13. public class BookServiceImpl implements BookService {
    14. @Autowired
    15. private BookMapper bookMapper;
    16. @Override
    17. public List query(Book book) {
    18. return bookMapper.query(book);
    19. }
    20. @Override
    21. public int insert(Book record) {
    22. return bookMapper.insert(record);
    23. }
    24. }

    BookController

    1. package com.zking.spboot.controller;
    2. import com.zking.spboot.model.Book;
    3. import com.zking.spboot.service.BookService;
    4. import lombok.AllArgsConstructor;
    5. import lombok.Data;
    6. import lombok.NoArgsConstructor;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.web.bind.annotation.RequestMapping;
    9. import org.springframework.web.bind.annotation.RestController;
    10. import java.util.List;
    11. /**
    12. * @author 小坤
    13. * @create 2022-11-18-19:19
    14. */
    15. @RestController
    16. @RequestMapping("/book")
    17. public class BookController {
    18. @Autowired
    19. private BookService bookService;
    20. @RequestMapping("/query")
    21. public JsonResponseBody query(Book book){
    22. List books=bookService.query(book);
    23. return new JsonResponseBody<>(200,"ok",books);
    24. }
    25. @RequestMapping("/add")
    26. public JsonResponseBody add(Book book){
    27. bookService.insert(book);
    28. return new JsonResponseBody<>();
    29. }
    30. @Data
    31. @AllArgsConstructor
    32. @NoArgsConstructor
    33. class JsonResponseBody{
    34. private int code=200;
    35. private String msg="ok";
    36. private T data;
    37. }
    38. }

    前台:

    action.js

    1. /**
    2. * 对后台请求的地址的封装,URL格式如下:
    3. * 模块名_实体名_操作
    4. */
    5. export default {
    6. //服务器
    7. 'SERVER': 'http://localhost:8080/spboot',
    8. 'ALL':'/book/query',
    9. 'Add':'/book/add',
    10. //获得请求的完整地址,用于mockjs测试时使用
    11. 'getFullPath': k => {
    12. return this.SERVER + this[k];
    13. }
    14. }

    router-index.js

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. import BookList from '@/views/BookList'
    4. Vue.use(Router)
    5. export default new Router({
    6. routes: [
    7. {
    8. path: '/',
    9. name: 'BookList',
    10. component: BookList
    11. }
    12. ]
    13. })

    BookList.vue

    1. <template>
    2. <div>
    3. <h1 align="center">SpringBoot阶段机试,ts={{ts}}h1>
    4. <el-form :inline="true">
    5. <el-form-item label="书籍名称">
    6. <el-input v-model="bookname" placeholder="书籍名称">el-input>
    7. el-form-item>
    8. <el-form-item>
    9. <el-button type="primary" @click="query">查询el-button>
    10. <el-button type="primary" @click="open">新增el-button>
    11. el-form-item>
    12. el-form>
    13. <el-table :data="tableData" style="width: 100%;">
    14. <el-table-column prop="id" label="编号" >
    15. el-table-column>
    16. <el-table-column prop="bookname" label="书籍名称" >
    17. el-table-column>
    18. <el-table-column prop="price" label="书籍价格" >
    19. el-table-column>
    20. <el-table-column prop="booktype" label="书籍类别" >
    21. el-table-column>
    22. el-table>
    23. <el-dialog @close="close" title="书籍新增" :visible.sync="dialogFormVisible">
    24. <el-form :model="book" :rules="rules" ref="book">
    25. <el-form-item prop="bookname" label="书籍名称" :label-width="formLabelWidth">
    26. <el-input v-model="book.bookname" autocomplete="off">el-input>
    27. el-form-item>
    28. <el-form-item prop="price" label="书籍价格" :label-width="formLabelWidth">
    29. <el-input v-model="book.price" autocomplete="off">el-input>
    30. el-form-item>
    31. <el-form-item prop="booktype" label="书籍类型" :label-width="formLabelWidth">
    32. <el-select style="width: 100%;" v-model="book.booktype" placeholder="请选择书籍类型">
    33. <el-option label="玄幻" value="玄幻">el-option>
    34. <el-option label="散文" value="散文">el-option>
    35. el-select>
    36. el-form-item>
    37. el-form>
    38. <div slot="footer" class="dialog-footer">
    39. <el-button @click="dialogFormVisible = false">取 消el-button>
    40. <el-button type="primary" @click="save()">确 定el-button>
    41. div>
    42. el-dialog>
    43. div>
    44. template>
    45. <script>
    46. export default {
    47. data: function() {
    48. return {
    49. ts: new Date().getTime(),
    50. bookname: '',
    51. tableData: [],
    52. dialogFormVisible: false,
    53. formLabelWidth: '100px',
    54. book: {
    55. bookname: '',
    56. price: '',
    57. booktype: ''
    58. },
    59. rules: {
    60. bookname: [{
    61. required: true,
    62. message: '请输入书籍名称',
    63. trigger: 'blur'
    64. }
    65. ],
    66. price: [{
    67. required: true,
    68. message: '请输入书籍价格',
    69. trigger: 'blur'
    70. }
    71. ],
    72. booktype: [{
    73. required: true,
    74. message: '请选择书籍类型',
    75. trigger: 'change'
    76. }
    77. ],
    78. }
    79. };
    80. },
    81. methods: {
    82. close: function() {
    83. this.$refs['book'].resetFields();
    84. },
    85. save: function() {
    86. this.$refs['book'].validate((valid) => {
    87. if (valid) {
    88. //参数
    89. let url = this.axios.urls.Add;
    90. this.axios.post(url, this.book).then(resp => {
    91. let rs = resp.data;
    92. if (rs.code == 200) {
    93. //关闭对话框
    94. this.dialogFormVisible = false;
    95. //刷新列表
    96. this.query();
    97. } else {
    98. }
    99. }).catch(err => {
    100. });
    101. } else {
    102. console.log('error submit!!');
    103. return false;
    104. }
    105. });
    106. },
    107. open: function() {
    108. this.dialogFormVisible = true;
    109. },
    110. query: function() {
    111. //1、查询参数
    112. let params = {
    113. bookname:this.bookname
    114. }
    115. //2、请求路径
    116. let url = this.axios.urls.ALL;
    117. //3、发起请求
    118. this.axios.post(url, params).then(resp => {
    119. let rs = resp.data;
    120. console.log(rs);
    121. this.tableData = rs.data;
    122. }).catch(err => {
    123. });
    124. }
    125. }
    126. }
    127. script>
    128. <style>
    129. style>

    有小伙伴私信小编说:“在前端数据无法展示,后台查询增加生效了,数据库增加成功,但前端数据不展示。” 这里考虑前端的跨域问题

    ​​​​​​​

    这个问题只需要在controller层添加一行注解就可以解决了

     

     

     

    动手去玩一玩吧~拜拜

  • 相关阅读:
    web前端期末大作业:青岛旅游网页主题网站设计——青岛民俗4页 HTML+CSS 民俗网页设计与制作 web网页设计实例作业 html实训大作业
    1001 害死人不偿命的(3n+1)猜想Java
    【flask进阶】手把手带你搭建可扩展的flask项目脚手架
    前端构建工具 webpack 笔记
    代码随想录算法训练营第六十一天 | 503.下一个更大元素II、42. 接雨水
    七夕来临,程序员该如何花式表白?html+css实现简单七夕表白
    JavaScript 数组如何实现冒泡排序?
    大学生登记国家证书软件著作权提升就业资质
    产品质量模型
    详解图(性质,结构,遍历,最小生成树,最短路径)
  • 原文地址:https://blog.csdn.net/weixin_67450855/article/details/127938359