1. 商品后盾治理

==========

1.1 商品批改操作

1.1.1 页面URL剖析

1.1.2 参数剖析

1.1.3 返回值后果确定

1.1.4 编辑ItemController

`/**     * 商品批改操作     * 1.url地址: http://localhost:8091/item/update     * 2.参数:      form表单提交     * 3.返回值:  SysResult对象     */    @RequestMapping("/update")    public SysResult updateItem(Item item){        itemService.updateItem(item);        return SysResult.success();    }` 

1.1.5 编辑ItemService

`@Override    public void updateItem(Item item) {        //更新工夫由程序主动填充....        itemMapper.updateById(item);    }` 

1.2 商品删除

1.2.1 url申请地址阐明

1.2.2 申请参数

1.2.3 返回值类型

1.2.4 编辑ItemController

`/**     * 业务: 商品删除     * url地址: http://localhost:8091/item/delete     * 参数:    ids: 1474391993,1474391997,1474391996     * 返回值:  零碎返回值VO     * List 能够赋值 name="list[0]" value=100     *                 name="list[1]" value=200     */    @RequestMapping("/delete")    public SysResult deleteItems(Long[] ids){        itemService.deleteItems(ids);        return SysResult.success();    }` 

1.2.4 编辑ItemService

`@Override    public void deleteItems(Long[] ids) {        //1.将数组转化为汇合        List<Long> longList = Arrays.asList(ids);        itemMapper.deleteBatchIds(longList);    }` 

1.3 商品上架/下架操作

1.3.1 业务阐明

阐明:当用户点击上架/下架的按钮时,须要批改item数据表中的status信息.同时批改工夫…

1.3.2 页面剖析

1.3.3 参数剖析

1.3.4返回值后果剖析

1.3.5 批改页面url地址


1.3.6 编辑ItemController

`/**     * 实现商品的下架     * url地址: http://localhost:8091/item/updateStatus/2    status=2     *             http://localhost:8091/item/updateStatus/1   status=1     * 利用RestFul格调实现通用的操作.     * 参数:   ids: 1474391997,1474391996,1474391995     * 返回值:  VO对象     */    @RequestMapping("/updateStatus/{status}")    public SysResult updateStatus(@PathVariable Integer status,Long[] ids){        itemService.updateStatus(status,ids);        return SysResult.success();    }` 

1.3.7 编辑ItemService

`/**     * sql: update tb_item set status = #{status},updated={date}     *         where id in (id1,id2,id3)     *     MP机制实现     * @param status     * @param ids     */    @Override    public void updateStatus(Integer status, Long[] ids) {        Item item = new Item();    //封装批改的值        item.setStatus(status);        UpdateWrapper<Item> updateWrapper = new UpdateWrapper<>();        updateWrapper.in("id", Arrays.asList(ids));        itemMapper.update(item,updateWrapper);    }` 
  1. 富文本编辑器

==========

2.1 富文本编辑器介绍

KindEditor是一套开源的HTML可视化编辑器,次要用于让用户在网站上取得所见即所得编辑成果,兼容IE、Firefox、Chrome、Safari、Opera等支流浏览器。

2.2 入门案例

`<script type="text/javascript">    $(function(){        KindEditor.ready(function(){            //在指定的地位创立富文本.            KindEditor.create("#editor")        })    })</script></head><body><h1>富文本编辑器</h1><textarea style="width:700px;height:350px" id="editor"></textarea></body>` 

2.3 对于商品模块的表设计

表业务阐明: 商品表中的id与商品详情表中的ID是统一的.

2.4 编辑ItemDesc POJO对象

`@TableName("tb_item_desc")@Data@Accessors(chain = true)public class ItemDesc extends BasePojo{    //item中的id与ItemDesc中的Id应该保持一致...    @TableId    //只标识主键  不能自增.    private Long itemId;    private String itemDesc;}` 

2.5 重构商品新增

2.5.1 编辑ItemController

`@RequestMapping("/save")    public SysResult saveItem(Item item, ItemDesc itemDesc){        itemService.saveItem(item,itemDesc);        return SysResult.success();        }` 

