SSM搭建二手市场交易平台网站

SSM搭建二手市场交易平台(十四):商品详情信息获取

2019-01-27  本文已影响0人  啃饼小白

写在前面

本篇我们来介绍后台商品详细信息获取的功能,这里面有几个字段的获取比较特殊,需要格外注意。

获取商品详情

首先打开ProductManageController.java文件,在里面新增以下代码:

/***
     *
     * 后台管理员获取商品的详情
     * */
    @RequestMapping("detail.do")
    @ResponseBody   //自动序列化json功能
    public ServerResponse getDetail(HttpSession session, Integer productId){

        //判断一下登录情况
        User user=(User) session.getAttribute(Const.CURRENT_USER);
        if(user ==null){
            return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),"用户未登录,请登录");
        }
        //判断一下是不是管理员身份
        if(iUserService.checkAdminRole(user).isSuccess()){
            //如果是管理员就增加我们获取商品详情的逻辑
            return iProductService.manageGetDetail(productId);
        }else{
            return ServerResponse.createByErrorMessage("无权限操作,需要管理员权限");
        }
    }

接着打开ProductServiceImpl.java文件,里面写入以下代码:

    /***
     *
     * 后台管理员获取商品的详情
     * */
    public ServerResponse<ProductDetailVo> manageGetDetail(Integer productId) {
        //判断商品是否存在
        if (productId == null) {   //商品id不存在
            return ServerResponse.createByErrorCodeMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(), ResponseCode.ILLEGAL_ARGUMENT.getDesc());
        }

        Product product = productMapper.selectByPrimaryKey(productId);
        if (product == null) {
            return ServerResponse.createByErrorMessage("该商品已下架或者删除!");
        }
        // vo对象--value object
        //pojo -->bo(business object)--->vo(view object)
        //我们这里还是先按照技术结构的演变,使用vo等到后面升级的时候再进行替换

        //商品存在,我们现在是进行信息的传递
        ProductDetailVo productDetailVo =assembleProductDetailVo(product);
       return ServerResponse.createBySuccess(productDetailVo);

    }

我们知道现在是要获取商品的详细信息,那么我们可以使用不同的架构来完成,有两种架构可供选择:pojo -->vo对象(value object)和pojo -->bo(business object)--->vo(view object),考虑到技术的演变,我们这里还是使用vo等到后面升级的时候再进行替换。前面我们进行了商品信息是否存在的判断,现在是有商品,那么如何获取商品呢?

这里我们写了一个方法,用于获取商品信息(在ProductServiceImpl.java文件里面继续写入以下代码:):

    private ProductDetailVo assembleProductDetailVo(Product product) {
        ProductDetailVo productDetailVo = new ProductDetailVo();
        productDetailVo.setId(product.getId());
        productDetailVo.setSubtitle(product.getSubtitle());
        productDetailVo.setPrice(product.getPrice());
        productDetailVo.setMainImage(product.getMainImage());
        productDetailVo.setSubImages(product.getSubImages());
        productDetailVo.setCategoryId(product.getCategoryId());
        productDetailVo.setDetail(product.getDetail());
        productDetailVo.setName(product.getName());
        productDetailVo.setStatus(product.getStatus());
        productDetailVo.setStock(product.getStock());


        //imageHost:这个我们需要进行单独的配置,这样便于后面的维护
        productDetailVo.setImageHost(PropertiesUtil.getProperty("ftp.server.http.prefix", "http://img.licheetools.top/"));

        //parentCategoryId
        Category category = categoryMapper.selectByPrimaryKey(product.getId());
        if (category ==null) {
            productDetailVo.setParentCategoryId(0);   //没有父节点就默认该节点为0
        }else {
            productDetailVo.setParentCategoryId(category.getParentId());  //存在就赋值给它
        }

        //createTime在mybatis里面都是毫秒数,不利于我们的展示,我们需要进行配置
        productDetailVo.setCreateTime(DateTimeUtil.dateToStr(product.getCreateTime()));

        //updateTime在mybatis里面都是毫秒数,不利于我们的展示,我们需要进行配置
        productDetailVo.setUpdateTime(DateTimeUtil.dateToStr(product.getUpdateTime()));
        return productDetailVo;
    }

