当前位置: 首页 > news >正文

网站怎样自动文字排版wordpress 固定连接插件

网站怎样自动文字排版,wordpress 固定连接插件,番禺建设网站平台,又拍云 wordpress这篇文章是关于项目的订单模块的设计。这个模块其实相对来讲比之前的模块复杂了点#xff0c;我这里说的复杂并不是说难以理解#xff0c;而是说文件比较多#xff0c;理解起来还是蛮轻松的。 我们还是老方法#xff0c;一步一步的去设计#xff0c;按照Dao-service-我这里说的复杂并不是说难以理解而是说文件比较多理解起来还是蛮轻松的。 我们还是老方法一步一步的去设计按照Dao-service-controller的顺序来设计。 先来设计Dao层。需要注意的是这里非常特别因为Dao层里面有两个文件分别是OrderMapper和OrderItemMapper。这两者有什么区别呢区别就是一个是关于订单的文件一个是关于订单项的文件。那订单和订单项有什么区别呢我觉得如果真的看定义的话其实根本看不清我就举一个例子。 假如现在有一个用户在电商网站上购买了三个商品商品A、商品B和商品C。这个用户将这三个商品添加到购物车并进行结算生成了一个订单。 订单Order 订单号202402240001用户ID12345订单状态待支付支付状态未支付下单时间2024-02-24 10:00:00收货地址123 Main Street, City, Country 订单项Order Item 订单号202402240001 商品ID1001商品名称商品A商品数量2商品价格$10 订单号202402240001 商品ID1002商品名称商品B商品数量1商品价格$20 订单号202402240001 商品ID1003商品名称商品C商品数量3商品价格$15 这下我估计你该懂了。因为这种东西干巴巴的说定义真的是说不清的必须要配合例子来理解至少我是这样的。 我们先来设计Dao层里面的OrderMapper。 package com.imooc.mall.dao;import com.imooc.mall.pojo.Order;import java.util.List;public interface OrderMapper {int deleteByPrimaryKey(Integer id);//根据订单ID删除订单记录int insert(Order record);//插入一条完整的订单记录int insertSelective(Order record);//选择性地插入一条订单记录只插入非空字段的值Order selectByPrimaryKey(Integer id);//根据订单ID查询订单记录int updateByPrimaryKeySelective(Order record);//选择性地更新一条订单记录只更新非空字段的值int updateByPrimaryKey(Order record);//更新一条完整的订单记录ListOrder selectByUid(Integer uid);//根据用户ID查询该用户的订单列表Order selectByOrderNo(Long orderNo);//根据订单号查询订单记录 } 上面这些方法定义了对订单表的基本操作包括插入、更新、删除和查询。通过调用这些方法可以对订单数据进行持久化操作实现订单的增删改查功能。 但是这里的 OrderMapper 接口没有具体的实现代码只定义了接口方法。具体的实现代码通常由框架或者开发者自行完成其实就是 OrderMapper.xml文件夹。这个文件夹实现了这个接口里的方法。 然后再来设计Dao层的OrderItemMapper。 package com.imooc.mall.dao;import com.imooc.mall.pojo.OrderItem; import org.apache.ibatis.annotations.Param;import java.util.List; import java.util.Set;public interface OrderItemMapper {int deleteByPrimaryKey(Integer id);//根据订单项ID删除订单项记录int insert(OrderItem record);//插入一条完整的订单项记录int insertSelective(OrderItem record);//选择性地插入一条订单项记录只插入非空字段的值OrderItem selectByPrimaryKey(Integer id);//根据订单项ID查询订单项记录int updateByPrimaryKeySelective(OrderItem record);//选择性地更新一条订单项记录只更新非空字段的值int updateByPrimaryKey(OrderItem record);//更新一条完整的订单项记录int batchInsert(Param(orderItemList) ListOrderItem orderItemList);//批量插入订单项记录。该方法接收一个订单项列表作为参数并批量插入到数据库中ListOrderItem selectByOrderNoSet(Param(orderNoSet) Set orderNoSet);//根据订单号集合查询订单项列表。该方法接收一个订单号的集合作为参数并返回对应的订单项列表 } 这些方法定义了对订单项表的基本操作包括插入、更新、删除和查询。通过调用这些方法可以对订单项数据进行持久化操作实现订单项的增删改查功能。 有没有看到其实这个订单项和订单是差不多的你只要理解了这两者的区别基本上就很好理解了。 再来设计service层。 package com.imooc.mall.service;import com.github.pagehelper.PageInfo; import com.imooc.mall.vo.OrderVo; import com.imooc.mall.vo.ResponseVo;public interface IOrderService {ResponseVoOrderVo create(Integer uid, Integer shippingId);//创建订单。接收用户ID和收货地址ID作为参数返回一个包含订单信息的响应对象 ResponseVoOrderVo。ResponseVoPageInfo list(Integer uid, Integer pageNum, Integer pageSize);//获取订单列表。接收用户ID、页码和每页大小作为参数返回一个包含分页订单信息的响应对象 ResponseVoPageInfo。ResponseVoOrderVo detail(Integer uid, Long orderNo);//获取订单详情。接收用户ID和订单号作为参数返回一个包含订单详细信息的响应对象 ResponseVoOrderVo。ResponseVo cancel(Integer uid, Long orderNo);//取消订单。接收用户ID和订单号作为参数返回一个响应对象 ResponseVo表示取消订单的结果。void paid(Long orderNo);//订单支付完成后的回调方法。接收订单号作为参数无返回值。 }这里的接口方法返回的类型是根据业务需求定义的泛型对象 ResponseVo 和 ResponseVoT用于封装响应结果和数据。OrderVo 是一个用于表示订单信息的值对象。 我们一个方法一个方法的来实现。首先实现create方法 public ResponseVoOrderVo create(Integer uid, Integer shippingId) {//收货地址校验总之要查出来的Shipping shipping shippingMapper.selectByUidAndShippingId(uid, shippingId);if (shipping null) {return ResponseVo.error(ResponseEnum.SHIPPING_NOT_EXIST);}//获取购物车校验是否有商品、库存ListCart cartList cartService.listForCart(uid).stream().filter(Cart::getProductSelected).collect(Collectors.toList());if (CollectionUtils.isEmpty(cartList)) {return ResponseVo.error(ResponseEnum.CART_SELECTED_IS_EMPTY);}//获取cartList里的productIdsSetInteger productIdSet cartList.stream().map(Cart::getProductId).collect(Collectors.toSet());ListProduct productList productMapper.selectByProductIdSet(productIdSet);MapInteger, Product map productList.stream().collect(Collectors.toMap(Product::getId, product - product));ListOrderItem orderItemList new ArrayList();Long orderNo generateOrderNo();for (Cart cart : cartList) {//根据productId查数据库Product product map.get(cart.getProductId());//是否有商品if (product null) {return ResponseVo.error(ResponseEnum.PRODUCT_NOT_EXIST,商品不存在. productId cart.getProductId());}//商品上下架状态if (!ProductStatusEnum.ON_SALE.getCode().equals(product.getStatus())) {return ResponseVo.error(ResponseEnum.PRODUCT_OFF_SALE_OR_DELETE,商品不是在售状态. product.getName());}//库存是否充足if (product.getStock() cart.getQuantity()) {return ResponseVo.error(ResponseEnum.PROODUCT_STOCK_ERROR,库存不正确. product.getName());}OrderItem orderItem buildOrderItem(uid, orderNo, cart.getQuantity(), product);orderItemList.add(orderItem);//减库存product.setStock(product.getStock() - cart.getQuantity());int row productMapper.updateByPrimaryKeySelective(product);if (row 0) {return ResponseVo.error(ResponseEnum.ERROR);}}//计算总价只计算选中的商品//生成订单入库order和order_item事务Order order buildOrder(uid, orderNo, shippingId, orderItemList);int rowForOrder orderMapper.insertSelective(order);if (rowForOrder 0) {return ResponseVo.error(ResponseEnum.ERROR);}int rowForOrderItem orderItemMapper.batchInsert(orderItemList);if (rowForOrderItem 0) {return ResponseVo.error(ResponseEnum.ERROR);}//更新购物车选中的商品//Redis有事务(打包命令)不能回滚for (Cart cart : cartList) {cartService.delete(uid, cart.getProductId());}//构造orderVoOrderVo orderVo buildOrderVo(order, orderItemList, shipping);return ResponseVo.success(orderVo);} 这个方法太长了我理解了好久就说一下我自己的理解。 根据用户ID和收货地址ID查询对应的收货地址信息。判断收货地址是否存在如果不存在则返回错误响应。获取用户购物车中选中的商品列表已经勾选的商品。判断购物车是否为空如果为空则返回错误响应。从购物车列表中获取商品ID集合并根据商品ID集合查询对应的商品信息。构建订单项列表遍历购物车列表根据购物车项信息和商品信息构建订单项并将订单项添加到订单项列表中。生成订单号orderNo。遍历订单项列表依次处理每个订单项 根据商品ID获取对应的商品信息。判断商品是否存在如果不存在则返回错误响应。判断商品的上下架状态如果不是在售状态则返回错误响应。判断商品库存是否充足如果不充足则返回错误响应。构建订单项对象并将其添加到订单项列表中。减少商品库存数量并更新数据库中的商品库存信息。构建订单对象包括用户ID、订单号、收货地址ID和订单项列表等信息。将订单信息插入到数据库中。将订单项列表插入到数据库中。遍历购物车列表删除购物车中已选中的商品。构建订单视图对象OrderVo包括订单信息、订单项列表和收货地址信息等。返回成功响应并将订单视图对象作为响应数据返回。 这是真的复杂但是我感觉就稍微看看理解下原来是这么回事儿脑子里有创建订单的流程就好了。 再来实现list方法。 Overridepublic ResponseVoPageInfo list(Integer uid, Integer pageNum, Integer pageSize) {PageHelper.startPage(pageNum, pageSize);ListOrder orderList orderMapper.selectByUid(uid);SetLong orderNoSet orderList.stream().map(Order::getOrderNo).collect(Collectors.toSet());ListOrderItem orderItemList orderItemMapper.selectByOrderNoSet(orderNoSet);MapLong, ListOrderItem orderItemMap orderItemList.stream().collect(Collectors.groupingBy(OrderItem::getOrderNo));SetInteger shippingIdSet orderList.stream().map(Order::getShippingId).collect(Collectors.toSet());ListShipping shippingList shippingMapper.selectByIdSet(shippingIdSet);MapInteger, Shipping shippingMap shippingList.stream().collect(Collectors.toMap(Shipping::getId, shipping - shipping));ListOrderVo orderVoList new ArrayList();for (Order order : orderList) {OrderVo orderVo buildOrderVo(order,orderItemMap.get(order.getOrderNo()),shippingMap.get(order.getShippingId()));orderVoList.add(orderVo);}PageInfo pageInfo new PageInfo(orderList);pageInfo.setList(orderVoList);return ResponseVo.success(pageInfo);} 使用PageHelper工具类设置分页参数即设置页码和每页显示数量。根据用户ID查询对应的订单列表。从订单列表中提取订单号集合。根据订单号集合查询对应的订单项列表。将订单项列表按订单号进行分组构建订单号与订单项列表的映射关系。从订单列表中提取收货地址ID集合。根据收货地址ID集合查询对应的收货地址列表。将收货地址列表按ID进行映射构建收货地址ID与收货地址对象的映射关系。遍历订单列表逐个构建订单视图对象OrderVo 根据订单信息、订单项映射和收货地址映射构建订单视图对象。将订单视图对象添加到订单视图列表中。构建分页信息对象PageInfo其中包括订单列表和总记录数等信息。将订单视图列表设置到分页信息对象中。返回成功响应将分页信息对象作为响应数据返回。 这也很复杂就随便看看吧。 再来实现detail方法。 Overridepublic ResponseVoOrderVo detail(Integer uid, Long orderNo) {Order order orderMapper.selectByOrderNo(orderNo);if (order null || !order.getUserId().equals(uid)) {return ResponseVo.error(ResponseEnum.ORDER_NOT_EXIST);}SetLong orderNoSet new HashSet();orderNoSet.add(order.getOrderNo());ListOrderItem orderItemList orderItemMapper.selectByOrderNoSet(orderNoSet);Shipping shipping shippingMapper.selectByPrimaryKey(order.getShippingId());OrderVo orderVo buildOrderVo(order, orderItemList, shipping);return ResponseVo.success(orderVo);} 根据订单号查询对应的订单信息。判断订单是否存在或者订单所属用户是否与传入的用户ID匹配如果不匹配则返回错误响应。创建订单号集合并将当前订单号添加到集合中。根据订单号集合查询对应的订单项列表。根据订单的收货地址ID查询对应的收货地址信息。根据订单信息、订单项列表和收货地址信息构建订单视图对象OrderVo。返回成功响应将订单视图对象作为响应数据返回。 再来实现cancel方法。 Overridepublic ResponseVo cancel(Integer uid, Long orderNo) {Order order orderMapper.selectByOrderNo(orderNo);if (order null || !order.getUserId().equals(uid)) {return ResponseVo.error(ResponseEnum.ORDER_NOT_EXIST);}//只有[未付款]订单可以取消看自己公司业务if (!order.getStatus().equals(OrderStatusEnum.NO_PAY.getCode())) {return ResponseVo.error(ResponseEnum.ORDER_STATUS_ERROR);}order.setStatus(OrderStatusEnum.CANCELED.getCode());order.setCloseTime(new Date());int row orderMapper.updateByPrimaryKeySelective(order);if (row 0) {return ResponseVo.error(ResponseEnum.ERROR);}return ResponseVo.success();} 根据订单号查询对应的订单信息。判断订单是否存在或订单所属用户是否与传入的用户ID匹配如果不匹配则返回错误响应。判断订单状态是否为未付款状态如果不是则返回错误响应。将订单状态设置为已取消状态并设置取消时间为当前时间。更新数据库中的订单信息。判断更新结果如果影响的行数小于等于0则返回错误响应。返回成功响应。 这里也是随便看看。只要你脑补到有这个画面就行。 最后设计paid方法。 Overridepublic void paid(Long orderNo) {Order order orderMapper.selectByOrderNo(orderNo);if (order null) {throw new RuntimeException(ResponseEnum.ORDER_NOT_EXIST.getDesc() 订单id: orderNo);}//只有[未付款]订单可以变成[已付款]看自己公司业务if (!order.getStatus().equals(OrderStatusEnum.NO_PAY.getCode())) {throw new RuntimeException(ResponseEnum.ORDER_STATUS_ERROR.getDesc() 订单id: orderNo);}order.setStatus(OrderStatusEnum.PAID.getCode());order.setPaymentTime(new Date());int row orderMapper.updateByPrimaryKeySelective(order);if (row 0) {throw new RuntimeException(将订单更新为已支付状态失败订单id: orderNo);}} 根据订单号查询订单信息。如果订单不存在则抛出运行时异常。判断订单状态是否为未付款状态如果不是则抛出运行时异常。将订单状态设置为已支付状态设置支付时间为当前时间。更新数据库中的订单信息。判断更新结果如果影响的行数小于等于0则抛出运行时异常。 OK了service层就已经设计完毕了。确实订单模块这里比较繁琐所以我感觉最重要还是理解不需要说背背就没意思了脑补到每个实现方法的画面就很好了。 然后设计controller层。 package com.imooc.mall.controller;import com.github.pagehelper.PageInfo; import com.imooc.mall.consts.MallConst; import com.imooc.mall.form.OrderCreateForm; import com.imooc.mall.pojo.User; import com.imooc.mall.service.IOrderService; import com.imooc.mall.vo.OrderVo; import com.imooc.mall.vo.ResponseVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpSession; import javax.validation.Valid;/*** Created by 廖师兄*/ RestController public class OrderController {Autowiredprivate IOrderService orderService;PostMapping(/orders)public ResponseVoOrderVo create(Valid RequestBody OrderCreateForm form,HttpSession session) {User user (User) session.getAttribute(MallConst.CURRENT_USER);return orderService.create(user.getId(), form.getShippingId());}GetMapping(/orders)public ResponseVoPageInfo list(RequestParam Integer pageNum,RequestParam Integer pageSize,HttpSession session) {User user (User) session.getAttribute(MallConst.CURRENT_USER);return orderService.list(user.getId(), pageNum, pageSize);}GetMapping(/orders/{orderNo})public ResponseVoOrderVo detail(PathVariable Long orderNo,HttpSession session) {User user (User) session.getAttribute(MallConst.CURRENT_USER);return orderService.detail(user.getId(), orderNo);}PutMapping(/orders/{orderNo})public ResponseVo cancel(PathVariable Long orderNo,HttpSession session) {User user (User) session.getAttribute(MallConst.CURRENT_USER);return orderService.cancel(user.getId(), orderNo);} }create() 方法用于创建订单。通过接收一个包含订单创建表单数据的 POST 请求并从会话中获取当前用户信息调用订单服务的 create() 方法来创建订单并返回相应的响应结果。 list() 方法用于获取订单列表。通过接收 GET 请求中的页码和每页数量参数并从会话中获取当前用户信息调用订单服务的 list() 方法来获取当前用户的订单列表并返回相应的响应结果。 detail() 方法用于获取订单详情。通过接收 GET 请求中的订单号参数并从会话中获取当前用户信息调用订单服务的 detail() 方法来获取指定订单的详情并返回相应的响应结果。 cancel() 方法用于取消订单。通过接收 PUT 请求中的订单号参数并从会话中获取当前用户信息调用订单服务的 cancel() 方法来取消指定订单并返回相应的响应结果。 这些方法使用了依赖注入Autowired来获取订单服务IOrderService的实例以便调用订单相关的业务逻辑。同时使用了会话HttpSession来获取当前用户信息。根据不同的请求类型和参数调用相应的订单服务方法并返回相应的响应给客户端。 这就是订单模块的所有实现我感觉订单模块其实理解起来并不难主要是太多了所以我感觉应该静下心来仔细想想service层的整个流程service层一旦掌握了那整个模块应该很容易就掌握了。
http://www.pierceye.com/news/435523/