2.5.2 编辑ItemService

`@Override    @Transactional    //管制事务    public void saveItem(Item item, ItemDesc itemDesc) {        //思考:如果每次编辑数据库 每次都须要操作公共的属性...        //实现主动的填充性能        //Date date = new Date();        //item.setStatus(1).setCreated(date).setUpdated(date);        item.setStatus(1);        //如果实现入库操作,时应该动静回显主键信息.        //MP的形式实现数据入库操作,MP会主动的实现主键信息的回显..        itemMapper.insert(item);        //itemDesc属性有值        itemDesc.setItemId(item.getId());        itemDescMapper.insert(itemDesc);    }` 

2.6 商品详情回显

2.6.1 页面url剖析

2.6.2 页面JS

2.6.3 编辑ItemController

`/**     * 业务:动静获取商品详情信息     * url地址: http://localhost:8091/item/query/item/desc/1474391999     * 参数:   itemId restFul形式获取     * 返回值: 零碎VO对象     */    @RequestMapping("/query/item/desc/{itemId}")    public SysResult findItemDescById(@PathVariable Long itemId){        ItemDesc itemDesc = itemService.findItemDescById(itemId);        return SysResult.success(itemDesc);    }` 

2.6.4 编辑ItemService

`@Override    public ItemDesc findItemDescById(Long itemId) {        return itemDescMapper.selectById(itemId);    }` 

2.6.5 页面成果展示

2.7 重构商品批改

2.7.1 编辑ItemDescController

`@RequestMapping("/update")    public SysResult updateItem(Item item,ItemDesc itemDesc){        itemService.updateItem(item,itemDesc);        return SysResult.success();    }` 

2.7.2 编辑ItemDescService

`@Transactional    @Override    public void updateItem(Item item, ItemDesc itemDesc) {        //更新工夫由程序主动填充....        itemMapper.updateById(item);        itemDesc.setItemId(item.getId());        itemDescMapper.updateById(itemDesc);    }` 

2.8 重构商品删除

`@Transactional    @Override    public void deleteItems(Long[] ids) {        //1.将数组转化为汇合        List<Long> longList = Arrays.asList(ids);        itemMapper.deleteBatchIds(longList);        //2.删除商品详情信息        itemDescMapper.deleteBatchIds(longList);    }` 
  1. 文件上传

========

3.1 文件上传入门案例

3.1.1 页面剖析

`<form action="http://localhost:8091/file" method="post"     enctype="multipart/form-data">        <input name="fileImage" type="file" />        <input type="submit" value="提交"/>    </form>` 

3.1.2 编辑FileController

`package com.jt.controller;import org.springframework.http.codec.multipart.FormFieldPart;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOException;import java.io.InputStream;@RestControllerpublic class FileController {    /**     * 文件上传的入门案例     * url:http://localhost:8091/file     * 参数: fileImage 名称     * 返回值:  文件上传胜利!!!     * SpringMVC 提供了工具API 专门操作流文件.     *     * 文件上传的具体步骤:     *  1.筹备文件目录     *  2.筹备文件的全名   xxxx.jpg     *  3.筹备文件上传的门路  D:/JT-SOFT/images/xxxx.jpg     *  4.将字节信息输入即可.     *  大小不要超过1M     */    @RequestMapping("/file")    public String file(MultipartFile fileImage) throws IOException {        String dirPath = "D:/JT-SOFT/images";        File dirFile = new File(dirPath);        if(!dirFile.exists()){            dirFile.mkdirs();   //一劳永逸的写法        }        //获取文件的名称        String fileName = fileImage.getOriginalFilename();        //获取文件全门路        String filePath = dirPath + "/" + fileName;        File file = new File(filePath);        fileImage.transferTo(file); //将字节信息输入到指定的地位中        return "文件上传胜利!!!!";    }}` 

3.2 商品文件上传实现

3.2.1 页面剖析

3.2.2 筹备ImageVO对象

