京淘day06-京淘项目curd

1.商品CRUD操作

1.1 商品新增

1.1.1 页面分析

京淘day06-京淘项目curd_第1张图片

1.1.2 用户参数

京淘day06-京淘项目curd_第2张图片

1.1.3 页面JS分析

京淘day06-京淘项目curd_第3张图片

1.1.4 封装系统VO对象

package com.jt.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class SysResult {
    private Integer status;  //200表示成功   201表示失败
    private String  msg;     //服务器给用户的提示信息
    private Object  data;    //服务器返回给用户的数据
    //封装工具API
    public static SysResult fail(){
        return new SysResult(201, "服务器调用异常", null);
    }
    public static SysResult success(){
        return new SysResult(200, "业务执行成功!", null);
    }
    public static SysResult success(Object data){
        return new SysResult(200, "业务执行成功!", data);
    }
    public static SysResult success(String msg,Object data){
        return new SysResult(200, msg, data);
    }
}

1.1.5 编辑ItemController

/**
     * 业务需求:完成商品新增操作
     * url:    http://localhost:8091/item/save
     * 参数: 整个表单进行提交  使用对象接收
     * 返回值: 系统返回值对象
     */
    @RequestMapping("/save")
    public SysResult saveItem(Item item) {
      itemService.saveItem(item);
      return SysResult.success();
   // 定义完全局异常处理好可以省略
   //    try {
   //       itemService.saveItem(item);
   //       return SysResult.success();
   //    }catch (Exception e){
   //       e.printStackTrace();
   //       return SysResult.fail();
   //    }
 }

1.1.6 编辑ItemService

//新增
@Override
@Transactional//开启事务控制
public void saveItem(Item item) {
 //定义玩自动填充功能后可以省略
 //Date data=new Date();
 //item.setStatus(1).setCreated(data).setUpdated(data); item.setStatus(1);
   itemMapper.insert(item);
   //int a=1/0;
}

2.2 参数自动填充功能

2.2.1 需求说明

如果用户在入库/更新操作时,能否实现时间的自动的填充功能.简化用户操作的步骤.

2.2.2 添加注解

京淘day06-京淘项目curd_第4张图片

2.2.3 配置自动赋值

package com.jt.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component      //将对象交给容器管理
public class MyMetaObjectHandler implements MetaObjectHandler {
    //完成入库和更新操作的自动赋值.
    @Override
    public void insertFill(MetaObject metaObject) {
        Date date = new Date();
        this.setInsertFieldValByName("created",date,metaObject);
        this.setUpdateFieldValByName("updated",data,metaObject);
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setUpdateFieldValByName("updated",new Date(),metaObject);
    }
}

2.3 全局异常处理机制

2.3.1 全局异常处理机制说明

1.如果将大量的异常处理写到代码中虽然可以保证程序稳定的运行.但是代码的结构非常的混乱.
2.异常是程序运行状态的一种体现.如果没有一种统一的规则来管理异常,则程序一旦出错问题无法定位.
3.异常应该在Controller层进行拦截. mapper---->Service(工具API)----->Controller---->用户
4.使用AOP 中的异常通知完成该功能.

2.3.2 引入jar包

  
     
         org.springframework.boot
         spring-boot-starter-aop
     

2.3.3 定义全局异常处理

package com.jt.aop;
import com.jt.vo.SysResult;
import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import sun.rmi.runtime.Log;
import java.sql.SQLException;
import java.util.logging.Logger;
@RestControllerAdvice   //AOP+异常通知
//@Slf4j
public class SystemException {
    //当遇到某种类型的异常时才会执行
    @ExceptionHandler({RuntimeException.class})
    public Object exception(Exception e){
        //log.info(e.getMessage());
        e.printStackTrace();//输出异常信息
        //如果出错,返回系统级别的报错数据即可
        return SysResult.fail();
    }
} 

2.4 实现商品分类名称的回显

2.4.1 业务分析

京淘day06-京淘项目curd_第5张图片
说明: 需要将3动态展现为具体名称, 实现思路 动态获取3的id值,之后发起Ajax请求,之后动态获取商品分类名称之后在指定的位置展现.

2.4.2 编辑页面JS