相关文章:

  • 网站开发要做什么在线网页转pdf
  • 购物网站开发教程中文如何调整wordpress页面的顺序
  • 网站网页设计制作教程成都外贸seo
  • 网站开发的资料设备英国搜索引擎
  • 什么样企业需要网站建设网络规划毕业设计
  • 广东制作公司网站和谐校园网站建设
  • 找潍坊做网站的h5用什么软件做的
  • 南宁网站推广费用0505网页制作与网站建设
  • 2345电视剧网站免费电子营业执照
  • 河北省沧州建设厅网站怎样保存网站资料 做证据
  • 网站同时做竞价和优化可以吗做网站游戏推广赚钱吗
  • 台州建站模板搭建上海远程教育网站设计与开发公司
  • 网站如何做淘客类似58同城分类信息网站开发
  • 网站源码文件安装教程苏州网站建设致宇
  • 免费注册域名网站知乎做网站做图电脑需要什么配置
  • 高埗做网站营销策略分析包括哪些内容
  • wordpress获取站点链接网站门户
  • flashxml网站模板网站后期培训机构全国排名
  • 企业网站设计网站页面设计中为什么要有优先级排列
  • 暗网是什么网站滨江区网站开发公司
  • 南京网站排名优化费用株洲58同城网站建设电话
  • 电子商务网站建设与管理理解上海网站推广企业
  • 设计师网站pintsetseo短视频网页入口引流免费
  • 个人如何注册微信公众号怎么创建网站优化的意义
  • 网站换空间要重新备案吗百度人工电话
  • 做网站要注意哪些问题网站用什么工具做
  • 在福州的网站制作公司滨海新网站建设
  • 帝国网站地图插件泰兴企业网站建设
  • wordpress布置网站教程用dw做简单图片网站
  • 网页制作模板左右结构百度seo关键词优化方案