diff --git a/Gemfile b/Gemfile index 713eb860..c5f4f2ab 100644 --- a/Gemfile +++ b/Gemfile @@ -1,130 +1,138 @@ -source 'https://gems.ruby-china.com' -git_source(:github) { |repo| "https://github.com/#{repo}.git" } - -gem 'rails', '~> 5.2.0' -gem 'mysql2', '>= 0.4.4', '< 0.6.0' -gem 'puma', '~> 3.11' -gem 'sass-rails', '~> 5.0' -gem 'uglifier', '>= 1.3.0' - -# gem 'coffee-rails', '~> 4.2' -gem 'turbolinks', '~> 5' -gem 'jbuilder', '~> 2.5' -gem 'groupdate', '~> 4.1.0' -gem 'chartkick' -gem 'grape-entity', '~> 0.7.1' -gem 'kaminari', '~> 1.1', '>= 1.1.1' - -gem 'bootsnap', '>= 1.1.0', require: false - -gem 'chinese_pinyin' - -gem 'rack-cors' -gem 'redis-rails' -gem 'roo-xls' -gem 'simple_xlsx_reader' - -gem 'rubyzip' - -gem 'spreadsheet' -gem 'ruby-ole' -# 导出为xlsx -gem 'axlsx', '~> 3.0.0.pre' -gem 'axlsx_rails', '~> 0.5.2' - -gem 'oauth2' -#导出为pdf -gem 'pdfkit' -gem 'wkhtmltopdf-binary' -# gem 'request_store' -#gem 'iconv' -# markdown 转html -gem 'redcarpet', '~> 3.4' - -gem 'rqrcode', '~> 0.10.1' -gem 'rqrcode_png' - -gem 'acts-as-taggable-on', '~> 6.0' - -# a tree structure -gem 'ancestry' -gem 'acts_as_list' -gem 'omniauth-cas' - -# profiler Middleware -gem 'rack-mini-profiler' - -# object-based searching -gem 'ransack' - -group :development, :test do - gem 'rspec-rails', '~> 3.8' -end - -group :development do - gem 'prettier' - gem 'rubocop', '~> 0.52.0' - gem 'solargraph', '~> 0.38.0' - gem 'awesome_print' - gem 'web-console', '>= 3.3.0' - gem 'listen', '>= 3.0.5', '< 3.2' - gem 'spring' - gem 'spring-watcher-listen', '~> 2.0.0' - gem "annotate", "~> 2.6.0" -end - -group :test do - gem 'capybara', '>= 2.15', '< 4.0' - gem 'selenium-webdriver' - gem 'chromedriver-helper' -end - -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] - -#编码检测 -gem 'rchardet', '~> 1.8' - -# http client -gem 'faraday', '~> 0.15.4' - -# view -gem 'active_decorator' -gem 'bootstrap', '~> 4.3.1' -gem 'jquery-rails' -gem 'simple_form' -gem 'font-awesome-sass', '4.7.0' - -# i18n -gem 'rails-i18n', '~> 5.1' - -# job -gem 'sidekiq' -gem 'sinatra' -gem "sidekiq-cron", "~> 1.1" - -# batch insert -gem 'bulk_insert' - -# elasticsearch -gem 'searchkick' - -gem 'aasm' -gem 'enumerize' - -gem 'diffy' - -gem 'deep_cloneable', '~> 3.0.0' - -# oauth2 -gem 'omniauth', '~> 1.9.0' -gem 'omniauth-oauth2', '~> 1.6.0' - -# global var -gem 'request_store' - -# 敏感词汇 -gem 'harmonious_dictionary', '~> 0.0.1' - -gem 'parallel', '~> 1.19', '>= 1.19.1' - -gem 'letter_avatar' +source 'https://gems.ruby-china.com' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +gem 'rails', '~> 5.2.0' +gem 'mysql2', '>= 0.4.4', '< 0.6.0' +gem 'puma', '~> 3.11' +gem 'sass-rails', '~> 5.0' +gem 'uglifier', '>= 1.3.0' + +# gem 'coffee-rails', '~> 4.2' +gem 'turbolinks', '~> 5' +gem 'jbuilder', '~> 2.5' +gem 'groupdate', '~> 4.1.0' +gem 'chartkick' +gem 'grape-entity', '~> 0.7.1' +gem 'kaminari', '~> 1.1', '>= 1.1.1' + +gem 'bootsnap', '>= 1.1.0', require: false + +gem 'chinese_pinyin' + +gem 'rack-cors' +gem 'redis-rails' +gem 'roo-xls' +gem 'simple_xlsx_reader' + +gem 'rubyzip' + +gem 'spreadsheet' +gem 'ruby-ole' +# 导出为xlsx +gem 'axlsx', '~> 3.0.0.pre' +gem 'axlsx_rails', '~> 0.5.2' + +gem 'oauth2' +#导出为pdf +gem 'pdfkit' +gem 'wkhtmltopdf-binary' +# gem 'request_store' +#gem 'iconv' +# markdown 转html +gem 'redcarpet', '~> 3.4' + +gem 'rqrcode', '~> 0.10.1' +gem 'rqrcode_png' + +gem 'acts-as-taggable-on', '~> 6.0' + +# a tree structure +gem 'ancestry' +gem 'acts_as_list' +gem 'omniauth-cas' + +# profiler Middleware +gem 'rack-mini-profiler' + +# object-based searching +gem 'ransack' + +group :development, :test do + gem 'rspec-rails', '~> 3.8' +end + +group :development do + gem 'prettier' + gem 'rubocop', '~> 0.52.0' + gem 'solargraph', '~> 0.38.0' + gem 'awesome_print' + gem 'web-console', '>= 3.3.0' + gem 'listen', '>= 3.0.5', '< 3.2' + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' + gem "annotate", "~> 2.6.0" +end + +group :test do + gem 'capybara', '>= 2.15', '< 4.0' + gem 'selenium-webdriver' + gem 'chromedriver-helper' +end + +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +#编码检测 +gem 'rchardet', '~> 1.8' + +# http client +gem 'faraday', '~> 0.15.4' + +# view +gem 'active_decorator' +gem 'bootstrap', '~> 4.3.1' +gem 'jquery-rails' +gem 'simple_form' +gem 'font-awesome-sass', '4.7.0' + +# i18n +gem 'rails-i18n', '~> 5.1' + +# job +gem 'sidekiq' +gem 'sinatra' +gem "sidekiq-cron", "~> 1.1" + +# batch insert +gem 'bulk_insert' + +# elasticsearch +gem 'searchkick' + +gem 'aasm' +gem 'enumerize' + +gem 'diffy' + +gem 'deep_cloneable', '~> 3.0.0' + +# oauth2 +gem 'omniauth', '~> 1.9.0' +gem 'omniauth-oauth2', '~> 1.6.0' + +# global var +gem 'request_store' + +# 敏感词汇 +gem 'harmonious_dictionary', '~> 0.0.1' + +gem 'parallel', '~> 1.19', '>= 1.19.1' + +gem 'letter_avatar' + +gem 'jwt' + +gem 'doorkeeper' + +gem 'doorkeeper-jwt' + +gem 'gitea-client', '~> 0.10.5' \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index b1dc2cca..e27c504a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -106,6 +106,10 @@ GEM activerecord (>= 3.1.0, < 7) diff-lcs (1.3) diffy (3.3.0) + doorkeeper (5.5.1) + railties (>= 5) + doorkeeper-jwt (0.4.1) + jwt (>= 2.1) e2mmap (0.1.0) elasticsearch (7.5.0) elasticsearch-api (= 7.5.0) @@ -450,6 +454,8 @@ DEPENDENCIES chromedriver-helper deep_cloneable (~> 3.0.0) diffy + doorkeeper + doorkeeper-jwt enumerize faraday (~> 0.15.4) font-awesome-sass (= 4.7.0) @@ -458,6 +464,7 @@ DEPENDENCIES harmonious_dictionary (~> 0.0.1) jbuilder (~> 2.5) jquery-rails + jwt kaminari (~> 1.1, >= 1.1.1) letter_avatar listen (>= 3.0.5, < 3.2) diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js index 97e29247..3438ea5b 100644 --- a/app/assets/javascripts/admin.js +++ b/app/assets/javascripts/admin.js @@ -1,153 +1,154 @@ -//= require rails-ujs -//= require activestorage -//= require turbolinks -//= require jquery3 -//= require popper -//= require bootstrap-sprockets -//= require jquery.validate.min -//= require additional-methods.min -//= require bootstrap-notify -//= require jquery.cookie.min -//= require select2 -//= require moment.min -//= require jquery.cxselect -//= require bootstrap-datepicker -//= require bootstrap-datetimepicker -//= require bootstrap.viewer -//= require jquery.mloading -//= require jquery-confirm.min -//= require common - -//= require echarts -//= require codemirror/lib/codemirror -//= require codemirror/mode/shell/shell -//= require editormd/editormd -//= require editormd/languages/zh-tw -//= require dragula/dragula - -//= require_tree ./i18n -//= require_tree ./admins - - -$.ajaxSetup({ - beforeSend: function(xhr) { - xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); - } -}); - -// ******** select2 global config ******** -$.fn.select2.defaults.set('theme', 'bootstrap4'); -$.fn.select2.defaults.set('language', 'zh-CN'); - -Turbolinks.setProgressBarDelay(200); - -$.notifyDefaults({ - type: 'success', - z_index: 9999, - delay: 2000 -}); - -function show_success_flash(){ - $.notify({ - message: '操作成功' - },{ - type: 'success' - }); -} - -$(document).on('turbolinks:load', function(){ - $('[data-toggle="tooltip"]').tooltip({ trigger : 'hover' }); - $('[data-toggle="popover"]').popover(); - - // 图片查看大图 - $('img.preview-image').bootstrapViewer(); - - // flash alert提示框自动关闭 - if($('.admin-alert-container .alert').length > 0){ - setTimeout(function(){ - $('.admin-alert-container .alert:not(.alert-danger)').alert('close'); - }, 2000); - setTimeout(function(){ - $('.admin-alert-container .alert.alert-danger').alert('close'); - }, 5000); - } - - $('.logo-item-left').on("change", 'input[type="file"]', function () { - var $fileInput = $(this); - var file = this.files[0]; - var imageType = /image.*/; - if (file && file.type.match(imageType)) { - var reader = new FileReader(); - reader.onload = function () { - var $box = $fileInput.parent(); - $box.find('img').attr('src', reader.result).css('display', 'block'); - $box.addClass('has-img'); - }; - reader.readAsDataURL(file); - } else { - } - }); - -}); - -$(document).on("turbolinks:before-cache", function () { - $('[data-toggle="tooltip"]').tooltip('hide'); - $('[data-toggle="popover"]').popover('hide'); -}); -// var progressBar = new Turbolinks.ProgressBar(); - -// $(document).on('ajax:send', function(event){ -// console.log('ajax send', event); -// progressBar.setValue(0) -// progressBar.show() -// }); -// -// $(document).on('ajax:complete', function(event){ -// console.log('ajax complete', event); -// progressBar.setValue(1) -// progressBar.hide() // 分页时不触发,奇怪 -// }); -// $(document).on('ajax:success', function(event){ -// console.log('ajax success', event); -// }); -// $(document).on('ajax:error', function(event){ -// console.log('ajax error', event); -// }); - -$(function () { -}); - -$(document).on('turbolinks:load', function() { - - $('.logo-item-left').on("change", 'input[type="file"]', function () { - var $fileInput = $(this); - var file = this.files[0]; - var imageType = /image.*/; - if (file && file.type.match(imageType)) { - var reader = new FileReader(); - reader.onload = function () { - var $box = $fileInput.parent(); - $box.find('img').attr('src', reader.result).css('display', 'block'); - $box.addClass('has-img'); - }; - reader.readAsDataURL(file); - } else { - } - }); - - $('.attachment-item-left').on("change", 'input[type="file"]', function () { - var $fileInput = $(this); - var file = this.files[0]; - var imageType = /image.*/; - if (file && file.type.match(imageType)) { - var reader = new FileReader(); - reader.onload = function () { - var $box = $fileInput.parent(); - $box.find('img').attr('src', reader.result).css('display', 'block'); - $box.addClass('has-img'); - }; - reader.readAsDataURL(file); - } else { - } - }); +//= require rails-ujs +//= require activestorage +//= require turbolinks +//= require jquery3 +//= require popper +//= require bootstrap-sprockets +//= require jquery.validate.min +//= require additional-methods.min +//= require bootstrap-notify +//= require jquery.cookie.min +//= require select2 +//= require moment.min +//= require jquery.cxselect +//= require bootstrap-datepicker +//= require bootstrap-datetimepicker +//= require bootstrap.viewer +//= require bootstrap/bootstrap-toggle +//= require jquery.mloading +//= require jquery-confirm.min +//= require common + +//= require echarts +//= require codemirror/lib/codemirror +//= require codemirror/mode/shell/shell +//= require editormd/editormd +//= require editormd/languages/zh-tw +//= require dragula/dragula + +//= require_tree ./i18n +//= require_tree ./admins + + +$.ajaxSetup({ + beforeSend: function(xhr) { + xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); + } +}); + +// ******** select2 global config ******** +$.fn.select2.defaults.set('theme', 'bootstrap4'); +$.fn.select2.defaults.set('language', 'zh-CN'); + +Turbolinks.setProgressBarDelay(200); + +$.notifyDefaults({ + type: 'success', + z_index: 9999, + delay: 2000 +}); + +function show_success_flash(){ + $.notify({ + message: '操作成功' + },{ + type: 'success' + }); +} + +$(document).on('turbolinks:load', function(){ + $('[data-toggle="tooltip"]').tooltip({ trigger : 'hover' }); + $('[data-toggle="popover"]').popover(); + + // 图片查看大图 + $('img.preview-image').bootstrapViewer(); + + // flash alert提示框自动关闭 + if($('.admin-alert-container .alert').length > 0){ + setTimeout(function(){ + $('.admin-alert-container .alert:not(.alert-danger)').alert('close'); + }, 2000); + setTimeout(function(){ + $('.admin-alert-container .alert.alert-danger').alert('close'); + }, 5000); + } + + $('.logo-item-left').on("change", 'input[type="file"]', function () { + var $fileInput = $(this); + var file = this.files[0]; + var imageType = /image.*/; + if (file && file.type.match(imageType)) { + var reader = new FileReader(); + reader.onload = function () { + var $box = $fileInput.parent(); + $box.find('img').attr('src', reader.result).css('display', 'block'); + $box.addClass('has-img'); + }; + reader.readAsDataURL(file); + } else { + } + }); + +}); + +$(document).on("turbolinks:before-cache", function () { + $('[data-toggle="tooltip"]').tooltip('hide'); + $('[data-toggle="popover"]').popover('hide'); +}); +// var progressBar = new Turbolinks.ProgressBar(); + +// $(document).on('ajax:send', function(event){ +// console.log('ajax send', event); +// progressBar.setValue(0) +// progressBar.show() +// }); +// +// $(document).on('ajax:complete', function(event){ +// console.log('ajax complete', event); +// progressBar.setValue(1) +// progressBar.hide() // 分页时不触发,奇怪 +// }); +// $(document).on('ajax:success', function(event){ +// console.log('ajax success', event); +// }); +// $(document).on('ajax:error', function(event){ +// console.log('ajax error', event); +// }); + +$(function () { +}); + +$(document).on('turbolinks:load', function() { + + $('.logo-item-left').on("change", 'input[type="file"]', function () { + var $fileInput = $(this); + var file = this.files[0]; + var imageType = /image.*/; + if (file && file.type.match(imageType)) { + var reader = new FileReader(); + reader.onload = function () { + var $box = $fileInput.parent(); + $box.find('img').attr('src', reader.result).css('display', 'block'); + $box.addClass('has-img'); + }; + reader.readAsDataURL(file); + } else { + } + }); + + $('.attachment-item-left').on("change", 'input[type="file"]', function () { + var $fileInput = $(this); + var file = this.files[0]; + var imageType = /image.*/; + if (file && file.type.match(imageType)) { + var reader = new FileReader(); + reader.onload = function () { + var $box = $fileInput.parent(); + $box.find('img').attr('src', reader.result).css('display', 'block'); + $box.addClass('has-img'); + }; + reader.readAsDataURL(file); + } else { + } + }); }) \ No newline at end of file diff --git a/app/assets/javascripts/bootstrap/bootstrap-toggle.js b/app/assets/javascripts/bootstrap/bootstrap-toggle.js new file mode 100644 index 00000000..533914ed --- /dev/null +++ b/app/assets/javascripts/bootstrap/bootstrap-toggle.js @@ -0,0 +1,180 @@ +/*! ======================================================================== + * Bootstrap Toggle: bootstrap-toggle.js v2.2.0 + * http://www.bootstraptoggle.com + * ======================================================================== + * Copyright 2014 Min Hur, The New York Times Company + * Licensed under MIT + * ======================================================================== */ + + + +function ($) { + 'use strict'; + + // TOGGLE PUBLIC CLASS DEFINITION + // ============================== + + var Toggle = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, this.defaults(), options) + this.render() + } + + Toggle.VERSION = '2.2.0' + + Toggle.DEFAULTS = { + on: 'On', + off: 'Off', + onstyle: 'primary', + offstyle: 'default', + size: 'normal', + style: '', + width: null, + height: null + } + + Toggle.prototype.defaults = function() { + return { + on: this.$element.attr('data-on') || Toggle.DEFAULTS.on, + off: this.$element.attr('data-off') || Toggle.DEFAULTS.off, + onstyle: this.$element.attr('data-onstyle') || Toggle.DEFAULTS.onstyle, + offstyle: this.$element.attr('data-offstyle') || Toggle.DEFAULTS.offstyle, + size: this.$element.attr('data-size') || Toggle.DEFAULTS.size, + style: this.$element.attr('data-style') || Toggle.DEFAULTS.style, + width: this.$element.attr('data-width') || Toggle.DEFAULTS.width, + height: this.$element.attr('data-height') || Toggle.DEFAULTS.height + } + } + + Toggle.prototype.render = function () { + this._onstyle = 'btn-' + this.options.onstyle + this._offstyle = 'btn-' + this.options.offstyle + var size = this.options.size === 'large' ? 'btn-lg' + : this.options.size === 'small' ? 'btn-sm' + : this.options.size === 'mini' ? 'btn-xs' + : '' + var $toggleOn = $('