专栏首页chenchenchen【笔记4-商品模块】从0开始 独立完成企业级Java电商网站开发(服务端)

【笔记4-商品模块】从0开始 独立完成企业级Java电商网站开发(服务端)

分类管理模块

数据表结构设计

分类表

CREATE TABLE、mmall_ category' (
'id' int(11) NOT NULL AUTO_ INCREMENT COMMENT ' 类别Id',
'parent_ id' int(11) DEFAULT NULL COMMENT '父类 别id当id=0时说明是根节点,一级类别' ,
'name' varchar(50) DEFAULT NULL COMMENT ' 类别名称',
'status' tinyint(1) DEFAULT '1' COMMENT ' 类别状态1-正常,2-已废弃',
'sort_order' int(4) DEFAULT NULL COMMENT ' 排序编号,同类展示顺序,数值相等则自然排序' ,
'create_ time' datetime DEFAULT NULL COMMENT '创建时间',
'update_ time' datetime DEFAULT NULL COMMENT ' 更新时间' ,
PRIMARY KEY ( id')
) ENGINE=InnoDB AUTO_ INCREMENT=100032 DEFAULT CHARSET=utf8

1.parent_id是因为分类采用树状分类,递归需要边界条件。2.父类别id=0时,说明是根节点,一级类别,此时为return条件。3.status可选为1或2,1表示类别正常,2表示该类别已废弃。

涉及知识点

  • 如何处理复杂对象排重
  • 如何设计及封装无限层级的树状数据结构 通过设置parent_id及id,id=0时,说明是根节点,一级类别
  • 递归算法的设计思想 查询当前节点下面的子节点,以及子节点的子节点

equals() 的作用是 用来判断两个对象是否相等

//没有重写equals()
Person p1 = new Person("eee", 100);
 Person p2 = new Person("eee", 100);
System.out.printf("%s\n", p1.equals(p2));  //false

重写了Person的equals()函数:当两个Person对象的 name 和 age 都相等,则返回true。

    /**
     * @desc Person类。
     */
    private static class Person {
        int age;
        String name;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String toString() {
            return name   " - "  age;
        }

        /** 
         * @desc 覆盖equals方法 
         */  
        @Override
        public boolean equals(Object obj){  
            if(obj == null){  
                return false;  
            }  
              
            //如果是同一个对象返回true,反之返回false  
            if(this == obj){  
                return true;  
            }  
              
            //判断是否类型相同  
            if(this.getClass() != obj.getClass()){  
                return false;  
            }  
              
            Person person = (Person)obj;  
            return name.equals(person.name) && age==person.age;  
        } 
    }

重写equal 和hashcode方法使用==操作符检查“参数是否为这个对象的引用”;使用instanceof操作符检查“参数是否为正确的类型”;对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;编写完equals方法后,问自己它是否满足对称性、传递性、一致性;重写equals时总是要重写hashCode;不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉@Override注解。

接口设计

1.获取品类子节点(平级)

http://localhost:8080/manage/category/get_category.dohttp://localhost:8080/manage/category/get_category.do?categoryId=0http://localhost:8080/manage/category/get_category.do?categoryId=2

/manage/category/get_category.do

request

categoryId(default=0)

response

success

{
    "status": 0,
    "data": [
        {
            "id": 2,
            "parentId": 1,
            "name": "手机",
            "status": true,
            "sortOrder": 3,
            "createTime": 1479622913000,
            "updateTime": 1479622913000
        },
        {
            "id": 4,
            "parentId": 1,
            "name": "移动座机",
            "status": true,
            "sortOrder": 5,
            "createTime": 1480059936000,
            "updateTime": 1480491941000
        }
    ]
}

2.增加节点

/manage/category/add_category.do

request

parentId(default=0)
categoryName

response

success

{
    "status": 0,
    "msg": "添加品类成功"
}

3.修改品类名字

http://localhost:8080/manage/category/setcategoryname.do?categoryId=999&categoryName=嘻嘻http://localhost:8080/manage/category/setcategoryname.do?categoryId=1&categoryName=嘻嘻

/manage/category/setcategoryname.do

request

categoryId
categoryName

response

success

{
    "status": 0,
    "msg": "更新品类名字成功"
}

4.获取当前分类id及递归子节点categoryId

http://localhost:8080/manage/category/getdeepcategory.do?categoryId=100001

/manage/category/getdeepcategory.do

request

categoryId

response

success

{
    "status": 0,
    "data": [
        100009,
        100010,
        100001,
        100006,
        100007,
        100008
    ]
}

商品模块

数据表结构设计

产品表

create table mmall_product(
    id int(11) primary key auto_increment,
    category_id int(11),
    sub_images text,
    price decimal(20,2),
    status int(6) DEFAULT 1
)

1.category_id将来在表关系中要采用外链。2.图片url存放相对地址,若图片服务器迁移或者域名修改,只需要修改前缀即可3.text格式可以存放的内容比varchar更大,存放图片地址,采用json格式,用于拓展。主图取图片地址中的第一张。4.price采用decimal(20,2)说明价格整体最多20位(其中有两位是小数)。后面会学习如何解决丢失精度的问题。5.status为商品状态,1-在售,2-下架,3-删除。

