校园商铺-6店铺编辑列表和列表功能-2店铺信息编辑之Controller层的实现

1.店铺编辑范围

除了店铺名称、店铺分类不可更改,其他信息(区域、地址、电话、缩略图、店铺简介)都可以更改。

2.编写获取店铺信息的controller

    @RequestMapping(value="/getshopbyid",method=RequestMethod.GET)
    @ResponseBody
    private Map<String,Object> getShopById(HttpServletRequest request){
        Map<String,Object> modelMap = new HashMap<String,Object>();
        Long shopId = HttpServletRequestUtil.getLong(request, "shopid");
        if(shopId > -1) {
            try {
                Shop shop = shopService.getByShopId(shopId);
                List<Area> areaList = areaService.getAreaList();
                modelMap.put("shop", shop);
                modelMap.put("areaList", areaList);
                modelMap.put("success", true);
            }catch (Exception e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.toString());
            }
        }else {
            modelMap.put("success", false);
            modelMap.put("errMsg", "empty shopId");
        }
        return modelMap;
    }

3.验证controller

访问地址http://127.0.0.1:18080/o2o/shopadmin/getshopbyid?shopid=1

4.更改店铺信息

店铺注册流程:

  • 1.验证码校验
  • 2.获取请求头的店铺信息 接收从前台传递的shopStr对象,将这个对象转换成Shop实体类
  • 3.获取图片 将请求中的文件流从CommonsMultipartResolver解析为CommonsMultipartFile
  • 4.注册店铺

更改店铺同注册流程:

  • 1.验证码校验
  • 2.获取请求头的店铺信息 接收从前台传递的shopStr对象,将这个对象转换成Shop实体类
  • 3.获取图片 将请求中的文件流从CommonsMultipartResolver解析为CommonsMultipartFile
  • 4.修改店铺

4.Session

在web开发中,服务器可以为每个用户浏览器创建一个会话对象,就是Session对象。一个浏览器独占一个Session对象。因此在保存用户数据时,服务器程序可以把用户信息写到用户浏览器独占的Session中,当用户使用浏览器访问服务器程序时,服务器程序可以从用户的Session中,取出该用户的数据为用户服务。服务器创建Session出来后,会把Session的ID号以cookie的形式回写给客户机,这样只要客户端的浏览器不关,再去访问服务器的时候,都会带着Session的ID号去。
服务器发现客户端的浏览器带Session的ID过来,就会使用内容中与之对应的Session为之服务。Session是有过期时间的,tomcat默认Session超时时间为30分钟。如果30分钟内没有在平台上做任何操作,Session就过期了。这种情况下,想通过Session去取相关的用户信息,就获取不到了。
Session主要用来保存店铺、用户信息。在我们去存储数据的时候,可以从里面取出想要的信息,同时还能方便我们做权限的验证。
在修改店铺信息的时候,是不需要修改用户的信息的,对它权限的验证,可以放在拦截器中去实现。
需要加入Session的地方是在注册中,获取用户的信息。

package com.csj2018.o2o.web.shopadmin;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import java.io.InputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import com.csj2018.o2o.dto.ShopExecution;
import com.csj2018.o2o.entity.Area;
import com.csj2018.o2o.entity.PersonInfo;
import com.csj2018.o2o.entity.Shop;
import com.csj2018.o2o.entity.ShopCategory;
import com.csj2018.o2o.enums.ShopStateEnum;
import com.csj2018.o2o.exceptions.ShopOperationException;
import com.csj2018.o2o.service.AreaService;
import com.csj2018.o2o.service.ShopCategoryService;
import com.csj2018.o2o.service.ShopService;
import com.csj2018.o2o.util.CodeUtil;
import com.csj2018.o2o.util.HttpServletRequestUtil;
import com.csj2018.o2o.util.ImageUtil;
import com.csj2018.o2o.util.PathUtil;
import com.fasterxml.jackson.databind.ObjectMapper;

// 首先在Controller里面定义了SpringMVC相关的标签,这个标签包含了Controller的访问路径以及registerregisterShop方法的访问路径,
@Controller
@RequestMapping("/shopadmin")
public class ShopManagerController {
    // 同时给它在执行的时候通过Spring容器注入之前实现好的ShopService实现类,用来提供addShop的服务。
    @Autowired
    private ShopService shopService;
    @Autowired
    private ShopCategoryService shopCategoryService;
    @Autowired
    private AreaService areaService;

