Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@
# Ignore all logfiles and tempfiles.
/log/*.log
/tmp

public/uploads
13 changes: 13 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,19 @@ gem 'sdoc', '~> 0.4.0', group: :doc
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring', group: :development


gem "devise"


gem "bootstrap-sass"
gem "simple_form", "3.1.0rc1"
gem 'carrierwave'
gem "mini_magick"


group :development do
gem "annotate"
end
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

Expand Down
32 changes: 32 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,32 @@ GEM
minitest (~> 5.1)
thread_safe (~> 0.1)
tzinfo (~> 1.1)
annotate (2.6.3)
activerecord (>= 2.3.0)
rake (>= 0.8.7)
arel (5.0.1.20140414130214)
bcrypt (3.1.7)
bootstrap-sass (3.0.3.0)
sass (~> 3.2)
builder (3.2.2)
carrierwave (0.10.0)
activemodel (>= 3.2.0)
activesupport (>= 3.2.0)
json (>= 1.7)
mime-types (>= 1.16)
coffee-rails (4.0.1)
coffee-script (>= 2.2.0)
railties (>= 4.0.0, < 5.0)
coffee-script (2.2.0)
coffee-script-source
execjs
coffee-script-source (1.7.0)
devise (3.2.4)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5)
thread_safe (~> 0.1)
warden (~> 1.2.3)
erubis (2.7.0)
execjs (2.2.0)
hike (1.2.3)
Expand All @@ -51,8 +68,11 @@ GEM
mime-types (~> 1.16)
treetop (~> 1.4.8)
mime-types (1.25.1)
mini_magick (3.7.0)
subexec (~> 0.2.1)
minitest (5.3.4)
multi_json (1.10.1)
orm_adapter (0.5.0)
polyglot (0.3.5)
rack (1.5.2)
rack-test (0.6.2)
Expand Down Expand Up @@ -84,6 +104,9 @@ GEM
sdoc (0.4.0)
json (~> 1.8)
rdoc (~> 4.0, < 5.0)
simple_form (3.1.0.rc1)
actionpack (~> 4.0)
activemodel (~> 4.0)
spring (1.1.3)
sprockets (2.11.0)
hike (~> 1.2)
Expand All @@ -95,6 +118,7 @@ GEM
activesupport (>= 3.0)
sprockets (~> 2.8)
sqlite3 (1.3.9)
subexec (0.2.3)
thor (0.19.1)
thread_safe (0.3.4)
tilt (1.4.1)
Expand All @@ -108,17 +132,25 @@ GEM
uglifier (2.5.0)
execjs (>= 0.3.0)
json (>= 1.8.0)
warden (1.2.3)
rack (>= 1.0)

PLATFORMS
ruby

DEPENDENCIES
annotate
bootstrap-sass
carrierwave
coffee-rails (~> 4.0.0)
devise
jbuilder (~> 2.0)
jquery-rails
mini_magick
rails (= 4.1.0)
sass-rails (~> 4.0.3)
sdoc (~> 0.4.0)
simple_form (= 3.1.0rc1)
spring
sqlite3
turbolinks
Expand Down
59 changes: 59 additions & 0 deletions TODO
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@

購物:
☐ 身為消費者,我要在前台能夠找到商品並加到購物車
☐ 身為消費者,我要在前台能夠將多樣商品加到購物車,並生成一張訂單
☐ 身為消費者,當系統生成一張訂單後,我可以填寫寄送資訊,並且用信用卡結帳
☐ 身為消費者,當我用信用卡結帳後,我的信箱要能收到一張訂單確認信

Admin 管理訂單:
☐ 身為管理者,可以在後台看訂單,訂單狀態分為未結帳、已結帳、出貨中、已出貨、辦理退貨
☐ 身為管理者,我可以在後台對單張訂單做狀態改變
☐ 身為管理者,當我在將商品設為已出貨時,消費者應該收到一張已出貨的通知信

☐ 身為商家,當消費者確定購物結帳後,該商品的庫存必須按照數量減少


Admin:
✔ Admin Should able to see admin panel link in dropdown menu @done (14-06-13 01:59)
Product:
✔ Refine with Product List with table @done (14-06-13 02:14)
✔ should able update image when create product @done (14-06-13 04:09)
☐ should able to upload image after update

其他:
✔ 套 Bootstrap 版 @done (14-06-12 18:33)
✔ Login / Logout using bootstrap nav @done (14-06-12 18:33)
✔ SimpleForm with Bootstrap @done (14-06-13 02:39)
✔ 安裝 Carrierwave @done (14-06-13 03:21)
☐ Search function ( using Ransack )

有空想做的:
☐ 重新整理登入 / 登出畫面
☐ 加入 Facebook Login


--- ✄ -----------------------

身為商家的管理者,我要能夠在後台上架我的東西,並設定能夠販賣:
✔ 管理者必須要有一個後台 @done (14-06-12 17:56)
✔ 後台必須要可以新增產品 @done (14-06-12 17:56)
✔ 產品內容必須要有標題、文字、數量 @done (14-06-12 18:02)
✔ 產品必須要有價格 @done (14-06-13 03:21)
✔ 產品內容必須要有圖片 @done (14-06-13 03:21)

身為商家的管理者,我要能夠在後台設定權限,權限分成管理者以及消費者:
✔ 身為管理者,才可以進入後台 @done (14-06-13 03:39)
✔ 身為管理者,必須要登入且是 admin @done (14-06-13 03:39)
✔ 管理者身份必須要被分為 admin / user @done (14-06-13 03:39)


任何使用者都要能看到首頁:
✔ 首頁應該要能夠看到所有商品 @done (14-06-13 03:39)
✔ 任何使用者都要能看到首頁 @done (14-06-13 03:39)



任何使用者都要能看到產品頁:
✔ 產品頁應該能要看到標題 @done (14-06-13 04:09)
✔ 產品頁應該要能看到敘述 @done (14-06-13 04:09)
✔ 產品頁應該要能看到圖片 @done (14-06-13 04:09)

3 changes: 3 additions & 0 deletions app/assets/javascripts/admin/products.js.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://coffeescript.org/
4 changes: 2 additions & 2 deletions app/assets/javascripts/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@
//
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .
//= require bootstrap/dropdown
//= require bootstrap/alert
3 changes: 3 additions & 0 deletions app/assets/javascripts/products.js.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://coffeescript.org/
3 changes: 3 additions & 0 deletions app/assets/stylesheets/admin/products.css.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Place all the styles related to the admin::products controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
16 changes: 15 additions & 1 deletion app/assets/stylesheets/application.css
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,20 @@
* defined in the other CSS/SCSS files in this directory. It is generally better to create a new
* file per style scope.
*
*= require_tree .
*= require_self
*= require bootstrap
*= require products
*/