京淘day06-京淘项目curd_第6张图片

2.5 商品修改

2.5.1 查看页面JS

京淘day06-京淘项目curd_第7张图片

2.5.2 编辑ItemController

/**
     * 实现商品编辑
     * url地址: /item/update
     * 请求参数: 整个form表单提交
     * 返回值:    sysResult对象
     */
    @RequestMapping("/update")
    public SysResult updateItem(Item item){
        itemService.updateItem(item);
        return SysResult.success();
    }

2.5.3 编辑ItemService

@Override
    public void updateItem(Item item) {
        itemMapper.updateById(item);
    }

2.6 商品删除操作

2.6.1 业务分析

当用户选中数据之后,点击删除按钮时,应该执行删除操作.
1.利用MP方式实现数据删除.
2.利用手写Sql形式,手动删除数据.

2.6.2 页面分析

1).请求路径
京淘day06-京淘项目curd_第8张图片

2.6.3 编辑ItemController

/**
     * 需求: 实现商品删除操作
     * url: http://localhost:8091/item/delete
     * 请求参数:  ids: 1474392029,1474392030
     * 返回值:  SysResult对象
     * 知识扩展:
     *     问题: 页面中
     *     参数是如何接收的,底层实现是什么? servlet是否熟悉
     *     利用servlet中的request对象/response对象进行参数传递.
     *  注意事项:方法中的参数名称,必须与页面中的name属性名称一致!!!
     */
    @RequestMapping("/delete")
    public SysResult deleteItems(Long[] ids){
        itemService.deleteItems(ids);
        return SysResult.success();
    } 

2.6.4 编辑ItemService

@Override
    public void deleteItems(Long[] ids) {
        //方式1:利用MP方式实现
        List longIds = Arrays.asList(ids);
        itemMapper.deleteBatchIds(longIds);
    } 

2.7 手写sql实现删除

2.7.1 编辑ItemService

//sql: delete from tb_item where id in (100,101...)
    @Override
    public void deleteItems(Long[] ids) {
        //方式2:手写Sql完成数据删除.
        itemMapper.deleteItems(ids);
    } 

2.7.2 编辑ItemMapper

public interface ItemMapper extends BaseMapper{
    @Select("select * from tb_item order by updated desc limit #{startIndex},#{rows}")
    //将多值封装成单值  Map集合   key=xxx value 0,   key=yyy  value=20
    List findItemByPage(int startIndex,int rows);
    //删除
    void deleteItems(Long[] ids);
}

2.7.3 编辑映射文件

`


    
    
        delete from tb_item where id in (
        
            #{id}
        
        )
    

2.8 实现商品上架/下架操作

2.8.1 页面分析

说明:将状态码利用RestFul的风格实现动态传参.
下架操作: http://localhost:8091/item/updateStatus/2 status=2
上架操作: http://localhost:8091/item/1 status=1
京淘day06-京淘项目curd_第9张图片

2.8.2 编辑ItemController

/**
     * 实现商品上架/下架操作
     * url:/item/updateStatus/2
     * 参数: 1/2代表商品的状态, ids=100,101,102,103
     * 返回值: SysResult对象
     * SpringMVC框架: 参数接收说明 如果参数中间以逗号的形式分割
     * 则可以自动的转化为数组类型
     */
    @RequestMapping("/updateStatus/{status}")
    public SysResult updateStatus(@PathVariable Integer status,Long... ids){
        itemService.updateStatus(ids,status);
        return SysResult.success();
    }

2.8.3 编辑ItemService

@Override
    public void updateStatus(Long[] ids, Integer status) {
        //1.以MP的方式操作数据库  只修改状态码/updated时间
        /*Item item = new Item();
        item.setStatus(status);
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id", ids);
        itemMapper.update(item,queryWrapper);*/
        //2.手写SQL;
        itemMapper.updateStatus(ids,status);
    }

2.8.4 编辑ItemMapper

//上下架
void updateStatus(@Param("ids") Long[] ids,@Param("status") Integer status);

编辑Mapper映射文件



   update tb_item set status=#{status},updated=now()
   where id in (
   
      #{id}
   
   )

你可能感兴趣的:(springboot)