大家好,本系列文章主要是对我参加全栈营JDstore魔改大赛作品「季风 & MONSOON」的复盘。由于本人也是新手,文章中一定有很多幼稚的错误或代码,希望大家帮忙指出,可反馈至我的邮箱kerzzi@outlook.com,我会持续完善本系列。非常感谢。
本系列是在全栈营JDstore教程基础之上进行魔改,本系列第1-11章节为全栈营JDstore教程,请在完成全栈营JDstore教程的基础上进行测试。
目标
实作商品多级分类功能(1)
步骤
Step 0:建立新分支
在终端执行checkout -b story09```。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| ### Step 2: 在终端执行```rails g model category```。 ### Step 3: 打开新建的db/migrate/20170609135005_create_categories.rb,修改成如下内容 ```ruby db/migrate/20170609135005_create_categories.rb class CreateCategories < ActiveRecord::Migration[5.0] def change create_table :categories do |t| t.string :title t.integer :weight, default: 0 #用于权重的字段,方面后续按不同顺序展示商品 t.integer :products_counter, default: 0 #该分类下的产品数量字段 t.timestamps end add_index :categories, [:title] #养成习惯建立一张表时,最好将索引建立好,比如搜索功能会用到 end end
|
Step 4: 给products增加更多的属性
在终端执行g migration add_more_details_to_product```。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 打开db/migrate/20170609135208_add_more_details_to_product.rb,修改为如下内容 ```ruby db/migrate/20170609135208_add_more_details_to_product.rb class AddMoreDetailsToProduct < ActiveRecord::Migration[5.0] def change add_column :products, :category_id, :integer add_column :products, :status, :string, default: 'off' #指示商品状态,如上架、下架,设置为string模式方便后续增加状态数量,而且更为直观 add_column :products, :uuid, :string #uuid是商品的序列号,教材中的不够直观,这样也方便后期增加功能 add_column :products, :msrp, :decimal, precision: 10, scale: 2 #msrp是市场建议零售价的缩写,用于打折等 #养成习惯,建立一张表时,最好将索引建立好,主要用于搜索 add_index :products, [:status, :category_id] add_index :products, [:category_id] add_index :products, [:uuid], unique: true #在数据库层面限制序列号的唯一性 add_index :products, [:title] end end
|
在终端执行
git add .
git commit -m “建立分类model,并补充商品的属性”
1 2 3 4 5 6 7
| ### Step 5:安装树形结构管理的gem,用于管理商品分类 打开Gemfile ```ruby Gemfile gem 'figaro' gem 'rails-erd' + gem 'ancestry'
|
在终端执行
git add .
git commit -m “安装树形结构管理gem,用于管理商品分类”
1 2 3 4 5 6 7 8 9 10 11 12 13
| ### Step 6: 在终端执行```rails g migration add_ancestry_to_category```。 打开db/migrate/20170609135811_add_ancestry_to_category.rb,修改成如下内容 ```ruby db/migrate/20170609135811_add_ancestry_to_category.rb class AddAncestryToCategory < ActiveRecord::Migration[5.0] def change add_column :categories, :ancestry, :string add_index :categories, [:ancestry] end end
|
别忘啦在终端执行,db:migrate```。1 2 3 4 5 6 7 8
| ### Step 7: 打开app/models/category.rb ```ruby app/models/category.rb class Category < ApplicationRecord + has_ancestry + has_many :products, dependent: :destroy end
|
打开app/models/product.rb
app/models/product.rb1 2 3 4 5
| class Product < ApplicationRecord mount_uploader :image, ImageUploader + belongs_to :category end
|
可以执行erd```,查看目前model直接的关系1 2 3 4
| ![](https://ww4.sinaimg.cn/large/006tKfTcgy1fgfaspw67oj31ce1amtaz.jpg) 将变更 commit 进去 git 里面。
|
git add .
git commit -m “给分类添加ancestry,并建立category和product之间的联系”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 打开app/models/product.rb,商品创建前生成随机uuid。 ```ruby app/models/product.rb class Product < ApplicationRecord mount_uploader :image, ImageUploader belongs_to :category + before_create :set_default_attrs + private + def set_default_attrs + self.uuid = RandomCode.generate_product_uuid + end end
|
建立生成随机数的model:
在终端执行app/models/random_code.rb```。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| 打开touch app/models/random_code.rb ```ruby touch app/models/random_code.rb module RandomCode class << self #这个model主要用于产生各种随机数,其他几个后续备用 #按规则,产生随机密码字符串 def generate_password len = 8 seed = (0..9).to_a + ('a'..'z').to_a + ('A'..'Z').to_a + ['!', '@', '#', '$', '%', '.', '*'] * 4 token = "" len.times { |t| token << seed.sample.to_s } token end def generate_cellphone_token len = 6 a = lambda { (0..9).to_a.sample } token = "" len.times { |t| token << a.call.to_s } token end def generate_utoken len = 8 a = lambda { rand(36).to_s(36) } token = "" len.times { |t| token << a.call.to_s } token end #按规则,产生随机产品序列号,前四位为月日 def generate_product_uuid Date.today.to_s.split('-')[1..-1].join() << generate_utoken(6).upcase end #按规则,产生随机订单号,前四位为月日 def generate_order_uuid Date.today.to_s.split('-').join()[2..-1] << generate_utoken(5).upcase end end end
|
Step 9:将变更 commit 进去 git 里面。
1 2 3 4 5 6
| git add . git commit -m "商品创建前生成随机uuid" git push origin story09 git checkout master git merge story09 git push origin master
|
本章详解
努力更新中,上班族请理解。。。。。