`
南京老油条
  • 浏览: 57046 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

电商网站订单系统设计

阅读更多

 

原文 

http://oldfritter.iteye.com/blog/2103337

200行代码搞定订单系统主体

概述

订单更新绝大多数是控制订单状态的改变.在此,我将订单状态抽象成点(order_status),改变订单状态的方法称为operation,operation不直接与订单相关,只与order_status相关.

 

 

当订单状态发生改变时,订单包含的操作便自然变更为新的可执行操作

 

样例

以下是一个电商网站的状态流转图

  

 

我是这样做模型层的

class Order < ActiveRecord::Base
  belongs_to :order_status
  has_many :operations, through: :order_status


  def do operation, &block
   return 'No method match' unless operations.find_by(name: operation)
    block_given? ? send(operation, &block) : set_order_status(send(operation))
  end
    
  # 提醒买家,订单将要被自动确认收货,如果尚未到货,请点击延长收货时间
  # email或者短信
  def message_notice
    
  end
  
  private
  
  # 用户支付货款至my_site
  def pay_my_site &block
    set_order_status order_status.do __method__.to_s and save
    "#{yield}?target_uuid=#{uuid}&target_type=trade&amount=#{payment_amount}&paid_by=#{payment_way.name}&foo_type=Order" if block_given?#根据block返回一个支付页面
  end
  
  # 取消订单
  def cancel
    order_status.do __method__.to_s
  end
  
  # 系统自动取消订单
  def auto_cancel
    order_status.do __method__.to_s if operations.find_by(name: operation)
  end
  
  # 确认到款
  def payment_receive
    order_status.do __method__.to_s if spill?
  end
  
  # 取消并退款
  def cancel_with_refund
    refund_money
    order_status.do __method__.to_s
  end
  
  # 发货
  def shipping
    delay(run_at: 3.day.from_now).message_notice
    set_received_at and order_status.do __method__.to_s
  end
  
  # 退款
  def refund
    refund_money
    order_status.do __method__.to_s
  end
  
  # 确认收货
  def receive
    order_status.do __method__.to_s
  end
  
  # 延长收货时间
  def extend_time
    update_attribute :received_at, received_at + 7.days.from_now
    order_status.do __method__.to_s
  end
  
  # 到期自动确认收货(默认7天)
  def auto_receive
    order_status.do __method__.to_s
  end
  
  # 退货/换货
  def return_goods
    order_status.do __method__.to_s
  end
end

 

 

class OrderStatus < ActiveRecord::Base
  
  has_many :operations
  
  def do operation
    operations.find_by(name: operation).do_operation
  end
  
end

 

 

class Operation < ActiveRecord::Base
  
  belongs_to :order_status
  belongs_to :result, class_name: :OrderStatus
  
  def do_operation
    result
  end
  
end

 

 

简单的状态变迁列表

 

 

我的初始化脚本(rake)

 

 

#encoding: utf-8
namespace :order_status do

  task init: :environment do
    Operation.delete_all
    File.open(File.expand_path('../../../docs/order_status', __FILE__)).each_line do |line|
      arr = line.split(/[\t\n]+/).first(7)
      order_status = OrderStatus.find_by name: arr[1]
      order_status = OrderStatus.create(name: arr[1]) if order_status.blank?
      result = OrderStatus.find_by name: arr[5]
      result = OrderStatus.create(name: arr[5]) if result.blank?

      Operation.create({
        name: arr[3],
        order_status: order_status,
        result: result,
        operator: arr[6]
      })
      
    end
  end
  
end

 

 

 

 

控制器是这样设计的

 

 

class CartsController < ApplicationController
  before_action :set_order, only: [:to_pay_page, :operate_by_buyer, :operate_by_seller, :buyer_operations,:seller_operations]

  # redirect_to pay_page
  # params: :id => order.id, :payment_name => 'alipay'
  # 需检测是否已经选择了支付方式
  def to_pay_page
    @order.payment_way = BasicSettings::PaymentWay.find_by name: params[:payment_name]
    pay_params = Proc.new {url = '/pays/pay'}
    redirect_to @order.do('pay_my_site', &pay_params)
  end

 # 买家操作
   # params: order.id, operation
   def operate_by_buyer
     if params[:operation] == 'pay_my_site'
       return redirect_to select_payment_carts_path(id: @order.id)
     end
     @order.do params[:operation] if @order.operations.find_by(operator: 'buyer', name: params[:operation])
     redirect_to controller: 'my/orders', action: 'index'
   end 

  # 卖家操作
  # params: order.id, operation
  def operate_by_seller
    @order.do params[:operation] if @order.operations.find_by(operator: 'seller', name: params[:operation])
    redirect_to controller: params[:controller], action: params[:action]
  end

  # 买家可执行的操作
  def buyer_operations
    render json: @order.operations.where(operator: 'buyer').collect{|t|t.name}.to_json
  end

  # 卖家可执行的操作
  def seller_operations
    render json: @order.operations.where(operator: 'seller').collect{|t|t.name}.to_json
  end

  private
  def set_order
    @order = Slms::Order.find_by id: params[:id]
  end

end

 

 

 

 

至此基本完工

 

注: 为了便于开发,order_status和operation都存在数据库中,部署生产环境时需缓存

  • 大小: 3.8 KB
  • 大小: 44.4 KB
  • 大小: 195.5 KB
分享到:
评论

相关推荐

    跨境电商网站系统的设计与分析.pdf

    跨境电商网站系统设计的关键点包括前台和后台系统功能需求的全面分析和满足。 前台系统功能需求主要包括以下方面: 1. 登录功能:实现用户注册和登录过程的顺利进行。 2. 搜索功能:用户可以快速搜索到想要的商品。...

    基于Java的电商订单管理系统设计源码

    本项目是一款基于Java技术的电商订单管理系统,集成了Java、JavaScript、CSS和HTML等多种编程语言。项目源码共计279个文件,其中Java源文件71个,JavaScript文件32...该系统设计精良,适用于电商平台订单的管理与处理。

    电商系统之订单设计篇.docx

    订单系统的演变也是随着电商平台的业务变化而逐渐演变进化着。 订单系统的作用是管理订单类型、订单状态,收集关于商品、优惠、用户、收货信息、支付信息等一系列的订单实时数据,进行库存更新、订单下发等一系列...

    电商系统数据库表设计

    电商系统数据库表设计,包含商品,订单,用户等模块以及一些表数据

    电商系统-详细设计文档.docx

    电商系统详细设计文档是电商系统的核心组件之一,它提供了电商系统的详细设计信息,包括表设计、接口设计、流程设计、页面设计和存储过程设计等方面的内容。本文档的主要目的是为了提供电商系统的详细设计信息,以...

    电商系统设计报告

    【电商系统设计报告】 电商系统设计是一门涉及广泛的技术领域,涵盖了从系统架构到用户体验的多个层面。在设计电商系统时,首要任务是确保系统的总体结构合理且具有扩展性,以便适应业务的发展和用户需求的变化。 ...

    电商渠道对接系统设计

    在电商行业中,渠道对接系统设计是一项至关重要的任务,它涉及到电商平台与第三方平台之间的数据交互和业务协同。本文将深入探讨“电商渠道对接系统设计”的核心知识点,并基于提供的文件名进行详细解析。 首先,...

    某电商管理后台系统设计与实现.rar

    《某电商管理后台系统设计与实现》 电商管理后台系统是电子商务平台的重要组成部分,它承担着商品管理、订单处理、用户管理、营销活动策划等多种核心功能。本项目旨在设计并实现一套高效、稳定且易用的电商后台管理...

    基于SpringCloudAlibaba微服务的启航电商OMS订单处理系统设计源码

    该项目是一款基于SpringCloudAlibaba微服务架构的启航电商OMS订单处理系统设计源码,包含1068个文件,其中Java源文件551个,Vue组件144个,JavaScript脚本122个,XML配置91个,SVG图形90个,Git忽略文件12个,PNG...

    电商后台管理系统.doc

    这篇【课程设计】主要探讨了电商后台管理系统的重要性和设计思路,涉及了系统背景、总体设计、需求分析等多个方面。 在【课题背景】部分,文章指出,随着经济的发展和生活水平的提高,电子商务已经成为人们生活的一...

    电商的支付系统设计概述.pptx

    在电子商务领域,支付系统的...总的来说,电商支付系统设计是一个复杂而严谨的过程,需要综合考虑用户便利性、交易安全性、系统稳定性等多个因素。随着科技的发展,支付系统将持续进化,以适应更广泛的需求和应用场景。

    jsp简单电商网站设计源代码

    7. **数据库设计**:电商网站通常包含多个数据库表,如用户表(User)、商品表(Product)、订单表(Order)等。数据库设计合理与否直接影响到系统的性能和扩展性。 8. **MVC模式**:尽管项目未明确提及,但JSP常与...

    电商秒杀系统的设计与实现.pdf

    秒杀活动的一个显著特点是高并发访问,因为活动的吸引力导致短时间内大量用户涌入网站,这给电商系统的后台设计带来了极大的压力和挑战。 本篇文献详细介绍了基于Java语言开发的秒杀系统的设计与实现过程,该系统...

    基于java web电商系统设计的开题报告.docx

    【基于Java Web电商系统设计】的开题报告探讨了在互联网快速发展的背景下,如何利用Java Web技术构建一个类似淘宝的电子商务平台。课题旨在通过学习和研究,设计并实现一个包括前台用户界面和后台管理功能的购物网站...

    基于Vue和Element的电商后台管理系统前端设计源码

    本项目是一个基于Vue和Element的电商后台管理系统前端设计源码,共包含231个文件,其中包括73个Vue文件、61个JavaScript文件等。...系统设计注重用户体验和响应速度,采用了模块化的开发方式,便于后续的扩展和维护。

    电商系统的数据库如何设计.docx

    电商系统的数据库设计需要考虑到订单模块的设计,以便于存储和管理订单信息。订单模块的数据库设计需要考虑到以下几点: 1. 订单支付:订单支付是电商系统的核心组件之一,需要考虑到订单的支付信息,如支付方式、...

    PHP电商网站源码PHP电商网站源码

    总之,这个PHP电商网站源码是一个包含完整功能的在线购物平台,涉及了用户管理、商品展示、订单处理等多个方面,同时考虑了安全性与性能优化。开发者可以通过学习和理解源码,提升自己的PHP编程技能,也能为自建电商...

    vue电商网站后台管理系统模板

    这个模板专为电子商务购物网站设计,提供了一个方便的admin系统,让管理员能够高效地管理商品、订单、用户和其他关键业务数据。 首先,我们来详细了解一下Vue.js的特点和优势。Vue的核心特性包括声明式渲染、组件化...

    服务于农村经济的电商管理系统设计.pdf

    数据库表的设计是电商管理系统设计中的一个重点环节。在设计数据库表时,需要考虑到数据的规范性和逻辑性,确保数据的一致性和完整性。设计中常用的数据库表可能包括用户表、商品表、订单表等,这些表之间存在着数据...

    电商财务管理系统:模块架构数据流转进销存核算中台建设.docx

    电商财务管理系统中的中台建设是指对电商平台的财务管理系统进行设计、开发、测试和实施的整个过程。中台建设需要考虑模块化设计、安全性保障、数据传输的安全性等方面,以确保电商财务管理系统的稳定、高效运行。 ...

Global site tag (gtag.js) - Google Analytics