文章目录


目录

前言

一、重点难点

二、前期准备

1. 创建Web项目,安装连接Tomcat前期工作

2. pom需要引入的坐标与配置

2.引入Vue、element与axios

三、具体步骤

1. 完成一些包的创建和一些工具类的创建等

1. 创建实体类Brand

2. 创建mapper接口与映射文件 

 3. 新建mybatis-config.xml配置文件

 4. 创建工具类SqlSessionFactoryUtils

 5. 完成后的目录结构

2. 基本的前端页面

 1. 设置首行 - 条件查询

 2. 设置批量删除、新增按钮

 3. 设置主数据区 - 表格

  4. 设置分页工具条

 5. 已经完成了基本的页面,最终如下

3. 后端与前端的具体实现

1. 前端读取数据库在表格上显示出来

2. servlet优化(难点)

3. 新增-添加功能

4. 删除功能

5. 修改功能

6. 批量删除功能

7. 分页(难点)

8. 条件查询

 9.修改状态里的数据显示

4. 所有代码



前言

此案例从零新建项目一步一步详细讲解的完成此案例。

此案例介绍:通过启动服务器访问到商品展示页面,展示数据库中信息,实现动态的显示出增加数据、删除数据、查询数据、分页展示、搜索筛选等功能。

修改了一些黑马web存在的一些小bug:点击新增按钮,输入数据时,而查询条件中也会跟着变。
补齐了黑马web课程中删除和修改操作。

提示:每个模块写的代码可能存在问题,因为太多了,导致混乱。最下面有完整的、没有错误的代码

用到的技术:
MVC设计模式、axios网络请求库、Vue(JavaScript框架)、Mybatis框架、Mysql数据库、Tomcat服务器、fastjson库、Maven、element(基于Vue框架)、Servlet服务端程序。  


一、重点难点

难点:
      在我看来最难的还是前端部分,对于模型的创建,每个按钮或是对话框等需要绑定的模型很多很乱。还有难点就是修改bug,展示的是没有bug的,但在编写时总会遗漏、误写等操作。

重点:axios的使用,后端各个模块的逻辑顺序书写。

二、前期准备

1. 创建Web项目,安装连接Tomcat前期工作

1. 选择Maven创建一个项目xz-practice

Java的大作业管理系统 javawab大作业_Java的大作业管理系统

 2. 完成tomcat的安装与连接

 (1)编辑pom.xml

  提示:把程序设为web项目,需要部署为war包。记得刷新一下。

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>xz-practice</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> </project>

(2)编辑标准的web项目结构

提示:webapp在src.main下,是web整体。WEB-INF在webapp下,可以对web进行一些配置等。目前我们只要这个完整的目录结构就好了。

Ctrl + Alt + Shift + s 打开Project Structure项目结构对话框。或者点击右上角小文件夹。

在Project Settings下的Modules里点自己的项目,再点加号来增加Web模块。

Java的大作业管理系统 javawab大作业_maven_02

 下面表示webapp的目录,上面表示的是WEB-INT的目录,双击设置目录,最后点击Apply

WEB-INT:D:\idea_projects\Java_Wab\xz-practice\src\main\webapp\WEB-INF\web.xml

webapp :D:\idea_projects\Java_Wab\xz-practice\src\main\webapp

Java的大作业管理系统 javawab大作业_servlet_03

Java的大作业管理系统 javawab大作业_mybatis_04

 最终目录结构

 

Java的大作业管理系统 javawab大作业_servlet_05

2. pom需要引入的坐标与配置

1. Servlet        添加Servlet依赖才可以使用HttpServlet
2. MyBatis       一种框架,为了封装JDBC,简化开发
3. MySQL        用到MySQL当然需要引入MySQL驱动包
4. fastjson        一种java库,可以将 Java 对象与JSON 格式相互转换,方便前后端传递数据
5. Tomcat        一种服务器,用到它当然要配置

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>xz-practice</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <!--Servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--MyBatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!--MySQL--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <!--fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> </dependencies> <!--Tomcat--> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build> </project>

2.引入Vue、element与axios

1. Vue框架:一种JavaScript前端框架,用来简化前端开发
2. element框架:饿了么公司提供的一些以及写好的Vue框架,直接用来使用,起到美观的作用
3. axios网络请求库:一种轻量级库,简单来说就是发送get或post请求的。

将下面两个文件放置webapp目录下即可

Java的大作业管理系统 javawab大作业_mybatis_06

element文件链接-提取码1234vue框架与axios-提取码1234

三、具体步骤

配置完成,接下来完成此项目。

1. 完成一些包的创建和一些工具类的创建等

1. pojo实体类包
2. mapper包以及对应的映射
3. service包
4. web包与包下的servlet包
5. util工具包

Java的大作业管理系统 javawab大作业_mybatis_07

1. 创建实体类Brand

所有的属性与数据库数据相互对应

package com.itheima.pojo;

public class Brand {
    // id 主键
    private Integer id;
    // 品牌名称
    private String brandName;
    // 企业名称
    private String companyName;
    // 排序字段
    private Integer ordered;
    // 描述信息
    private String description;
    // 状态:0:禁用  1:启用
    private Integer status;


    //省略get和set和toString方法
}

2. 创建mapper接口与映射文件 

在mapper下新建BrandMapper接口,在resources下的mapper里新建BrandMapper.xml

 BrandMapper接口

package com.xz.mapper;

public interface BrandMapper {
}

 BrandMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xz.mapper.BrandMapper">

</mapper>

 3. 新建mybatis-config.xml配置文件

 resources下新建mybatis-config.xml配置文件,按照自己设置账号密码进行修改

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--核心配置文件-->
<configuration>

    <!--这里是起别名,我们没有写,那么在xml文件就需要写全限定类名,这里是跟xml中type属性对应的-->
    <!--    <typeAliases>-->
    <!--        <package name="com.xz.pojo"/>-->
    <!--    </typeAliases>-->

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///db1?useSSL=true"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>
    </environments>

    <!--  关联xml配置的文件  -->
    <mappers>
        <!--扫描mapper-->
        <package name="com.xz.mapper"/>
    </mappers>
</configuration>

 4. 创建工具类SqlSessionFactoryUtils

在util下创建SqlSessionFactory工厂类,为了后期方便获取SqlSession对象执行sql语句

package com.xz.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

public class SqlSessionFactoryUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        //静态代码块会随着类的加载而自动执行,且只执行一次
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }

}

 5. 完成后的目录结构

Java的大作业管理系统 javawab大作业_mybatis_08

2. 基本的前端页面

利用vue和element编写brand.html

1. 在webapp下新建前端页面brand.html
2. 在写组件之前,先将vue的标准形式写出来,并且将vue需要引入的css、js文件先引出来

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    
</div>

<script src="js/vue.js"></script>
<script src="element-ui/lib/index.js"></script>
<link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">

<script>
    new Vue ({
        el:"#app"
    })
</script>

</body>
</html>

3. 在element中找到喜欢的组件:网页

 1. 设置首行 - 条件查询

 找到From表单 - 行内表单有一条适合我们条件查询,我们点击显示代码来分析下代码

Java的大作业管理系统 javawab大作业_tomcat_09


不难看出,script与表单所对应的模型model与点击方法@click

将代码复制到我们的brand.html来,from表单放置div标签内,srcipt放到指定位置。

我们需要完成通过状态、企业名和商品名实现条件查询。加以编辑呈现最终代码和效果如下:

注意:此处将模型更名为selectModel,并修改了数据属性名(status/companyName/brandName)

<el-form>

<el-form :inline="true" :model="selectModel" class="demo-form-inline">
        <el-form-item label="当前状态">
            <el-select v-model="selectModel.status" placeholder="当前状态">
                <el-option label="启用" value="0"></el-option>
                <el-option label="禁用" value="1"></el-option>
            </el-select>
        </el-form-item>
        <el-form-item label="企业名称">
            <el-input v-model="selectModel.companyName" placeholder="企业名称"></el-input>
        </el-form-item>
        <el-form-item label="商品名称">
            <el-input v-model="selectModel.brandName" placeholder="商品名称"></el-input>
        </el-form-item>
        <el-form-item>
            <el-button type="primary" @click="onSubmit">查询</el-button>
        </el-form-item>
</el-form>

<script>
 

data() {
            return {
                selectModel: {
                    status: '',
                    companyName: '',
                    brandName:''
                }
            }
        },
        methods: {
            onSubmit() {
                console.log('submit!');
            }
        }

 

Java的大作业管理系统 javawab大作业_servlet_10

2. 设置批量删除、新增按钮

 目前不做实现,只做显示。在element中找到两个按钮即可。

<!--新增、批量删除行-->
    <el-button type="danger" round>批量删除</el-button>
    <el-button type="success" round>新增</el-button>

 3. 设置主数据区 - 表格

