开源项目 基于 Rails 5 的 B2C 电商开源项目

ccok · 2017年02月22日 · 最后由 ccok 回复于 2017年07月20日 · 11609 次阅读

Demo 地址: http://rails5-b2c.eggman.tv/
源码地址: https://github.com/eggmantv/master_rails_by_actions

这个项目离真正的线上使用还差得远,毕竟只是技术目的的教学使用,如果有哪位朋友想把它真的做到线上使用的程度的话,欢迎联系我,对于我来说精力可能不够了

该项目主要是我们自己开发的用于教学目的一个开源项目,项目基于 Rails 5,实现的功能就是传统的 B2C 电商平台中常用的功能,包括:

  • 用户注册登录(支持手机验证码或者邮箱)
  • 购物车
  • 收货地址
  • 订单
  • 支付(集成了支付宝支付功能)
  • 后台管理功能(涵盖商品管理,商品图片,一二级分类)
  • 前台其他相关功能(比如商品搜索,分类页面,单品页,用户中心)

项目使用技术:

  • ruby 2.3
  • rails 5
  • mysql

前台框架:

  • bootstrap
  • font-awesome

涉及到的主要 Gem:

  • sorcery
  • ancestry
  • paperclip
  • rest-client
  • rspec

适用对象:

  • 想从产品或者技术角度学习电商平台核心功能的同学
  • ruby 和 rails 已经入门的同学

项目地址: https://github.com/eggmantv/master_rails_by_actions

部署起来看看呀

#1 楼 @huacnlee 说的是,马上就部署

#1 楼 @huacnlee

Demo: http://rails5-b2c.eggman.tv/

后台管理账号: test@test.com/a5zktij5 http://rails5-b2c.eggman.tv/admin

请大家不要修改密码,谢谢!

lgn21st 回复

👍

我以为会一直嵌套呢 😄

angelfan 回复

👍 原来不会连续嵌套呀

赞 学习一个

ccok 回复

发现一个 bug,加入购物车以后,点继续购物,右上角购物车里的数量没变

benzhang 回复

不是 bug 亲,加入完是不会刷新数量的,需要刷新页面

这个项目以后端为主,前端没有涉及太复杂的业务逻辑,否则项目目标就跑偏了

订阅了,在学习中👍 👍 👍

ccok 回复

缺了必须的页面反馈,用户不知道怎么用,这就是个 bug 。

Rei 回复

这个项目并不是能让你拿来直接放到线上就能用的,侧重于教学目的,主要是后端的实现,前端确实不完善

日后有时间我们会再完善下前端,不好意思

挺不错,不过还处在 demo 阶段,加油💪

@ccok 跑个题,注册主站时遇到下述错误:

“密码长度不能小于 6 位或者大约 20 位”

  1. 大约 -> 大于
  2. 为啥限制最大长度呢?

@ccok 哈哈,玩了一下,不错. 顺带提个小问题,登录状态还能进入到登录页面.

joey 回复

嗯,多谢了

这个项目离真正的线上使用还差得远,毕竟只是技术目的的教学使用,如果有哪位朋友想把它真的做到线上使用的程度的话,欢迎联系我,对于我来说精力可能不够了

ccok 回复

建议不要以真正上线为目标,工作量太大了,Magento 几百 MB 的代码还有无数的插件及主题资源是一个小团队短期内无论如何都比不上的。

在线商城,用现成的就好了,这不是个小轮子。

Magento 是 php 的。

我当初给 KnewOne 做电商的时候,差不多的体验和功能,模型 1000 来行,前端算上可能差不多 2000 行的样子吧。。。写了一个月不到,特化需求不是很难做的,主要是做成生产级系统要考虑很多边界情况(比如最常见的超售,和微信支付、支付宝之类对接的各种情况),一个是可能小难,或是太业务导向违背了教学的目的。

jasl 回复

