blacksand 2.2.2.1

Sign up to get free protection for your applications and to get access to all the features.
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