在element找到Table表格,这里用的第一个 ,复制到html中。完成之后我们考虑每一列。
1.  设置对应的列(品牌名称、企业名称、排序、当前状态)
注意:去除了width属性让其自适应大小,设置align=center使标签名居中
 

<!--表格数据-->
            <el-table-column
                    prop="brandName"
                    label="商品名称"
                    align="center">
            </el-table-column>
            <el-table-column
                    prop="companyName"
                    label="企业名称"
                    align="center">
            </el-table-column>
            <el-table-column
                    prop="ordered"
                    label="排序"
                    align="center">
            </el-table-column>
            <el-table-column
                    prop="status"
                    label="当前状态"
                    align="center">
            </el-table-column>

假的表格数据模型

data() {
            return {
                brandData: [{
                    brandName: '戴尔',
                    companyName: '戴尔有限公司',
                    ordered: '100',
                    status:'0'
                },{
                    brandName: '戴尔',
                    companyName: '戴尔有限公司',
                    ordered: '100',
                    status:'0'
                }],
            }
        }

2. 修改和删除按钮(操作)
目前只做显示。

<!--修改和删除按钮-->
            <el-table-column label="操作" align="center">
                <el-button type="warning" round>修改</el-button>
                <el-button type="danger" round>删除</el-button>
            </el-table-column>

3. 设置复选框 - 在Table表格中找到复选框
注意:复选框要完成:1)选中后获取当前的数据-方法。2)建立选中后的数据模型-数据
在表格数据上添加一个多选标签

<!--多选按钮-->
            <el-table-column
                    type="selection"
                    width="55">
            </el-table-column>

 在整个表格里的参数里加入选中后执行的方法

<el-table
                :data="brandData"
                style="width: 100%"
                @selection-change="handleSelectionChange">

</el-table>
methods: {
            handleSelectionChange(val) {//多选按钮
                this.multipleSelection = val;
            }
}

 在数据里增加数据模型

data() {
            return {
                //多选按钮
                multipleSelection: []

            }
}

4. 设置编号
使用type=index

<!--编号-->
            <el-table-column
                    type="index"
                    width="50"
                    align="center">
            </el-table-column>

 5. 设置点击新增按钮弹出一个表单对话框

设置一个弹出的对话框
需要设置一个表单模型(addData),和加入一个新增方法(addBrand),并为新增按钮增加点击事件。

<!--添加数据对话框表单-->
    <el-dialog
            title="新增品牌"
            :visible.sync="dialogVisible"
            width="30%">
        <el-form ref="form" :model="addData" label-width="80px">
            <el-form-item label="品牌名称">
                <el-input v-model="addData.brandName"></el-input>
            </el-form-item>
            <el-form-item label="企业名称">
                <el-input v-model="addData.companyName"></el-input>
            </el-form-item>
            <el-form-item label="排序">
                <el-input v-model="addData.ordered"></el-input>
            </el-form-item>
            <el-form-item label="备注">
                <el-input type="textarea" v-model="addData.description"></el-input>
            </el-form-item>
            <el-form-item label="状态">
                <el-switch v-model="addData.status"
                           active-value="1"
                           inactive-value="0"
                ></el-switch>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="addBrand">提交</el-button>
                <el-button @click="dialogVisible = false">取消</el-button>
            </el-form-item>
        </el-form>
    </el-dialog>
addData:{//新增模型数据
                    brandName:'',
                    companyName: '',
                    ordered: '',
                    description:'',
                    status:''
                },
//默认点击新增按钮前,对话框为关闭状态
                dialogVisible : false
addBrand(){ // 添加数据
                console.log(this.addData);
            }
<!--增加点击方法,使对话框出现-->
    <el-button type="danger" round>批量删除</el-button>
    <el-button type="success" @click="dialogVisible = true" round>新增</el-button>

 6.最终效果

Java的大作业管理系统 javawab大作业_tomcat_11

 

Java的大作业管理系统 javawab大作业_servlet_12

  4. 设置分页工具条

 1. 设置当前页数模型、设置显示的分页方法,书写分页工具条

<!--分页工具条-->
    <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-sizes="[5, 10, 15, 20]"
            :page-size="5"
            layout="total, sizes, prev, pager, next, jumper"
            :total="400">
    </el-pagination>
//设置当前页码模型
                currentPage: 1
//显示分页方法
            handleSizeChange(val) {
                console.log(`每页 ${val} 条`);
            },
            handleCurrentChange(val) {
                console.log(`当前页: ${val}`);
            }

 5. 已经完成了基本的页面,最终如下

Java的大作业管理系统 javawab大作业_servlet_13

3. 后端与前端的具体实现

注意:数据库中的数据就不书写了,自行书写

1. 前端读取数据库在表格上显示出来

1)编写BrandMapper接口,用注解的方式写一个查询所有的方法。
分析:不需要参数,需要返回值,返回所有的Brand对象,因此需要返回List<Brand>
 

@Select("select * from tb_brand")
    Brand selectAll();

 2) 编写过程中,我们发现用到数据库中的属性,列如companyName与company_name可能会有冲突,所有我们要加上@ResultMap,因为在resultMap内明确注明映射关系才会调用对应的setter方法。我们再编写BrandMapper接口,并编写BrandMapper.xml文件。
 

@Select("select * from tb_brand")
    @ResultMap("resultMap")
    List<Brand> selectAll();
<resultMap id="resultMap" type="com.xz.pojo.Brand">
        <result property="brandName" column="brand_name" />
        <result property="companyName" column="company_name" />
</resultMap>

 3) service方法的实现。在service包下新建BrandService接口,写出查询所有的抽象方法,并再次再此包下新建impl包,实现BrandService接口,重写所有方法。

知识点:用接口可以用多态创建BrandService对象,方便后期维护,在service中通过工厂创建出SqlSession对象,并虚假的执行sql语句方法,真正执行需要在servlet里写。

package com.xz.service;

import com.xz.pojo.Brand;
import java.util.List;

public interface BrandService {
    //查询所有
    List<Brand> selectAll();
}
package com.xz.service.impl;

import com.xz.mapper.BrandMapper;
import com.xz.pojo.Brand;
import com.xz.service.BrandService;
import com.xz.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class BrandServiceImpl implements BrandService {
    //创建SqlSessionFactory 工厂对象
    SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();
    public List<Brand> selectAll() {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //调用方法
        List<Brand> brands = mapper.selectAll();
        //释放资源
        sqlSession.close();
        return brands;
    }
}

4)编写servlet。

通过获取service对象,真实的执行sql语句,将获取的数据转换为json格式,发送给前端。

注意:服务器无法启动请查看是否为@WebServlet("/SelectAllServlet")忘记写 / 

package com.xz.web.servlet;

import com.alibaba.fastjson.JSON;
import com.xz.pojo.Brand;
import com.xz.service.BrandService;
import com.xz.service.impl.BrandServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/SelectAllServlet")
public class SelectAllServlet extends HttpServlet {

    //获取到service
    private BrandService brandService = new BrandServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Brand> brands = brandService.selectAll();//直接调用查询
        String brandsString = JSON.toJSONString(brands);//转换格式
        resp.setContentType("text/json;charset=utf-8");//声明传递的是json文件且字符集为utf-8
        resp.getWriter().write(brandsString);//写数据,让axios接受
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

5)测试一下。

启动服务器,输入:http://localhost:8080/xz-practice/SelectAllServlet

Java的大作业管理系统 javawab大作业_maven_14

 6) 前端获取

我们前端写的表格数据模型为brandData,发送请求放在 mounted钩子函数中,响应回来的数据需要赋值给表格绑定的数据模型brandData。

知识点:设置 _this 指向同为 this ,是为了在then(){}中所写 _this 依然指向外部的this

首先我们使用axios,要先导入它的jar包

<script src="js/axios-0.18.0.js"></script>
mounted(){
            var _this = this;
            axios({
                method:"get",
                url:"http://localhost:8080/brand-case/SelectAllServlet"
            }).then(function (resp) {
                _this.brandData = resp.data;
            })
}

此时,输入:http://localhost:8080/xz-practice/brand.html就可以看到数据库中的数据

2. servlet优化(难点)

对于servlet我们每写一个执行sql的语句都要重建一个类去写,且我们有可能遇到不同的类来执行不同的sql语句(比如user也要写查询所有等方法)。我们可以自己定义一个AllServlet方便我们的管理。
需求:编写一个BrandServlet,里面写所有的执行方法。通过输入的url执行不同的方法:比如,xz-practice/selectAll执行查询所有方法,再比如xz-practice/delete执行删除方法,从而在可以方便管理。

知识点:HttpServlet有一个方法service进行数据分发(Post/Get),我们可以在AllServlet中重写此方法,在此方法只需要完成:1) 获取当前请求路径的最后一个名 2)获取到的名就是我们要执行的方法名 3)反射获取BrandServlet的字节码文件,执行对应的方法

 新建AllServlet类,BrandServlet类,BrandServlet继承AllServlet