    @RequestMapping(value="/getshopbyid",method=RequestMethod.GET)
    @ResponseBody
    private Map<String,Object> getShopById(HttpServletRequest request){
        Map<String,Object> modelMap = new HashMap<String,Object>();
        Long shopId = HttpServletRequestUtil.getLong(request, "shopid");
        if(shopId > -1) {
            try {
                Shop shop = shopService.getByShopId(shopId);
                List<Area> areaList = areaService.getAreaList();
                modelMap.put("shop", shop);
                modelMap.put("areaList", areaList);
                modelMap.put("success", true);
            }catch (Exception e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.toString());
            }
        }else {
            modelMap.put("success", false);
            modelMap.put("errMsg", "empty shopId");
        }
        return modelMap;
    }
    @RequestMapping(value = "getshopinitinfo",method = RequestMethod.GET)
    @ResponseBody
    private Map<String,Object> getShopInitInfo(HttpServletRequest request){
        Map<String,Object> modelMap = new HashMap<String,Object>();
        List<ShopCategory> shopCategoryList = new ArrayList<ShopCategory>();
        List<Area> areaList = new ArrayList<Area>();
        try {
            shopCategoryList = shopCategoryService.getShopCategoryList(new ShopCategory());
            areaList = areaService.getAreaList();
            modelMap.put("shopCategoryList", shopCategoryList);
            modelMap.put("areaList", areaList);
            modelMap.put("success",true);
        }catch(Exception e) {
            modelMap.put("success",false);
            modelMap.put("errMsg", e.getMessage());
        }
        return modelMap;

    }
    @RequestMapping(value = "/registershop", method = RequestMethod.POST)
    @ResponseBody
    private Map<String, Object> registerShop(HttpServletRequest request) {
        Map<String, Object> modelMap = new HashMap<String, Object>();
        //1.验证码校验
        if(!CodeUtil.checkVerifyCode(request)) {
            modelMap.put("success", "false");
            modelMap.put("message", "输入了错误的验证码");
            return modelMap;
        }
        //2.获取请求头的店铺信息 接收从前台传递的shopStr对象,将这个对象转换成Shop实体类
        String shopStr = HttpServletRequestUtil.getString(request, "shopStr");
        ObjectMapper mapper = new ObjectMapper();
        Shop shop = null;
        try {
            shop = mapper.readValue(shopStr, Shop.class);
        } catch (Exception e) {
            modelMap.put("success", false);
            modelMap.put("errMeg", e.getMessage());
            return modelMap;
        }
        // 3.获取图片 将请求中的文件流从CommonsMultipartResolver解析为CommonsMultipartFile
        CommonsMultipartFile shopImg = null;
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        if (commonsMultipartResolver.isMultipart(request)) {
            MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
            shopImg = (CommonsMultipartFile) multipartHttpServletRequest.getFile("shopImg");
        } else {
            modelMap.put("success", false);
            modelMap.put("errMsg", "上传图片不能为空");
            return modelMap;
        }
        // 4.注册店铺
        if (shop != null && shopImg != null) {
            /*
             * 添加Session
             * 注册店铺或对店铺做操作,是需要登陆的
             */
            PersonInfo owner = (PersonInfo) request.getSession().getAttribute("user");
            shop.setOwner(owner);

            /*
             * 由于addShop的第二个参数是File类型的,而传入的ShopImg是CommonsMultipartFile这样的一个类型,因此需要将CommonsMultipartFile转换成File类型
             File shopImgFile = new File(PathUtil.getImgBasePath() + ImageUtil.getRandomFileName());
            try {
                shopImgFile.createNewFile();
            } catch (IOException e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.getMessage());
                return modelMap;
            }

            try {
                inputStreamToFile(shopImg.getInputStream(), shopImgFile);
            } catch (Exception e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.getMessage());
                return modelMap;
            }
             */
            ShopExecution se;
            try {
                se = shopService.addShop(shop, shopImg.getInputStream(), shopImg.getOriginalFilename());
                if (se.getState() == ShopStateEnum.CHECK.getState()) {
                    /*
                     * 在店铺添加完成后,还需要做Session的操作。用户和店铺的关系是一对多的,即一个owner能够创建多个店铺。
                     * 因此需要在Session里面保存一个店铺列表来显示用户可以操作的店铺。
                     */
                    @SuppressWarnings("unchecked")
                    List<Shop> shopList = (List<Shop>) request.getSession().getAttribute("shopList");
                    if(shopList == null || shopList.size() == 0) {
                        shopList = new ArrayList<Shop>();
                    }
                    shopList.add(se.getShop());
                    request.getSession().setAttribute("shopList", shopList);
                    modelMap.put("success", true);
                } else {
                    modelMap.put("success", false);
                    modelMap.put("errMsg", se.getStateInfo());
                }

            }catch (ShopOperationException e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.getMessage());
            }catch (IOException e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.getMessage());
            }
            return modelMap;
        } else {
            modelMap.put("success", false);
            modelMap.put("errMsg", "请输入店铺信息");
            return modelMap;
        }

    }

    @RequestMapping(value = "/modifyshop", method = RequestMethod.POST)
    @ResponseBody
    private Map<String, Object> modifyShop(HttpServletRequest request) {
        Map<String, Object> modelMap = new HashMap<String, Object>();
        //1.验证码校验
        if(!CodeUtil.checkVerifyCode(request)) {
            modelMap.put("success", "false");
            modelMap.put("message", "输入了错误的验证码");
            return modelMap;
        }

        //2.获取请求头的店铺信息 接收从前台传递的shopStr对象,将这个对象转换成Shop实体类
        String shopStr = HttpServletRequestUtil.getString(request, "shopStr");
        ObjectMapper mapper = new ObjectMapper();
        Shop shop = null;
        try {
            shop = mapper.readValue(shopStr, Shop.class);
        } catch (Exception e) {
            modelMap.put("success", false);
            modelMap.put("errMeg", e.getMessage());
            return modelMap;
        }
        // 3.获取图片 将请求中的文件流从CommonsMultipartResolver解析为CommonsMultipartFile
        CommonsMultipartFile shopImg = null;
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        if (commonsMultipartResolver.isMultipart(request)) {
            MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
            shopImg = (CommonsMultipartFile) multipartHttpServletRequest.getFile("shopImg");
        }

        // 2.修改店铺
        if (shop != null && shop.getShopId() != null) {
            //由于图片是可上传、可不上传的,因此图片非空判断去除;取而代之确保shopId不为空
            //修改店铺信息不用从session获取用户信息
            PersonInfo owner = new PersonInfo();
            // 预期从Session获取,目前自定义,以后完善
            owner.setUserId(1L);
            shop.setOwner(owner);
            // 由于addShop的第二个参数是File类型的,而传入的ShopImg是CommonsMultipartFile这样的一个类型,因此需要将CommonsMultipartFile转换成File类型
/*
 * 这块代码,教程没有
            File shopImgFile = new File(PathUtil.getImgBasePath() + ImageUtil.getRandomFileName());
            try {
                shopImgFile.createNewFile();
            } catch (IOException e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.getMessage());
                return modelMap;
            }

            try {
                inputStreamToFile(shopImg.getInputStream(), shopImgFile);
            } catch (Exception e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.getMessage());
                return modelMap;
            }
*/

            ShopExecution se;
            try {
                if(shopImg == null) {
                    se = shopService.modifyShop(shop, null, null);
                }else {
                    se = shopService.modifyShop(shop, shopImg.getInputStream(), shopImg.getOriginalFilename());
                }
                if (se.getState() == ShopStateEnum.SUCCESS.getState()) {
                    modelMap.put("success", true);
                } else {
                    modelMap.put("success", false);
                    modelMap.put("errMsg", se.getStateInfo());
                }
            }catch(ShopOperationException e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.getMessage());
            } catch (IOException e) {
                modelMap.put("success", false);
                modelMap.put("errMsg", e.getMessage());
            }
            return modelMap;
        } else {
            modelMap.put("success", false);
            modelMap.put("errMsg", "请输入店铺Id");
            return modelMap;
        }

    }
    private static void inputStreamToFile(InputStream inputStream, File file) {
        FileOutputStream os = null;
        try {
            os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[1024];
            while ((bytesRead = inputStream.read(buffer)) > 0) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            throw new RuntimeException("调用inputStreamToFile产生异常:" + e.getMessage());
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                throw new RuntimeException("调用inputStreamToFile产生异常:" + e.getMessage());
            }
        }
    }
}