`package com.jt.vo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.experimental.Accessors;@Data@Accessors(chain = true)@NoArgsConstructor@AllArgsConstructorpublic class ImageVO {    //{"error":0,"url":"图片的保留门路","width":图片的宽度,"height":图片的高度}    private Integer error;  //错误信息   0程序运行失常    1.文件上传有误.    private String url;     //图片拜访的虚构门路    private Integer width;  // >0    private Integer height; // >0    //设定上传失败的办法    public static ImageVO fail(){        return new ImageVO(1,null,null,null);    }    public static ImageVO success(String url,Integer width,Integer height){        return new ImageVO(0,url,width,height);    }}` 

3.2.3 编辑FileController

 `/**     * 实现文件上传     * url地址: http://localhost:8091/pic/upload?dir=image     * 参数:    uploadFile: 文件的字节信息.     * 返回值:  {"error":0,"url":"图片的保留门路","width":图片的宽度,"height":图片的高度}     *          ImageVO对象...     */    @RequestMapping("/pic/upload")    public ImageVO upload(MultipartFile uploadFile){        return fileService.upload(uploadFile);    }` 

3.2.4 编辑FileService

`package com.jt.service;import com.jt.vo.ImageVO;import org.springframework.stereotype.Service;import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashSet;import java.util.Set;import java.util.UUID;@Servicepublic class FileServiceImpl implements FileService{    private String rootDirPath = "D:/JT-SOFT/images";    //1.2 筹备图片的汇合  蕴含了所有的图片类型.    private static Set<String> imageTypeSet;    static {        imageTypeSet = new HashSet<>();        imageTypeSet.add(".jpg");        imageTypeSet.add(".png");        imageTypeSet.add(".gif");    }    /**     * 欠缺的校验的过程     * 1. 校验是否为图片     * 2. 校验是否为恶意程序     * 3. 避免文件数量太多,分目录存储.     * 4. 避免文件重名     * 5. 实现文件上传.     * @param uploadFile     * @return     */    @Override    public ImageVO upload(MultipartFile uploadFile) {        //1.校验图片类型  jpg|png|gif..JPG|PNG....        //1.1 获取以后图片的名称 之后截取其中的类型.   abc.jpg        String fileName = uploadFile.getOriginalFilename();        int index = fileName.lastIndexOf(".");        String fileType = fileName.substring(index);        //将数据转化为小写        fileType = fileType.toLowerCase();        //1.3 判断图片类型是否正确.        if(!imageTypeSet.contains(fileType)){            //图片类型不匹配            return ImageVO.fail();        }        //2.校验是否为恶意程序 依据宽度/高度进行判断        try {            //2.1 利用工具API对象 读取字节信息.获取图片对象类型            BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());            //2.2 校验是否有宽度和高度            int width = bufferedImage.getWidth();            int height = bufferedImage.getHeight();            if(width==0 || height==0){                return ImageVO.fail();            }            //3.分目录存储  yyyy/MM/dd 分隔            //3.1 将工夫依照指定的格局要求 转化为字符串.            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")                             .format(new Date());            //3.2 拼接文件存储的目录对象            String fileDirPath = rootDirPath + dateDir;            File dirFile = new File(fileDirPath);            //3.3 动态创建目录            if(!dirFile.exists()){                dirFile.mkdirs();            }            //4.避免文件重名  uuid.jpg 动静拼接            //4.1 动静生成uuid  实现文件名称拼接  名.后缀            String uuid =                    UUID.randomUUID().toString().replace("-", "");            String realFileName = uuid + fileType;            //5 实现文件上传            //5.1 拼接文件实在门路 dir/文件名称.            String realFilePath = fileDirPath + realFileName;            //5.2 封装对象  实现上传            File realFile = new File(realFilePath);            uploadFile.transferTo(realFile);            //实现文件上传胜利!!!!            String url = "https://img14.360buyimg.com/n0/jfs/t1/45882/22/7027/53284/5d49358aE9c25c1bd/fb7365463f6a1a7b.jpg";            return ImageVO.success(url,width,height);        } catch (IOException e) {            e.printStackTrace();            return ImageVO.fail();        }    }}` 

3.2.5 页面成果展示