VUE&Element

今日目标:

3,综合案例

3.1 功能介绍

image-20210825171411003

以上是我们在综合案例要实现的功能。对数据的除了对数据的增删改查功能外,还有一些复杂的功能,如 批量删除分页查询条件查询 等功能

这里的 修改品牌删除品牌 功能在课程上不做讲解,留作同学来下的练习。

3.2 环境准备

环境准备我们主要完成以下两件事即可

3.2.1 工程准备

04-资料\01-初始工程 中的 brand-case 工程导入到我们自己的 idea 中。工程结构如下:

image-20210825195522904

3.2.2 创建表

下面是创建表的语句

3.3 查询所有功能

image-20210825200138600

如上图所示是查询所有品牌数据在页面展示的效果。要实现这个功能,要先搞明白如下问题:

整体流程如下

image-20210825200332542

我们先实现后端程序,然后再实现前端程序。

3.3.1 后端实现

3.3.1.1 dao方法实现

com.itheima.mapper.BrandMapper 接口中定义抽象方法,并使用 @Select 注解编写 sql 语句

由于表中有些字段名和实体类中的属性名没有对应,所以需要在 com/itheima/mapper/BrandMapper.xml 映射配置文件中定义结果映射 ,使用resultMap 标签。映射配置文件内容如下:

定义完结果映射关系后,在接口 selectAll() 方法上引用该结构映射。使用 @ResultMap("brandResultMap") 注解

完整接口的 selectAll() 方法如下:

3.3.1.2 service方法实现

com.itheima.service 包下创建 BrandService 接口,在该接口中定义查询所有的抽象方法

并在 com.itheima.service 下再创建 impl 包;impl 表示是放 service 层接口的实现类的包。 在该包下创建名为 BrandServiceImpl

此处为什么要给 service 定义接口呢?因为service定义了接口后,在 servlet 中就可以使用多态的形式创建Service实现类的对象,如下:

image-20210825203843142

这里使用多态是因为方便我们后期解除 Servletservice 的耦合。从上面的代码我们可以看到 SelectAllServlet 类和 BrandServiceImpl 类之间是耦合在一起的,如果后期 BrandService 有其它更好的实现类(例如叫 BrandServiceImpl),那就需要修改 SelectAllServlet 类中的代码。后面我们学习了 Spring 框架后就可以解除 SelectAllServlet 类和红色框括起来的代码耦合。而现在咱们还做不到解除耦合,在这里只需要理解为什么定义接口即可。

BrandServiceImpl 类代码如下:

3.3.1.3 servlet实现

com.itheima.web.servlet 包下定义名为 SelectAllServlet 的查询所有的 servlet。该 servlet 逻辑如下:

代码如下:

3.3.1.4 测试后端程序

在浏览器输入访问 servlet 的资源路径 http://localhost:8080/brand-case/selectAllServlet ,如果没有报错,并能看到如下信息表明后端程序没有问题

image-20210825205133752

3.3.2 前端实现

前端需要在页面加载完毕后发送 ajax 请求,所以发送请求的逻辑应该放在 mounted() 钩子函数中。而响应回来的数据需要赋值给表格绑定的数据模型,从下图可以看出表格绑定的数据模型是 tableData

image-20210825220436889

前端代码如下:

3.4 添加功能

image-20210825221138245

上图是添加数据的对话框,当点击 提交 按钮后就需要将数据提交到后端,并将数据保存到数据库中。下图是整体的流程:

image-20210825221329231

页面发送请求时,需要将输入框输入的内容提交给后端程序,而这里是以 json 格式进行传递的。而具体的数据格式如下:

image-20210826185917510

==注意:由于是添加数据,所以上述json数据中id是没有值的。==

3.4.1 后端实现

3.4.1.1 dao方法实现

BrandMapper 接口中定义 add() 添加方法,并使用 @Insert 注解编写sql语句

3.4.1.2 service方法实现

BrandService 接口中定义 add() 添加数据的业务逻辑方法

BrandServiceImpl 类中重写 add() 方法,并进行业务逻辑实现

==注意:增删改操作一定要提交事务。==

3.4.1.3 servlet实现

com.itheima.web.servlet 包写定义名为 AddServlet 的 Servlet。该 Servlet 的逻辑如下:

servlet 代码实现如下:

3.4.2 前端实现

image-20210825223121993

上图左边是页面效果,里面的 提交 按钮可以通过上图右边看出绑定了一个 单击事件,而该事件绑定的是 addBrand 函数,所以添加数据功能的逻辑代码应该写在 addBrand() 函数中。在此方法中需要发送异步请求并将表单中输入的数据作为参数进行传递。如下

then 函数中的匿名函数是成功后的回调函数,而 resp.data 就可以获取到响应回来的数据,如果值是 success 表示数据添加成功。成功后我们需要做一下逻辑处理:

  1. 关闭新增对话框窗口

    如下图所示是添加数据的对话框代码,从代码中可以看到此对话框绑定了 dialogVisible 数据模型,只需要将该数据模型的值设置为 false,就可以关闭新增对话框窗口了。

    image-20210825223933953

  2. 重新查询数据

    数据添加成功与否,用户只要能在页面上查看到数据说明添加成功。而此处需要重新发送异步请求获取所有的品牌数据,而这段代码在 查询所有 功能中已经实现,所以我们可以将此功能代码进行抽取,抽取到一个 selectAll() 函数中

    那么就需要将 mounted() 钩子函数中代码改进为

    同时在新增响应的回调中调用 selectAll() 进行数据的重新查询。

  3. 弹出消息给用户提示添加成功

    image-20210825224958220

    上图左边就是 elementUI 官网提供的成功提示代码,而上图右边是具体的效果。

    ==注意:上面的this需要的是表示 VUE 对象的this。==

综上所述,前端代码如下:

##