.group:before, .group:after {
content: "";
display: table;
}
.group:after {
clear: both;
}
.group {
zoom: 1; /* IE6&7 */
}
8 changes: 8 additions & 0 deletions app/assets/stylesheets/products.css.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
.product-price{
padding-top: 20px;
padding-bottom: 20px;

font-size: 30px;
font-weight: bold;
color: #ff007c;
}
41 changes: 41 additions & 0 deletions app/controllers/admin/products_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
class Admin::ProductsController < AdminController

def new
@product = Product.new
@photo = @product.photos.new
end

def create
@product = Product.new(product_params)

if @product.save
redirect_to admin_products_path
else
render :new
end
end

def edit
@product = Product.find(params[:id])
end

def update
@product = Product.find(params[:id])

if @product.update(product_params)
redirect_to admin_products_path
else
render :edit
end
end

def index
@products = Product.all
end

private

def product_params
params.require(:product).permit(:title, :description,:quantity, :price, :photos_attributes => [:image] )
end
end
8 changes: 8 additions & 0 deletions app/controllers/admin_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class AdminController < ApplicationController

layout "admin"

before_action :authenticate_user!
before_action :admin_required

end
7 changes: 7 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,11 @@ class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception



def admin_required
current_user.admin?
end

end
11 changes: 11 additions & 0 deletions app/controllers/products_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class ProductsController < ApplicationController

def index
@products = Product.order("id DESC")
end


def show
@product = Product.find(params[:id])
end
end
2 changes: 2 additions & 0 deletions app/helpers/admin/products_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
module Admin::ProductsHelper
end
20 changes: 20 additions & 0 deletions app/helpers/application_helper.rb
Original file line number Diff line number Diff line change
@@ -1,2 +1,22 @@
module ApplicationHelper


def notice_message
alert_types = { :notice => :success, :alert => :danger }

close_button_options = { :class => "close", "data-dismiss" => "alert", "aria-hidden" => true }
close_button = content_tag(:button, "×", close_button_options)

alerts = flash.map do |type, message|
alert_content = close_button + message

alert_type = alert_types[type.to_sym] || type
alert_class = "alert alert-#{alert_type} alert-dismissable"

content_tag(:div, alert_content, :class => alert_class)
end

alerts.join("\n").html_safe
end

end
38 changes: 38 additions & 0 deletions app/helpers/products_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
module ProductsHelper

def render_product_photo(photo, size = "thumb")

if photo.present?
image_url = photo.image.send(size).url
else

case size
when :medium
volume = "300x300"
else
volume = "200x200"
end

image_url = "http://placehold.it/#{volume}&text=No Pic"
end

image_tag(image_url, :class => "thumbnail")

end

def render_product_name(product)
product.title
end

def render_product_desc(product)
simple_format(product.description)
end

def render_product_quantity(product)
product.quantity
end

def render_product_price(product)
product.price
end
end
5 changes: 5 additions & 0 deletions app/models/photo.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class Photo < ActiveRecord::Base
belongs_to :product

mount_uploader :image, ImageUploader
end
Loading