前言
商品模块是相对来说比较复杂的部分,这里会涉及到分页的设计,虽然说我们会使用相关的分页插件来辅助我们完成工作,但是学习其分页的写法也是非常重要的,知其然还要知其所以然~
商品模块跟用户模块一样,也分为前台展示部分接口和后台管理部分接口,后台管理会涉及到图片的上传操作,会将前面涉及的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
例如
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]"
}
小结
至此,关于产品管理的前后台接口都已经给出了,这里主要的知识点应该就在分页的学习和图片的上传。这都是真实网站环境下非常常用的功能,要好好学习体会啦。