原文地址:https://www.cnblogs.com/csj2018/p/12222594.html

时间: 2024-11-09 16:31:16

校园商铺-6店铺编辑列表和列表功能-2店铺信息编辑之Controller层的实现的相关文章

巧妙使用SQL Server编辑前200行功能

在SQL Server 2005/2008/2008 R2中,我们可以使用SQL Server自带的编辑前200行功能,使用这个功能的本意是简化Update 的使用,让开发人员.DBA和不懂T-SQL的一些人能够通过可视化界面来直接修改数据库里的数据. 在使用编辑前200行功能的时候,编辑前200行数据,简便是简便了,但是简便了以后更想直接在可视化的页面里直接编辑想要编辑的数据,而不是打开编辑界面后自动读出来的200条,自动读出来的200条顺序杂乱,本来是一个很好用的强大功能,显得有些鸡肋. 在

校园商铺-6店铺编辑列表和列表功能-4店铺信息编辑之前端实现

1.common.js匹配shopId /** * */ function changeVerifyCode(img){ img.src="../Kaptcha?" + Math.floor(Math.random()*100); } function getQueryString(name){ var reg = new RegExp("(^|&)" + name + "=([^&])(&|$)"); var r = w

校园商铺-7商品类别模块-2商品类别列表从后到前

商品类别模块为什么使用shopId,而不是Shop实体类? 因为我们获取productCategory时,并不需要获取除了shopId之外的信息,因此不用Shop实体类. public class ProductCategory { private Long productCategoryId; private Long shopId; private String productCategoryName; private Integer priority; private Date creat

校园商铺-9前端展示系统-8店铺详情页的开发

1.controller层 package com.csj2018.o2o.web.frontend; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springf

校园商铺-9前端展示系统-9店铺详情页的前端开发

1.前端 1.1 html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>商店详情</title> <meta name="viewport" content

校园商铺-4店铺注册功能模块-6店铺注册之Controller层的改造

不合理的地方: 1. 并不需要将InputStream转换成File类型,直接将InputStream传进入交给CommonsMultipartfile去处理就可以了 如果做这样的转换,每次都需要生成一个空白的文件,然后还需要向文件中写入请求传送过来的文件流,这样不仅仅产生很多垃圾文件,同时有可能造成写入失败,抛出异常的风险,大大地加大了系统的不稳定性. 2. 问题:一开始设计ShopService接口addShop方法的时候,第二个参数不早早设定为InputStream? 原因:体现实际的开发

Java期末项目——校园商铺平台(一)

需求分析: 1.1背景 随着高等院校规模的扩大,学生数量的增加,学生的需求日益多样化,加之现在高等学校大多位于郊区,校园商铺发挥着越来越重要的作用.大学校园经济有一定的特殊性,主要体现在,消费群体单一稳定性,购买行为的多次重复性.校园商铺不仅给在现实生提供了方便快捷的商品购买的同时,也是一个很好的盈利方式.在开展校园商铺的同时,要考虑到学校的实际情况,以及是否能盈利. 1.2非功能性需求分析 首先在性能要求上,简约的设计界面,操作灵敏快捷,方便用户体验.网页反应速度快.易打开.网页界面稳定等.在

SSM到Spring Boot -从零开发校园商铺平台

第1章 开发准备   1-1 课程导学   1-2 开发准备第2章 项目设计和框架搭建   2-1 系统功能模块划分   2-2 实体类设计与表创建A   2-3 实体类设计与表创建B   2-4 实体类设计与表创建C   2-5 配置Maven   2-6 逐层完成SSM的各项配置   2-7 验证Dao   2-8 验证Sevice   2-9 验证Controller   2-10 彩蛋时间第3章 Logback配置与使用   3-1 logback介绍   3-2 logback的配置 

Python学习-35.Python中的List Comprehensions(列表解释|列表生成式)

在某些情况下,我们需要对列表进行某些操作,例如对列表中的每一个元素都乘以2,这样一般来说就是遍历每个元素在乘以2.那么写下来就得两行了.而且这会修改原来的列表,如果要求不能修改原来的列表,又得多一行了. 1 mylist = [1,3,5,7] 2 copylist = [] 3 for i in mylist: 4 copylist.append(i * 2) 5 print(copylist) 一眼看上去就是臃肿二字. Python提供了更加简便的写法: 1 mylist = [1,3,5,

FreeRTOS高级篇1---FreeRTOS列表和列表项

FreeRTOS内核调度大量使用了列表(list)这一数据结构.我们如果想一探FreeRTOS背后的运行机制,首先遇到的拦路虎就是列表.对于FreeRTOS内核来说,列表就是它最基础的部分.我们在这一章集中讲解列表和列表项的结构以及操作函数,在下一章讲解任务创建时,会用到本章的知识点. 列表被FreeRTOS调度器使用,用于跟踪任务,处于就绪.挂起.延时的任务,都会被挂接到各自的列表中.用户程序如果有需要,也可以使用列表. FreeRTOS列表使用指针指向列表项.一个列表(list)下面可能有很