商城项目实战37:订单系统最小实现接口文档及实现

157 篇文章 5 订阅
79 篇文章 1 订阅

创建订单

用户使用portal创建订单、android、ios、微信商城提交订单时使用。

请求方法                       

POST

URL

http://order.taotao.com/order/create

参数说明

 

提交的数据格式:

{

    "payment": 5288,

    "postFee": 0,

    "userId": "3",

    "buyerMessage": null,

    "buyerNick": "zhang123",

    "orderItems": [

        {

            "itemId": "9",

            "num": 1,

            "title": "苹果(Apple)iPhone 6 (A1586) 16GB 金色 移动联通电信4G手机3",

            "price": 5288,

            "totalFee": 5288,

        "picPath": "http://image.taotao.com/images/2015/03/06/2015030610045320609720.jpg"

        }

    ],

    "orderShipping": {

        "receiverName": "张三",

        "receiverPhone": "",

        "receiverMobile": "15800000000",

        "receiverState": "上海",

        "receiverCity": "上海",

        "receiverDistrict": "闵行区",

        "receiverAddress": "三鲁公路3279号 明浦广场 3号楼 205室",

        "receiverZip": "200000"

    }

}

 

示例

 

返回值

{

status200 //200 成功

msg: "OK" // 返回信息消息

data: 100544// 返回订单号

}

 

 

根据订单ID查询订单

请求方法                      

GET

URL

http://order.taotao.com/order/info/{orderId}

参数说明

 

orderId:订单编号

 

示例

http://order.taotao.com/order/info/31414485440695

返回值

{

    "status": 200,

    "msg": "OK",

    "data": {

        "orderId":"100544",

        "payment": 5288,

        "paymentType":1

        "status":1

        "createTime":"2015-01-01 08:22:14"

        "postFee": 0,

        "userId": "3",

        "buyerMessage": null,

        "buyerNick": "zhang123",

        "orderItems": [

            {

                "itemId": "9",

                "num": 1,

                "title": "苹果(Apple)iPhone 6 (A1586) 16GB 金色 移动联通电信4G手机3",

                "price": 5288,

                "totalFee": 5288,

                "picPath": "http://image.taotao.com/images/2015/03/06/2015030610045320609720.jpg"

            }

        ],

        "orderShipping": {

            "receiverName": "张三",

            "receiverPhone": "",

            "receiverMobile": "15800000000",

            "receiverState": "上海",

            "receiverCity": "上海",

            "receiverDistrict": "闵行区",

            "receiverAddress": "三鲁公路3279号 明浦广场 3号楼 205室",

            "receiverZip": "200000"

        }

    }

}

 

根据用户分页查询订单

请求方法                     

GET

URL

http://order.taotao.com/order/list/{userID}/{page}/{count}

参数说明

userID:用户ID

Page:请求的页码

Count:每页显示的记录数

示例

http://order.taotao.com/order/list/zhang123/1/5

返回值

{

    "status": 200,

    "msg": "OK",

    "data": [{

        "orderId":"100544",

        "payment": 5288,

        "paymentType":1

        "status":1

        "createTime":"2015-01-01 08:22:14"

        "postFee": 0,

        "userId": "3",

        "buyerMessage": null,

        "buyerNick": "zhang123",

    },{

        "orderId":"100545",

        "payment": 5288,

        "paymentType":1

        "status":1

        "createTime":"2015-01-01 08:22:15"

        "postFee": 0,

        "userId": "3",

        "buyerMessage": null,

        "buyerNick": "zhang123",

    },{

        "orderId":"100546",

        "payment": 5288,

        "paymentType":1

        "status":1

        "createTime":"2015-01-01 08:22:16"

        "postFee": 0,

        "userId": "3",

        "buyerMessage": null,

        "buyerNick": "zhang123",

    }]

}

 

修改订单状态

 

请求方法                    

POST

URL

http://order.taotao.com/order/changeStatus

参数说明

 

{

    "orderId": "100544",//订单编号

    "status": 2, //订单状态

    "paymentTime": "1414489420444" //付款时间

}

 

示例

http://sso.taotao.com/user/check/zhangsan;t=1

返回值

{

status200 //200 成功

msg: "OK" // 返回信息消息

datanull // 返回数据

}

 

 

 

 

 

1.1.1 Dao层

 

要对三个表进行操作。都是插入操作。可以使用逆向工程生成的代码。

 

1.1.2 Service层

功能:接收三个参数,

1、对应订单表的pojo。

2、订单明细表对应的商品列表。每个元素是订单明细表对应的pojo

3、物流表对应的pojo

 

订单号的生成:

解决方案一(不能使用):

使用mysql的自增长。

