blacksand 2.2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +27 -0
  4. data/app/assets/javascripts/blacksand/dashboard/navigations.form.js.erb +34 -0
  5. data/app/assets/javascripts/blacksand/dashboard/navigations.index.js +18 -0
  6. data/app/assets/javascripts/blacksand/dashboard/pages.form.js.erb +69 -0
  7. data/app/assets/javascripts/blacksand/dashboard/pages.index.js +17 -0
  8. data/app/assets/javascripts/blacksand/dashboard.js +14 -0
  9. data/app/assets/javascripts/blacksand/ie.js +2 -0
  10. data/app/assets/javascripts/bootstrap-datepicker.zh-CN.js +20 -0
  11. data/app/assets/stylesheets/blacksand/dashboard.scss +26 -0
  12. data/app/controllers/blacksand/dashboard/base_controller.rb +35 -0
  13. data/app/controllers/blacksand/dashboard/navigations_controller.rb +88 -0
  14. data/app/controllers/blacksand/dashboard/pages_controller.rb +176 -0
  15. data/app/controllers/blacksand/dashboard/prototypes_controller.rb +12 -0
  16. data/app/controllers/blacksand/dashboard/templates_controller.rb +8 -0
  17. data/app/controllers/blacksand/dashboard/users_controller.rb +78 -0
  18. data/app/controllers/blacksand_front/pages_controller.rb +17 -0
  19. data/app/helpers/blacksand/application_helper.rb +42 -0
  20. data/app/helpers/blacksand/page_helper.rb +11 -0
  21. data/app/helpers/blacksand_front/pages_helper.rb +20 -0
  22. data/app/models/blacksand/field.rb +35 -0
  23. data/app/models/blacksand/navigation.rb +24 -0
  24. data/app/models/blacksand/page.rb +194 -0
  25. data/app/models/blacksand/picture.rb +7 -0
  26. data/app/models/blacksand/property/as_array.rb +5 -0
  27. data/app/models/blacksand/property/file.rb +5 -0
  28. data/app/models/blacksand/property/gallery.rb +7 -0
  29. data/app/models/blacksand/property/slide.rb +5 -0
  30. data/app/models/blacksand/property.rb +76 -0
  31. data/app/models/blacksand/prototype.rb +11 -0
  32. data/app/models/blacksand/template.rb +9 -0
  33. data/app/models/kindeditor/asset.rb +14 -0
  34. data/app/models/kindeditor/file.rb +3 -0
  35. data/app/models/kindeditor/flash.rb +3 -0
  36. data/app/models/kindeditor/image.rb +3 -0
  37. data/app/models/kindeditor/media.rb +3 -0
  38. data/app/uploaders/blacksand/base_uploader.rb +16 -0
  39. data/app/uploaders/blacksand/file_uploader.rb +4 -0
  40. data/app/uploaders/blacksand/image_uploader.rb +78 -0
  41. data/app/uploaders/blacksand/slide_image_uploader.rb +66 -0
  42. data/app/views/blacksand/dashboard/navigations/_form.html.erb +23 -0
  43. data/app/views/blacksand/dashboard/navigations/edit.html.erb +3 -0
  44. data/app/views/blacksand/dashboard/navigations/index.html.erb +40 -0
  45. data/app/views/blacksand/dashboard/navigations/index.json.jbuilder +4 -0
  46. data/app/views/blacksand/dashboard/navigations/new.html.erb +3 -0
  47. data/app/views/blacksand/dashboard/navigations/reorder.js.erb +1 -0
  48. data/app/views/blacksand/dashboard/navigations/show.html.erb +4 -0
  49. data/app/views/blacksand/dashboard/navigations/show.json.jbuilder +1 -0
  50. data/app/views/blacksand/dashboard/pages/_fields.html.erb +89 -0
  51. data/app/views/blacksand/dashboard/pages/_form.html.erb +26 -0
  52. data/app/views/blacksand/dashboard/pages/_manage_list.html.erb +123 -0
  53. data/app/views/blacksand/dashboard/pages/_picture_fields.html.erb +18 -0
  54. data/app/views/blacksand/dashboard/pages/children_partial.js.erb +14 -0
  55. data/app/views/blacksand/dashboard/pages/edit.html.erb +20 -0
  56. data/app/views/blacksand/dashboard/pages/index.html.erb +27 -0
  57. data/app/views/blacksand/dashboard/pages/new.html.erb +20 -0
  58. data/app/views/blacksand/dashboard/pages/onchange_render.js.erb +14 -0
  59. data/app/views/blacksand/dashboard/pages/search.json.jbuilder +7 -0
  60. data/app/views/blacksand/dashboard/pages/show.html.erb +34 -0
  61. data/app/views/blacksand/dashboard/prototypes/index.html.erb +15 -0
  62. data/app/views/blacksand/dashboard/prototypes/show.html.erb +31 -0
  63. data/app/views/blacksand/dashboard/templates/index.html.erb +17 -0
  64. data/app/views/blacksand/dashboard/users/_form.html.erb +40 -0
  65. data/app/views/blacksand/dashboard/users/edit.html.erb +47 -0
  66. data/app/views/blacksand/dashboard/users/index.html.erb +37 -0
  67. data/app/views/blacksand/dashboard/users/index.json.jbuilder +4 -0
  68. data/app/views/blacksand/dashboard/users/new.html.erb +4 -0
  69. data/app/views/blacksand/dashboard/users/show.html.erb +2 -0
  70. data/app/views/blacksand/dashboard/users/show.json.jbuilder +1 -0
  71. data/app/views/layouts/blacksand/_navbar.html.erb +42 -0
  72. data/app/views/layouts/blacksand/dashboard.html.erb +33 -0
  73. data/config/locales/kaminari.zh-CN.yml +17 -0
  74. data/config/locales/nestable.zh-CN.yml +14 -0
  75. data/config/locales/zh-CN.yml +69 -0
  76. data/config/routes.rb +31 -0
  77. data/db/migrate/20151112055035_create_templates.rb +10 -0
  78. data/db/migrate/20151112055425_create_prototypes.rb +9 -0
  79. data/db/migrate/20151112055438_create_fields.rb +14 -0
  80. data/db/migrate/20151112055821_create_pages.rb +15 -0
  81. data/db/migrate/20151112060015_create_properties.rb +15 -0
  82. data/db/migrate/20151112060605_create_navigations.rb +13 -0
  83. data/db/migrate/20151209022305_create_kindeditor_assets.rb +17 -0
  84. data/db/migrate/20160513080702_create_pictures.rb +12 -0
  85. data/db/migrate/20170104014706_add_values_to_properties.rb +5 -0
  86. data/db/migrate/20170310092041_add_owner_type_to_kindeditor_asset.rb +5 -0
  87. data/db/migrate/20170322021913_add_options_to_template_and_prototype.rb +6 -0
  88. data/lib/blacksand/caching_pages.rb +16 -0
  89. data/lib/blacksand/cancancan.rb +19 -0
  90. data/lib/blacksand/controller_helper.rb +21 -0
  91. data/lib/blacksand/engine.rb +69 -0
  92. data/lib/blacksand/expire_pages.rb +21 -0
  93. data/lib/blacksand/my_json_type.rb +61 -0
  94. data/lib/blacksand/routing.rb +11 -0
  95. data/lib/blacksand/version.rb +3 -0
  96. data/lib/blacksand.rb +53 -0
  97. data/lib/generators/blacksand/install_generator.rb +30 -0
  98. data/lib/generators/blacksand/new_site_generator.rb +28 -0
  99. data/lib/tasks/blacksand_tasks.rake +72 -0
  100. data/lib/tasks/carrierwave_storage_migrate_to_qiniu.rake +25 -0
  101. metadata +541 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 85cea919a0385fa796cd17228e35f52c161c26d3
