十六、商城 - 品牌管理-CRUD(4)

发布于:2022-08-06 ⋅ 阅读:(263) ⋅ 点赞:(0)

一、增加品牌

1.1 需求分析

实现品牌增加功能

在这里插入图片描述

1.2 后端代码

1.2.1 执行结果封装实体

目的:进行crud时最终的返回值

在youlexuan-pojo的com.zql.entity包下创建类Result.java

package com.zql.entity;

import java.io.Serializable;

/**
 * @Author:Daniel
 * @Version 1.0
 *
 * crud时返回的结果
 */
public class Result implements Serializable {

    private boolean success;

    private String message;

    public Result(boolean success, String message) {
        this.success = success;
        this.message = message;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

1.2.2 服务接口层

在youlexuan-sellergoods-interface 的 BrandService.java 新增方法定义

 //新增
 public void add(TbBrand brand);

1.2.3 服务实现层

在com.zql.sellergoods.service.impl 的 BrandServiceImpl.java 实现该方法

//新增
@Override
public void add(TbBrand brand) {

    brandMapper.insert(brand);
}

1.2.4 控制层

在youlexuan-manager-web的BrandController.java中新增方法

//新增
@RequestMapping("/add")
public Result add(@RequestBody TbBrand brand){ //@RequestBody  返回前端一个json形式的数

    try {
        brandService.add(brand);

        return new Result(true, "新增成功");

    }catch (Exception e){

        e.printStackTrace();

        return new Result(false, "新增失败");
    }
}

1.3 前端代码

1.3.1 JS 代码

注:同分页一个层,都在brandController内

//新增保存
$scope.save = function(){

   $http.post('../brand/add.do',$scope.entity).success(function (response) {

	       if(response.success){
	          $scope.reloadList();//重新加载
			}else{
	           alert(response.message);
			}
   });
}

1.3.2 HTML

绑定表单元素,我们用ng-model指令,绑定按钮的单击事件我们用 ng-click (ng-click="save()")

<table class="table table-bordered table-striped"  width="800px">
    <tr>
     	<td>品牌名称</td>
     	<td><input  class="form-control" placeholder="品牌名称" ng-model="entity.name"> 
     	</td>
   		</tr>		      	
    <tr>
       <td>首字母</td>
    	<td><input  class="form-control" placeholder="首字母" ng-model="entity.firstChar">
    	</td>
  	 </tr>		      	
 </table>	

在这里插入图片描述

为了每次打开窗口没有遗留上次的数据,我们可以修改新建按钮,对entity变量进行清空操作

在这里插入图片描述

解决:此处添加 ng-click="entity={}" ????

在这里插入图片描述

1.4 测试运行

重新安装youlexuan_parent

顺序启动以下2个服务youlexuan-sellergoods-service、youlexuan-manager-web

访问地址:http://localhost:9101/admin/index.html

点击:商品管理—》品牌管理----》点击【新建】弹出新增品牌对话框,输入品牌名称、首字母,点击【保存】按钮,即可成功保存数据

保存成功显示 ????

在这里插入图片描述

在这里插入图片描述

保存失败显示 ???? (比如你首字母写了一个之上,就会保存失败)

在这里插入图片描述

二、修改品牌

2.1 需求分析

点击列表的修改按钮,弹出窗口,修改数据后点“保存”执行保存操作

在这里插入图片描述

2.2 后端代码

2.2.1 服务接口层

在youlexuan-sellergoods-interface的BrandService.java新增修改方法定义

/*
* 更新的时候先需要查询出来,再去更新
* */
//查询
public TbBrand findOne(Long id);

//更新
public void update(TbBrand tbBrand);

2.2.2 服务实现层

在youlexuan-sellergoods-service的BrandServiceImpl.java新增方法实现

//查询 更新
@Override
public TbBrand findOne(Long id) {

   return brandMapper.selectByPrimaryKey(id);

}

@Override
public void update(TbBrand tbBrand) {

    brandMapper.updateByPrimaryKey(tbBrand);
}

2.2.3 控制层

在youlexuan-manager-web的BrandController.java新增方法

//查询  更新
@RequestMapping("/findOne")
public TbBrand findOne(Long id){

    return  brandService.findOne(id);
}

@RequestMapping("/update")
public Result update(@RequestBody TbBrand tbBrand){

    try {
        brandService.update(tbBrand);

        return new Result(true, "更新成功");

    }catch (Exception e){

        e.printStackTrace();

        return new Result(false, "更新失败");
    }
}

2.3 前端代码

2.3.1 实现数据查询

增加JS代码

//查询 更新
$scope.findOne = function (id) {

	$http.get('../brand/findOne.do?id='+id).success(function (response) {

       $scope.entity = response;

    })
}

修改列表中的“修改”按钮,调用此方法 ng-click="findOne(entity.id)"执行查询实体的操作 ????

在这里插入图片描述

2.3.2 保存数据

修改JS的save方法

在这里插入图片描述

//新增保存
$scope.save = function(){

   var methoName = 'add';

   if ($scope.entity.id != null){ //不为空就为已经有这个数据,那就只能修改或删除

       methoName = 'update';
	}

   $http.post('../brand/'+methoName+'.do',$scope.entity).success(function (response) {

       if(response.success){
           $scope.reloadList();//重新加载
	   }else{
           alert(response.message);
	}
  });
}

2.4 测试运行

重新安装 youlexuan_parent

顺序启动以下2个服务youlexuan-sellergoods-service、youlexuan-manager-web

访问地址:http://localhost:9101/admin/index.html

点击:商品管理—》品牌管理----》选择一个商品,点击对应的【修改】

修改前:????

在这里插入图片描述
修改后 :????

在这里插入图片描述

遇错排错 ????

在这里插入图片描述
解决:返回不是 void

在这里插入图片描述
现在就查询到了

在这里插入图片描述

三、删除品牌

3.1 需求分析

点击列表前的复选框,点击删除按钮,删除选中的品牌。

在这里插入图片描述

3.2 后端代码

3.2.1 服务接口层

在youlexuan-sellergoods-interface的BrandService.java接口定义方法

//批量删除
public void delete(Long[] ids);

3.2.2 服务实现层

在youlexuan-sellergoods-service的BrandServiceImpl.java实现该方法

//批量删除
@Override
public void delete(Long[] ids) {

	if(ids != null && ids.length > 0 ){

   		for(Long id: ids){

      		 brandMapper.deleteByPrimaryKey(id);
   }

}

3.2.3 控制层

在youlexuan-manager-web的BrandController.java中增加方法

    //批量删除
    @RequestMapping("/delete")
    public Result delete(Long []ids){
        try {

            brandService.delete(ids);

            return new Result(true, "删除成功");

        }catch (Exception e){

            e.printStackTrace();

            return new Result(false, "删除失败");
        }
    }

3.3 前端代码

3.3.1 JS


/**
* 主要思路:我们需要定义一个用于存储选中ID的数组,当我们点击复选框后判断是选择还是取消选择,
* 如果是选择就加到数组中,如果是取消选择就从数组中移除。在点击删除按钮时需要用到这个存储了ID的数组。
这里我们补充一下JS的关于数组操作的知识
(1)数组的push方法:向数组中添加元素
(2)数组的splice方法:从数组的指定位置移除指定个数的元素 ,参数1为位置  ,参数2位移除的个数
(3)复选框的checked属性:用于判断是否被选中
*/

//批量删除
$scope.selectIds=[];//选中的ID集合
//更新复选
$scope.updateSelection = function($event,id){

   if($event.target.checked){//如果是被选中,则增加到数组
       $scope.selectIds.push(id);
   }else{
       var idx = $scope.selectIds.indexOf(id);
       $scope.selectIds.splice(idx, 1);//删除
   }

}


$scope.delete = function () {
   //获取选中的复选框
$http.get('../brand/delete.do?ids='+$scope.selectIds).success(function (response) {

       if(response.success){
           $scope.reloadList();//重新加载
       }else{
           alert(response.message);
       }
   });
}

3.3.2 HTML

(1)修改列表的复选框 ng-click="updateSelection($event,entity.id)"

在这里插入图片描述
(2)修改删除按钮 ng-click="delete()"

在这里插入图片描述

3.4 测试运行

重新安装 youlexuan_parent

顺序启动以下2个服务youlexuan-sellergoods-service、youlexuan-manager-web

访问地址:http://localhost:9101/admin/index.html

点击:商品管理—》品牌管理----》选择一个或者几个商品,点击【删除】按钮,即可删除数据。

删除前 ????

在这里插入图片描述

删除后 ????

在这里插入图片描述

四、品牌条件查询

4.1 需求分析

实现品牌条件查询功能,输入品牌名称、首字母后查询,并分页。

4.2 后端代码

4.2.1 服务接口层

在youlexuan-sellergoods-interface工程的BrandService.java方法增加方法定义

//按条件查询  查到一个是一个,查到多的按正常分页显示
public PageResult searchPage(TbBrand tbBrand,int pageNum,int pageSize);

4.2.2 服务实现层

在youlexuan-sellergoods-service工程BrandServiceImpl.java实现该方法

//按条件进行查询
@Override
public PageResult searchPage(TbBrand tbBrand, int pageNum, int pageSize) {

    PageHelper.startPage(pageNum,pageSize);

    TbBrandExample brandExample = new TbBrandExample();

    TbBrandExample.Criteria criteria = brandExample.createCriteria();

    if(tbBrand != null){

        if(tbBrand.getName() != null && tbBrand.getName().length() > 0){

            criteria.andNameLike("%"+tbBrand.getName()+"%");
        }

        if(tbBrand.getFirstChar() != null && tbBrand.getFirstChar().length() > 0){

            criteria.andFirstCharEqualTo(tbBrand.getFirstChar());
        }

    }
    Page<TbBrand> page = (Page<TbBrand>) brandMapper.selectByExample(brandExample);

    return new PageResult(page.getTotal(),page.getResult());
}

注意:需要导入如下包

import com.zql.pojo.TbBrand;
import com.zql.pojo.TbBrandExample;

4.2.3 控制层

在youlexuan-manager-web的BrandController.java增加方法

//批量查询
/*
* 查询 +  分页
* */
@RequestMapping("/search")
public PageResult search(@RequestBody TbBrand tbBrand,int page,int rows){

 	return   brandService.searchPage(tbBrand,page,rows);
}

4.3 前端代码

4.3.1 JS

修改youlexuan-manager-web的

$scope.searchEntity={};//定义搜索对象
//批量查询
$scope.search = function (page,rows) {

   $http.post('../brand/search.do?page='+page+'&rows='+rows,$scope.searchEntity).success(function (response) {
      
       $scope.paginationConf.totalItems=response.total;//总记录数
       $scope.list=response.rows;//给列表变量赋值

   })
}

修改reloadList方法为 search

在这里插入图片描述

4.3.2 Html

修改brand.html,增加查询条件、查询按钮(应该前面就加进去啦)

<div class="box-tools pull-right">
<div class="has-feedback">品牌名称:<input ng-model="searchEntity.name"> 
 品牌首字母:<input ng-model="searchEntity.firstChar">  
	<button  class="btn btn-default" ng-click="reloadList()">查询</button>
</div>
</div>

4.4 测试运行

顺序启动以下2个服务youlexuan-sellergoods-service、youlexuan-manager-web

访问地址:http://localhost:9101/admin/index.html

点击:商品管理—》品牌管理----》输入品牌名称查询条件或者首字母,点击【查询】按钮,即可查询到对应数据。

查询前 无触发【查询】按钮 ????

在这里插入图片描述

查询后 触发【查询】按钮 ????

在这里插入图片描述

4.5 按条件查询 bug 解决

不出现列表信息

报错:????

在这里插入图片描述

解决:

在这里插入图片描述

在这里插入图片描述

再次解决:多加了一个tBrand,去掉即可 ✌✌

在这里插入图片描述