优点:不需要我们自己生成订单号,mysql会自动生成。

缺点:如果订单表数量太大时需要分库分表,此时订单号会重复。如果数据备份后再恢复,订单号会变。

方案二:日期+随机数

采用毫秒+随机数。

缺点:仍然有重复的可能。不建议采用此方案。在没有更好的解决方案之前可以使用。

方案三:使用UUID

优点:不会重复。

缺点:长。可读性查。不建议使用。

 

方案四:可读性好,不能太长。一般订单都是全数字的。可以使用redis的incr命令生成订单号。

优点:可读性好,不会重复

缺点:需要搭建redis服务器。

 

返回值:TaotaoResult

 

@Service

public class OrderServiceImpl implements OrderService {

 

@Autowired

private TbOrderMapper orderMapper;

@Autowired

private TbOrderItemMapper orderItemMapper;

@Autowired

private TbOrderShippingMapper orderShippingMapper;

@Autowired

private JedisClient jedisClient;

 

@Value("${ORDER_GEN_KEY}")

private String ORDER_GEN_KEY;

@Value("${ORDER_INIT_ID}")

private String ORDER_INIT_ID;

@Value("${ORDER_DETAIL_GEN_KEY}")

private String ORDER_DETAIL_GEN_KEY;

 

 

@Override

public TaotaoResult createOrder(TbOrder order, List<TbOrderItem> itemList, TbOrderShipping orderShipping) {

//向订单表中插入记录

//获得订单号

String string = jedisClient.get(ORDER_GEN_KEY);

if (StringUtils.isBlank(string)) {

jedisClient.set(ORDER_GEN_KEY, ORDER_INIT_ID);

}

long orderId = jedisClient.incr(ORDER_GEN_KEY);

//补全pojo的属性

order.setOrderId(orderId + "");

//状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭

order.setStatus(1);

Date date = new Date();

order.setCreateTime(date);

order.setUpdateTime(date);

//0:未评价 1:已评价

order.setBuyerRate(0);

//向订单表插入数据

orderMapper.insert(order);

//插入订单明细

for (TbOrderItem tbOrderItem : itemList) {

//补全订单明细

//取订单明细id

long orderDetailId = jedisClient.incr(ORDER_DETAIL_GEN_KEY);

tbOrderItem.setId(orderDetailId + "");

tbOrderItem.setOrderId(orderId + "");

//向订单明细插入记录

orderItemMapper.insert(tbOrderItem);

}

//插入物流表

//补全物流表的属性

orderShipping.setOrderId(orderId + "");

orderShipping.setCreated(date);

orderShipping.setUpdated(date);

orderShippingMapper.insert(orderShipping);

 

return TaotaoResult.ok(orderId);

}

 

}

 

1.1.3 Controller层

接收一个json格式的字符串作为参数。需要使用@RequestBody注解。需要使用一个pojo接收参数。创建一个对应json格式的pojo。

 

package com.taotao.order.pojo;

 

import java.util.List;

 

import com.taotao.pojo.TbOrder;

import com.taotao.pojo.TbOrderItem;

import com.taotao.pojo.TbOrderShipping;

 

public class Order extends TbOrder {

 

private List<TbOrderItem> orderItems;

private TbOrderShipping orderShipping;

public List<TbOrderItem> getOrderItems() {

return orderItems;

}

public void setOrderItems(List<TbOrderItem> orderItems) {

this.orderItems = orderItems;

}

public TbOrderShipping getOrderShipping() {

return orderShipping;

}

public void setOrderShipping(TbOrderShipping orderShipping) {

this.orderShipping = orderShipping;

}

 

 

}

 

 

Controller

@Controller

public class OrderController {

 

@Autowired

private OrderService orderService;

 

@RequestMapping("/create")

@ResponseBody

public TaotaoResult createOrder(@RequestBody Order order) {

try {

TaotaoResult result = orderService.createOrder(order, order.getOrderItems(), order.getOrderShipping());

return result;

} catch (Exception e) {

e.printStackTrace();

return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));

}

}

}

 

在前台系统生成订单

在taotao-portal系统中添加商品至购物车后,点击提交订单调用taotao-order的服务生成订单。向用户展示订单号。提示创建订单成功。

 

2.1 点击购物车“去结算”按钮

点击“去结算”按钮跳转到订单确认页面。

展示url:/order/order-cart.html

@Controller

@RequestMapping("/order")

public class OrderController {

 

@RequestMapping("/order-cart")

public String showOrderCart() {

return "order-cart";

}

}

 

2.2 订单确认页面

1、要求用户登录。

2、根据用户id查询用户的收货地址列表。

3、在此页面展示购物车的商品列表。

4、需要计算订单的总金额(包括运费)展示给用户。

 