涉及知识点

FTP服务的对接、SpringMVC文件上传

流读取Properties配置文件的PropertiesUtil工具类

joda-time快速入门 静态块

Mybatis-PageHelper高校准确地分页及动态排序

Mybatis对List遍历的实现方法

Mybatis对where语句动态拼装的几个版本演变

POJO、BO、VO 和 POJO、VO

功能

前台功能

产品搜索动态排序列表商品详情

后台功能

商品列表商品搜素图片上传富文本上传商品详情商品上下架增加商品更新商品

接口设计

【门户】

1.产品搜索及动态排序List

/product/list.do

http://localhost:8080/product/list.do?keyword=&categoryId=1&orderBy=price_desc

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",
                "status":1,
                "price": 7199.22
            },
            {
                "id": 2,
                "categoryId": 2,
                "name": "oppo R8",
                "subtitle": "oppo促销进行中",
                "mainImage": "mainimage.jpg",
                "status":1,
                "price": 2999.11
            }
        ],
        "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"
  }
}

【后台】

1.产品list

http://localhost:8080/manage/product/list.do

/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",
                "status":1,
                "price": 7199.22
            },
            {
                "id": 2,
                "categoryId": 2,
                "name": "oppo R8",
                "subtitle": "oppo促销进行中",
                "mainImage": "mainimage.jpg",
                "status":1,
                "price": 2999.11
            }
        ],
        "firstPage": 1,
        "prePage": 0,
        "nextPage": 0,
        "lastPage": 1,
        "isFirstPage": true,
        "isLastPage": true,
        "hasPreviousPage": false,
        "hasNextPage": false,
        "navigatePages": 8,
        "navigatepageNums": [
            1
        ]
    }
}

2.产品搜索

http://localhost:8080/manage/product/search.do?productName=p

http://localhost:8080/manage/product/search.do?productId=1

/manage/product/search.do

request

productName
productId
pageNum(default=1)
pageSize(default=10)

response

success

{
    "status": 0,
    "data": {
        "pageNum": 1,
        "pageSize": 10,
        "size": 1,
        "orderBy": null,
        "startRow": 1,
        "endRow": 1,
        "total": 1,
        "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
        ]
    }
}

3.图片上传

/manage/product/upload.do

request

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

response

success

{
    "status": 0,
    "data": {
        "uri": "e6604558-c0ff-41b9-b6e1-30787a1e3412.jpg",
        "url": "http://img.happymmall.com/e6604558-c0ff-41b9-b6e1-30787a1e3412.jpg"
    }
}

4.产品详情

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

/manage/product/detail.do

request

productId

response

success

{
    "status": 0,
    "data": {
        "id": 2,
        "categoryId": 2,
        "parentCategoryId":1,
        "name": "oppo R8",
        "subtitle": "oppo促销进行中",
        "imageHost": "http://img.happymmall.com/",
        "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"
    }
}

5.产品上下架

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

/manage/product/setsalestatus.do

request

productId
status

response

success

{
    "status": 0,
    "data": "修改产品状态成功"
}

6.新增OR更新产品

新增

新增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

/manage/product/save.do

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": "更新产品成功"
}

------

7.富文本上传图片

/manage/product/richtextimgupload.do

request

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

response

success

{
    "file_path": "http://img.happymmall.com/5fb239f2-0007-40c1-b8e6-0dc11b22779c.jpg",
    "msg": "上传成功",
    "success": true
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SQL易错锦集

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    chenchenchen
  • 查看Mysql执行计划

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    chenchenchen
  • MySQL之LEFT JOIN中使用ON和WHRERE对表数据

    原文链接:https://segmentfault.com/a/1190000020458807

    chenchenchen
  • Spark 覆盖写Hive分区表,只覆盖部分对应分区

    1、saveAsTable方法无效,会全表覆盖写,需要用insertInto,详情见代码 2、insertInto需要主要DataFrame列的顺序要和Hive...

    董可伦
  • Spark 覆盖写Hive分区表,只覆盖部分对应分区

    配置 config("spark.sql.sources.partitionOverwriteMode","dynamic") 注意 1、saveAsTa...

    实时计算
  • Web---演示servlet技术(servlet生命周期),解决中文乱码问题

    本节讲解决中文乱码问题的4种方法。 还有更好的方法,也就是用过滤器,这里就不演示了,博主目前也不会~呼♪(^∇^*)~过段时间才会学。

    谙忆
  • 币聪科技:Wanchain行情分析,周涨幅近32%,熊市上涨是套路还是逆袭?

    经过几个月的价格下跌后,Wan本周经历了有希望的价格上涨。Wanchain在过去7个交易日内上涨了32%,因为加密货币目前正以0.82美元左右交易。此价格上涨是...

    币聪财经
  • oracle数据库 如何查询某个表的约束条件

    使用下面语句从all_constraints视图中查看某表上的约束: SELECT constraint_name, table_name, r_owner...

    cloudskyme
  • spring 之 import标签、alias标签、beans标签 解析

    java404
  • 使用SAP WebIDE进行SAP Cloud Platform Business Application开发

    在WebIDE的Preferences里,启用SAP WebIDE扩展:SAP Cloud Platform Business Application deve...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券