既然我们使用了vo那么我们就要去vo包里面新建一个ProductDetailVo.java,在里面写入以下代码,这个文件里面就是定义一些你需要查询的商品字段:

package top.store.vo;

import java.math.BigDecimal;

public class ProductDetailVo {
    private Integer  id;
    private Integer categoryId;
    private String name;
    private String subtitle;
    private String mainImage;
    private String subImages;
    private String detail;
    private BigDecimal price;
    private Integer stock;
    private Integer status;
    private String createTime;
    private String updateTime;

    private String imageHost;   //这个是图片服务器的前缀,我们后面通过这个前缀和图片进行拼接从而形成url进行访问
    private Integer parentCategoryId;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(Integer categoryId) {
        this.categoryId = categoryId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSubtitle() {
        return subtitle;
    }

    public void setSubtitle(String subtitle) {
        this.subtitle = subtitle;
    }

    public String getMainImage() {
        return mainImage;
    }

    public void setMainImage(String mainImage) {
        this.mainImage = mainImage;
    }

    public String getSubImages() {
        return subImages;
    }

    public void setSubImages(String subImages) {
        this.subImages = subImages;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public Integer getStock() {
        return stock;
    }

    public void setStock(Integer stock) {
        this.stock = stock;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    public String getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(String updateTime) {
        this.updateTime = updateTime;
    }

    public String getImageHost() {
        return imageHost;
    }

    public void setImageHost(String imageHost) {
        this.imageHost = imageHost;
    }

    public Integer getParentCategoryId() {
        return parentCategoryId;
    }

    public void setParentCategoryId(Integer parentCategoryId) {
        this.parentCategoryId = parentCategoryId;
    }
}

里面我们有一个imageHost字段,它是图片服务器的前缀,我们后面通过这个前缀和图片进行拼接从而形成url进行访问。继续回到我们的ProductServiceImpl.java文件,不知道细心的你发现没有,有4个字段的获取我们是使用了特殊的方法。其实也正是因为这个原因,我们并没有直接从product对象里面直接获取信息,因为那样获取的信息有可能不是我们所需要的格式,所以我们这里就重新定义了一个ProductDetailVo类,它的实例对象都是来源于product对象但是又进行了更深层次的处理,因此它就是我们想要的。

那么这4个特殊字段的获取应该怎么操作呢?接下来一一为你介绍。

imageHost字段获取

前面说过因为imageHost是图片服务器的前缀,我们后面通过这个前缀和图片进行拼接从而形成url进行访问,所以肯定会涉及到一些服务器属性的配置,这样我们把与服务器属性相关的利用配置文件来处理,这样一旦服务器发送变动,你只需要修改一下配置文件即可,不需要进行很多代码的修改,无形中提高了代码的可维护性。

打开util包,在里面新建一个PropertiesUtil.java文件,里面写入以下代码:

package top.store.util;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;

public class PropertiesUtil {

    //定义日志
    private static Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);

    private static Properties properties;

    static {
        String fileName ="store.properties";
        properties =new Properties();
        try {
            properties.load(new InputStreamReader(PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName),"UTF-8"));
        } catch (IOException e) {
            logger.info("配置文件读取异常",e);
        }
    }


    //定义方法用于从store.properties文件中读取信息
    public static String getProperty(String key){
        //可能我们写的property文件存在空格,需要去掉key包含的空格
        String value =properties.getProperty(key.trim());
        if(StringUtils.isBlank(value)){   //注意这里使用isBlank,就算是空格和制表符也是为空
            return null;
        }
        return value.trim();  //有可能后面的值也存在空值
    }

    //定义方法用于从store.properties文件中读取信息,添加默认参数
    public static String getProperty(String key,String defaultValue){
        //可能我们写的property文件存在空格,需要去掉key包含的空格
        String value =properties.getProperty(key.trim());
        if(StringUtils.isBlank(value)){   //注意这里使用isBlank,就算是空格和制表符也是为空
            value= defaultValue;
        }
        return value.trim();  //有可能后面的值也存在空值
    }
}

我们这里利用的就是静态代码块,因为它只在类被加载时执行,而且只执行一次。这里我们重载了两个方法,目的就是适应不同的业务需求。同时为了能及时发现问题,我们定义了日志,用于相关信息的输出。

parentCategoryId字段获取

因为我们这里是通过商品的Id来获取其详细信息的,这样就可能会存在一个情况就是没有父节点,所以这个字段我们需要格外注意:

        //parentCategoryId
        Category category = categoryMapper.selectByPrimaryKey(product.getId());
        if (category ==null) {
            productDetailVo.setParentCategoryId(0);   //没有父节点就默认该节点为0
        }else {
            productDetailVo.setParentCategoryId(category.getParentId());  //存在就赋值给它
        }

时间字段获取

在这里我们有两个关于时间的字段:createTime和updateTime,我们知道在mybatis里面时间单位都是毫秒数,这是不利于我们展示的,所以需要进行配置。我们可以自己定义一个专门用于处理时间的工具类。打开util包,在里面新建一个工具类DateTimeUtil,我们知道一般时间处理就两种格式:str->Date或者是Date->str。这里我们使用了joda-time这个专门用于处理时间的工具,具体的可以参考这里:Joda-Time的使用。DateTimeUtil文件写入以下信息:

package top.store.util;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.util.Date;

public class DateTimeUtil {
    //我们使用joda-time

    //定义一下我们的日期格式
    public static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";

    //主要完成两种类型的转换
    //str->Date
    //Date->str

    //str->Date,使用前面定义的默认的日期格式
    public static Date strToDate(String dateTimeStr){
        DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(STANDARD_FORMAT);
        DateTime dateTime = dateTimeFormatter.parseDateTime(dateTimeStr);
        return dateTime.toDate();
    }

    //str->Date
    public static Date strToDate(String dateTimeStr,String formatStr){
        DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(formatStr);
        DateTime dateTime = dateTimeFormatter.parseDateTime(dateTimeStr);
        return dateTime.toDate();
    }



    //Date->str,使用前面定义的默认的日期格式
    public static String dateToStr(Date date){
        if(date == null){
            return StringUtils.EMPTY;
        }
        DateTime dateTime = new DateTime(date);
        return dateTime.toString(STANDARD_FORMAT);
    }

    //Date->str
    public static String dateToStr(Date date,String formatStr){
        if(date == null){
            return StringUtils.EMPTY;
        }
        DateTime dateTime = new DateTime(date);
        return dateTime.toString(formatStr);
    }



    //测试上面方法有没有问题的方法
    public static void main(String[] args) {
        System.out.println(DateTimeUtil.dateToStr(new Date(),"yyyy-MM-dd HH:mm:ss"));
        System.out.println(DateTimeUtil.strToDate("2008-08-08 20:08:08","yyyy-MM-dd HH:mm:ss"));

    }
}

然后回到ProductServiceImpl.java文件,添加以下代码(实际上前面已经写过了):

//createTime在mybatis里面都是毫秒数,不利于我们的展示,我们需要进行配置
      productDetailVo.setCreateTime(DateTimeUtil.dateToStr(product.getCreateTime()));

//updateTime在mybatis里面都是毫秒数,不利于我们的展示,我们需要进行配置
       productDetailVo.setUpdateTime(DateTimeUtil.dateToStr(product.getUpdateTime()));

最后打开IProductService.java文件,里面写入以下代码:

ServerResponse<ProductDetailVo> manageGetDetail(Integer productId);     //后台管理员获取商品的详情

这样我们本篇,关于后台商品详细信息获取功能的介绍就到此为止了,感谢你的赏阅!

上一篇下一篇

猜你喜欢

热点阅读