2.2.1 要求用户登录

修改springmvc.xml拦截所有以:/order/**形式的url

 

 

2.2.2 根据用户id查询用户的收货地址列表。

在实际的商城中是必须有此功能,需要taotao-rest发布服务,由taotao-portal根据用户查询用户的收货地址列表。

在此,使用静态数据模拟。

 

2.2.3 展示购物车的商品列表

需要从cookie中把购物车商品列表取出,传递给order-cart.jsp。

可以直接使用购物车服务。

@Controller

@RequestMapping("/order")

public class OrderController {

 

@Autowired

private CartService cartService;

 

@RequestMapping("/order-cart")

public String showOrderCart(HttpServletRequest request, HttpServletResponse response, Model model) {

//取购物车商品列表

List<CartItem> list = cartService.getCartItemList(request, response);

//传递给页面

model.addAttribute("cartList", list);

 

return "order-cart";

}

}

 

2.3 提交订单

点击“提交订单”按钮把用户已经确认的订单信息,提交给后台。提交一个隐藏的表单,其中包含订单基本信息,订单名称以及配送信息。需要使用一个包装的pojo接收表单中的内容。

 

请求的url:/order/create.html

参数:表单中的内容。使用Order接收表单的内容。

 

返回值:返回一个jsp页面。

 

2.3.1 Service层

接收Order对象,调用taotao-order提供的服务,提交订单。需要把pojo转换成json数据。调用taotao-order提供的服务返回taotaoResult,包含订单号。

参数:Order

返回值:String(订单号)

@Service

public class OrderServiceImpl implements OrderService {

 

@Value("${ORDER_BASE_URL}")

private String ORDER_BASE_URL;

@Value("${ORDER_CREATE_URL}")

private String ORDER_CREATE_URL;

 

 

@Override

public String createOrder(Order order) {

//调用taotao-order的服务提交订单。

String json = HttpClientUtil.doPostJson(ORDER_BASE_URL + ORDER_CREATE_URL, JsonUtils.objectToJson(order));

//把json转换成taotaoResult

TaotaoResult taotaoResult = TaotaoResult.format(json);

if (taotaoResult.getStatus() == 200) {

Long orderId = (Long) taotaoResult.getData();

return orderId.toString();

}

return "";

}

 

}

 

2.3.2 Controller层

接收页面提交的表单的内容,调用Service创建订单。返回成功页面。

@Controller

@RequestMapping("/order")

public class OrderController {

 

@Autowired

private CartService cartService;

 

@Autowired

private OrderService orderService;

 

@RequestMapping("/order-cart")

public String showOrderCart(HttpServletRequest request, HttpServletResponse response, Model model) {

//取购物车商品列表

List<CartItem> list = cartService.getCartItemList(request, response);

//传递给页面

model.addAttribute("cartList", list);

 

return "order-cart";

}

 

@RequestMapping("/create")

public String createOrder(Order order, Model model) {

String orderId = orderService.createOrder(order);

model.addAttribute("orderId", orderId);

model.addAttribute("payment", order.getPayment());

model.addAttribute("date", new DateTime().plusDays(3).toString("yyyy-MM-dd"));

return "success";

}

 

}

 

 

 

 

 

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Crmeb 接口文档是一个详细说明 Crmeb(开源电商系统)中各个接口的文档,它提供了对系统的功能和数据进行操作的方法和方式。接口文档通常包含了每个接口的功能描述、参数说明、数据格式、请求方式,以及返回结果的说明等内容。 首先,Crmeb 接口文档会详细列出系统中所有的接口,例如用户注册、登录、商品列表、购买商品等。每个接口都有一个标识符,用于在开发中进行调用。 其次,接口文档会说明每个接口具体的功能和操作,例如用户注册接口可以用于用户在系统中创建一个新的账户,购买商品接口可以用于用户在系统中下单购买商品。这样,开发者可以根据实际需求找到需要使用的接口。 接口文档还包含了每个接口所需的参数说明和数据格式。例如,调用用户注册接口时,可能需要传递用户名、密码等参数,并且需要满足一定的数据格式要求。这样,开发者可以清楚地知道在调用接口时应该传递哪些参数以及如何传递。 另外,接口文档还会说明每个接口的请求方式,通常包括 GET、POST 等。开发者可以根据实际需求选择适合的请求方式。 最后,接口文档会详细说明每个接口的返回结果。例如,调用购买商品接口后,可能会返回订单号等相关信息。这样,开发者可以根据返回结果进行后续的操作。 总之,Crmeb 接口文档是对系统中各个接口进行详细说明的文档,它帮助开发者了解每个接口的功能、参数、数据格式和返回结果,从而更好地进行系统开发和集成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值