编写AllServlet类:步骤已经在代码中呈现

package com.xz.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class AllServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 获取传递来的uri
        String uri = req.getRequestURI();
        //2. 获取uri的最后一个后缀名 - 此后缀名为方法名
        int index = uri.lastIndexOf("/"); //返回从最后扫描到的第一个"/"的索引
        String modName = uri.substring(index + 1); //方法名
        //3. 获取BrandServlet的字节码文件
        // 直接用this,因为这是BrandServlet调用的service方法,所以this表示BrandServlet
        Class<? extends AllServlet> brandServletClass = this.getClass();
        //4. 获取它的方法,第一个参数:方法名。其他参数:为该方法的参数
        //我们需要统一参数,把方法的参数都改为 HttpServletRequest与HttpServletResponse
        Method method = null;
        try {
            method = brandServletClass.getMethod(modName, HttpServletRequest.class, HttpServletResponse.class);
            //4. 第一个参数:那个类中的方法名。其他参数:为该方法的参数
            method.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

 编写BrandServlet类:步骤已经在代码中呈现

package com.xz.web.servlet;

import com.alibaba.fastjson.JSON;
import com.xz.pojo.Brand;
import com.xz.service.BrandService;
import com.xz.service.impl.BrandServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/brand/*")
public class BrandServlet extends AllServlet{

    //获取到service
    private BrandService brandService = new BrandServiceImpl();

    //查询所有方法
    public void selectAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Brand> brands = brandService.selectAll();//直接调用查询
        String brandsString = JSON.toJSONString(brands);//转换格式
        resp.setContentType("text/json;charset=utf-8");//声明传递的是json文件且字符集为utf-8
        resp.getWriter().write(brandsString);//写数据,让axios接受
    }
}

现在,我们访问查询所有写的地址是:xz-pratice/brand/selectAll

所以我们前端的axios请求url需要修改

mounted(){
            var _this = this;
            axios({
                method:"get",
                url:"http://localhost:8080/xz-practice/brand/selectAll"
            }).then(function (resp) {
                _this.brandData = resp.data;
            })
        }

删除原先的SelectAllServlet。测试下是否依然可以读取到数据库。

3. 新增-添加功能

我们刚刚写了添加表单,此时我们来实现添加数据至数据库

依然按照这个顺序:mapper >>> service >>> servlet >>> html  

1. BrandMapper增加sql语句。
分析:新增功能我们需要参数,返回值不需要了。

@Insert("insert into tb_brand values(null,#{brandName},#{companyName},#{ordered},#{description},#{status})")
    void addBrand(Brand brand);

2. service编写。接口中增加方法,实现类中实现方法。

BrandService

//新增
    void addBrand(Brand brand);

BrandServiceImpl
注意:修改数据库需要提交事务

public void addBrand(Brand brand) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //调用方法
        mapper.addBrand(brand);
        //改变数据库需要提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
}

3. servlet编写。获取axios传递来的json数据,转换为brand对象后,将此brand发送数据库,向前台传递成功的标识。

//新增方法
    public void addBrand(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader reader = req.getReader();//获取前台数据 - 流
        String json = reader.readLine();//读取流中数据,这是一个json对象
        Brand brand = JSON.parseObject(json, Brand.class);//转换为Brand对象
        brandService.addBrand(brand);//直接调用增加方法
        resp.getWriter().write("yes");//可以发送前端一个成功标识
}

 4. 前端编写。在点击新增后,出现一个表单,提交表单的数据模型我们定义为了addData,我们通过axios获取。表单我们直接使用post,在执行之后,我们需要:1)将对话框关闭 2)重新查询一下刷新数据 3)弹出成功的标识 - 这个直接在element去找就好
注意:因为第2步之前我们已经使用钩子函数mounted查询了所有,这个时候我们写一个select方法,就可以方便的完成这两个需求。

在方法里写一个查询所有的方法selectAll

selectAll(){
                var _this = this;
                axios({
                    method:"get",
                    url:"http://localhost:8080/xz-practice/brand/selectAll"
                }).then(function (resp) {
                    _this.brandData = resp.data;
                })
            }

 钩子函数mounted只需要调用一下

mounted(){
            this.selectAll();//把查询所有的抽出去
        }

addBrand方法中编写axios,这是我们前面绑定的点击事件

addBrand(){ // 添加数据
                var _this = this;
                axios({
                    method: "post",
                    url:"http://localhost:8080/xz-practice/brand/addBrand",
                    data:this.addData
                }).then(function (resp) {//这里是获取到后端传递来数
                    if(resp.data == "yes"){
                        _this.dialogVisible = false;//窗口关闭
                        _this.selectAll();//重新查一下
                        // 在弹出成功信息
                        _this.$message({
                            message: '添加成功√',
                            type: 'success'
                        });
                    }
                })
            }

5. 测试下在点击新增后,输入数据是否显示添加成功标识,且数据库中已经增加数据。

4. 删除功能

同步骤3相似我们快速写一下

BrandMapper

//删除
    @Delete("delete from tb_brand where id = #{id}")
    void deleteBrand(Integer id);

BrandServiceImpl
提示:我们通过id删除,需要将此对象的id获取出来

public void deleteBrand(Brand brand) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //调用方法
        mapper.deleteBrand(brand.getId());
        //改变数据库需要提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
}

BrandService

//删除
    void deleteBrand(Brand brand);

BrandServlet

//删除方法
    public void deleteBrand(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader reader = req.getReader();//获取前台数据 - 流
        String json = reader.readLine();//读取流中数据,这是一个json对象
        Brand brand = JSON.parseObject(json, Brand.class);//转换为Brand对象
        brandService.deleteBrand(brand);//直接调用删除方法
        resp.getWriter().write("yes");//可以发送前端一个成功标识
}

brand.html
这里用到一个新的技术:slot插槽;我们获取表格中此行的数据一般会用到插槽,scope相当于一行的数据, scope.row相当于当前行的数据对象。我们获取到这一行的brand对象,让delete方法带有此行数据row的参数,实现传递本行数据。

重新编辑删除按键。因为修改后期我们也会用到,我们就将两个写在一起。

<!--修改和删除按钮-->
            <el-table-column label="操作" align="center">
                <template slot-scope="scope">
                    <el-button type="warning" round>修改</el-button>
                    <el-button type="danger" @click="deleteBrand(scope.row)" round>删除</el-button>
                </template>
            </el-table-column>

添加一个删除模型

deleteData:{
                    id:'',
                    brandName:'',
                    companyName: '',
                    ordered: '',
                    description:'',
}

 添加删除方法deleteBrand(row) - 带参数

//删除数据
            deleteBrand(row){//我们获取这个script对象
                this.deleteData = row;//为删除模型绑定数据
                var _this = this;
                this.$confirm('您确定要删除这条数据?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => { //点击确定后开始删除
                    axios({
                        method:"post",
                        url:"http://localhost:8080/xz-practice/brand/deleteBrand",
                        data: _this.deleteData
                    }).then(function (resp) {
                        if (resp.data == "yes") {
                            //查询一次
                            _this.selectAll();
                            _this.$message({
                                message: '删除成功√',
                                type: 'success'
                            });
                        }
                    })
                }).catch(() => {//点击取消后的操作
                    this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });
                })
            }

 我们已经完成了删除操作,测试一下吧

5. 修改功能

同步骤3、4相似我们快速写一下

BrandMapper

//修改
    @Update("update tb_brand set brand_name = #{brandName},company_name = #{companyName}, ordered = #{ordered},description = #{description},status = #{status} where id = #{id}")
    void update(Brand brand);

BrandService

//修改
    void updateBrand(Brand brand);

BrandServiceImpl

public void updateBrand(Brand brand) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //调用方法
        mapper.updateBrand(brand);
        //改变数据库需要提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
}

BrandServlet

//修改方法
    public void updateBrand(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader reader = req.getReader();//获取前台数据 - 流
        String json = reader.readLine();//读取流中数据,这是一个json对象
        Brand brand = JSON.parseObject(json, Brand.class);//转换为Brand对象
        brandService.updateBrand(brand);//直接调用修改方法
        resp.getWriter().write("yes");//可以发送前端一个成功标识
    }

 brand.html
这里修改的话,要注意:利用删除功能中获取本行数据的那个方法要改一下,因为我们利用插槽,点击修改后,此时携带着本行的数据,同时要打开一个对话框,因此不能直接的把本行数据传递给后端。所以我们要先写一个方法updateBrandStart,将此行数据赋值到一个我们新建的updateData模型上,并且将对话框设置打开状态。用户填写后点击提交,这时候会执行一个updateBrand方法才会真的把需要修改的数据传递给后台。

修改“修改”和“删除”按钮

<!--修改和删除按钮-->
            <el-table-column label="操作" align="center">
                <template slot-scope="scope">
                    <el-button type="warning" @click="updateBrandStart(scope.row)" round>修改</el-button>
                    <el-button type="danger" @click="deleteBrand(scope.row)" round>删除</el-button>
                </template>
            </el-table-column>

 编写updateData模型

updateData:{
                    id:'',
                    brandName:'',
                    companyName: '',
                    ordered: '',
                    description:'',
                    status:''
                }

编写updateBrandStrat方法 - 注意注解!!!

updateBrandStart(row){
                // 这里JSON.stringify表示将row(script对象)转为json,
                // 这里JSON.parse表示将json对象转为script对象
                // 目的是为了不让updateData地址指向row,此时的row是我们展示在表格上的数据的模型brandData
                // 如果直接写row,那我们在填写对话框时,此时修改数据,表格上的数据也会跟着改变
                // 原因就是我们直接用=会将地址赋值,指向了表格上的的数据模型的地址。
                this.updateData = JSON.parse(JSON.stringify(row));
                this.dialogVisibleUpdate = true;
}

编写updateBrand方法

updateBrand(){
                var _this = this;
                axios({
                    method: "post",
                    url: "http://localhost:8080/xz-practice/brand/updateBrand",
                    data: _this.updateData
                }).then(function (resp) {
                    if (resp.data == "yes") {
                        //关闭窗口
                        _this.dialogVisibleUpdate = false;
                        //再查询一次
                        _this.selectAll();
                        _this.$message({
                            message: '修改成功√',
                            type: 'success'
                        });
                    }
                })
            }

编写弹出的对话框

<!--修改数据对话框表单-->
    <el-dialog
            title="修改品牌"
            :visible.sync="dialogVisibleUpdate"
            width="30%">
        <el-form ref="form" :model="updateData" label-width="80px">
            <el-form-item label="品牌名称">
                <el-input v-model="updateData.brandName"></el-input>
            </el-form-item>
            <el-form-item label="企业名称">
                <el-input v-model="updateData.companyName"></el-input>
            </el-form-item>
            <el-form-item label="排序">
                <el-input v-model="updateData.ordered"></el-input>
            </el-form-item>
            <el-form-item label="备注">
                <el-input type="textarea" v-model="updateData.description"></el-input>
            </el-form-item>
            <el-form-item label="状态">
                <el-switch v-model="updateData.status"
                           active-value="1"
                           inactive-value="0"
                ></el-switch>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="updateBrand">提交</el-button>
                <el-button @click="dialogVisibleUpdate = false">取消</el-button>
            </el-form-item>
        </el-form>
    </el-dialog>

设置默认关闭

dialogVisibleUpdate:false

此时,可以测试代码了,查看是否已经完成了此功能。

6. 批量删除功能

依然要按照顺序一步步编写

1. Dao层

用到复杂的sql语句,因为我们要指定要删除的id这个集合,通过读取这个集合数据执行sql语句
我们在xml文件中书写

BrandMapper.xml

<!--以where id in (1,2,..)的方式进行删除-->
    <delete id="deleteBrands">
        delete from tb_brand where id in 
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

BrandMapper 

//批量删除
    @Delete("deleteBrands")
    void deleteBrands(Integer[] ids);

2. service层

BrandService

//批量删除
    void deleteBrands(Integer[] ids);

BrandServiceImpl

public void deleteBrands(Integer[] ids) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //调用方法
        mapper.deleteBrands(ids);
        //改变数据库需要提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

3. web层

BrandServlet

//批量删除方法
    public void deleteBrands(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader reader = req.getReader();//获取前台数据 - 流
        String json = reader.readLine();//读取流中数据,这是一个json对象
        Integer[] ids = JSON.parseObject(json, Integer[].class);//转换为Integer[]对象
        brandService.deleteBrands(ids);//直接调用删除方法
        resp.getWriter().write("yes");//可以发送前端一个成功标识
    }

4. brand.html

 分析:之前写过一个多选按钮,他有对应的方法和模型,这就代表着我们选中后模型中就会有这些数据。

模型

//多选按钮
                multipleSelection: []

方法

handleSelectionChange(val) {//多选按钮
                //这里的multipleSelection模型就是选中的所有的数据
                this.multipleSelection = val;
            }

 那么就简单了,我们可以创建一个需要删除id的模型,将id赋值进去,在传递给后端

//需要删除的id们
                deleteIds:[]

为批量删除按钮添加点击事件

<!--新增、批量删除行-->
    <el-button type="danger" @click="deleteBrands" round>批量删除</el-button>
    <el-button type="success" @click="dialogVisible = true" round>新增</el-button>

编写deleteBrands方法

//删除一组数据
            deleteBrands(){
                this.$confirm('您确定要删除这些数据?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => { //点击确定后开始删除
                    //先将获取到的需要删除的bran们,将他们的id取出来。
                    //这里可以用this,但axios中的then内部不可以
                    for(let i = 0;i < this.multipleSelection.length;i++){
                        this.deleteIds[i] = this.multipleSelection[i].id;
                    }

                    var _this = this;
                    axios({
                        method:"post",
                        url:"http://localhost:8080/xz-practice/brand/deleteBrands",
                        data: _this.deleteIds
                    }).then(function (resp) {
                        console.log(resp.data)
                        if (resp.data == "yes") {
                            //查询一次
                            _this.selectAll();
                            _this.$message({
                                message: '删除成功√',
                                type: 'success'
                            });
                        }
                    })
                }).catch(() => {//点击取消后的操作
                    this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });
                })
            }

 到这里代码就已经完成了,测试一下批量删除功能吧。

7. 分页(难点)

分析:对于分页,我们要知道后端需要什么数据,前端需要什么数据。
前端:
1. 前端需要知道一共有几页数据,才能显示总页数的数量。只需要后端查询数据库数据的总数量即可,因为前端可以自己计算出这些数据需要分几页。
2. 前端需要知道一页中展示的数据有哪些,就像之前查询所有的数据,我们要把后端查询到的所有的数据给前端来展示一样。比如前端给后端说:我1页分5条,要第5页数据,那我们要查询到这些brand数据。
后端:
1. 后端需要知道当前在第几页,比如前端通过点第击1页、第2页、第3页或第4页等。
提示:这里获取的数据是我们计算sql语句中limit里的第一个参数。后端有总数量,除以这个页数可以得到我们舍弃前几条数据。比如100条数据,显示第5页,就要舍弃前20条数据。
2. 后端需要知道前端准备一页分多少数据进行展示呢?比如前端说一页展示5条数据,那我们获取到这个数字5后,通过数据库查询这5条数据返回给前端。
提示:这一获取的数据是我们计算sql语句中limit里的第二个参数。
3. 例子说明一下:

假设数据库有100条数据,1页分5条,需要查询第5页的数据:

select * from tb_brand limit 20, 5;

表示前20条数据不看,只看第21、22、23、24、25这5条数据。

分析完成,我们从何入手,当然是跟前面一样的步骤:

编写sql语句。
1. 需要参数:参数是1)舍弃前几条数据 2)展示几条数据,才能查到这些数据
注意:前端给我们的数据:一个是当前在第几页,一个是准备一页分多少数据,这个需要在service层实现,我们现在做的是查询这些数据。也就是说,在mapper里的参数和service里的参数不一定要对上。
2. 需要返回值:返回值返回的是给前端的数据,前面已经分析完,一个是数据库总数量,一个查询后显示的数据。

BrandMapper
提示:1处写了@ResultMap,而2处没写。本来我是两处都写了@ResultMap导致查询获取的总数量为null,修了半天才发现这里有毛病。
以后就记住一点:我们返回的数里面若有一个类与数据库名字不一致才会添加,其他时候不要动。例如:1里返回值带Brand,而Brand类中属性companyName与数据库中属性company_name冲突,因此要加@ResultMap。而2里返回值时Integer,很显然没有什么关系则不用加。

//分页查询
    //1. 返回给前端查询这些数据
    @Select("select * from tb_brand limit #{begin} , #{number}")
    @ResultMap("resultMap")
    List<Brand> selectBrandsByPage(@Param("begin") int begin, @Param("number") int number);

    //2. 返回给前端一共有这些数据
    @Select("select count(*) from tb_brand")
    Integer selectSize();

我们可以看到发送给前端的有两个类型,我们可以定义一个Bean,把这两种类型放在一个类中
提示:这里我写了sizes。因为刚刚写了size,在前端获取时因为方法同名,导致无法获取这个值
所以,这种敏感词汇还是不要用为好。

package com.xz.pojo;

import java.util.List;

public class SendBean {

    private Integer sizes;
    private List<Brand> brandsByPage;

    public Integer getSizes() {
        return sizes;
    }

    public void setSizes(Integer sizes) {
        this.sizes = sizes;
    }

    public List<Brand> getBrandsByPage() {
        return brandsByPage;
    }

    public void setBrandsByPage(List<Brand> brandsByPage) {
        this.brandsByPage = brandsByPage;
    }
}

编写service层,因为我们定义了bean,只要写一个方法就好啦。

BrandService

//分页查询
    SendBean selectByPage(int begin,int number);

 BrandServiceImpl

//参数是前端给的两个数据:一个是当前在第几页,一个是准备一页分多少数据(这个就是number)
    public SendBean selectByPage(int nowPage, int number) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //先获取到总页数
        Integer size = mapper.selectSize();
        //计算舍弃前几页,用于查询语句的第一个参数
        Integer begin = (nowPage-1)*number;
        //执行方法
        List<Brand> brands = mapper.selectBrandsByPage(begin, number);
        //设置我们的bean
        SendBean sendBean = new SendBean();
        sendBean.setBrandsByPage(brands);
        sendBean.setSize(size);
        //释放资源
        sqlSession.close();
        return sendBean;
    }

 编写servlet层

//分页查询方法
    public void selectPage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Integer nowPage = Integer.parseInt(req.getParameter("nowPage"));//当前页数
        Integer number = Integer.parseInt(req.getParameter("number"));//每页显示条数
        SendBean sendBean = brandService.selectByPage(nowPage, number);//查询到的SendBean返回前端
        String sendBeanString = JSON.toJSONString(sendBean);
        resp.setContentType("text/json;charset=utf-8");
        resp.getWriter().write(sendBeanString);

    }

 可以先浏览器下测试下代码,在浏览器上书写:

http://localhost:8080/xz-practice/brand/selectByPage?nowPage=1&number=5

Java的大作业管理系统 javawab大作业_Java的大作业管理系统_15

 编写brand.html

首先我们要观察一下分页工具条那个地方的组件,在代码中注解了
这里一个page-size我们需要建立模型要改变它的数值嘛
这里一个total我们需要建立模型要改变它的数值嘛

分页工具条

<!--分页工具条-->
    <!--
    @size-change : 每页显示的条目数发生变化时会触发的事件 - 那个下拉的、一页显示多少数据的
    @current-change :当页码发生变化时,触发的事件
    :current-page : 一页显示的条数(重要的,要返回后端)
    :page-sizes :设置条目数的选择 - 那个下拉的、一页显示多少数据的
    :page-size :一页显示多少个,这个就是(重要的,要返回后端)
    :total:所有页显示的总条数,就是一共有多少数据
    -->
    <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-sizes="[5, 10, 15, 20]"
            :page-size="pageSize"
            layout="total, sizes, prev, pager, next, jumper"
            :total="sizeCount">
    </el-pagination>

 添加的模型 - 这里给的值都是第一次显示的值,就叫它默认值吧。

//设置当前页码模型
                currentPage: 1,
                //设置一共多少数据的模型
                sizeCount:100,
                //设置当前页一共多少数据的模型
                pageSize:5

 编写查看分页工具条中两个方法
很显然,这里就是点击选择一页几条啊?点击选择第几页啊?val就是那个值
我们把这两个值绑定彼此的模型就可以实时修改了
记得要重新查询一下

handleSizeChange(val) {//分页:选择5条/页那么val值就是5,我们可以就可以设置每页显示大小
               // console.log(`每页 ${val} 条`);
                this.pageSize = val;
                this.selectAll();
            },
            handleCurrentChange(val) {//选择第5页,那么值就是5,我们可以设置每页显示5
                // console.log(`当前页: ${val}`);
                this.currentPage = val;
                this.selectAll();
            }

重新编写查询所有方法selectAll()
我们不再显示所有的数据的了,我们需要分页显示
这里可以说一下啊,通过resp.data获取到的是后端给我们的json字符串,这个字符串一个是需要展示的数据们,一个是总页数,我们通过.出他们的名字(这里的名字是我们定义的Bean里的各个属性名),brandData模型是负责显示的数据模型,sizeCount模型是负责显示总共的页数。

selectAll(){
                var _this = this;
                axios({
                    method:"get",
                    url:"http://localhost:8080/xz-practice/brand/selectByPage?nowPage="+this.currentPage
                        +"&number="+this.pageSize
                }).then(function (resp) {
                    _this.brandData = resp.data.brandsByPage;
                    _this.sizeCount = resp.data.sizes;
                })
            }

 可以测试一下了,查看是否已经完成了分页查询

8. 条件查询

对于条件查询,我们仔细想一下前端要获取的和后端要获取的。其实跟分页查询的逻辑差不多。

 前端:(基本类似)
1. 前端依然需要知道一共有几页数据,这个是需要后端查询满足条件的数据共有几条。
2. 前端依然需要知道一页中展示的数据有哪些,这个也需要后端查询满足条件的数据有哪些。
后端:(有差异)
1. 后端需要知道我们在查询栏上写了什么内容,这个需要前端封装对象传递给后端。
2. 依然是查询操作,我们依然需要获取当前页数与每页显示条数。

sql语句有条件且复杂使用BrandMapper.xml

BrandMapper

//条件查询
    //1. 返回给前端查询这些写数据
    // 因为依然是查询语句,我们在编写sql语句时依然要有此页显示几条这样的东西
    // 知识点:当我们写上@Param时,对于Brand第三个参数,我们获取值时要用#{brand.brandName}的方式
    //        而不写@Param时,它会自动识别,直接写#{brandName}
    List<Brand> selectBrandsByCondition(@Param("begin") int begin, @Param("number") int number,@Param("brand") Brand brand);

    //2. 返回给前端满足条件的这些数据有几条
    //传递Brand,就可以通过这个Brand查询到有几条了
    Integer selectSizeCondition(Brand brand);

 BrandMapper.xml
知识点:
resultMap与resultType要看清楚,这俩不做解释(可以查到),只说结论:如果返回一个值,比如说String或者int,那直接用resultType,如果返回的是一个我们定义的类型,且这个类型数据库数据与我们类中属性名不一致那么就用resultMap。 

<!--根据条件查询指定的数据-->
    <select id="selectBrandsByCondition" resultMap="resultMap">
        select * from tb_brand
        <where>
            <if test="brand.brandName != null and brand.brandName != '' ">
                and brand_name like #{brand.brandName}
            </if>
            <if test="brand.companyName != null and brand.companyName != '' ">
                and company_name like #{brand.companyName}
            </if>
            <if test="brand.status != null">
                and status = #{brand.status}
            </if>
        </where>
        limit #{begin}, #{number}
    </select>
    <!--根据条件查询指定的数据的数量-->
    <select id="selectSizeCondition" resultType="Integer">
        select count(*) from tb_brand
        <where>
            <if test="brandName != null and brandName != '' ">
                and brand_name like #{brandName}
            </if>
            <if test="companyName != null and companyName != '' ">
                and company_name like #{companyName}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
        </where>
    </select>

 BrandService
提示:跟前面一样,我们封装了一个这样的bean就只需要写一个就好了。

//条件查询
    SendBean selectByCondition(int nowPage,int number, Brand brand);

BrandServiceImpl
提示:模糊查询需要两边加上 %,我们就放到service业务逻辑层处理

//参数是前端给的:一个是当前在第几页,一个是准备一页分多少数据(这个就是number),一个是Brand
    public SendBean selectByCondition(int nowPage, int number, Brand brand) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        
        // sql语句里的模糊查询,我们需要加上 % 表示左右边任意的数量
        String brandName = brand.getBrandName();
        if (brandName != null && brandName.length() > 0) {
            brand.setBrandName("%" + brandName + "%");
        }
        String companyName = brand.getCompanyName();
        if (companyName != null && companyName.length() > 0) {
            brand.setCompanyName("%" + companyName + "%");
        }

        //先获取到满足条件的总页数
        Integer size = mapper.selectSizeCondition(brand);
        //计算舍弃前几页,用于查询语句的第一个参数
        Integer begin = (nowPage - 1) * number;
        //执行方法
        List<Brand> brands = mapper.selectBrandsByCondition(begin, number, brand);
        //设置我们的bean
        SendBean sendBean = new SendBean();
        sendBean.setBrandsByPage(brands);
        sendBean.setSizes(size);
        //释放资源
        sqlSession.close();
        return sendBean;
    }

BrandServlet

//条件查询方法
    public void selectByCondition(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端给我封装好的brand的JSON字符串,进行转换
        BufferedReader reader = req.getReader();
        String brandJson = reader.readLine();
        Brand brand = JSON.parseObject(brandJson, Brand.class);
        Integer nowPage = Integer.parseInt(req.getParameter("nowPage"));//当前页数
        Integer number = Integer.parseInt(req.getParameter("number"));//每页显示条数
        SendBean sendBean = brandService.selectByCondition(nowPage, number, brand);//查询到的SendBean返回前端
        String sendBeanString = JSON.toJSONString(sendBean);
        resp.setContentType("text/json;charset=utf-8");
        resp.getWriter().write(sendBeanString);
    }

brand.html

对于前端页面,我们直接修改seleAll(),为什么可以呢?因为我们之前是根据页面查询,只是附加了一个功能-再根据条件查询。分析下步骤:一开始,我们没有查询数据,我们把一个空的模型传递给后端,后端里sql语句中会发现是空的,那么直接把where条件整个删掉,就满足了之前的分页查询功能。如果输入了数据以后,那么前端会封装到一个模型,通过data把这个模型传递给后端,后端接受这个数据,查询后返回给前端。也就显示出了查询后的结果。

首先是需要用到的模型:

brand:{ //满足条件展示的数据
                    id:'',
                    brandName: '',
                    companyName: '',
                    ordered: '',
                    status:'',
                    description:''
                }

在条件查询绑定上这个模型,才能获取填写的数据

<!--条件查询行-->
    <el-form :inline="true" :model="brand" class="demo-form-inline">
        <el-form-item label="当前状态">
            <el-select v-model="brand.status" placeholder="当前状态">
                <el-option label="启用" value="1"></el-option>
                <el-option label="禁用" value="0"></el-option>
            </el-select>
        </el-form-item>
        <el-form-item label="企业名称">
            <el-input v-model="brand.companyName" placeholder="企业名称"></el-input>
        </el-form-item>
        <el-form-item label="商品名称">
            <el-input v-model="brand.brandName" placeholder="商品名称"></el-input>
        </el-form-item>
        <el-form-item>
            <el-button type="primary" @click="onSubmit">查询</el-button>
        </el-form-item>
    </el-form>

看到有一个查询方法,因为分页查询和条件查询结合了,所以只需要重新selectAll()一下就好了。

onSubmit() {
                this.selectAll();
            }

我们再来修改selectAll。
提示:

1. 修改url,我们通过条件查询
2. 修改为post请求,因为需要传递数据模型了
3. 将data写上我们的条件查询框绑定的brand模型

selectAll(){
                var _this = this;
                axios({
                    method:"post",
                    url:"http://localhost:8080/xz-practice/brand/selectByCondition?nowPage="+this.currentPage
                        +"&number="+this.pageSize,
                    data:this.brand
                }).then(function (resp) {
                    _this.brandData = resp.data.brandsByPage;
                    _this.sizeCount = resp.data.sizes;
                })
            }

写完之后我们来分析一下,这selectAll写了第三次,分别是分页查询代替了查询所有;条件查询代替了分页查询;那我们是不是可以删除分页查询和查询所有?答案是:当然可以;
我们可以尝试着删除从mapper >> service >>> servlet 所有关于查询所有和分页查询的注释掉,我们会发现其实一点问题没有。

 9.修改状态里的数据显示

我们发现在显示的界面上状态一栏总是显示1或0,我们能否更改显示为启用或禁用。
我们需要知道是在哪儿显示的,在表格区域里查找,可以看到:

<el-table-column
                    prop="status"
                    label="当前状态"
                    align="center">
              </el-table-column>

 我们要知道他是怎么显示的,他是通过调用Brand类中的getStatus()获取的数据,当然是0或1了,那我们想要显示启用或者禁用就需要添加一个getNewStauus()方法,用来显示:

在Brand类中添加:

public String getNewStatus(){
        if (status == null){
            return "未知";
        }
        return status == 0 ? "禁用":"启用";
    }

此时再修改表格区域里的prop属性:

<el-table-column
                    prop="newStatus"
                    label="当前状态"
                    align="center">
              </el-table-column>

可以启动测试一下啦!

4. 所有代码

Brand

package com.xz.pojo;

public class Brand {
    // id 主键
    private Integer id;
    // 品牌名称
    private String brandName;
    // 企业名称
    private String companyName;
    // 排序字段
    private Integer ordered;
    // 描述信息
    private String description;
    // 状态:0:禁用  1:启用
    private Integer status;

    public Integer getId() {
        return id;
    }

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

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public Integer getOrdered() {
        return ordered;
    }

    public void setOrdered(Integer ordered) {
        this.ordered = ordered;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }


    public String getNewStatus(){
        if (status == null){
            return "未知";
        }
        return status == 0 ? "禁用":"启用";
    }

    @Override
    public String toString() {
        return "Brand{" +
                "id=" + id +
                ", brandName='" + brandName + '\'' +
                ", companyName='" + companyName + '\'' +
                ", ordered=" + ordered +
                ", description='" + description + '\'' +
                ", status=" + status +
                '}';
    }
}

SendBean

package com.xz.pojo;

import java.util.List;

public class SendBean {

    private Integer sizes;
    private List<Brand> brandsByPage;

    public Integer getSizes() {
        return sizes;
    }

    public void setSizes(Integer sizes) {
        this.sizes = sizes;
    }

    public List<Brand> getBrandsByPage() {
        return brandsByPage;
    }

    public void setBrandsByPage(List<Brand> brandsByPage) {
        this.brandsByPage = brandsByPage;
    }
}

BrandMapper

package com.xz.mapper;

import com.xz.pojo.Brand;
import org.apache.ibatis.annotations.*;
import java.util.List;

public interface BrandMapper {

    //@Select("select * from tb_brand")
    //@ResultMap("resultMap")
    //List<Brand> selectAll();

    @Insert("insert into tb_brand values(null,#{brandName},#{companyName},#{ordered},#{description},#{status})")
    void addBrand(Brand brand);

    //删除
    @Delete("delete from tb_brand where id = #{id}")
    void deleteBrand(Integer id);

    //修改
    @Update("update tb_brand set brand_name = #{brandName},company_name = #{companyName}, ordered = #{ordered},description = #{description},status = #{status} where id = #{id}")
    void updateBrand(Brand brand);

    //批量删除
    void deleteBrands(@Param("ids") Integer[] ids);

    //分页查询
    //1. 返回给前端查询这些数据
    //@Select("select * from tb_brand limit #{begin} , #{number}")
    //@ResultMap("resultMap")
    //List<Brand> selectBrandsByPage(@Param("begin") int begin, @Param("number") int number);

    //2. 返回给前端一共有这些数据
    //@Select("select count(*) from tb_brand")
    //Integer selectSize();

    //条件查询
    //1. 返回给前端查询这些写数据
    // 因为依然是查询语句,我们在编写sql语句时依然要有此页显示几条这样的东西
    // 知识点:当我们写上@Param时,对于Brand第三个参数,我们获取值时要用#{brand.brandName}的方式
    //        而不写@Param时,它会自动识别,直接写#{brandName}
    List<Brand> selectBrandsByCondition(@Param("begin") int begin, @Param("number") int number,@Param("brand") Brand brand);

    //2. 返回给前端满足条件的这些数据有几条
    //传递Brand,就可以通过这个Brand查询到有几条了
    Integer selectSizeCondition(Brand brand);

}

BrandMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xz.mapper.BrandMapper">

    <resultMap id="resultMap" type="com.xz.pojo.Brand">
        <result property="brandName" column="brand_name" />
        <result property="companyName" column="company_name" />
    </resultMap>

    <!--以where id in (1,2,..)的方式进行删除-->
    <delete id="deleteBrands">
        delete from tb_brand where id in
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

    <!--根据条件查询指定的数据-->
    <!--ResultType和ResultMap都是执行查询语句时返回的结果集-->
    <select id="selectBrandsByCondition" resultMap="resultMap">
        select * from tb_brand
        <where>
            <if test="brand.brandName != null and brand.brandName != '' ">
                and brand_name like #{brand.brandName}
            </if>
            <if test="brand.companyName != null and brand.companyName != '' ">
                and company_name like #{brand.companyName}
            </if>
            <if test="brand.status != null">
                and status = #{brand.status}
            </if>
        </where>
        limit #{begin}, #{number}
    </select>
    <!--根据条件查询指定的数据的数量-->
    <select id="selectSizeCondition" resultType="Integer">
        select count(*) from tb_brand
        <where>
            <if test="brandName != null and brandName != '' ">
                and brand_name like #{brandName}
            </if>
            <if test="companyName != null and companyName != '' ">
                and company_name like #{companyName}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
        </where>
    </select>
    
</mapper>

BrandService

package com.xz.service;

import com.xz.pojo.Brand;
import com.xz.pojo.SendBean;

public interface BrandService {
    //查询所有
    //List<Brand> selectAll();

    //新增
    void addBrand(Brand brand);

    //删除
    void deleteBrand(Brand brand);

    //修改
    void updateBrand(Brand brand);

    //批量删除
    void deleteBrands(Integer[] ids);

    //分页查询
    //SendBean selectByPage(int nowPage,int number);

    //条件查询
    SendBean selectByCondition(int nowPage,int number, Brand brand);
}

BrandServiceImpl

package com.xz.service.impl;

import com.xz.mapper.BrandMapper;
import com.xz.pojo.Brand;
import com.xz.pojo.SendBean;
import com.xz.service.BrandService;
import com.xz.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class BrandServiceImpl implements BrandService {
    //创建SqlSessionFactory 工厂对象
    SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();

//    public List<Brand> selectAll() {
//        //获取SqlSession对象
//        SqlSession sqlSession = factory.openSession();
//        //获取BrandMapper
//        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
//        //调用方法
//        List<Brand> brands = mapper.selectAll();
//        //释放资源
//        sqlSession.close();
//        return brands;
//    }

    public void addBrand(Brand brand) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //调用方法
        mapper.addBrand(brand);
        //改变数据库需要提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

    public void deleteBrand(Brand brand) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //调用方法
        mapper.deleteBrand(brand.getId());
        //改变数据库需要提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

    public void updateBrand(Brand brand) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //调用方法
        mapper.updateBrand(brand);
        //改变数据库需要提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

    public void deleteBrands(Integer[] ids) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
        //调用方法
        mapper.deleteBrands(ids);
        //改变数据库需要提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

    //参数是前端给的两个数据:一个是当前在第几页,一个是准备一页分多少数据(这个就是number)
//    public SendBean selectByPage(int nowPage, int number) {
//        //获取SqlSession对象
//        SqlSession sqlSession = factory.openSession();
//        //获取BrandMapper
//        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
//        //先获取到总页数
//        Integer size = mapper.selectSize();
//        //计算舍弃前几页,用于查询语句的第一个参数
//        Integer begin = (nowPage - 1) * number;
//        //执行方法
//        List<Brand> brands = mapper.selectBrandsByPage(begin, number);
//        //设置我们的bean
//        SendBean sendBean = new SendBean();
//        sendBean.setBrandsByPage(brands);
//        sendBean.setSizes(size);
//        //释放资源
//        sqlSession.close();
//        return sendBean;
//    }

    //参数是前端给的:一个是当前在第几页,一个是准备一页分多少数据(这个就是number),一个是Brand
    public SendBean selectByCondition(int nowPage, int number, Brand brand) {
        //获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        //获取BrandMapper
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        // sql语句里的模糊查询,我们需要加上 % 表示左右边任意的数量
        String brandName = brand.getBrandName();
        if (brandName != null && brandName.length() > 0) {
            brand.setBrandName("%" + brandName + "%");
        }
        String companyName = brand.getCompanyName();
        if (companyName != null && companyName.length() > 0) {
            brand.setCompanyName("%" + companyName + "%");
        }

        //先获取到满足条件的总页数
        Integer size = mapper.selectSizeCondition(brand);
        //计算舍弃前几页,用于查询语句的第一个参数
        Integer begin = (nowPage - 1) * number;
        //执行方法
        List<Brand> brands = mapper.selectBrandsByCondition(begin, number, brand);
        //设置我们的bean
        SendBean sendBean = new SendBean();
        sendBean.setBrandsByPage(brands);
        sendBean.setSizes(size);
        //释放资源
        sqlSession.close();
        return sendBean;
    }
}

AllServlet

package com.xz.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class AllServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 获取传递来的uri
        String uri = req.getRequestURI();
        //2. 获取uri的最后一个后缀名 - 此后缀名为方法名
        int index = uri.lastIndexOf("/"); //返回从最后扫描到的第一个"/"的索引
        String modName = uri.substring(index + 1); //方法名
        //3. 获取BrandServlet的字节码文件
        // 直接用this,因为这是BrandServlet调用的service方法,所以this表示BrandServlet
        Class<? extends AllServlet> brandServletClass = this.getClass();
        //4. 获取它的方法,第一个参数:方法名。其他参数:为该方法的参数
        //我们需要统一参数,把方法的参数都改为 HttpServletRequest与HttpServletResponse
        Method method = null;
        try {
            method = brandServletClass.getMethod(modName, HttpServletRequest.class, HttpServletResponse.class);
            //4. 第一个参数:那个类中的方法名。其他参数:为该方法的参数
            method.invoke(this,req,resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

BrandServlet

package com.xz.web.servlet;

import com.alibaba.fastjson.JSON;
import com.xz.pojo.Brand;
import com.xz.pojo.SendBean;
import com.xz.service.BrandService;
import com.xz.service.impl.BrandServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.List;

@WebServlet("/brand/*")
public class BrandServlet extends AllServlet{

    //获取到service
    private BrandService brandService = new BrandServiceImpl();

    //查询所有方法
//    public void selectAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        List<Brand> brands = brandService.selectAll();//直接调用查询
//        String brandsString = JSON.toJSONString(brands);//转换格式
//        resp.setContentType("text/json;charset=utf-8");//声明传递的是json文件且字符集为utf-8
//        resp.getWriter().write(brandsString);//写数据,让axios接受
//    }

    //新增方法
    public void addBrand(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader reader = req.getReader();//获取前台数据 - 流
        String json = reader.readLine();//读取流中数据,这是一个json对象
        Brand brand = JSON.parseObject(json, Brand.class);//转换为Brand对象
        brandService.addBrand(brand);//直接调用增加方法
        resp.getWriter().write("yes");//可以发送前端一个成功标识
    }

    //删除方法
    public void deleteBrand(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader reader = req.getReader();//获取前台数据 - 流
        String json = reader.readLine();//读取流中数据,这是一个json对象
        Brand brand = JSON.parseObject(json, Brand.class);//转换为Brand对象
        brandService.deleteBrand(brand);//直接调用删除方法
        resp.getWriter().write("yes");//可以发送前端一个成功标识
    }

    //修改方法
    public void updateBrand(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader reader = req.getReader();//获取前台数据 - 流
        String json = reader.readLine();//读取流中数据,这是一个json对象
        Brand brand = JSON.parseObject(json, Brand.class);//转换为Brand对象
        brandService.updateBrand(brand);//直接调用修改方法
        resp.getWriter().write("yes");//可以发送前端一个成功标识
    }

    //批量删除方法
    public void deleteBrands(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        BufferedReader reader = req.getReader();//获取前台数据 - 流
        String json = reader.readLine();//读取流中数据,这是一个json对象
        Integer[] ids = JSON.parseObject(json, Integer[].class);//转换为Integer[]对象
        brandService.deleteBrands(ids);//直接调用删除方法
        resp.getWriter().write("yes");//可以发送前端一个成功标识
    }

    //分页查询方法
    //分页查询方法
//    public void selectPage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//
//        Integer nowPage = Integer.parseInt(req.getParameter("nowPage"));//当前页数
//        Integer number = Integer.parseInt(req.getParameter("number"));//每页显示条数
//        SendBean sendBean = brandService.selectByPage(nowPage, number);//查询到的SendBean返回前端
//        String sendBeanString = JSON.toJSONString(sendBean);
//        resp.setContentType("text/json;charset=utf-8");
//        resp.getWriter().write(sendBeanString);
//
//    }

    //条件查询方法
    public void selectByCondition(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端给我封装好的brand的JSON字符串,进行转换
        BufferedReader reader = req.getReader();
        String brandJson = reader.readLine();
        Brand brand = JSON.parseObject(brandJson, Brand.class);
        Integer nowPage = Integer.parseInt(req.getParameter("nowPage"));//当前页数
        Integer number = Integer.parseInt(req.getParameter("number"));//每页显示条数
        SendBean sendBean = brandService.selectByCondition(nowPage, number, brand);//查询到的SendBean返回前端
        String sendBeanString = JSON.toJSONString(sendBean);
        resp.setContentType("text/json;charset=utf-8");
        resp.getWriter().write(sendBeanString);
    }
}

brand.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">

    <!--条件查询行-->
    <el-form :inline="true" :model="brand" class="demo-form-inline">
        <el-form-item label="当前状态">
            <el-select v-model="brand.status" placeholder="当前状态">
                <el-option label="启用" value="1"></el-option>
                <el-option label="禁用" value="0"></el-option>
            </el-select>
        </el-form-item>
        <el-form-item label="企业名称">
            <el-input v-model="brand.companyName" placeholder="企业名称"></el-input>
        </el-form-item>
        <el-form-item label="商品名称">
            <el-input v-model="brand.brandName" placeholder="商品名称"></el-input>
        </el-form-item>
        <el-form-item>
            <el-button type="primary" @click="onSubmit">查询</el-button>
        </el-form-item>
    </el-form>

    <!--新增、批量删除行-->
    <el-button type="danger" @click="deleteBrands" round>批量删除</el-button>
    <el-button type="success" @click="dialogVisible = true" round>新增</el-button>

    <!--新增数据对话框表单-->
    <el-dialog
            title="新增品牌"
            :visible.sync="dialogVisible"
            width="30%">
        <el-form ref="form" :model="addData" label-width="80px">
            <el-form-item label="品牌名称">
                <el-input v-model="addData.brandName"></el-input>
            </el-form-item>
            <el-form-item label="企业名称">
                <el-input v-model="addData.companyName"></el-input>
            </el-form-item>
            <el-form-item label="排序">
                <el-input v-model="addData.ordered"></el-input>
            </el-form-item>
            <el-form-item label="备注">
                <el-input type="textarea" v-model="addData.description"></el-input>
            </el-form-item>
            <el-form-item label="状态">
                <el-switch v-model="addData.status"
                           active-value="1"
                           inactive-value="0"
                ></el-switch>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="addBrand">提交</el-button>
                <el-button @click="dialogVisible = false">取消</el-button>
            </el-form-item>
        </el-form>
    </el-dialog>

    <!--修改数据对话框表单-->
    <el-dialog
            title="修改品牌"
            :visible.sync="dialogVisibleUpdate"
            width="30%">
        <el-form ref="form" :model="updateData" label-width="80px">
            <el-form-item label="品牌名称">
                <el-input v-model="updateData.brandName"></el-input>
            </el-form-item>
            <el-form-item label="企业名称">
                <el-input v-model="updateData.companyName"></el-input>
            </el-form-item>
            <el-form-item label="排序">
                <el-input v-model="updateData.ordered"></el-input>
            </el-form-item>
            <el-form-item label="备注">
                <el-input type="textarea" v-model="updateData.description"></el-input>
            </el-form-item>
            <el-form-item label="状态">
                <el-switch v-model="updateData.status"
                           active-value="1"
                           inactive-value="0"
                ></el-switch>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="updateBrand">提交</el-button>
                <el-button @click="dialogVisibleUpdate = false">取消</el-button>
            </el-form-item>
        </el-form>
    </el-dialog>

    <!--表格主数据展示区-->
    <template>
        <el-table
                :data="brandData"
                style="width: 100%"
                @selection-change="handleSelectionChange">

            <!--多选按钮-->
            <el-table-column
                    type="selection"
                    width="55">
            </el-table-column>

            <!--编号-->
            <el-table-column
                    type="index"
                    width="50"
                    align="center">
            </el-table-column>

            <!--表格数据-->
            <el-table-column
                    prop="brandName"
                    label="商品名称"
                    align="center">
            </el-table-column>
            <el-table-column
                    prop="companyName"
                    label="企业名称"
                    align="center">
            </el-table-column>
            <el-table-column
                    prop="ordered"
                    label="排序"
                    align="center">
            </el-table-column>
            <el-table-column
                    prop="newStatus"
                    label="当前状态"
                    align="center">
            </el-table-column>

            <!--修改和删除按钮-->
            <el-table-column label="操作" align="center">
                <template slot-scope="scope">
                    <el-button type="warning" @click="updateBrandStart(scope.row)" round>修改</el-button>
                    <el-button type="danger" @click="deleteBrand(scope.row)" round>删除</el-button>
                </template>
            </el-table-column>

        </el-table>
    </template>

    <!--分页工具条-->
    <!--
    @size-change : 每页显示的条目数发生变化时会触发的事件 - 那个下拉的、一页显示多少数据的
    @current-change :当页码发生变化时,触发的事件
    :current-page : 一页显示的条数(重要的,要返回后端)
    :page-sizes :设置条目数的选择 - 那个下拉的、一页显示多少数据的
    :page-size :一页显示多少个,这个就是(重要的,要返回后端)
    :total:所有页显示的总条数,就是一共有多少数据
    -->
    <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-sizes="[5, 10, 15, 20]"
            :page-size="pageSize"
            layout="total, sizes, prev, pager, next, jumper"
            :total="sizeCount">
    </el-pagination>

</div>

<script src="js/vue.js"></script>
<script src="element-ui/lib/index.js"></script>
<link rel="stylesheet" href="element-ui/lib/theme-chalk/index.css">
<script src="js/axios-0.18.0.js"></script>

<script>
    new Vue ({
        el:"#app",
        data() {
            return {
                brandData: [{ //展示的数据
                    brandName: '',
                    companyName: '',
                    ordered: '',
                    status:'',
                }],
                brand:{ //满足条件展示的数据
                    id:'',
                    brandName: '',
                    companyName: '',
                    ordered: '',
                    status:'',
                    description:''
                },
                addData:{//新增模型数据
                    brandName:'',
                    companyName: '',
                    ordered: '',
                    description:'',
                    status:''
                },
                deleteData:{
                    id:'',
                    brandName:'',
                    companyName: '',
                    ordered: '',
                    description:'',
                    status:''
                },
                updateData:{
                    id:'',
                    brandName:'',
                    companyName: '',
                    ordered: '',
                    description:'',
                    status:''
                },
                //多选按钮
                multipleSelection: [],
                //需要删除的id们
                deleteIds:[],
                //默认点击新增按钮前,对话框为关闭状态
                dialogVisible : false,
                //默认点击修改按钮前,对话框为关闭状态
                dialogVisibleUpdate:false,
                //设置当前页码模型
                currentPage: 1,
                //设置一共多少数据的模型
                sizeCount:100,
                //设置当前页一共多少数据的模型
                pageSize:5

            }
        },
        methods: {
            onSubmit() {
                this.selectAll();
            },
            selectAll(){
                var _this = this;
                axios({
                    method:"post",
                    url:"http://localhost:8080/xz-practice/brand/selectByCondition?nowPage="+this.currentPage
                        +"&number="+this.pageSize,
                    data:this.brand
                }).then(function (resp) {
                    _this.brandData = resp.data.brandsByPage;
                    _this.sizeCount = resp.data.sizes;
                })
            },
            handleSelectionChange(val) {//多选按钮
                //这里的multipleSelection模型就是选中的所有的数据
                this.multipleSelection = val;
            },
            addBrand(){ // 添加数据
                var _this = this;
                axios({
                    method: "post",
                    url:"http://localhost:8080/xz-practice/brand/addBrand",
                    data:this.addData
                }).then(function (resp) {//这里是获取到后端传递来数
                    if(resp.data == "yes"){
                        _this.dialogVisible = false;//窗口关闭
                        _this.selectAll();//重新查一下
                        // 在弹出成功信息
                        _this.$message({
                            message: '添加成功√',
                            type: 'success'
                        });
                    }
                })
            },
            //删除数据
            deleteBrand(row){//我们获取这个script对象
                this.deleteData = row;//为删除模型绑定数据
                var _this = this;
                this.$confirm('您确定要删除这条数据?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => { //点击确定后开始删除
                    axios({
                        method:"post",
                        url:"http://localhost:8080/xz-practice/brand/deleteBrand",
                        data: _this.deleteData
                    }).then(function (resp) {
                        if (resp.data == "yes") {
                            //查询一次
                            _this.selectAll();
                            _this.$message({
                                message: '删除成功√',
                                type: 'success'
                            });
                        }
                    })
                }).catch(() => {//点击取消后的操作
                    this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });
                })
            },//删除一组数据
            deleteBrands(){
                this.$confirm('您确定要删除这些数据?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => { //点击确定后开始删除
                    //先将获取到的需要删除的bran们,将他们的id取出来。
                    //这里可以用this,但axios中的then内部不可以
                    for(let i = 0;i < this.multipleSelection.length;i++){
                        this.deleteIds[i] = this.multipleSelection[i].id;
                    }

                    var _this = this;
                    axios({
                        method:"post",
                        url:"http://localhost:8080/xz-practice/brand/deleteBrands",
                        data: _this.deleteIds
                    }).then(function (resp) {
                        if (resp.data == "yes") {
                            //查询一次
                            _this.selectAll();
                            _this.$message({
                                message: '删除成功√',
                                type: 'success'
                            });
                        }
                    })
                }).catch(() => {//点击取消后的操作
                    this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });
                })
            },
            updateBrandStart(row){
                // 这里JSON.stringify表示将row(script对象)转为json,
                // 这里JSON.parse表示将json对象转为script对象
                // 目的是为了不让updateData地址指向row,此时的row是我们展示在表格上的数据的模型brandData
                // 如果直接写row,那我们在填写对话框时,此时修改数据,表格上的数据也会跟着改变
                // 原因就是我们直接用=会将地址赋值,指向了表格上的的数据模型的地址。
                this.updateData = JSON.parse(JSON.stringify(row));
                this.dialogVisibleUpdate = true;
            },
            updateBrand(){
                var _this = this;
                axios({
                    method: "post",
                    url: "http://localhost:8080/xz-practice/brand/updateBrand",
                    data: _this.updateData
                }).then(function (resp) {
                    if (resp.data == "yes") {
                        //关闭窗口
                        _this.dialogVisibleUpdate = false;
                        //再查询一次
                        _this.selectAll();
                        _this.$message({
                            message: '修改成功√',
                            type: 'success'
                        });
                    }
                })
            },
            handleSizeChange(val) {//分页:选择5条/页那么val值就是5,我们可以就可以设置每页显示大小
               // console.log(`每页 ${val} 条`);
                this.pageSize = val;
                this.selectAll();
            },
            handleCurrentChange(val) {//选择第5页,那么值就是5,我们可以设置每页显示5
                // console.log(`当前页: ${val}`);
                this.currentPage = val;
                this.selectAll();
            }
        },
        mounted(){
            this.selectAll();//把查询所有的抽出去
        }
    })
</script>

</body>
</html>