【实战】7-1 商品管理模块接口定义

前言

商品模块是相对来说比较复杂的部分,这里会涉及到分页的设计,虽然说我们会使用相关的分页插件来辅助我们完成工作,但是学习其分页的写法也是非常重要的,知其然还要知其所以然~

商品模块跟用户模块一样,也分为前台展示部分接口和后台管理部分接口,后台管理会涉及到图片的上传操作,会将前面涉及的ftp服务器内容串联起来。

不得不说,模仿别人成熟的写法成长的速度还是很快的,这也就是看源码的重要性把~

功能介绍

同样分为前后台介绍

前台

  • 产品搜索
  • 动态排序列表 分页在此实现
  • 商品详情

后台

  • 商品列表
  • 商品搜索
  • 图片上传
  • 富文本上传 富文本中图片上传跟上一个图片上传功能不太一样,这个具体到代码了再看看有什么不同
    使用了SimEditor插件,需要按照插件官方文档进行接口编写
  • 商品详情
  • 商品上下架
  • 增加商品
  • 更新商品

学习目标

  • FTP服务的对接
  • SpringMVC文件上传
  • 流读取properties配置文件,静态块
  • 抽象POJO、BO、VO对象之间的转换关系及解决思路
  • joda-time快速入门
  • Mybatis-PageHelper高效准确地分页及动态排序
  • Mybatis对List遍历的实现方法
  • Mybatis对where语句动态拼装的几个版本演进

POJO、BO、VO

这个内容先拎出来讲解一下,具体还需要大家到真实场景中体会
这里写图片描述

POJO是java简单的对象,一般把POJO定义为和数据库中字段相同,里面不带业务逻辑

随着业务的复杂,会逐渐将value object拆分成business object和view object

数据表设计

不做过多介绍,之前已经有介绍了
主图会采用子图中的第一个作为主图
注意价格字段使用decimal类型,20位长,两位小数

接口设计

又到了最重要的接口设计,还是分为前后台,定义好接口,后面code就清晰容易多了

前台

1、产品搜索及动态排序List
这里其实是把之前提到的产品搜索、动态排序、分页合到一个接口中了
/product/list.do

http://localhost:8080/product/list.do?keyword=&categoryId=1&orderBy=price_desc
返回的产品list中会把无关紧要的信息去除,减少信息传输量,减轻服务器压力。

request
    categoryId
    keyword
    pageNum(default=1)
    pageSize(default=10)
    orderBy(default="") 排序参数:例如price_desc,price_asc
response
    success
    {
        "status":0,
        "data":{
            "pageNum":1,
            "pageSize":10,
            "size":2,
            "orderBy":null,
            "startRow":1,
            "endRow":2,
            "total":2,
            "pages":1,
            "list":{
                {
                    "id":1,
                    "categoryId":3,
                    "name":"iphone7",
                    "subtitle":"双十一促销""mainImage":"mainimage.jpg",
                    "price":699900
                },
                {
                    "id":2,
                    "categoryId":2,
                    "name":"oppo R8",
                    "subtitle":"oppo促销进行中""mainImage":"mainimage.jpg",
                    "price":177000
                }
            },
            "firstPage":1,
            "prePage":0,
            "nextPage":0,
            "lastPage":1,
            "isFirstPage":true,
            "isLastPage":true,
            "hasPreviousPage":false,
            "hasNextPage":false,
            "navigatePages":8,
            "navigatepageNums":{
                1
            }
        }
    }

2、产品detail
/product/detail.do
例如

http://localhost:8080/product/detail.do?productId=2

request
    productId
response
    success
    {
        "status":0,
        "data":{
            "id":2,
            "categoryId":2,
            "name":"oppo R8",
            "subtitle":"oppo促销进行中""mainImage":"mainimage.jpg",
            "subImages":"[\"mmall/aa.jpg\",\"mmall/bb.jpg\",\"mmall/cc.jpg\",\"mmall/dd.jpg\",\"mmall/ee.jpg\"]",
            "detail":"richtext",
            "price":2999.11,
            "stock":71,
            "status":1,
            "createTime":"2016-11-20 14:21:53",
            "updateTime":"2016-11-20 14:21:53"
        }
    }
    fail
    {
        "status":1,
        "msg":"该商品已经下架或删除"
    }

后台

1、产品list
基本功能和前台相同,同样为了区分前后台,命名空间加上manage
/manage/product/list.do
http://localhost:8080/manage/product/list.do

request
    pageNum(default=1)
    pageSize(default=10)
response
    success
    {
        "status":0,
        "data":{
            "pageNum":1,
            "pageSize":10,
            "size":2,
            "orderBy":null,
            "startRow":1,
            "endRow":2,
            "total":2,
            "pages":1,
            "list":{
                {
                    "id":1,
                    "categoryId":3,
                    "name":"iphone7",
                    "subtitle":"双十一促销""mainImage":"mainimage.jpg",
                    "price":7199.22
                },
                {
                    "id":2,
                    "categoryId":2,
                    "name":"oppo R8",
                    "subtitle":"oppo促销进行中""mainImage":"mainimage.jpg",
                    "price":2999.11
                }
            },
            "firstPage":1,
            "prePage":0,
            "nextPage":0,
            "lastPage":1,
            "isFirstPage":true,
            "isLastPage":true,
            "hasPreviousPage":false,
            "hasNextPage":false,
            "navigatePages":8,
            "navigatepageNums":{
                1
            }
        }
    }

    fail
    {
        "status":10,
        "msg":"用户未登录,请登录"
    }