4
+ data.tar.gz: b1ccce8a35f8f38e7bec370076514114039c0bf7
5
+ SHA512:
6
+ metadata.gz: 4d5b6c433265729b8c4cfb79ca62bf7ae82ea49c0ae5f9dc74fd31a50132c8e08d6cd5c57a4d2df38da8070fb9e63b4e434ce1c3fb876df5fb76b051b4e87048
7
+ data.tar.gz: 9ef5b174ade89dae9315047d766b8df215e4eb91701922f1f99be49af6dcf98cbadcc516310de33a04ea8e92b292bc5d1725e70258f0ca6970e839022e6610c6
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2016 bastengao
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/Rakefile ADDED
@@ -0,0 +1,27 @@
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 = 'Blacksand'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
19
+ load 'rails/tasks/engine.rake'
20
+
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+
24
+
25
+ require 'bundler/gem_tasks'
26
+ # Bundler::GemHelper.install_tasks
27
+
@@ -0,0 +1,34 @@
1
+ $(function(){
2
+ if($('#navigations-new, #navigations-edit').length <= 0){
3
+ return;
4
+ }
5
+
6
+ $('#navigation_page_id').select2({
7
+ language: 'zh-CN',
8
+ placeholder: '无',
9
+ allowClear: true,
10
+ ajax: {
11
+ url: '<%= Blacksand::Engine.routes.url_helpers.search_pages_path(format: :json) %>',
12
+ dataType: 'json',
13
+ delay: 250,
14
+ data: function (params) {
15
+ return {
16
+ 'q[title_cont]': params.term, // search term
17
+ page: params.page
18
+ };
19
+ },
20
+ processResults: function (data, params) {
21
+ params.page = params.page || 1;
22
+
23
+ return {
24
+ results: data.pages,
25
+ pagination: {
26
+ more: params.page < data.total_pages
27
+ }
28
+ };
29
+ },
30
+ cache: false
31
+ },
32
+ minimumInputLength: 1
33
+ });
34
+ });
@@ -0,0 +1,18 @@
1
+ $(function(){
2
+ if($('#navigations-index').length <= 0){
3
+ return;
4
+ }
5
+
6
+ dragula([$('#nav-table tbody')[0]]).on('drop', function(){
7
+ console.log('drop')
8
+
9
+ // 保存顺序
10
+ var newOrders = $('#nav-table tbody').children().map(function(){
11
+ return $(this).data('navigation-id')
12
+ })
13
+ .get();
14
+
15
+ var update_url = $('#nav-table tbody').data('update-url');
16
+ $.post(update_url, {navigations: newOrders})
17
+ });
18
+ });
@@ -0,0 +1,69 @@
1
+ $(function(){
2
+ if($('#pages-new, #pages-edit').length <= 0){
3
+ return;
4
+ }
5
+
6
+ function initSelect2() {
7
+ $('#page_parent_id, select[data-provide="page-select2"]').select2({
8
+ language: 'zh-CN',
9
+ placeholder: '无',
10
+ allowClear: true,
11
+ ajax: {
12
+ url: '<%= Blacksand::Engine.routes.url_helpers.search_pages_path(format: :json) %>',
13
+ dataType: 'json',
14
+ delay: 250,
15
+ data: function (params) {
16
+ return {
17
+ 'q[title_cont]': params.term, // search term
18
+ page: params.page
19
+ };
20
+ },
21
+ processResults: function (data, params) {
22
+ params.page = params.page || 1;
23
+
24
+ return {
25
+ results: data.pages,
26
+ pagination: {
27
+ more: params.page < data.total_pages
28
+ }
29
+ };
30
+ },
31
+ cache: false
32
+ },
33
+ minimumInputLength: 1
34
+ });
35
+ };
36
+
37
+ // 暴露给 onchange_render.js.erb
38
+ window.initSelect2 = initSelect2;
39
+
40
+ initSelect2();
41
+
42
+
43
+ // add text input for array property
44
+
45
+ $('body').on('click', '.add-item-button', function(){
46
+ var childIndex = $(this).data('childIndex');
47
+ var inputName = 'page[properties_attributes][' + childIndex + '][values][]';
48
+ var newItem =
49
+ "<div class='form-group'>" +
50
+ "<div class='col-sm-offset-2 col-sm-8'>" +
51
+ "<input type='text' name='" + inputName + "' class='form-control'>" +
52
+ "</div>" +
53
+ "<div class='col-sm-2'>" +
54
+ "<a class='btn btn-link btn-default btn-sm up-item-button'>上移</a>" +
55
+ "<a class='btn btn-link btn-default btn-sm remove-item-button'>删除</a>" +
56
+ "</div>" +
57
+ "</div>";
58
+ $(this).parents('.add-item').before(newItem);
59
+ })
60
+
61
+ $('body').on('click', '.remove-item-button', function(){
62
+ $(this).parents('.array-item').remove();
63
+ })
64
+
65
+ $('body').on('click', '.up-item-button', function(){
66
+ var $item = $(this).parents('.array-item');
67
+ $item.prev('.array-item').before($item);
68
+ })
69
+ });
@@ -0,0 +1,17 @@
1
+ $(function(){
2
+ if($('#pages-index').length <= 0){
3
+ return;
4
+ }
5
+
6
+ var $tree = $('#manage_menu').treeview({
7
+ data: gon.pages,
8
+ onNodeSelected: function(event, data) {
9
+ $.get(data["href"]);
10
+ }
11
+ });
12
+
13
+ var nodes = $tree.treeview('getSelected');
14
+ // 默认 data 里的选中不会触发 selected event, 所以取消选中,再选中一次
15
+ $tree.treeview('unselectNode', [nodes]);
16
+ $tree.treeview('selectNode', [nodes]);
17
+ });
@@ -0,0 +1,14 @@
1
+ //= require jquery
2
+ //= require jquery_ujs
3
+ //= require bootstrap
4
+ //= require bootstrap-datepicker
5
+ //= require bootstrap-datepicker.zh-CN
6
+ //= require bootstrap-treeview
7
+ //= require dragula
8
+ //= require multiselect
9
+ //= require kindeditor
10
+ //= require select2
11
+ //= require select2/i18n/zh-CN
12
+ //= require cocoon
13
+
14
+ //= require_tree ./dashboard
@@ -0,0 +1,2 @@
1
+ //= require html5shiv
2
+ //= require respond
@@ -0,0 +1,20 @@
1
+ // see: https://github.com/eternicode/bootstrap-datepicker/blob/master/js/locales/bootstrap-datepicker.zh-CN.js
2
+
3
+ /**
4
+ * Simplified Chinese translation for bootstrap-datepicker
5
+ * Yuan Cheung <advanimal@gmail.com>
6
+ */
7
+ ;(function($){
8
+ $.fn.datepicker.dates['zh-CN'] = {
9
+ days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
10
+ daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
11
+ daysMin: ["日", "一", "二", "三", "四", "五", "六"],
12
+ months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
13
+ monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
14
+ today: "今日",
15
+ clear: "清除",
16
+ format: "yyyy年mm月dd日",
17
+ titleFormat: "yyyy年mm月",
18
+ weekStart: 1
19
+ };
20
+ }(jQuery));
@@ -0,0 +1,26 @@
1
+ // bootstrap
2
+ $grid-gutter-width: 30px !default;
3
+ $container-large-desktop: (940px + $grid-gutter-width) !default;
4
+
5
+ @import "bootstrap-sprockets";
6
+ @import "bootstrap";
7
+ @import "font-awesome";
8
+ @import "util.css/util";
9
+
10
+ @import "bootstrap-datepicker";
11
+ @import "dragula/dragula";
12
+ @import "multiselect";
13
+ @import "select2";
14
+
15
+ #navbar {
16
+ border-radius: 0;
17
+ }
18
+
19
+ label.required:before {
20
+ content:"* ";
21
+ color: red;
22
+ }
23
+
24
+ #modal-list li:hover {
25
+ cursor: move;
26
+ }
@@ -0,0 +1,35 @@
1
+ module Blacksand
2
+ class Dashboard::BaseController < ActionController::Base
3
+ layout 'blacksand/dashboard'
4
+
5
+ before_action :_authenticate!
6
+ before_action :_authorize!
7
+
8
+ helper_method :_current_user
9
+ helper_method :visible?
10
+
11
+ attr_reader :authorization_adapter
12
+
13
+ private
14
+ def _authenticate!
15
+ instance_eval(&Blacksand.authenticate_with)
16
+ end
17
+
18
+ def _authorize!
19
+ instance_eval(&Blacksand.authorize_with)
20
+ end
21
+
22
+ def _current_user
23
+ instance_eval(&Blacksand.current_user_method)
24
+ end
25
+
26
+ def visible?(action, object)
27
+ # 如果启用了授权
28
+ if self.authorization_adapter
29
+ return self.authorization_adapter.authorized?(action, object)
30
+ end
31
+
32
+ true
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,88 @@
1
+ module Blacksand
2
+ class Dashboard::NavigationsController < Dashboard::BaseController
3
+ before_action :set_navigation, only: [:show, :edit, :update, :destroy]
4
+
5
+ # GET /navigations
6
+ # GET /navigations.json
7
+ def index
8
+ @navigations = Navigation.order(:position)
9
+ end
10
+
11
+ def reorder
12
+ navigations = params[:navigations]
13
+ navigations.each_with_index do |id, index|
14
+ Navigation.update(id, {position: index})
15
+ end
16
+
17
+ respond_to do |format|
18
+ format.json { render json: {success: true} }
19
+ format.js { flash.now.notice = '保存成功' }
20
+ end
21
+ end
22
+
23
+ # GET /navigations/1
24
+ # GET /navigations/1.json
25
+ def show
26
+ end
27
+
28
+ # GET /navigations/new
29
+ def new
30
+ @navigation = Navigation.new
31
+ end
32
+
33
+ # GET /navigations/1/edit
34
+ def edit
35
+ end
36
+
37
+ # POST /navigations
38
+ # POST /navigations.json
39
+ def create
40
+ @navigation = Navigation.new(navigation_params)
41
+
42
+ respond_to do |format|
43
+ if @navigation.save
44
+ format.html { redirect_to navigations_url, notice: 'Navigation was successfully created.' }
45
+ format.json { render :show, status: :created, location: [:dashboard, @navigation] }
46
+ else
47
+ format.html { render :new }
48
+ format.json { render json: @navigation.errors, status: :unprocessable_entity }
49
+ end
50
+ end
51
+ end
52
+
53
+ # PATCH/PUT /navigations/1
54
+ # PATCH/PUT /navigations/1.json
55
+ def update
56
+ respond_to do |format|
57
+ if @navigation.update(navigation_params)
58
+ format.html { redirect_to navigations_url, notice: 'Navigation was successfully updated.' }
59
+ format.json { render :show, status: :ok, location: @navigation }
60
+ else
61
+ format.html { render :edit }
62
+ format.json { render json: @navigation.errors, status: :unprocessable_entity }
63
+ end
64
+ end
65
+ end
66
+
67
+ # DELETE /navigations/1
68
+ # DELETE /navigations/1.json
69
+ def destroy
70
+ @navigation.destroy
71
+ respond_to do |format|
72
+ format.html { redirect_to navigations_url, notice: 'Navigation was successfully destroyed.' }
73
+ format.json { head :no_content }
74
+ end
75
+ end
76
+
77
+ private
78
+ # Use callbacks to share common setup or constraints between actions.
79
+ def set_navigation
80
+ @navigation = Navigation.find(params[:id])
81
+ end
82
+
83
+ # Never trust parameters from the scary internet, only allow the white list through.
84
+ def navigation_params
85
+ params.require(:navigation).permit(:name, :url, :page_id, :position, :position, options: [ :hover_submenus, :link_sub_page ])
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,176 @@
1
+ module Blacksand
2
+ class Dashboard::PagesController < Dashboard::BaseController
3
+ before_action :set_page, only: [:show, :edit, :update, :destroy, :onchange_edit, :get_prototype_id]
4
+ before_action :set_select, only: [:new, :edit, :onchange_new, :onchange_edit, :create, :update]
5
+
6
+ def default
7
+ redirect_to pages_url
8
+ end
9
+
10
+ def index
11
+ @page = Page.where(id: params[:parent_id]).first
12
+ @parent_id = params[:parent_id] || 0
13
+ @all_children = Page.where(parent_id: nil).order(:position)
14
+ @pages = @all_children.page(params[:page])
15
+
16
+ # 编辑只能看到自己负责的板块
17
+ tree_nodes = if false && current_user.role == 'editor'
18
+ Page.tree_nodes(current_user.page_ids)
19
+ else
20
+ Page.tree_nodes
21
+ end
22
+
23
+ gon.pages = [{
24
+ text: '网站',
25
+ href: children_partial_pages_path(parent_id: nil),
26
+ page_id: 0,
27
+ nodes: tree_nodes,
28
+ }]
29
+
30
+ # 选中父页面
31
+ Page.selectNode(gon.pages, @parent_id.to_i)
32
+ end
33
+
34
+ def search
35
+ # TODO: 查询排除自己
36
+ @q = Page.ransack(params[:q])
37
+ @pages = @q.result.page(params[:page])
38
+ end
39
+
40
+ def children_partial
41
+ @page = Page.where(id: params[:parent_id]).first
42
+ @parent_id = params[:parent_id]
43
+ @parent_page = Page.find(params[:parent_id]) if params[:parent_id]
44
+ @q = Page.includes(:template, :prototype).where(parent_id: params[:parent_id]).order(:position, created_at: :desc).ransack(params[:q])
45
+ @all_children = @q.result
46
+ @pages = @all_children.page(params[:page])
47
+ end
48
+
49
+ def show
50
+ end
51
+
52
+ def new
53
+ @page = Page.new
54
+ if params["parent_id"].present?
55
+ @parent_id = params[:parent_id]
56
+ parent_page = Page.find @parent_id
57
+ @page.parent_id = params["parent_id"]
58
+
59
+ # Set default template
60
+ if parent_page.preferred_child_template_name
61
+ @page.template = Template.find_by(name: parent_page.preferred_child_template_name)
62
+ end
63
+
64
+ # Set default prototype
65
+ if parent_page.preferred_child_prototype_name
66
+ prototype = Prototype.find_by(name: parent_page.preferred_child_prototype_name)
67
+ @page.prototype = prototype
68
+ prototype.fields.each do |field|
69
+ Property.build_property(@page, field)
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ def edit
76
+ if !@page.properties.present? && @page.prototype.present?
77
+ @page.build_properties
78
+ end
79
+ end
80
+
81
+ def onchange_new
82
+ @page = Page.new
83
+
84
+ if params["parent_id"].present?
85
+ @page.parent_id = params["parent_id"]
86
+ end
87
+
88
+ if params[:prototype_id].present?
89
+ @page.prototype_id = params[:prototype_id]
90
+ Prototype.find(params[:prototype_id]).fields.each do |field|
91
+ Property.build_property(@page, field)
92
+ end
93
+ end
94
+ render 'onchange_render'
95
+ end
96
+
97
+ def onchange_edit
98
+ @page.properties.destroy_all
99
+ if params[:prototype_id].present?
100
+ @page.prototype_id = params[:prototype_id]
101
+ @page.update_attributes(prototype_id: params[:prototype_id])
102
+ @page.build_properties
103
+ @page.save(validate: false)
104
+ else
105
+ @page.prototype_id = nil
106
+ @page.update_attributes(prototype_id: nil)
107
+ end
108
+ render 'onchange_render'
109
+ end
110
+
111
+ def get_prototype_id
112
+ respond_to do |format|
113
+ format.json { render json: @page.prototype_id }
114
+ end
115
+ end
116
+
117
+ def create
118
+ @page = Page.new(page_params)
119
+
120
+ respond_to do |format|
121
+ if @page.save
122
+ format.html { redirect_to pages_url(parent_id: @page.parent_id), notice: '页面创建成功.' }
123
+ format.json { render :show, status: :created, location: @page }
124
+ else
125
+ puts @page.errors.full_messages
126
+ format.html { render :new }
127
+ format.json { render json: @page.errors, status: :unprocessable_entity }
128
+ end
129
+ end
130
+ end
131
+
132
+ def update
133
+ respond_to do |format|
134
+ if @page.update(page_params)
135
+ format.html { redirect_to pages_url(parent_id: @page.parent_id), notice: '页面更新成功.' }
136
+ format.json { render :show, status: :ok, location: @page }
137
+ else
138
+ format.html { render :edit }
139
+ format.json { render json: @page.errors, status: :unprocessable_entity }
140
+ end
141
+ end
142
+ end
143
+
144
+ def destroy
145
+ @page.destroy
146
+ respond_to do |format|
147
+ format.html { redirect_to pages_url(parent_id: @page.parent_id), notice: '成功删除.' }
148
+ format.json { head :no_content }
149
+ end
150
+ end
151
+
152
+ def sort
153
+ params[:page].each_with_index do |id, index|
154
+ Page.update(id, {position: index+1})
155
+ end
156
+ render nothing: true
157
+ end
158
+
159
+ private
160
+ def set_page
161
+ @page = Page.find(params[:id])
162
+ end
163
+
164
+ def set_select
165
+ @template_select = Template.all.map { |x| [x.name, x.id] }.sort_by {|x| x[0]}
166
+ @prototype_select = Prototype.all.map { |x| [x.name, x.id] }
167
+ end
168
+
169
+ def page_params
170
+ params.require(:page).permit(:title, :en_name, :parent_id, :template_id, :prototype_id, :content,
171
+ :properties_attributes => [:id, :type, :field_id, :value, { values: [] }, :image, :file,
172
+ {:pictures_attributes => [:id, :name, :file, :_destroy]}])
173
+ end
174
+
175
+ end
176
+ end
@@ -0,0 +1,12 @@
1
+ module Blacksand
2
+ class Dashboard::PrototypesController < Dashboard::BaseController
3
+
4
+ def index
5
+ @prototypes = Prototype.all
6
+ end
7
+
8
+ def show
9
+ @prototype = Prototype.find params[:id]
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ module Blacksand
2
+ class Dashboard::TemplatesController < Dashboard::BaseController
3
+
4
+ def index
5
+ @templates = Template.all
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,78 @@
1
+ module Blacksand
2
+ class Dashboard::UsersController < Dashboard::BaseController
3
+ # layout 'manage'
4
+ # load_and_authorize_resource
5
+ before_action :set_user, only: [:show, :edit, :update, :destroy]
6
+
7
+ # GET /users
8
+ # GET /users.json
9
+ def index
10
+ @users = User.normal
11
+ end
12
+
13
+ # GET /users/1
14
+ # GET /users/1.json
15
+ def show
16
+ end
17
+
18
+ # GET /users/new
19
+ def new
20
+ @user = User.new
21
+ end
22
+
23
+ # GET /users/1/edit
24
+ def edit
25
+ end
26
+
27
+ # POST /users
28
+ # POST /users.json
29
+ def create
30
+ @user = User.new(user_params)
31
+
32
+ respond_to do |format|
33
+ if @user.save
34
+ format.html { redirect_to dashboard_users_url, notice: t('user.user_save_success_notice') }
35
+ format.json { render :show, status: :created, location: @user }
36
+ else
37
+ format.html { render :new }
38
+ format.json { render json: @user.errors, status: :unprocessable_entity }
39
+ end
40
+ end
41
+ end
42
+
43
+ # PATCH/PUT /users/1
44
+ # PATCH/PUT /users/1.json
45
+ def update
46
+ respond_to do |format|
47
+ if @user.update(user_params)
48
+ format.html { redirect_to dashboard_users_url, notice: t('user.user_edit_success_notice') }
49
+ format.json { render :show, status: :ok, location: @user }
50
+ else
51
+ format.html { render :edit }
52
+ format.json { render json: @user.errors, status: :unprocessable_entity }
53
+ end
54
+ end
55
+ end
56
+
57
+ # DELETE /users/1
58
+ # DELETE /users/1.json
59
+ def destroy
60
+ @user.destroy
61
+ respond_to do |format|
62
+ format.html { redirect_to dashboard_users_url, notice: t('user.user_delete_success_notice') }
63
+ format.json { head :no_content }
64
+ end
65
+ end
66
+
67
+ private
68
+ # Use callbacks to share common setup or constraints between actions.
69
+ def set_user
70
+ @user = User.find(params[:id])
71
+ end
72
+
73
+ # Never trust parameters from the scary internet, only allow the white list through.
74
+ def user_params
75
+ params.require(:user).permit(:email, :password, :password_confirmation, :role, page_ids: [])
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,17 @@
1
+ # 与 blacksand 隔离开, 否则路由会映射到 dashboard 下面的 pages_controller
2
+ module BlacksandFront
3
+ class PagesController < ApplicationController
4
+ theme Blacksand.site_id
5
+ loan_navigations
6
+
7
+ def show
8
+ @page = Blacksand::Page.find params[:id]
9
+ set_meta_tags title: @page.title
10
+
11
+ # render template
12
+ if @page.template.present?
13
+ render @page.template.path
14
+ end
15
+ end
16
+ end
17
+ end