loyal_core 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.md +3 -0
- data/Rakefile +27 -0
- data/app/assets/images/loyal_core/down_rating.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/loyal_core/skin/recipe/avatar/ico_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/loyal_core/skin/recipe/avatar/medium_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/loyal_core/skin/recipe/avatar/mini_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/loyal_core/skin/recipe/avatar/missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/loyal_core/skin/recipe/avatar/small_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/loyal_core/skin/recipe/avatar/thumb_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/loyal_core/skin/recipe/avatar/tiny_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/user/avatar/ico_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/user/avatar/medium_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/user/avatar/mini_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/user/avatar/missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/user/avatar/small_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/user/avatar/thumb_missing.gif +0 -0
- data/app/assets/images/loyal_core/fallbacks/user/avatar/tiny_missing.gif +0 -0
- data/app/assets/images/loyal_core/liked.gif +0 -0
- data/app/assets/images/loyal_core/unlike.gif +0 -0
- data/app/assets/images/loyal_core/up_rating.gif +0 -0
- data/app/assets/javascripts/jquery.cookie.js +95 -0
- data/app/assets/javascripts/loyal_core/admin/skin/folders.js +2 -0
- data/app/assets/javascripts/loyal_core/admin/skin/recipes.js +2 -0
- data/app/assets/javascripts/loyal_core/ajax/captchas.js +2 -0
- data/app/assets/javascripts/loyal_core/ajax/like_tracks.js +2 -0
- data/app/assets/javascripts/loyal_core/ajax/rating_tracks.js +3 -0
- data/app/assets/javascripts/loyal_core/ajax/users/sessions.js +2 -0
- data/app/assets/javascripts/loyal_core/ajax.js +124 -0
- data/app/assets/javascripts/loyal_core/application.js +6 -0
- data/app/assets/javascripts/loyal_core/jumps.js +2 -0
- data/app/assets/javascripts/loyal_core/tools/append_params_return_to.js +21 -0
- data/app/assets/javascripts/loyal_core/tools/editor_content_mode_selector.js +8 -0
- data/app/assets/javascripts/loyal_core/tools/font_selector.js +83 -0
- data/app/assets/stylesheets/loyal_core/admin/skin/folders.css +4 -0
- data/app/assets/stylesheets/loyal_core/admin/skin/recipes.css +4 -0
- data/app/assets/stylesheets/loyal_core/ajax/captchas.css +4 -0
- data/app/assets/stylesheets/loyal_core/ajax/like_tracks.css +4 -0
- data/app/assets/stylesheets/loyal_core/ajax/rating_tracks.css +4 -0
- data/app/assets/stylesheets/loyal_core/ajax/users/sessions.css +4 -0
- data/app/assets/stylesheets/loyal_core/application.css.scss +18 -0
- data/app/assets/stylesheets/loyal_core/jumps.css +4 -0
- data/app/controllers/loyal_core/admin/skin/folders_controller.rb +54 -0
- data/app/controllers/loyal_core/admin/skin/recipes_controller.rb +52 -0
- data/app/controllers/loyal_core/ajax/captchas_controller.rb +26 -0
- data/app/controllers/loyal_core/ajax/like_tracks_controller.rb +33 -0
- data/app/controllers/loyal_core/ajax/rating_tracks_controller.rb +41 -0
- data/app/controllers/loyal_core/ajax/users/sessions_controller.rb +8 -0
- data/app/controllers/loyal_core/ajax_controller.rb +14 -0
- data/app/controllers/loyal_core/application_controller.rb +6 -0
- data/app/controllers/loyal_core/jumps_controller.rb +10 -0
- data/app/helpers/loyal_core/admin/skin/folders_helper.rb +5 -0
- data/app/helpers/loyal_core/admin/skin/recipes_helper.rb +5 -0
- data/app/helpers/loyal_core/ajax/captchas_helper.rb +6 -0
- data/app/helpers/loyal_core/ajax/like_tracks_helper.rb +6 -0
- data/app/helpers/loyal_core/ajax/rating_tracks_helper.rb +6 -0
- data/app/helpers/loyal_core/ajax/users/sessions_helper.rb +5 -0
- data/app/helpers/loyal_core/application_helper.rb +6 -0
- data/app/helpers/loyal_core/jumps_helper.rb +5 -0
- data/app/models/kindeditor/asset.rb +14 -0
- data/app/models/kindeditor/file.rb +4 -0
- data/app/models/kindeditor/flash.rb +4 -0
- data/app/models/kindeditor/image.rb +4 -0
- data/app/models/kindeditor/media.rb +4 -0
- data/app/models/loyal_core/like_track.rb +15 -0
- data/app/models/loyal_core/rating_track.rb +32 -0
- data/app/models/loyal_core/skin/dish.rb +10 -0
- data/app/models/loyal_core/skin/folder.rb +26 -0
- data/app/models/loyal_core/skin/recipe.rb +31 -0
- data/app/models/loyal_core/skin.rb +8 -0
- data/app/uploaders/loyal_core/asset_uploader.rb +128 -0
- data/app/uploaders/loyal_core/avatar_uploader.rb +37 -0
- data/app/views/layouts/loyal_core/application.html.erb +14 -0
- data/app/views/loyal_core/admin/skin/folders/_form.html.erb +9 -0
- data/app/views/loyal_core/admin/skin/folders/edit.html.erb +11 -0
- data/app/views/loyal_core/admin/skin/folders/index.html.erb +25 -0
- data/app/views/loyal_core/admin/skin/folders/new.html.erb +11 -0
- data/app/views/loyal_core/admin/skin/folders/show.html.erb +32 -0
- data/app/views/loyal_core/admin/skin/recipes/_form.html.erb +25 -0
- data/app/views/loyal_core/admin/skin/recipes/edit.html.erb +11 -0
- data/app/views/loyal_core/admin/skin/recipes/index.html.erb +37 -0
- data/app/views/loyal_core/admin/skin/recipes/new.html.erb +11 -0
- data/app/views/loyal_core/admin/skin/recipes/show.html.erb +16 -0
- data/app/views/loyal_core/ajax/captchas/_new.html.erb +1 -0
- data/app/views/loyal_core/ajax/captchas/new.html.erb +1 -0
- data/app/views/loyal_core/jumps/show.html.erb +12 -0
- data/app/views/simple_captcha/_simple_captcha.erb +16 -0
- data/config/locales/en/default.en.yml +139 -0
- data/config/locales/en/loyal_simple_captcha.en.yml +8 -0
- data/config/locales/zh-CN/action_view.zh-CN.yml +8 -0
- data/config/locales/zh-CN/default.zh-CN.yml +199 -0
- data/config/locales/zh-CN/loyal_simple_captcha.zh-CN.yml +8 -0
- data/config/locales/zh-CN/paginate.zh-CN.yml +8 -0
- data/config/routes.rb +24 -0
- data/db/migrate/20130331104216_create_loyal_core_rating_tracks.rb +19 -0
- data/db/migrate/20130331104822_create_loyal_core_like_tracks.rb +19 -0
- data/db/migrate/20130413061851_create_kindeditor_assets.rb +17 -0
- data/db/migrate/20130610091558_create_loyal_core_skin_folders.rb +48 -0
- data/db/migrate/20130610095635_create_loyal_core_skin_recipes.rb +28 -0
- data/db/migrate/20130610095938_create_loyal_core_skin_dishes.rb +13 -0
- data/lib/loyal_core/action_controller/request_init.rb +33 -0
- data/lib/loyal_core/action_controller/seo_methods.rb +47 -0
- data/lib/loyal_core/action_controller.rb +4 -0
- data/lib/loyal_core/action_helper/ajax/like_tracks_helper.rb +26 -0
- data/lib/loyal_core/action_helper/ajax/rating_tracks_helper.rb +35 -0
- data/lib/loyal_core/action_helper/font_selector_helper.rb +25 -0
- data/lib/loyal_core/action_helper.rb +27 -0
- data/lib/loyal_core/action_view/labeled_builder.rb +127 -0
- data/lib/loyal_core/action_view.rb +7 -0
- data/lib/loyal_core/active_model/fix_counter_cache.rb +39 -0
- data/lib/loyal_core/active_model/human_display_able.rb +26 -0
- data/lib/loyal_core/active_model/strip_whitespace.rb +27 -0
- data/lib/loyal_core/active_model.rb +16 -0
- data/lib/loyal_core/acts/bit_able.rb +139 -0
- data/lib/loyal_core/acts/content_depart_able.rb +102 -0
- data/lib/loyal_core/acts/content_mode_able.rb +88 -0
- data/lib/loyal_core/acts/has_avatar.rb +31 -0
- data/lib/loyal_core/acts/has_permalink.rb +43 -0
- data/lib/loyal_core/acts/like_track_able.rb +90 -0
- data/lib/loyal_core/acts/named_filter_able.rb +40 -0
- data/lib/loyal_core/acts/rating_track_able.rb +76 -0
- data/lib/loyal_core/acts/skin_dish_able.rb +56 -0
- data/lib/loyal_core/acts/tree.rb +104 -0
- data/lib/loyal_core/acts/uuid_ful.rb +39 -0
- data/lib/loyal_core/acts/views_count_able.rb +33 -0
- data/lib/loyal_core/acts.rb +35 -0
- data/lib/loyal_core/config.rb +116 -0
- data/lib/loyal_core/core_ext/singleton_class.rb +9 -0
- data/lib/loyal_core/engine.rb +11 -0
- data/lib/loyal_core/memoist.rb +204 -0
- data/lib/loyal_core/utils/array_util.rb +16 -0
- data/lib/loyal_core/utils/config_util.rb +186 -0
- data/lib/loyal_core/utils/data_util.rb +181 -0
- data/lib/loyal_core/utils/text_util.rb +49 -0
- data/lib/loyal_core/utils.rb +8 -0
- data/lib/loyal_core/version.rb +4 -0
- data/lib/loyal_core.rb +17 -0
- data/lib/tasks/loyal_core_tasks.rake +11 -0
- metadata +231 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module LoyalCore
|
3
|
+
# 大字段分离
|
4
|
+
module ActsAsContentModeAble
|
5
|
+
def self.included base
|
6
|
+
base.class_eval do
|
7
|
+
extend ClassMethods
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
LOYAL_CORE_CONTENT_MODE_CONFIGS = ::LoyalCore::ConfigUtil.new(
|
12
|
+
{ :key => :html, :value => 0, :desc => "HTML" },
|
13
|
+
{ :key => :text, :value => 1, :desc => "TEXT" },
|
14
|
+
{ :key => :markdown, :value => 2, :desc => "Markdown" }
|
15
|
+
)
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
def loyal_core_acts_as_content_mode_able *args
|
19
|
+
extend ContentModeClassMethods
|
20
|
+
include ContentModeInstanceMethods
|
21
|
+
|
22
|
+
# 文字不能为空
|
23
|
+
# validates_presence_of :content_text
|
24
|
+
end
|
25
|
+
|
26
|
+
module ContentModeClassMethods
|
27
|
+
def content_mode_config
|
28
|
+
LOYAL_CORE_CONTENT_MODE_CONFIGS
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module ContentModeInstanceMethods
|
33
|
+
def content_mode_was_cache_reset!
|
34
|
+
@content_mode_was_cache = self.content_mode
|
35
|
+
end
|
36
|
+
|
37
|
+
# FIXME
|
38
|
+
def content_mode_was_cache
|
39
|
+
(
|
40
|
+
@content_mode_was_cache ||= self.content_mode
|
41
|
+
).to_i
|
42
|
+
end
|
43
|
+
|
44
|
+
def content_mode_was_cache= mode
|
45
|
+
@content_mode_was_cache = mode
|
46
|
+
end
|
47
|
+
|
48
|
+
def content_mode_was_cache_changed?
|
49
|
+
self.content_mode_was_cache != self.content_mode
|
50
|
+
end
|
51
|
+
|
52
|
+
def content_mode_name= name
|
53
|
+
self.content_mode = self.class.content_mode_config.at(name).value
|
54
|
+
end
|
55
|
+
|
56
|
+
def content_mode_name
|
57
|
+
self.class.content_mode_config.item(self.content_mode).key
|
58
|
+
end
|
59
|
+
|
60
|
+
def content
|
61
|
+
case self.content_mode_name
|
62
|
+
when :html
|
63
|
+
::LoyalCore::TextUtil.syntax_highlighter(
|
64
|
+
::Sanitize.clean(self.content_code, ::LoyalCore.config.sanitize_config[:relaxed])
|
65
|
+
)
|
66
|
+
when :markdown
|
67
|
+
# TODO: markdown
|
68
|
+
::LoyalCore::TextUtil.markdown(self.content_code)
|
69
|
+
when :text
|
70
|
+
self.content_text
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def content= content
|
75
|
+
self.content_code = content
|
76
|
+
end
|
77
|
+
|
78
|
+
def content_text
|
79
|
+
::Sanitize.clean(self.content_code, ::LoyalCore.config.sanitize_config[:text]) || 0
|
80
|
+
end
|
81
|
+
|
82
|
+
extend ::LoyalCore::Memoist
|
83
|
+
|
84
|
+
memoize :content_text, :content
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module LoyalCore
|
3
|
+
module ActsAsHasAvatar
|
4
|
+
# LOYAL_CORE_AVATAR_STYLES = {
|
5
|
+
# :medium => "360x360#",
|
6
|
+
# :small => "180x180#",
|
7
|
+
# :thumb => "100x100#",
|
8
|
+
# :mini => "50x50#"
|
9
|
+
# }.freeze
|
10
|
+
|
11
|
+
def self.included(base)
|
12
|
+
base.class_eval do
|
13
|
+
extend ClassMethods
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
#
|
19
|
+
#
|
20
|
+
def loyal_core_acts_as_has_avatar(*args)
|
21
|
+
options = args.extract_options!
|
22
|
+
|
23
|
+
field_name = args.first || :avatar
|
24
|
+
|
25
|
+
attr_accessible field_name, :"#{field_name}_cache"
|
26
|
+
mount_uploader field_name, ::LoyalCore::AvatarUploader
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module LoyalCore
|
3
|
+
module ActsAsHasPermalink
|
4
|
+
PERMALINK_REGEXP = /^[A-Za-z0-9\_]+$/.freeze
|
5
|
+
|
6
|
+
def self.included base
|
7
|
+
base.class_eval do
|
8
|
+
extend ClassMethods
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
def loyal_core_acts_as_has_permalink *args
|
14
|
+
options = args.extract_options!
|
15
|
+
field_name = args.first || :permalink
|
16
|
+
|
17
|
+
include WithSpaceMethods
|
18
|
+
|
19
|
+
if options[:with_space]
|
20
|
+
validates_format_of field_name, :with => PERMALINK_REGEXP, :unless => :space_root?, :multiline => true
|
21
|
+
validates_presence_of field_name, :unless => :space_root?
|
22
|
+
|
23
|
+
# space 格式要求正确
|
24
|
+
validates_format_of :space, :with => PERMALINK_REGEXP, :multiline => true
|
25
|
+
validates_uniqueness_of field_name, :uniqueness => {:scope => [:space]}
|
26
|
+
else
|
27
|
+
validates_format_of field_name, :with => PERMALINK_REGEXP, :multiline => true
|
28
|
+
validates_presence_of field_name
|
29
|
+
|
30
|
+
validates_uniqueness_of field_name
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
module WithSpaceMethods
|
35
|
+
|
36
|
+
def space_root?
|
37
|
+
self.permalink.blank?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module LoyalCore
|
3
|
+
module ActsAsLikeTrackAble
|
4
|
+
def self.included base
|
5
|
+
base.class_eval do
|
6
|
+
extend ClassMethods
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def loyal_core_acts_as_like_track_able *args
|
12
|
+
has_many :like_tracks, :class_name => "LoyalCore::LikeTrack", :as => :target
|
13
|
+
|
14
|
+
include InstanceMethods
|
15
|
+
|
16
|
+
scope :filter_by_liked_by, ->(user_or_user_id) do
|
17
|
+
joins(:like_tracks).where(
|
18
|
+
:"#{::LoyalCore::LikeTrack.table_name}" => {
|
19
|
+
:created_by => (user_or_user_id.is_a?(User) ? user_or_user_id.id : user_or_user_id)
|
20
|
+
}
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module InstanceMethods
|
26
|
+
def user_like_tracks user
|
27
|
+
self.like_tracks.filter_by_creator user
|
28
|
+
end
|
29
|
+
|
30
|
+
# 是否被 ** 喜欢了?
|
31
|
+
def liked_by? user
|
32
|
+
return false if user.nil?
|
33
|
+
|
34
|
+
::TinyCache.cache_store.fetch liked_cache_key(:user_id => user.id) do
|
35
|
+
self.user_like_tracks(user).exists?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# 被**喜欢
|
40
|
+
def liked_by! user, options={}
|
41
|
+
tmp_scope = self.user_like_tracks(user)
|
42
|
+
tmp_scope.create
|
43
|
+
|
44
|
+
self.reload
|
45
|
+
|
46
|
+
self.touch
|
47
|
+
|
48
|
+
_expire_liked_cache :user_id => user.id
|
49
|
+
end
|
50
|
+
|
51
|
+
# 取消喜欢
|
52
|
+
def undo_liked_by! user
|
53
|
+
self.user_like_tracks(user).destroy_all
|
54
|
+
|
55
|
+
self.reload
|
56
|
+
|
57
|
+
self.touch
|
58
|
+
|
59
|
+
_expire_liked_cache :user_id => user.id
|
60
|
+
end
|
61
|
+
|
62
|
+
# return:
|
63
|
+
# :like
|
64
|
+
# :undo
|
65
|
+
def touch_liked_by! user
|
66
|
+
if self.liked_by?(user)
|
67
|
+
self.undo_liked_by!(user)
|
68
|
+
:undo
|
69
|
+
else
|
70
|
+
self.liked_by!(user)
|
71
|
+
:like
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
# 使过期
|
78
|
+
def _expire_liked_cache options={}
|
79
|
+
# 刷新更新时间
|
80
|
+
|
81
|
+
::TinyCache.cache_store.delete liked_cache_key(options)
|
82
|
+
end
|
83
|
+
|
84
|
+
def liked_cache_key options={}
|
85
|
+
"#{::TinyCache.cache_key_prefix}/ables/like_track_able/#{self.class.name}/#{self.id}/userid:#{options[:user_id]}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module LoyalCore
|
3
|
+
module ActsAsNamedFilterAble
|
4
|
+
def self.included base
|
5
|
+
base.class_eval do
|
6
|
+
extend ClassMethods
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def loyal_core_acts_as_named_filter_able *args
|
12
|
+
options = args.extract_options!
|
13
|
+
|
14
|
+
field_name = args.first
|
15
|
+
config = options[:config] || ::LoyalCore::ConfigUtil.new
|
16
|
+
|
17
|
+
# color_named_filter_config
|
18
|
+
self.class.send :define_method, :"#{field_name}_named_filter_config" do
|
19
|
+
config
|
20
|
+
end
|
21
|
+
|
22
|
+
# filter_by_named_color
|
23
|
+
scope :"filter_by_named_#{field_name}", ->(*names) do
|
24
|
+
where :"#{field_name}" => config.values_at(*names)
|
25
|
+
end
|
26
|
+
|
27
|
+
# filter_named_color
|
28
|
+
define_method :"filter_named_#{field_name}" do
|
29
|
+
config.item(self.send field_name)
|
30
|
+
end
|
31
|
+
|
32
|
+
include InstanceMethods
|
33
|
+
end
|
34
|
+
|
35
|
+
module InstanceMethods
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module LoyalCore
|
3
|
+
module ActsAsRatingTrackAble
|
4
|
+
def self.included base
|
5
|
+
base.class_eval do
|
6
|
+
extend ClassMethods
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def loyal_core_acts_as_rating_track_able *args
|
12
|
+
has_many :rating_tracks, :class_name => "LoyalCore::RatingTrack", :as => :target
|
13
|
+
|
14
|
+
include InstanceMethods
|
15
|
+
end
|
16
|
+
|
17
|
+
module InstanceMethods
|
18
|
+
def user_rating_tracks user
|
19
|
+
self.rating_tracks.filter_by_creator(user)
|
20
|
+
end
|
21
|
+
|
22
|
+
# 是否被**打分?
|
23
|
+
def rating_by?(user)
|
24
|
+
self.user_rating_tracks(user).exists?
|
25
|
+
end
|
26
|
+
|
27
|
+
# 加分
|
28
|
+
def up_rating_by!(user, score=1)
|
29
|
+
if rating_by? user
|
30
|
+
:already
|
31
|
+
else
|
32
|
+
self.rating_by! user, score
|
33
|
+
:up
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# 打低分
|
38
|
+
def down_rating_by!(user, score=-1)
|
39
|
+
if rating_by? user
|
40
|
+
:already
|
41
|
+
else
|
42
|
+
self.rating_by! user, score
|
43
|
+
:down
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# 用户进行打分
|
48
|
+
def rating_by!(user, score=1)
|
49
|
+
tmp_scope = self.user_rating_tracks(user)
|
50
|
+
|
51
|
+
tmp_scope.first || tmp_scope.create(
|
52
|
+
:score => score
|
53
|
+
)
|
54
|
+
|
55
|
+
_expire_rating_track_cache
|
56
|
+
end
|
57
|
+
|
58
|
+
# 取消打分
|
59
|
+
def undo_rating_by!(user)
|
60
|
+
self.user_rating_tracks(user).destroy_all
|
61
|
+
|
62
|
+
_expire_rating_track_cache
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def _expire_rating_track_cache
|
68
|
+
self.reload
|
69
|
+
self.touch
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module LoyalCore
|
3
|
+
module ActsAsSkinDishAble
|
4
|
+
def self.included base
|
5
|
+
base.class_eval do
|
6
|
+
extend ExtendMethods
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ExtendMethods
|
11
|
+
def loyal_core_acts_as_skin_dish_able *args
|
12
|
+
options = args.extract_options!
|
13
|
+
|
14
|
+
has_one :skin_dish, :class_name => '::LoyalCore::Skin::Dish', :as => :target
|
15
|
+
has_one :skin_recipe, :class_name => '::LoyalCore::Skin::Recipe',
|
16
|
+
:through => :skin_dish, :source => :recipe
|
17
|
+
|
18
|
+
attr_accessible :skin_recipe_id
|
19
|
+
|
20
|
+
define_method :skin_recipe_id do
|
21
|
+
@skin_recipe_id ||= self.skin_recipe.try(:id)
|
22
|
+
end
|
23
|
+
|
24
|
+
define_method :skin_recipe_id= do |recipe_id|
|
25
|
+
@skin_recipe_id ||= recipe_id
|
26
|
+
end
|
27
|
+
|
28
|
+
before_validation do |r|
|
29
|
+
r.skin_recipe = ::LoyalCore::Skin::Recipe.find_by_id(r.skin_recipe_id)
|
30
|
+
end
|
31
|
+
|
32
|
+
define_method :skin_recipe_html do |context|
|
33
|
+
html = ''
|
34
|
+
|
35
|
+
if self.skin_recipe
|
36
|
+
if self.skin_recipe.assets_path.present?
|
37
|
+
html << context.stylesheet_link_tag(self.skin_recipe.assets_path)
|
38
|
+
end
|
39
|
+
|
40
|
+
if self.skin_recipe.stylesheet_text.present?
|
41
|
+
html += <<-HTML
|
42
|
+
<style type='text/css'>
|
43
|
+
#{self.skin_recipe.stylesheet_text}
|
44
|
+
</style>
|
45
|
+
HTML
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
html
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module LoyalCore
|
3
|
+
module ActsAsTree
|
4
|
+
def self.included base
|
5
|
+
base.class_eval do
|
6
|
+
extend ClassMethods
|
7
|
+
include InstanceMethods
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def loyal_core_acts_as_tree options={}
|
13
|
+
attr_accessible :parent_id
|
14
|
+
|
15
|
+
acts_as_nested_set options.reverse_merge(
|
16
|
+
:parent_column => 'parent_id',
|
17
|
+
:left_column => 'left_id',
|
18
|
+
:right_column => 'right_id',
|
19
|
+
:depth_column => 'depth',
|
20
|
+
:dependent => :destroy, # or :destroy
|
21
|
+
:polymorphic => false,
|
22
|
+
:counter_cache => 'children_count'
|
23
|
+
)
|
24
|
+
|
25
|
+
scope :filter_by_root, -> do
|
26
|
+
where :parent_id => nil
|
27
|
+
end
|
28
|
+
|
29
|
+
include InstanceMethods
|
30
|
+
extend ExtendsMethods
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
module InstanceMethods
|
35
|
+
def children?
|
36
|
+
self.children_count > 0
|
37
|
+
end
|
38
|
+
|
39
|
+
# 祖先
|
40
|
+
def tree_ancestor_ids
|
41
|
+
self.ancestors.map(&:id).uniq.sort
|
42
|
+
end
|
43
|
+
|
44
|
+
def tree_self_and_ancestor_ids
|
45
|
+
self.self_and_ancestors.map(&:id).uniq.sort
|
46
|
+
end
|
47
|
+
|
48
|
+
# 同一个父母的孩子
|
49
|
+
def tree_sibling_ids
|
50
|
+
self.siblings.map(&:id).uniq.sort
|
51
|
+
end
|
52
|
+
|
53
|
+
def tree_self_and_siblings_ids
|
54
|
+
self.self_and_siblings_ids.map(&:id).uniq.sort
|
55
|
+
end
|
56
|
+
|
57
|
+
# 子孙后代
|
58
|
+
def tree_descendant_ids
|
59
|
+
self.descendants.map(&:id).uniq.sort
|
60
|
+
end
|
61
|
+
|
62
|
+
# 子孙后代 包括自己
|
63
|
+
def tree_self_and_descendant_ids
|
64
|
+
self.self_and_descendants.map(&:id).uniq.sort
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
module ExtendsMethods
|
69
|
+
def nested_set_options(class_or_item=nil, mover = nil)
|
70
|
+
class_or_item ||= self
|
71
|
+
|
72
|
+
if class_or_item.is_a? Array
|
73
|
+
items = class_or_item.reject { |e| !e.root? }
|
74
|
+
else
|
75
|
+
class_or_item = class_or_item.roots if class_or_item.respond_to?(:scoped)
|
76
|
+
items = Array(class_or_item)
|
77
|
+
end
|
78
|
+
|
79
|
+
result = []
|
80
|
+
|
81
|
+
items.each do |root|
|
82
|
+
result += root.class.associate_parents(root.self_and_descendants).map do |i|
|
83
|
+
if mover.nil? || mover.new_record? || mover.move_possible?(i)
|
84
|
+
[yield(i), i.id]
|
85
|
+
end
|
86
|
+
end.compact
|
87
|
+
end
|
88
|
+
|
89
|
+
result
|
90
|
+
end
|
91
|
+
|
92
|
+
def nested_set_select_options(class_or_item=nil, mover=nil, options={})
|
93
|
+
result = []
|
94
|
+
|
95
|
+
result << ['- - - -', nil] if options[:include_blank]
|
96
|
+
|
97
|
+
result += nested_set_options(class_or_item, mover) do |item|
|
98
|
+
"#{'- ' * item.level}#{item.name}"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
# usage:
|
3
|
+
# include LoyalCore::ActsAsUUIDFul
|
4
|
+
module LoyalCore
|
5
|
+
module ActsAsUUIDFul
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
extend ClassMethods
|
9
|
+
include InstanceMethods
|
10
|
+
|
11
|
+
after_initialize do |r|
|
12
|
+
r.impl_loyal_core_uuid_generate
|
13
|
+
end
|
14
|
+
|
15
|
+
validates_uniqueness_of :uuid
|
16
|
+
validates_presence_of :uuid
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
def uuid_rebuild!
|
22
|
+
self.all.each do |item|
|
23
|
+
item.impl_loyal_core_uuid_generate false
|
24
|
+
item.save
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module InstanceMethods
|
30
|
+
def impl_loyal_core_uuid_generate(force=false)
|
31
|
+
begin
|
32
|
+
self.uuid = ::SecureRandom.uuid if force || self.uuid.blank?
|
33
|
+
rescue
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module LoyalCore
|
3
|
+
module ActsAsViewsCountAble
|
4
|
+
def self.included base
|
5
|
+
base.class_eval do
|
6
|
+
extend ClassMethods
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
# 具备计数功能
|
12
|
+
# views_count
|
13
|
+
def loyal_core_acts_as_views_count_able *args
|
14
|
+
options = ::LoyalCore::ArrayUtil.extract_options!(args)
|
15
|
+
|
16
|
+
define_method :increment_views_count! do
|
17
|
+
Rails.logger.debug " -> loyal_core_acts_as_views_count_able: #{self.id} increment_views_count!"
|
18
|
+
self.increment(:views_count)
|
19
|
+
|
20
|
+
# 刷新更新时间
|
21
|
+
self.refresh_tiny_cache_updated_at
|
22
|
+
self.write_tiny_cache # 写入缓存
|
23
|
+
|
24
|
+
# 频率间隔, 默认为10次
|
25
|
+
if self.views_count % (options[:interval] || 10).to_i == 0
|
26
|
+
self.class.update_all({:views_count => self.views_count}, :id => self.id)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module LoyalCore
|
3
|
+
autoload :ActsAsBitAble, "#{File.dirname(__FILE__)}/acts/bit_able"
|
4
|
+
autoload :ActsAsTree, "#{File.dirname(__FILE__)}/acts/tree"
|
5
|
+
autoload :ActsAsHasAvatar, "#{File.dirname(__FILE__)}/acts/has_avatar"
|
6
|
+
autoload :ActsAsHasPermalink, "#{File.dirname(__FILE__)}/acts/has_permalink"
|
7
|
+
autoload :ActsAsContentModeAble, "#{File.dirname(__FILE__)}/acts/content_mode_able"
|
8
|
+
autoload :ActsAsContentDepartAble, "#{File.dirname(__FILE__)}/acts/content_depart_able"
|
9
|
+
|
10
|
+
autoload :ActsAsUUIDFul, "#{File.dirname(__FILE__)}/acts/uuid_ful"
|
11
|
+
autoload :ActsAsRatingTrackAble, "#{File.dirname(__FILE__)}/acts/rating_track_able"
|
12
|
+
autoload :ActsAsLikeTrackAble, "#{File.dirname(__FILE__)}/acts/like_track_able"
|
13
|
+
|
14
|
+
autoload :ActsAsViewsCountAble, "#{File.dirname(__FILE__)}/acts/views_count_able"
|
15
|
+
autoload :ActsAsNamedFilterAble, "#{File.dirname(__FILE__)}/acts/named_filter_able"
|
16
|
+
|
17
|
+
autoload :ActsAsSkinDishAble, "#{File.dirname(__FILE__)}/acts/skin_dish_able"
|
18
|
+
end
|
19
|
+
|
20
|
+
if defined?(ActiveRecord::Base)
|
21
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsBitAble
|
22
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsTree
|
23
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsHasAvatar
|
24
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsHasPermalink
|
25
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsContentModeAble
|
26
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsContentDepartAble
|
27
|
+
|
28
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsRatingTrackAble
|
29
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsLikeTrackAble
|
30
|
+
|
31
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsViewsCountAble
|
32
|
+
|
33
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsNamedFilterAble
|
34
|
+
::ActiveRecord::Base.send :include, ::LoyalCore::ActsAsSkinDishAble
|
35
|
+
end
|