2、产品搜索
可能跟用户使用的搜索不太一样了,而且这个项目可能就简化了搜索部分,直接使用数据库的搜索功能了
可以使用产品名称或产品id进行搜索
/manage/product/search.do
http://localhost:8080/manage/product/search.do?productName=p
http://localhost:8080/manage/product/search.do?productId=1

request
    productName
    productId
    pageNum(default=1)
    pageSize(default=10)
response
    success
    {
        "status":0,
        "data":{
            "pageNum":1,
            "pageSize":10,
            "size":2,
            "orderBy":null,
            "startRow":1,
            "endRow":2,
            "total":2,
            "pages":1,
            "list":{
                {
                    "id":1,
                    "categoryId":3,
                    "name":"iphone7",
                    "subtitle":"双十一促销""mainImage":"mainimage.jpg",
                    "price":7199.22
                }
            },
            "firstPage":1,
            "prePage":0,
            "nextPage":0,
            "lastPage":1,
            "isFirstPage":true,
            "isLastPage":true,
            "hasPreviousPage":false,
            "hasNextPage":false,
            "navigatePages":8,
            "navigatepageNums":{
                1
            }
        }
    }

    fail
    {
        "status":10,
        "msg":"用户未登录,请登录"
    }

3、图片上传
使用了SpringMVC的上传功能
过程是上传图片用file流接收,存到ftp服务器上,然后和ftp的地址做一个拼接,然后给到前端。
/manage/product/upload.do

request
    <!--真实情况当然不是传这个,而是图片-->
    <form name="form2" action="/manage/product/upload.do" method="post" enctype="multipart/form-data">
      <input type="file" name="file"/>
      <input type="submit" value="upload"/>
    </form>

response
    success
    {
        "status":0,
        "data"{
            "uri":"e6604558-c0ff-41b9-b6e1-30787a1e3412.jpg",
            "url":"http://img.happymall.winxblast.top/e6604558-c0ff-41b9-b6e1-30787a1e3412.jpg"
        }
    }

    fail
    {
        status!=0的时候···
    }

4、产品详情
这一部分的实际内容跟前台是一样的
/manage/product/detail.do

http://localhost:8080/manage/product/detail.do?productId=2

request
    productId

response
    success
    {
        {
            "status":0,
            "data":{
                "id":2,
                "categoryId":2,
                "name":"oppo R8",
                "subtitle":"oppo促销进行中""mainImage":"mainimage.jpg",
                "subImages":"[\"mmall/aa.jpg\",\"mmall/bb.jpg\",\"mmall/cc.jpg\",\"mmall/dd.jpg\",\"mmall/ee.jpg\"]",
                "detail":"richtext",
                "price":2999.11,
                "stock":71,
                "status":1,
                "createTime":"2016-11-20 14:21:53",
                "updateTime":"2016-11-20 14:21:53"
            }
        }
    }

    fail
    {
        "status":1,
        "msg":"没有权限"
    }

5、产品上下架
当然啦,里面要验证管理员权限
/manage/product/set_sale_status.do

http://localhost:8080/manage/product/set_sale_status.do?productId=1&status=1

request
    productId
    status
response
    success
    {
        "staus":0,
        "data":"修改产品状态成功"
    }

    fail
    {
        "staus":1,
        "data":"修改产品状态失败"
    }

6、新增OR更新产品
/manage/product/save.do

新增 http://localhost:8080/manage/product/save.do?categoryId=1&name=三星洗衣机&subtitle=三星大促销&subImages=test.jpg,11.jpg,2.jpg,3.jpg&detail=detailtext&price=1000&stock=100&status=1

更新 http://localhost:8080/manage/product/save.do?categoryId=1&name=三星洗衣机&subtitle=三星大促销&subImages=test.jpg&detail=detailtext&price=1000&stock=100&status=1&id=3

request
    categoryId=1&name=三星洗衣机&subtitle=三星大促销&mainImage=sss.jpg&subImages=test.jpg&detail=detailtext&price=1000&stock=100&status=1&id=3

response
    success
    {
        "status":0,
        "data":"更新产品成功"
    }
    或
    {
        "status":0,
        "data":"新增产品成功"
    } 

    fail
    {
        "status":1,
        "data":"更新产品失败"
    }

7、富文本上传图片
/manage/product/richtext_img_upload.do
这里返回的格式不是很符合我们之前定义的serverResponse的格式,主要是这里要按照富文本的要求去返回,要符合Simditor关于图片上传成功后的返回要求

request
    <form name="form2" action="/manage/product/upload.do" method="post" enctype="multipart/form-data">
      <input type="file" name="file"/>
      <input type="submit" value="upload"/>
    </form>

response
    success
    {
        "file_path":"http://img.happymall.winxblast.top/5f239f2-0007-40c1-b8e6-0dc11b22779c.jpg",
        "msg":"上传成功""success":true
    }

    fail
    {
        "success":false,
        "msg":"error message",
        "file_path":"[real file path]"
    }

小结

至此,关于产品管理的前后台接口都已经给出了,这里主要的知识点应该就在分页的学习和图片的上传。这都是真实网站环境下非常常用的功能,要好好学习体会啦。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值