确实是,所以我们这个当初就是教学目的的,有很多不能太考虑细节,或者深入定制,否则就跑偏了,别人看代码时就容易抓不到重点

ccok 回复

是呀!不忘初心嘛

貌似代码没有考虑 concurrency 问题

也没有考虑地址可能修改的问题

dy1901 回复

考虑了亲

ccok 回复

比如下面 payment 里面这段代码

def self.create_from_orders! user, *orders
  orders.flatten!

  payment = nil
  transaction do
    payment = user.payments.create!(
      total_money: orders.sum(&:total_money)
    )

    orders.each do |order|
      if order.is_paid?
        raise "order #{order.order_no} has already paid"
      end

      order.payment = payment
      order.save!
    end
  end

既没有看到使用悲观锁,订单上也没有创建乐观锁,方法内也并没有分布式锁做排他调用保证

create_table "orders", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
  t.integer  "user_id"
  t.integer  "product_id"
  t.integer  "address_id"
  t.string   "order_no"
  t.integer  "amount"
  t.decimal  "total_money", precision: 10, scale: 2
  t.datetime "payment_at"
  t.datetime "created_at",                                               null: false
  t.datetime "updated_at",                                               null: false
  t.integer  "payment_id"
  t.string   "status",                               default: "initial"
  t.index ["order_no"], name: "index_orders_on_order_no", unique: true, using: :btree
  t.index ["payment_id"], name: "index_orders_on_payment_id", using: :btree
  t.index ["user_id"], name: "index_orders_on_user_id", using: :btree
end

教学分享项目不用太苛求细节吧, 不完善的地方自己下去完善后提交上来哦, 已经做的很不错了 👍

应当要苛求吧,不然学员怎么知道这些知识

只是教学项目,就好像是高中的数学,前面教的与课后习题一个道理,道理教给你了剩下的看自己了,教程不错😄

确实比较坑,最近用户有个需求,要快速的弄个简易版的商城,然后我就看中这个了。感觉楼主对 web 开发有一定经验,但是对 rails 使用应该时间并不是很长。常用的 gem 没有用到。刚刚还遇到一个很极低的错误,引入的 js 放在 body 最下边。而不是 head 里边。导致我调用 jquery 所有的东西都出错。这个问题太不应该了,绕了个大湾。

不过还是感觉楼主,让我省去了不少敲代码的麻烦,大家一起进步

279959599 回复

。。。js 放在页面底部是优化一个常识,加快页面渲染

常用的 gem 这个是看项目需求的

ccok 回复

如果用 rails 自带的 turbolinks 是需要把 javascript tag 放在 head 里面的,如果不用 turbolinks, 我也喜欢放底部,少套一层 domready 回调。

saiga 回复

rails 5 中不是必须放在 head 中了

当然不是必须放 head 里边,放在最后的话,在页面里写的 js 调用 jquery 怎么掉用呢。先执行页面中的 js,在加载 jquery。肯定会暴错,我说的问题是在这里。加载顺序问题。

@ccok 我是订阅会员,但是已经 1 个多月没更新了,最后更新是 6/6 ...请问何时能有更新?不是说每周都会有更新内容吗?

lc.sh.523 回复

你再多个帖子中发一样的内容,不是浪费资源吗

。。。,多关注一下网站吧,我们每周都有更新,https://eggman.tv/

问题是有关注没看到更新啊老板...多发是因为你没回应啊......不然你 hightlight 一下这月更新的内容?我最后看到的是 Ruby 的大师之路 GC 优化2017年6月6日更新,然后我 7/16 问完问题,很恰巧的在 7/18 就更新完结...也请你多关注一下问题吧,毕竟是付费订阅的,收钱的老板,三天才回应。..加油好吗?

那你可以节省点资源回一次就好啊...

lc.sh.523 回复

如果有问题可以直接去网站和我们联系,有联系方式的,这里关注不多

需要 登录 后方可回复, 如果你还没有账号请 注册新账号