homeland-site 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +22 -0
- data/Rakefile +36 -0
- data/app/assets/config/homeland_site_manifest.js +2 -0
- data/app/assets/javascripts/homeland/site/application.js +1 -0
- data/app/assets/stylesheets/homeland/site/application.css +4 -0
- data/app/controllers/homeland/site/admin/site_nodes_controller.rb +55 -0
- data/app/controllers/homeland/site/admin/sites_controller.rb +60 -0
- data/app/controllers/homeland/site/application_controller.rb +12 -0
- data/app/controllers/homeland/site/sites_controller.rb +27 -0
- data/app/helpers/homeland/site/application_helper.rb +6 -0
- data/app/models/homeland/site/ability.rb +36 -0
- data/app/models/site.rb +30 -0
- data/app/models/site_node.rb +15 -0
- data/app/views/homeland/site/admin/site_nodes/_base.html.erb +5 -0
- data/app/views/homeland/site/admin/site_nodes/_form.html.erb +16 -0
- data/app/views/homeland/site/admin/site_nodes/edit.html.erb +3 -0
- data/app/views/homeland/site/admin/site_nodes/index.html.erb +27 -0
- data/app/views/homeland/site/admin/site_nodes/new.html.erb +2 -0
- data/app/views/homeland/site/admin/sites/_base.html.erb +3 -0
- data/app/views/homeland/site/admin/sites/_form.html.erb +18 -0
- data/app/views/homeland/site/admin/sites/edit.html.erb +3 -0
- data/app/views/homeland/site/admin/sites/index.html.erb +51 -0
- data/app/views/homeland/site/sites/_form.html.erb +19 -0
- data/app/views/homeland/site/sites/index.html.erb +28 -0
- data/app/views/homeland/site/sites/new.html.erb +3 -0
- data/app/views/layouts/homeland/site/application.html.erb +14 -0
- data/config/locales/homeland.site.zh-CN.yml +19 -0
- data/config/routes.rb +11 -0
- data/db/migrate/20170321125706_create_sites.rb +33 -0
- data/lib/homeland/site/engine.rb +24 -0
- data/lib/homeland/site/version.rb +7 -0
- data/lib/homeland/site.rb +7 -0
- data/lib/tasks/homeland/site_tasks.rake +4 -0
- metadata +92 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 100a91cbb778fa30cadc54157f58511a8d20b84c
|
4
|
+
data.tar.gz: 07a77e480da5f4fd2e01e4508f37946fdedf135b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f9989b5528f168c9cd58452f4df42e828490fd4c9b82a0f71950f635406f587c7ecc8fadd2c97ed213303286e2d510e93dbc97faa5d1b8b4a21df0afe95e1e83
|
7
|
+
data.tar.gz: a4ba5e639645678e2f30237b044763c05838fb80533a1273004a1f44a8ba9d7372c7a432114cafd2d652f0e139b8623d3f1214380add60d5c2576980219253b2
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2017 Jason Lee
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Homeland::Site Plugin
|
2
|
+
---------------------
|
3
|
+
|
4
|
+
酷站插件 for Homeland.
|
5
|
+
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your Homeland's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'homeland-site'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
```bash
|
17
|
+
$ bundle
|
18
|
+
```
|
19
|
+
|
20
|
+
## License
|
21
|
+
|
22
|
+
[MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Homeland::Site'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
|
21
|
+
load 'rails/tasks/statistics.rake'
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
require 'bundler/gem_tasks'
|
26
|
+
|
27
|
+
require 'rake/testtask'
|
28
|
+
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
30
|
+
t.libs << 'test'
|
31
|
+
t.pattern = 'test/**/*_test.rb'
|
32
|
+
t.verbose = false
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
task default: :test
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Homeland::Site
|
2
|
+
module Admin
|
3
|
+
class SiteNodesController < ::Admin::ApplicationController
|
4
|
+
require_module_enabled! :site
|
5
|
+
before_action :set_site_node, only: [:show, :edit, :update, :destroy]
|
6
|
+
|
7
|
+
def index
|
8
|
+
@site_nodes = SiteNode.order(id: :desc).page(params[:page])
|
9
|
+
end
|
10
|
+
|
11
|
+
def show
|
12
|
+
end
|
13
|
+
|
14
|
+
def new
|
15
|
+
@site_node = SiteNode.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def edit
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
@site_node = SiteNode.new(site_node_params)
|
23
|
+
|
24
|
+
if @site_node.save
|
25
|
+
redirect_to(admin_site_nodes_path, notice: 'Site node 创建成功。')
|
26
|
+
else
|
27
|
+
render action: 'new'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def update
|
32
|
+
if @site_node.update(site_node_params)
|
33
|
+
redirect_to(admin_site_nodes_path, notice: 'Site node 更新成功。')
|
34
|
+
else
|
35
|
+
render action: 'edit'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def destroy
|
40
|
+
@site_node.destroy
|
41
|
+
redirect_to(admin_site_nodes_path, notice: '删除成功。')
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def site_node_params
|
47
|
+
params[:site_node].permit!
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_site_node
|
51
|
+
@site_node = SiteNode.find(params[:id])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Homeland::Site
|
2
|
+
module Admin
|
3
|
+
class SitesController < ::Admin::ApplicationController
|
4
|
+
require_module_enabled! :site
|
5
|
+
before_action :set_site, only: [:show, :edit, :update, :destroy, :undestroy]
|
6
|
+
|
7
|
+
def index
|
8
|
+
@sites = ::Site.unscoped.recent.includes(:user, :site_node)
|
9
|
+
if params[:q].present?
|
10
|
+
@sites = @sites.where('name LIKE ?', "%#{params[:q]}%")
|
11
|
+
end
|
12
|
+
@sites = @sites.page(params[:page])
|
13
|
+
end
|
14
|
+
|
15
|
+
def show
|
16
|
+
end
|
17
|
+
|
18
|
+
def new
|
19
|
+
@site = ::Site.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def edit
|
23
|
+
end
|
24
|
+
|
25
|
+
def create
|
26
|
+
@site = ::Site.new(params[:site].permit!)
|
27
|
+
|
28
|
+
if @site.save
|
29
|
+
redirect_to(admin_sites_path, notice: 'Site 创建成功。')
|
30
|
+
else
|
31
|
+
render action: 'new'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def update
|
36
|
+
if @site.update(params[:site].permit!)
|
37
|
+
redirect_to(admin_sites_path, notice: 'Site 更新成功。')
|
38
|
+
else
|
39
|
+
render action: 'edit'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy
|
44
|
+
@site.destroy
|
45
|
+
redirect_to(admin_sites_path, notice: "#{@site.name} 删除成功。")
|
46
|
+
end
|
47
|
+
|
48
|
+
def undestroy
|
49
|
+
@site.update_attribute(:deleted_at, nil)
|
50
|
+
redirect_to(admin_sites_path, notice: "#{@site.name} 已恢复。")
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def set_site
|
56
|
+
@site = ::Site.unscoped.find(params[:id])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Homeland::Site
|
2
|
+
class ApplicationController < ::ApplicationController
|
3
|
+
protect_from_forgery with: :exception
|
4
|
+
layout "homeland/site/application"
|
5
|
+
|
6
|
+
helper Homeland::Site::ApplicationHelper
|
7
|
+
|
8
|
+
def current_ability
|
9
|
+
@current_ability ||= Homeland::Site::Ability.new(current_user)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Homeland::Site
|
2
|
+
class SitesController < Homeland::Site::ApplicationController
|
3
|
+
def index
|
4
|
+
@site_nodes = SiteNode.all.order(sort: :desc)
|
5
|
+
end
|
6
|
+
|
7
|
+
def new
|
8
|
+
@site = ::Site.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def create
|
12
|
+
@site = ::Site.new(site_params)
|
13
|
+
@site.user_id = current_user.id
|
14
|
+
if @site.save
|
15
|
+
redirect_to(sites_path, notice: '提交成功。谢谢。')
|
16
|
+
else
|
17
|
+
render action: 'new'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def site_params
|
24
|
+
params.require(:site).permit(:name, :desc, :url, :favorite, :site_node_id)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Homeland::Site
|
2
|
+
class Ability
|
3
|
+
include CanCan::Ability
|
4
|
+
|
5
|
+
attr_reader :user
|
6
|
+
|
7
|
+
def initialize(u)
|
8
|
+
@user = u
|
9
|
+
if @user.blank?
|
10
|
+
roles_for_anonymous
|
11
|
+
elsif user.roles?(:site_editor)
|
12
|
+
can :create, Site
|
13
|
+
else
|
14
|
+
roles_for_anonymous
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
# 普通会员权限
|
21
|
+
def roles_for_site_editors
|
22
|
+
can :create, Site
|
23
|
+
basic_read_only
|
24
|
+
end
|
25
|
+
|
26
|
+
# 未登录用户权限
|
27
|
+
def roles_for_anonymous
|
28
|
+
cannot :manage, Site
|
29
|
+
basic_read_only
|
30
|
+
end
|
31
|
+
|
32
|
+
def basic_read_only
|
33
|
+
can :read, Site
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/app/models/site.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
class Site < ApplicationRecord
|
2
|
+
include SoftDelete
|
3
|
+
|
4
|
+
belongs_to :site_node
|
5
|
+
belongs_to :user
|
6
|
+
|
7
|
+
validates :url, :name, :site_node_id, presence: true
|
8
|
+
validates :url, uniqueness: true
|
9
|
+
|
10
|
+
after_save :update_cache_version
|
11
|
+
after_destroy :update_cache_version
|
12
|
+
def update_cache_version
|
13
|
+
# 记录节点变更时间,用于清除缓存
|
14
|
+
CacheVersion.sites_updated_at = Time.now.to_i
|
15
|
+
end
|
16
|
+
|
17
|
+
before_validation :fix_urls
|
18
|
+
def fix_urls
|
19
|
+
unless url.blank?
|
20
|
+
url = self.url.gsub(%r{http[s]{0,1}://}, '').split('/').join('/')
|
21
|
+
self.url = "http://#{url}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def favicon_url
|
26
|
+
return '' if url.blank?
|
27
|
+
domain = url.gsub('http://', '')
|
28
|
+
"https://favicon.b0.upaiyun.com/ip2/#{domain}.ico"
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class SiteNode < ApplicationRecord
|
2
|
+
second_level_cache expires_in: 2.weeks
|
3
|
+
|
4
|
+
has_many :sites
|
5
|
+
|
6
|
+
validates :name, presence: true, uniqueness: true
|
7
|
+
|
8
|
+
after_save :update_cache_version
|
9
|
+
after_destroy :update_cache_version
|
10
|
+
|
11
|
+
def update_cache_version
|
12
|
+
# 记录节点变更时间,用于清除缓存
|
13
|
+
CacheVersion.sites_updated_at = Time.now.to_i
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<div id="admin_site_node" class="form">
|
2
|
+
|
3
|
+
<%= simple_form_for([:admin, @site_node]) do |f| %>
|
4
|
+
<%= render "/shared/error_messages", target: @site_node %>
|
5
|
+
<fieldset>
|
6
|
+
<legend>编辑</legend>
|
7
|
+
<%= f.input :name %>
|
8
|
+
<%= f.input :sort %>
|
9
|
+
<div class="form-actions">
|
10
|
+
<%= f.submit '保存', class: "btn btn-primary", 'data-disable-with' => '保存中...' %>
|
11
|
+
or
|
12
|
+
<%= link_to '取消', admin_site_nodes_path %>
|
13
|
+
</div>
|
14
|
+
</fieldset>
|
15
|
+
<% end %>
|
16
|
+
</div>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<%= render 'base' %>
|
2
|
+
|
3
|
+
<div class="toolbar">
|
4
|
+
<a href="<%= new_admin_site_node_path %>" class="btn btn-small btn-success">新建</a>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<div id="admin_site_nodes">
|
8
|
+
<table class="table table-bordered table-striped table-condensed">
|
9
|
+
<tr class="head">
|
10
|
+
<td>#</td>
|
11
|
+
<td>名称</td>
|
12
|
+
<td>排序</td>
|
13
|
+
<td class="opts"></td>
|
14
|
+
</tr>
|
15
|
+
<% @site_nodes.each do |item| %>
|
16
|
+
<tr class="<%= cycle("", "even") %>">
|
17
|
+
<td><%= item.id %></td>
|
18
|
+
<td><%= item.name %></td>
|
19
|
+
<td><%= item.sort %></td>
|
20
|
+
<td>
|
21
|
+
<%= link_to "", edit_admin_site_node_path(item.id), class: "fa fa-pencil" %>
|
22
|
+
<%= link_to "", admin_site_node_path(item.id), method: :delete, 'data-confirm' => '确定要删除吗?', class: "fa fa-trash" %>
|
23
|
+
</td>
|
24
|
+
</tr>
|
25
|
+
<% end %>
|
26
|
+
</table>
|
27
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div id="admin_site" class="form">
|
2
|
+
|
3
|
+
<%= simple_form_for([:admin,@site]) do |f| %>
|
4
|
+
<%= render "/shared/error_messages", target: @site %>
|
5
|
+
<fieldset>
|
6
|
+
<legend><%= t("common.edit") %></legend>
|
7
|
+
<%= f.input :name %>
|
8
|
+
<%= f.input :url, input_html: { class: "xxlarge" }, placeholder: "http://" %>
|
9
|
+
<%= f.input :desc, as: :text, input_html: { class: "xxlarge", rows: "3" } %>
|
10
|
+
<%= f.input :site_node_id, collection: SiteNode.all.collect { |t| [t.name, t.id] }, include_blank: false %>
|
11
|
+
<div class="form-actions">
|
12
|
+
<%= f.submit '保存', class: "btn btn-primary", 'data-disable-with' => '保存中...' %>
|
13
|
+
or
|
14
|
+
<%= link_to '取消', admin_sites_path %>
|
15
|
+
</div>
|
16
|
+
</fieldset>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
@@ -0,0 +1,51 @@
|
|
1
|
+
<%= render 'base' %>
|
2
|
+
|
3
|
+
<div class="toolbar clearfix">
|
4
|
+
<form class="form-inline pull-left" action="<%= admin_sites_path %>">
|
5
|
+
<div class="form-group">
|
6
|
+
<input type="text" name="q" class="form-control" value="<%= params[:q] %>" placeholder="网站名称" />
|
7
|
+
</div>
|
8
|
+
<button class="btn btn-default">搜索</button>
|
9
|
+
</form>
|
10
|
+
|
11
|
+
<div class="pull-right">
|
12
|
+
<a href="<%= admin_site_nodes_path %>" class="btn btn-default">分类管理...</a>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div id="admin_sites">
|
17
|
+
<table class="table table-bordered table-striped table-condensed">
|
18
|
+
<tr class="head">
|
19
|
+
<td style="width:40px;">编号</td>
|
20
|
+
<td style="width:140px;">网站</td>
|
21
|
+
<td>信息</td>
|
22
|
+
<td>提交人</td>
|
23
|
+
<td style="width:100px">节点</td>
|
24
|
+
<td style="width:105px">时间</td>
|
25
|
+
<td style="width:30px" class="opts"></td>
|
26
|
+
</tr>
|
27
|
+
<% @sites.each do |item| %>
|
28
|
+
<tr class="<%= cycle("","even") %><%= ' deleted' if !item.deleted_at.blank? %>">
|
29
|
+
<td><%= item.id %></td>
|
30
|
+
<td><%= image_tag(item.favicon_url, style: "width:16px;height:16px;")%> <%= item.name %></td>
|
31
|
+
<td>
|
32
|
+
<%= link_to item.url,item.url, target: "_blank" %><br />
|
33
|
+
<small class="muted"><%= item.desc %></small>
|
34
|
+
</td>
|
35
|
+
<td><%= user_name_tag(item.user) %></td>
|
36
|
+
<td><%= item.site_node.name if !item.site_node.blank? %></td>
|
37
|
+
<td><%= l(item.created_at, format: :short) %></td>
|
38
|
+
<td>
|
39
|
+
<%= link_to "", edit_admin_site_path(item.id), class: "fa fa-pencil" %>
|
40
|
+
<% if item.deleted? %>
|
41
|
+
<%= link_to "", undestroy_admin_site_path(item.id), method: :post, 'data-confirm' => '确定要恢复么?', class: "fa fa-undo" %>
|
42
|
+
<% else %>
|
43
|
+
<%= link_to "", admin_site_path(item.id), method: :delete, 'data-confirm' => '确定要删除吗?', class: "fa fa-trash" %>
|
44
|
+
<% end %>
|
45
|
+
</td>
|
46
|
+
</tr>
|
47
|
+
<% end %>
|
48
|
+
</table>
|
49
|
+
<%= paginate @sites %>
|
50
|
+
</div>
|
51
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<div id="site" class="panel panel-default">
|
2
|
+
<div class="panel-heading">提交酷站</div>
|
3
|
+
<div class="panel-body">
|
4
|
+
<%= simple_form_for(@site) do |f| %>
|
5
|
+
<%= render "/shared/error_messages", target: @site %>
|
6
|
+
<%= f.input :site_node_id, collection: SiteNode.all.collect { |t| [t.name, t.id] }, include_blank: false %>
|
7
|
+
|
8
|
+
<%= f.input :name %>
|
9
|
+
<%= f.input :url, input_html: { class: "xxlarge" }, placeholder: "http://" %>
|
10
|
+
<%= f.input :desc, as: :text, input_html: { class: "xxlarge", rows: "3" } %>
|
11
|
+
|
12
|
+
<div class="form-group">
|
13
|
+
<%= f.submit '提交', class: "btn btn-primary", 'data-disable-with' => '提交中...' %>
|
14
|
+
or
|
15
|
+
<%= link_to '取消', sites_path %>
|
16
|
+
</div>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
</div>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<% title_tag t('plugin.site') %>
|
2
|
+
|
3
|
+
<div id="site_nodes">
|
4
|
+
<% if can? :create, Site %>
|
5
|
+
<div class="panel panel-default">
|
6
|
+
<div class="panel-body">
|
7
|
+
<%= raw Setting.site_index_html %>
|
8
|
+
<%= link_to('创建', new_site_path, class: "btn btn-success")%>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<% cache(["plugin/sites", t: CacheVersion.sites_updated_at, d: Date.today]) do %>
|
14
|
+
<% @site_nodes.each do |node| %>
|
15
|
+
<div class="panel panel-default">
|
16
|
+
<div class="panel-heading"><%= node.name %></div>
|
17
|
+
<div class="panel-body row">
|
18
|
+
<% node.sites.each do |item| %>
|
19
|
+
<div class="col-md-2 site">
|
20
|
+
<%= image_tag(item.favicon_url, class: "favicon", style: "width: 16px; height: 16px;")%>
|
21
|
+
<%= link_to item.name, item.url, target: "_blank", rel: "twipsy", title: item.desc %>
|
22
|
+
</div>
|
23
|
+
<% end %>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
<% end %>
|
27
|
+
<% end %>
|
28
|
+
</div>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% content_for :stylesheets do %>
|
2
|
+
<%= stylesheet_link_tag "homeland/site/application", media: "all" %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_for :javascripts do %>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<% content_for :main do %>
|
9
|
+
<div id="homeland-site">
|
10
|
+
<%= yield %>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<%= render template: "/layouts/application" %>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
"zh-CN":
|
2
|
+
plugin:
|
3
|
+
site: 酷站
|
4
|
+
simple_form:
|
5
|
+
hints:
|
6
|
+
site:
|
7
|
+
desc: '100字左右的介绍'
|
8
|
+
url: "别忘了要写 http:// 哦!"
|
9
|
+
favicon: '此网站的 Favicon,不填将会用 Google 来分析此网站的图标.'
|
10
|
+
activerecord:
|
11
|
+
models:
|
12
|
+
site: 酷站
|
13
|
+
site_node: 酷站分类
|
14
|
+
attributes:
|
15
|
+
site:
|
16
|
+
name: 网站名称
|
17
|
+
url: 地址
|
18
|
+
desc: 简单介绍
|
19
|
+
site_node_id: 分类
|
data/config/routes.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
class CreateSites < ActiveRecord::Migration[5.0]
|
2
|
+
def up
|
3
|
+
return if ActiveRecord::Base.connection.table_exists? :sites
|
4
|
+
|
5
|
+
create_table 'site_nodes', force: :cascade do |t|
|
6
|
+
t.string 'name', null: false
|
7
|
+
t.integer 'sort', default: 0, null: false
|
8
|
+
t.datetime 'created_at'
|
9
|
+
t.datetime 'updated_at'
|
10
|
+
end
|
11
|
+
|
12
|
+
add_index 'site_nodes', ['sort'], name: 'index_site_nodes_on_sort', using: :btree
|
13
|
+
|
14
|
+
create_table 'sites', force: :cascade do |t|
|
15
|
+
t.integer 'user_id'
|
16
|
+
t.integer 'site_node_id'
|
17
|
+
t.string 'name', null: false
|
18
|
+
t.string 'url', null: false
|
19
|
+
t.string 'desc'
|
20
|
+
t.datetime 'deleted_at'
|
21
|
+
t.datetime 'created_at'
|
22
|
+
t.datetime 'updated_at'
|
23
|
+
end
|
24
|
+
|
25
|
+
add_index 'sites', ['site_node_id'], name: 'index_sites_on_site_node_id', using: :btree
|
26
|
+
add_index 'sites', ['url'], name: 'index_sites_on_url', using: :btree
|
27
|
+
end
|
28
|
+
|
29
|
+
def down
|
30
|
+
drop_table :sites, if_exists: true
|
31
|
+
drop_table :site_nodes, if_exists: true
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Homeland::Site
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
isolate_namespace Homeland::Site
|
4
|
+
|
5
|
+
initializer 'homeland.site.init' do |app|
|
6
|
+
next unless Setting.has_module?(:site)
|
7
|
+
Homeland.register_plugin do |plugin|
|
8
|
+
plugin.name = Homeland::Site::NAME
|
9
|
+
plugin.display_name = '酷站'
|
10
|
+
plugin.version = Homeland::Site::VERSION
|
11
|
+
plugin.description = Homeland::Site::DESCRIPTION
|
12
|
+
plugin.navbar_link = true
|
13
|
+
plugin.admin_navbar_link = true
|
14
|
+
plugin.root_path = "/sites"
|
15
|
+
plugin.admin_path = "/admin/sites"
|
16
|
+
end
|
17
|
+
|
18
|
+
app.routes.prepend do
|
19
|
+
mount Homeland::Site::Engine => '/'
|
20
|
+
end
|
21
|
+
app.config.paths["db/migrate"].concat(config.paths["db/migrate"].expanded)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: homeland-site
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jason Lee
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5'
|
27
|
+
description: Site for Homeland.
|
28
|
+
email:
|
29
|
+
- huacnlee@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- MIT-LICENSE
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- app/assets/config/homeland_site_manifest.js
|
38
|
+
- app/assets/javascripts/homeland/site/application.js
|
39
|
+
- app/assets/stylesheets/homeland/site/application.css
|
40
|
+
- app/controllers/homeland/site/admin/site_nodes_controller.rb
|
41
|
+
- app/controllers/homeland/site/admin/sites_controller.rb
|
42
|
+
- app/controllers/homeland/site/application_controller.rb
|
43
|
+
- app/controllers/homeland/site/sites_controller.rb
|
44
|
+
- app/helpers/homeland/site/application_helper.rb
|
45
|
+
- app/models/homeland/site/ability.rb
|
46
|
+
- app/models/site.rb
|
47
|
+
- app/models/site_node.rb
|
48
|
+
- app/views/homeland/site/admin/site_nodes/_base.html.erb
|
49
|
+
- app/views/homeland/site/admin/site_nodes/_form.html.erb
|
50
|
+
- app/views/homeland/site/admin/site_nodes/edit.html.erb
|
51
|
+
- app/views/homeland/site/admin/site_nodes/index.html.erb
|
52
|
+
- app/views/homeland/site/admin/site_nodes/new.html.erb
|
53
|
+
- app/views/homeland/site/admin/sites/_base.html.erb
|
54
|
+
- app/views/homeland/site/admin/sites/_form.html.erb
|
55
|
+
- app/views/homeland/site/admin/sites/edit.html.erb
|
56
|
+
- app/views/homeland/site/admin/sites/index.html.erb
|
57
|
+
- app/views/homeland/site/sites/_form.html.erb
|
58
|
+
- app/views/homeland/site/sites/index.html.erb
|
59
|
+
- app/views/homeland/site/sites/new.html.erb
|
60
|
+
- app/views/layouts/homeland/site/application.html.erb
|
61
|
+
- config/locales/homeland.site.zh-CN.yml
|
62
|
+
- config/routes.rb
|
63
|
+
- db/migrate/20170321125706_create_sites.rb
|
64
|
+
- lib/homeland/site.rb
|
65
|
+
- lib/homeland/site/engine.rb
|
66
|
+
- lib/homeland/site/version.rb
|
67
|
+
- lib/tasks/homeland/site_tasks.rake
|
68
|
+
homepage: https://github.com/ruby-china/homeland-site
|
69
|
+
licenses:
|
70
|
+
- MIT
|
71
|
+
metadata: {}
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
requirements: []
|
87
|
+
rubyforge_project:
|
88
|
+
rubygems_version: 2.6.11
|
89
|
+
signing_key:
|
90
|
+
specification_version: 4
|
91
|
+
summary: Site plugin for Homeland
|
92
|
+
test_files: []
|